.. | .. |
---|
433 | 433 | TCP_TIMEOUT_INIT << req->num_timeout, TCP_RTO_MAX); |
---|
434 | 434 | } |
---|
435 | 435 | |
---|
| 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 | +} |
---|
436 | 452 | |
---|
437 | 453 | /** |
---|
438 | 454 | * tcp_retransmit_timer() - The TCP retransmit timeout handler |
---|
.. | .. |
---|
498 | 514 | tp->snd_una, tp->snd_nxt); |
---|
499 | 515 | } |
---|
500 | 516 | #endif |
---|
501 | | - if (tcp_jiffies32 - tp->rcv_tstamp > TCP_RTO_MAX) { |
---|
| 517 | + if (tcp_rtx_probe0_timed_out(sk, skb)) { |
---|
502 | 518 | tcp_write_err(sk); |
---|
503 | 519 | goto out; |
---|
504 | 520 | } |
---|
.. | .. |
---|
578 | 594 | tcp_stream_is_thin(tp) && |
---|
579 | 595 | icsk->icsk_retransmits <= TCP_THIN_LINEAR_RETRIES) { |
---|
580 | 596 | 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); |
---|
582 | 600 | } else { |
---|
583 | 601 | /* Use normal (exponential) backoff */ |
---|
584 | 602 | icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX); |
---|