0

PTP フレーム (特別なデータ フィールドを持つ UDP フレーム) をスニフするようにネット ドライバー (リアルタイム OS 上) を変更し、いくつかのデータを変更する必要があります。ネットドライバー(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 ) ;

ノート:

  • pPTPFrame はフル フレームへのポインタです (EthHeader + IpHeader +
    UdpHeader + Data)
  • IP_UDP = 17
  • TPTPSyncData はデータ構造です

どうもありがとう。エマヌエーレ。

4

1 に答える 1

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 ) ;

問題が解決しました!

于 2013-03-12T14:04:53.570 に答える