Module Name: src Committed By: rin Date: Wed Sep 19 07:54:11 UTC 2018
Modified Files: src/sys/netinet: in_offload.c src/sys/netinet6: in6_offload.c Log Message: Fix in_undefer_cksum() and in6_undefer_cksum(). The 4th argument for in[46]_cksum() should be length of L4 header + L4 payload. The previous revisions are wrong - for IPv4 when hdrlen != 0 - for IPv6 always These functions are used only in net/if_loop.c and arch/powerpc/booke/dev/pq3etsec.c under some special circumferences. This should be why the bugs have not been found until today. OK maxv To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/netinet/in_offload.c cvs rdiff -u -r1.10 -r1.11 src/sys/netinet6/in6_offload.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet/in_offload.c diff -u src/sys/netinet/in_offload.c:1.11 src/sys/netinet/in_offload.c:1.12 --- src/sys/netinet/in_offload.c:1.11 Wed Jul 11 06:25:05 2018 +++ src/sys/netinet/in_offload.c Wed Sep 19 07:54:11 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: in_offload.c,v 1.11 2018/07/11 06:25:05 maxv Exp $ */ +/* $NetBSD: in_offload.c,v 1.12 2018/09/19 07:54:11 rin Exp $ */ /* * Copyright (c)2005, 2006 YAMAMOTO Takashi, @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: in_offload.c,v 1.11 2018/07/11 06:25:05 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in_offload.c,v 1.12 2018/09/19 07:54:11 rin Exp $"); #include <sys/param.h> #include <sys/mbuf.h> @@ -213,7 +213,7 @@ in_undefer_cksum(struct mbuf *m, size_t if (csum_flags & (M_CSUM_UDPv4|M_CSUM_TCPv4)) { size_t l4offset = hdrlen + iphdrlen; - csum = in4_cksum(m, 0, l4offset, ip_len - l4offset - hdrlen); + csum = in4_cksum(m, 0, l4offset, ip_len - iphdrlen); if (csum == 0 && (csum_flags & M_CSUM_UDPv4) != 0) csum = 0xffff; Index: src/sys/netinet6/in6_offload.c diff -u src/sys/netinet6/in6_offload.c:1.10 src/sys/netinet6/in6_offload.c:1.11 --- src/sys/netinet6/in6_offload.c:1.10 Fri Aug 10 06:55:04 2018 +++ src/sys/netinet6/in6_offload.c Wed Sep 19 07:54:11 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: in6_offload.c,v 1.10 2018/08/10 06:55:04 maxv Exp $ */ +/* $NetBSD: in6_offload.c,v 1.11 2018/09/19 07:54:11 rin Exp $ */ /* * Copyright (c)2006 YAMAMOTO Takashi, @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: in6_offload.c,v 1.10 2018/08/10 06:55:04 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in6_offload.c,v 1.11 2018/09/19 07:54:11 rin Exp $"); #include <sys/param.h> #include <sys/mbuf.h> @@ -193,7 +193,8 @@ in6_undefer_cksum(struct mbuf *m, size_t l4hdroff = M_CSUM_DATA_IPv6_IPHL(m->m_pkthdr.csum_data); l4offset = hdrlen + l4hdroff; - csum = in6_cksum(m, 0, l4offset, plen - l4hdroff); + csum = in6_cksum(m, 0, l4offset, + plen - (l4hdroff - sizeof(struct ip6_hdr))); if (csum == 0 && (csum_flags & M_CSUM_UDPv6) != 0) csum = 0xffff;