From nobody Sat Jul 25 07:27:00 2026 Received: from out-174.mta0.migadu.com (out-174.mta0.migadu.com [91.218.175.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D5FA3C81A9 for ; Mon, 13 Jul 2026 09:57:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936673; cv=none; b=BGoC5tmKH2n5ODGQ5HPCKoNronTK5p89V80JK0OAwSVOrlyQ8yb8vN5bXGlv7blRHQDaYmARwn8FkqVSIQ+pgFukbW92R6YLUFcWUanmVchwBb0fFtdPPmq074NBJkLSDf74qIRCqt9jXme8rspI2QWDUdPs7PlAPBiSsBGjgUM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936673; c=relaxed/simple; bh=YxBBCt7qLsuZ5rl54sZw8NP1TZ8yHmYvkD3syyNDG2Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ch2ChpOCycuTJuXQBHiIoKaahBr5fdRJ3n+dA6o2zl9rwjO/gA0L4mKikGEsxh2ACDCVBl1F0jGXDRGSvq0yhS+qNCVSbnCH2z8lsOqXcUEcC0MzglODxjPF1AEI8NpdtJUhiXa0QgpmBjA5kK/hW8SRnd9eObzikZHcckSFDXw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=OC0HlzG7; arc=none smtp.client-ip=91.218.175.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="OC0HlzG7" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1783936668; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=R/OvLUNs0eWb060arg3Ve0gG34DZIIAT1Kt5ANdbfnI=; b=OC0HlzG7xPsWXfhiEoh7qXUUJ94JpZ9KMaFgMf1lwcdEv63AFlfsYkFR+G9CbJvPGnsojL 2ZTo7qkyQZhlv6lAw3AoaIKJBhLnsQztcwDUbXG1QRoJOxDQm2ApfUGeR5VusYKmsy3sBG wkJ+dXr50o5H2JcloeUQD+2QIIQQicY= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next 1/5] mptcp: use sockopt_lock/release_sock in sockopt Date: Mon, 13 Jul 2026 17:57:31 +0800 Message-ID: <20260713095735.1222033-2-gang.yan@linux.dev> In-Reply-To: <20260713095735.1222033-1-gang.yan@linux.dev> References: <20260713095735.1222033-1-gang.yan@linux.dev> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan TCP and the core socket layer use sockopt_lock_sock() / sockopt_release_sock() in their setsockopt and getsockopt handlers. Switch the MPTCP socket (msk) level lock_sock()/release_sock() calls to use the BPF-aware wrappers, making the MPTCP sockopt codepaths consistent with the rest of the networking stack. Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 84 ++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index fcf6feb2a9eb..342aec7f9086 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -78,7 +78,7 @@ static void mptcp_sol_socket_sync_intval(struct mptcp_soc= k *msk, int optname, in struct mptcp_subflow_context *subflow; struct sock *sk =3D (struct sock *)msk; =20 - lock_sock(sk); + sockopt_lock_sock(sk); sockopt_seq_inc(msk); =20 mptcp_for_each_subflow(msk, subflow) { @@ -123,7 +123,7 @@ static void mptcp_sol_socket_sync_intval(struct mptcp_s= ock *msk, int optname, in unlock_sock_fast(ssk, slow); } =20 - release_sock(sk); + sockopt_release_sock(sk); } =20 static int mptcp_sol_socket_intval(struct mptcp_sock *msk, int optname, in= t val) @@ -162,7 +162,7 @@ static int mptcp_setsockopt_sol_socket_tstamp(struct mp= tcp_sock *msk, int optnam if (ret) return ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); =20 @@ -171,7 +171,7 @@ static int mptcp_setsockopt_sol_socket_tstamp(struct mp= tcp_sock *msk, int optnam release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); return 0; } =20 @@ -237,7 +237,7 @@ static int mptcp_setsockopt_sol_socket_timestamping(str= uct mptcp_sock *msk, if (ret) return ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); =20 mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -251,7 +251,7 @@ static int mptcp_setsockopt_sol_socket_timestamping(str= uct mptcp_sock *msk, ret =3D err; } =20 - release_sock(sk); + sockopt_release_sock(sk); =20 return ret; } @@ -276,7 +276,7 @@ static int mptcp_setsockopt_sol_socket_linger(struct mp= tcp_sock *msk, sockptr_t if (ret) return ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); sockopt_seq_inc(msk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -293,7 +293,7 @@ static int mptcp_setsockopt_sol_socket_linger(struct mp= tcp_sock *msk, sockptr_t unlock_sock_fast(ssk, slow); } =20 - release_sock(sk); + sockopt_release_sock(sk); return 0; } =20 @@ -309,10 +309,10 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_s= ock *msk, int optname, case SO_REUSEADDR: case SO_BINDTODEVICE: case SO_BINDTOIFINDEX: - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_nmpc_sk(msk); if (IS_ERR(ssk)) { - release_sock(sk); + sockopt_release_sock(sk); return PTR_ERR(ssk); } =20 @@ -327,7 +327,7 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_soc= k *msk, int optname, else if (optname =3D=3D SO_BINDTOIFINDEX) sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; } - release_sock(sk); + sockopt_release_sock(sk); return ret; case SO_KEEPALIVE: case SO_PRIORITY: @@ -405,16 +405,16 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk= , int optname, case IPV6_V6ONLY: case IPV6_TRANSPARENT: case IPV6_FREEBIND: - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_nmpc_sk(msk); if (IS_ERR(ssk)) { - release_sock(sk); + sockopt_release_sock(sk); return PTR_ERR(ssk); } =20 ret =3D tcp_setsockopt(ssk, SOL_IPV6, optname, optval, optlen); if (ret !=3D 0) { - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -434,7 +434,7 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, break; } =20 - release_sock(sk); + sockopt_release_sock(sk); break; } =20 @@ -611,7 +611,7 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t cap_net_admin =3D ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN); =20 ret =3D 0; - lock_sock(sk); + sockopt_lock_sock(sk); sockopt_seq_inc(msk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -628,7 +628,7 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t if (ret =3D=3D 0) strscpy(msk->ca_name, name, sizeof(msk->ca_name)); =20 - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -707,11 +707,11 @@ static int mptcp_setsockopt_sol_ip_set(struct mptcp_s= ock *msk, int optname, if (err !=3D 0) return err; =20 - lock_sock(sk); + sockopt_lock_sock(sk); =20 ssk =3D __mptcp_nmpc_sk(msk); if (IS_ERR(ssk)) { - release_sock(sk); + sockopt_release_sock(sk); return PTR_ERR(ssk); } =20 @@ -732,13 +732,13 @@ static int mptcp_setsockopt_sol_ip_set(struct mptcp_s= ock *msk, int optname, READ_ONCE(inet_sk(sk)->local_port_range)); break; default: - release_sock(sk); + sockopt_release_sock(sk); WARN_ON_ONCE(1); return -EOPNOTSUPP; } =20 sockopt_seq_inc(msk); - release_sock(sk); + sockopt_release_sock(sk); return 0; } =20 @@ -754,7 +754,7 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_soc= k *msk, int optname, if (err !=3D 0) return err; =20 - lock_sock(sk); + sockopt_lock_sock(sk); sockopt_seq_inc(msk); val =3D READ_ONCE(inet_sk(sk)->tos); mptcp_for_each_subflow(msk, subflow) { @@ -765,7 +765,7 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_soc= k *msk, int optname, __ip_sock_set_tos(ssk, val); unlock_sock_fast(ssk, slow); } - release_sock(sk); + sockopt_release_sock(sk); =20 return 0; } @@ -794,7 +794,7 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int int ret; =20 /* Limit to first subflow, before the connection establishment */ - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_nmpc_sk(msk); if (IS_ERR(ssk)) { ret =3D PTR_ERR(ssk); @@ -804,7 +804,7 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int ret =3D tcp_setsockopt(ssk, level, optname, optval, optlen); =20 unlock: - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -857,7 +857,7 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *= msk, int optname, if (ret) return ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); switch (optname) { case TCP_INQ: if (val < 0 || val > 1) @@ -900,7 +900,7 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *= msk, int optname, ret =3D -ENOPROTOOPT; } =20 - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -924,9 +924,9 @@ int mptcp_setsockopt(struct sock *sk, int level, int op= tname, * is in TCP fallback, when TCP socket options are passed through * to the one remaining subflow. */ - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_tcp_fallback(msk); - release_sock(sk); + sockopt_release_sock(sk); if (ssk) return tcp_setsockopt(ssk, level, optname, optval, optlen); =20 @@ -949,7 +949,7 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int struct sock *ssk; int ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D msk->first; if (ssk) goto get; @@ -964,7 +964,7 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int ret =3D tcp_getsockopt(ssk, level, optname, optval, optlen); =20 out: - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -1135,7 +1135,7 @@ static int mptcp_getsockopt_tcpinfo(struct mptcp_sock= *msk, char __user *optval, =20 infoptr =3D optval + sfd.size_subflow_data; =20 - lock_sock(sk); + sockopt_lock_sock(sk); =20 mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -1148,7 +1148,7 @@ static int mptcp_getsockopt_tcpinfo(struct mptcp_sock= *msk, char __user *optval, tcp_get_info(ssk, &info); =20 if (copy_to_user(infoptr, &info, sfd.size_user)) { - release_sock(sk); + sockopt_release_sock(sk); return -EFAULT; } =20 @@ -1158,7 +1158,7 @@ static int mptcp_getsockopt_tcpinfo(struct mptcp_sock= *msk, char __user *optval, } } =20 - release_sock(sk); + sockopt_release_sock(sk); =20 sfd.num_subflows =3D sfcount; =20 @@ -1227,7 +1227,7 @@ static int mptcp_getsockopt_subflow_addrs(struct mptc= p_sock *msk, char __user *o =20 addrptr =3D optval + sfd.size_subflow_data; =20 - lock_sock(sk); + sockopt_lock_sock(sk); =20 mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -1240,7 +1240,7 @@ static int mptcp_getsockopt_subflow_addrs(struct mptc= p_sock *msk, char __user *o mptcp_get_sub_addrs(ssk, &a); =20 if (copy_to_user(addrptr, &a, sfd.size_user)) { - release_sock(sk); + sockopt_release_sock(sk); return -EFAULT; } =20 @@ -1250,7 +1250,7 @@ static int mptcp_getsockopt_subflow_addrs(struct mptc= p_sock *msk, char __user *o } } =20 - release_sock(sk); + sockopt_release_sock(sk); =20 sfd.num_subflows =3D sfcount; =20 @@ -1336,7 +1336,7 @@ static int mptcp_getsockopt_full_info(struct mptcp_so= ck *msk, char __user *optva sizeof(struct mptcp_subflow_info)); tcpinfoptr =3D u64_to_user_ptr(mfi.tcp_info); =20 - lock_sock(sk); + sockopt_lock_sock(sk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); struct mptcp_subflow_info sfinfo; @@ -1366,7 +1366,7 @@ static int mptcp_getsockopt_full_info(struct mptcp_so= ck *msk, char __user *optva tcpinfoptr +=3D mfi.size_tcpinfo_user; sfinfoptr +=3D mfi.size_sfinfo_user; } - release_sock(sk); + sockopt_release_sock(sk); =20 mfi.num_subflows =3D sfcount; if (mptcp_put_full_info(&mfi, optval, copylen, optlen)) @@ -1375,7 +1375,7 @@ static int mptcp_getsockopt_full_info(struct mptcp_so= ck *msk, char __user *optva return 0; =20 fail_release: - release_sock(sk); + sockopt_release_sock(sk); return -EFAULT; } =20 @@ -1530,9 +1530,9 @@ int mptcp_getsockopt(struct sock *sk, int level, int = optname, * is in TCP fallback, when socket options are passed through * to the one remaining subflow. */ - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_tcp_fallback(msk); - release_sock(sk); + sockopt_release_sock(sk); if (ssk) return tcp_getsockopt(ssk, level, optname, optval, option); =20 --=20 2.43.0 From nobody Sat Jul 25 07:27:00 2026 Received: from out-183.mta0.migadu.com (out-183.mta0.migadu.com [91.218.175.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04A7A3E0C47 for ; Mon, 13 Jul 2026 09:57:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.183 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936676; cv=none; b=HxCro6TQ7se2O2hjslKJoVYrDPJMf01/co2HRFvQ6/kSb3mO2dYFerfggUJtKS01IvD3MQrD4T0OpUT+VcbD0lGF/RC+uI2G7O2OV4SKFgLLtQZGVhOSc27My/FeiE57E9fC3z6LdGG6D+5QG2e+iv40JXNdRUFa0z0rk+1j7Qk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936676; c=relaxed/simple; bh=HVcG9CldcxWcR6Ql48cgvWxWNDxiemxroA0Yq0N/5Q0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=t8CnsWJxLJRwAJruw9ulGFGb/kWwn0LGanwU8MGbo0OtsW7AoM0QFVs/hSYXLPkocWfL4YnMY8IBTK90DNERkIomQqvGHFQGFLUvc08dNjB3+oukKKp1mThrE7yNgDZ8Lmb/FAnnG/MdTYbIW4KjGY94SicuqmDqd+GY8B+cPQU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=dy7Z9ak8; arc=none smtp.client-ip=91.218.175.183 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="dy7Z9ak8" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1783936671; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9luSEQqUECsWU+rFMRKjYKT1Q/m4yCWjKsNKT9WZm54=; b=dy7Z9ak8V/xF5sysF60g0zppfNowTWEu83xB1A5Fa8W5r0p4iJFRDGcqs/XVG5wYd99zmW moHvpWfQnC7tP2QvNhISAfMespnH3KoCDjvB4rOqz1d6Zbw+9izoLFDFuLPAcvxnsmMsjo VeRN9VqFiblWID9flhg7lFglFQd7BQE= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next 2/5] mptcp: reject sockopt requiring ssks' lock in BPF context Date: Mon, 13 Jul 2026 17:57:32 +0800 Message-ID: <20260713095735.1222033-3-gang.yan@linux.dev> In-Reply-To: <20260713095735.1222033-1-gang.yan@linux.dev> References: <20260713095735.1222033-1-gang.yan@linux.dev> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan Several MPTCP setsockopt handlers need to acquire the subflow lock via lock_sock(ssk) to propagate settings to each subflow. This lock can sleep and is therefore not usable in BPF context where sleeping is forbidden. The short-term solution is to make any sockopt operation that requires subflow-level lock fail with -EOPNOTSUPP when called from BPF context. Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 342aec7f9086..0c391247eb4c 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -185,6 +185,9 @@ static int mptcp_setsockopt_sol_socket_int(struct mptcp= _sock *msk, int optname, if (ret) return ret; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + switch (optname) { case SO_KEEPALIVE: case SO_DEBUG: @@ -218,6 +221,9 @@ static int mptcp_setsockopt_sol_socket_timestamping(str= uct mptcp_sock *msk, struct so_timestamping timestamping; int ret; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + if (optlen =3D=3D sizeof(timestamping)) { if (copy_from_sockptr(×tamping, optval, sizeof(timestamping))) @@ -265,6 +271,9 @@ static int mptcp_setsockopt_sol_socket_linger(struct mp= tcp_sock *msk, sockptr_t sockptr_t kopt; int ret; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + if (optlen < sizeof(ling)) return -EINVAL; =20 @@ -598,6 +607,9 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t bool cap_net_admin; int ret; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + if (optlen < 1) return -EINVAL; =20 @@ -639,6 +651,9 @@ static int __mptcp_setsockopt_set_val(struct mptcp_sock= *msk, int max, struct mptcp_subflow_context *subflow; int err =3D 0; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); int ret; @@ -662,6 +677,9 @@ static int __mptcp_setsockopt_sol_tcp_cork(struct mptcp= _sock *msk, int val) struct mptcp_subflow_context *subflow; struct sock *sk =3D (struct sock *)msk; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + sockopt_seq_inc(msk); msk->cork =3D !!val; mptcp_for_each_subflow(msk, subflow) { @@ -682,6 +700,9 @@ static int __mptcp_setsockopt_sol_tcp_nodelay(struct mp= tcp_sock *msk, int val) struct mptcp_subflow_context *subflow; struct sock *sk =3D (struct sock *)msk; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + sockopt_seq_inc(msk); msk->nodelay =3D !!val; mptcp_for_each_subflow(msk, subflow) { @@ -749,6 +770,9 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_soc= k *msk, int optname, struct sock *sk =3D (struct sock *)msk; int err, val; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + err =3D ip_setsockopt(sk, SOL_IP, optname, optval, optlen); =20 if (err !=3D 0) @@ -1654,6 +1678,9 @@ int mptcp_set_rcvlowat(struct sock *sk, int val) if (space <=3D sk->sk_rcvbuf) return 0; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + /* propagate the rcvbuf changes to all the subflows */ WRITE_ONCE(sk->sk_rcvbuf, space); mptcp_for_each_subflow(mptcp_sk(sk), subflow) { --=20 2.43.0 From nobody Sat Jul 25 07:27:00 2026 Received: from out-170.mta0.migadu.com (out-170.mta0.migadu.com [91.218.175.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 72BD83E3177 for ; Mon, 13 Jul 2026 09:57:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936677; cv=none; b=GNhaSh2dzLVLIcQzF1KOwdFiNTPVdVCVS6AsGMa4j443rrGpmzxo9mdyy61rlp+nJ1CQgyG4fKH4/i5L/hbXjstlULdMWHhp/XjLXTkcLUCRqu2nhhgFHGfJcgUJljCZ67VLsRgUnMKtv+lWvMAL1g38rUiTLrGpiyq/TPTAUU8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936677; c=relaxed/simple; bh=5zFkKyp9ehfuu4yB9a0i8HcjLrxGWthyOeNDU4hhtMw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BA960rX33vz9CklP/kVBaTWO+AjWABP6cY/FdQ9BqmV/7jkyr8fVB8GEVvRGFVn0aSila+bCqXhHzvJu0zIn0W62MrmvRlDTI2wxCGRz+3tgCDwmdTlmBG0MSOjI0sWUwe04ApwZoYuKkwJ0bUlFHi9RRJcyiho+KWB0VBqvyGI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=cqcam904; arc=none smtp.client-ip=91.218.175.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="cqcam904" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1783936673; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qTFn/SIFF9ZetCyh2AJXT3+aaGTxknLExXPM5gadLVE=; b=cqcam904x6Sj5gQ0u3doDfg4Lntajj4tM4SwLFpCxp5OmW7iAQvNMU87Jea/1P4f159cw2 OVzTyg+TJ7rR8FdSSXDWkHcRD22IMQkeIKDPzI7h3cNlqGRQp2lENwJBt0+AU7W8c3Vxd6 K9THh4ezqouMzPX+9iser9/1Uvyoigo= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next 3/5] mptcp: enable bpf_setsockopt on the master socket Date: Mon, 13 Jul 2026 17:57:33 +0800 Message-ID: <20260713095735.1222033-4-gang.yan@linux.dev> In-Reply-To: <20260713095735.1222033-1-gang.yan@linux.dev> References: <20260713095735.1222033-1-gang.yan@linux.dev> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan bpf_setsockopt() currently cannot be used on mptcp master sockets: __bpf_setsockopt() dispatches by level to the protocol-agnostic sol_*_sockopt() helpers, which either reject the msk (sk_protocol =3D=3D IPPROTO_MPTCP) and the ssk (sk_is_tcp() is false) or bypass mptcp's own dispatch (e.g. SOL_IP going straight to do_ip_setsockopt()). This patch routes any level to mptcp_setsockopt(), which already handles all levels. Signed-off-by: Gang Yan --- include/net/mptcp.h | 9 +++++++++ net/core/filter.c | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 333bde2a0b76..fcce2b7e9ef9 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -237,6 +237,9 @@ static inline __be32 mptcp_reset_option(const struct sk= _buff *skb) } =20 void mptcp_active_detect_blackhole(struct sock *sk, bool expired); + +int mptcp_setsockopt(struct sock *sk, int level, int optname, + sockptr_t optval, unsigned int optlen); #else =20 static inline void mptcp_init(void) @@ -314,6 +317,12 @@ static inline struct request_sock *mptcp_subflow_reqsk= _alloc(const struct reques static inline __be32 mptcp_reset_option(const struct sk_buff *skb) { retu= rn htonl(0u); } =20 static inline void mptcp_active_detect_blackhole(struct sock *sk, bool exp= ired) { } + +static inline int mptcp_setsockopt(struct sock *sk, int level, int optname, + sockptr_t optval, unsigned int optlen) +{ + return -EINVAL; +} #endif /* CONFIG_MPTCP */ =20 #if IS_ENABLED(CONFIG_MPTCP_IPV6) diff --git a/net/core/filter.c b/net/core/filter.c index b446aa8be5c3..9406984dfdbe 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5683,6 +5683,12 @@ static int __bpf_setsockopt(struct sock *sk, int lev= el, int optname, if (!sk_fullsock(sk)) return -EINVAL; =20 + /* Route any bpf_setsockopt on the mptcp socket to mptcp_set_sockopt, + * which handles all levels. + */ + if (IS_ENABLED(CONFIG_MPTCP) && sk->sk_protocol =3D=3D IPPROTO_MPTCP) + return mptcp_setsockopt(sk, level, optname, KERNEL_SOCKPTR(optval), optl= en); + if (level =3D=3D SOL_SOCKET) return sol_socket_sockopt(sk, optname, optval, &optlen, false); else if (IS_ENABLED(CONFIG_INET) && level =3D=3D SOL_IP) --=20 2.43.0 From nobody Sat Jul 25 07:27:00 2026 Received: from out-170.mta0.migadu.com (out-170.mta0.migadu.com [91.218.175.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 697C43D9DD2 for ; Mon, 13 Jul 2026 09:57:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936680; cv=none; b=Jc1qXjdc/ZY3dyO8D5XNgOb3o2/Rs6dS5K0v9hBv0WcujHPVQjmAKnLK6cVV0pC2hLxstCZg61u02SIrFM+cECahduh+UZe8hNAkU2ZoM+laijWWHCnZ1813DXx8Ds893tgyEO5hmgTWIIuzRgLoJ4CDPy42MpfvEggIO5LASOQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936680; c=relaxed/simple; bh=/E57Gpbzun/m6JAQ1XiUqbjnB4YSwessf+nkWuQXmo8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CJRC1QT7G0B35UIYUcVfIINm6cDNP+1lyHYWjRq78x+g2D2iZeiixpYZgkiob3Aj5zn7YrYmwy/zAYgT2p00xhmYmHn3HcPDHt9YyI5aU4ITOs5bq5s8Vzp7D+fc/YDC2Ya8h/zFQ52MZieQW2oYzMzB0F1ZjVrnkO6JzlTtDQo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=sdMYYArp; arc=none smtp.client-ip=91.218.175.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="sdMYYArp" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1783936676; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AkgVb/K4XgPRTf13nRhq2eu+KontUaZPqXLgsM+nYHE=; b=sdMYYArpBaT0hmC7r3JIjCwqxilb+6ccnZWvErwiSgj8xabSHaQAKX+LfrX6KSUmF0xUBC gjEgpmyks6zi31j8VXbCjyaWvbSmeVvOYjHq0qW3EVlU88hh5zGiV7e5CvYMsFAP7MgX5p IsBYp1nqdO7xpStMWpVYutKH+89QWlI= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next 4/5] mptcp: add TCP_CONNECT_CB sock_ops hook Date: Mon, 13 Jul 2026 17:57:34 +0800 Message-ID: <20260713095735.1222033-5-gang.yan@linux.dev> In-Reply-To: <20260713095735.1222033-1-gang.yan@linux.dev> References: <20260713095735.1222033-1-gang.yan@linux.dev> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan This patch adds a helper named 'mptcp_call_bpf' like tcp_call_bpf. Invoke the new helper from mptcp_connect() with BPF_SOCK_OPS_TCP_CONNECT_CB, placed after the subflow lock is acquired and before tcp_connect(). At this point the msk lock is held by __inet_stream_connect(), mirroring the placement of TCP_CONNECT_CB in tcp_v4_connect()/tcp_v6_connect(). Signed-off-by: Gang Yan --- net/mptcp/protocol.c | 6 ++++++ net/mptcp/protocol.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index ffcf5a1788f6..837bb76e5c2d 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -4149,6 +4149,12 @@ static int mptcp_connect(struct sock *sk, struct soc= kaddr_unsized *uaddr, if (!msk->fastopening) lock_sock(ssk); =20 + /* Notify cgroup BPF on the msk before initiating the subflow connect. + * Mirrors BPF_SOCK_OPS_TCP_CONNECT_CB; msk lock is held by the + * caller (__inet_stream_connect) and ssk is held before. + */ + mptcp_call_bpf(sk, BPF_SOCK_OPS_TCP_CONNECT_CB, 0, NULL); + /* the following mirrors closely a very small chunk of code from * __inet_stream_connect() */ diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index da40c6f3705f..b4640ba83a8b 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1374,4 +1374,34 @@ mptcp_token_join_cookie_init_state(struct mptcp_subf= low_request_sock *subflow_re static inline void mptcp_join_cookie_init(void) {} #endif =20 +#ifdef CONFIG_BPF_JIT +static inline int mptcp_call_bpf(struct sock *sk, int op, u32 nargs, u32 *= args) +{ + struct bpf_sock_ops_kern sock_ops; + int ret; + + memset(&sock_ops, 0, offsetof(struct bpf_sock_ops_kern, temp)); + + if (sk_fullsock(sk)) { + sock_ops.is_fullsock =3D 1; + sock_ops.is_locked_tcp_sock =3D 1; + sock_owned_by_me(sk); + } + + sock_ops.sk =3D sk; + sock_ops.op =3D op; + + if (nargs > 0) + memcpy(sock_ops.args, args, nargs * sizeof(*args)); + + ret =3D BPF_CGROUP_RUN_PROG_SOCK_OPS(&sock_ops); + return ret =3D=3D 0 ? sock_ops.reply : -1; +} +#else +static inline int mptcp_call_bpf(struct sock *sk, int op, u32 nargs, u32 *= args) +{ + return -1; +} +#endif + #endif /* __MPTCP_PROTOCOL_H */ --=20 2.43.0 From nobody Sat Jul 25 07:27:00 2026 Received: from out-177.mta0.migadu.com (out-177.mta0.migadu.com [91.218.175.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D2653E2AB1 for ; Mon, 13 Jul 2026 09:58:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936683; cv=none; b=DePiv5pWdaesxQuC5UeMJ/nak0lojX6eTZuzeM3mCSLUY/66R9asu14lb3nHn44uxanFciwiSddwBFeAEw6KhirwTSoeUWN2++a1fNHWijxA7lxJfM0EdcpAbEeUmILSq1V8nkF9Y+N6j7mXABPfN+Qop6luiG2o2N0CLVOYLTk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783936683; c=relaxed/simple; bh=5ENV5Fd57hzmb7xSW4bYLIJnGboG3xK5zWrvvfpNfQU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HRBrih/NZSp06xgBE0OF47wDCOqvR/uW2sS0HqOr4D53Np6AsRcbrXnP6KDkFRV11nMuiC0CNphWDSSoRSKIv0BMM4XzbLw1u31F2zHJ8C8E3t1zSE5O1fYICLDFUnV2CMKGmjkQDDGjWSfEitz9n/W0g+MZGclhGEtIe2/j1Cc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=bOUyYbYq; arc=none smtp.client-ip=91.218.175.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="bOUyYbYq" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1783936679; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=u5KSWnznuuD2BQAMxk3d2zE+dJZ+HCdUDIt7xKsPYug=; b=bOUyYbYqrYSAa04TtF6bPD4Sgd0suWrtiCMt9K9i/hLA8f3H4tSYIS62bJzDyAppY/IKhx 6rZLPxORJzrBMGDbaXez3QmoBo8sTtm4SbvJUgdguVo1rjRte1kPyTwVuAFWYjKME1ZP+i rCTshCZ/ltSDcDZ8dTZSD4VB4yk36Cc= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next 5/5] selftests: bpf: verify mptcp bpf_setsockopt from TCP_CONNECT_CB Date: Mon, 13 Jul 2026 17:57:35 +0800 Message-ID: <20260713095735.1222033-6-gang.yan@linux.dev> In-Reply-To: <20260713095735.1222033-1-gang.yan@linux.dev> References: <20260713095735.1222033-1-gang.yan@linux.dev> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan Add a BPF sockops program attached to BPF_CGROUP_SOCK_OPS that fires on BPF_SOCK_OPS_TCP_CONNECT_CB and exercises bpf_setsockopt() on the mptcp master socket (msk). Two scenarios are covered by the new "setsockopt" subtest: - TCP_INQ must succeed and the value (1) must be observable from userspace via getsockopt() on the mptcp socket. - TCP_CONGESTION needs the subflow lock and is therefore rejected in bpf context with -EOPNOTSUPP. Signed-off-by: Gang Yan --- .../testing/selftests/bpf/prog_tests/mptcp.c | 61 +++++++++++++++++++ .../selftests/bpf/progs/mptcp_setsockopt.c | 32 ++++++++++ 2 files changed, 93 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/mptcp_setsockopt.c diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index 7f48fd9e94e1..ad59f8fcbb68 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -18,6 +18,7 @@ #include "mptcp_bpf_rr.skel.h" #include "mptcp_bpf_red.skel.h" #include "mptcp_bpf_burst.skel.h" +#include "mptcp_setsockopt.skel.h" =20 #define NS_TEST "mptcp_ns" #define ADDR_1 "10.0.1.1" @@ -813,6 +814,64 @@ static void test_burst(void) mptcp_bpf_burst__destroy(skel); } =20 +static void test_setsockopt(void) +{ + struct mptcp_setsockopt *skel; + struct netns_obj *netns; + int cgroup_fd, server_fd, client_fd; + int err; + int inq; + socklen_t len; + + cgroup_fd =3D test__join_cgroup("/mptcp_setsockopt"); + if (!ASSERT_OK_FD(cgroup_fd, "join_cgroup")) + return; + + skel =3D mptcp_setsockopt__open_and_load(); + if (!ASSERT_OK_PTR(skel, "skel_open_load")) + goto close_cgroup; + + skel->links.mptcp_connect_cb =3D + bpf_program__attach_cgroup(skel->progs.mptcp_connect_cb, + cgroup_fd); + if (!ASSERT_OK_PTR(skel->links.mptcp_connect_cb, "attach connect_cb")) + goto skel_destroy; + + netns =3D netns_new(NS_TEST, true); + if (!ASSERT_OK_PTR(netns, "netns_new")) + goto skel_destroy; + + server_fd =3D start_mptcp_server(AF_INET, NULL, 0, 0); + if (!ASSERT_OK_FD(server_fd, "start_mptcp_server")) + goto close_netns; + + client_fd =3D connect_to_fd(server_fd, 0); + if (!ASSERT_OK_FD(client_fd, "connect_to_fd")) + goto close_server; + + /* TCP_INQ should be set successfullly */ + ASSERT_EQ(skel->bss->connect_cb_inq_ret, 0, "connect_cb TCP_INQ ret"); + + len =3D sizeof(inq); + err =3D getsockopt(client_fd, SOL_TCP, TCP_INQ, &inq, &len); + if (ASSERT_OK(err, "getsockopt TCP_INQ")) + ASSERT_EQ(inq, 1, "TCP_INQ value"); + + /* TCP_CONGESTION should be -EOPNOTSUPP */ + ASSERT_EQ(skel->bss->connect_cb_cc_ret, -EOPNOTSUPP, + "connect_cb TCP_CONGESTION ret"); + + close(client_fd); +close_server: + close(server_fd); +close_netns: + netns_free(netns); +skel_destroy: + mptcp_setsockopt__destroy(skel); +close_cgroup: + close(cgroup_fd); +} + void test_mptcp(void) { if (test__start_subtest("base")) @@ -835,4 +894,6 @@ void test_mptcp(void) test_red(); if (test__start_subtest("burst")) test_burst(); + if (test__start_subtest("setsockopt")) + test_setsockopt(); } diff --git a/tools/testing/selftests/bpf/progs/mptcp_setsockopt.c b/tools/t= esting/selftests/bpf/progs/mptcp_setsockopt.c new file mode 100644 index 000000000000..f54b77ea6c5f --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcp_setsockopt.c @@ -0,0 +1,32 @@ +#include "bpf_tracing_net.h" +#include "mptcp_bpf.h" + +#ifndef TCP_INQ +#define TCP_INQ 36 +#endif + +int connect_cb_inq_ret; +int connect_cb_cc_ret; + +char cc_reno[TCP_CA_NAME_MAX] =3D "reno"; + +SEC("sockops") +int mptcp_connect_cb(struct bpf_sock_ops *skops) +{ + struct bpf_sock *sk =3D skops->sk; + int one =3D 1; + + if (skops->op !=3D BPF_SOCK_OPS_TCP_CONNECT_CB) + return 1; + + if (!sk || sk->protocol !=3D IPPROTO_MPTCP) + return 1; + + connect_cb_inq_ret =3D + bpf_setsockopt(skops, SOL_TCP, TCP_INQ, &one, sizeof(one)); + connect_cb_cc_ret =3D + bpf_setsockopt(skops, SOL_TCP, TCP_CONGESTION, + cc_reno, sizeof(cc_reno)); + + return 1; +} --=20 2.43.0