Small bug with TCP zero windows

Bjoern A. Zeeb bzeeb-lists at
Tue Nov 3 21:30:08 UTC 2009

On Tue, 3 Nov 2009, John Baldwin wrote:

> 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.

hmm, looking a few lines up, there is a htons() there as well;
obviously doesn't matter for 0.  th_win is set to something different
for SYNs.  I guess what you are doing is ok, and even though it is not
needed, I feel that it would be easier to read it with an extra pair
of ().

> 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;

Bjoern A. Zeeb         It will not break if you know what you are doing.

More information about the freebsd-net mailing list