我一直在为某些请求在OVS中模拟“路由器通告”,为此我构造了一个ICMPv6包,除了校验和之外,所有字段都是正确的,wireshark在校验和部分给出了一个错误。
ICMP6校验和应包括src + dst + icmp_length + next_header,但以下代码计算不正确。我是不是漏掉了什么?感谢你们的帮助。
struct nd_router_advert *ra;
struct ofpbuf *ra_rsp;
struct ovs_16aligned_ip6_hdr *nh;
.
.
.
.
.
ofpbuf_set_l3(ra_rsp, nh);
nh->ip6_vfc = 0x60;
nh->ip6_plen = htons(sizeof(*ra));
nh->ip6_nxt = IPPROTO_ICMPV6;
.
.
ofpbuf_set_l4(ra_rsp, ra);
ra->nd_ra_type = ND_ROUTER_ADVERT;
ra->nd_ra_code = 0;
ra->nd_ra_cksum = htons(0);
ra->nd_ra_curhoplimit = 255;
ra->nd_ra_flags_reserved = 0;
ra->nd_ra_router_lifetime = htons(9000);
ra->nd_ra_reachable = htons(0);
ra->nd_ra_retransmit = htons(0);
packet_set_ipv6(ra_rsp, IPPROTO_ICMPV6, src, dst, 0, 0, 212);
ra->nd_ra_cksum = recalc_csum16(ra->nd_ra_cksum, 0, htons(sizeof(*ra)));
ra->nd_ra_cksum = recalc_csum32(ra->nd_ra_cksum, 0, IPPROTO_ICMPV6);发布于 2015-10-21 07:12:49
对整个ICMPv6消息的总和计算ICMPv6校验和。如何计算校验和的定义在RFC 4441, ICMPv6 (ICMP for IPv6), Section 2.3, Message Checksum Calculation中
2.3。消息校验和计算
校验和是整个ICMPv6消息的补码和的16位1的补码,以ICMPv6消息类型字段开始,并以IPv6报头字段的“伪报头”为前缀,如IPv6,第8.1节中所指定的。伪报头中使用的下一个报头值是58。(在ICMPv6校验和中包含伪头是对IPv4的更改;有关此更改的基本原理,请参阅IPv6。)
为了计算校验和,首先将校验和字段设置为零。
https://stackoverflow.com/questions/33247540
复制相似问题