10cf7052aSJoanne Koong // SPDX-License-Identifier: GPL-2.0 20cf7052aSJoanne Koong /* Copyright (c) 2022 Facebook */ 30cf7052aSJoanne Koong 40cf7052aSJoanne Koong #include <test_progs.h> 5*cfa7b011SJoanne Koong #include <network_helpers.h> 60cf7052aSJoanne Koong #include "dynptr_fail.skel.h" 70cf7052aSJoanne Koong #include "dynptr_success.skel.h" 80cf7052aSJoanne Koong 9*cfa7b011SJoanne Koong enum test_setup_type { 10*cfa7b011SJoanne Koong SETUP_SYSCALL_SLEEP, 11*cfa7b011SJoanne Koong SETUP_SKB_PROG, 120cf7052aSJoanne Koong }; 130cf7052aSJoanne Koong 14*cfa7b011SJoanne Koong static struct { 15*cfa7b011SJoanne Koong const char *prog_name; 16*cfa7b011SJoanne Koong enum test_setup_type type; 17*cfa7b011SJoanne Koong } success_tests[] = { 18*cfa7b011SJoanne Koong {"test_read_write", SETUP_SYSCALL_SLEEP}, 19*cfa7b011SJoanne Koong {"test_dynptr_data", SETUP_SYSCALL_SLEEP}, 20*cfa7b011SJoanne Koong {"test_ringbuf", SETUP_SYSCALL_SLEEP}, 21*cfa7b011SJoanne Koong {"test_skb_readonly", SETUP_SKB_PROG}, 22*cfa7b011SJoanne Koong {"test_dynptr_skb_data", SETUP_SKB_PROG}, 23*cfa7b011SJoanne Koong }; 24*cfa7b011SJoanne Koong 25*cfa7b011SJoanne Koong static void verify_success(const char *prog_name, enum test_setup_type setup_type) 260cf7052aSJoanne Koong { 270cf7052aSJoanne Koong struct dynptr_success *skel; 280cf7052aSJoanne Koong struct bpf_program *prog; 290cf7052aSJoanne Koong struct bpf_link *link; 30*cfa7b011SJoanne Koong int err; 310cf7052aSJoanne Koong 320cf7052aSJoanne Koong skel = dynptr_success__open(); 330cf7052aSJoanne Koong if (!ASSERT_OK_PTR(skel, "dynptr_success__open")) 340cf7052aSJoanne Koong return; 350cf7052aSJoanne Koong 360cf7052aSJoanne Koong skel->bss->pid = getpid(); 370cf7052aSJoanne Koong 380cf7052aSJoanne Koong prog = bpf_object__find_program_by_name(skel->obj, prog_name); 390cf7052aSJoanne Koong if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name")) 400cf7052aSJoanne Koong goto cleanup; 410cf7052aSJoanne Koong 42*cfa7b011SJoanne Koong bpf_program__set_autoload(prog, true); 43*cfa7b011SJoanne Koong 44*cfa7b011SJoanne Koong err = dynptr_success__load(skel); 45*cfa7b011SJoanne Koong if (!ASSERT_OK(err, "dynptr_success__load")) 46*cfa7b011SJoanne Koong goto cleanup; 47*cfa7b011SJoanne Koong 48*cfa7b011SJoanne Koong switch (setup_type) { 49*cfa7b011SJoanne Koong case SETUP_SYSCALL_SLEEP: 500cf7052aSJoanne Koong link = bpf_program__attach(prog); 510cf7052aSJoanne Koong if (!ASSERT_OK_PTR(link, "bpf_program__attach")) 520cf7052aSJoanne Koong goto cleanup; 530cf7052aSJoanne Koong 540cf7052aSJoanne Koong usleep(1); 550cf7052aSJoanne Koong 560cf7052aSJoanne Koong bpf_link__destroy(link); 57*cfa7b011SJoanne Koong break; 58*cfa7b011SJoanne Koong case SETUP_SKB_PROG: 59*cfa7b011SJoanne Koong { 60*cfa7b011SJoanne Koong int prog_fd; 61*cfa7b011SJoanne Koong char buf[64]; 62*cfa7b011SJoanne Koong 63*cfa7b011SJoanne Koong LIBBPF_OPTS(bpf_test_run_opts, topts, 64*cfa7b011SJoanne Koong .data_in = &pkt_v4, 65*cfa7b011SJoanne Koong .data_size_in = sizeof(pkt_v4), 66*cfa7b011SJoanne Koong .data_out = buf, 67*cfa7b011SJoanne Koong .data_size_out = sizeof(buf), 68*cfa7b011SJoanne Koong .repeat = 1, 69*cfa7b011SJoanne Koong ); 70*cfa7b011SJoanne Koong 71*cfa7b011SJoanne Koong prog_fd = bpf_program__fd(prog); 72*cfa7b011SJoanne Koong if (!ASSERT_GE(prog_fd, 0, "prog_fd")) 73*cfa7b011SJoanne Koong goto cleanup; 74*cfa7b011SJoanne Koong 75*cfa7b011SJoanne Koong err = bpf_prog_test_run_opts(prog_fd, &topts); 76*cfa7b011SJoanne Koong 77*cfa7b011SJoanne Koong if (!ASSERT_OK(err, "test_run")) 78*cfa7b011SJoanne Koong goto cleanup; 79*cfa7b011SJoanne Koong 80*cfa7b011SJoanne Koong break; 81*cfa7b011SJoanne Koong } 82*cfa7b011SJoanne Koong } 83*cfa7b011SJoanne Koong 84*cfa7b011SJoanne Koong ASSERT_EQ(skel->bss->err, 0, "err"); 850cf7052aSJoanne Koong 860cf7052aSJoanne Koong cleanup: 870cf7052aSJoanne Koong dynptr_success__destroy(skel); 880cf7052aSJoanne Koong } 890cf7052aSJoanne Koong 900cf7052aSJoanne Koong void test_dynptr(void) 910cf7052aSJoanne Koong { 920cf7052aSJoanne Koong int i; 930cf7052aSJoanne Koong 9450a7cedbSJoanne Koong for (i = 0; i < ARRAY_SIZE(success_tests); i++) { 95*cfa7b011SJoanne Koong if (!test__start_subtest(success_tests[i].prog_name)) 960cf7052aSJoanne Koong continue; 970cf7052aSJoanne Koong 98*cfa7b011SJoanne Koong verify_success(success_tests[i].prog_name, success_tests[i].type); 990cf7052aSJoanne Koong } 10026c386ecSAndrii Nakryiko 10126c386ecSAndrii Nakryiko RUN_TESTS(dynptr_fail); 1020cf7052aSJoanne Koong } 103