Solved! :-) -- Re: How to calculate ICMPv6 checksum?

Gábor LENCSE lencse at hit.bme.hu
Thu Aug 14 16:43:55 CEST 2025


Dear Stephen,

On 8/13/2025 1:57 AM, Stephen Hemminger wrote:
[...]

> Yes this is similar but in UDP/TCP case the UDP/TCP header is included in
> the checksum. l4_hdr points to the UDP/TCP header. l4_len is the payload
> length that is TCP/UDP header and the associated data.

Yes, when I tried using the rte_ipv6_udptcp_cksum() function, I supplied 
a pointer to the ICMPv6 header as the second argument. My code line was:

reply_icmpv6_hdr->checksum=rte_ipv6_udptcp_cksum(reply_ipv6_hdr,reply_icmpv6_hdr); 


And the internal function reads out the payload length from the IPv6 
header as follows:

     l4_len = rte_be_to_cpu_16(ipv6_hdr->payload_len);

This is also correct.

> The pseudo header is done by rte_ipv6_phdr_cksum().
>
> For ICMPv6 you would need to point l4_hdr at ICMP header.
> Even though ICMP is not really an L4 protocol.
>
> https://en.wikipedia.org/wiki/ICMPv6#Checksum
>
Yes, I checked the drawing, this is the same as 
https://www.rfc-editor.org/rfc/rfc2460#section-8.1 and the code 
calculates exactly the same (with some trick, as I mentioned earlier).

*And the calculated checksum is CORRECT! :-)*

It turned out, that I had made a programming error. (My calculation of 
the address of the checksum field was incorrect, and thus I manipulated 
a wrong field.)

Anyway, thank you very much for all your help!

I learnt a lot from checking how ICMPv6 checksum is calculated. :-)

And I hope that it will be useful information for others that the 
rte_ipv6_udptcp_cksum() function is perfectly suitable for calculating 
ICMPv6 checksum, too. :-)

Best regards,

Gábor


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mails.dpdk.org/archives/users/attachments/20250814/e59755be/attachment.htm>


More information about the users mailing list