Instead of calculating the ICMPv6 checksum here, just set the flag that
is needed and the lower parts of the stack will take care of it.
I have tested the general ICMPv6, ICMPv6 redirect, and neighbor
discovery parts. I have not tested the MLD part.
Index: icmp6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/icmp6.c,v
retrieving revision 1.139
diff -u -p -r1.139 icmp6.c
--- icmp6.c 13 Jan 2014 23:03:52 -0000 1.139
+++ icmp6.c 23 Jan 2014 01:02:41 -0000
@@ -2100,8 +2100,7 @@ icmp6_reflect(struct mbuf *m, size_t off
ip6->ip6_hlim = ip6_defhlim;
icmp6->icmp6_cksum = 0;
- icmp6->icmp6_cksum = in6_cksum(m, IPPROTO_ICMPV6,
- sizeof(struct ip6_hdr), plen);
+ m->m_pkthdr.csum_flags |= M_ICMP_CSUM_OUT;
/*
* XXX option handling
@@ -2611,8 +2610,7 @@ noredhdropt:
ip6->ip6_plen = htons(m->m_pkthdr.len - sizeof(struct ip6_hdr));
nd_rd->nd_rd_cksum = 0;
- nd_rd->nd_rd_cksum
- = in6_cksum(m, IPPROTO_ICMPV6, sizeof(*ip6),
ntohs(ip6->ip6_plen));
+ m->m_pkthdr.csum_flags |= M_ICMP_CSUM_OUT;
/* send the packet to outside... */
if (ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL) != 0)
Index: mld6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/mld6.c,v
retrieving revision 1.36
diff -u -p -r1.36 mld6.c
--- mld6.c 21 Jan 2014 10:18:26 -0000 1.36
+++ mld6.c 23 Jan 2014 22:55:41 -0000
@@ -435,8 +435,7 @@ mld6_sendpkt(struct in6_multi *in6m, int
mldh->mld_addr = in6m->in6m_addr;
if (IN6_IS_ADDR_MC_LINKLOCAL(&mldh->mld_addr))
mldh->mld_addr.s6_addr16[1] = 0; /* XXX */
- mldh->mld_cksum = in6_cksum(mh, IPPROTO_ICMPV6, sizeof(struct ip6_hdr),
- sizeof(struct mld_hdr));
+ mh->m_pkthdr.csum_flags |= M_ICMP_CSUM_OUT;
/* construct multicast option */
bzero(&im6o, sizeof(im6o));
Index: nd6_nbr.c
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6_nbr.c,v
retrieving revision 1.74
diff -u -p -r1.74 nd6_nbr.c
--- nd6_nbr.c 13 Jan 2014 23:03:52 -0000 1.74
+++ nd6_nbr.c 23 Jan 2014 22:47:44 -0000
@@ -520,8 +520,7 @@ nd6_ns_output(struct ifnet *ifp, struct
ip6->ip6_plen = htons((u_short)icmp6len);
nd_ns->nd_ns_cksum = 0;
- nd_ns->nd_ns_cksum =
- in6_cksum(m, IPPROTO_ICMPV6, sizeof(*ip6), icmp6len);
+ m->m_pkthdr.csum_flags |= M_ICMP_CSUM_OUT;
ip6_output(m, NULL, &ro, dad ? IPV6_UNSPECSRC : 0, &im6o, NULL, NULL);
icmp6_ifstat_inc(ifp, ifs6_out_msg);
@@ -1034,8 +1033,7 @@ nd6_na_output(struct ifnet *ifp, struct
ip6->ip6_plen = htons((u_short)icmp6len);
nd_na->nd_na_flags_reserved = flags;
nd_na->nd_na_cksum = 0;
- nd_na->nd_na_cksum =
- in6_cksum(m, IPPROTO_ICMPV6, sizeof(struct ip6_hdr), icmp6len);
+ m->m_pkthdr.csum_flags |= M_ICMP_CSUM_OUT;
ip6_output(m, NULL, &ro, 0, &im6o, NULL, NULL);
--
Christian "naddy" Weisgerber [email protected]