一直致力于模拟"路由器广告"在OVS中对于某些请求,因为我构造了一个ICMPv6 pkt,所有字段都正确,除了校验和,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);
答案 0 :(得分:1)
ICMPv6校验和是通过整个ICMPv6消息的总和来计算的。如何计算校验和的定义在RFC 4441, ICMPv6 (ICMP for IPv6), Section 2.3, Message Checksum Calculation:
<强> 2.3。消息校验和计算
校验和是该补码的16位补码 从ICMPv6消息开始,整个ICMPv6消息的总和 类型字段,并附加&#34;伪标题&#34; IPv6标头 字段,如[IPv6,第8.1节]中所述。下一个标题值 在伪标头中使用的是58.(在...中包含伪标头) ICMPv6校验和是对IPv4的更改;请参阅[IPv6] 这种变化的理由。)
为计算校验和,校验和字段首先设置为零。