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: /*