]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[TCP]: Extend reordering detection to cover CA_Loss partially
authorIlpo Järvinen <ilpo.jarvinen@helsinki.fi>
Fri, 16 Nov 2007 03:35:11 +0000 (19:35 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 22:54:02 +0000 (14:54 -0800)
This implements more accurately what is stated in sacktag's
overall comment:

  "Both of these heuristics are not used in Loss state, when
   we cannot account for retransmits accurately."

When CA_Loss state is entered, the state changer ensures that
undo_marker is only set if no TCPCB_RETRANS skbs were found,
thus having non-zero undo_marker in CA_Loss basically tells
that the R-bits still accurately reflect the current state
of TCP.

Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_input.c

index 901240f40688264077090c9475d95f888dc56413..26713e5d89dbe6be4a774c98d3d1374bfe006af3 100644 (file)
@@ -1511,7 +1511,8 @@ tcp_sacktag_write_queue(struct sock *sk, struct sk_buff *ack_skb, u32 prior_snd_
 
        tcp_verify_left_out(tp);
 
-       if ((reord < tp->fackets_out) && icsk->icsk_ca_state != TCP_CA_Loss &&
+       if ((reord < tp->fackets_out) &&
+           ((icsk->icsk_ca_state != TCP_CA_Loss) || tp->undo_marker) &&
            (!tp->frto_highmark || after(tp->snd_una, tp->frto_highmark)))
                tcp_update_reordering(sk, tp->fackets_out - reord, 0);