您的位置:首页 > 其它

icmpv6 checksum

2013-12-17 22:08 330 查看
icmpv6的checksum计算:

1 IPv6的icmp,tcp,udp的checksum需要添加虚拟头,结构如下

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| |

+ +

| |

+ Source Address +

| |

+ +

| |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| |

+ +

| |

+ Destination Address +

| |

+ +

| |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Upper-Layer Packet Length |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| zero | Next
Header |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

2 checksum 的计算代码

USHORT Checksum(USHORT *buffer, int size, int more)

{

unsigned long cksum=0;

while(size >1)

{

cksum+=ntohs(*buffer);

buffer ++;

size -=sizeof(USHORT);

}

if(size)

cksum += *(UCHAR*)buffer;

cksum += more;

cksum = (cksum >> 16) + (cksum & 0xffff);

cksum += (cksum >>16);

//return (USHORT)(cksum);

return (USHORT)(~cksum);

}

3 赋值到bit流时,需要

icmp->checksum = htons(icmp->checksum);

花费 8个小时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: