1 // SPDX-License-Identifier: GPL-2.0 2 #include <test_progs.h> 3 4 #define IFINDEX_LO 1 5 #define XDP_FLAGS_REPLACE (1U << 4) 6 7 void test_xdp_attach(void) 8 { 9 struct bpf_object *obj1, *obj2, *obj3; 10 const char *file = "./test_xdp.o"; 11 int err, fd1, fd2, fd3; 12 __u32 duration = 0; 13 DECLARE_LIBBPF_OPTS(bpf_xdp_set_link_opts, opts, 14 .old_fd = -1); 15 16 err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj1, &fd1); 17 if (CHECK_FAIL(err)) 18 return; 19 err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj2, &fd2); 20 if (CHECK_FAIL(err)) 21 goto out_1; 22 err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj3, &fd3); 23 if (CHECK_FAIL(err)) 24 goto out_2; 25 26 err = bpf_set_link_xdp_fd_opts(IFINDEX_LO, fd1, XDP_FLAGS_REPLACE, 27 &opts); 28 if (CHECK(err, "load_ok", "initial load failed")) 29 goto out_close; 30 31 err = bpf_set_link_xdp_fd_opts(IFINDEX_LO, fd2, XDP_FLAGS_REPLACE, 32 &opts); 33 if (CHECK(!err, "load_fail", "load with expected id didn't fail")) 34 goto out; 35 36 opts.old_fd = fd1; 37 err = bpf_set_link_xdp_fd_opts(IFINDEX_LO, fd2, 0, &opts); 38 if (CHECK(err, "replace_ok", "replace valid old_fd failed")) 39 goto out; 40 41 err = bpf_set_link_xdp_fd_opts(IFINDEX_LO, fd3, 0, &opts); 42 if (CHECK(!err, "replace_fail", "replace invalid old_fd didn't fail")) 43 goto out; 44 45 err = bpf_set_link_xdp_fd_opts(IFINDEX_LO, -1, 0, &opts); 46 if (CHECK(!err, "remove_fail", "remove invalid old_fd didn't fail")) 47 goto out; 48 49 opts.old_fd = fd2; 50 err = bpf_set_link_xdp_fd_opts(IFINDEX_LO, -1, 0, &opts); 51 if (CHECK(err, "remove_ok", "remove valid old_fd failed")) 52 goto out; 53 54 out: 55 bpf_set_link_xdp_fd(IFINDEX_LO, -1, 0); 56 out_close: 57 bpf_object__close(obj3); 58 out_2: 59 bpf_object__close(obj2); 60 out_1: 61 bpf_object__close(obj1); 62 } 63