* [RFC mptcp-next 00/10] MPTCP KTLS support
@ 2025-11-18 4:01 Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 01/10] selftests: mptcp: sockopt: add protocol arguments Geliang Tang
` (11 more replies)
0 siblings, 12 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
This series adds KTLS support for MPTCP. Since the ULP of msk is not being
used, ULP KTLS can be directly configured onto msk without affecting its
communication.
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/480
Depends on: implement mptcp read_sock, v13
Based-on: <cover.1761198660.git.geliang@kernel.org>
Geliang Tang (10):
selftests: mptcp: sockopt: add protocol arguments
selftests: mptcp: sockopt: skip mptcp getsockopt for tcp tests
selftests: mptcp: sockopt: add TLS argument support
selftests: mptcp: sockopt: implement TCP TLS tests
tls: add MPTCP protocol support
mptcp: enable TLS socket options
selftests: mptcp: connect: enhance TCP ULP testing
selftests: mptcp: connect: skip TLS in disconnect tests
selftests: mptcp: connect: fix uninitialized variable warning
selftests: mptcp: sockopt: add MPTCP TLS test cases
include/net/mptcp.h | 34 ++++++
net/mptcp/protocol.c | 61 ++++++++--
net/mptcp/sockopt.c | 18 ++-
net/tls/tls_main.c | 7 +-
net/tls/tls_strp.c | 20 ++-
tools/testing/selftests/net/mptcp/config | 1 +
.../selftests/net/mptcp/mptcp_connect.c | 42 ++++---
.../selftests/net/mptcp/mptcp_sockopt.c | 114 +++++++++++++++---
.../selftests/net/mptcp/mptcp_sockopt.sh | 47 ++++++++
9 files changed, 297 insertions(+), 47 deletions(-)
--
2.51.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [RFC mptcp-next 01/10] selftests: mptcp: sockopt: add protocol arguments
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 02/10] selftests: mptcp: sockopt: skip mptcp getsockopt for tcp tests Geliang Tang
` (10 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Add -t and -r options to specify tx/rx protocols (TCP/MPTCP). This
increases testing flexibility by allowing explicit protocol selection
for both transmission and reception paths.
These codes are from mptcp_inq.c.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 29 +++++++++++++++----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 286164f7246e..e4752f848f08 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -27,6 +27,8 @@
#include <linux/tcp.h>
static int pf = AF_INET;
+static int proto_tx = IPPROTO_MPTCP;
+static int proto_rx = IPPROTO_MPTCP;
#ifndef IPPROTO_MPTCP
#define IPPROTO_MPTCP 262
@@ -135,7 +137,7 @@ static void die_perror(const char *msg)
static void die_usage(int r)
{
- fprintf(stderr, "Usage: mptcp_sockopt [-6]\n");
+ fprintf(stderr, "Usage: mptcp_sockopt [-6] [-t tcp|mptcp] [-r tcp|mptcp]\n");
exit(r);
}
@@ -201,7 +203,7 @@ static int sock_listen_mptcp(const char * const listenaddr,
hints.ai_family = pf;
for (a = addr; a; a = a->ai_next) {
- sock = socket(a->ai_family, a->ai_socktype, IPPROTO_MPTCP);
+ sock = socket(a->ai_family, a->ai_socktype, proto_rx);
if (sock < 0)
continue;
@@ -259,11 +261,22 @@ static int sock_connect_mptcp(const char * const remoteaddr,
return sock;
}
+static int protostr_to_num(const char *s)
+{
+ if (strcasecmp(s, "tcp") == 0)
+ return IPPROTO_TCP;
+ if (strcasecmp(s, "mptcp") == 0)
+ return IPPROTO_MPTCP;
+
+ die_usage(1);
+ return 0;
+}
+
static void parse_opts(int argc, char **argv)
{
int c;
- while ((c = getopt(argc, argv, "h6")) != -1) {
+ while ((c = getopt(argc, argv, "h6t:r:")) != -1) {
switch (c) {
case 'h':
die_usage(0);
@@ -271,6 +284,12 @@ static void parse_opts(int argc, char **argv)
case '6':
pf = AF_INET6;
break;
+ case 't':
+ proto_tx = protostr_to_num(optarg);
+ break;
+ case 'r':
+ proto_rx = protostr_to_num(optarg);
+ break;
default:
die_usage(1);
break;
@@ -776,10 +795,10 @@ static int client(int pipefd)
switch (pf) {
case AF_INET:
- fd = sock_connect_mptcp("127.0.0.1", "15432", IPPROTO_MPTCP);
+ fd = sock_connect_mptcp("127.0.0.1", "15432", proto_tx);
break;
case AF_INET6:
- fd = sock_connect_mptcp("::1", "15432", IPPROTO_MPTCP);
+ fd = sock_connect_mptcp("::1", "15432", proto_tx);
break;
default:
xerror("Unknown pf %d\n", pf);
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC mptcp-next 02/10] selftests: mptcp: sockopt: skip mptcp getsockopt for tcp tests
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 01/10] selftests: mptcp: sockopt: add protocol arguments Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 03/10] selftests: mptcp: sockopt: add TLS argument support Geliang Tang
` (9 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Skip mptcp getsockopt checks during tcp tests since MPTCP socket options
are not available for them.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 21 ++++++++-----------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index e4752f848f08..59c07eda12cd 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -384,7 +384,7 @@ static void do_getsockopt_mptcp_info(struct so_state *s, int fd, size_t w)
ret = getsockopt(fd, SOL_MPTCP, MPTCP_INFO, &i, &olen);
if (ret < 0)
- die_perror("getsockopt MPTCP_INFO");
+ return;
s->pkt_stats_avail = olen >= sizeof(i);
@@ -415,7 +415,7 @@ static void do_getsockopt_tcp_info(struct so_state *s, int fd, size_t r, size_t
ret = getsockopt(fd, SOL_MPTCP, MPTCP_TCPINFO, &ti, &olen);
if (ret < 0)
- xerror("getsockopt MPTCP_TCPINFO (tries %d, %m)");
+ return;
assert(olen <= sizeof(ti));
assert(ti.d.size_kernel > 0);
@@ -470,7 +470,7 @@ static void do_getsockopt_subflow_addrs(struct so_state *s, int fd)
ret = getsockopt(fd, SOL_MPTCP, MPTCP_SUBFLOW_ADDRS, &addrs, &olen);
if (ret < 0)
- die_perror("getsockopt MPTCP_SUBFLOW_ADDRS");
+ return;
assert(olen <= sizeof(addrs));
assert(addrs.d.size_kernel > 0);
@@ -540,13 +540,8 @@ static void do_getsockopt_mptcp_full_info(struct so_state *s, int fd)
olen = data_size;
ret = getsockopt(fd, SOL_MPTCP, MPTCP_FULL_INFO, &mfi, &olen);
- if (ret < 0) {
- if (errno == EOPNOTSUPP) {
- perror("MPTCP_FULL_INFO test skipped");
- return;
- }
- xerror("getsockopt MPTCP_FULL_INFO");
- }
+ if (ret < 0)
+ return;
assert(olen <= data_size);
assert(mfi.size_tcpinfo_kernel > 0);
@@ -650,7 +645,8 @@ static void connect_one_server(int fd, int pipefd)
if (eof)
total += 1; /* sequence advances due to FIN */
- assert(s.mptcpi_rcv_delta == (uint64_t)total);
+ if (s.mptcpi_rcv_delta)
+ assert(s.mptcpi_rcv_delta == (uint64_t)total);
close(fd);
}
@@ -685,7 +681,8 @@ static void process_one_client(int fd, int pipefd)
xerror("expected EOF, got %lu", ret3);
do_getsockopts(&s, fd, ret, ret2);
- if (s.mptcpi_rcv_delta != (uint64_t)ret + 1)
+ if (s.mptcpi_rcv_delta &&
+ s.mptcpi_rcv_delta != (uint64_t)ret + 1)
xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64 ", diff %" PRId64,
s.mptcpi_rcv_delta, ret + 1, s.mptcpi_rcv_delta - (ret + 1));
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC mptcp-next 03/10] selftests: mptcp: sockopt: add TLS argument support
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 01/10] selftests: mptcp: sockopt: add protocol arguments Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 02/10] selftests: mptcp: sockopt: skip mptcp getsockopt for tcp tests Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 04/10] selftests: mptcp: sockopt: implement TCP TLS tests Geliang Tang
` (8 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Add a new command line option '-c' to the mptcp_sockopt test program
to enable TLS testing functionality. This prepares for subsequent
TLS-over-MPTCP test implementations.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 59c07eda12cd..5e1e441c959d 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -29,6 +29,7 @@
static int pf = AF_INET;
static int proto_tx = IPPROTO_MPTCP;
static int proto_rx = IPPROTO_MPTCP;
+static bool tls;
#ifndef IPPROTO_MPTCP
#define IPPROTO_MPTCP 262
@@ -137,7 +138,7 @@ static void die_perror(const char *msg)
static void die_usage(int r)
{
- fprintf(stderr, "Usage: mptcp_sockopt [-6] [-t tcp|mptcp] [-r tcp|mptcp]\n");
+ fprintf(stderr, "Usage: mptcp_sockopt [-6] [-t tcp|mptcp] [-r tcp|mptcp] [-c]\n");
exit(r);
}
@@ -276,7 +277,7 @@ static void parse_opts(int argc, char **argv)
{
int c;
- while ((c = getopt(argc, argv, "h6t:r:")) != -1) {
+ while ((c = getopt(argc, argv, "h6t:r:c")) != -1) {
switch (c) {
case 'h':
die_usage(0);
@@ -289,6 +290,8 @@ static void parse_opts(int argc, char **argv)
break;
case 'r':
proto_rx = protostr_to_num(optarg);
+ case 'c':
+ tls = true;
break;
default:
die_usage(1);
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC mptcp-next 04/10] selftests: mptcp: sockopt: implement TCP TLS tests
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
` (2 preceding siblings ...)
2025-11-18 4:01 ` [RFC mptcp-next 03/10] selftests: mptcp: sockopt: add TLS argument support Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 05/10] tls: add MPTCP protocol support Geliang Tang
` (7 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Add Kernel TLS (KTLS) testing infrastructure to mptcp_sockopt, including:
- TLS socket option configuration helpers
- TCP-specific TLS test cases for both IPv4 and IPv6
- Required TLS header includes and configuration updates
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
tools/testing/selftests/net/mptcp/config | 1 +
.../selftests/net/mptcp/mptcp_sockopt.c | 56 +++++++++++++++++++
.../selftests/net/mptcp/mptcp_sockopt.sh | 35 ++++++++++++
3 files changed, 92 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/config b/tools/testing/selftests/net/mptcp/config
index 59051ee2a986..18bd29ac5b24 100644
--- a/tools/testing/selftests/net/mptcp/config
+++ b/tools/testing/selftests/net/mptcp/config
@@ -34,3 +34,4 @@ CONFIG_NFT_SOCKET=m
CONFIG_NFT_TPROXY=m
CONFIG_SYN_COOKIES=y
CONFIG_VETH=y
+CONFIG_TLS=y
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 5e1e441c959d..8058b1fd5a35 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -25,6 +25,7 @@
#include <netinet/in.h>
#include <linux/tcp.h>
+#include <linux/tls.h>
static int pf = AF_INET;
static int proto_tx = IPPROTO_MPTCP;
@@ -37,6 +38,9 @@ static bool tls;
#ifndef SOL_MPTCP
#define SOL_MPTCP 284
#endif
+#ifndef TCP_ULP
+#define TCP_ULP 31
+#endif
#ifndef MPTCP_INFO
struct mptcp_info {
@@ -185,6 +189,52 @@ static void xgetaddrinfo(const char *node, const char *service,
}
}
+static int do_setsockopt_tls(int fd)
+{
+ struct tls12_crypto_info_aes_gcm_128 tls_tx = {
+ .info = {
+ .version = TLS_1_2_VERSION,
+ .cipher_type = TLS_CIPHER_AES_GCM_128,
+ },
+ };
+ struct tls12_crypto_info_aes_gcm_128 tls_rx = {
+ .info = {
+ .version = TLS_1_2_VERSION,
+ .cipher_type = TLS_CIPHER_AES_GCM_128,
+ },
+ };
+ int so_buf = 6553500;
+ int err;
+
+ err = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
+ if (err) {
+ perror("setsockopt TCP_ULP");
+ return err;
+ }
+ err = setsockopt(fd, SOL_TLS, TLS_TX, (void *)&tls_tx, sizeof(tls_tx));
+ if (err) {
+ perror("setsockopt TLS_TX");
+ return err;
+ }
+ err = setsockopt(fd, SOL_TLS, TLS_RX, (void *)&tls_rx, sizeof(tls_rx));
+ if (err) {
+ perror("setsockopt TLS_RX");
+ return err;
+ }
+ err = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &so_buf, sizeof(so_buf));
+ if (err) {
+ perror("setsockopt SO_SNDBUF");
+ return err;
+ }
+ err = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &so_buf, sizeof(so_buf));
+ if (err) {
+ perror("setsockopt SO_RCVBUF");
+ return err;
+ }
+
+ return 0;
+}
+
static int sock_listen_mptcp(const char * const listenaddr,
const char * const port)
{
@@ -743,6 +793,9 @@ static int server(int pipefd)
alarm(15);
r = xaccept(fd);
+ if (tls)
+ do_setsockopt_tls(r);
+
process_one_client(r, pipefd);
close(fd);
@@ -806,6 +859,9 @@ static int client(int pipefd)
test_ip_tos_sockopt(fd);
+ if (tls)
+ do_setsockopt_tls(fd);
+
connect_one_server(fd, pipefd);
return 0;
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
index ab8bce06b262..4d6ab4a63e3f 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -351,6 +351,40 @@ do_tcpinq_tests()
return $?
}
+do_tls_test()
+{
+ print_title "KTLS $*" | head -c 53
+ ip netns exec "$ns_sbox" ./mptcp_sockopt "$@"
+ local lret=$?
+ if [ $lret -ne 0 ];then
+ ret=$lret
+ mptcp_lib_pr_fail
+ mptcp_lib_result_fail "KTLS: $*"
+ return $lret
+ fi
+
+ mptcp_lib_pr_ok
+ mptcp_lib_result_pass "KTLS: $*"
+ return $lret
+}
+
+do_tls_tests()
+{
+ local lret=0
+
+ mptcp_lib_print_info "sockopt KTLS"
+
+ # TCP KTLS
+ do_tls_test -c -t tcp -r tcp
+ lret=$?
+ if [ $lret -ne 0 ] ; then
+ return $lret
+ fi
+ do_tls_test -6 -c -t tcp -r tcp
+ lret=$?
+ return $lret
+}
+
sin=$(mktemp)
sout=$(mktemp)
cin=$(mktemp)
@@ -366,6 +400,7 @@ run_tests $ns1 $ns2 dead:beef:1::1
do_mptcp_sockopt_tests
do_tcpinq_tests
+do_tls_tests
mptcp_lib_result_print_all_tap
exit $ret
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC mptcp-next 05/10] tls: add MPTCP protocol support
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
` (3 preceding siblings ...)
2025-11-18 4:01 ` [RFC mptcp-next 04/10] selftests: mptcp: sockopt: implement TCP TLS tests Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 06/10] mptcp: enable TLS socket options Geliang Tang
` (6 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang, Gang Yan
From: Geliang Tang <tanggeliang@kylinos.cn>
Extend TLS subsystem to support MPTCP protocol by implementing
MPTCP-specific versions of key operations:
- mptcp_sendmsg_locked() for TLS record transmission
- mptcp_inq_hint() and mptcp_recv_skb() for receive side handling
- mptcp_read_sock() and mptcp_read_done() for data reading
Signed-off-by: Gang Yan <yangang@kylinos.cn>
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
include/net/mptcp.h | 34 ++++++++++++++++++++++++
net/mptcp/protocol.c | 61 ++++++++++++++++++++++++++++++++++++++------
net/tls/tls_main.c | 7 +++--
net/tls/tls_strp.c | 20 ++++++++++++---
4 files changed, 108 insertions(+), 14 deletions(-)
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 4cf59e83c1c5..6efa70d93353 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -237,6 +237,17 @@ static inline __be32 mptcp_reset_option(const struct sk_buff *skb)
}
void mptcp_active_detect_blackhole(struct sock *sk, bool expired);
+
+int mptcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t len);
+
+unsigned int mptcp_inq_hint(const struct sock *sk);
+
+struct sk_buff *mptcp_recv_skb(struct sock *sk, u32 *off);
+
+int mptcp_read_sock(struct sock *sk, read_descriptor_t *desc,
+ sk_read_actor_t recv_actor);
+
+void mptcp_read_done(struct sock *sk, size_t len);
#else
static inline void mptcp_init(void)
@@ -323,6 +334,29 @@ static inline struct request_sock *mptcp_subflow_reqsk_alloc(const struct reques
static inline __be32 mptcp_reset_option(const struct sk_buff *skb) { return htonl(0u); }
static inline void mptcp_active_detect_blackhole(struct sock *sk, bool expired) { }
+
+static inline int mptcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t len)
+{
+ return 0;
+}
+
+static inline unsigned int mptcp_inq_hint(const struct sock *sk)
+{
+ return 0;
+}
+
+static inline struct sk_buff *mptcp_recv_skb(struct sock *sk, u32 *off)
+{
+ return NULL;
+}
+
+static inline int mptcp_read_sock(struct sock *sk, read_descriptor_t *desc,
+ sk_read_actor_t recv_actor)
+{
+ return 0;
+}
+
+static inline void mptcp_read_done(struct sock *sk, size_t len) { }
#endif /* CONFIG_MPTCP */
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 873c1a93b777..a9181e71bc66 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1861,7 +1861,7 @@ static void mptcp_rps_record_subflows(const struct mptcp_sock *msk)
}
}
-static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
+int mptcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t len)
{
struct mptcp_sock *msk = mptcp_sk(sk);
struct page_frag *pfrag;
@@ -1872,8 +1872,6 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
/* silently ignore everything else */
msg->msg_flags &= MSG_MORE | MSG_DONTWAIT | MSG_NOSIGNAL | MSG_FASTOPEN;
- lock_sock(sk);
-
mptcp_rps_record_subflows(msk);
if (unlikely(inet_test_bit(DEFER_CONNECT, sk) ||
@@ -1981,7 +1979,6 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
__mptcp_push_pending(sk, msg->msg_flags);
out:
- release_sock(sk);
return copied;
do_error:
@@ -1992,6 +1989,17 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
goto out;
}
+static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
+{
+ int ret;
+
+ lock_sock(sk);
+ ret = mptcp_sendmsg_locked(sk, msg, len);
+ release_sock(sk);
+
+ return ret;
+}
+
static void mptcp_rcv_space_adjust(struct mptcp_sock *msk, int copied);
static void mptcp_eat_recv_skb(struct sock *sk, struct sk_buff *skb)
@@ -2223,7 +2231,7 @@ static bool mptcp_move_skbs(struct sock *sk)
return enqueued;
}
-static unsigned int mptcp_inq_hint(const struct sock *sk)
+unsigned int mptcp_inq_hint(const struct sock *sk)
{
const struct mptcp_sock *msk = mptcp_sk(sk);
const struct sk_buff *skb;
@@ -4271,7 +4279,7 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock,
return mask;
}
-static struct sk_buff *mptcp_recv_skb(struct sock *sk, u32 *off)
+struct sk_buff *mptcp_recv_skb(struct sock *sk, u32 *off)
{
struct mptcp_sock *msk = mptcp_sk(sk);
struct sk_buff *skb;
@@ -4295,8 +4303,8 @@ static struct sk_buff *mptcp_recv_skb(struct sock *sk, u32 *off)
* Note:
* - It is assumed that the socket was locked by the caller.
*/
-static int mptcp_read_sock(struct sock *sk, read_descriptor_t *desc,
- sk_read_actor_t recv_actor)
+int mptcp_read_sock(struct sock *sk, read_descriptor_t *desc,
+ sk_read_actor_t recv_actor)
{
struct mptcp_sock *msk = mptcp_sk(sk);
size_t len = sk->sk_rcvbuf;
@@ -4453,6 +4461,43 @@ static ssize_t mptcp_splice_read(struct socket *sock, loff_t *ppos,
return ret;
}
+void mptcp_read_done(struct sock *sk, size_t len)
+{
+ struct mptcp_sock *msk = mptcp_sk(sk);
+ struct sk_buff *skb;
+ size_t left;
+ u32 offset;
+
+ sock_owned_by_me(sk);
+
+ if (sk->sk_state == TCP_LISTEN)
+ return;
+
+ left = len;
+ while (left && (skb = mptcp_recv_skb(sk, &offset)) != NULL) {
+ int used;
+
+ used = min_t(size_t, skb->len - offset, left);
+ left -= used;
+ MPTCP_SKB_CB(skb)->offset += used;
+ MPTCP_SKB_CB(skb)->map_seq += used;
+
+ if (skb->len > offset + used)
+ break;
+
+ mptcp_eat_recv_skb(sk, skb);
+ }
+
+ mptcp_rcv_space_adjust(msk, len - left);
+
+ /* Clean up data we have read: This will do ACK frames. */
+ if (left != len) {
+ mptcp_recv_skb(sk, &offset);
+ mptcp_cleanup_rbuf(msk, len - left);
+ }
+}
+EXPORT_SYMBOL(mptcp_read_done);
+
static const struct proto_ops mptcp_stream_ops = {
.family = PF_INET,
.owner = THIS_MODULE,
diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c
index 56ce0bc8317b..eb1842722267 100644
--- a/net/tls/tls_main.c
+++ b/net/tls/tls_main.c
@@ -194,7 +194,9 @@ int tls_push_sg(struct sock *sk,
bvec_set_page(&bvec, p, size, offset);
iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, size);
- ret = tcp_sendmsg_locked(sk, &msg, size);
+ ret = sk->sk_protocol == IPPROTO_MPTCP ?
+ mptcp_sendmsg_locked(sk, &msg, size) :
+ tcp_sendmsg_locked(sk, &msg, size);
if (ret != size) {
if (ret > 0) {
@@ -401,6 +403,7 @@ static void tls_sk_proto_close(struct sock *sk, long timeout)
static __poll_t tls_sk_poll(struct file *file, struct socket *sock,
struct poll_table_struct *wait)
{
+ const struct proto_ops *ops = READ_ONCE(sock->ops);
struct tls_sw_context_rx *ctx;
struct tls_context *tls_ctx;
struct sock *sk = sock->sk;
@@ -409,7 +412,7 @@ static __poll_t tls_sk_poll(struct file *file, struct socket *sock,
u8 shutdown;
int state;
- mask = tcp_poll(file, sock, wait);
+ mask = ops->poll(file, sock, wait);
state = inet_sk_state_load(sk);
shutdown = READ_ONCE(sk->sk_shutdown);
diff --git a/net/tls/tls_strp.c b/net/tls/tls_strp.c
index 98e12f0ff57e..3985e77f3351 100644
--- a/net/tls/tls_strp.c
+++ b/net/tls/tls_strp.c
@@ -132,6 +132,8 @@ int tls_strp_msg_cow(struct tls_sw_context_rx *ctx)
tls_strp_anchor_free(strp);
strp->anchor = skb;
+ strp->sk->sk_protocol == IPPROTO_MPTCP ?
+ mptcp_read_done(strp->sk, strp->stm.full_len) :
tcp_read_done(strp->sk, strp->stm.full_len);
strp->copy_mode = 1;
@@ -383,6 +385,8 @@ static int tls_strp_read_copyin(struct tls_strparser *strp)
desc.count = 1; /* give more than one skb per call */
/* sk should be locked here, so okay to do read_sock */
+ strp->sk->sk_protocol == IPPROTO_MPTCP ?
+ mptcp_read_sock(strp->sk, &desc, tls_strp_copyin) :
tcp_read_sock(strp->sk, &desc, tls_strp_copyin);
return desc.error;
@@ -464,8 +468,10 @@ static void tls_strp_load_anchor_with_queue(struct tls_strparser *strp, int len)
struct sk_buff *first;
u32 offset;
- first = tcp_recv_skb(strp->sk, tp->copied_seq, &offset);
- if (WARN_ON_ONCE(!first))
+ first = strp->sk->sk_protocol == IPPROTO_MPTCP ?
+ mptcp_recv_skb(strp->sk, &offset) :
+ tcp_recv_skb(strp->sk, tp->copied_seq, &offset);
+ if (!first)
return;
/* Bestow the state onto the anchor */
@@ -490,7 +496,9 @@ bool tls_strp_msg_load(struct tls_strparser *strp, bool force_refresh)
DEBUG_NET_WARN_ON_ONCE(!strp->stm.full_len);
if (!strp->copy_mode && force_refresh) {
- if (unlikely(tcp_inq(strp->sk) < strp->stm.full_len)) {
+ if (unlikely((strp->sk->sk_protocol == IPPROTO_MPTCP ?
+ mptcp_inq_hint(strp->sk) :
+ tcp_inq(strp->sk)) < strp->stm.full_len)) {
WRITE_ONCE(strp->msg_ready, 0);
memset(&strp->stm, 0, sizeof(strp->stm));
return false;
@@ -513,7 +521,9 @@ static int tls_strp_read_sock(struct tls_strparser *strp)
{
int sz, inq;
- inq = tcp_inq(strp->sk);
+ inq = strp->sk->sk_protocol == IPPROTO_MPTCP ?
+ mptcp_inq_hint(strp->sk) :
+ tcp_inq(strp->sk);
if (inq < 1)
return 0;
@@ -586,6 +596,8 @@ void tls_strp_msg_done(struct tls_strparser *strp)
WARN_ON(!strp->stm.full_len);
if (likely(!strp->copy_mode))
+ strp->sk->sk_protocol == IPPROTO_MPTCP ?
+ mptcp_read_done(strp->sk, strp->stm.full_len) :
tcp_read_done(strp->sk, strp->stm.full_len);
else
tls_strp_flush_anchor_copy(strp);
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC mptcp-next 06/10] mptcp: enable TLS socket options
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
` (4 preceding siblings ...)
2025-11-18 4:01 ` [RFC mptcp-next 05/10] tls: add MPTCP protocol support Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 07/10] selftests: mptcp: connect: enhance TCP ULP testing Geliang Tang
` (5 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang, Gang Yan
From: Geliang Tang <tanggeliang@kylinos.cn>
Add support for TLS-related socket options in MPTCP protocol:
- Allow TCP_ULP option with "tls" parameter
- Support TLS_TX and TLS_RX options from SOL_TLS level
- Delegate TLS option handling to underlying TCP implementation
Signed-off-by: Gang Yan <yangang@kylinos.cn>
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/sockopt.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c
index de90a2897d2d..6a5ce43e611a 100644
--- a/net/mptcp/sockopt.c
+++ b/net/mptcp/sockopt.c
@@ -12,6 +12,7 @@
#include <net/protocol.h>
#include <net/tcp.h>
#include <net/mptcp.h>
+#include <net/tls.h>
#include "protocol.h"
#define MIN_INFO_OPTLEN_SIZE 16
@@ -567,6 +568,7 @@ static bool mptcp_supported_sockopt(int level, int optname)
case TCP_FASTOPEN_CONNECT:
case TCP_FASTOPEN_KEY:
case TCP_FASTOPEN_NO_COOKIE:
+ case TCP_ULP:
return true;
}
@@ -576,6 +578,13 @@ static bool mptcp_supported_sockopt(int level, int optname)
* TCP_REPAIR_WINDOW are not supported, better avoid this mess
*/
}
+ if (level == SOL_TLS) {
+ switch (optname) {
+ case TLS_TX:
+ case TLS_RX:
+ return true;
+ }
+ }
return false;
}
@@ -819,11 +828,18 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
sockptr_t optval, unsigned int optlen)
{
struct sock *sk = (void *)msk;
+ char __user ulp[4] = "";
int ret, val;
switch (optname) {
case TCP_ULP:
- return -EOPNOTSUPP;
+ if (copy_from_user(ulp, optval.user, 4))
+ return -EFAULT;
+ if (strcmp(ulp, "tls\0"))
+ return -EOPNOTSUPP;
+ if ((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))
+ return -EINVAL;
+ return tcp_setsockopt(sk, SOL_TCP, optname, optval, optlen);
case TCP_CONGESTION:
return mptcp_setsockopt_sol_tcp_congestion(msk, optval, optlen);
case TCP_DEFER_ACCEPT:
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC mptcp-next 07/10] selftests: mptcp: connect: enhance TCP ULP testing
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
` (5 preceding siblings ...)
2025-11-18 4:01 ` [RFC mptcp-next 06/10] mptcp: enable TLS socket options Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 08/10] selftests: mptcp: connect: skip TLS in disconnect tests Geliang Tang
` (4 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Improve sock_test_tcpulp() function to properly validate TLS ULP
setup on MPTCP sockets. The updated logic verifies that TLS can be
correctly configured based on the socket protocol type and state.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_connect.c | 32 ++++++++++++-------
1 file changed, 21 insertions(+), 11 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/testing/selftests/net/mptcp/mptcp_connect.c
index b82df82e0594..deafcff7a2c8 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_connect.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c
@@ -33,6 +33,7 @@
#include <linux/tcp.h>
#include <linux/time_types.h>
#include <linux/sockios.h>
+#include <linux/mptcp.h>
extern int optind;
@@ -272,7 +273,7 @@ static int do_ulp_so(int sock, const char *name)
}
#define X(m) xerror("%s:%u: %s: failed for proto %d at line %u", __FILE__, __LINE__, (m), proto, line)
-static void sock_test_tcpulp(int sock, int proto, unsigned int line)
+static void sock_test_tcpulp(int sock, int proto, int r, unsigned int line)
{
socklen_t buflen = 8;
char buf[8] = "";
@@ -285,11 +286,11 @@ static void sock_test_tcpulp(int sock, int proto, unsigned int line)
if (strcmp(buf, "mptcp") != 0)
xerror("unexpected ULP '%s' for proto %d at line %u", buf, proto, line);
ret = do_ulp_so(sock, "tls");
- if (ret == 0)
+ if (ret != r)
X("setsockopt");
} else if (proto == IPPROTO_MPTCP) {
ret = do_ulp_so(sock, "tls");
- if (ret != -1)
+ if (ret != r)
X("setsockopt");
}
@@ -300,7 +301,7 @@ static void sock_test_tcpulp(int sock, int proto, unsigned int line)
#undef X
}
-#define SOCK_TEST_TCPULP(s, p) sock_test_tcpulp((s), (p), __LINE__)
+#define SOCK_TEST_TCPULP(s, p, r) sock_test_tcpulp((s), (p), (r), __LINE__)
static int sock_listen_mptcp(const char * const listenaddr,
const char * const port)
@@ -325,7 +326,7 @@ static int sock_listen_mptcp(const char * const listenaddr,
if (sock < 0)
continue;
- SOCK_TEST_TCPULP(sock, cfg_sock_proto);
+ SOCK_TEST_TCPULP(sock, cfg_sock_proto, -1);
if (-1 == setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one,
sizeof(one)))
@@ -352,7 +353,7 @@ static int sock_listen_mptcp(const char * const listenaddr,
return sock;
}
- SOCK_TEST_TCPULP(sock, cfg_sock_proto);
+ SOCK_TEST_TCPULP(sock, cfg_sock_proto, -1);
if (listen(sock, 20)) {
perror("listen");
@@ -360,11 +361,20 @@ static int sock_listen_mptcp(const char * const listenaddr,
return -1;
}
- SOCK_TEST_TCPULP(sock, cfg_sock_proto);
+ SOCK_TEST_TCPULP(sock, cfg_sock_proto, -1);
return sock;
}
+static int is_mptcp(int fd)
+{
+ struct mptcp_info info;
+ socklen_t optlen;
+
+ optlen = sizeof(info);
+ return getsockopt(fd, SOL_MPTCP, MPTCP_INFO, &info, &optlen);
+}
+
static int sock_connect_mptcp(const char * const remoteaddr,
const char * const port, int proto,
struct addrinfo **peer,
@@ -388,7 +398,7 @@ static int sock_connect_mptcp(const char * const remoteaddr,
continue;
}
- SOCK_TEST_TCPULP(sock, proto);
+ SOCK_TEST_TCPULP(sock, proto, -1);
if (cfg_mark)
set_mark(sock, cfg_mark);
@@ -425,7 +435,7 @@ static int sock_connect_mptcp(const char * const remoteaddr,
freeaddrinfo(addr);
if (sock != -1)
- SOCK_TEST_TCPULP(sock, proto);
+ SOCK_TEST_TCPULP(sock, proto, is_mptcp(sock));
return sock;
}
@@ -1197,7 +1207,7 @@ int main_loop_s(int listensock)
xerror("can't open %s: %d", cfg_input, errno);
}
- SOCK_TEST_TCPULP(remotesock, 0);
+ SOCK_TEST_TCPULP(remotesock, 0, 0);
memset(&winfo, 0, sizeof(winfo));
err = copyfd_io(fd, remotesock, 1, true, &winfo);
@@ -1371,7 +1381,7 @@ int main_loop(void)
again:
check_getpeername_connect(fd);
- SOCK_TEST_TCPULP(fd, cfg_sock_proto);
+ SOCK_TEST_TCPULP(fd, cfg_sock_proto, -1);
if (cfg_rcvbuf)
set_rcvbuf(fd, cfg_rcvbuf);
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC mptcp-next 08/10] selftests: mptcp: connect: skip TLS in disconnect tests
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
` (6 preceding siblings ...)
2025-11-18 4:01 ` [RFC mptcp-next 07/10] selftests: mptcp: connect: enhance TCP ULP testing Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 8:50 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 09/10] selftests: mptcp: connect: fix uninitialized variable warning Geliang Tang
` (3 subsequent siblings)
11 siblings, 1 reply; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Modify disconnect test scenarios to bypass TLS socket configuration
since TLS setup can interfere with connection teardown validation.
Add cfg_disconnect flag to control this behavior.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
tools/testing/selftests/net/mptcp/mptcp_connect.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/testing/selftests/net/mptcp/mptcp_connect.c
index deafcff7a2c8..e43874610297 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_connect.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c
@@ -79,6 +79,7 @@ static char *cfg_input;
static int cfg_repeat = 1;
static int cfg_truncate;
static int cfg_rcv_trunc;
+static int cfg_disconnect = 0;
struct cfg_cmsg_types {
unsigned int cmsg_enabled:1;
@@ -434,7 +435,7 @@ static int sock_connect_mptcp(const char * const remoteaddr,
}
freeaddrinfo(addr);
- if (sock != -1)
+ if (sock != -1 && cfg_disconnect == 0)
SOCK_TEST_TCPULP(sock, proto, is_mptcp(sock));
return sock;
}
@@ -1381,7 +1382,9 @@ int main_loop(void)
again:
check_getpeername_connect(fd);
- SOCK_TEST_TCPULP(fd, cfg_sock_proto, -1);
+ /* Don't let TLS break disconnect tests */
+ if (cfg_disconnect == 0)
+ SOCK_TEST_TCPULP(fd, cfg_sock_proto, -1);
if (cfg_rcvbuf)
set_rcvbuf(fd, cfg_rcvbuf);
@@ -1540,6 +1543,7 @@ static void parse_opts(int argc, char **argv)
break;
case 'I':
cfg_repeat = atoi(optarg);
+ cfg_disconnect = 1;
break;
case 'l':
listen_mode = true;
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC mptcp-next 09/10] selftests: mptcp: connect: fix uninitialized variable warning
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
` (7 preceding siblings ...)
2025-11-18 4:01 ` [RFC mptcp-next 08/10] selftests: mptcp: connect: skip TLS in disconnect tests Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 10/10] selftests: mptcp: sockopt: add MPTCP TLS test cases Geliang Tang
` (2 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Initialize 'peer' addrinfo pointer to NULL in main_loop() to resolve
compiler warning about potential use of uninitialized variable when
handling repeated connection attempts.
CC mptcp_connect
mptcp_connect.c: In function 'main_loop':
mptcp_connect.c:1415:37: warning: 'peer' may be used uninitialized [-Wmaybe-uninitialized]
1415 | if (connect(fd, peer->ai_addr, peer->ai_addrlen))
| ~~~~^~~~~~~~~
mptcp_connect.c:1368:26: note: 'peer' was declared here
1368 | struct addrinfo *peer;
| ^~~~
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
tools/testing/selftests/net/mptcp/mptcp_connect.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c b/tools/testing/selftests/net/mptcp/mptcp_connect.c
index e43874610297..bd46639edc92 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_connect.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c
@@ -1365,7 +1365,7 @@ void xdisconnect(int fd)
int main_loop(void)
{
int fd = 0, ret, fd_in = 0;
- struct addrinfo *peer;
+ struct addrinfo *peer = NULL;
struct wstate winfo;
if (cfg_input && cfg_sockopt_types.mptfo) {
@@ -1405,7 +1405,7 @@ int main_loop(void)
if (cfg_truncate > 0) {
shutdown(fd, SHUT_WR);
- } else if (--cfg_repeat > 0) {
+ } else if (--cfg_repeat > 0 && peer) {
xdisconnect(fd);
/* the socket could be unblocking at this point, we need the
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [RFC mptcp-next 10/10] selftests: mptcp: sockopt: add MPTCP TLS test cases
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
` (8 preceding siblings ...)
2025-11-18 4:01 ` [RFC mptcp-next 09/10] selftests: mptcp: connect: fix uninitialized variable warning Geliang Tang
@ 2025-11-18 4:01 ` Geliang Tang
2025-11-18 4:37 ` [RFC mptcp-next 00/10] MPTCP KTLS support MPTCP CI
2025-11-18 7:18 ` MPTCP CI
11 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 4:01 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Extend KTLS testing to cover MPTCP protocol by adding:
- MPTCP-specific TLS test scenarios for IPv4 and IPv6
- Adjustments to handle MPTCP-specific behavior in test validation
- Skip certain checks that don't apply to TLS-enabled connections
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
tools/testing/selftests/net/mptcp/mptcp_sockopt.c | 5 ++++-
tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 12 ++++++++++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index 8058b1fd5a35..96cba6df6a56 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -623,6 +623,9 @@ static void do_getsockopt_mptcp_full_info(struct so_state *s, int fd)
static void do_getsockopts(struct so_state *s, int fd, size_t r, size_t w)
{
+ if (tls)
+ return;
+
do_getsockopt_mptcp_info(s, fd, w);
do_getsockopt_tcp_info(s, fd, r, w);
@@ -730,7 +733,7 @@ static void process_one_client(int fd, int pipefd)
/* wait for hangup */
ret3 = read(fd, buf, 1);
- if (ret3 != 0)
+ if (!tls && ret3 != 0)
xerror("expected EOF, got %lu", ret3);
do_getsockopts(&s, fd, ret, ret2);
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
index 4d6ab4a63e3f..8840be8adea3 100755
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.sh
@@ -382,6 +382,18 @@ do_tls_tests()
fi
do_tls_test -6 -c -t tcp -r tcp
lret=$?
+ if [ $lret -ne 0 ] ; then
+ return $lret
+ fi
+
+ # MPTCP KTLS
+ do_tls_test -c
+ lret=$?
+ if [ $lret -ne 0 ] ; then
+ return $lret
+ fi
+ do_tls_test -6 -c
+ lret=$?
return $lret
}
--
2.51.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [RFC mptcp-next 00/10] MPTCP KTLS support
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
` (9 preceding siblings ...)
2025-11-18 4:01 ` [RFC mptcp-next 10/10] selftests: mptcp: sockopt: add MPTCP TLS test cases Geliang Tang
@ 2025-11-18 4:37 ` MPTCP CI
2025-11-18 7:18 ` MPTCP CI
11 siblings, 0 replies; 14+ messages in thread
From: MPTCP CI @ 2025-11-18 4:37 UTC (permalink / raw)
To: Geliang Tang; +Cc: mptcp
Hi Geliang,
Thank you for your modifications, that's great!
But sadly, our CI spotted some issues with it when trying to build it.
You can find more details there:
https://github.com/multipath-tcp/mptcp_net-next/actions/runs/19453856367
Status: failure
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/b37b703d4e0a
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=1024635
Feel free to reply to this email if you cannot access logs, if you need
some support to fix the error, if this doesn't seem to be caused by your
modifications or if the error is a false positive one.
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [RFC mptcp-next 00/10] MPTCP KTLS support
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
` (10 preceding siblings ...)
2025-11-18 4:37 ` [RFC mptcp-next 00/10] MPTCP KTLS support MPTCP CI
@ 2025-11-18 7:18 ` MPTCP CI
11 siblings, 0 replies; 14+ messages in thread
From: MPTCP CI @ 2025-11-18 7:18 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 (except selftest_mptcp_join): Unstable: 1 failed test(s): packetdrill_dss 🔴
- KVM Validation: normal (only selftest_mptcp_join): Success! ✅
- KVM Validation: debug (except selftest_mptcp_join): Unstable: 1 failed test(s): packetdrill_dss 🔴
- KVM Validation: debug (only selftest_mptcp_join): Success! ✅
- 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/19453856409
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/b37b703d4e0a
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=1024635
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] 14+ messages in thread
* Re: [RFC mptcp-next 08/10] selftests: mptcp: connect: skip TLS in disconnect tests
2025-11-18 4:01 ` [RFC mptcp-next 08/10] selftests: mptcp: connect: skip TLS in disconnect tests Geliang Tang
@ 2025-11-18 8:50 ` Geliang Tang
0 siblings, 0 replies; 14+ messages in thread
From: Geliang Tang @ 2025-11-18 8:50 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
On Tue, 2025-11-18 at 12:01 +0800, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> Modify disconnect test scenarios to bypass TLS socket configuration
> since TLS setup can interfere with connection teardown validation.
> Add cfg_disconnect flag to control this behavior.
tls_disconnect() returning EOPNOTSUPP caused the MPTCP connect's
disconnect tests to fail:
static int tls_disconnect(struct sock *sk, int flags)
{
return -EOPNOTSUPP;
}
This patch can be dropped now that MPTCP support has been added to
tls_disconnect() like this:
static int tls_disconnect(struct sock *sk, int flags)
{
if (sk->sk_protocol == IPPROTO_MPTCP)
return mptcp_disconnect(sk, flags);
return -EOPNOTSUPP;
}
Thanks,
-Geliang
>
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
> tools/testing/selftests/net/mptcp/mptcp_connect.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.c
> b/tools/testing/selftests/net/mptcp/mptcp_connect.c
> index deafcff7a2c8..e43874610297 100644
> --- a/tools/testing/selftests/net/mptcp/mptcp_connect.c
> +++ b/tools/testing/selftests/net/mptcp/mptcp_connect.c
> @@ -79,6 +79,7 @@ static char *cfg_input;
> static int cfg_repeat = 1;
> static int cfg_truncate;
> static int cfg_rcv_trunc;
> +static int cfg_disconnect = 0;
>
> struct cfg_cmsg_types {
> unsigned int cmsg_enabled:1;
> @@ -434,7 +435,7 @@ static int sock_connect_mptcp(const char * const
> remoteaddr,
> }
>
> freeaddrinfo(addr);
> - if (sock != -1)
> + if (sock != -1 && cfg_disconnect == 0)
> SOCK_TEST_TCPULP(sock, proto, is_mptcp(sock));
> return sock;
> }
> @@ -1381,7 +1382,9 @@ int main_loop(void)
> again:
> check_getpeername_connect(fd);
>
> - SOCK_TEST_TCPULP(fd, cfg_sock_proto, -1);
> + /* Don't let TLS break disconnect tests */
> + if (cfg_disconnect == 0)
> + SOCK_TEST_TCPULP(fd, cfg_sock_proto, -1);
>
> if (cfg_rcvbuf)
> set_rcvbuf(fd, cfg_rcvbuf);
> @@ -1540,6 +1543,7 @@ static void parse_opts(int argc, char **argv)
> break;
> case 'I':
> cfg_repeat = atoi(optarg);
> + cfg_disconnect = 1;
> break;
> case 'l':
> listen_mode = true;
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2025-11-18 8:50 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-18 4:01 [RFC mptcp-next 00/10] MPTCP KTLS support Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 01/10] selftests: mptcp: sockopt: add protocol arguments Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 02/10] selftests: mptcp: sockopt: skip mptcp getsockopt for tcp tests Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 03/10] selftests: mptcp: sockopt: add TLS argument support Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 04/10] selftests: mptcp: sockopt: implement TCP TLS tests Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 05/10] tls: add MPTCP protocol support Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 06/10] mptcp: enable TLS socket options Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 07/10] selftests: mptcp: connect: enhance TCP ULP testing Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 08/10] selftests: mptcp: connect: skip TLS in disconnect tests Geliang Tang
2025-11-18 8:50 ` Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 09/10] selftests: mptcp: connect: fix uninitialized variable warning Geliang Tang
2025-11-18 4:01 ` [RFC mptcp-next 10/10] selftests: mptcp: sockopt: add MPTCP TLS test cases Geliang Tang
2025-11-18 4:37 ` [RFC mptcp-next 00/10] MPTCP KTLS support MPTCP CI
2025-11-18 7:18 ` MPTCP CI
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox