svn commit: r223797 - head/sys/netinet

Colin Percival cperciva at FreeBSD.org
Tue Jul 5 18:43:55 UTC 2011


Author: cperciva
Date: Tue Jul  5 18:43:54 2011
New Revision: 223797
URL: http://svn.freebsd.org/changeset/base/223797

Log:
  Don't allow lro->len to exceed 65535, as this will result in overflow
  when len is inserted back into the synthetic IP packet and cause a
  multiple of 2^16 bytes of TCP "packet loss".
  
  This improves Linux->FreeBSD netperf bandwidth by a factor of 300 in
  testing on Amazon EC2.
  
  Reviewed by:	jfv
  MFC after:	2 weeks

Modified:
  head/sys/netinet/tcp_lro.c

Modified: head/sys/netinet/tcp_lro.c
==============================================================================
--- head/sys/netinet/tcp_lro.c	Tue Jul  5 18:42:10 2011	(r223796)
+++ head/sys/netinet/tcp_lro.c	Tue Jul  5 18:43:54 2011	(r223797)
@@ -277,6 +277,14 @@ tcp_lro_rx(struct lro_ctrl *cntl, struct
 		    lro->dest_port == tcp->th_dport &&
 		    lro->source_ip == ip->ip_src.s_addr && 
 		    lro->dest_ip == ip->ip_dst.s_addr) {
+			/* Flush now if appending will result in overflow. */
+			if (lro->len > (65535 - tcp_data_len)) {
+				SLIST_REMOVE(&cntl->lro_active, lro,
+					     lro_entry, next);
+				tcp_lro_flush(cntl, lro);
+				break;
+			}
+
 			/* Try to append it */
 
 			if (__predict_false(seq != lro->next_seq ||


More information about the svn-src-all mailing list