* [PATCH net] tcp: keep the route window metric when SO_RCVBUF is set before connect
@ 2026-10-11 5:20 Shashank Mohan Jain
2026-10-11 5:24 ` netdev-bot+sinfo
2026-10-12 5:33 ` netdev-bot+sashiko
0 siblings, 2 replies; 6+ messages in thread
From: Shashank Mohan Jain @ 2026-10-11 5:20 UTC (permalink / raw)
To: Eric Dumazet, Neal Cardwell, Jakub Kicinski, Paolo Abeni,
David S. Miller
Cc: Kuniyuki Iwashima, Simon Horman, netdev, linux-kernel
Since commit b025461303d8 ("tcp: update window_clamp when SO_RCVBUF is
set") SO_RCVBUF sets tp->window_clamp from the new buffer size in every
socket state. For a socket without a connection this has a side
effect. tcp_connect_init() and tcp_openreq_init_rwin() use the window
metric of the route (RTAX_WINDOW, "ip route ... window N") only if
window_clamp is zero. The clamp left behind by SO_RCVBUF makes the
metric ineffective for that socket, or for the connections accepted
on a listener.
Example: two network namespaces connected by a veth pair, "window
4096" on the route to the peer on both sides, SO_RCVBUF set to 1 MiB
before connect():
v7.3-rc6: SYN win 65535, wscale 5
TCP_WINDOW_CLAMP 1047128
with that commit reverted: SYN win 2920, no window scaling
TCP_WINDOW_CLAMP 4096
With SO_RCVBUF set on the listener the SYN-ACK and the clamp of the
accepted socket differ in the same way.
The update is not needed in these states. When the connection is set
up with SOCK_RCVBUF_LOCK set, both functions limit a zero or too
large clamp to tcp_full_space(), which is the value tcp_set_rcvbuf()
computes. Skip the update for sockets in TCP_CLOSE and TCP_LISTEN.
Tested in qemu with the setup above. With the route metric, the SYN
and SYN-ACK windows and TCP_WINDOW_CLAMP are the same as with the
commit above reverted. Without the metric they are the same as before
this change, with and without SO_RCVBUF on either side.
Fixes: b025461303d8 ("tcp: update window_clamp when SO_RCVBUF is set")
Assisted-by: LLM
Signed-off-by: Shashank Mohan Jain <jain.sm@gmail.com>
---
Prepared with Claude Code (Anthropic), model Claude Opus 5.5
(claude-opus-5-5).
net/ipv4/tcp.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 87ef6d5cbf..9b6f214411 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1856,6 +1856,14 @@ int tcp_set_rcvlowat(struct sock *sk, int val)
void tcp_set_rcvbuf(struct sock *sk, int val)
{
+ /* Without a connection there is no clamp to update: it is chosen
+ * from the route's window metric and the buffer size when the
+ * connection is set up, see tcp_connect_init() and
+ * tcp_openreq_init_rwin().
+ */
+ if ((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))
+ return;
+
tcp_set_window_clamp(sk, tcp_win_from_space(sk, val));
}
base-commit: a5ebb76233b79db01e82e061173cb73c6d2b5c6b
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net] tcp: keep the route window metric when SO_RCVBUF is set before connect
2026-10-11 5:20 [PATCH net] tcp: keep the route window metric when SO_RCVBUF is set before connect Shashank Mohan Jain
@ 2026-10-11 5:24 ` netdev-bot+sinfo
2026-10-11 5:26 ` shashank Jain
2026-10-12 5:33 ` netdev-bot+sashiko
1 sibling, 1 reply; 6+ messages in thread
From: netdev-bot+sinfo @ 2026-10-11 5:24 UTC (permalink / raw)
To: Shashank Mohan Jain
Cc: Eric Dumazet, Neal Cardwell, Jakub Kicinski, Paolo Abeni,
David S. Miller, Kuniyuki Iwashima, Simon Horman, netdev,
linux-kernel
Hi!
This is an automated message. This series looks like a fix, but its
commit messages seem to be missing some information:
- How the issue was discovered, e.g. hit in production, hit during
development, syzbot report, manual code inspection, LLM or static
analysis tool scan.
Please do not repost the series just to address the above. Instead,
reply to this email with the missing information, so that reviewers
can take it into account. If the series needs another revision for
other reasons, please include the information in the commit messages
then.
The evaluation is done by an LLM so it may be wrong, if you think
that is the case please reply and explain.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net] tcp: keep the route window metric when SO_RCVBUF is set before connect
2026-10-11 5:24 ` netdev-bot+sinfo
@ 2026-10-11 5:26 ` shashank Jain
2026-10-11 8:15 ` Eric Dumazet
0 siblings, 1 reply; 6+ messages in thread
From: shashank Jain @ 2026-10-11 5:26 UTC (permalink / raw)
To: netdev-bot+sinfo
Cc: Eric Dumazet, Neal Cardwell, Jakub Kicinski, Paolo Abeni,
David S. Miller, Kuniyuki Iwashima, Simon Horman, netdev,
linux-kernel
The issue was found by manual code inspection assisted by an LLM
(Claude Code, Claude Opus), while reviewing the networking changes that
set window_clamp on unconnected sockets, and then confirmed with a
reproducer before posting. The patch carries an "Assisted-by: LLM" tag
for that reason.
Reproducer: mainline a5ebb76233b7 built for x86_64 and booted in qemu,
two network namespaces joined by a veth pair, with
"ip route replace 10.0.0.0/24 dev <veth> window 4096" on both sides. A
small program sets SO_RCVBUF before connect()/listen() and reads
TCP_WINDOW_CLAMP and tcp_info, and the SYN/SYN-ACK is captured with
tcpdump.
Without SO_RCVBUF the route's window metric is applied
(TCP_WINDOW_CLAMP=4096, rcv_wscale=0, SYN "win 2920, wscale 0"). With
SO_RCVBUF set before connect, mainline reports TCP_WINDOW_CLAMP ~1 MB
and rcv_wscale=5, i.e. the route metric is ignored. Reverting
b025461303d8 ("tcp: update window_clamp when SO_RCVBUF is set") or
applying this patch restores TCP_WINDOW_CLAMP=4096 and the scaled-down
SYN window; with no route metric configured, mainline, the revert and
the patch behave identically in all four combinations.
Thanks,
Shashank
On Sun, Oct 11, 2026 at 10:54 AM <netdev-bot+sinfo@kernel.org> wrote:
>
> Hi!
>
> This is an automated message. This series looks like a fix, but its
> commit messages seem to be missing some information:
>
> - How the issue was discovered, e.g. hit in production, hit during
> development, syzbot report, manual code inspection, LLM or static
> analysis tool scan.
>
> Please do not repost the series just to address the above. Instead,
> reply to this email with the missing information, so that reviewers
> can take it into account. If the series needs another revision for
> other reasons, please include the information in the commit messages
> then.
>
> The evaluation is done by an LLM so it may be wrong, if you think
> that is the case please reply and explain.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net] tcp: keep the route window metric when SO_RCVBUF is set before connect
2026-10-11 5:26 ` shashank Jain
@ 2026-10-11 8:15 ` Eric Dumazet
2026-10-12 4:58 ` Shashank Mohan Jain
0 siblings, 1 reply; 6+ messages in thread
From: Eric Dumazet @ 2026-10-11 8:15 UTC (permalink / raw)
To: shashank Jain
Cc: netdev-bot+sinfo, Neal Cardwell, Jakub Kicinski, Paolo Abeni,
David S. Miller, Kuniyuki Iwashima, Simon Horman, netdev,
linux-kernel
Le dim. 11 oct. 2026 à 07:26, shashank Jain <jain.sm@gmail.com> a écrit :
>
> The issue was found by manual code inspection assisted by an LLM
> (Claude Code, Claude Opus), while reviewing the networking changes that
> set window_clamp on unconnected sockets, and then confirmed with a
> reproducer before posting. The patch carries an "Assisted-by: LLM" tag
> for that reason.
>
> Reproducer: mainline a5ebb76233b7 built for x86_64 and booted in qemu,
> two network namespaces joined by a veth pair, with
> "ip route replace 10.0.0.0/24 dev <veth> window 4096" on both sides. A
> small program sets SO_RCVBUF before connect()/listen() and reads
> TCP_WINDOW_CLAMP and tcp_info, and the SYN/SYN-ACK is captured with
> tcpdump.
>
> Without SO_RCVBUF the route's window metric is applied
> (TCP_WINDOW_CLAMP=4096, rcv_wscale=0, SYN "win 2920, wscale 0"). With
> SO_RCVBUF set before connect, mainline reports TCP_WINDOW_CLAMP ~1 MB
> and rcv_wscale=5, i.e. the route metric is ignored. Reverting
> b025461303d8 ("tcp: update window_clamp when SO_RCVBUF is set") or
> applying this patch restores TCP_WINDOW_CLAMP=4096 and the scaled-down
> SYN window; with no route metric configured, mainline, the revert and
> the patch behave identically in all four combinations.
>
> Thanks,
> Shashank
Note that we ask to not top post on netdev@ mailing list.
A few remarks on the changelog:
1) "TCP_WINDOW_CLAMP 4096" only holds until the first data segment.
Since a2cbb1603943 ("tcp: Update window clamping condition"),
tcp_measure_rcv_mss() overwrites window_clamp from sk_rcvbuf as soon
as scaling_ratio changes, with or without your patch. What the patch
really restores is the SYN/SYN-ACK window and the window scale.
Please say so.
2) "no window scaling" is not accurate: we still send the option,
with a shift of 0.
3) This also fixes TCP_WINDOW_CLAMP being overwritten by a later
SO_RCVBUF on a not yet connected socket or a listener. This is
probably more common than the route metric and worth mentioning.
A packetdrill test covering the SYN window and wscale would be nice.
It seems to be a net-next candidate, since WINDOW_CLAMP is not well
documented / defined / implemented / tested.
pw-bot: cr
Thanks.
>
> On Sun, Oct 11, 2026 at 10:54 AM <netdev-bot+sinfo@kernel.org> wrote:
> >
> > Hi!
> >
> > This is an automated message. This series looks like a fix, but its
> > commit messages seem to be missing some information:
> >
> > - How the issue was discovered, e.g. hit in production, hit during
> > development, syzbot report, manual code inspection, LLM or static
> > analysis tool scan.
> >
> > Please do not repost the series just to address the above. Instead,
> > reply to this email with the missing information, so that reviewers
> > can take it into account. If the series needs another revision for
> > other reasons, please include the information in the commit messages
> > then.
> >
> > The evaluation is done by an LLM so it may be wrong, if you think
> > that is the case please reply and explain.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net] tcp: keep the route window metric when SO_RCVBUF is set before connect
2026-10-11 8:15 ` Eric Dumazet
@ 2026-10-12 4:58 ` Shashank Mohan Jain
0 siblings, 0 replies; 6+ messages in thread
From: Shashank Mohan Jain @ 2026-10-12 4:58 UTC (permalink / raw)
To: Eric Dumazet, Neal Cardwell, Jakub Kicinski, Paolo Abeni,
David S. Miller
Cc: Kuniyuki Iwashima, Simon Horman, netdev, linux-kernel
On Sun, Oct 11, 2026, Eric Dumazet <edumazet@kernel.org> wrote:
> Note that we ask to not top post on netdev@ mailing list.
Understood, replying inline from here on.
> 1) "TCP_WINDOW_CLAMP 4096" only holds until the first data segment.
> ... What the patch really restores is the SYN/SYN-ACK window and the
> window scale. Please say so.
Agreed, presenting the clamp as persistent was wrong. v2 says the patch
restores the window and window scale advertised in the SYN / SYN-ACK,
and notes that since a2cbb1603943 ("tcp: Update window clamping
condition") tcp_measure_rcv_mss() recomputes window_clamp from sk_rcvbuf
once the scaling ratio changes, independent of this change.
> 2) "no window scaling" is not accurate: we still send the option,
> with a shift of 0.
Right; changed to "wscale 0 (the window scale option is still sent,
with a shift of 0)".
> 3) This also fixes TCP_WINDOW_CLAMP being overwritten by a later
> SO_RCVBUF on a not yet connected socket or a listener. ... worth
> mentioning.
Done - v2 leads with the SO_RCVBUF-before-connect / listener case as the
common one, with the route metric as a second effect.
> A packetdrill test covering the SYN window and wscale would be nice.
I'll add a packetdrill test for the SYN window and wscale, with and
without SO_RCVBUF set before connect, in v2.
> It seems to be a net-next candidate ...
Will repost as [PATCH net-next].
Reposted as v2:
https://lore.kernel.org/all/20261011111606.14753-1-jain.sm@gmail.com/
Thanks for the review.
Shashank
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net] tcp: keep the route window metric when SO_RCVBUF is set before connect
2026-10-11 5:20 [PATCH net] tcp: keep the route window metric when SO_RCVBUF is set before connect Shashank Mohan Jain
2026-10-11 5:24 ` netdev-bot+sinfo
@ 2026-10-12 5:33 ` netdev-bot+sashiko
1 sibling, 0 replies; 6+ messages in thread
From: netdev-bot+sashiko @ 2026-10-12 5:33 UTC (permalink / raw)
To: jain.sm
Cc: edumazet, ncardwell, kuba, pabeni, davem, kuniyu, horms, netdev,
linux-kernel
Thank you for your contribution! Sashiko AI review found 2 potential
issue(s) to consider.
Critical: 0 · High: 1 · Medium: 1 · Low: 0
If you believe none of the issues are legitimate, please reply to each
issue of Medium severity or higher and explain why the AI is wrong.
If any of them are legitimate and you plan to respin, please let patchwork
know by including "pw-bot: cr" as a separate line at the end of your reply
(one such reply per series is enough).
- [High] The new check in tcp_set_rcvbuf() (net/ipv4/tcp.c:1864) uses
sk_state to decide whether the window clamp has been chosen yet.
- [Medium] The connect error path in tcp_v4_connect() and
tcp_v6_connect() puts the socket back in TCP_CLOSE but does not clear…
--
tcp: keep the route window metric when SO_RCVBUF is set before connect
This patch makes tcp_set_rcvbuf() skip the window_clamp update for
sockets in TCP_CLOSE and TCP_LISTEN. tcp_connect_init() and
tcp_openreq_init_rwin() only read the route's RTAX_WINDOW metric when
window_clamp is zero, so skipping the update keeps that metric in effect.
> diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
> index 87ef6d5cbfeba..9b6f2144119d1 100644
> --- a/net/ipv4/tcp.c
> +++ b/net/ipv4/tcp.c
> @@ -1856,6 +1856,14 @@ int tcp_set_rcvlowat(struct sock *sk, int val)
>
> void tcp_set_rcvbuf(struct sock *sk, int val)
> {
> + /* Without a connection there is no clamp to update: it is chosen
> + * from the route's window metric and the buffer size when the
> + * connection is set up, see tcp_connect_init() and
> + * tcp_openreq_init_rwin().
> + */
> + if ((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))
> + return;
[Severity: High]
Is sk_state a reliable way to tell whether tcp_connect_init() has run
yet? A socket can already be in TCP_SYN_SENT before the clamp is chosen.
net/ipv4/tcp_ipv4.c:tcp_v4_connect() {
...
tcp_set_state(sk, TCP_SYN_SENT);
...
if (tcp_fastopen_defer_connect(sk, &err))
return err;
...
err = tcp_connect(sk);
...
}
tcp_v6_connect() follows the same order. If SO_RCVBUF is set in that
window, tcp_set_rcvbuf() still writes a non-zero clamp. tcp_connect_init()
then skips the metric:
if (!tp->window_clamp)
WRITE_ONCE(tp->window_clamp, dst_metric(dst, RTAX_WINDOW));
There seem to be two ways to reach this.
The first is deferred Fast Open. With TCP_FASTOPEN_CONNECT and a cached
cookie, connect() returns to userspace with DEFER_CONNECT set and the
socket in SYN_SENT. A setsockopt(SO_RCVBUF) at that point goes through
sk_setsockopt()->__sock_set_rcvbuf()->tcp_set_rcvbuf() and sets the
clamp. The first write() then runs
tcp_sendmsg_fastopen()->tcp_connect()->tcp_connect_init(), and the
metric is ignored.
The second is BPF sockops. tcp_connect() runs the callback before
tcp_connect_init():
tcp_call_bpf(sk, BPF_SOCK_OPS_TCP_CONNECT_CB, 0, NULL);
...
tcp_connect_init(sk);
sol_socket_sockopt() in net/core/filter.c allows SO_RCVBUF. The in-tree
samples samples/bpf/tcp_bufs_kern.c, tcp_clamp_kern.c and tcp_iw_kern.c
all set SO_RCVBUF from BPF_SOCK_OPS_TCP_CONNECT_CB.
Before b025461303d8 neither path wrote window_clamp, so the "ip route
... window N" metric was honoured. With this patch both paths still
lose it.
Should SYN_SENT before tcp_connect_init() also be covered, so the code
matches what the new comment describes?
[Severity: Medium]
Can the TCP_CLOSE early return keep a stale clamp left by a failed
connect attempt?
tcp_connect() calls tcp_connect_init(), which sets window_clamp. It can
still fail after that:
tcp_connect_init(sk);
...
buff = tcp_stream_alloc_skb(sk, sk->sk_allocation, true);
if (unlikely(!buff))
return -ENOBUFS;
The failure label in tcp_v4_connect() puts the socket back in TCP_CLOSE.
So does late_failure in tcp_v6_connect(). Neither one resets
tp->window_clamp.
__inet_stream_connect() returns the error without calling ->disconnect,
so the reset in tcp_disconnect() never runs. The socket stays
SS_UNCONNECTED, and connect() can be called again.
Suppose SO_RCVBUF is raised between the two attempts. The new check
returns early and keeps the old, smaller clamp. Before this patch the
clamp would have been replaced with tcp_win_from_space() of the new
buffer size.
On the retry, tcp_connect_init() keeps the stale value. Because it is
non-zero, the metric is skipped. Because it is smaller than
tcp_full_space(), the SOCK_RCVBUF_LOCK branch leaves it alone:
if (sk->sk_userlocks & SOCK_RCVBUF_LOCK &&
(tp->window_clamp > tcp_full_space(sk) || tp->window_clamp == 0))
WRITE_ONCE(tp->window_clamp, tcp_full_space(sk));
tcp_select_initial_window() then limits rcv_wnd and rcv_wscale by the
old clamp. That limit stays for the whole connection.
Triggering this requires the SYN skb allocation to fail, for example
under memory pressure or with a restrictive sk_allocation, and then a
retry on the same socket. The behaviour matches what existed before
b025461303d8. Compared with the parent commit, though, this looks like
a regression for the retry case.
> tcp_set_window_clamp(sk, tcp_win_from_space(sk, val));
> }
--
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261011052006.60585-1-jain.sm%40gmail.com
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-10-12 5:33 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-11 5:20 [PATCH net] tcp: keep the route window metric when SO_RCVBUF is set before connect Shashank Mohan Jain
2026-10-11 5:24 ` netdev-bot+sinfo
2026-10-11 5:26 ` shashank Jain
2026-10-11 8:15 ` Eric Dumazet
2026-10-12 4:58 ` Shashank Mohan Jain
2026-10-12 5:33 ` netdev-bot+sashiko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®