BPF List
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
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
Date: Thu, 10 Sep 2026 14:44:55 +0000	[thread overview]
Message-ID: <20260910144455.CA7751F00893@smtp.kernel.org> (raw)
In-Reply-To: <20260909144557.800676-1-irlanki.s@samsung.com>

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?

[ ... ]
> 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?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260909144557.800676-1-irlanki.s@samsung.com?part=1

  parent reply	other threads:[~2026-09-10 14:44 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 [this message]
2026-09-11 10:25     ` SandeepI

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=20260910144455.CA7751F00893@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=irlanki.s@samsung.com \
    --cc=sashiko-reviews@lists.linux.dev \
    /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