From owner-freebsd-net@FreeBSD.ORG Wed Nov 4 18:17:24 2009 Return-Path: Delivered-To: net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7EFDB106568F for ; Wed, 4 Nov 2009 18:17:24 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from cyrus.watson.org (cyrus.watson.org [65.122.17.42]) by mx1.freebsd.org (Postfix) with ESMTP id 4EFEC8FC16 for ; Wed, 4 Nov 2009 18:17:24 +0000 (UTC) Received: from bigwig.baldwin.cx (66.111.2.69.static.nyinternet.net [66.111.2.69]) by cyrus.watson.org (Postfix) with ESMTPSA id E423646B32; Wed, 4 Nov 2009 13:17:23 -0500 (EST) Received: from jhbbsd.hudson-trading.com (unknown [209.249.190.8]) by bigwig.baldwin.cx (Postfix) with ESMTPA id 0DA448A01D; Wed, 4 Nov 2009 13:17:23 -0500 (EST) From: John Baldwin To: "Bjoern A. Zeeb" Date: Wed, 4 Nov 2009 13:17:06 -0500 User-Agent: KMail/1.9.7 References: <200911031529.26514.jhb@FreeBSD.org> <20091103212129.F37440@maildrop.int.zabbadoz.net> In-Reply-To: <20091103212129.F37440@maildrop.int.zabbadoz.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200911041317.06793.jhb@freebsd.org> X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.0.1 (bigwig.baldwin.cx); Wed, 04 Nov 2009 13:17:23 -0500 (EST) X-Virus-Scanned: clamav-milter 0.95.1 at bigwig.baldwin.cx X-Virus-Status: Clean X-Spam-Status: No, score=-2.5 required=4.2 tests=AWL,BAYES_00,RDNS_NONE autolearn=no version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on bigwig.baldwin.cx Cc: net@freebsd.org Subject: Re: Small bug with TCP zero windows X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 04 Nov 2009 18:17:24 -0000 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