Several years ago Dillon added a feature to TCP that casued soreceive() to 
send an ACK right away if data was drained from a TCP socket that had 
previously advertised a zero-sized window.  The current code requires the 
receive window to be exactly zero for this to kick in.  If window scaling is  
enabled and the window is smaller than the scale, then the effective window 
that is advertised is zero.  However, in that case the zero-sized window 
handling is not enabled because the window is not exactly zero.  The patch 
below changes the code to check the raw window value against zero.  Arguably 
it could check 'th_win' directly instead if folks would prefer that.

Index: tcp_output.c
===================================================================
--- tcp_output.c        (revision 198794)
+++ tcp_output.c        (working copy)
@@ -992,7 +992,7 @@
         * to read more data than can be buffered prior to transmitting on
         * the connection.
         */
-       if (recwin == 0)
+       if (recwin >> tp->rcv_scale == 0)
                tp->t_flags |= TF_RXWIN0SENT;
        else
                tp->t_flags &= ~TF_RXWIN0SENT;

-- 
John Baldwin
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to