Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Nov 2009 21:26:48 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bzeeb-lists@lists.zabbadoz.net>
To:        John Baldwin <jhb@FreeBSD.org>
Cc:        net@FreeBSD.org
Subject:   Re: Small bug with TCP zero windows
Message-ID:  <20091103212129.F37440@maildrop.int.zabbadoz.net>
In-Reply-To: <200911031529.26514.jhb@FreeBSD.org>
References:  <200911031529.26514.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20091103212129.F37440>