Netdev Archive on
help / color / mirror / Atom feed
From: Neal Cardwell <>
To: David Miller <>
Cc:, Eric Dumazet <>,
	Neal Cardwell <>,
	Yuchung Cheng <>,
	Priyaranjan Jha <>
Subject: [PATCH net-next 2/2] tcp: more accurately check DSACKs to grow RACK reordering window
Date: Tue, 27 Jul 2021 10:42:58 -0400	[thread overview]
Message-ID: <> (raw)
In-Reply-To: <>

Previously, a DSACK could expand the RACK reordering window when no
reordering has been seen, and/or when the DSACK was due to an
unnecessary TLP retransmit (rather than a spurious fast recovery due
to reordering). This could result in unnecessarily growing the RACK
reordering window and thus unnecessarily delaying RACK-based fast
recovery episodes.

To avoid these issues, this commit tightens the conditions under which
a DSACK triggers the RACK reordering window to grow, so that a
connection only expands its RACK reordering window if:

(a) reordering has been seen in the connection
(b) a DSACKed range does not match the most recent TLP retransmit

Signed-off-by: Neal Cardwell <>
Acked-by: Yuchung Cheng <>
Acked-by: Priyaranjan Jha <>
 net/ipv4/tcp_input.c    | 9 ++++++++-
 net/ipv4/tcp_recovery.c | 3 ++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 98408d520c32..3f7bd7ae7d7a 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -1001,7 +1001,14 @@ static u32 tcp_dsack_seen(struct tcp_sock *tp, u32 start_seq,
 		return 0;
 	tp->rx_opt.sack_ok |= TCP_DSACK_SEEN;
-	tp->rack.dsack_seen = 1;
+	/* We increase the RACK ordering window in rounds where we receive
+	 * DSACKs that may have been due to reordering causing RACK to trigger
+	 * a spurious fast recovery. Thus RACK ignores DSACKs that happen
+	 * without having seen reordering, or that match TLP probes (TLP
+	 * is timer-driven, not triggered by RACK).
+	 */
+	if (tp->reord_seen && !(state->flag & FLAG_DSACK_TLP))
+		tp->rack.dsack_seen = 1;
 	state->flag |= FLAG_DSACKING_ACK;
 	/* A spurious retransmission is delivered */
diff --git a/net/ipv4/tcp_recovery.c b/net/ipv4/tcp_recovery.c
index 6f1b4ac7fe99..fd113f6226ef 100644
--- a/net/ipv4/tcp_recovery.c
+++ b/net/ipv4/tcp_recovery.c
@@ -172,7 +172,8 @@ void tcp_rack_reo_timeout(struct sock *sk)
 /* Updates the RACK's reo_wnd based on DSACK and no. of recoveries.
- * If DSACK is received, increment reo_wnd by min_rtt/4 (upper bounded
+ * If a DSACK is received that seems like it may have been due to reordering
+ * triggering fast recovery, increment reo_wnd by min_rtt/4 (upper bounded
  * by srtt), since there is possibility that spurious retransmission was
  * due to reordering delay longer than reo_wnd.

  parent reply	other threads:[~2021-07-27 14:43 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-27 14:42 [PATCH net-next 0/2] more accurate DSACK processing for RACK-TLP Neal Cardwell
2021-07-27 14:42 ` [PATCH net-next 1/2] tcp: more accurately detect spurious TLP probes Neal Cardwell
2021-07-27 14:42 ` Neal Cardwell [this message]
2021-07-27 19:20 ` [PATCH net-next 0/2] more accurate DSACK processing for RACK-TLP patchwork-bot+netdevbpf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \ \ \ \ \ \ \ \
    --subject='Re: [PATCH net-next 2/2] tcp: more accurately check DSACKs to grow RACK reordering window' \

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).