2017-03-31 60 views
0

需要編寫一個工具,我需要構建整個ICMPv6數據包。我似乎無法獲得生成正確的ICMPv6校驗和的代碼。我曾嘗試checksum(void * buffer, int bytes)功能從以下無法得到正確的icmpv6校驗和

Calculating checksum of ICMPv6 Packet in C

我有我使用驗證校驗和Wireshark的捕獲。原始數據包的內容看起來像

0000 33 33 00 00 00 01 38 ea a7 89 be 59 86 dd 60 00 0010 00 00 00 20 3a ff fe 80 00 00 00 00 00 00 88 c5 0020 75 41 aa 0c 58 ee ff 02 00 00 00 00 00 00 00 00 0030 00 00 00 00 00 01 88 00 b8 cc 20 00 00 00 fe 80 0040 00 00 00 00 00 00 88 c5 75 41 aa 0c 58 ee 02 01 0050 38 ea a7 89 be 59

從包ofcourse正確的校驗和是0xb8cc。上面的數據包是整個IPv6數據包,但數據包的相關內容從源地址開始,即fe 80 00 00 00 00 00 00 88 c5 75 41 aa 0c 58 ee 。 ICMPv6頭文件起始於88 00

我認爲從上面的鏈接校驗和功能可能是正確的,但我構建的計算校驗和的緩衝區可能是不正確的。繼的RFC,我通過連接源地址,目標地址,分組長度(32 = 00 20),接着報頭(58 = 3a)中,ICMPv6報文的其餘部分這使我的

uint8_t packet[] = { 0xfe , 0x80 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 , 0x88 , 0xc5 ,0x75 , 0x41 ,0xaa , 0x0c ,0x58 , 0xee, 0xff , 0x02 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00, 0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x01, 0x00 , 0x20 ,0x3a , 0x88 ,0x00 , 0x00 ,0x00 , 0x20 , 0x00 ,0x00 , 0x00 ,0xfe , 0x80 ,0x00 , 0x00 , 0x00 , 0x00 ,0x00 , 0x00 ,0x88 , 0xc5 ,0x75 , 0x41 , 0xaa , 0x0c ,0x58 , 0xee ,0x02 , 0x01 ,0x38 , 0xea , 0xa7 , 0x89 ,0xbe , 0x59 }; 的最終緩衝液構成的緩衝我稱爲校驗和函數爲

fprintf(stdout,「%x \ n」,〜checksum(packet,sizeof(packet)));

但我得到的校驗值是ffffd174。忽略前兩個字節,我越來越7510.

任何想法我做錯了什麼?我認爲在校驗和函數中可能存在endian問題,但也可能是錯誤地構造了僞代碼頭。

回答

0

找出問題所在,因此發佈更正以防別人正在尋找它。

問題在於我如何在輸入數據中添加nextheader以實現校驗和功能。我需要給Nextheader加上一個0x00字節。僞頭部分中的最後32位應該是零,然後是下一個頭部。由於前16位僅添加到0,因此在下一個標題前僅添加一個零字節就足夠了。所以輸入校驗和功能的數據最終爲

uint8_t packet[] = { 
      0xfe , 0x80 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00, // src 
      0x88 , 0xc5 ,0x75 , 0x41 ,0xaa , 0x0c ,0x58 , 0xee, 
      0xff , 0x02 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00, // dst 
      0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x01, 
      0x00 , 0x20 , // length 32 
      0x00 , 0x3a , // next header 58 
      0x88 , // type 
      0x00 , // code 
      0x00 , 0x00 , // checksum 
      0x20 , 0x00 ,0x00 , 0x00 ,0xfe , 0x80 ,0x00 , 0x00 , // body 
      0x00 , 0x00 ,0x00 , 0x00 ,0x88 , 0xc5 ,0x75 , 0x41 , 
      0xaa , 0x0c ,0x58 , 0xee ,0x02 , 0x01 ,0x38 , 0xea , 
      0xa7 , 0x89 ,0xbe , 0x59 
    };