]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mptcp: cleanup fallback data fin reception
authorPaolo Abeni <pabeni@redhat.com>
Fri, 21 Nov 2025 17:02:04 +0000 (18:02 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 25 Nov 2025 03:49:41 +0000 (19:49 -0800)
MPTCP currently generate a dummy data_fin for fallback socket
when the fallback subflow has completed data reception using
the current ack_seq.

We are going to introduce backlog usage for the msk soon, even
for fallback sockets: the ack_seq value will not match the most recent
sequence number seen by the fallback subflow socket, as it will ignore
data_seq sitting in the backlog.

Instead use the last map sequence number to set the data_fin,
as fallback (dummy) map sequences are always in sequence.

Reviewed-by: Geliang Tang <geliang@kernel.org>
Tested-by: Geliang Tang <geliang@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20251121-net-next-mptcp-memcg-backlog-imp-v1-5-1f34b6c1e0b1@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/subflow.c

index 72b7efe388db9bbac75b4527becc59e8bdd671a5..1f7311afd48d4100e47a23880ed2bf54c1366be8 100644 (file)
@@ -1285,6 +1285,7 @@ static bool subflow_is_done(const struct sock *sk)
 /* sched mptcp worker for subflow cleanup if no more data is pending */
 static void subflow_sched_work_if_closed(struct mptcp_sock *msk, struct sock *ssk)
 {
+       const struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk);
        struct sock *sk = (struct sock *)msk;
 
        if (likely(ssk->sk_state != TCP_CLOSE &&
@@ -1303,7 +1304,8 @@ static void subflow_sched_work_if_closed(struct mptcp_sock *msk, struct sock *ss
         */
        if (__mptcp_check_fallback(msk) && subflow_is_done(ssk) &&
            msk->first == ssk &&
-           mptcp_update_rcv_data_fin(msk, READ_ONCE(msk->ack_seq), true))
+           mptcp_update_rcv_data_fin(msk, subflow->map_seq +
+                                     subflow->map_data_len, true))
                mptcp_schedule_work(sk);
 }