hc
2024-01-05 071106ecf68c401173c58808b1cf5f68cc50d390
kernel/net/ipv4/tcp_timer.c
....@@ -433,6 +433,22 @@
433433 TCP_TIMEOUT_INIT << req->num_timeout, TCP_RTO_MAX);
434434 }
435435
436
+static bool tcp_rtx_probe0_timed_out(const struct sock *sk,
437
+ const struct sk_buff *skb)
438
+{
439
+ const struct tcp_sock *tp = tcp_sk(sk);
440
+ const int timeout = TCP_RTO_MAX * 2;
441
+ u32 rcv_delta, rtx_delta;
442
+
443
+ rcv_delta = inet_csk(sk)->icsk_timeout - tp->rcv_tstamp;
444
+ if (rcv_delta <= timeout)
445
+ return false;
446
+
447
+ rtx_delta = (u32)msecs_to_jiffies(tcp_time_stamp(tp) -
448
+ (tp->retrans_stamp ?: tcp_skb_timestamp(skb)));
449
+
450
+ return rtx_delta > timeout;
451
+}
436452
437453 /**
438454 * tcp_retransmit_timer() - The TCP retransmit timeout handler
....@@ -498,7 +514,7 @@
498514 tp->snd_una, tp->snd_nxt);
499515 }
500516 #endif
501
- if (tcp_jiffies32 - tp->rcv_tstamp > TCP_RTO_MAX) {
517
+ if (tcp_rtx_probe0_timed_out(sk, skb)) {
502518 tcp_write_err(sk);
503519 goto out;
504520 }
....@@ -578,7 +594,9 @@
578594 tcp_stream_is_thin(tp) &&
579595 icsk->icsk_retransmits <= TCP_THIN_LINEAR_RETRIES) {
580596 icsk->icsk_backoff = 0;
581
- icsk->icsk_rto = min(__tcp_set_rto(tp), TCP_RTO_MAX);
597
+ icsk->icsk_rto = clamp(__tcp_set_rto(tp),
598
+ tcp_rto_min(sk),
599
+ TCP_RTO_MAX);
582600 } else {
583601 /* Use normal (exponential) backoff */
584602 icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX);