summaryrefslogtreecommitdiffstats
path: root/sys/net/if_loop.c
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2012-07-28 20:31:39 +0000
committerbz <bz@FreeBSD.org>2012-07-28 20:31:39 +0000
commit245ecd05522e7e28dde7c369f90b2990a68b3271 (patch)
treef288b18e397df6eb789addad60de0f8e5b31ce82 /sys/net/if_loop.c
parent4253fe261fe70065de3c9a7c4bbd5b93a959bd8f (diff)
downloadFreeBSD-src-245ecd05522e7e28dde7c369f90b2990a68b3271.zip
FreeBSD-src-245ecd05522e7e28dde7c369f90b2990a68b3271.tar.gz
Hardcode the loopback rx/tx checkum options for IPv6 to on without
checking. This allows the FreeBSD 9.1 release process to move forward. Work around the problem that loopback connections to local addresses not on loopback interfaces and not on interfaces w/ IPv6 checksum offloading enabled would not work. A proper fix to allow us to disable the "checksum offload" on loopback for testing, measurements, ... as we allow for IPv4 needs to put in place later. Reported by: tuexen, Matthew Seaman (m.seaman infracaninophile.co.uk) Reported by: Mike Andrews (mandrews bit0.com), kib, ... PR: kern/170070 MFC after: 1 day X-MFC after: re approval
Diffstat (limited to 'sys/net/if_loop.c')
-rw-r--r--sys/net/if_loop.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c
index 8d371eb..2850b38 100644
--- a/sys/net/if_loop.c
+++ b/sys/net/if_loop.c
@@ -257,10 +257,20 @@ looutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
m->m_pkthdr.csum_flags &= ~LO_CSUM_FEATURES;
break;
case AF_INET6:
+#if 0
+ /*
+ * XXX-BZ for now always claim the checksum is good despite
+ * any interface flags. This is a workaround for 9.1-R and
+ * a proper solution ought to be sought later.
+ */
if (ifp->if_capenable & IFCAP_RXCSUM_IPV6) {
m->m_pkthdr.csum_data = 0xffff;
m->m_pkthdr.csum_flags = LO_CSUM_SET;
}
+#else
+ m->m_pkthdr.csum_data = 0xffff;
+ m->m_pkthdr.csum_flags = LO_CSUM_SET;
+#endif
m->m_pkthdr.csum_flags &= ~LO_CSUM_FEATURES6;
break;
case AF_IPX:
@@ -446,15 +456,29 @@ loioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
ifp->if_capenable ^= IFCAP_RXCSUM;
if ((mask & IFCAP_TXCSUM) != 0)
ifp->if_capenable ^= IFCAP_TXCSUM;
- if ((mask & IFCAP_RXCSUM_IPV6) != 0)
+ if ((mask & IFCAP_RXCSUM_IPV6) != 0) {
+#if 0
ifp->if_capenable ^= IFCAP_RXCSUM_IPV6;
- if ((mask & IFCAP_TXCSUM_IPV6) != 0)
+#else
+ error = EOPNOTSUPP;
+ break;
+#endif
+ }
+ if ((mask & IFCAP_TXCSUM_IPV6) != 0) {
+#if 0
ifp->if_capenable ^= IFCAP_TXCSUM_IPV6;
+#else
+ error = EOPNOTSUPP;
+ break;
+#endif
+ }
ifp->if_hwassist = 0;
if (ifp->if_capenable & IFCAP_TXCSUM)
ifp->if_hwassist = LO_CSUM_FEATURES;
+#if 0
if (ifp->if_capenable & IFCAP_TXCSUM_IPV6)
ifp->if_hwassist |= LO_CSUM_FEATURES6;
+#endif
break;
default:
OpenPOWER on IntegriCloud