Add link update test for cgroup_storage.
'./test_progs -a cgroup_storage_update' test_cgroup_storage_update:PASS:create cgroup 0 nsec setup_network:PASS:ip netns add cgroup_storage_ns 0 nsec setup_network:PASS:open netns 0 nsec setup_network:PASS:ip link set lo up 0 nsec test_cgroup_storage_update:PASS:setup network 0 nsec test_cgroup_storage_update:PASS:load program 0 nsec test_cgroup_storage_update:PASS:attach no map program 0 nsec test_cgroup_storage_update:PASS:bpf_link_update 0 nsec test_cgroup_storage_update:PASS:first ping 0 nsec test_cgroup_storage_update:PASS:second ping 0 nsec test_cgroup_storage_update:PASS:third ping 0 nsec 61 cgroup_storage_update:OK Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Jiayuan Chen jiayuan.chen@linux.dev --- .../selftests/bpf/prog_tests/cgroup_storage.c | 45 +++++++++++++++++++ .../selftests/bpf/progs/cgroup_storage.c | 6 +++ 2 files changed, 51 insertions(+)
diff --git a/tools/testing/selftests/bpf/prog_tests/cgroup_storage.c b/tools/testing/selftests/bpf/prog_tests/cgroup_storage.c index cf395715ced4..8478b08aa62a 100644 --- a/tools/testing/selftests/bpf/prog_tests/cgroup_storage.c +++ b/tools/testing/selftests/bpf/prog_tests/cgroup_storage.c @@ -94,3 +94,48 @@ void test_cgroup_storage(void) close(cgroup_fd); cleanup_cgroup_environment(); } + +void test_cgroup_storage_update(void) +{ + struct cgroup_storage *skel; + struct nstoken *ns = NULL; + int cgroup_fd; + int err; + + cgroup_fd = cgroup_setup_and_join(TEST_CGROUP); + if (!ASSERT_OK_FD(cgroup_fd, "create cgroup")) + return; + + if (!ASSERT_OK(setup_network(&ns), "setup network")) + goto cleanup_cgroup; + + skel = cgroup_storage__open_and_load(); + if (!ASSERT_OK_PTR(skel, "load program")) + goto cleanup_network; + + skel->links.bpf_prog_no_map = + bpf_program__attach_cgroup(skel->progs.bpf_prog_no_map, + cgroup_fd); + if (!ASSERT_OK_PTR(skel->links.bpf_prog_no_map, "attach no map prog")) + goto cleanup_progs; + + err = bpf_link_update(bpf_link__fd(skel->links.bpf_prog_no_map), + bpf_program__fd(skel->progs.bpf_prog), NULL); + if (!ASSERT_OK(err, "bpf_link_update")) + goto cleanup_progs; + + err = SYS_NOFAIL(PING_CMD); + ASSERT_OK(err, "first ping"); + err = SYS_NOFAIL(PING_CMD); + ASSERT_NEQ(err, 0, "second ping"); + err = SYS_NOFAIL(PING_CMD); + ASSERT_OK(err, "third ping"); + +cleanup_progs: + cgroup_storage__destroy(skel); +cleanup_network: + cleanup_network(ns); +cleanup_cgroup: + close(cgroup_fd); + cleanup_cgroup_environment(); +} diff --git a/tools/testing/selftests/bpf/progs/cgroup_storage.c b/tools/testing/selftests/bpf/progs/cgroup_storage.c index db1e4d2d3281..33a6013ca806 100644 --- a/tools/testing/selftests/bpf/progs/cgroup_storage.c +++ b/tools/testing/selftests/bpf/progs/cgroup_storage.c @@ -21,4 +21,10 @@ int bpf_prog(struct __sk_buff *skb) return (*counter & 1); }
+SEC("cgroup_skb/egress") +int bpf_prog_no_map(struct __sk_buff *skb) +{ + return 1; +} + char _license[] SEC("license") = "GPL";