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;