diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
| -rw-r--r-- | net/ipv4/tcp_output.c | 32 | 
1 files changed, 12 insertions, 20 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 4e985dea1dd2..b7661a68d498 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -2202,9 +2202,10 @@ static bool tcp_small_queue_check(struct sock *sk, const struct sk_buff *skb,  static void tcp_chrono_set(struct tcp_sock *tp, const enum tcp_chrono new)  {  	const u32 now = tcp_jiffies32; +	enum tcp_chrono old = tp->chrono_type; -	if (tp->chrono_type > TCP_CHRONO_UNSPEC) -		tp->chrono_stat[tp->chrono_type - 1] += now - tp->chrono_start; +	if (old > TCP_CHRONO_UNSPEC) +		tp->chrono_stat[old - 1] += now - tp->chrono_start;  	tp->chrono_start = now;  	tp->chrono_type = new;  } @@ -2376,24 +2377,15 @@ bool tcp_schedule_loss_probe(struct sock *sk)  {  	struct inet_connection_sock *icsk = inet_csk(sk);  	struct tcp_sock *tp = tcp_sk(sk); -	u32 timeout, tlp_time_stamp, rto_time_stamp;  	u32 rtt = usecs_to_jiffies(tp->srtt_us >> 3); +	u32 timeout, rto_delta_us; -	/* No consecutive loss probes. */ -	if (WARN_ON(icsk->icsk_pending == ICSK_TIME_LOSS_PROBE)) { -		tcp_rearm_rto(sk); -		return false; -	}  	/* Don't do any loss probe on a Fast Open connection before 3WHS  	 * finishes.  	 */  	if (tp->fastopen_rsk)  		return false; -	/* TLP is only scheduled when next timer event is RTO. */ -	if (icsk->icsk_pending != ICSK_TIME_RETRANS) -		return false; -  	/* Schedule a loss probe in 2*RTT for SACK capable connections  	 * in Open state, that are either limited by cwnd or application.  	 */ @@ -2416,14 +2408,10 @@ bool tcp_schedule_loss_probe(struct sock *sk)  				(rtt + (rtt >> 1) + TCP_DELACK_MAX));  	timeout = max_t(u32, timeout, msecs_to_jiffies(10)); -	/* If RTO is shorter, just schedule TLP in its place. */ -	tlp_time_stamp = tcp_jiffies32 + timeout; -	rto_time_stamp = (u32)inet_csk(sk)->icsk_timeout; -	if ((s32)(tlp_time_stamp - rto_time_stamp) > 0) { -		s32 delta = rto_time_stamp - tcp_jiffies32; -		if (delta > 0) -			timeout = delta; -	} +	/* 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? */ +	if (rto_delta_us > 0) +		timeout = min_t(u32, timeout, usecs_to_jiffies(rto_delta_us));  	inet_csk_reset_xmit_timer(sk, ICSK_TIME_LOSS_PROBE, timeout,  				  TCP_RTO_MAX); @@ -3448,6 +3436,10 @@ int tcp_connect(struct sock *sk)  	int err;  	tcp_call_bpf(sk, BPF_SOCK_OPS_TCP_CONNECT_CB); + +	if (inet_csk(sk)->icsk_af_ops->rebuild_header(sk)) +		return -EHOSTUNREACH; /* Routing failure or similar. */ +  	tcp_connect_init(sk);  	if (unlikely(tp->repair)) {  |