diff options
-rw-r--r-- | net/ipv4/tcp_input.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index b21e232d5d33..c5be3d0465f5 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -2467,6 +2467,15 @@ static int tcp_ack_update_window(struct sock *sk, struct tcp_sock *tp, | |||
2467 | return flag; | 2467 | return flag; |
2468 | } | 2468 | } |
2469 | 2469 | ||
2470 | /* A very conservative spurious RTO response algorithm: reduce cwnd and | ||
2471 | * continue in congestion avoidance. | ||
2472 | */ | ||
2473 | static void tcp_conservative_spur_to_response(struct tcp_sock *tp) | ||
2474 | { | ||
2475 | tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh); | ||
2476 | tcp_moderate_cwnd(tp); | ||
2477 | } | ||
2478 | |||
2470 | static void tcp_process_frto(struct sock *sk, u32 prior_snd_una) | 2479 | static void tcp_process_frto(struct sock *sk, u32 prior_snd_una) |
2471 | { | 2480 | { |
2472 | struct tcp_sock *tp = tcp_sk(sk); | 2481 | struct tcp_sock *tp = tcp_sk(sk); |
@@ -2488,12 +2497,7 @@ static void tcp_process_frto(struct sock *sk, u32 prior_snd_una) | |||
2488 | */ | 2497 | */ |
2489 | tp->snd_cwnd = tcp_packets_in_flight(tp) + 2; | 2498 | tp->snd_cwnd = tcp_packets_in_flight(tp) + 2; |
2490 | } else { | 2499 | } else { |
2491 | /* Also the second ACK after RTO advances the window. | 2500 | tcp_conservative_spur_to_response(tp); |
2492 | * The RTO was likely spurious. Reduce cwnd and continue | ||
2493 | * in congestion avoidance | ||
2494 | */ | ||
2495 | tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh); | ||
2496 | tcp_moderate_cwnd(tp); | ||
2497 | } | 2501 | } |
2498 | 2502 | ||
2499 | /* F-RTO affects on two new ACKs following RTO. | 2503 | /* F-RTO affects on two new ACKs following RTO. |