[TCP] FRTO: Prevent state inconsistency in corner cases
authorIlpo Järvinen <ilpo.jarvinen@helsinki.fi>
Sat, 19 May 2007 20:56:57 +0000 (13:56 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 19 May 2007 20:56:57 +0000 (13:56 -0700)
State could become inconsistent in two cases:

1) Userspace disabled FRTO by tuning sysctl when one of the TCP
   flows was in the middle of FRTO algorithm (and then RTO is
   again triggered)

2) SACK reneging occurs during FRTO algorithm

A simple solution is just to abort the previous FRTO when such
obscure condition occurs...

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 7ecdc89229e85c34758849040565f6447cfd33df..38cb25b48bf3b9961e1ba737db9ea194c448c3b1 100644 (file)
@@ -1501,6 +1501,8 @@ void tcp_enter_loss(struct sock *sk, int how)
        tcp_set_ca_state(sk, TCP_CA_Loss);
        tp->high_seq = tp->snd_nxt;
        TCP_ECN_queue_cwr(tp);
+       /* Abort FRTO algorithm if one is in progress */
+       tp->frto_counter = 0;
 
        clear_all_retrans_hints(tp);
 }