diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
| -rw-r--r-- | net/ipv4/tcp_output.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 88693281da4..c5cfd5ec318 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -2860,10 +2860,19 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)  {  	struct tcp_sock *tp = tcp_sk(sk);  	struct tcp_fastopen_request *fo = tp->fastopen_req; -	int space, i, err = 0, iovlen = fo->data->msg_iovlen; +	int syn_loss = 0, space, i, err = 0, iovlen = fo->data->msg_iovlen;  	struct sk_buff *syn_data = NULL, *data; +	unsigned long last_syn_loss = 0; + +	tcp_fastopen_cache_get(sk, &tp->rx_opt.mss_clamp, &fo->cookie, +			       &syn_loss, &last_syn_loss); +	/* Recurring FO SYN losses: revert to regular handshake temporarily */ +	if (syn_loss > 1 && +	    time_before(jiffies, last_syn_loss + (60*HZ << syn_loss))) { +		fo->cookie.len = -1; +		goto fallback; +	} -	tcp_fastopen_cache_get(sk, &tp->rx_opt.mss_clamp, &fo->cookie);  	if (fo->cookie.len <= 0)  		goto fallback;  |