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