net-tcp: Fast Open client - detecting SYN-data drops
On paths with firewalls dropping SYN with data or experimental TCP options, Fast Open connections will have experience SYN timeout and bad performance. The solution is to track such incidents in the cookie cache and disables Fast Open temporarily. Since only the original SYN includes data and/or Fast Open option, the SYN-ACK has some tell-tale sign (tcp_rcv_fastopen_synack()) to detect such drops. If a path has recurring Fast Open SYN drops, Fast Open is disabled for 2^(recurring_losses) minutes starting from four minutes up to roughly one and half day. sendmsg with MSG_FASTOPEN flag will succeed but it behaves as connect() then write(). Signed-off-by: Yuchung Cheng <ycheng@google.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
cf60af03ca
commit
aab4874355
@@ -5652,6 +5652,7 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack,
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
struct sk_buff *data = tcp_write_queue_head(sk);
|
||||
u16 mss = tp->rx_opt.mss_clamp;
|
||||
bool syn_drop;
|
||||
|
||||
if (mss == tp->rx_opt.user_mss) {
|
||||
struct tcp_options_received opt;
|
||||
@@ -5664,7 +5665,14 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack,
|
||||
mss = opt.mss_clamp;
|
||||
}
|
||||
|
||||
tcp_fastopen_cache_set(sk, mss, cookie);
|
||||
/* The SYN-ACK neither has cookie nor acknowledges the data. Presumably
|
||||
* the remote receives only the retransmitted (regular) SYNs: either
|
||||
* the original SYN-data or the corresponding SYN-ACK is lost.
|
||||
*/
|
||||
syn_drop = (cookie->len <= 0 && data &&
|
||||
inet_csk(sk)->icsk_retransmits);
|
||||
|
||||
tcp_fastopen_cache_set(sk, mss, cookie, syn_drop);
|
||||
|
||||
if (data) { /* Retransmit unacked data in SYN */
|
||||
tcp_retransmit_skb(sk, data);
|
||||
|
||||
Reference in New Issue
Block a user