Module Name: src
Committed By: rin
Date: Thu Dec 13 12:13:33 UTC 2018
Modified Files:
src/sys/net: ether_sw_offload.c
Log Message:
Fix (bridge && !inet6) build.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/net/ether_sw_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/net/ether_sw_offload.c
diff -u src/sys/net/ether_sw_offload.c:1.1 src/sys/net/ether_sw_offload.c:1.2
--- src/sys/net/ether_sw_offload.c:1.1 Wed Dec 12 01:40:20 2018
+++ src/sys/net/ether_sw_offload.c Thu Dec 13 12:13:33 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ether_sw_offload.c,v 1.1 2018/12/12 01:40:20 rin Exp $ */
+/* $NetBSD: ether_sw_offload.c,v 1.2 2018/12/13 12:13:33 rin Exp $ */
/*
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -29,8 +29,12 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#ifdef _KERNEL_OPT
+#include "opt_inet.h"
+#endif
+
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ether_sw_offload.c,v 1.1 2018/12/12 01:40:20 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ether_sw_offload.c,v 1.2 2018/12/13 12:13:33 rin Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -43,12 +47,14 @@ __KERNEL_RCSID(0, "$NetBSD: ether_sw_off
#include <netinet/in.h>
#include <netinet/in_offload.h>
#include <netinet/ip.h>
-#include <netinet/ip6.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
+#ifdef INET6
+#include <netinet/ip6.h>
#include <netinet6/in6.h>
#include <netinet6/in6_offload.h>
+#endif
/*
* Handle TX offload in software. For TSO, split the packet into
@@ -62,7 +68,7 @@ ether_sw_offload_tx(struct ifnet *ifp, s
{
struct ether_header *ep;
int flags, ehlen;
- bool v4;
+ bool v6;
KASSERT(m->m_flags & M_PKTHDR);
flags = m->m_pkthdr.csum_flags;
@@ -93,7 +99,10 @@ ether_sw_offload_tx(struct ifnet *ifp, s
}
KASSERT(m->m_pkthdr.len >= ehlen);
- v4 = flags & (M_CSUM_TSOv4 | M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4);
+ v6 = flags & (M_CSUM_TSOv6 | M_CSUM_TCPv6 | M_CSUM_UDPv6);
+#ifndef INET6
+ KASSERT(!v6);
+#endif
if (flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) {
/*
@@ -103,16 +112,20 @@ ether_sw_offload_tx(struct ifnet *ifp, s
*
* XXX Do we need some KASSERT's?
*/
- if (v4)
- return tcp4_segment(m, ehlen);
- else
+#ifdef INET6
+ if (v6)
return tcp6_segment(m, ehlen);
+ else
+#endif
+ return tcp4_segment(m, ehlen);
}
- if (v4)
- in_undefer_cksum(m, ehlen, flags);
- else
+#ifdef INET6
+ if (v6)
in6_undefer_cksum(m, ehlen, flags);
+ else
+#endif
+ in_undefer_cksum(m, ehlen, flags);
done:
m->m_pkthdr.csum_flags = 0;
m->m_nextpkt = NULL;
@@ -134,13 +147,12 @@ ether_sw_offload_rx(struct ifnet *ifp, s
{
struct ether_header *eh;
struct ip *ip;
- struct ip6_hdr *ip6;
struct tcphdr *th;
struct udphdr *uh;
uint16_t sum, osum;
uint8_t proto;
int flags, enabled, len, ehlen, iphlen, l4offset;
- bool v4;
+ bool v6;
flags = 0;
@@ -181,9 +193,46 @@ ether_sw_offload_rx(struct ifnet *ifp, s
return NULL;
}
ip = (void *)(mtod(m, char *) + ehlen);
- v4 = (ip->ip_v == IPVERSION);
+ v6 = (ip->ip_v != IPVERSION);
+
+ if (v6) {
+#ifdef INET6
+ struct ip6_hdr *ip6;
+
+ KASSERT(len >= sizeof(*ip6));
+ if (m->m_len < ehlen + sizeof(*ip6)) {
+ m = m_pullup(m, ehlen + sizeof(*ip6));
+ if (m == NULL)
+ return NULL;
+ }
+ ip6 = (void *)(mtod(m, char *) + ehlen);
+ KASSERT((ip6->ip6_vfc & IPV6_VERSION_MASK) == IPV6_VERSION);
- if (v4) {
+ iphlen = sizeof(*ip6);
+
+ len -= iphlen;
+
+ proto = ip6->ip6_nxt;
+ switch (proto) {
+ case IPPROTO_TCP:
+ if (!(enabled & M_CSUM_TCPv6))
+ goto done;
+ break;
+ case IPPROTO_UDP:
+ if (!(enabled & M_CSUM_UDPv6))
+ goto done;
+ break;
+ default:
+ /* XXX Extension headers are not supported. */
+ goto done;
+ }
+
+ sum = in6_cksum_phdr(&ip6->ip6_src, &ip6->ip6_dst, htonl(len),
+ htonl(proto));
+#else
+ goto done;
+#endif
+ } else {
if (enabled & M_CSUM_IPv4)
flags |= M_CSUM_IPv4;
@@ -220,37 +269,6 @@ ether_sw_offload_rx(struct ifnet *ifp, s
sum = in_cksum_phdr(ip->ip_src.s_addr, ip->ip_dst.s_addr,
htons((uint16_t)len + proto));
- } else {
- KASSERT(len >= sizeof(*ip6));
- if (m->m_len < ehlen + sizeof(*ip6)) {
- m = m_pullup(m, ehlen + sizeof(*ip6));
- if (m == NULL)
- return NULL;
- }
- ip6 = (void *)(mtod(m, char *) + ehlen);
- KASSERT((ip6->ip6_vfc & IPV6_VERSION_MASK) == IPV6_VERSION);
-
- iphlen = sizeof(*ip6);
-
- len -= iphlen;
-
- proto = ip6->ip6_nxt;
- switch (proto) {
- case IPPROTO_TCP:
- if (!(enabled & M_CSUM_TCPv6))
- goto done;
- break;
- case IPPROTO_UDP:
- if (!(enabled & M_CSUM_UDPv6))
- goto done;
- break;
- default:
- /* XXX Extension headers are not supported. */
- goto done;
- }
-
- sum = in6_cksum_phdr(&ip6->ip6_src, &ip6->ip6_dst, htonl(len),
- htonl(proto));
}
l4offset = ehlen + iphlen;
@@ -265,12 +283,15 @@ ether_sw_offload_rx(struct ifnet *ifp, s
th = (void *)(mtod(m, char *) + l4offset);
osum = th->th_sum;
th->th_sum = sum;
- if (v4) {
- flags |= M_CSUM_TCPv4;
- sum = in4_cksum(m, 0, l4offset, len);
- } else {
+#ifdef INET6
+ if (v6) {
flags |= M_CSUM_TCPv6;
sum = in6_cksum(m, 0, l4offset, len);
+ } else
+#endif
+ {
+ flags |= M_CSUM_TCPv4;
+ sum = in4_cksum(m, 0, l4offset, len);
}
if (sum != osum)
flags |= M_CSUM_TCP_UDP_BAD;
@@ -288,12 +309,15 @@ ether_sw_offload_rx(struct ifnet *ifp, s
if (osum == 0)
break;
uh->uh_sum = sum;
- if (v4) {
- flags |= M_CSUM_UDPv4;
- sum = in4_cksum(m, 0, l4offset, len);
- } else {
+#ifdef INET6
+ if (v6) {
flags |= M_CSUM_UDPv6;
sum = in6_cksum(m, 0, l4offset, len);
+ } else
+#endif
+ {
+ flags |= M_CSUM_UDPv4;
+ sum = in4_cksum(m, 0, l4offset, len);
}
if (sum == 0)
sum = 0xffff;