Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Nov 2009 13:17:06 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        "Bjoern A. Zeeb" <bzeeb-lists@lists.zabbadoz.net>
Cc:        net@freebsd.org
Subject:   Re: Small bug with TCP zero windows
Message-ID:  <200911041317.06793.jhb@freebsd.org>
In-Reply-To: <20091103212129.F37440@maildrop.int.zabbadoz.net>
References:  <200911031529.26514.jhb@FreeBSD.org> <20091103212129.F37440@maildrop.int.zabbadoz.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday 03 November 2009 4:26:48 pm Bjoern A. Zeeb wrote:
> 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 ().

How about using 'if (th->th_win == htons(0))' for the condition?

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



-- 
John Baldwin



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