2017-03-31 69 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 
    };