MPTCP Linux Development
 help / color / mirror / Atom feed
* Re: FAILED: patch "[PATCH] mptcp: Disallow MPTCP subflows from sockmap" failed to apply to 5.10-stable tree
       [not found] <2025112455-daughter-unsealed-699a@gregkh>
@ 2025-12-01 12:17 ` Matthieu Baerts
  0 siblings, 0 replies; only message in thread
From: Matthieu Baerts @ 2025-12-01 12:17 UTC (permalink / raw)
  To: gregkh, jiayuan.chen, martin.lau; +Cc: MPTCP Linux, stable

[-- Attachment #1: Type: text/plain, Size: 4602 bytes --]

Hello,

On 24/11/2025 14:21, gregkh@linuxfoundation.org wrote:
> 
> The patch below does not apply to the 5.10-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git commit
> id to <stable@vger.kernel.org>.

Thank you for the notification!
> To reproduce the conflict and resubmit, you may use the following commands:
> 
> git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
> git checkout FETCH_HEAD
> git cherry-pick -x fbade4bd08ba52cbc74a71c4e86e736f059f99f7
> # <resolve conflicts, build, test, etc.>
> git commit -s
> git send-email --to '<stable@vger.kernel.org>' --in-reply-to '2025112455-daughter-unsealed-699a@gregkh' --subject-prefix 'PATCH 5.10.y' HEAD^..
> 
> Possible dependencies:
> 
> 
> 
> thanks,
> 
> greg k-h
> 
> ------------------ original commit in Linus's tree ------------------
> 
> From fbade4bd08ba52cbc74a71c4e86e736f059f99f7 Mon Sep 17 00:00:00 2001
> From: Jiayuan Chen <jiayuan.chen@linux.dev>
> Date: Tue, 11 Nov 2025 14:02:50 +0800
> Subject: [PATCH] mptcp: Disallow MPTCP subflows from sockmap
> 
> The sockmap feature allows bpf syscall from userspace, or based on bpf
> sockops, replacing the sk_prot of sockets during protocol stack processing
> with sockmap's custom read/write interfaces.
> '''
> tcp_rcv_state_process()
>   subflow_syn_recv_sock()
>     tcp_init_transfer(BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB)
>       bpf_skops_established       <== sockops
>         bpf_sock_map_update(sk)   <== call bpf helper
>           tcp_bpf_update_proto()  <== update sk_prot
> '''
> Consider two scenarios:
> 
> 1. When the server has MPTCP enabled and the client also requests MPTCP,
>    the sk passed to the BPF program is a subflow sk. Since subflows only
>    handle partial data, replacing their sk_prot is meaningless and will
>    cause traffic disruption.
> 
> 2. When the server has MPTCP enabled but the client sends a TCP SYN
>    without MPTCP, subflow_syn_recv_sock() performs a fallback on the
>    subflow, replacing the subflow sk's sk_prot with the native sk_prot.
>    '''
>    subflow_ulp_fallback()
>     subflow_drop_ctx()
>       mptcp_subflow_ops_undo_override()
>    '''
>    Subsequently, accept::mptcp_stream_accept::mptcp_fallback_tcp_ops()
>    converts the subflow to plain TCP.
> 
> For the first case, we should prevent it from being combined with sockmap
> by setting sk_prot->psock_update_sk_prot to NULL, which will be blocked by
> sockmap's own flow.
> 
> For the second case, since subflow_syn_recv_sock() has already restored
> sk_prot to native tcp_prot/tcpv6_prot, no further action is needed.
> 
> Fixes: cec37a6e41aa ("mptcp: Handle MP_CAPABLE options for outgoing connections")
> Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
> Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
> Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
> Cc: <stable@vger.kernel.org>
> Link: https://patch.msgid.link/20251111060307.194196-2-jiayuan.chen@linux.dev
> 
> diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
> index e8325890a322..af707ce0f624 100644
> --- a/net/mptcp/subflow.c
> +++ b/net/mptcp/subflow.c
> @@ -2144,6 +2144,10 @@ void __init mptcp_subflow_init(void)
>  	tcp_prot_override = tcp_prot;
>  	tcp_prot_override.release_cb = tcp_release_cb_override;
>  	tcp_prot_override.diag_destroy = tcp_abort_override;
> +#ifdef CONFIG_BPF_SYSCALL
> +	/* Disable sockmap processing for subflows */
> +	tcp_prot_override.psock_update_sk_prot = NULL;
> +#endif
>  
>  #if IS_ENABLED(CONFIG_MPTCP_IPV6)
>  	/* In struct mptcp_subflow_request_sock, we assume the TCP request sock
> @@ -2180,6 +2184,10 @@ void __init mptcp_subflow_init(void)
>  	tcpv6_prot_override = tcpv6_prot;
>  	tcpv6_prot_override.release_cb = tcp_release_cb_override;
>  	tcpv6_prot_override.diag_destroy = tcp_abort_override;
> +#ifdef CONFIG_BPF_SYSCALL
> +	/* Disable sockmap processing for subflows */
> +	tcpv6_prot_override.psock_update_sk_prot = NULL;
> +#endif
>  #endif
>  
>  	mptcp_diag_subflow_init(&subflow_ulp_ops);
> 

FYI, the patch cannot be applied on v5.10 because
sk_prot->psock_update_sk_prot is not available, see commit 8a59f9d1e3d4
("sock: Introduce sk->sk_prot->psock_update_sk_prot()").

I have attached an **RFC** patch for anyone who would be ready to test
it, but please don't apply it before these tests: I don't want to break
things on TCP sockmap side. (That's why I'm attaching the patch and not
sending it the proper way.)

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.

[-- Attachment #2: 0001-mptcp-Disallow-MPTCP-subflows-from-sockmap.patch --]
[-- Type: text/x-patch, Size: 3500 bytes --]

From 436744f1d0ce2257d9fea34a40d2adb18dcb330b Mon Sep 17 00:00:00 2001
From: Jiayuan Chen <jiayuan.chen@linux.dev>
Date: Tue, 11 Nov 2025 14:02:50 +0800
Subject: [PATCH RFC] mptcp: Disallow MPTCP subflows from sockmap

commit fbade4bd08ba52cbc74a71c4e86e736f059f99f7

The sockmap feature allows bpf syscall from userspace, or based on bpf
sockops, replacing the sk_prot of sockets during protocol stack processing
with sockmap's custom read/write interfaces.
'''
tcp_rcv_state_process()
  subflow_syn_recv_sock()
    tcp_init_transfer(BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB)
      bpf_skops_established       <== sockops
        bpf_sock_map_update(sk)   <== call bpf helper
          tcp_bpf_update_proto()  <== update sk_prot
'''
Consider two scenarios:

1. When the server has MPTCP enabled and the client also requests MPTCP,
   the sk passed to the BPF program is a subflow sk. Since subflows only
   handle partial data, replacing their sk_prot is meaningless and will
   cause traffic disruption.

2. When the server has MPTCP enabled but the client sends a TCP SYN
   without MPTCP, subflow_syn_recv_sock() performs a fallback on the
   subflow, replacing the subflow sk's sk_prot with the native sk_prot.
   '''
   subflow_ulp_fallback()
    subflow_drop_ctx()
      mptcp_subflow_ops_undo_override()
   '''
   Subsequently, accept::mptcp_stream_accept::mptcp_fallback_tcp_ops()
   converts the subflow to plain TCP.

For the first case, we should prevent it from being combined with sockmap
by setting sk_prot->psock_update_sk_prot to NULL, which will be blocked by
sockmap's own flow.

For the second case, since subflow_syn_recv_sock() has already restored
sk_prot to native tcp_prot/tcpv6_prot, no further action is needed.

Fixes: cec37a6e41aa ("mptcp: Handle MP_CAPABLE options for outgoing connections")
Signed-off-by: Jiayuan Chen <jiayuan.chen@linux.dev>
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Cc: <stable@vger.kernel.org>
Link: https://patch.msgid.link/20251111060307.194196-2-jiayuan.chen@linux.dev
[ In this version, sk_prot->psock_update_sk_prot is not available, see
  commit 8a59f9d1e3d4 ("sock: Introduce sk->sk_prot->psock_update_sk_prot()").
  Instead of checking the family, restrict only to the TCP protocol. ]
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
 net/ipv4/tcp_bpf.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/net/ipv4/tcp_bpf.c b/net/ipv4/tcp_bpf.c
index bcd5fc484f77..47133393d69c 100644
--- a/net/ipv4/tcp_bpf.c
+++ b/net/ipv4/tcp_bpf.c
@@ -10,6 +10,7 @@
 
 #include <net/inet_common.h>
 #include <net/tls.h>
+#include <net/transp_v6.h>
 
 int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
 		      struct msghdr *msg, int len, int flags)
@@ -627,14 +628,16 @@ struct proto *tcp_bpf_get_proto(struct sock *sk, struct sk_psock *psock)
 	int family = sk->sk_family == AF_INET6 ? TCP_BPF_IPV6 : TCP_BPF_IPV4;
 	int config = psock->progs.msg_parser   ? TCP_BPF_TX   : TCP_BPF_BASE;
 
-	if (sk->sk_family == AF_INET6) {
+	if (sk->sk_prot == &tcpv6_prot) {
 		if (tcp_bpf_assert_proto_ops(psock->sk_proto))
 			return ERR_PTR(-EINVAL);
 
 		tcp_bpf_check_v6_needs_rebuild(psock->sk_proto);
+	} else if (sk->sk_prot == &tcp_prot) {
+		return &tcp_bpf_prots[family][config];
 	}
 
-	return &tcp_bpf_prots[family][config];
+	return ERR_PTR(-EINVAL);
 }
 
 /* If a child got cloned from a listening socket that had tcp_bpf
-- 
2.51.0


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2025-12-01 12:17 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <2025112455-daughter-unsealed-699a@gregkh>
2025-12-01 12:17 ` FAILED: patch "[PATCH] mptcp: Disallow MPTCP subflows from sockmap" failed to apply to 5.10-stable tree Matthieu Baerts

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox