我必须更改网络驱动程序(在实时操作系统上)以获取PTP帧(它是具有特殊数据字段的UDP帧)并更改一些数据。我需要更新网络驱动程序中的数据(R8168)。这样做我必须在发送帧之前修改CRC字段。 我找了一些例子但没有人工作。我想在使用htons或ntohs的行中出现了问题:我不知道是否必须使用网络字节顺序或主机字节顺序。
unsigned int calc_checksum( unsigned char *pcBuf, unsigned short usLength, unsigned int uiSum )
{
unsigned short i, usTmp ;
/* Checksum all the pairs of bytes first... */
for ( i = 0; i < (usLength & ~1U); i += 2 )
{
usTmp = *((unsigned short *)(pcBuf + i)) ;
uiSum += (unsigned short)ntohs( usTmp ) ;
if ( uiSum > 0xFFFF )
uiSum -= 0xFFFF ;
}
/*
* If there's a single byte left over, checksum it, too.
* Network byte order is big-endian, so the remaining byte is
* the high byte.
*/
if ( i < usLength )
{
uiSum += pcBuf[i] << 8 ;
if ( uiSum > 0xFFFF )
uiSum -= 0xFFFF ;
}
/*.*/
return uiSum ;
}
/* Recalculate UPD checksum */
usTmp = sizeof(TUdpHeader) + sizeof(TPTPSyncData) ;
uiSum = calc_checksum( (unsigned char *)(&pPTPFrame->udpHeader.sport),
sizeof(TUdpHeader) + sizeof(TPTPSyncData),
calc_checksum( (unsigned char *)(&pPTPFrame->ipHeader.saddr),
2 * sizeof(unsigned int), IP_UDP + htons( usTmp ) ) ) ;
// Return the one's complement of sum
usTmp = (~uiSum) & 0xFFFF ;
pPTPFrame->udpHeader.checksum = htons( usTmp ) ;
注意:
非常感谢。 Emanuele的。
答案 0 :(得分:0)
这是正确的版本:
/* Recalculate UPD checksum */
pPTPFrame->udpHeader.checksum = 0 ;
uiSum = calc_checksum( (unsigned char *)(&pPTPFrame->udpHeader.sport),
sizeof(TUdpHeader) + sizeof(TPTPSyncData),
calc_checksum( (unsigned char *)(&pPTPFrame->ipHeader.saddr),
2 * sizeof(unsigned int), IP_UDP + sizeof(TUdpHeader) + sizeof(TPTPSyncData) ) ) ;
// Return the one's complement of sum
usTmp = (~uiSum) & 0xFFFF ;
pPTPFrame->udpHeader.checksum = htons( usTmp ) ;
问题解决了!