svn commit: r221346 - head/sys/netinet
Mike Silbersack
silby at silby.com
Sun Jun 12 06:56:07 UTC 2011
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
This change looks ok to me. I can't think of a better way to solve the
problem, and I don't see it causing any major change in behavior.
Mike "Silby" Silbersack
More information about the svn-src-all
mailing list