tcp: fix tcp_disordered_ack() vs usec TS resolution
After commit 939463016b7a ("tcp: change data receiver flowlabel after one dup") we noticed an increase of TCPACKSkippedPAWS events. Neal Cardwell tracked the issue to tcp_disordered_ack() assumption about remote peer TS clock. RFC 1323 & 7323 are suggesting the following: "timestamp clock frequency in the range 1 ms to 1 sec per tick between 1ms and 1sec." This has to be adjusted for 1 MHz clock frequency. This hints at reorders of SACK packets on send side, this might deserve a future patch. (skb->ooo_okay is always set for pure ACK packets) Fixes: 614e8316aa4c ("tcp: add support for usec resolution in TCP TS values") Co-developed-by: Neal Cardwell <ncardwell@google.com> Signed-off-by: Neal Cardwell <ncardwell@google.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: David Morley <morleyd@google.com> Link: https://lore.kernel.org/r/20231207181342.525181-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
a45f1e4627
commit
9c25aae013
@ -4368,6 +4368,23 @@ EXPORT_SYMBOL(tcp_do_parse_auth_options);
|
||||
* up to bandwidth of 18Gigabit/sec. 8) ]
|
||||
*/
|
||||
|
||||
/* Estimates max number of increments of remote peer TSval in
|
||||
* a replay window (based on our current RTO estimation).
|
||||
*/
|
||||
static u32 tcp_tsval_replay(const struct sock *sk)
|
||||
{
|
||||
/* If we use usec TS resolution,
|
||||
* then expect the remote peer to use the same resolution.
|
||||
*/
|
||||
if (tcp_sk(sk)->tcp_usec_ts)
|
||||
return inet_csk(sk)->icsk_rto * (USEC_PER_SEC / HZ);
|
||||
|
||||
/* RFC 7323 recommends a TSval clock between 1ms and 1sec.
|
||||
* We know that some OS (including old linux) can use 1200 Hz.
|
||||
*/
|
||||
return inet_csk(sk)->icsk_rto * 1200 / HZ;
|
||||
}
|
||||
|
||||
static int tcp_disordered_ack(const struct sock *sk, const struct sk_buff *skb)
|
||||
{
|
||||
const struct tcp_sock *tp = tcp_sk(sk);
|
||||
@ -4375,7 +4392,7 @@ static int tcp_disordered_ack(const struct sock *sk, const struct sk_buff *skb)
|
||||
u32 seq = TCP_SKB_CB(skb)->seq;
|
||||
u32 ack = TCP_SKB_CB(skb)->ack_seq;
|
||||
|
||||
return (/* 1. Pure ACK with correct sequence number. */
|
||||
return /* 1. Pure ACK with correct sequence number. */
|
||||
(th->ack && seq == TCP_SKB_CB(skb)->end_seq && seq == tp->rcv_nxt) &&
|
||||
|
||||
/* 2. ... and duplicate ACK. */
|
||||
@ -4385,7 +4402,8 @@ static int tcp_disordered_ack(const struct sock *sk, const struct sk_buff *skb)
|
||||
!tcp_may_update_window(tp, ack, seq, ntohs(th->window) << tp->rx_opt.snd_wscale) &&
|
||||
|
||||
/* 4. ... and sits in replay window. */
|
||||
(s32)(tp->rx_opt.ts_recent - tp->rx_opt.rcv_tsval) <= (inet_csk(sk)->icsk_rto * 1024) / HZ);
|
||||
(s32)(tp->rx_opt.ts_recent - tp->rx_opt.rcv_tsval) <=
|
||||
tcp_tsval_replay(sk);
|
||||
}
|
||||
|
||||
static inline bool tcp_paws_discard(const struct sock *sk,
|
||||
|
Loading…
x
Reference in New Issue
Block a user