Skip to content

Commit 6419d08

Browse files
mykyta5Alexei Starovoitov
authored andcommitted
selftests/bpf: Add tests for bpf_object__prepare
Add selftests, checking that running bpf_object__prepare successfully creates maps before load step. Signed-off-by: Mykyta Yatsenko <[email protected]> Signed-off-by: Andrii Nakryiko <[email protected]> Link: https://lore.kernel.org/bpf/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 1315c28 commit 6419d08

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/* Copyright (c) 2025 Meta */
3+
4+
#include <test_progs.h>
5+
#include <network_helpers.h>
6+
#include "prepare.skel.h"
7+
8+
static bool check_prepared(struct bpf_object *obj)
9+
{
10+
bool is_prepared = true;
11+
const struct bpf_map *map;
12+
13+
bpf_object__for_each_map(map, obj) {
14+
if (bpf_map__fd(map) < 0)
15+
is_prepared = false;
16+
}
17+
18+
return is_prepared;
19+
}
20+
21+
static void test_prepare_no_load(void)
22+
{
23+
struct prepare *skel;
24+
int err;
25+
LIBBPF_OPTS(bpf_test_run_opts, topts,
26+
.data_in = &pkt_v4,
27+
.data_size_in = sizeof(pkt_v4),
28+
);
29+
30+
skel = prepare__open();
31+
if (!ASSERT_OK_PTR(skel, "prepare__open"))
32+
return;
33+
34+
if (!ASSERT_FALSE(check_prepared(skel->obj), "not check_prepared"))
35+
goto cleanup;
36+
37+
err = bpf_object__prepare(skel->obj);
38+
39+
if (!ASSERT_TRUE(check_prepared(skel->obj), "check_prepared"))
40+
goto cleanup;
41+
42+
if (!ASSERT_OK(err, "bpf_object__prepare"))
43+
goto cleanup;
44+
45+
cleanup:
46+
prepare__destroy(skel);
47+
}
48+
49+
static void test_prepare_load(void)
50+
{
51+
struct prepare *skel;
52+
int err, prog_fd;
53+
LIBBPF_OPTS(bpf_test_run_opts, topts,
54+
.data_in = &pkt_v4,
55+
.data_size_in = sizeof(pkt_v4),
56+
);
57+
58+
skel = prepare__open();
59+
if (!ASSERT_OK_PTR(skel, "prepare__open"))
60+
return;
61+
62+
if (!ASSERT_FALSE(check_prepared(skel->obj), "not check_prepared"))
63+
goto cleanup;
64+
65+
err = bpf_object__prepare(skel->obj);
66+
if (!ASSERT_OK(err, "bpf_object__prepare"))
67+
goto cleanup;
68+
69+
err = prepare__load(skel);
70+
if (!ASSERT_OK(err, "prepare__load"))
71+
goto cleanup;
72+
73+
if (!ASSERT_TRUE(check_prepared(skel->obj), "check_prepared"))
74+
goto cleanup;
75+
76+
prog_fd = bpf_program__fd(skel->progs.program);
77+
if (!ASSERT_GE(prog_fd, 0, "prog_fd"))
78+
goto cleanup;
79+
80+
err = bpf_prog_test_run_opts(prog_fd, &topts);
81+
if (!ASSERT_OK(err, "test_run_opts err"))
82+
goto cleanup;
83+
84+
if (!ASSERT_OK(topts.retval, "test_run_opts retval"))
85+
goto cleanup;
86+
87+
ASSERT_EQ(skel->bss->err, 0, "err");
88+
89+
cleanup:
90+
prepare__destroy(skel);
91+
}
92+
93+
void test_prepare(void)
94+
{
95+
if (test__start_subtest("prepare_load"))
96+
test_prepare_load();
97+
if (test__start_subtest("prepare_no_load"))
98+
test_prepare_no_load();
99+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/* Copyright (c) 2025 Meta */
3+
#include <vmlinux.h>
4+
#include <bpf/bpf_helpers.h>
5+
//#include <bpf/bpf_tracing.h>
6+
7+
char _license[] SEC("license") = "GPL";
8+
9+
int err;
10+
11+
struct {
12+
__uint(type, BPF_MAP_TYPE_RINGBUF);
13+
__uint(max_entries, 4096);
14+
} ringbuf SEC(".maps");
15+
16+
struct {
17+
__uint(type, BPF_MAP_TYPE_ARRAY);
18+
__uint(max_entries, 1);
19+
__type(key, __u32);
20+
__type(value, __u32);
21+
} array_map SEC(".maps");
22+
23+
SEC("cgroup_skb/egress")
24+
int program(struct __sk_buff *skb)
25+
{
26+
err = 0;
27+
return 0;
28+
}

0 commit comments

Comments
 (0)