From b1d3279583bd56fc270ffa33c307461d1406e05e Mon Sep 17 00:00:00 2001 From: jhb Date: Fri, 10 Jun 2011 18:51:22 +0000 Subject: [PATCH] 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. git-svn-id: svn://svn.freebsd.org/base/stable/8@222936 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/netinet/tcp_output.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index f14239f4e..e959b00ec 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -577,11 +577,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 -- 2.45.0