OVS:如何计算ICMPV6校验和?

时间:2015-10-20 21:57:58

标签: network-programming ipv6 checksum icmp openvswitch

一直致力于模拟"路由器广告"在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);

1 个答案:

答案 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]   这种变化的理由。)

     

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