* [PATCH mptcp-next 0/6] refactor MPTCP socket option handling
@ 2025-08-12 8:17 Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 1/6] mptcp: add helper for setsockopt on first subflow only Geliang Tang
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-12 8:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
This series restructures MPTCP socket option implementation to improve
maintainability and consistency. We introduce dedicated helper functions
for different option levels (SOL_SOCKET, SOL_IP, SOL_IPV6, SOL_TCP) and
propagation scopes (first subflow vs. all subflows), addressing current
code fragmentation.
Geliang Tang (6):
mptcp: add helper for setsockopt on first subflow only
mptcp: handle SOL_SOCKET options on first subflow only
mptcp: refactor IP socket option handling for first subflow
mptcp: extract IPv6 socket option handling for first subflow
mptcp: handle SOL_TCP options on all subflows
mptcp: handle IP socket options on all subflows
net/mptcp/sockopt.c | 215 +++++++++++++++++++++++++++++---------------
1 file changed, 145 insertions(+), 70 deletions(-)
--
2.48.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH mptcp-next 1/6] mptcp: add helper for setsockopt on first subflow only
2025-08-12 8:17 [PATCH mptcp-next 0/6] refactor MPTCP socket option handling Geliang Tang
@ 2025-08-12 8:17 ` Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 2/6] mptcp: handle SOL_SOCKET options " Geliang Tang
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-12 8:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
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 <tanggeliang@kylinos.cn>
---
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;
}
-static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int level, 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 = (struct sock *)msk;
struct sock *ssk;
@@ -791,13 +791,26 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int level, int
goto unlock;
}
- ret = tcp_setsockopt(ssk, level, optname, optval, optlen);
+ ret = tcp_setsockopt(ssk, SOL_TCP, optname, optval, optlen);
unlock:
release_sock(sk);
return ret;
}
+static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int level,
+ 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)
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mptcp-next 2/6] mptcp: handle SOL_SOCKET options on first subflow only
2025-08-12 8:17 [PATCH mptcp-next 0/6] refactor MPTCP socket option handling Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 1/6] mptcp: add helper for setsockopt on first subflow only Geliang Tang
@ 2025-08-12 8:17 ` Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 3/6] mptcp: refactor IP socket option handling for first subflow Geliang Tang
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-12 8:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
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 <tanggeliang@kylinos.cn>
---
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
+static int mptcp_setsockopt_first_sf_only(struct mptcp_sock *msk, int level,
+ 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;
}
-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 *msk, int optname,
+ sockptr_t optval, unsigned int optlen)
{
struct sock *sk = (struct sock *)msk;
struct sock *ssk;
int ret;
+ if (optname != SO_REUSEPORT && optname != SO_REUSEADDR &&
+ optname != SO_BINDTODEVICE && optname != SO_BINDTOIFINDEX)
+ return -EOPNOTSUPP;
+
+ lock_sock(sk);
+ ssk = __mptcp_nmpc_sk(msk);
+ if (IS_ERR(ssk)) {
+ release_sock(sk);
+ return PTR_ERR(ssk);
+ }
+
+ ret = sk_setsockopt(ssk, SOL_SOCKET, optname, optval, optlen);
+ if (ret == 0) {
+ if (optname == SO_REUSEPORT)
+ sk->sk_reuseport = ssk->sk_reuseport;
+ else if (optname == SO_REUSEADDR)
+ sk->sk_reuse = ssk->sk_reuse;
+ else if (optname == SO_BINDTODEVICE)
+ sk->sk_bound_dev_if = ssk->sk_bound_dev_if;
+ else if (optname == SO_BINDTOIFINDEX)
+ sk->sk_bound_dev_if = 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 = (struct sock *)msk;
+
switch (optname) {
case SO_REUSEPORT:
case SO_REUSEADDR:
case SO_BINDTODEVICE:
case SO_BINDTOIFINDEX:
- lock_sock(sk);
- ssk = __mptcp_nmpc_sk(msk);
- if (IS_ERR(ssk)) {
- release_sock(sk);
- return PTR_ERR(ssk);
- }
-
- ret = sk_setsockopt(ssk, SOL_SOCKET, optname, optval, optlen);
- if (ret == 0) {
- if (optname == SO_REUSEPORT)
- sk->sk_reuseport = ssk->sk_reuseport;
- else if (optname == SO_REUSEADDR)
- sk->sk_reuse = ssk->sk_reuse;
- else if (optname == SO_BINDTODEVICE)
- sk->sk_bound_dev_if = ssk->sk_bound_dev_if;
- else if (optname == SO_BINDTOIFINDEX)
- sk->sk_bound_dev_if = 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);
}
return -EOPNOTSUPP;
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mptcp-next 3/6] mptcp: refactor IP socket option handling for first subflow
2025-08-12 8:17 [PATCH mptcp-next 0/6] refactor MPTCP socket option handling Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 1/6] mptcp: add helper for setsockopt on first subflow only Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 2/6] mptcp: handle SOL_SOCKET options " Geliang Tang
@ 2025-08-12 8:17 ` Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 4/6] mptcp: extract IPv6 " Geliang Tang
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-12 8:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
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 <tanggeliang@kylinos.cn>
---
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 mptcp_sock *msk, int val)
return 0;
}
-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, int optname,
+ sockptr_t optval, unsigned int optlen)
{
struct sock *sk = (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, optlen);
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);
}
return -EOPNOTSUPP;
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mptcp-next 4/6] mptcp: extract IPv6 socket option handling for first subflow
2025-08-12 8:17 [PATCH mptcp-next 0/6] refactor MPTCP socket option handling Geliang Tang
` (2 preceding siblings ...)
2025-08-12 8:17 ` [PATCH mptcp-next 3/6] mptcp: refactor IP socket option handling for first subflow Geliang Tang
@ 2025-08-12 8:17 ` Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 5/6] mptcp: handle SOL_TCP options on all subflows Geliang Tang
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-12 8:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
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 <tanggeliang@kylinos.cn>
---
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_sock *msk, int optname,
return -EOPNOTSUPP;
}
-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 = (struct sock *)msk;
- int ret = -EOPNOTSUPP;
struct sock *ssk;
+ int ret;
+
+ if (optname != IPV6_V6ONLY && optname != IPV6_TRANSPARENT &&
+ optname != IPV6_FREEBIND)
+ return -EOPNOTSUPP;
+
+ lock_sock(sk);
+ ssk = __mptcp_nmpc_sk(msk);
+ if (IS_ERR(ssk)) {
+ release_sock(sk);
+ return PTR_ERR(ssk);
+ }
+
+ ret = tcp_setsockopt(ssk, SOL_IPV6, optname, optval, optlen);
+ if (ret != 0) {
+ release_sock(sk);
+ return ret;
+ }
+
+ sockopt_seq_inc(msk);
switch (optname) {
case IPV6_V6ONLY:
+ sk->sk_ipv6only = 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 = __mptcp_nmpc_sk(msk);
- if (IS_ERR(ssk)) {
- release_sock(sk);
- return PTR_ERR(ssk);
- }
-
- ret = tcp_setsockopt(ssk, SOL_IPV6, optname, optval, optlen);
- if (ret != 0) {
- release_sock(sk);
- return ret;
- }
-
- sockopt_seq_inc(msk);
+ inet_assign_bit(FREEBIND, sk,
+ inet_test_bit(FREEBIND, ssk));
+ break;
+ }
- switch (optname) {
- case IPV6_V6ONLY:
- sk->sk_ipv6only = 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;
+}
- 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);
}
- return ret;
+ return -EOPNOTSUPP;
}
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);
}
return -EOPNOTSUPP;
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mptcp-next 5/6] mptcp: handle SOL_TCP options on all subflows
2025-08-12 8:17 [PATCH mptcp-next 0/6] refactor MPTCP socket option handling Geliang Tang
` (3 preceding siblings ...)
2025-08-12 8:17 ` [PATCH mptcp-next 4/6] mptcp: extract IPv6 " Geliang Tang
@ 2025-08-12 8:17 ` Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 6/6] mptcp: handle IP socket " Geliang Tang
2025-08-12 10:39 ` [PATCH mptcp-next 0/6] refactor MPTCP socket option handling MPTCP CI
6 siblings, 0 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-12 8:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
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 <tanggeliang@kylinos.cn>
---
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;
}
-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 = 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 = mptcp_subflow_tcp_sock(subflow);
- ret = tcp_setsockopt(ssk, level, optname, optval, optlen);
+ ret = tcp_setsockopt(ssk, SOL_TCP, optname, optval, optlen);
if (ret)
break;
}
return ret;
}
+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)
{
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mptcp-next 6/6] mptcp: handle IP socket options on all subflows
2025-08-12 8:17 [PATCH mptcp-next 0/6] refactor MPTCP socket option handling Geliang Tang
` (4 preceding siblings ...)
2025-08-12 8:17 ` [PATCH mptcp-next 5/6] mptcp: handle SOL_TCP options on all subflows Geliang Tang
@ 2025-08-12 8:17 ` Geliang Tang
2025-08-12 10:39 ` [PATCH mptcp-next 0/6] refactor MPTCP socket option handling MPTCP CI
6 siblings, 0 replies; 8+ messages in thread
From: Geliang Tang @ 2025-08-12 8:17 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
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 <tanggeliang@kylinos.cn>
---
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 level,
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);
static struct sock *__mptcp_tcp_fallback(struct mptcp_sock *msk)
{
@@ -760,13 +763,17 @@ static int mptcp_setsockopt_sol_ip_first_sf_only(struct mptcp_sock *msk, int opt
return 0;
}
-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 = (struct sock *)msk;
int err, val;
+ if (optname != IP_TOS)
+ return -EOPNOTSUPP;
+
err = ip_setsockopt(sk, SOL_IP, optname, optval, optlen);
if (err != 0)
@@ -774,13 +781,15 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_sock *msk, int optname,
lock_sock(sk);
sockopt_seq_inc(msk);
- val = READ_ONCE(inet_sk(sk)->tos);
+ if (optname == IP_TOS)
+ val = READ_ONCE(inet_sk(sk)->tos);
mptcp_for_each_subflow(msk, subflow) {
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
bool slow;
slow = lock_sock_fast(ssk);
- __ip_sock_set_tos(ssk, val);
+ if (optname == 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, optlen);
case IP_TOS:
- return mptcp_setsockopt_v4_set_tos(msk, optname, optval, optlen);
+ return mptcp_setsockopt_all_sf(msk, SOL_IP, optname, optval, optlen);
}
return -EOPNOTSUPP;
@@ -873,6 +882,9 @@ static int mptcp_setsockopt_all_sf(struct mptcp_sock *msk, 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);
}
return -EOPNOTSUPP;
--
2.48.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH mptcp-next 0/6] refactor MPTCP socket option handling
2025-08-12 8:17 [PATCH mptcp-next 0/6] refactor MPTCP socket option handling Geliang Tang
` (5 preceding siblings ...)
2025-08-12 8:17 ` [PATCH mptcp-next 6/6] mptcp: handle IP socket " Geliang Tang
@ 2025-08-12 10:39 ` MPTCP CI
6 siblings, 0 replies; 8+ messages in thread
From: MPTCP CI @ 2025-08-12 10:39 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
Hi Geliang,
Thank you for your modifications, that's great!
Our CI did some validations and here is its report:
- KVM Validation: normal: Unstable: 1 failed test(s): selftest_mptcp_connect 🔴
- KVM Validation: debug: Unstable: 1 failed test(s): packetdrill_mp_join 🔴
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/16903519178
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/54fd10adb571
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=990414
If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:
$ cd [kernel source code]
$ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
--pull always mptcp/mptcp-upstream-virtme-docker:latest \
auto-normal
For more details:
https://github.com/multipath-tcp/mptcp-upstream-virtme-docker
Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-08-12 10:39 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-12 8:17 [PATCH mptcp-next 0/6] refactor MPTCP socket option handling Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 1/6] mptcp: add helper for setsockopt on first subflow only Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 2/6] mptcp: handle SOL_SOCKET options " Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 3/6] mptcp: refactor IP socket option handling for first subflow Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 4/6] mptcp: extract IPv6 " Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 5/6] mptcp: handle SOL_TCP options on all subflows Geliang Tang
2025-08-12 8:17 ` [PATCH mptcp-next 6/6] mptcp: handle IP socket " Geliang Tang
2025-08-12 10:39 ` [PATCH mptcp-next 0/6] refactor MPTCP socket option handling MPTCP CI
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.