Small bug with TCP zero windows
Bjoern A. Zeeb
bzeeb-lists at lists.zabbadoz.net
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