Thread (26 messages) 26 messages, 2 authors, 2025-09-25

RE: [PATCH v2 net-next 13/14] tcp: accecn: stop sending AccECN opt when loss ACK w/ option

From: Chia-Yu Chang (Nokia) <hidden>
Date: 2025-09-25 14:46:21
Also in: bpf, linux-doc, linux-kselftest

-----Original Message-----
From: Paolo Abeni <pabeni@redhat.com> 
Sent: Tuesday, September 23, 2025 12:52 PM
To: Chia-Yu Chang (Nokia) <redacted>; edumazet@google.com; linux-doc@vger.kernel.org; corbet@lwn.net; horms@kernel.org; dsahern@kernel.org; kuniyu@amazon.com; bpf@vger.kernel.org; netdev@vger.kernel.org; dave.taht@gmail.com; jhs@mojatatu.com; kuba@kernel.org; stephen@networkplumber.org; xiyou.wangcong@gmail.com; jiri@resnulli.us; davem@davemloft.net; andrew+netdev@lunn.ch; donald.hunter@gmail.com; ast@fiberby.net; liuhangbin@gmail.com; shuah@kernel.org; linux-kselftest@vger.kernel.org; ij@kernel.org; ncardwell@google.com; Koen De Schepper (Nokia) <redacted>; g.white@cablelabs.com; ingemar.s.johansson@ericsson.com; mirja.kuehlewind@ericsson.com; cheshire@apple.com; rs.ietf@gmx.at; Jason_Livingood@comcast.com; vidhi_goel@apple.com
Subject: Re: [PATCH v2 net-next 13/14] tcp: accecn: stop sending AccECN opt when loss ACK w/ option


CAUTION: This is an external email. Please be very careful when clicking links or opening attachments. See the URL nok.it/ext for additional information.



On 9/18/25 6:21 PM, chia-yu.chang@nokia-bell-labs.com wrote:
quoted
From: Chia-Yu Chang <redacted>

Detect spurious retransmission of a previously sent ACK carrying the 
AccECN option after the second retransmission. Since this might be 
caused by the middlebox dropping ACK with options it does not 
recognize, disable the sending of the AccECN option in all subsequent 
ACKs. This patch follows Section 3.2.3.2.2 of AccECN spec (RFC9768).
Is this really useful/triggers in practice?

AFAICS it will take effect only it the retransmission happens just after an egress AccECN packet, i.e. will not trigger if the there are more later non AccECN packets pending.
Hi Paolo,

This is a simplied implementation than what is mentieond in the RFC9768: 
"Such a host detect loss of ACKs carrying the AccECN Option by detecting whether the acknowledged data alwaysreappears as a retransmission. In such cases, the host disable the sending of the AccECN Option for this half-connection."


However, to implement the case that not that just after egressing the ACK with AccECN, I was thinking to modify struct tcp_sack_block but that maybe an over engineering.

And IMO this could be useful with proper configuration on syscel tcp_accecn_option and tcp_ecn_option_beacon to see whether the middlebox is dropping all ACKs with AccECN option.
An example packetdrill is at:
https://github.com/minuscat/packetdrill_accecn/blob/main/gtests/net/tcp/accecn/fallback/client_accecn_options_drop.pkt

What do you think? And maybe @mirja.kuehlewind@ericsson.com could help to comment from RFC perspective.

Chia-Yu
quoted
Signed-off-by: Chia-Yu Chang <redacted>
---
 include/linux/tcp.h   | 3 ++-
 include/net/tcp_ecn.h | 1 +
 net/ipv4/tcp_input.c  | 9 +++++++++
 net/ipv4/tcp_output.c | 3 +++
 4 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 
53a4a0da35cc..f3b72fb6fa76 100644
--- a/include/linux/tcp.h
+++ b/include/linux/tcp.h
@@ -295,7 +295,8 @@ struct tcp_sock {
      u8      nonagle     : 4,/* Disable Nagle algorithm?             */
              rate_app_limited:1;  /* rate_{delivered,interval_us} limited? */
      u8      received_ce_pending:4, /* Not yet transmit cnt of received_ce */
-             unused2:4;
+             accecn_opt_sent:1,/* Sent AccECN option in previous ACK */
+             unused2:3;
      u8      accecn_minlen:2,/* Minimum length of AccECN option sent */
              est_ecnfield:2,/* ECN field for AccECN delivered estimates */
              accecn_opt_demand:2,/* Demand AccECN option for n next 
ACKs */ diff --git a/include/net/tcp_ecn.h b/include/net/tcp_ecn.h 
index 8317c3f279c9..3eb450b4b648 100644
--- a/include/net/tcp_ecn.h
+++ b/include/net/tcp_ecn.h
@@ -401,6 +401,7 @@ static inline void tcp_accecn_init_counters(struct tcp_sock *tp)
      tp->received_ce_pending = 0;
      __tcp_accecn_init_bytes_counters(tp->received_ecn_bytes);
      __tcp_accecn_init_bytes_counters(tp->delivered_ecn_bytes);
+     tp->accecn_opt_sent = 0;
      tp->accecn_minlen = 0;
      tp->accecn_opt_demand = 0;
      tp->est_ecnfield = 0;
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 
f250b4912a0b..6083260133e9 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -4804,6 +4804,7 @@ static void tcp_dsack_extend(struct sock *sk, 
u32 seq, u32 end_seq)

 static void tcp_rcv_spurious_retrans(struct sock *sk, const struct 
sk_buff *skb)  {
+     struct tcp_sock *tp = tcp_sk(sk);
Minor nit: please leave an empty line after variable declaration.

/P
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help