svn commit: r295739 - in head/sys: netinet sys

Sepherosa Ziehau sephe at FreeBSD.org
Thu Feb 18 04:58:36 UTC 2016


Author: sephe
Date: Thu Feb 18 04:58:34 2016
New Revision: 295739
URL: https://svnweb.freebsd.org/changeset/base/295739

Log:
  tcp/lro: Allow drivers to set the TCP ACK/data segment aggregation limit
  
  ACK aggregation limit is append count based, while the TCP data segment
  aggregation limit is length based.  Unless the network driver sets these
  two limits, it's an NO-OP.
  
  Reviewed by:	adrian, gallatin (previous version), hselasky (previous version)
  Approved by:	adrian (mentor)
  MFC after:	1 week
  Sponsored by:	Microsoft OSTC
  Differential Revision:	https://reviews.freebsd.org/D5185

Modified:
  head/sys/netinet/tcp_lro.c
  head/sys/netinet/tcp_lro.h
  head/sys/sys/param.h

Modified: head/sys/netinet/tcp_lro.c
==============================================================================
--- head/sys/netinet/tcp_lro.c	Thu Feb 18 03:05:08 2016	(r295738)
+++ head/sys/netinet/tcp_lro.c	Thu Feb 18 04:58:34 2016	(r295739)
@@ -88,6 +88,8 @@ tcp_lro_init_args(struct lro_ctrl *lc, s
 	lc->lro_mbuf_count = 0;
 	lc->lro_mbuf_max = lro_mbufs;
 	lc->lro_cnt = lro_entries;
+	lc->lro_ackcnt_lim = TCP_LRO_ACKCNT_MAX;
+	lc->lro_length_lim = TCP_LRO_LENGTH_MAX;
 	lc->ifp = ifp;
 	SLIST_INIT(&lc->lro_free);
 	SLIST_INIT(&lc->lro_active);
@@ -610,7 +612,7 @@ tcp_lro_rx(struct lro_ctrl *lc, struct m
 		}
 
 		/* Flush now if appending will result in overflow. */
-		if (le->p_len > (65535 - tcp_data_len)) {
+		if (le->p_len > (lc->lro_length_lim - tcp_data_len)) {
 			SLIST_REMOVE(&lc->lro_active, le, lro_entry, next);
 			tcp_lro_flush(lc, le);
 			break;
@@ -648,6 +650,15 @@ tcp_lro_rx(struct lro_ctrl *lc, struct m
 
 		if (tcp_data_len == 0) {
 			m_freem(m);
+			/*
+			 * Flush this LRO entry, if this ACK should not
+			 * be further delayed.
+			 */
+			if (le->append_cnt >= lc->lro_ackcnt_lim) {
+				SLIST_REMOVE(&lc->lro_active, le, lro_entry,
+				    next);
+				tcp_lro_flush(lc, le);
+			}
 			return (0);
 		}
 
@@ -668,7 +679,7 @@ tcp_lro_rx(struct lro_ctrl *lc, struct m
 		 * If a possible next full length packet would cause an
 		 * overflow, pro-actively flush now.
 		 */
-		if (le->p_len > (65535 - lc->ifp->if_mtu)) {
+		if (le->p_len > (lc->lro_length_lim - lc->ifp->if_mtu)) {
 			SLIST_REMOVE(&lc->lro_active, le, lro_entry, next);
 			tcp_lro_flush(lc, le);
 		} else

Modified: head/sys/netinet/tcp_lro.h
==============================================================================
--- head/sys/netinet/tcp_lro.h	Thu Feb 18 03:05:08 2016	(r295738)
+++ head/sys/netinet/tcp_lro.h	Thu Feb 18 04:58:34 2016	(r295739)
@@ -91,11 +91,16 @@ struct lro_ctrl {
 	unsigned	lro_cnt;
 	unsigned	lro_mbuf_count;
 	unsigned	lro_mbuf_max;
+	unsigned short	lro_ackcnt_lim;		/* max # of aggregated ACKs */
+	unsigned 	lro_length_lim;		/* max len of aggregated data */
 
 	struct lro_head	lro_active;
 	struct lro_head	lro_free;
 };
 
+#define	TCP_LRO_LENGTH_MAX	65535
+#define	TCP_LRO_ACKCNT_MAX	65535		/* unlimited */
+
 int tcp_lro_init(struct lro_ctrl *);
 int tcp_lro_init_args(struct lro_ctrl *, struct ifnet *, unsigned, unsigned);
 void tcp_lro_free(struct lro_ctrl *);

Modified: head/sys/sys/param.h
==============================================================================
--- head/sys/sys/param.h	Thu Feb 18 03:05:08 2016	(r295738)
+++ head/sys/sys/param.h	Thu Feb 18 04:58:34 2016	(r295739)
@@ -58,7 +58,7 @@
  *		in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1100098	/* Master, propagated to newvers */
+#define __FreeBSD_version 1100099	/* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,


More information about the svn-src-head mailing list