2015-10-20 259 views
0

对于某些请求,我一直在模拟OVS中的“路由器公告”,因为我构建了一个除校验和之外的所有字段都正确的ICMPv6 pkt,wireshark在校验和部分给出了一个错误。OVS:如何计算ICMPV6校验和?

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); 

回答

1

ICMPv6校验和通过整个ICMPv6消息的总和来计算。如何计算校验和的定义是:RFC 4441, ICMPv6 (ICMP for IPv6), Section 2.3, Message Checksum Calculation

2.3。消息的校验和计算

校验和是整个的ICMPv6消息的一的补 总和的16位一的补码,与所述的ICMPv6消息 类型字段开始,并使用IPv6报头的“伪首部”前缀 字段,如[IPv6,第8.1节]中所述。在伪头中使用的Next Header值 是58(在 伪报头的包含所述的ICMPv6校验和是从IPv4的变化;参见[IPv6的]为 理此更改。)

为了计算校验和,首先将校验和字段设置为零。