:p
atchew
Login
From: Geliang Tang <tanggeliang@kylinos.cn> v2: - two more cleanups, 5-6, use __bpf_kfunc_start_defs/__bpf_kfunc_end_defs and drop the declarations of __bpf_kfunc. 1-2 address Martin's comments 3-4 cleanups for endpoint_init Geliang Tang (6): Squash to "selftests/bpf: Add getsockopt to inspect mptcp subflow" Squash to "selftests/bpf: Add mptcp subflow subtest" selftests/bpf: More subflows for endpoint_init Squash to "selftests/bpf: Add bpf scheduler test" Squash to "mptcp: add sched_data helpers" Squash to "bpf: Export more bpf_burst related functions" net/mptcp/bpf.c | 6 +-- net/mptcp/protocol.h | 3 -- .../testing/selftests/bpf/prog_tests/mptcp.c | 47 ++++++++++++------- tools/testing/selftests/bpf/progs/mptcp_bpf.h | 4 +- 4 files changed, 34 insertions(+), 26 deletions(-) -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Use can_loop instead of cond_break as Martin suggested. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- tools/testing/selftests/bpf/progs/mptcp_bpf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h @@ -XXX,XX +XXX,XX @@ static inline int list_is_head(const struct list_head *list, #define list_entry_is_head(pos, head, member) \ list_is_head(&pos->member, (head)) -/* small difference: 'cond_break' has been added in the conditions */ +/* small difference: 'can_loop' has been added in the conditions */ #define list_for_each_entry(pos, head, member) \ for (pos = list_first_entry(head, typeof(*pos), member); \ - cond_break, !list_entry_is_head(pos, head, member); \ + !list_entry_is_head(pos, head, member) && can_loop; \ pos = list_next_entry(pos, member)) /* mptcp helpers from protocol.h */ -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Address Martin's comments: Drop mptcp_subflow__attach. Use bpf_program__attach_cgroup instead of bpf_prog_attach. Use the skel->links.{mptcp_subflow, _getsockopt_subflow}, instead of declaring a local "link". Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- .../testing/selftests/bpf/prog_tests/mptcp.c | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -XXX,XX +XXX,XX @@ static void run_subflow(void) static void test_subflow(void) { - int cgroup_fd, prog_fd, err; struct mptcp_subflow *skel; struct nstoken *nstoken; - struct bpf_link *link; + int cgroup_fd; cgroup_fd = test__join_cgroup("/mptcp_subflow"); if (!ASSERT_OK_FD(cgroup_fd, "join_cgroup: mptcp_subflow")) @@ -XXX,XX +XXX,XX @@ static void test_subflow(void) skel->bss->pid = getpid(); - err = mptcp_subflow__attach(skel); - if (!ASSERT_OK(err, "skel_attach: mptcp_subflow")) + skel->links.mptcp_subflow = + bpf_program__attach_cgroup(skel->progs.mptcp_subflow, cgroup_fd); + if (!ASSERT_OK_PTR(skel->links.mptcp_subflow, "attach mptcp_subflow")) goto skel_destroy; - prog_fd = bpf_program__fd(skel->progs.mptcp_subflow); - err = bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_SOCK_OPS, 0); - if (!ASSERT_OK(err, "prog_attach")) + skel->links._getsockopt_subflow = + bpf_program__attach_cgroup(skel->progs._getsockopt_subflow, cgroup_fd); + if (!ASSERT_OK_PTR(skel->links._getsockopt_subflow, "attach _getsockopt_subflow")) goto skel_destroy; nstoken = create_netns(); @@ -XXX,XX +XXX,XX @@ static void test_subflow(void) if (endpoint_init("subflow") < 0) goto close_netns; - link = bpf_program__attach_cgroup(skel->progs._getsockopt_subflow, - cgroup_fd); - if (!ASSERT_OK_PTR(link, "getsockopt prog")) - goto close_netns; - run_subflow(); - bpf_link__destroy(link); close_netns: cleanup_netns(nstoken); skel_destroy: -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Squash to "selftests/bpf: Add mptcp subflow subtest" 2 This patch adds two more test addresses ADDR_3 and ADDR_4, and adds a new parameter "subflows" for endpoint_init() to control how many subflows 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 | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -XXX,XX +XXX,XX @@ #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 @@ -XXX,XX +XXX,XX @@ static void test_mptcpify(void) close(cgroup_fd); } -static int endpoint_init(char *flags) +static int endpoint_init(char *flags, u8 subflows) { + if (!subflows || subflows > 4) + goto fail; + 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); + + if (SYS_NOFAIL("ip -net %s mptcp limits set subflows 4", NS_TEST)) { printf("'ip mptcp' not supported, skip this test.\n"); test__skip(); goto fail; } + if (subflows > 1) + SYS_NOFAIL("ip -net %s mptcp endpoint add %s %s", NS_TEST, ADDR_2, flags); + if (subflows > 2) + SYS_NOFAIL("ip -net %s mptcp endpoint add %s %s", NS_TEST, ADDR_3, flags); + if (subflows > 3) + SYS_NOFAIL("ip -net %s mptcp endpoint add %s %s", NS_TEST, ADDR_4, flags); + return 0; fail: return -1; @@ -XXX,XX +XXX,XX @@ 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
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 XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -XXX,XX +XXX,XX @@ 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
From: Geliang Tang <tanggeliang@kylinos.cn> Use __bpf_kfunc_start_defs and __bpf_kfunc_end_defs. Drop bpf_mptcp_subflow_ctx_by_pos declaration. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- net/mptcp/bpf.c | 6 ++---- net/mptcp/protocol.h | 2 -- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c index XXXXXXX..XXXXXXX 100644 --- a/net/mptcp/bpf.c +++ b/net/mptcp/bpf.c @@ -XXX,XX +XXX,XX @@ 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"); +__bpf_kfunc_start_defs(); __bpf_kfunc struct mptcp_subflow_context * bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos) @@ -XXX,XX +XXX,XX @@ __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_sched_kfunc_ids) BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index XXXXXXX..XXXXXXX 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -XXX,XX +XXX,XX @@ void mptcp_sock_graft(struct sock *sk, struct socket *parent); u64 mptcp_wnd_end(const struct mptcp_sock *msk); void mptcp_set_timeout(struct sock *sk); bool bpf_mptcp_subflow_queues_empty(struct sock *sk); -struct mptcp_subflow_context * -bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos); struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk); bool __mptcp_close(struct sock *sk, long timeout); void mptcp_cancel_work(struct sock *sk); -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Drop bpf_mptcp_subflow_queues_empty declaration. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- net/mptcp/protocol.h | 1 - 1 file changed, 1 deletion(-) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index XXXXXXX..XXXXXXX 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -XXX,XX +XXX,XX @@ void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk); void mptcp_sock_graft(struct sock *sk, struct socket *parent); u64 mptcp_wnd_end(const struct mptcp_sock *msk); void mptcp_set_timeout(struct sock *sk); -bool bpf_mptcp_subflow_queues_empty(struct sock *sk); struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk); bool __mptcp_close(struct sock *sk, long timeout); void mptcp_cancel_work(struct sock *sk); -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> v3: - update endpoint_init - squash 2-3 into one - drop 5-6, they will be sent in the next series. v2: - two more cleanups, 5-6, use __bpf_kfunc_start_defs/__bpf_kfunc_end_defs and drop the declarations of __bpf_kfunc. 1-2 address Martin's comments 3-4 cleanups for endpoint_init Geliang Tang (3): Squash to "selftests/bpf: Add getsockopt to inspect mptcp subflow" Squash to "selftests/bpf: Add mptcp subflow subtest" Squash to "selftests/bpf: Add bpf scheduler test" .../testing/selftests/bpf/prog_tests/mptcp.c | 58 +++++++++++++------ tools/testing/selftests/bpf/progs/mptcp_bpf.h | 4 +- 2 files changed, 41 insertions(+), 21 deletions(-) -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Use can_loop instead of cond_break as Martin suggested. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- tools/testing/selftests/bpf/progs/mptcp_bpf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h +++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h @@ -XXX,XX +XXX,XX @@ static inline int list_is_head(const struct list_head *list, #define list_entry_is_head(pos, head, member) \ list_is_head(&pos->member, (head)) -/* small difference: 'cond_break' has been added in the conditions */ +/* small difference: 'can_loop' has been added in the conditions */ #define list_for_each_entry(pos, head, member) \ for (pos = list_first_entry(head, typeof(*pos), member); \ - cond_break, !list_entry_is_head(pos, head, member); \ + !list_entry_is_head(pos, head, member) && can_loop; \ pos = list_next_entry(pos, member)) /* mptcp helpers from protocol.h */ -- 2.43.0
From: Geliang Tang <tanggeliang@kylinos.cn> Address Martin's comments: Drop mptcp_subflow__attach. Use bpf_program__attach_cgroup instead of bpf_prog_attach. Use the skel->links.{mptcp_subflow, _getsockopt_subflow}, instead of declaring a local "link". More subflows for endpoint_init: Add two more test addresses ADDR_3 and ADDR_4, and adds a new parameter "subflows" for endpoint_init() to control how many subflows 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 | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing/selftests/bpf/prog_tests/mptcp.c index XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -XXX,XX +XXX,XX @@ #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 @@ -XXX,XX +XXX,XX @@ static void test_mptcpify(void) close(cgroup_fd); } -static int endpoint_init(char *flags) +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 subflows) +{ + int ret = -1; + + if (!subflows || subflows > 4) + goto fail; + 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); + + if (SYS_NOFAIL("ip -net %s mptcp limits set subflows 4", NS_TEST)) { printf("'ip mptcp' not supported, skip this test.\n"); test__skip(); goto fail; } - return 0; + if (subflows > 1) + ret = endpoint_add(ADDR_2, flags); + if (subflows > 2) + ret = ret ?: endpoint_add(ADDR_3, flags); + if (subflows > 3) + ret = ret ?: endpoint_add(ADDR_4, flags); + fail: - return -1; + return ret; } static void wait_for_new_subflows(int fd) @@ -XXX,XX +XXX,XX @@ static void run_subflow(void) static void test_subflow(void) { - int cgroup_fd, prog_fd, err; struct mptcp_subflow *skel; struct nstoken *nstoken; - struct bpf_link *link; + int cgroup_fd; cgroup_fd = test__join_cgroup("/mptcp_subflow"); if (!ASSERT_OK_FD(cgroup_fd, "join_cgroup: mptcp_subflow")) @@ -XXX,XX +XXX,XX @@ static void test_subflow(void) skel->bss->pid = getpid(); - err = mptcp_subflow__attach(skel); - if (!ASSERT_OK(err, "skel_attach: mptcp_subflow")) + skel->links.mptcp_subflow = + bpf_program__attach_cgroup(skel->progs.mptcp_subflow, cgroup_fd); + if (!ASSERT_OK_PTR(skel->links.mptcp_subflow, "attach mptcp_subflow")) goto skel_destroy; - prog_fd = bpf_program__fd(skel->progs.mptcp_subflow); - err = bpf_prog_attach(prog_fd, cgroup_fd, BPF_CGROUP_SOCK_OPS, 0); - if (!ASSERT_OK(err, "prog_attach")) + skel->links._getsockopt_subflow = + bpf_program__attach_cgroup(skel->progs._getsockopt_subflow, cgroup_fd); + if (!ASSERT_OK_PTR(skel->links._getsockopt_subflow, "attach _getsockopt_subflow")) goto skel_destroy; nstoken = create_netns(); if (!ASSERT_OK_PTR(nstoken, "create_netns: mptcp_subflow")) goto skel_destroy; - if (endpoint_init("subflow") < 0) - goto close_netns; - - link = bpf_program__attach_cgroup(skel->progs._getsockopt_subflow, - cgroup_fd); - if (!ASSERT_OK_PTR(link, "getsockopt prog")) + if (endpoint_init("subflow", 2) < 0) goto close_netns; run_subflow(); - bpf_link__destroy(link); close_netns: cleanup_netns(nstoken); skel_destroy: -- 2.43.0
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 XXXXXXX..XXXXXXX 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -XXX,XX +XXX,XX @@ 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