* [PATCH mptcp-next v7 1/7] bpf: Register mptcp common kfunc set
2024-10-01 6:47 [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter Geliang Tang
@ 2024-10-01 6:47 ` Geliang Tang
2024-10-01 6:47 ` [PATCH mptcp-next v7 2/7] bpf: Add mptcp_subflow bpf_iter Geliang Tang
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2024-10-01 6:47 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
The mptcp kfuncs mptcp_subflow_active() and mptcp_subflow_set_scheduled()
are going to be used in BPF selftests, so put them into mptcp common kfunc
set and register it with BPF_PROG_TYPE_UNSPEC.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/bpf.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 6414824402e6..41937fde0bb6 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -220,10 +220,18 @@ __bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
__diag_pop();
-BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids)
+BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids)
+BTF_ID_FLAGS(func, mptcp_subflow_active)
BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
+BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
+
+static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
+ .owner = THIS_MODULE,
+ .set = &bpf_mptcp_common_kfunc_ids,
+};
+
+BTF_KFUNCS_START(bpf_mptcp_sched_kfunc_ids)
BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos)
-BTF_ID_FLAGS(func, mptcp_subflow_active)
BTF_ID_FLAGS(func, mptcp_set_timeout)
BTF_ID_FLAGS(func, mptcp_wnd_end)
BTF_ID_FLAGS(func, tcp_stream_memory_free)
@@ -241,6 +249,8 @@ static int __init bpf_mptcp_kfunc_init(void)
int ret;
ret = register_btf_fmodret_id_set(&bpf_mptcp_fmodret_set);
+ ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC,
+ &bpf_mptcp_common_kfunc_set);
ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS,
&bpf_mptcp_sched_kfunc_set);
#ifdef CONFIG_BPF_JIT
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH mptcp-next v7 2/7] bpf: Add mptcp_subflow bpf_iter
2024-10-01 6:47 [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter Geliang Tang
2024-10-01 6:47 ` [PATCH mptcp-next v7 1/7] bpf: Register mptcp common kfunc set Geliang Tang
@ 2024-10-01 6:47 ` Geliang Tang
2024-10-01 6:47 ` [PATCH mptcp-next v7 3/7] bpf: Add mptcp_sock acquire and release helpers Geliang Tang
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2024-10-01 6:47 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
It's necessary to traverse all subflows on the conn_list of an MPTCP
socket and then call kfunc to modify the fields of each subflow. In
kernel space, mptcp_for_each_subflow() helper is used for this:
mptcp_for_each_subflow(msk, subflow)
kfunc(subflow);
But in the MPTCP BPF program, this has not yet been implemented. As
Martin suggested recently, this conn_list walking + modify-by-kfunc
usage fits the bpf_iter use case.
So this patch adds a new bpf_iter type named "mptcp_subflow" to do
this and implements its helpers bpf_iter_mptcp_subflow_new()/_next()/
_destroy(). And register these bpf_iter mptcp_subflow into mptcp
common kfunc set. Then bpf_for_each() for mptcp_subflow can be used
in BPF program like this:
bpf_for_each(mptcp_subflow, subflow, msk)
kfunc(subflow);
v2: remove msk->pm.lock in _new() and _destroy() (Martin)
drop DEFINE_BPF_ITER_FUNC, change opaque[3] to opaque[2] (Andrii)
v3: drop bpf_iter__mptcp_subflow
v4: if msk is NULL, initialize kit->msk to NULL in _new() and check it in
_next() (Andrii)
v5: use list_is_last() instead of list_entry_is_head()
add KF_ITER_NEW/NEXT/DESTROY flags
add msk_owned_by_me in _new()
v6: add KF_TRUSTED_ARGS flag (Andrii, Martin)
"Suggested-by: Martin KaFai Lau <martin.lau@kernel.org>"
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/bpf.c | 49 +++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 45 insertions(+), 4 deletions(-)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 41937fde0bb6..31bb2a869d34 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -201,9 +201,47 @@ static const struct btf_kfunc_id_set bpf_mptcp_fmodret_set = {
.set = &bpf_mptcp_fmodret_ids,
};
-__diag_push();
-__diag_ignore_all("-Wmissing-prototypes",
- "kfuncs which will be used in BPF programs");
+struct bpf_iter_mptcp_subflow {
+ __u64 __opaque[2];
+} __attribute__((aligned(8)));
+
+struct bpf_iter_mptcp_subflow_kern {
+ struct mptcp_sock *msk;
+ struct list_head *pos;
+} __attribute__((aligned(8)));
+
+__bpf_kfunc_start_defs();
+
+__bpf_kfunc int bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it,
+ struct mptcp_sock *msk)
+{
+ struct bpf_iter_mptcp_subflow_kern *kit = (void *)it;
+
+ kit->msk = msk;
+ if (!msk)
+ return -EINVAL;
+
+ msk_owned_by_me(msk);
+
+ kit->pos = &msk->conn_list;
+ return 0;
+}
+
+__bpf_kfunc struct mptcp_subflow_context *
+bpf_iter_mptcp_subflow_next(struct bpf_iter_mptcp_subflow *it)
+{
+ struct bpf_iter_mptcp_subflow_kern *kit = (void *)it;
+
+ if (!kit->msk || list_is_last(kit->pos, &kit->msk->conn_list))
+ return NULL;
+
+ kit->pos = kit->pos->next;
+ return list_entry(kit->pos, struct mptcp_subflow_context, node);
+}
+
+__bpf_kfunc void bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it)
+{
+}
__bpf_kfunc struct mptcp_subflow_context *
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos)
@@ -218,11 +256,14 @@ __bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
return tcp_rtx_queue_empty(sk);
}
-__diag_pop();
+__bpf_kfunc_end_defs();
BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids)
BTF_ID_FLAGS(func, mptcp_subflow_active)
BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
+BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS)
+BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL)
+BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY)
BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH mptcp-next v7 3/7] bpf: Add mptcp_sock acquire and release helpers
2024-10-01 6:47 [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter Geliang Tang
2024-10-01 6:47 ` [PATCH mptcp-next v7 1/7] bpf: Register mptcp common kfunc set Geliang Tang
2024-10-01 6:47 ` [PATCH mptcp-next v7 2/7] bpf: Add mptcp_subflow bpf_iter Geliang Tang
@ 2024-10-01 6:47 ` Geliang Tang
2024-10-01 6:47 ` [PATCH mptcp-next v7 4/7] selftests/bpf: Add mptcp_subflow bpf_iter test prog Geliang Tang
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2024-10-01 6:47 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
KF_TRUSTED_ARGS flag is used for bpf_iter_mptcp_subflow_new, it indicates
that the all pointer arguments are valid. It's necessary to add a
KF_ACQUIRE helper to get valid "msk".
This patch adds bpf_mptcp_sock_acquire() and bpf_mptcp_sock_release()
helpers for this. Increase sk->sk_refcnt in _acquire() and decrease it
in _release(). Register them with KF_ACQUIRE flag and KF_RELEASE flag.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/bpf.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
index 31bb2a869d34..f5700dbe2024 100644
--- a/net/mptcp/bpf.c
+++ b/net/mptcp/bpf.c
@@ -243,6 +243,22 @@ __bpf_kfunc void bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *i
{
}
+__bpf_kfunc struct mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk)
+{
+ struct sock *sk = (struct sock *)msk;
+
+ if (sk && refcount_inc_not_zero(&sk->sk_refcnt))
+ return msk;
+ return NULL;
+}
+
+__bpf_kfunc void bpf_mptcp_sock_release(struct mptcp_sock *msk)
+{
+ struct sock *sk = (struct sock *)msk;
+
+ WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt));
+}
+
__bpf_kfunc struct mptcp_subflow_context *
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos)
{
@@ -264,6 +280,8 @@ BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS)
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL)
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY)
+BTF_ID_FLAGS(func, bpf_mptcp_sock_acquire, KF_ACQUIRE | KF_RET_NULL)
+BTF_ID_FLAGS(func, bpf_mptcp_sock_release, KF_RELEASE)
BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH mptcp-next v7 4/7] selftests/bpf: Add mptcp_subflow bpf_iter test prog
2024-10-01 6:47 [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter Geliang Tang
` (2 preceding siblings ...)
2024-10-01 6:47 ` [PATCH mptcp-next v7 3/7] bpf: Add mptcp_sock acquire and release helpers Geliang Tang
@ 2024-10-01 6:47 ` Geliang Tang
2024-10-01 6:47 ` [PATCH mptcp-next v7 5/7] selftests/bpf: More endpoints for endpoint_init Geliang Tang
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2024-10-01 6:47 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
This patch adds a ftrace hook for mptcp_sched_get_send() to test the newly
added mptcp_subflow bpf_iter.
Export mptcp_subflow helpers bpf_iter_mptcp_subflow_new/_next/_destroy and
bpf_mptcp_sock_acquire/_release into bpf_experimental.h, then use
bpf_for_each(mptcp_subflow, subflow, msk) to walk the mptcp subflow list.
Invoke kfuncs mptcp_subflow_active() and mptcp_subflow_set_scheduled() in
the loop.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../testing/selftests/bpf/bpf_experimental.h | 7 ++++
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 4 ++
.../selftests/bpf/progs/mptcp_bpf_iter.c | 39 +++++++++++++++++++
3 files changed, 50 insertions(+)
create mode 100644 tools/testing/selftests/bpf/progs/mptcp_bpf_iter.c
diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing/selftests/bpf/bpf_experimental.h
index b0668f29f7b3..d43690b17468 100644
--- a/tools/testing/selftests/bpf/bpf_experimental.h
+++ b/tools/testing/selftests/bpf/bpf_experimental.h
@@ -575,6 +575,13 @@ extern int bpf_iter_css_new(struct bpf_iter_css *it,
extern struct cgroup_subsys_state *bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym;
extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym;
+struct bpf_iter_mptcp_subflow;
+extern int bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it,
+ struct mptcp_sock *msk) __weak __ksym;
+extern struct mptcp_subflow_context *
+bpf_iter_mptcp_subflow_next(struct bpf_iter_mptcp_subflow *it) __weak __ksym;
+extern void bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it) __weak __ksym;
+
extern int bpf_wq_init(struct bpf_wq *wq, void *p__map, unsigned int flags) __weak __ksym;
extern int bpf_wq_start(struct bpf_wq *wq, unsigned int flags) __weak __ksym;
extern int bpf_wq_set_callback_impl(struct bpf_wq *wq,
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
index c3800f986ae1..0d84b206764b 100644
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
@@ -43,9 +43,13 @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
}
/* ksym */
+extern bool mptcp_subflow_active(struct mptcp_subflow_context *subflow) __ksym;
extern void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
bool scheduled) __ksym;
+extern struct mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk) __ksym;
+extern void bpf_mptcp_sock_release(struct mptcp_sock *msk) __ksym;
+
extern struct mptcp_subflow_context *
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) __ksym;
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_iter.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_iter.c
new file mode 100644
index 000000000000..57ee738d27c1
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_iter.c
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2024, Kylin Software */
+
+/* vmlinux.h, bpf_helpers.h and other 'define' */
+#include "bpf_tracing_net.h"
+#include "mptcp_bpf.h"
+
+char _license[] SEC("license") = "GPL";
+int subflows;
+int pid;
+
+SEC("fentry/mptcp_sched_get_send")
+int BPF_PROG(trace_mptcp_sched_get_send, struct mptcp_sock *msk)
+{
+ struct mptcp_subflow_context *subflow;
+
+ if (bpf_get_current_pid_tgid() >> 32 != pid)
+ return 0;
+
+ msk = bpf_mptcp_sock_acquire(msk);
+ if (!msk)
+ return 0;
+
+ subflows = 0;
+
+ bpf_for_each(mptcp_subflow, subflow, msk) {
+ if (subflow->token != msk->token)
+ break;
+
+ if (!mptcp_subflow_active(subflow))
+ continue;
+
+ mptcp_subflow_set_scheduled(subflow, false);
+ subflows++;
+ }
+ bpf_mptcp_sock_release(msk);
+
+ return 0;
+}
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH mptcp-next v7 5/7] selftests/bpf: More endpoints for endpoint_init
2024-10-01 6:47 [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter Geliang Tang
` (3 preceding siblings ...)
2024-10-01 6:47 ` [PATCH mptcp-next v7 4/7] selftests/bpf: Add mptcp_subflow bpf_iter test prog Geliang Tang
@ 2024-10-01 6:47 ` Geliang Tang
2024-10-01 6:47 ` [PATCH mptcp-next v7 6/7] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2024-10-01 6:47 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
This patch adds two more test addresses ADDR_3 and ADDR_4, and adds a new
helper address_init() to initialize all these addresses.
Add a new parameter "endpoints" for endpoint_init() to control how many
endpoints are used for the tests. This makes it more flexible.
Update the parameters of endpoint_init() in test_subflow().
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../testing/selftests/bpf/prog_tests/mptcp.c | 46 +++++++++++++++++--
1 file changed, 41 insertions(+), 5 deletions(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index acd79be134cd..076903680e75 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -20,6 +20,8 @@
#define NS_TEST "mptcp_ns"
#define ADDR_1 "10.0.1.1"
#define ADDR_2 "10.0.1.2"
+#define ADDR_3 "10.0.1.3"
+#define ADDR_4 "10.0.1.4"
#define PORT_1 10001
#define WITH_DATA true
#define WITHOUT_DATA false
@@ -351,22 +353,56 @@ static void test_mptcpify(void)
close(cgroup_fd);
}
-static int endpoint_init(char *flags)
+static int address_init(void)
{
SYS(fail, "ip -net %s link add veth1 type veth peer name veth2", NS_TEST);
SYS(fail, "ip -net %s addr add %s/24 dev veth1", NS_TEST, ADDR_1);
SYS(fail, "ip -net %s link set dev veth1 up", NS_TEST);
SYS(fail, "ip -net %s addr add %s/24 dev veth2", NS_TEST, ADDR_2);
SYS(fail, "ip -net %s link set dev veth2 up", NS_TEST);
- if (SYS_NOFAIL("ip -net %s mptcp endpoint add %s %s", NS_TEST, ADDR_2, flags)) {
+
+ SYS(fail, "ip -net %s link add veth3 type veth peer name veth4", NS_TEST);
+ SYS(fail, "ip -net %s addr add %s/24 dev veth3", NS_TEST, ADDR_3);
+ SYS(fail, "ip -net %s link set dev veth3 up", NS_TEST);
+ SYS(fail, "ip -net %s addr add %s/24 dev veth4", NS_TEST, ADDR_4);
+ SYS(fail, "ip -net %s link set dev veth4 up", NS_TEST);
+
+ return 0;
+fail:
+ return -1;
+}
+
+static int endpoint_add(char *addr, char *flags)
+{
+ return SYS_NOFAIL("ip -net %s mptcp endpoint add %s %s", NS_TEST, addr, flags);
+}
+
+static int endpoint_init(char *flags, u8 endpoints)
+{
+ int ret = -1;
+
+ if (!endpoints || endpoints > 4)
+ goto fail;
+
+ if (address_init())
+ goto fail;
+
+ if (SYS_NOFAIL("ip -net %s mptcp limits set add_addr_accepted 4 subflows 4",
+ NS_TEST)) {
printf("'ip mptcp' not supported, skip this test.\n");
test__skip();
goto fail;
}
- return 0;
+ if (endpoints > 1)
+ ret = endpoint_add(ADDR_2, flags);
+ if (endpoints > 2)
+ ret = ret ?: endpoint_add(ADDR_3, flags);
+ if (endpoints > 3)
+ ret = ret ?: endpoint_add(ADDR_4, flags);
+
fail:
- return -1;
+ return ret;
}
static void wait_for_new_subflows(int fd)
@@ -452,7 +488,7 @@ static void test_subflow(void)
if (!ASSERT_OK_PTR(nstoken, "create_netns: mptcp_subflow"))
goto skel_destroy;
- if (endpoint_init("subflow") < 0)
+ if (endpoint_init("subflow", 2) < 0)
goto close_netns;
run_subflow();
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH mptcp-next v7 6/7] Squash to "selftests/bpf: Add bpf scheduler test"
2024-10-01 6:47 [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter Geliang Tang
` (4 preceding siblings ...)
2024-10-01 6:47 ` [PATCH mptcp-next v7 5/7] selftests/bpf: More endpoints for endpoint_init Geliang Tang
@ 2024-10-01 6:47 ` Geliang Tang
2024-10-01 6:47 ` [PATCH mptcp-next v7 7/7] selftests/bpf: Add mptcp_subflow bpf_iter subtest Geliang Tang
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2024-10-01 6:47 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Update endpoint_init() in sched_init().
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
tools/testing/selftests/bpf/prog_tests/mptcp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 076903680e75..64b5ce25e1a1 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -509,7 +509,7 @@ static struct nstoken *sched_init(char *flags, char *sched)
if (!ASSERT_OK_PTR(nstoken, "create_netns"))
return NULL;
- if (endpoint_init("subflow") < 0)
+ if (endpoint_init("subflow", 2) < 0)
goto fail;
SYS(fail, "ip netns exec %s sysctl -qw net.mptcp.scheduler=%s", NS_TEST, sched);
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH mptcp-next v7 7/7] selftests/bpf: Add mptcp_subflow bpf_iter subtest
2024-10-01 6:47 [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter Geliang Tang
` (5 preceding siblings ...)
2024-10-01 6:47 ` [PATCH mptcp-next v7 6/7] Squash to "selftests/bpf: Add bpf scheduler test" Geliang Tang
@ 2024-10-01 6:47 ` Geliang Tang
2024-10-01 7:11 ` [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter MPTCP CI
2024-10-01 7:59 ` MPTCP CI
8 siblings, 0 replies; 10+ messages in thread
From: Geliang Tang @ 2024-10-01 6:47 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
This patch adds a subtest named test_bpf_iter to load and verify the newly
added mptcp_subflow type bpf_iter example in test_mptcp. Use the helper
endpoint_init() to add 3 new subflow endpoints. A new helper recv_byte()
is invoked to trigger the ftrace hook for mptcp_sched_get_send() after
wait_for_new_subflows(). Check if skel->bss->subflows equals 4 to verify
whether the "fentry" program loops fourth as expected.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../testing/selftests/bpf/prog_tests/mptcp.c | 78 +++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c
index 64b5ce25e1a1..233da5317e47 100644
--- a/tools/testing/selftests/bpf/prog_tests/mptcp.c
+++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c
@@ -11,6 +11,7 @@
#include "mptcp_sock.skel.h"
#include "mptcpify.skel.h"
#include "mptcp_subflow.skel.h"
+#include "mptcp_bpf_iter.skel.h"
#include "mptcp_bpf_first.skel.h"
#include "mptcp_bpf_bkup.skel.h"
#include "mptcp_bpf_rr.skel.h"
@@ -261,6 +262,19 @@ static void send_byte(int fd)
ASSERT_EQ(write(fd, &b, sizeof(b)), 1, "send single byte");
}
+static int recv_byte(int fd)
+{
+ char buf[1];
+ ssize_t n;
+
+ n = recv(fd, buf, sizeof(buf), 0);
+ if (CHECK(n <= 0, "recv_byte", "recv")) {
+ log_err("failed/partial recv");
+ return -1;
+ }
+ return 0;
+}
+
static int verify_mptcpify(int server_fd, int client_fd)
{
struct __mptcp_info info;
@@ -501,6 +515,68 @@ static void test_subflow(void)
close(cgroup_fd);
}
+static void run_bpf_iter(void)
+{
+ int server_fd, client_fd, accept_fd;
+
+ server_fd = start_mptcp_server(AF_INET, ADDR_1, PORT_1, 0);
+ if (!ASSERT_OK_FD(server_fd, "start_mptcp_server"))
+ return;
+
+ client_fd = connect_to_fd(server_fd, 0);
+ if (!ASSERT_OK_FD(client_fd, "connect_to_fd"))
+ goto close_server;
+
+ accept_fd = accept(server_fd, NULL, NULL);
+ if (!ASSERT_OK_FD(accept_fd, "accept"))
+ goto close_client;
+
+ send_byte(client_fd);
+ wait_for_new_subflows(client_fd);
+ recv_byte(accept_fd);
+ send_byte(client_fd);
+
+ close(accept_fd);
+close_client:
+ close(client_fd);
+close_server:
+ close(server_fd);
+}
+
+static void test_bpf_iter(void)
+{
+ struct mptcp_bpf_iter *skel;
+ struct nstoken *nstoken;
+ int subflows = 4;
+ int err;
+
+ skel = mptcp_bpf_iter__open_and_load();
+ if (!ASSERT_OK_PTR(skel, "skel_open_load: mptcp_iter"))
+ return;
+
+ skel->bss->pid = getpid();
+
+ err = mptcp_bpf_iter__attach(skel);
+ if (!ASSERT_OK(err, "skel_attach: mptcp_iter"))
+ goto skel_destroy;
+
+ nstoken = create_netns();
+ if (!ASSERT_OK_PTR(nstoken, "create_netns: mptcp_iter"))
+ goto skel_destroy;
+
+ if (endpoint_init("subflow", subflows) < 0)
+ goto close_netns;
+
+ run_bpf_iter();
+
+ ASSERT_EQ(skel->bss->subflows, subflows, "subflows");
+
+close_netns:
+ cleanup_netns(nstoken);
+skel_destroy:
+ mptcp_bpf_iter__destroy(skel);
+}
+
static struct nstoken *sched_init(char *flags, char *sched)
{
struct nstoken *nstoken;
@@ -682,6 +758,8 @@ void test_mptcp(void)
test_mptcpify();
if (test__start_subtest("subflow"))
test_subflow();
+ if (test__start_subtest("bpf_iter"))
+ test_bpf_iter();
if (test__start_subtest("default"))
test_default();
if (test__start_subtest("first"))
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter
2024-10-01 6:47 [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter Geliang Tang
` (6 preceding siblings ...)
2024-10-01 6:47 ` [PATCH mptcp-next v7 7/7] selftests/bpf: Add mptcp_subflow bpf_iter subtest Geliang Tang
@ 2024-10-01 7:11 ` MPTCP CI
2024-10-01 7:59 ` MPTCP CI
8 siblings, 0 replies; 10+ messages in thread
From: MPTCP CI @ 2024-10-01 7:11 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/11120333547
Status: failure
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/1c40aee13c8a
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=894364
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] 10+ messages in thread* Re: [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter
2024-10-01 6:47 [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter Geliang Tang
` (7 preceding siblings ...)
2024-10-01 7:11 ` [PATCH mptcp-next v7 0/7] add mptcp_subflow bpf_iter MPTCP CI
@ 2024-10-01 7:59 ` MPTCP CI
8 siblings, 0 replies; 10+ messages in thread
From: MPTCP CI @ 2024-10-01 7:59 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: Success! ✅
- KVM Validation: debug: Success! ✅
- KVM Validation: btf (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/11120333559
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/1c40aee13c8a
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=894364
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] 10+ messages in thread