diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
| -rw-r--r-- | net/ipv4/tcp_output.c | 21 | 
1 files changed, 13 insertions, 8 deletions
| diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index a50e1990a845..0bc05d68cd74 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -700,7 +700,8 @@ static unsigned int tcp_synack_options(const struct sock *sk,  				       unsigned int mss, struct sk_buff *skb,  				       struct tcp_out_options *opts,  				       const struct tcp_md5sig_key *md5, -				       struct tcp_fastopen_cookie *foc) +				       struct tcp_fastopen_cookie *foc, +				       enum tcp_synack_type synack_type)  {  	struct inet_request_sock *ireq = inet_rsk(req);  	unsigned int remaining = MAX_TCP_OPTION_SPACE; @@ -715,7 +716,8 @@ static unsigned int tcp_synack_options(const struct sock *sk,  		 * rather than TS in order to fit in better with old,  		 * buggy kernels, but that was deemed to be unnecessary.  		 */ -		ireq->tstamp_ok &= !ireq->sack_ok; +		if (synack_type != TCP_SYNACK_COOKIE) +			ireq->tstamp_ok &= !ireq->sack_ok;  	}  #endif @@ -2622,6 +2624,11 @@ void tcp_send_loss_probe(struct sock *sk)  	int pcount;  	int mss = tcp_current_mss(sk); +	/* At most one outstanding TLP */ +	if (tp->tlp_high_seq) +		goto rearm_timer; + +	tp->tlp_retrans = 0;  	skb = tcp_send_head(sk);  	if (skb && tcp_snd_wnd_test(tp, skb, mss)) {  		pcount = tp->packets_out; @@ -2639,10 +2646,6 @@ void tcp_send_loss_probe(struct sock *sk)  		return;  	} -	/* At most one outstanding TLP retransmission. */ -	if (tp->tlp_high_seq) -		goto rearm_timer; -  	if (skb_still_in_host_queue(sk, skb))  		goto rearm_timer; @@ -2664,10 +2667,12 @@ void tcp_send_loss_probe(struct sock *sk)  	if (__tcp_retransmit_skb(sk, skb, 1))  		goto rearm_timer; +	tp->tlp_retrans = 1; + +probe_sent:  	/* Record snd_nxt for loss detection. */  	tp->tlp_high_seq = tp->snd_nxt; -probe_sent:  	NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPLOSSPROBES);  	/* Reset s.t. tcp_rearm_rto will restart timer from now */  	inet_csk(sk)->icsk_pending = 0; @@ -3394,7 +3399,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst,  #endif  	skb_set_hash(skb, tcp_rsk(req)->txhash, PKT_HASH_TYPE_L4);  	tcp_header_size = tcp_synack_options(sk, req, mss, skb, &opts, md5, -					     foc) + sizeof(*th); +					     foc, synack_type) + sizeof(*th);  	skb_push(skb, tcp_header_size);  	skb_reset_transport_header(skb); |