Author: jhb
Date: Fri Jun 10 18:51:22 2011
New Revision: 222936
URL: http://svn.freebsd.org/changeset/base/222936

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/8/sys/netinet/tcp_output.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/netinet/tcp_output.c
==============================================================================
--- stable/8/sys/netinet/tcp_output.c   Fri Jun 10 18:47:10 2011        
(r222935)
+++ stable/8/sys/netinet/tcp_output.c   Fri Jun 10 18:51:22 2011        
(r222936)
@@ -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
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to