[TCP]: Fix mark_head_lost to ignore R-bit when trying to mark L
Ilpo Järvinen [Fri, 12 Oct 2007 00:33:11 +0000 (17:33 -0700)]
This condition (plain R) can arise at least in recovery that
is triggered after tcp_undo_loss. There isn't any reason why
they should not be marked as lost, not marking makes in_flight
estimator to return too large values.

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 e40857e..c827285 100644 (file)
@@ -1987,7 +1987,7 @@ static void tcp_mark_head_lost(struct sock *sk,
                cnt += tcp_skb_pcount(skb);
                if (cnt > packets || after(TCP_SKB_CB(skb)->end_seq, high_seq))
                        break;
-               if (!(TCP_SKB_CB(skb)->sacked&TCPCB_TAGBITS)) {
+               if (!(TCP_SKB_CB(skb)->sacked & (TCPCB_SACKED_ACKED|TCPCB_LOST))) {
                        TCP_SKB_CB(skb)->sacked |= TCPCB_LOST;
                        tp->lost_out += tcp_skb_pcount(skb);
                        tcp_verify_retransmit_hint(tp, skb);