[TCP]: Verify the presence of RETRANS bit when leaving FRTO
authorIlpo Järvinen <ilpo.jarvinen@helsinki.fi>
Sun, 15 Jul 2007 07:19:29 +0000 (00:19 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 15 Jul 2007 07:19:29 +0000 (00:19 -0700)
For yet unknown reason, something cleared SACKED_RETRANS bit
underneath FRTO.

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 69f9f1ef3ef69bc1d3ed88fa410443ac32af40a3..4e5884ac8f299672614fc497e3f3dff6e1153de9 100644 (file)
@@ -1398,7 +1398,9 @@ static void tcp_enter_frto_loss(struct sock *sk, int allowed_segments, int flag)
                 * waiting for the first ACK and did not get it)...
                 */
                if ((tp->frto_counter == 1) && !(flag&FLAG_DATA_ACKED)) {
-                       tp->retrans_out += tcp_skb_pcount(skb);
+                       /* For some reason this R-bit might get cleared? */
+                       if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS)
+                               tp->retrans_out += tcp_skb_pcount(skb);
                        /* ...enter this if branch just for the first segment */
                        flag |= FLAG_DATA_ACKED;
                } else {