]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mptcp: allow subflow rcv wnd to shrink
authorPaolo Abeni <pabeni@redhat.com>
Tue, 2 Jun 2026 12:14:11 +0000 (22:14 +1000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 4 Jun 2026 02:04:26 +0000 (19:04 -0700)
In MPTCP connection, the `window` field in the TCP header refers to the
MPTCP-level rcv_nxt and it's right edge should not move backward. Such
constraint is enforced at DSS option generation time.

At the same time, the TCP stack ensures independently that the TCP-level
rcv wnd right's edge does not move backward. That in turn causes artificial
inflating of the MPTCP rcv window when the incoming data is acked at the
TCP level and is OoO in the MPTCP sequence space (or lands in the backlog).

As a consequence, the incoming traffic can exceed the receiver rcvbuf size
even when the sender is not misbehaving.

Prevent such scenario forcibly allowing the TCP subflow to shrink the
TCP-level rcv wnd regardless of the current netns setting.

Fixes: f3589be0c420 ("mptcp: never shrink offered window")
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20260602-net-mptcp-misc-fixes-7-1-rc7-v2-4-856831229976@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/options.c

index 2d25f319f328e8f4cf1bc1fab8c67c4230013d1e..51ca334678b45c6ae5a1e02999aa4708e954d38e 100644 (file)
@@ -566,6 +566,7 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
 {
        struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
        struct mptcp_sock *msk = mptcp_sk(subflow->conn);
+       struct tcp_sock *tp = tcp_sk(sk);
        unsigned int dss_size = 0;
        struct mptcp_ext *mpext;
        unsigned int ack_size;
@@ -614,6 +615,12 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
        if (dss_size == 0)
                ack_size += TCPOLEN_MPTCP_DSS_BASE;
 
+       /* The caller is __tcp_transmit_skb(), and will compute the new rcv
+        * wnd soon: ensure that the window can shrink.
+        */
+       if (skb)
+               tp->rcv_wnd = tp->rcv_nxt - tp->rcv_wup;
+
        dss_size += ack_size;
 
        *size = ALIGN(dss_size, 4);