svn commit: r235981 - head/sys/netinet

Bjoern A. Zeeb bz at FreeBSD.org
Fri May 25 08:18:00 UTC 2012


Author: bz
Date: Fri May 25 08:17:59 2012
New Revision: 235981
URL: http://svn.freebsd.org/changeset/base/235981

Log:
  In case forwarding is turned on for a given address family, refuse to
  queue the packet for LRO and tell the driver to directly pass it on.
  This avoids re-assembly and later re-fragmentation problems when
  forwarding.
  
  It's not the best solution but the simplest and most effective for
  the moment.
  
  Should have been done:	ages ago
  Discussed with and by:	many
  MFC after:		3 days

Modified:
  head/sys/netinet/tcp_lro.c

Modified: head/sys/netinet/tcp_lro.c
==============================================================================
--- head/sys/netinet/tcp_lro.c	Fri May 25 07:57:17 2012	(r235980)
+++ head/sys/netinet/tcp_lro.c	Fri May 25 08:17:59 2012	(r235981)
@@ -51,9 +51,12 @@ __FBSDID("$FreeBSD$");
 #include <netinet/in.h>
 #include <netinet/ip6.h>
 #include <netinet/ip.h>
+#include <netinet/ip_var.h>
 #include <netinet/tcp.h>
 #include <netinet/tcp_lro.h>
 
+#include <netinet6/ip6_var.h>
+
 #include <machine/in_cksum.h>
 
 #ifndef LRO_ENTRIES
@@ -369,6 +372,10 @@ tcp_lro_rx(struct lro_ctrl *lc, struct m
 	switch (eh_type) {
 #ifdef INET6
 	case ETHERTYPE_IPV6:
+		if (V_ip6_forwarding != 0) {
+			/* XXX-BZ stats but changing lro_ctrl is a problem. */
+			return (TCP_LRO_CANNOT);
+		}
 		l3hdr = ip6 = (struct ip6_hdr *)(eh + 1);
 		error = tcp_lro_rx_ipv6(lc, m, ip6, &th);
 		if (error != 0)
@@ -379,6 +386,10 @@ tcp_lro_rx(struct lro_ctrl *lc, struct m
 #endif
 #ifdef INET
 	case ETHERTYPE_IP:
+		if (V_ipforwarding != 0) {
+			/* XXX-BZ stats but changing lro_ctrl is a problem. */
+			return (TCP_LRO_CANNOT);
+		}
 		l3hdr = ip4 = (struct ip *)(eh + 1);
 		error = tcp_lro_rx_ipv4(lc, m, ip4, &th);
 		if (error != 0)


More information about the svn-src-head mailing list