Skip to content

Commit 87854a0

Browse files
tohojoAlexei Starovoitov
authored andcommitted
selftests/bpf: Add tests for attaching XDP programs
This adds tests for the various replacement operations using IFLA_XDP_EXPECTED_FD. Signed-off-by: Toke Høiland-Jørgensen <[email protected]> Signed-off-by: Alexei Starovoitov <[email protected]> Link: https://lore.kernel.org/bpf/[email protected]
1 parent bd5ca3e commit 87854a0

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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+
}

0 commit comments

Comments
 (0)