* [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