MPTCP Linux Development
 help / color / mirror / Atom feed
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


      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