]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mptcp: cleanup fallback dummy mapping generation
authorPaolo Abeni <pabeni@redhat.com>
Fri, 21 Nov 2025 17:02:05 +0000 (18:02 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 25 Nov 2025 03:49:41 +0000 (19:49 -0800)
MPTCP currently access ack_seq outside the msk socket log scope to
generate the dummy mapping for fallback socket. Soon we are going
to introduce backlog usage and even for fallback socket the ack_seq
value will be significantly off outside of the msk socket lock scope.

Avoid relying on ack_seq for dummy mapping generation, using instead
the subflow sequence number. Note that in case of disconnect() and
(re)connect() we must ensure that any previous state is re-set.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Geliang Tang <geliang@kernel.org>
Tested-by: Geliang Tang <geliang@kernel.org>
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-6-1f34b6c1e0b1@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/protocol.c
net/mptcp/subflow.c

index 67732d3c502c08950f505bf5cb79f036f6b9f4b7..df4be41ed3fe13fe6f54469006b2b6cde95ce3b5 100644 (file)
@@ -3274,6 +3274,9 @@ static int mptcp_disconnect(struct sock *sk, int flags)
        msk->bytes_retrans = 0;
        msk->rcvspace_init = 0;
 
+       /* for fallback's sake */
+       WRITE_ONCE(msk->ack_seq, 0);
+
        WRITE_ONCE(sk->sk_shutdown, 0);
        sk_error_report(sk);
        return 0;
index 1f7311afd48d4100e47a23880ed2bf54c1366be8..86ce58ae533dfb09209d2cb06bb6e95e72e27273 100644 (file)
@@ -491,6 +491,9 @@ static void subflow_set_remote_key(struct mptcp_sock *msk,
        mptcp_crypto_key_sha(subflow->remote_key, NULL, &subflow->iasn);
        subflow->iasn++;
 
+       /* for fallback's sake */
+       subflow->map_seq = subflow->iasn;
+
        WRITE_ONCE(msk->remote_key, subflow->remote_key);
        WRITE_ONCE(msk->ack_seq, subflow->iasn);
        WRITE_ONCE(msk->can_ack, true);
@@ -1435,9 +1438,12 @@ reset:
 
        skb = skb_peek(&ssk->sk_receive_queue);
        subflow->map_valid = 1;
-       subflow->map_seq = READ_ONCE(msk->ack_seq);
        subflow->map_data_len = skb->len;
        subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq - subflow->ssn_offset;
+       subflow->map_seq = __mptcp_expand_seq(subflow->map_seq,
+                                             subflow->iasn +
+                                             TCP_SKB_CB(skb)->seq -
+                                             subflow->ssn_offset - 1);
        WRITE_ONCE(subflow->data_avail, true);
        return true;
 }