diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
| -rw-r--r-- | net/ipv4/tcp_output.c | 13 | 
1 files changed, 8 insertions, 5 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 5f5b2f0b0e60..0bc05d68cd74 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -2624,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; @@ -2641,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; @@ -2666,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;  | 
