I'm heading out of town this weekend. I can try to look at this on Tuesday, if nobody beats me to it.

-Mike

On Fri, 3 Jun 2011, John Baldwin wrote:

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

_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to