From: Toke Høiland-Jørgensen <toke@xxxxxxxxxx> This adds tests for the various replacement operations using IFLA_XDP_EXPECTED_FD. Signed-off-by: Toke Høiland-Jørgensen <toke@xxxxxxxxxx> --- .../testing/selftests/bpf/prog_tests/xdp_attach.c | 55 ++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/xdp_attach.c diff --git a/tools/testing/selftests/bpf/prog_tests/xdp_attach.c b/tools/testing/selftests/bpf/prog_tests/xdp_attach.c new file mode 100644 index 000000000000..ad974b677e74 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/xdp_attach.c @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <test_progs.h> + +#define IFINDEX_LO 1 + +void test_xdp_attach(void) +{ + struct bpf_object *obj1, *obj2, *obj3; + const char *file = "./test_xdp.o"; + int err, fd1, fd2, fd3; + __u32 duration = 0; + + err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj1, &fd1); + if (CHECK_FAIL(err)) + return; + err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj2, &fd2); + if (CHECK_FAIL(err)) + goto out_1; + err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj3, &fd3); + if (CHECK_FAIL(err)) + goto out_2; + + err = bpf_set_link_xdp_fd_replace(IFINDEX_LO, fd1, -1, 0); + if (CHECK(err, "load_ok", "initial load failed")) + goto out_close; + + err = bpf_set_link_xdp_fd_replace(IFINDEX_LO, fd2, -1, 0); + if (CHECK(!err, "load_fail", "load with expected fd didn't fail")) + goto out; + + err = bpf_set_link_xdp_fd_replace(IFINDEX_LO, fd2, fd1, 0); + if (CHECK(err, "replace_ok", "replace valid old_fd failed")) + goto out; + + err = bpf_set_link_xdp_fd_replace(IFINDEX_LO, fd3, fd1, 0); + if (CHECK(!err, "replace_fail", "replace invalid old_fd didn't fail")) + goto out; + + err = bpf_set_link_xdp_fd_replace(IFINDEX_LO, -1, fd1, 0); + if (CHECK(!err, "remove_fail", "remove invalid old_fd didn't fail")) + goto out; + + err = bpf_set_link_xdp_fd_replace(IFINDEX_LO, -1, fd2, 0); + if (CHECK(err, "remove_ok", "remove valid old_fd failed")) + goto out; + +out: + bpf_set_link_xdp_fd(IFINDEX_LO, -1, 0); +out_close: + bpf_object__close(obj3); +out_2: + bpf_object__close(obj2); +out_1: + bpf_object__close(obj1); +}