diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
| -rw-r--r-- | net/ipv4/tcp_output.c | 17 | 
1 files changed, 10 insertions, 7 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index b7661a68d498..5b6690d05abb 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -2377,7 +2377,6 @@ bool tcp_schedule_loss_probe(struct sock *sk)  {  	struct inet_connection_sock *icsk = inet_csk(sk);  	struct tcp_sock *tp = tcp_sk(sk); -	u32 rtt = usecs_to_jiffies(tp->srtt_us >> 3);  	u32 timeout, rto_delta_us;  	/* Don't do any loss probe on a Fast Open connection before 3WHS @@ -2398,15 +2397,19 @@ bool tcp_schedule_loss_probe(struct sock *sk)  	     tcp_send_head(sk))  		return false; -	/* Probe timeout is at least 1.5*rtt + TCP_DELACK_MAX to account +	/* Probe timeout is 2*rtt. Add minimum RTO to account  	 * for delayed ack when there's one outstanding packet. If no RTT  	 * sample is available then probe after TCP_TIMEOUT_INIT.  	 */ -	timeout = rtt << 1 ? : TCP_TIMEOUT_INIT; -	if (tp->packets_out == 1) -		timeout = max_t(u32, timeout, -				(rtt + (rtt >> 1) + TCP_DELACK_MAX)); -	timeout = max_t(u32, timeout, msecs_to_jiffies(10)); +	if (tp->srtt_us) { +		timeout = usecs_to_jiffies(tp->srtt_us >> 2); +		if (tp->packets_out == 1) +			timeout += TCP_RTO_MIN; +		else +			timeout += TCP_TIMEOUT_MIN; +	} else { +		timeout = TCP_TIMEOUT_INIT; +	}  	/* If the RTO formula yields an earlier time, then use that time. */  	rto_delta_us = tcp_rto_delta_us(sk);  /* How far in future is RTO? */  | 
