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>