svn commit: r222937 - stable/7/sys/netinet
John Baldwin
jhb at FreeBSD.org
Fri Jun 10 18:51:33 UTC 2011
Author: jhb
Date: Fri Jun 10 18:51:33 2011
New Revision: 222937
URL: http://svn.freebsd.org/changeset/base/222937
Log:
MFC 220794:
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.
Modified:
stable/7/sys/netinet/tcp_output.c
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/netinet/tcp_output.c
==============================================================================
--- stable/7/sys/netinet/tcp_output.c Fri Jun 10 18:51:22 2011 (r222936)
+++ stable/7/sys/netinet/tcp_output.c Fri Jun 10 18:51:33 2011 (r222937)
@@ -560,11 +560,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
More information about the svn-src-all
mailing list