From nobody Sun Feb 8 05:40:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 0D64DDDC3 for ; Tue, 12 Aug 2025 08:17:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986653; cv=none; b=st05/dM/R0+XFqwjQpY3UoRHIcZXP7wISD+uwKC+4LudeRtPj+ZFrg6DwdhmpgmAf+Z8o29dQxgwq2wSixOsftD77K6K6JCOOj/1gsWNKaaoW8jkj7DhnMI6PWfTbu1pcvIGz34y3ZU0+BWEECW/H5z7jGUUVcgbbpHqMns/9u4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986653; c=relaxed/simple; bh=9pJf1zRuo0TP5+4IWk2SSqRJMnP9mlqynIWJyZQ5+vA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VZaHmUtBL5BbjBDjt1DGpUIgXOjt94WLyx3uaTlQSlWZBmP+Jcs5wu8Ke8pgrclNAIIO3AEuioDTY6Ehy6MCdHX/bbRKlqPQxB2MsVjsOGvZLMBeJ4Nw4/bvR8N2iHNKCkOLm8tJOwy9cWctNW228a/MVZ4NQrCkWVjh7Th1XG8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=topL40zy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="topL40zy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D22E0C4CEF6; Tue, 12 Aug 2025 08:17:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754986652; bh=9pJf1zRuo0TP5+4IWk2SSqRJMnP9mlqynIWJyZQ5+vA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=topL40zyxUQ0MWukzYiW5kw7TwbJOfWta48avE3lRTbk15V4Z/o4TQIncAiKmzG4S opMcM1US+ZW5i/ZW2k6Ij9A6XemHojs5IBGljDfvzrYzTcz3m8KpCyJ3z7RREbzaNx 1aEctVIy11ucdMWWq/jtF4/YRhzdmzQ8VNymUXxNKdfYACvc6SgR7MSrLpIieKiv6m t8AhmkatzOtEE5KaUB3OtR8EIgZ1XlvW49AusrIhYhSQDtCINl24viz1ObFA4Abaxs yABci/rjZXDdJTehBR3rnoGrlMWYHxYM4KEf2Z+PRczoT8ggS+rmZJd99+K/6bfPgz bpG43CB4QRnmg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 1/6] mptcp: add helper for setsockopt on first subflow only Date: Tue, 12 Aug 2025 16:17:16 +0800 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Implement mptcp_setsockopt_first_sf_only() helper to manage setsockopt operations applied solely to the first subflow. This centralizes handling of TCP-level options that require synchronization only with the initial subflow. Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 2c267aff95be..6cc073fab17c 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -776,8 +776,8 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, = int optname, return -EOPNOTSUPP; } =20 -static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int leve= l, int optname, - sockptr_t optval, unsigned int optlen) +static int mptcp_setsockopt_sol_tcp_first_sf_only(struct mptcp_sock *msk, = int optname, + sockptr_t optval, unsigned int optlen) { struct sock *sk =3D (struct sock *)msk; struct sock *ssk; @@ -791,13 +791,26 @@ static int mptcp_setsockopt_first_sf_only(struct mptc= p_sock *msk, int level, int goto unlock; } =20 - ret =3D tcp_setsockopt(ssk, level, optname, optval, optlen); + ret =3D tcp_setsockopt(ssk, SOL_TCP, optname, optval, optlen); =20 unlock: release_sock(sk); return ret; } =20 +static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int leve= l, + int optname, sockptr_t optval, + unsigned int optlen) +{ + switch (level) { + case SOL_TCP: + return mptcp_setsockopt_sol_tcp_first_sf_only(msk, optname, + optval, optlen); + } + + return -EOPNOTSUPP; +} + static int mptcp_setsockopt_all_sf(struct mptcp_sock *msk, int level, int optname, sockptr_t optval, unsigned int optlen) --=20 2.48.1 From nobody Sun Feb 8 05:40:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 A155CDDC3 for ; Tue, 12 Aug 2025 08:17:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986656; cv=none; b=Q6I129oZQMPd9pkERB8JF65U2kH6lXLGD3r9at2Wd4WiEy8gKsIfVlaCacWwcir5uRV8Auuk+XQsbQuFlUPnzz7Xuj8ooM0xO71Ppjuj5KZsFlcozkm2lgb1UmjEsQkvtUaqJVhyb2nlJWHw9AY7tqZh2xanc/9npI1jsq/ncAg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986656; c=relaxed/simple; bh=XoNKFj5uh2lsRdEfD8Oe+JTzHeeQgy9hKO6Rd5YiA30=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RRWDXDr5y8tmCP8xJPNITr5RSD/AknXE8Ss/BA3mxg53+Tvj5ZwjFuunTlGOvdyRCF+Kfd0ba7DDmA5AokkjjDFFLLWgBhHJG1S7/KCgBsXF12wX/bZ6Vr5/0j4KkPxIAin8ekCcTfKOLrPRlqulhFMQple1R1zULzkIRWJcMkk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Y2RiVn3Q; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Y2RiVn3Q" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3CA2BC4CEF0; Tue, 12 Aug 2025 08:17:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754986654; bh=XoNKFj5uh2lsRdEfD8Oe+JTzHeeQgy9hKO6Rd5YiA30=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Y2RiVn3QoBY1hDO5E0gChmsBClxbGMU1KAxYnTRI61aPsU6fYp5INjqHVAHh6H8Cr 4WYsuC1RPpuv3olc8BWrQl+yEkBfkddXGlk+l9pwG4WaKHHiZt2R7sZHBTcF02UIrK BGJCiZwTb+zwxwZPD+DbH0RRjQ0hKJzdjc+Dgc3WobY0DbaF+QnNqWXySr+YtVXXkW DbF2dJpAV3bmD7JgozyiRqHOMZxmFVZGqXw4Gxcn19PwAio8r7J1/quUqYAPC+vRLu IRlcIADKkBN46klHqkfJT2HTB0E2B7mTlLx0WE7bNiEqn9cwnNfQmJoJxSR/G+4wdB vadkZgD2zE8KA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 2/6] mptcp: handle SOL_SOCKET options on first subflow only Date: Tue, 12 Aug 2025 16:17:17 +0800 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Refactor SOL_SOCKET option handling using the common handler mptcp_setsockopt_sol_socket_first_sf_only(). This helper applies socket options (SO_REUSEPORT, SO_REUSEADDR, SO_BINDTODEVICE, SO_BINDTOIFINDEX) to the first subflow and synchronizes values back to the MPTCP socket. Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 64 +++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 6cc073fab17c..8017cbad0597 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -17,6 +17,10 @@ #define MIN_INFO_OPTLEN_SIZE 16 #define MIN_FULL_INFO_OPTLEN_SIZE 40 =20 +static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int leve= l, + int optname, sockptr_t optval, + unsigned int optlen); + static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk) { msk_owned_by_me(msk); @@ -287,38 +291,51 @@ static int mptcp_setsockopt_sol_socket_linger(struct = mptcp_sock *msk, sockptr_t return 0; } =20 -static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname, - sockptr_t optval, unsigned int optlen) +static int mptcp_setsockopt_sol_socket_first_sf_only(struct mptcp_sock *ms= k, int optname, + sockptr_t optval, unsigned int optlen) { struct sock *sk =3D (struct sock *)msk; struct sock *ssk; int ret; =20 + if (optname !=3D SO_REUSEPORT && optname !=3D SO_REUSEADDR && + optname !=3D SO_BINDTODEVICE && optname !=3D SO_BINDTOIFINDEX) + return -EOPNOTSUPP; + + lock_sock(sk); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) { + release_sock(sk); + return PTR_ERR(ssk); + } + + ret =3D sk_setsockopt(ssk, SOL_SOCKET, optname, optval, optlen); + if (ret =3D=3D 0) { + if (optname =3D=3D SO_REUSEPORT) + sk->sk_reuseport =3D ssk->sk_reuseport; + else if (optname =3D=3D SO_REUSEADDR) + sk->sk_reuse =3D ssk->sk_reuse; + else if (optname =3D=3D SO_BINDTODEVICE) + sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; + else if (optname =3D=3D SO_BINDTOIFINDEX) + sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; + } + release_sock(sk); + return ret; +} + +static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname, + sockptr_t optval, unsigned int optlen) +{ + struct sock *sk =3D (struct sock *)msk; + switch (optname) { case SO_REUSEPORT: case SO_REUSEADDR: case SO_BINDTODEVICE: case SO_BINDTOIFINDEX: - lock_sock(sk); - ssk =3D __mptcp_nmpc_sk(msk); - if (IS_ERR(ssk)) { - release_sock(sk); - return PTR_ERR(ssk); - } - - ret =3D sk_setsockopt(ssk, SOL_SOCKET, optname, optval, optlen); - if (ret =3D=3D 0) { - if (optname =3D=3D SO_REUSEPORT) - sk->sk_reuseport =3D ssk->sk_reuseport; - else if (optname =3D=3D SO_REUSEADDR) - sk->sk_reuse =3D ssk->sk_reuse; - else if (optname =3D=3D SO_BINDTODEVICE) - sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; - else if (optname =3D=3D SO_BINDTOIFINDEX) - sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; - } - release_sock(sk); - return ret; + return mptcp_setsockopt_first_sf_only(msk, SOL_SOCKET, optname, + optval, optlen); case SO_KEEPALIVE: case SO_PRIORITY: case SO_SNDBUF: @@ -806,6 +823,9 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_= sock *msk, int level, case SOL_TCP: return mptcp_setsockopt_sol_tcp_first_sf_only(msk, optname, optval, optlen); + case SOL_SOCKET: + return mptcp_setsockopt_sol_socket_first_sf_only(msk, optname, + optval, optlen); } =20 return -EOPNOTSUPP; --=20 2.48.1 From nobody Sun Feb 8 05:40:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 6E8DB27450 for ; Tue, 12 Aug 2025 08:17:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986657; cv=none; b=OEdPyybSQz8MEjNcRba/zNtbuuOxj26WCt8EqVy8wZriZZ2aRtVYyYB8qYzGa6feBt1JCW3uCwv2ywuiQewGoJQ4uhFJjIuhzmk6qr0ZAXuga4qRgyX+Ilv3IOxTms7C48it9/hWMFTfqU/RlHCe88457d0F0oymrv4OJhz54BU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986657; c=relaxed/simple; bh=HKyAP33UKW1qVWowU2/FdyTrO2t901A4bUW/9Czk6ZA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YXybghbBEBZeJ3CmI3CUswaGZtqwjPQhLTeJa1QqCWPRXSJf0zrXhsRHQtenD5ODlf1rzZKTEIXbMaX9Tt7l/VKSfnxTPQ7PqesSpfzlwVXtUv8iRQpXiqdVJMEaHyODB/rHTMxYM4uOtJemk6L+lXKxyyeYk08YpMxXSbIONSg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=vFUBkbdm; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="vFUBkbdm" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B6A84C4CEF4; Tue, 12 Aug 2025 08:17:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754986655; bh=HKyAP33UKW1qVWowU2/FdyTrO2t901A4bUW/9Czk6ZA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vFUBkbdmDvwV0i3vUyL7+LIeOszLatBRnvWO8uDH7pTqtSUA5jj3oMBNN7AHzW1l7 i8rzQ0repHPvnHhW4Sfl7SnDPMkMVza0NB/LwWMp/CSDKYiCuFCAQD7OARYC+P387k 76iFH9XNeXp2fT6Pl3xrCmPHBTjr4kpp0PpqCOszI159YIiLaIWDD/OL1RsTo3mcqa NAQCrlm+6fGM4jnfXTG8f/P6XCsCxq1fcOOHHJJFqUd2RdBO9ajq1sOIGspcMZ55EF Ayh2r+QtpkmDbFgWleAEhhsC0J6qnCN5SPw/1yAh4l3Bc4WnI+xI4kzzIg0eelxjr2 tk/F8nEGqRbww== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 3/6] mptcp: refactor IP socket option handling for first subflow Date: Tue, 12 Aug 2025 16:17:18 +0800 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Consolidate IP socket option logic with mptcp_setsockopt_first_sf_only() - the common setsockopt handler for first subflow. This function applies options (IP_TRANSPARENT, IP_BIND_ADDRESS_NO_PORT, IP_LOCAL_PORT_RANGE) to the first subflow and synchronizes values to the MPTCP socket. Improves code organization for future socket option implementations. Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 8017cbad0597..1ab3dbe5124e 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -703,8 +703,8 @@ static int __mptcp_setsockopt_sol_tcp_nodelay(struct mp= tcp_sock *msk, int val) return 0; } =20 -static int mptcp_setsockopt_sol_ip_set(struct mptcp_sock *msk, int optname, - sockptr_t optval, unsigned int optlen) +static int mptcp_setsockopt_sol_ip_first_sf_only(struct mptcp_sock *msk, i= nt optname, + sockptr_t optval, unsigned int optlen) { struct sock *sk =3D (struct sock *)msk; struct sock *ssk; @@ -785,7 +785,7 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, = int optname, case IP_TRANSPARENT: case IP_BIND_ADDRESS_NO_PORT: case IP_LOCAL_PORT_RANGE: - return mptcp_setsockopt_sol_ip_set(msk, optname, optval, optlen); + return mptcp_setsockopt_first_sf_only(msk, SOL_IP, optname, optval, optl= en); case IP_TOS: return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen); } @@ -826,6 +826,9 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_= sock *msk, int level, case SOL_SOCKET: return mptcp_setsockopt_sol_socket_first_sf_only(msk, optname, optval, optlen); + case SOL_IP: + return mptcp_setsockopt_sol_ip_first_sf_only(msk, optname, + optval, optlen); } =20 return -EOPNOTSUPP; --=20 2.48.1 From nobody Sun Feb 8 05:40:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 6E8A2DDC3 for ; Tue, 12 Aug 2025 08:17:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986657; cv=none; b=Q/gOIkPUUcbG6BUvoyg70QRJfLKYwOSrW5NF90/38i2Tmut2a2jxlHDULOvbT+N/WwcFSzGYZK9B1MBDTNCu+a97Fx4+AygSFyaExMfOFLbY+tYKExfQxF12wHKnllmHbq2lifwoL1W7jqv9vYkfK4wzWgEiPFgdcL6e0bioFN8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986657; c=relaxed/simple; bh=9Gy6VuXrWGCauyH+4uZtadIpH3a+QbAA7LrRxZidzno=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UAdWU4LrOuXGKhxNQsVFj3Wp2X65c9heH9Swdkg8FAesCmjXn8j84DMaieOIWzcvLA1rI6UKCMM2WsvVMwhjXl+EtKE0R/xep4yeRCnoFMB/fB4qk1x2pJh0YcjlYXjJBVDzSvy65FzNXoR+s7ONNvOp4X0smRuw41qpvEp9pf8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HtUMdfAc; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HtUMdfAc" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2B700C4CEF6; Tue, 12 Aug 2025 08:17:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754986657; bh=9Gy6VuXrWGCauyH+4uZtadIpH3a+QbAA7LrRxZidzno=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HtUMdfAcofiPCqt47tApH/8Simz47A539UUuEpFbdjJqz1J+GFqOPzJK0l8YY5UfG NwyWwAHFIyQHKEjb+9CibMzhJAgGDEzsdwR6hsMKxgGEcHEvytPrwdO+AbQzWXNhFx dlr6op8GjBeB6BMNOQF29iKEVR3hzxV0t4NOn95CFYJ9agJvEEY38xCwT7SAf/YJ9o s8xXuIymJuuHvUzsNH5WRyaTsUin7MtYAiwinSNbBg3gaDZ2dEFm2FKV1XiDc4iZaS pjQ4tiaOp9uqItLdacFSF8C8AbtvhzLO+xTqG6vbQ6YZAZx7RlSsHiEOb00xnbCB4r cOErTI3giKC3Q== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 4/6] mptcp: extract IPv6 socket option handling for first subflow Date: Tue, 12 Aug 2025 16:17:19 +0800 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Extract IPv6 socket option logic into dedicated helper function mptcp_setsockopt_sol_ipv6_first_sf_only(). This helper handles: 1. Options requiring first-subflow-only application: - IPV6_V6ONLY - IPV6_TRANSPARENT - IPV6_FREEBIND 2. Synchronization flow: a) Lock MPTCP socket b) Retrieve first subflow c) Apply option to subflow d) Update MPTCP socket state e) Increment option sequence counter The refactoring provides: - Clear separation of IPv6-specific logic - Consistent error handling - Reusable pattern for future IPv6 options - Improved code maintainability Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 80 ++++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 1ab3dbe5124e..964131ef82d8 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -401,51 +401,62 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_s= ock *msk, int optname, return -EOPNOTSUPP; } =20 -static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname, - sockptr_t optval, unsigned int optlen) +static int mptcp_setsockopt_sol_ipv6_first_sf_only(struct mptcp_sock *msk,= int optname, + sockptr_t optval, unsigned int optlen) { struct sock *sk =3D (struct sock *)msk; - int ret =3D -EOPNOTSUPP; struct sock *ssk; + int ret; + + if (optname !=3D IPV6_V6ONLY && optname !=3D IPV6_TRANSPARENT && + optname !=3D IPV6_FREEBIND) + return -EOPNOTSUPP; + + lock_sock(sk); + ssk =3D __mptcp_nmpc_sk(msk); + if (IS_ERR(ssk)) { + release_sock(sk); + return PTR_ERR(ssk); + } + + ret =3D tcp_setsockopt(ssk, SOL_IPV6, optname, optval, optlen); + if (ret !=3D 0) { + release_sock(sk); + return ret; + } + + sockopt_seq_inc(msk); =20 switch (optname) { case IPV6_V6ONLY: + sk->sk_ipv6only =3D ssk->sk_ipv6only; + break; case IPV6_TRANSPARENT: + inet_assign_bit(TRANSPARENT, sk, + inet_test_bit(TRANSPARENT, ssk)); + break; case IPV6_FREEBIND: - lock_sock(sk); - ssk =3D __mptcp_nmpc_sk(msk); - if (IS_ERR(ssk)) { - release_sock(sk); - return PTR_ERR(ssk); - } - - ret =3D tcp_setsockopt(ssk, SOL_IPV6, optname, optval, optlen); - if (ret !=3D 0) { - release_sock(sk); - return ret; - } - - sockopt_seq_inc(msk); + inet_assign_bit(FREEBIND, sk, + inet_test_bit(FREEBIND, ssk)); + break; + } =20 - switch (optname) { - case IPV6_V6ONLY: - sk->sk_ipv6only =3D ssk->sk_ipv6only; - break; - case IPV6_TRANSPARENT: - inet_assign_bit(TRANSPARENT, sk, - inet_test_bit(TRANSPARENT, ssk)); - break; - case IPV6_FREEBIND: - inet_assign_bit(FREEBIND, sk, - inet_test_bit(FREEBIND, ssk)); - break; - } + release_sock(sk); + return 0; +} =20 - release_sock(sk); - break; +static int mptcp_setsockopt_v6(struct mptcp_sock *msk, int optname, + sockptr_t optval, unsigned int optlen) +{ + switch (optname) { + case IPV6_V6ONLY: + case IPV6_TRANSPARENT: + case IPV6_FREEBIND: + return mptcp_setsockopt_first_sf_only(msk, SOL_IPV6, optname, + optval, optlen); } =20 - return ret; + return -EOPNOTSUPP; } =20 static bool mptcp_supported_sockopt(int level, int optname) @@ -829,6 +840,9 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_= sock *msk, int level, case SOL_IP: return mptcp_setsockopt_sol_ip_first_sf_only(msk, optname, optval, optlen); + case SOL_IPV6: + return mptcp_setsockopt_sol_ipv6_first_sf_only(msk, optname, + optval, optlen); } =20 return -EOPNOTSUPP; --=20 2.48.1 From nobody Sun Feb 8 05:40:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 365F6DDC3 for ; Tue, 12 Aug 2025 08:17:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986660; cv=none; b=tSpijWrbG5QNcU9GpET+abMlcRO2gBb3ZBEiOXVJhLPkzI+dgZevlHFO12FZbGjn+Ooxy7yW7xnly8B7fh9aScgW8cXjhV8QjNJNN8Xz/nEQLInZvYdmZkb1aaIrGyB4M1qgpzlzxwJPI7hYPI9FdsRYRHLtiKsy23CdH4W+MCE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986660; c=relaxed/simple; bh=EWwOYyAoARdNML8jinH/T8wESmxc0RqStwQnE81qJzA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=H1QC2l+O29hcF2iQHsFpynLCnMToUc9mZKzlKnGP4mq55DeHFWkkCSYuX6BesgZfRAFUwwEaPolSsAD4qqGY5M3jS0RfQVOlXJGRswZgOa3db/hx6LzIKEJNRSDr/eE3acXslMjtp32jDXTuR6Ae5fhdHVGC/b1FQ6RzbGVgPxU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Yfl4yOlC; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Yfl4yOlC" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 98C87C4CEF0; Tue, 12 Aug 2025 08:17:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754986658; bh=EWwOYyAoARdNML8jinH/T8wESmxc0RqStwQnE81qJzA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Yfl4yOlCVZKtjbH81w78sY3zipjMGaz9Kx1+3RkyBWGInBzLIqdKbcU1MIotdlbXS krYs6CPach3iC5JaaQgZezahg7efQWAF81BC1zp2R9F7LyqkrAX5lCaifHcbIcJlFD 3tstTXepXTpq7K64nzYBQxwwDcA65NujztMATpaJiUY7XBPE9olSSv2cILr6qQpboz gThZLrEX9R5iV78KSGo2DJy6vUpmA6tFpLEItjoU5rINlKSesrHB5RMiYBMXMqJos4 McHx+XT21y+KDWC90tg8NJ0csCSWxWv+JT21mIf1F5Xu4uollVVR9jUCokARzgJaR2 9WsJLIdlc96zA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 5/6] mptcp: handle SOL_TCP options on all subflows Date: Tue, 12 Aug 2025 16:17:20 +0800 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Implement mptcp_setsockopt_sol_tcp_all_sf() helper to apply TCP socket options to all existing subflows. This ensures consistent configuration across every subflow in the MPTCP connection. Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 964131ef82d8..81cc24125c29 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -848,9 +848,9 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_= sock *msk, int level, return -EOPNOTSUPP; } =20 -static int mptcp_setsockopt_all_sf(struct mptcp_sock *msk, int level, - int optname, sockptr_t optval, - unsigned int optlen) +static int mptcp_setsockopt_sol_tcp_all_sf(struct mptcp_sock *msk, + int optname, sockptr_t optval, + unsigned int optlen) { struct mptcp_subflow_context *subflow; int ret =3D 0; @@ -858,13 +858,26 @@ static int mptcp_setsockopt_all_sf(struct mptcp_sock = *msk, int level, mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); =20 - ret =3D tcp_setsockopt(ssk, level, optname, optval, optlen); + ret =3D tcp_setsockopt(ssk, SOL_TCP, optname, optval, optlen); if (ret) break; } return ret; } =20 +static int mptcp_setsockopt_all_sf(struct mptcp_sock *msk, int level, + int optname, sockptr_t optval, + unsigned int optlen) +{ + switch (level) { + case SOL_TCP: + return mptcp_setsockopt_sol_tcp_all_sf(msk, optname, + optval, optlen); + } + + return -EOPNOTSUPP; +} + static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname, sockptr_t optval, unsigned int optlen) { --=20 2.48.1 From nobody Sun Feb 8 05:40:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 A8D6E27450 for ; Tue, 12 Aug 2025 08:17:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986660; cv=none; b=a3sqTtR0Ejt6TRpTiZqewe3OHlGVbEf+cVhVye1D+/t9feXOojSNPw8wHm7g9JQiQZmEc2cMYoJpp2zPJhg/rIfG+eybi888CSGVmRvyHEIpe+//jPdblc94jVtI3+A4YlWEKmXW+xQp5n3zkTW8cVJ5PBCzPlOCWYCAhLBYGkw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754986660; c=relaxed/simple; bh=d4eHyUsqEWuxFUzViw5b3YGCaJ/gGgIn6GDpMFCj5HI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sjSgUEE0RECpxLA0x9rHSMqYsGJUUQstl4dw33uhI1ZsdAZX05rnfh2SckhADJ1S7ZM1OjpUyFLvj5mOH9jr4od1xOk4teXFY0TmSgBXNL8ygdsQqq1UG5rso7LGo8YY4kOrMjj/9FVAv2wulDL8fqEi+RyIz+b5fwXp20XdQdI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jLVDVm1l; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jLVDVm1l" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5A5C2C4CEF4; Tue, 12 Aug 2025 08:17:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1754986660; bh=d4eHyUsqEWuxFUzViw5b3YGCaJ/gGgIn6GDpMFCj5HI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jLVDVm1lMfWmGbisMpPFgabTTyDolYtj19/EUbqh0LM0YKED//QJnponE2YEVsz0I dItXd8sBd6r9uzJjWyQw7+Eto4ax5wnp9+GTOEzIb1gd/tj530oaerqX/azQKe+c4z 2KniZn2d+vWxGUeBmgbjxHWW1RQviCuSythOo/QBvs6NUciHsoq8i23BR1NMdx6fzp OLXxmc9I7rbtOJKo4f3x9iMsy7AfJid0TqpxnhHLsfsOrutASII8b5zG7Y45YcUay1 PdO490Nfxsg0ZsbKhwUdL9QWGzc0DFsj5gKhTfNla9yZxZLDvARYwsff/63y+fRTV1 kXvAg1U0hrwkA== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next 6/6] mptcp: handle IP socket options on all subflows Date: Tue, 12 Aug 2025 16:17:21 +0800 Message-ID: <921e437a6902a35ef313fd4fd50933fa95fa1d8f.1754986557.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Introduce mptcp_ip_setsockopt_all_sf() helper to consistently apply IP socket options across all MPTCP subflows. This helper: 1. Sets options on the main MPTCP socket 2. Propagates values to all existing subflows 3. Uses lock synchronization for atomic updates 4. Maintains option sequence counters Centralizes IP-level option handling for future options requiring subflow propagation. Signed-off-by: Geliang Tang --- net/mptcp/sockopt.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 81cc24125c29..f5579fd8b70d 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -20,6 +20,9 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int leve= l, int optname, sockptr_t optval, unsigned int optlen); +static int mptcp_setsockopt_all_sf(struct mptcp_sock *msk, int level, + int optname, sockptr_t optval, + unsigned int optlen); =20 static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk) { @@ -760,13 +763,17 @@ static int mptcp_setsockopt_sol_ip_first_sf_only(stru= ct mptcp_sock *msk, int opt return 0; } =20 -static int mptcp_setsockopt_v4_set_tos(struct mptcp_sock *msk, int optname, - sockptr_t optval, unsigned int optlen) +static int mptcp_setsockopt_sol_ip_all_sf(struct mptcp_sock *msk, + int optname, sockptr_t optval, + unsigned int optlen) { struct mptcp_subflow_context *subflow; struct sock *sk =3D (struct sock *)msk; int err, val; =20 + if (optname !=3D IP_TOS) + return -EOPNOTSUPP; + err =3D ip_setsockopt(sk, SOL_IP, optname, optval, optlen); =20 if (err !=3D 0) @@ -774,13 +781,15 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_s= ock *msk, int optname, =20 lock_sock(sk); sockopt_seq_inc(msk); - val =3D READ_ONCE(inet_sk(sk)->tos); + if (optname =3D=3D IP_TOS) + 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); - __ip_sock_set_tos(ssk, val); + if (optname =3D=3D IP_TOS) + __ip_sock_set_tos(ssk, val); unlock_sock_fast(ssk, slow); } release_sock(sk); @@ -798,7 +807,7 @@ static int mptcp_setsockopt_v4(struct mptcp_sock *msk, = int optname, case IP_LOCAL_PORT_RANGE: return mptcp_setsockopt_first_sf_only(msk, SOL_IP, optname, optval, optl= en); case IP_TOS: - return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen); + return mptcp_setsockopt_all_sf(msk, SOL_IP, optname, optval, optlen); } =20 return -EOPNOTSUPP; @@ -873,6 +882,9 @@ static int mptcp_setsockopt_all_sf(struct mptcp_sock *m= sk, int level, case SOL_TCP: return mptcp_setsockopt_sol_tcp_all_sf(msk, optname, optval, optlen); + case SOL_IP: + return mptcp_setsockopt_sol_ip_all_sf(msk, optname, + optval, optlen); } =20 return -EOPNOTSUPP; --=20 2.48.1