From: Gang Yan <gang.yan@linux.dev>
To: mptcp@lists.linux.dev
Cc: pabeni@redhat.com, Gang Yan <yangang@kylinos.cn>
Subject: [PATCH mptcp-next 5/5] selftests: bpf: verify mptcp bpf_setsockopt from TCP_CONNECT_CB
Date: Mon, 13 Jul 2026 17:57:35 +0800 [thread overview]
Message-ID: <20260713095735.1222033-6-gang.yan@linux.dev> (raw)
In-Reply-To: <20260713095735.1222033-1-gang.yan@linux.dev>
From: Gang Yan <yangang@kylinos.cn>
Add a BPF sockops program attached to BPF_CGROUP_SOCK_OPS that fires
on BPF_SOCK_OPS_TCP_CONNECT_CB and exercises bpf_setsockopt() on the
mptcp master socket (msk).
Two scenarios are covered by the new "setsockopt" subtest:
- TCP_INQ must succeed and the value (1) must be observable from
userspace via getsockopt() on the mptcp socket.
- TCP_CONGESTION needs the subflow lock and is therefore rejected
in bpf context with -EOPNOTSUPP.
Signed-off-by: Gang Yan <yangang@kylinos.cn>
---
.../testing/selftests/bpf/prog_tests/mptcp.c | 61 +++++++++++++++++++
.../selftests/bpf/progs/mptcp_setsockopt.c | 32 ++++++++++
2 files changed, 93 insertions(+)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_setsockopt.c
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 7f48fd9e94e1..ad59f8fcbb68 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -18,6 +18,7 @@
#include "mptcp_bpf_rr.skel.h"
#include "mptcp_bpf_red.skel.h"
#include "mptcp_bpf_burst.skel.h"
+#include "mptcp_setsockopt.skel.h"
#define NS_TEST "mptcp_ns"
#define ADDR_1 "10.0.1.1"
@@ -813,6 +814,64 @@ static void test_burst(void)
mptcp_bpf_burst__destroy(skel);
}
+static void test_setsockopt(void)
+{
+ struct mptcp_setsockopt *skel;
+ struct netns_obj *netns;
+ int cgroup_fd, server_fd, client_fd;
+ int err;
+ int inq;
+ socklen_t len;
+
+ cgroup_fd = test__join_cgroup("/mptcp_setsockopt");
+ if (!ASSERT_OK_FD(cgroup_fd, "join_cgroup"))
+ return;
+
+ skel = mptcp_setsockopt__open_and_load();
+ if (!ASSERT_OK_PTR(skel, "skel_open_load"))
+ goto close_cgroup;
+
+ skel->links.mptcp_connect_cb =
+ bpf_program__attach_cgroup(skel->progs.mptcp_connect_cb,
+ cgroup_fd);
+ if (!ASSERT_OK_PTR(skel->links.mptcp_connect_cb, "attach connect_cb"))
+ goto skel_destroy;
+
+ netns = netns_new(NS_TEST, true);
+ if (!ASSERT_OK_PTR(netns, "netns_new"))
+ goto skel_destroy;
+
+ server_fd = start_mptcp_server(AF_INET, NULL, 0, 0);
+ if (!ASSERT_OK_FD(server_fd, "start_mptcp_server"))
+ goto close_netns;
+
+ client_fd = connect_to_fd(server_fd, 0);
+ if (!ASSERT_OK_FD(client_fd, "connect_to_fd"))
+ goto close_server;
+
+ /* TCP_INQ should be set successfullly */
+ ASSERT_EQ(skel->bss->connect_cb_inq_ret, 0, "connect_cb TCP_INQ ret");
+
+ len = sizeof(inq);
+ err = getsockopt(client_fd, SOL_TCP, TCP_INQ, &inq, &len);
+ if (ASSERT_OK(err, "getsockopt TCP_INQ"))
+ ASSERT_EQ(inq, 1, "TCP_INQ value");
+
+ /* TCP_CONGESTION should be -EOPNOTSUPP */
+ ASSERT_EQ(skel->bss->connect_cb_cc_ret, -EOPNOTSUPP,
+ "connect_cb TCP_CONGESTION ret");
+
+ close(client_fd);
+close_server:
+ close(server_fd);
+close_netns:
+ netns_free(netns);
+skel_destroy:
+ mptcp_setsockopt__destroy(skel);
+close_cgroup:
+ close(cgroup_fd);
+}
+
void test_mptcp(void)
{
if (test__start_subtest("base"))
@@ -835,4 +894,6 @@ void test_mptcp(void)
test_red();
if (test__start_subtest("burst"))
test_burst();
+ if (test__start_subtest("setsockopt"))
+ test_setsockopt();
}
diff --git a/tools/testing/selftests/bpf/progs/mptcp_setsockopt.c b/tools/testing/selftests/bpf/progs/mptcp_setsockopt.c
new file mode 100644
index 000000000000..f54b77ea6c5f
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/mptcp_setsockopt.c
@@ -0,0 +1,32 @@
+#include "bpf_tracing_net.h"
+#include "mptcp_bpf.h"
+
+#ifndef TCP_INQ
+#define TCP_INQ 36
+#endif
+
+int connect_cb_inq_ret;
+int connect_cb_cc_ret;
+
+char cc_reno[TCP_CA_NAME_MAX] = "reno";
+
+SEC("sockops")
+int mptcp_connect_cb(struct bpf_sock_ops *skops)
+{
+ struct bpf_sock *sk = skops->sk;
+ int one = 1;
+
+ if (skops->op != BPF_SOCK_OPS_TCP_CONNECT_CB)
+ return 1;
+
+ if (!sk || sk->protocol != IPPROTO_MPTCP)
+ return 1;
+
+ connect_cb_inq_ret =
+ bpf_setsockopt(skops, SOL_TCP, TCP_INQ, &one, sizeof(one));
+ connect_cb_cc_ret =
+ bpf_setsockopt(skops, SOL_TCP, TCP_CONGESTION,
+ cc_reno, sizeof(cc_reno));
+
+ return 1;
+}
--
2.43.0
prev parent reply other threads:[~2026-07-13 9:58 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-13 9:57 [PATCH mptcp-next 0/5] mptcp: add bpf_setsockopt support in Gang Yan
2026-07-13 9:57 ` [PATCH mptcp-next 1/5] mptcp: use sockopt_lock/release_sock in sockopt Gang Yan
2026-07-13 9:57 ` [PATCH mptcp-next 2/5] mptcp: reject sockopt requiring ssks' lock in BPF context Gang Yan
2026-07-13 9:57 ` [PATCH mptcp-next 3/5] mptcp: enable bpf_setsockopt on the master socket Gang Yan
2026-07-13 9:57 ` [PATCH mptcp-next 4/5] mptcp: add TCP_CONNECT_CB sock_ops hook Gang Yan
2026-07-13 9:57 ` Gang Yan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260713095735.1222033-6-gang.yan@linux.dev \
--to=gang.yan@linux.dev \
--cc=mptcp@lists.linux.dev \
--cc=pabeni@redhat.com \
--cc=yangang@kylinos.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox