Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Apr 2011 17:43:16 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r220794 - head/sys/netinet
Message-ID:  <201104181743.p3IHhGBf079436@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Mon Apr 18 17:43:16 2011
New Revision: 220794
URL: http://svn.freebsd.org/changeset/base/220794

Log:
  When checking to see if a window update should be sent to the remote peer,
  don't force a window update if the window would not actually grow due to
  window scaling.  Specifically, if the window scaling factor is larger than
  2 * MSS, then after the local reader has drained 2 * MSS bytes from the
  socket, a window update can end up advertising the same window.  If this
  happens, the supposed window update actually ends up being a duplicate ACK.
  This can result in an excessive number of duplicate ACKs when using a
  higher maximum socket buffer size.
  
  Reviewed by:	bz
  MFC after:	1 month

Modified:
  head/sys/netinet/tcp_output.c

Modified: head/sys/netinet/tcp_output.c
==============================================================================
--- head/sys/netinet/tcp_output.c	Mon Apr 18 16:40:47 2011	(r220793)
+++ head/sys/netinet/tcp_output.c	Mon Apr 18 17:43:16 2011	(r220794)
@@ -564,11 +564,19 @@ after_sack_rexmit:
 		long adv = min(recwin, (long)TCP_MAXWIN << tp->rcv_scale) -
 			(tp->rcv_adv - tp->rcv_nxt);
 
+		/* 
+		 * If the new window size ends up being the same as the old
+		 * size when it is scaled, then don't force a window update.
+		 */
+		if ((tp->rcv_adv - tp->rcv_nxt) >> tp->rcv_scale ==
+		    (adv + tp->rcv_adv - tp->rcv_nxt) >> tp->rcv_scale)
+			goto dontupdate;
 		if (adv >= (long) (2 * tp->t_maxseg))
 			goto send;
 		if (2 * adv >= (long) so->so_rcv.sb_hiwat)
 			goto send;
 	}
+dontupdate:
 
 	/*
 	 * Send if we owe the peer an ACK, RST, SYN, or urgent data.  ACKNOW



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201104181743.p3IHhGBf079436>