diff options
author | Yuchung Cheng <ycheng@google.com> | 2019-04-29 15:46:14 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-05-01 11:47:54 -0400 |
commit | 7c1f08154c4e34d10be41156375ce2b8ab591b0f (patch) | |
tree | f4fddf34b3b093d57867395e64dc450969dfc8ac /net/ipv4/tcp_metrics.c | |
parent | bc9f38c8328e10c22cb2016d6131ea36141c8d11 (diff) | |
download | linux-stable-7c1f08154c4e34d10be41156375ce2b8ab591b0f.tar.gz linux-stable-7c1f08154c4e34d10be41156375ce2b8ab591b0f.tar.bz2 linux-stable-7c1f08154c4e34d10be41156375ce2b8ab591b0f.zip |
tcp: undo initial congestion window on false SYN timeout
Linux implements RFC6298 and use an initial congestion window of 1
upon establishing the connection if the SYN packet is retransmitted 2
or more times. In cellular networks SYN timeouts are often spurious
if the wireless radio was dormant or idle. Also some network path
is longer than the default SYN timeout. Having a minimal cwnd on
both cases are detrimental to TCP startup performance.
This patch extends TCP undo feature (RFC3522 aka TCP Eifel) to detect
spurious SYN timeout via TCP timestamps. Since tp->retrans_stamp
records the initial SYN timestamp instead of first retransmission, we
have to implement a different undo code additionally. The detection
also must happen before tcp_ack() as retrans_stamp is reset when
SYN is acknowledged.
Note this patch covers both active regular and fast open.
Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_metrics.c')
-rw-r--r-- | net/ipv4/tcp_metrics.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c index f262f2cace29..d4d687330e2b 100644 --- a/net/ipv4/tcp_metrics.c +++ b/net/ipv4/tcp_metrics.c @@ -517,7 +517,7 @@ reset: * initRTO, we only reset cwnd when more than 1 SYN/SYN-ACK * retransmission has occurred. */ - if (tp->total_retrans > 1) + if (tp->total_retrans > 1 && tp->undo_marker) tp->snd_cwnd = 1; else tp->snd_cwnd = tcp_init_cwnd(tp, dst); |