question in tcp_do_segment()

Sepherosa Ziehau sepherosa at gmail.com
Sun Jul 15 10:26:03 UTC 2012


On Sat, Jul 14, 2012 at 1:54 AM, Reese Faucette <reese at myri.com> wrote:
> Hi, freebsd-net-
>
> I don't have a testcase for this at the moment, but there's a test
> in tcp_do_segment that looks backwards to me...
>
> http://svnweb.freebsd.org/base/release/9.0.0/sys/netinet/tcp_input.c?view=markup
>
> line 2398 -
>         if (!tcp_timer_active(tp, TT_REXMT) ||
>             th->th_ack != tp->snd_una)
>                tp->t_dupacks = 0;
>
> says "If we get a DUP ack and the retransmit timer is NOT
> fired, then ignore it and reset DUP ACK count."
>
> Isn't that exactly backwards?  I could see ignoring the DUP ACK if we
> know the retransmit timer HAS fired, and we don't want to interfere with
> its retransmission efforts.  The way the code is written now, as far as
> I can see, completely defeats retransmission based on DUP acks.  I
> accidentally ran across this by breaking the timer, so that the
> retransmit timer never fires, and my streams get stuck, even with plenty of
> DUP ACKs.
>
> Am I missing something, or should that "!" go ?

!tcp_timer_active() means that the connection's retransmit timer is
not _set_ yet (please note, it is _not_ "has fired").  As far as I
understand this code, it in turn means that this connection doesn't
have any segments that were sent but not yet ACKed.

Best Regards,
sephe

-- 
Tomorrow Will Never Die


More information about the freebsd-net mailing list