diff options
author | Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> | 2007-11-14 18:55:09 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-11-14 18:55:09 -0500 |
commit | e1cd8f78f8cbfa314a095dbf704707217c8ee197 (patch) | |
tree | 3fd93e961b6e0d45813a03bf1c2087f8628ca7b1 /net | |
parent | c67625a1ecd7caf4c0490fc5278d6bb736a5297f (diff) |
[TCP] FRTO: Clear frto_highmark only after process_frto that uses it
I broke this in commit 3de96471bd7fb76406e975ef6387abe3a0698149:
[TCP]: Wrap-safed reordering detection FRTO check
tcp_process_frto should always see a valid frto_highmark. An invalid
frto_highmark (zero) is very likely what ultimately caused a seqno
compare in tcp_frto_enter_loss to do the wrong leading to the LOST-bit
leak.
Having LOST-bits integry ensured like done after commit
23aeeec365dcf8bc87fae44c533e50d0bb4f23cc:
[TCP] FRTO: Plug potential LOST-bit leak
won't hurt. It may still be useful in some other, possibly legimate,
scenario.
Reported by Chazarain Guillaume <guichaz@yahoo.fr>.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/tcp_input.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 3f126ece8eb5..0f0c1c9829a1 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -3113,11 +3113,11 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag) | |||
3113 | /* See if we can take anything off of the retransmit queue. */ | 3113 | /* See if we can take anything off of the retransmit queue. */ |
3114 | flag |= tcp_clean_rtx_queue(sk, &seq_rtt, prior_fackets); | 3114 | flag |= tcp_clean_rtx_queue(sk, &seq_rtt, prior_fackets); |
3115 | 3115 | ||
3116 | if (tp->frto_counter) | ||
3117 | frto_cwnd = tcp_process_frto(sk, flag); | ||
3116 | /* Guarantee sacktag reordering detection against wrap-arounds */ | 3118 | /* Guarantee sacktag reordering detection against wrap-arounds */ |
3117 | if (before(tp->frto_highmark, tp->snd_una)) | 3119 | if (before(tp->frto_highmark, tp->snd_una)) |
3118 | tp->frto_highmark = 0; | 3120 | tp->frto_highmark = 0; |
3119 | if (tp->frto_counter) | ||
3120 | frto_cwnd = tcp_process_frto(sk, flag); | ||
3121 | 3121 | ||
3122 | if (tcp_ack_is_dubious(sk, flag)) { | 3122 | if (tcp_ack_is_dubious(sk, flag)) { |
3123 | /* Advance CWND, if state allows this. */ | 3123 | /* Advance CWND, if state allows this. */ |