kern/75122: [PATCH] Incorrect inflight bandwidth calculation on
first packet
Dan Nelson
dnelson at allantgroup.com
Mon Dec 20 23:00:50 PST 2004
The following reply was made to PR kern/75122; it has been noted by GNATS.
From: Dan Nelson <dnelson at allantgroup.com>
To: Uwe Doering <gemini at geminix.org>
Cc: FreeBSD-gnats-submit at FreeBSD.org, freebsd-bugs at FreeBSD.org
Subject: Re: kern/75122: [PATCH] Incorrect inflight bandwidth calculation on first packet
Date: Tue, 21 Dec 2004 00:55:31 -0600
In the last episode (Dec 18), Uwe Doering said:
> Dan Nelson wrote:
> >Updated patch including Matt's recommended fix:
> >
> >+ /*
> >+ * Sanity check, plus ignore pure window update acks.
> >+ */
> >+ if ((int)(ack_seq - tp->t_bw_rtseq) <= 0)
> >+ return;
>
> I wonder, isn't there a flaw in the logic with regard to the sequence
> number handling? If the sequence number wraps around 't_bw_rtseq' no
> longer gets set and therefore the bandwidth calculation stops until
> 'ack_seq' either catches up with 't_bw_rtseq' again (which would take
> quite a while), or 'ticks' wraps around as well, or there is
> inactivity for more than 10 seconds. This is probably not the
> intended behavior.
I think the code works as-is. ack_seq and tp->t_bw_rtseq are both of
type "tcp_seq" which is a u_int32_t. Wrap-around is handled
transparently when your variables are unsigned and your sequence space
covers all possible values. It's the magic of mod(2^32) arithmetic :)
The (int) cast just makes the if simpler. Without the cast it would
read
if (ack_seq - tp->t_bw_rtseq > 2147483648U || ack_seq == tp->t_bw_rtseq)
The sanity check is probably not even necessary, as any really invalid
sequence numbers would have caused the packet to be dropped before it
got this far.
--
Dan Nelson
dnelson at allantgroup.com
More information about the freebsd-bugs
mailing list