0

一直在为某些请求在 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);
4

1 回答 1

1

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

2.3. 消息校验和计算

校验和是整个 ICMPv6 消息的反码和的 16 位反码,从 ICMPv6 消息类型字段开始,并以 IPv6 标头字段的“伪标头”为前缀,如 [IPv6,第 8.1 节中所述]。伪标头中使用的下一个标头值为 58。(在 ICMPv6 校验和中包含伪标头是对 IPv4 的更改;有关此更改的基本原理,请参见 [IPv6]。)

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

于 2015-10-20T23:12:48.827 回答