2024-12-10 00:17:37 +03:00
|
|
|
From 31adbbdcafaeac73d39cae76c6d513fea28779f1 Mon Sep 17 00:00:00 2001
|
2024-10-29 05:12:06 +03:00
|
|
|
From: Neal Cardwell <ncardwell@google.com>
|
|
|
|
Date: Mon, 21 Sep 2020 14:46:26 -0400
|
|
|
|
Subject: [PATCH 14/19] net-tcp_bbr: v2: introduce is_acking_tlp_retrans_seq
|
|
|
|
into rate_sample
|
|
|
|
|
|
|
|
Introduce is_acking_tlp_retrans_seq into rate_sample. This bool will
|
|
|
|
export to the CC module the knowledge of whether the current ACK
|
|
|
|
matched a TLP retransmit.
|
|
|
|
|
|
|
|
Note that when this bool is true, we cannot yet tell (in general) whether
|
|
|
|
this ACK is for the original or the TLP retransmit.
|
|
|
|
|
|
|
|
Effort: net-tcp_bbr
|
|
|
|
Change-Id: I2e6494332167e75efcbdc99bd5c119034e9c39b4
|
|
|
|
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
|
|
|
|
---
|
|
|
|
include/net/tcp.h | 1 +
|
|
|
|
net/ipv4/tcp_input.c | 12 +++++++++---
|
|
|
|
2 files changed, 10 insertions(+), 3 deletions(-)
|
|
|
|
|
|
|
|
--- a/include/net/tcp.h
|
|
|
|
+++ b/include/net/tcp.h
|
2024-12-10 00:17:37 +03:00
|
|
|
@@ -1162,6 +1162,7 @@ struct rate_sample {
|
2024-10-29 05:12:06 +03:00
|
|
|
u32 last_end_seq; /* end_seq of most recently ACKed packet */
|
|
|
|
bool is_app_limited; /* is sample from packet with bubble in pipe? */
|
|
|
|
bool is_retrans; /* is sample from retransmission? */
|
|
|
|
+ bool is_acking_tlp_retrans_seq; /* ACKed a TLP retransmit sequence? */
|
|
|
|
bool is_ack_delayed; /* is this (likely) a delayed ACK? */
|
|
|
|
bool is_ece; /* did this ACK have ECN marked? */
|
|
|
|
};
|
|
|
|
--- a/net/ipv4/tcp_input.c
|
|
|
|
+++ b/net/ipv4/tcp_input.c
|
|
|
|
@@ -3842,7 +3842,8 @@ static void tcp_replace_ts_recent(struct
|
|
|
|
/* This routine deals with acks during a TLP episode and ends an episode by
|
|
|
|
* resetting tlp_high_seq. Ref: TLP algorithm in draft-ietf-tcpm-rack
|
|
|
|
*/
|
|
|
|
-static void tcp_process_tlp_ack(struct sock *sk, u32 ack, int flag)
|
|
|
|
+static void tcp_process_tlp_ack(struct sock *sk, u32 ack, int flag,
|
|
|
|
+ struct rate_sample *rs)
|
|
|
|
{
|
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
|
|
|
|
|
@@ -3870,6 +3871,11 @@ static void tcp_process_tlp_ack(struct s
|
|
|
|
FLAG_NOT_DUP | FLAG_DATA_SACKED))) {
|
|
|
|
/* Pure dupack: original and TLP probe arrived; no loss */
|
|
|
|
tp->tlp_high_seq = 0;
|
|
|
|
+ } else {
|
|
|
|
+ /* This ACK matches a TLP retransmit. We cannot yet tell if
|
|
|
|
+ * this ACK is for the original or the TLP retransmit.
|
|
|
|
+ */
|
|
|
|
+ rs->is_acking_tlp_retrans_seq = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -4053,7 +4059,7 @@ static int tcp_ack(struct sock *sk, cons
|
|
|
|
tcp_rack_update_reo_wnd(sk, &rs);
|
|
|
|
|
|
|
|
if (tp->tlp_high_seq)
|
|
|
|
- tcp_process_tlp_ack(sk, ack, flag);
|
|
|
|
+ tcp_process_tlp_ack(sk, ack, flag, &rs);
|
|
|
|
|
|
|
|
if (tcp_ack_is_dubious(sk, flag)) {
|
|
|
|
if (!(flag & (FLAG_SND_UNA_ADVANCED |
|
|
|
|
@@ -4097,7 +4103,7 @@ no_queue:
|
|
|
|
tcp_ack_probe(sk);
|
|
|
|
|
|
|
|
if (tp->tlp_high_seq)
|
|
|
|
- tcp_process_tlp_ack(sk, ack, flag);
|
|
|
|
+ tcp_process_tlp_ack(sk, ack, flag, &rs);
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
old_ack:
|