From nobody Mon May 25 03:36:55 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 E34DF1FECAB for ; Sat, 9 May 2026 06:44:46 +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=1778309088; cv=none; b=GcIkqf9RVvPVTlWtWZzBaTQU505YEFYFQzi+hJ6Tme6F9DUBQwyHGHcsxLiU7nFL2mVSmdcDTC8Ylk4H3mshXvrhWgdkg59AMmLFWP3kCzsKJdb3eirI7yWGW9juH5vkmOZ0pjcKFjTa1BQLk3w/HRRFc9WWLLl5npBjVMpq3+A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778309088; c=relaxed/simple; bh=sqPTLLF1Hi5dwkm4z3ntGV358053HTOuQjM1hc6viS8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GBeLvcAWHEojrrniDtmqlXnIgYUPi6+1SUHIrHRe96kjDrUAYQsXkOV1WjzWmeBpZedqbjQsTLb6jIl6ZqbWjb4koRxjBNMzpXsNo0IB2mT2rsNgJdi3ZHtK5HrpHo+Y+2BFpZtd9ju/IAOXcVaYvdCF9/3DbkaagIRnv0+p6Zc= 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=tnFS9pXd; 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="tnFS9pXd" 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=1778309083; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XMVHs3xVxOWb11hm1wbeweoAuwxKC1HegnfAXgBIScY=; b=tnFS9pXd2RiQTcsHEp/li67N78ooXMBF6hroX3lrFZ2kN9Z6d8VeWDno+HmzB/6UUqWQej NJXsEt6wrSep50G4eWz66raQi2QN3LmTMjpOX6nOtSRMGAxvipMHr3N336ResuUqfP1CeB DjTxGdP6cmOoSc4G0Xt8XXQdI/9BmPA= From: Gang Yan Date: Sat, 09 May 2026 14:44:22 +0800 Subject: [PATCH mptcp-net v4 1/2] mptcp: use sockopt_lock(release)_sock in sockopt Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-sockopt_lock-v4-1-33f3a1c4d7a0@kylinos.cn> References: <20260509-sockopt_lock-v4-0-33f3a1c4d7a0@kylinos.cn> In-Reply-To: <20260509-sockopt_lock-v4-0-33f3a1c4d7a0@kylinos.cn> To: MPTCP Linux Cc: Gang Yan X-Migadu-Flow: FLOW_OUT From: Gang Yan TCP and the core socket layer all use sockopt_lock_sock() sockopt_release_sock() in their setsockopt and getsockopt handlers. It is a BPF-aware wrapper that skips lock acquisition when invoked from a BPF program, where the socket lock is already held. Using lock_sock_fast() on subflows requires extra care: the fast path holds the socket spinlock with BH disabled, creating an atomic context where sleeping is not allowed. Switching to lock_sock() avoids the risk of accidentally introducing sleeping operations inside the lock_sock_fast() critical section. Fixes: 24426654ed3a ("bpf: net: Avoid sk_setsockopt() taking sk lock when c= alled from bpf") Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 97 ++++++++++++++++++++++++++-----------------------= ---- 1 file changed, 48 insertions(+), 49 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 1cf608e7357b..57ffde0d0b87 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -72,12 +72,12 @@ static void mptcp_sol_socket_sync_intval(struct mptcp_s= ock *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) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - bool slow =3D lock_sock_fast(ssk); + lock_sock(ssk); =20 switch (optname) { case SO_DEBUG: @@ -114,10 +114,10 @@ static void mptcp_sol_socket_sync_intval(struct mptcp= _sock *msk, int optname, in } =20 subflow->setsockopt_seq =3D msk->setsockopt_seq; - unlock_sock_fast(ssk, slow); + release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); } =20 static int mptcp_sol_socket_intval(struct mptcp_sock *msk, int optname, in= t val) @@ -156,7 +156,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 @@ -165,7 +165,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 @@ -231,7 +231,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); @@ -241,7 +241,7 @@ static int mptcp_setsockopt_sol_socket_timestamping(str= uct mptcp_sock *msk, release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); =20 return 0; } @@ -266,11 +266,11 @@ static int mptcp_setsockopt_sol_socket_linger(struct = mptcp_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); - bool slow =3D lock_sock_fast(ssk); + lock_sock(ssk); =20 if (!ling.l_onoff) { sock_reset_flag(ssk, SOCK_LINGER); @@ -280,10 +280,10 @@ static int mptcp_setsockopt_sol_socket_linger(struct = mptcp_sock *msk, sockptr_t } =20 subflow->setsockopt_seq =3D msk->setsockopt_seq; - unlock_sock_fast(ssk, slow); + release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); return 0; } =20 @@ -299,10 +299,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 @@ -317,7 +317,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: @@ -395,16 +395,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 @@ -424,7 +424,7 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, break; } =20 - release_sock(sk); + sockopt_release_sock(sk); break; } =20 @@ -601,7 +601,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); @@ -618,7 +618,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 @@ -697,11 +697,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 @@ -722,13 +722,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 @@ -744,18 +744,17 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_s= ock *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) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - bool slow; =20 - slow =3D lock_sock_fast(ssk); + lock_sock(ssk); __ip_sock_set_tos(ssk, val); - unlock_sock_fast(ssk, slow); + release_sock(ssk); } - release_sock(sk); + sockopt_release_sock(sk); =20 return 0; } @@ -784,7 +783,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); @@ -794,7 +793,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 @@ -846,7 +845,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) @@ -889,7 +888,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 @@ -913,9 +912,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 @@ -938,7 +937,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; @@ -953,7 +952,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 @@ -1124,7 +1123,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); @@ -1137,7 +1136,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 @@ -1147,7 +1146,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 @@ -1216,7 +1215,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); @@ -1229,7 +1228,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 @@ -1239,7 +1238,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 @@ -1325,7 +1324,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; @@ -1355,7 +1354,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)) @@ -1364,7 +1363,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 @@ -1519,9 +1518,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 Mon May 25 03:36:55 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 10E0A2749ED for ; Sat, 9 May 2026 06:44:46 +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=1778309088; cv=none; b=R0l3+tVUEGwrGd2xCMgPU0cQjzTw53EdL/2GFR5e12vG/h/v28fE6PH43rJzIjQP+KfvlY8OF/K2IEWXJaAGNRU6h6Rdd7w3ZyqKUwjatrzOk6wOhXMeMBBDn3rEBQgRovq+rVyyp08oKEG+drUag8uOaiWPHZLaHSmWaOLG48g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778309088; c=relaxed/simple; bh=FSLPt7MDale0HBrqi3QDh8LkvmgTT+dO6TUbSAOPERg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ush/X/Y2TwvJ+zANoCDjBNa5o8tvw+2OJxB3eoCdAtZL5UTCAVjXVpeckWlt1jSxPu/IhDXhsEoBfkzbamLQETIrmH23Gyrbt5q29KpcGQ5WPMNX03Jl4ppWeyR/CNEmoWl5mQHDosnNQLUqVdgJMvCy1Yl6LYNDhdj6QHB/5rY= 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=BiIdSicd; 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="BiIdSicd" 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=1778309085; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6xwQt15CGGzxD1N/8flBhD0Su6ovM59SKdddRmcT+Ls=; b=BiIdSicdTy2bn/SZo5P65zhjdSs8DXFdaRJTl0anvkdMcfepYghYiLpMMuHahAotNfZMv9 plpnqUTwzrTt2qbNM0k7feksq+nKugD0Xbu/OKW1+IjImIzVnpASWnJJ4XGVAAc+VnwQZ+ bQVDR6Sd58Q3znMIL4YL/BalH9tYSEY= From: Gang Yan Date: Sat, 09 May 2026 14:44:23 +0800 Subject: [PATCH mptcp-net v4 2/2] mptcp: use sockopt_ns_capable() in setsockopt congestion control Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260509-sockopt_lock-v4-2-33f3a1c4d7a0@kylinos.cn> References: <20260509-sockopt_lock-v4-0-33f3a1c4d7a0@kylinos.cn> In-Reply-To: <20260509-sockopt_lock-v4-0-33f3a1c4d7a0@kylinos.cn> To: MPTCP Linux Cc: Gang Yan X-Migadu-Flow: FLOW_OUT From: Gang Yan When a BPF program calls bpf_setsockopt(), it may run in softirq context where ns_capable() is not appropriate as there is no valid credential context. Use sockopt_ns_capable() instead, which skips the capability check when invoked from a BPF program. Additionally, the load is changed from 'true' to '!has_current_bpf_ctx()' like tcp does. Fixes: e42c7beee71d ("bpf: net: Consider has_current_bpf_ctx() when testing= capable() in sk_setsockopt()") Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 57ffde0d0b87..8535beaaf6b4 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -598,7 +598,7 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t =20 name[ret] =3D 0; =20 - cap_net_admin =3D ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN); + cap_net_admin =3D sockopt_ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN= ); =20 ret =3D 0; sockopt_lock_sock(sk); @@ -608,7 +608,7 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t int err; =20 lock_sock(ssk); - err =3D tcp_set_congestion_control(ssk, name, true, cap_net_admin); + err =3D tcp_set_congestion_control(ssk, name, !has_current_bpf_ctx(), ca= p_net_admin); if (err < 0 && ret =3D=3D 0) ret =3D err; subflow->setsockopt_seq =3D msk->setsockopt_seq; --=20 2.43.0