xref: /linux/tools/testing/selftests/bpf/prog_tests/prepare.c (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
1*6419d08bSMykyta Yatsenko // SPDX-License-Identifier: GPL-2.0
2*6419d08bSMykyta Yatsenko /* Copyright (c) 2025 Meta */
3*6419d08bSMykyta Yatsenko 
4*6419d08bSMykyta Yatsenko #include <test_progs.h>
5*6419d08bSMykyta Yatsenko #include <network_helpers.h>
6*6419d08bSMykyta Yatsenko #include "prepare.skel.h"
7*6419d08bSMykyta Yatsenko 
8*6419d08bSMykyta Yatsenko static bool check_prepared(struct bpf_object *obj)
9*6419d08bSMykyta Yatsenko {
10*6419d08bSMykyta Yatsenko 	bool is_prepared = true;
11*6419d08bSMykyta Yatsenko 	const struct bpf_map *map;
12*6419d08bSMykyta Yatsenko 
13*6419d08bSMykyta Yatsenko 	bpf_object__for_each_map(map, obj) {
14*6419d08bSMykyta Yatsenko 		if (bpf_map__fd(map) < 0)
15*6419d08bSMykyta Yatsenko 			is_prepared = false;
16*6419d08bSMykyta Yatsenko 	}
17*6419d08bSMykyta Yatsenko 
18*6419d08bSMykyta Yatsenko 	return is_prepared;
19*6419d08bSMykyta Yatsenko }
20*6419d08bSMykyta Yatsenko 
21*6419d08bSMykyta Yatsenko static void test_prepare_no_load(void)
22*6419d08bSMykyta Yatsenko {
23*6419d08bSMykyta Yatsenko 	struct prepare *skel;
24*6419d08bSMykyta Yatsenko 	int err;
25*6419d08bSMykyta Yatsenko 	LIBBPF_OPTS(bpf_test_run_opts, topts,
26*6419d08bSMykyta Yatsenko 		    .data_in = &pkt_v4,
27*6419d08bSMykyta Yatsenko 		    .data_size_in = sizeof(pkt_v4),
28*6419d08bSMykyta Yatsenko 	);
29*6419d08bSMykyta Yatsenko 
30*6419d08bSMykyta Yatsenko 	skel = prepare__open();
31*6419d08bSMykyta Yatsenko 	if (!ASSERT_OK_PTR(skel, "prepare__open"))
32*6419d08bSMykyta Yatsenko 		return;
33*6419d08bSMykyta Yatsenko 
34*6419d08bSMykyta Yatsenko 	if (!ASSERT_FALSE(check_prepared(skel->obj), "not check_prepared"))
35*6419d08bSMykyta Yatsenko 		goto cleanup;
36*6419d08bSMykyta Yatsenko 
37*6419d08bSMykyta Yatsenko 	err = bpf_object__prepare(skel->obj);
38*6419d08bSMykyta Yatsenko 
39*6419d08bSMykyta Yatsenko 	if (!ASSERT_TRUE(check_prepared(skel->obj), "check_prepared"))
40*6419d08bSMykyta Yatsenko 		goto cleanup;
41*6419d08bSMykyta Yatsenko 
42*6419d08bSMykyta Yatsenko 	if (!ASSERT_OK(err, "bpf_object__prepare"))
43*6419d08bSMykyta Yatsenko 		goto cleanup;
44*6419d08bSMykyta Yatsenko 
45*6419d08bSMykyta Yatsenko cleanup:
46*6419d08bSMykyta Yatsenko 	prepare__destroy(skel);
47*6419d08bSMykyta Yatsenko }
48*6419d08bSMykyta Yatsenko 
49*6419d08bSMykyta Yatsenko static void test_prepare_load(void)
50*6419d08bSMykyta Yatsenko {
51*6419d08bSMykyta Yatsenko 	struct prepare *skel;
52*6419d08bSMykyta Yatsenko 	int err, prog_fd;
53*6419d08bSMykyta Yatsenko 	LIBBPF_OPTS(bpf_test_run_opts, topts,
54*6419d08bSMykyta Yatsenko 		    .data_in = &pkt_v4,
55*6419d08bSMykyta Yatsenko 		    .data_size_in = sizeof(pkt_v4),
56*6419d08bSMykyta Yatsenko 	);
57*6419d08bSMykyta Yatsenko 
58*6419d08bSMykyta Yatsenko 	skel = prepare__open();
59*6419d08bSMykyta Yatsenko 	if (!ASSERT_OK_PTR(skel, "prepare__open"))
60*6419d08bSMykyta Yatsenko 		return;
61*6419d08bSMykyta Yatsenko 
62*6419d08bSMykyta Yatsenko 	if (!ASSERT_FALSE(check_prepared(skel->obj), "not check_prepared"))
63*6419d08bSMykyta Yatsenko 		goto cleanup;
64*6419d08bSMykyta Yatsenko 
65*6419d08bSMykyta Yatsenko 	err = bpf_object__prepare(skel->obj);
66*6419d08bSMykyta Yatsenko 	if (!ASSERT_OK(err, "bpf_object__prepare"))
67*6419d08bSMykyta Yatsenko 		goto cleanup;
68*6419d08bSMykyta Yatsenko 
69*6419d08bSMykyta Yatsenko 	err = prepare__load(skel);
70*6419d08bSMykyta Yatsenko 	if (!ASSERT_OK(err, "prepare__load"))
71*6419d08bSMykyta Yatsenko 		goto cleanup;
72*6419d08bSMykyta Yatsenko 
73*6419d08bSMykyta Yatsenko 	if (!ASSERT_TRUE(check_prepared(skel->obj), "check_prepared"))
74*6419d08bSMykyta Yatsenko 		goto cleanup;
75*6419d08bSMykyta Yatsenko 
76*6419d08bSMykyta Yatsenko 	prog_fd = bpf_program__fd(skel->progs.program);
77*6419d08bSMykyta Yatsenko 	if (!ASSERT_GE(prog_fd, 0, "prog_fd"))
78*6419d08bSMykyta Yatsenko 		goto cleanup;
79*6419d08bSMykyta Yatsenko 
80*6419d08bSMykyta Yatsenko 	err = bpf_prog_test_run_opts(prog_fd, &topts);
81*6419d08bSMykyta Yatsenko 	if (!ASSERT_OK(err, "test_run_opts err"))
82*6419d08bSMykyta Yatsenko 		goto cleanup;
83*6419d08bSMykyta Yatsenko 
84*6419d08bSMykyta Yatsenko 	if (!ASSERT_OK(topts.retval, "test_run_opts retval"))
85*6419d08bSMykyta Yatsenko 		goto cleanup;
86*6419d08bSMykyta Yatsenko 
87*6419d08bSMykyta Yatsenko 	ASSERT_EQ(skel->bss->err, 0, "err");
88*6419d08bSMykyta Yatsenko 
89*6419d08bSMykyta Yatsenko cleanup:
90*6419d08bSMykyta Yatsenko 	prepare__destroy(skel);
91*6419d08bSMykyta Yatsenko }
92*6419d08bSMykyta Yatsenko 
93*6419d08bSMykyta Yatsenko void test_prepare(void)
94*6419d08bSMykyta Yatsenko {
95*6419d08bSMykyta Yatsenko 	if (test__start_subtest("prepare_load"))
96*6419d08bSMykyta Yatsenko 		test_prepare_load();
97*6419d08bSMykyta Yatsenko 	if (test__start_subtest("prepare_no_load"))
98*6419d08bSMykyta Yatsenko 		test_prepare_no_load();
99*6419d08bSMykyta Yatsenko }
100