|
@@ -1877,8 +1877,13 @@ void tcp_enter_loss(struct sock *sk, int how)
|
|
|
}
|
|
|
tcp_verify_left_out(tp);
|
|
|
|
|
|
- tp->reordering = min_t(unsigned int, tp->reordering,
|
|
|
- sysctl_tcp_reordering);
|
|
|
+ /* Timeout in disordered state after receiving substantial DUPACKs
|
|
|
+ * suggests that the degree of reordering is over-estimated.
|
|
|
+ */
|
|
|
+ if (icsk->icsk_ca_state <= TCP_CA_Disorder &&
|
|
|
+ tp->sacked_out >= sysctl_tcp_reordering)
|
|
|
+ tp->reordering = min_t(unsigned int, tp->reordering,
|
|
|
+ sysctl_tcp_reordering);
|
|
|
tcp_set_ca_state(sk, TCP_CA_Loss);
|
|
|
tp->high_seq = tp->snd_nxt;
|
|
|
TCP_ECN_queue_cwr(tp);
|