If interface drivers had enabled transmit offloading of the payload
authorbluhm <bluhm@openbsd.org>
Mon, 8 Aug 2022 23:00:51 +0000 (23:00 +0000)
committerbluhm <bluhm@openbsd.org>
Mon, 8 Aug 2022 23:00:51 +0000 (23:00 +0000)
checksum, IPv6 fragments contained invalid checksum.  For fragments
the protocol checksum has to be calculated before fragmentation.
Hardware cannot do this as it is too late.  Do it earlier in software.
tested and OK mbuhl@

sys/netinet6/ip6_output.c

index 8fbac58..355aa3e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip6_output.c,v 1.269 2022/06/29 22:45:24 bluhm Exp $  */
+/*     $OpenBSD: ip6_output.c,v 1.270 2022/08/08 23:00:51 bluhm Exp $  */
 /*     $KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $    */
 
 /*
@@ -728,6 +728,12 @@ reroute:
        if (mtu > IPV6_MAXPACKET)
                mtu = IPV6_MAXPACKET;
 
+       /*
+        * If we are doing fragmentation, we can't defer TCP/UDP
+        * checksumming; compute the checksum and clear the flag.
+        */
+        in6_proto_cksum_out(m, NULL);
+
        /*
         * Change the next header field of the last header in the
         * unfragmentable part.