Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Jun 2011 09:44:36 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        Mikolaj Golub <trociny@freebsd.org>, Bjoern Zeeb <bz@freebsd.org>, Lawrence Stewart <lstewart@freebsd.org>, Mike Silbersack <silby@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r221346 - head/sys/netinet
Message-ID:  <201106030944.36200.jhb@freebsd.org>
In-Reply-To: <86boz5fby1.fsf@kopusha.home.net>
References:  <201105022105.p42L5q3j054498@svn.freebsd.org> <4DCE93BF.7000803@FreeBSD.org> <86boz5fby1.fsf@kopusha.home.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Saturday, May 14, 2011 1:07:18 pm Mikolaj Golub wrote:
> 
> On Sat, 14 May 2011 10:37:51 -0400 John Baldwin wrote:
> 
>  JB> Can you capture a tcpdump (probably easiest to do from the other host)?
> 
> I replaced the asserts with log statements to make the host not panic and the
> captured dump survive.

Please try this change.  What is happening is that you have a remaining
window that is smaller than the window scale.  You are receiving zero
window updates that are received ok (becuase the socket buffer isn't
completely empty), and that advance rcv_nxt.  However, tcp_output() is
not advancing rcv_adv because 'recwin' is calculated as zero.  My
invariants had assumed that the ACK that gets forced out for a reply
to a zero window probe would move rcv_adv, but that isn't happening.
This patch will allow rcv_adv to advance when a zero window probe is
ACK'd.  I'm not sure if this is the best way to fix this, but I think
it will fix it:

Index: tcp_output.c
===================================================================
--- tcp_output.c	(revision 222565)
+++ tcp_output.c	(working copy)
@@ -1331,7 +1331,7 @@ out:
 	 * then remember the size of the advertised window.
 	 * Any pending ACK has now been sent.
 	 */
-	if (recwin > 0 && SEQ_GT(tp->rcv_nxt + recwin, tp->rcv_adv))
+	if (recwin >= 0 && SEQ_GT(tp->rcv_nxt + recwin, tp->rcv_adv))
 		tp->rcv_adv = tp->rcv_nxt + recwin;
 	tp->last_ack_sent = tp->rcv_nxt;
 	tp->t_flags &= ~(TF_ACKNOW | TF_DELACK);


-- 
John Baldwin



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