OVS: Как рассчитать контрольную сумму ICMPV6?

Работал над симуляцией «объявления маршрутизатора» в OVS для определенных запросов, для этого я создал pkt ICMPv6 со всеми правильными полями, кроме контрольной суммы, 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);

person vindyz    schedule 20.10.2015    source источник


Ответы (1)


Контрольная сумма ICMPv6 вычисляется по сумме всего сообщения ICMPv6. Определение того, как вычислять контрольную сумму, содержится в RFC 4441, ICMPv6 (ICMP для IPv6), раздел 2.3, Расчет контрольной суммы сообщения:

2.3. Расчет контрольной суммы сообщения

Контрольная сумма представляет собой 16-битное дополнение к единице суммы дополнений к единице всего сообщения ICMPv6, начиная с поля типа сообщения ICMPv6 и предваряемое «псевдозаголовком» из полей заголовка IPv6, как указано в [IPv6, Раздел 8.1 ]. Значение Next Header, используемое в псевдозаголовке, равно 58. (Включение псевдозаголовка в контрольную сумму ICMPv6 является отличием от IPv4; см. [IPv6] для обоснования этого изменения.)

Для вычисления контрольной суммы поле контрольной суммы сначала устанавливается равным нулю.

person Ron Maupin    schedule 20.10.2015