特定のリクエストに対して OVS で「Router Advertisement」をシミュレートする作業を行ってきました。そのために、チェックサムを除くすべてのフィールドが正しい 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);