0

特定のリクエストに対して 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);
4

1 に答える 1

1

ICMPv6 チェックサムは、ICMPv6 メッセージ全体の合計に対して計算されます。チェックサムの計算方法の定義は、RFC 4441、ICMPv6 (ICMP for IPv6)、セクション 2.3、Message Checksum Calculation にあります。

2.3. メッセージ チェックサムの計算

チェックサムは、[IPv6、セクション 8.1 で指定されているように、ICMPv6 メッセージ タイプ フィールドで始まり、IPv6 ヘッダー フィールドの「疑似ヘッダー」が先頭に追加された、ICMPv6 メッセージ全体の 1 の補数の合計の 16 ビットの 1 の補数です。 ]。疑似ヘッダーで使用される次のヘッダーの値は 58 です。

チェックサムを計算するために、チェックサム フィールドは最初にゼロに設定されます。

于 2015-10-20T23:12:48.827 に答える