From: "SandeepI" <irlanki.s@samsung.com>
To: <sashiko-reviews@lists.linux.dev>
Cc: <bpf@vger.kernel.org>, <netdev@vger.kernel.org>,
<lorenzo@google.com>, <maze@google.com>, <sporeba@google.com>,
<motomuman@google.com>, <srihari.k@samsung.com>,
<g.pokhra@samsung.com>, <r.kumawat@samsung.com>,
<irlanki.s@samsung.com>, <raj.kumars@samsung.com>,
"'Taeseok Lee'" <ts413.lee@samsung.com>
Subject: RE: [PATCH net-next] tcp: add TCP_ECN and TCP_ECN_OPTION socket options
Date: Fri, 11 Sep 2026 15:55:27 +0530 [thread overview]
Message-ID: <045c01dd41d7$df167d30$9d437790$@samsung.com> (raw)
In-Reply-To: <20260910144455.CA7751F00893@smtp.kernel.org>
> -----Original Message-----
> From: sashiko-bot@kernel.org <sashiko-bot@kernel.org>
> Sent: 10 September 2026 20:15
> To: Irlanki Sandeep <irlanki.s@samsung.com>
> Cc: bpf@vger.kernel.org
> Subject: Re: [PATCH net-next] tcp: add TCP_ECN and TCP_ECN_OPTION socket
> options
>
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to
> consider:
> - [High] Per-socket TCP_ECN configuration is ignored during SYN floods because
> syncookies validation checks the global sysctl instead of the listener socket's
> effective ECN mode.
> - [Medium] Missing READ_ONCE() when reading `ecn_mode` and `ecn_option`
> introduces a data race and double-fetch vulnerability, leaking the UNSPEC
> placeholder (255) into TCP operational logic.
> --
>
> commit d87f9153f9de86df8e7de5798f8dffdac8f0e2fd
> Author: Irlanki Sandeep <irlanki.s@samsung.com>
> Subject: tcp: add TCP_ECN and TCP_ECN_OPTION socket options
>
> This patch introduces granular, per-connection dynamic adaptation for ECN and
> AccECN configurations. It adds two new socket options, TCP_ECN and
> TCP_ECN_OPTION, which override the system-wide sysctl settings to prevent
> connection failures or packet loss on paths with anomalous middleboxes.
>
> > diff --git a/include/net/tcp_ecn.h b/include/net/tcp_ecn.h index
> > 865d5c5a7718d..931e0877176c7 100644
> > --- a/include/net/tcp_ecn.h
> > +++ b/include/net/tcp_ecn.h
> [ ... ]
> > @@ -30,8 +31,29 @@ enum tcp_accecn_option {
> > TCP_ACCECN_OPTION_MINIMUM = 1,
> > TCP_ACCECN_OPTION_FULL = 2,
> > TCP_ACCECN_OPTION_PERSIST = 3,
> > + TCP_ACCECN_OPTION_UNSPEC = 255, /* Use sysctl default (per-
> socket) */
> > };
> >
> > +/* Resolve the effective ECN mode: per-socket override or sysctl
> > +fallback */ static inline u8 tcp_ecn_mode_eff(const struct sock *sk)
> > +{
> > + u8 mode = tcp_sk(sk)->ecn_mode;
> > +
> > + if (mode == TCP_ECN_MODE_UNSPEC)
> > + return READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_ecn);
> > + return mode;
> > +}
>
> [Severity: Medium]
> Is it possible for the compiler to double-fetch tcp_sk(sk)->ecn_mode here?
>
> Since the ecn_mode field is updated concurrently via WRITE_ONCE() (for
> example, during a setsockopt call while handling an incoming SYN packet in
> softirq context), a lack of READ_ONCE() on the reader side could result in the
> UNSPEC placeholder (255) leaking into the return evaluation.
>
> If that placeholder leaks, could it cause AccECN to be incorrectly enabled later in
> tcp_ecn_create_request(), where 255 >= 3 would evaluate to true?
>
> > +
> > +/* Resolve the effective AccECN option: per-socket override or sysctl
> > +fallback */ static inline u8 tcp_accecn_option_eff(const struct sock
> > +*sk) {
> > + u8 opt = tcp_sk(sk)->ecn_option;
> > +
> > + if (opt == TCP_ACCECN_OPTION_UNSPEC)
> > + return READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_ecn_option);
> > + return opt;
> > +}
>
> [Severity: Medium]
> Does tcp_sk(sk)->ecn_option also require a READ_ONCE() here to prevent a
> similar data race and double-fetch?
Yes, tcp_sk(sk)->ecn_mode and tcp_sk(sk)->ecn_option are updated
concurrently via WRITE_ONCE() in do_tcp_setsockopt(). Without READ_ONCE(),
a compiler double-fetch could leak the TCP_ECN_MODE_UNSPEC (255) sentinel
value into operational evaluations.
Both accessors (tcp_ecn_mode_eff and tcp_accecn_option_eff) have been updated
in V3 with READ_ONCE() to eliminate data races and prevent double-fetching.
> [ ... ]
> > diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index
> > 0f60a1dbf9274..b7dea787f8237 100644
> > --- a/net/ipv4/tcp_input.c
> > +++ b/net/ipv4/tcp_input.c
> > @@ -7463,7 +7463,7 @@ static void tcp_ecn_create_request(struct
> request_sock *req,
> > u32 ecn_ok_dst;
> >
> > if (tcp_accecn_syn_requested(th) &&
> > - (READ_ONCE(net->ipv4.sysctl_tcp_ecn) >= 3 ||
> > + (tcp_ecn_mode_eff(listen_sk) >= 3 ||
> > tcp_ca_needs_accecn(listen_sk))) {
> > inet_rsk(req)->ecn_ok = 1;
> > tcp_rsk(req)->accecn_ok = 1;
>
> [Severity: High]
> Does the SYN cookies path also need to be updated to respect this new per-
> socket configuration?
>
> During a SYN flood, this standard tcp_ecn_create_request() path is bypassed in
> favor of syncookies. Currently, cookie_v4_check() and cookie_v6_check()
> determine ECN support by calling cookie_ecn_ok(), which only checks the global
> sysctl:
>
> static inline bool cookie_ecn_ok(const struct net *net, const struct dst_entry
> *dst) {
> return READ_ONCE(net->ipv4.sysctl_tcp_ecn) ||
> dst_feature(dst, RTAX_FEATURE_ECN); }
>
> If the system has the global sysctl_tcp_ecn disabled but a service has enabled it
> locally via TCP_ECN on its listener socket, will established connections silently
> lose their ECN capability during a SYN flood?
Agreed. Under SYN flood conditions, cookie_v4_check() and cookie_v6_check()
must honor the listener socket's effective ECN configuration rather than
falling back exclusively to the global sysctl.
Moved cookie_ecn_ok() from include/net/tcp.h to include/net/tcp_ecn.h
to avoid circular header dependencies (since tcp_ecn_mode_eff() is defined
in tcp_ecn.h and tcp.h does not include tcp_ecn.h), and updated it to take
'const struct sock *sk' so it evaluates tcp_ecn_mode_eff(sk).
Both issues have been addressed in the [PATCH net-next v3] tcp: add TCP_ECN and TCP_ECN_OPTION socket options
Thanks,
Sandeep.
prev parent reply other threads:[~2026-09-11 10:25 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20260909144437epcas5p282be513a761ca5aec3f2b0fefcd2ecfa@epcas5p2.samsung.com>
2026-09-09 14:45 ` [PATCH net-next] tcp: add TCP_ECN and TCP_ECN_OPTION socket options Irlanki Sandeep
2026-09-10 1:38 ` kernel test robot
2026-09-10 14:44 ` sashiko-bot
2026-09-11 10:25 ` SandeepI [this message]
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:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='045c01dd41d7$df167d30$9d437790$@samsung.com' \
--to=irlanki.s@samsung.com \
--cc=bpf@vger.kernel.org \
--cc=g.pokhra@samsung.com \
--cc=lorenzo@google.com \
--cc=maze@google.com \
--cc=motomuman@google.com \
--cc=netdev@vger.kernel.org \
--cc=r.kumawat@samsung.com \
--cc=raj.kumars@samsung.com \
--cc=sashiko-reviews@lists.linux.dev \
--cc=sporeba@google.com \
--cc=srihari.k@samsung.com \
--cc=ts413.lee@samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox