Module Name:    src
Committed By:   yamt
Date:           Mon Oct 31 13:16:01 UTC 2011

Modified Files:
        src/sys/netinet: ip_output.c

Log Message:
redo ip_output.c rev.1.206 and 1.207 differently.  PR/43664.
ok'ed by martin@


To generate a diff of this commit:
cvs rdiff -u -r1.209 -r1.210 src/sys/netinet/ip_output.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/ip_output.c
diff -u src/sys/netinet/ip_output.c:1.209 src/sys/netinet/ip_output.c:1.210
--- src/sys/netinet/ip_output.c:1.209	Sun Jul 17 20:54:53 2011
+++ src/sys/netinet/ip_output.c	Mon Oct 31 13:16:01 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_output.c,v 1.209 2011/07/17 20:54:53 joerg Exp $	*/
+/*	$NetBSD: ip_output.c,v 1.210 2011/10/31 13:16:01 yamt Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.209 2011/07/17 20:54:53 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.210 2011/10/31 13:16:01 yamt Exp $");
 
 #include "opt_pfil_hooks.h"
 #include "opt_inet.h"
@@ -1008,12 +1008,19 @@ ip_fragment(struct mbuf *m, struct ifnet
 		m->m_pkthdr.len = mhlen + len;
 		m->m_pkthdr.rcvif = (struct ifnet *)0;
 		mhip->ip_sum = 0;
+		KASSERT((m->m_pkthdr.csum_flags & M_CSUM_IPv4) == 0);
 		if (sw_csum & M_CSUM_IPv4) {
 			mhip->ip_sum = in_cksum(m, mhlen);
-			KASSERT((m->m_pkthdr.csum_flags & M_CSUM_IPv4) == 0);
 		} else {
-			m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
+			/*
+			 * checksum is hw-offloaded or not necessary.
+			 */
+			m->m_pkthdr.csum_flags |=
+			    m0->m_pkthdr.csum_flags & M_CSUM_IPv4;
 			m->m_pkthdr.csum_data |= mhlen << 16;
+			KASSERT(!(ifp != NULL &&
+			    IN_NEED_CHECKSUM(ifp, M_CSUM_IPv4))
+			    || (m->m_pkthdr.csum_flags & M_CSUM_IPv4) != 0);
 		}
 		IP_STATINC(IP_STAT_OFRAGMENTS);
 		fragments++;
@@ -1028,19 +1035,17 @@ ip_fragment(struct mbuf *m, struct ifnet
 	ip->ip_len = htons((u_int16_t)m->m_pkthdr.len);
 	ip->ip_off |= htons(IP_MF);
 	ip->ip_sum = 0;
-	/*
-	 * We may not use checksums on loopback interfaces
-	 */
-	if (__predict_false(ifp == NULL) ||
-	    IN_NEED_CHECKSUM(ifp, M_CSUM_IPv4)) {
-		if (sw_csum & M_CSUM_IPv4) {
-			ip->ip_sum = in_cksum(m, hlen);
-			m->m_pkthdr.csum_flags &= ~M_CSUM_IPv4;
-		} else {
-			KASSERT(m->m_pkthdr.csum_flags & M_CSUM_IPv4);
-			KASSERT(M_CSUM_DATA_IPv4_IPHL(m->m_pkthdr.csum_data) >=
-				sizeof(struct ip));
-		}
+	if (sw_csum & M_CSUM_IPv4) {
+		ip->ip_sum = in_cksum(m, hlen);
+		m->m_pkthdr.csum_flags &= ~M_CSUM_IPv4;
+	} else {
+		/*
+		 * checksum is hw-offloaded or not necessary.
+		 */
+		KASSERT(!(ifp != NULL && IN_NEED_CHECKSUM(ifp, M_CSUM_IPv4))
+		   || (m->m_pkthdr.csum_flags & M_CSUM_IPv4) != 0);
+		KASSERT(M_CSUM_DATA_IPv4_IPHL(m->m_pkthdr.csum_data) >=
+			sizeof(struct ip));
 	}
 sendorfree:
 	/*

Reply via email to