10cf7052aSJoanne Koong // SPDX-License-Identifier: GPL-2.0 20cf7052aSJoanne Koong /* Copyright (c) 2022 Facebook */ 30cf7052aSJoanne Koong 40cf7052aSJoanne Koong #include <test_progs.h> 5cfa7b011SJoanne Koong #include <network_helpers.h> 60cf7052aSJoanne Koong #include "dynptr_fail.skel.h" 70cf7052aSJoanne Koong #include "dynptr_success.skel.h" 80cf7052aSJoanne Koong 9cfa7b011SJoanne Koong enum test_setup_type { 10cfa7b011SJoanne Koong SETUP_SYSCALL_SLEEP, 11cfa7b011SJoanne Koong SETUP_SKB_PROG, 120cf7052aSJoanne Koong }; 130cf7052aSJoanne Koong 14cfa7b011SJoanne Koong static struct { 15cfa7b011SJoanne Koong const char *prog_name; 16cfa7b011SJoanne Koong enum test_setup_type type; 17cfa7b011SJoanne Koong } success_tests[] = { 18cfa7b011SJoanne Koong {"test_read_write", SETUP_SYSCALL_SLEEP}, 19cfa7b011SJoanne Koong {"test_dynptr_data", SETUP_SYSCALL_SLEEP}, 20cfa7b011SJoanne Koong {"test_ringbuf", SETUP_SYSCALL_SLEEP}, 21cfa7b011SJoanne Koong {"test_skb_readonly", SETUP_SKB_PROG}, 22cfa7b011SJoanne Koong {"test_dynptr_skb_data", SETUP_SKB_PROG}, 23*d911ba7cSJoanne Koong {"test_adjust", SETUP_SYSCALL_SLEEP}, 24*d911ba7cSJoanne Koong {"test_adjust_err", SETUP_SYSCALL_SLEEP}, 25*d911ba7cSJoanne Koong {"test_zero_size_dynptr", SETUP_SYSCALL_SLEEP}, 26*d911ba7cSJoanne Koong {"test_dynptr_is_null", SETUP_SYSCALL_SLEEP}, 27*d911ba7cSJoanne Koong {"test_dynptr_is_rdonly", SETUP_SKB_PROG}, 28*d911ba7cSJoanne Koong {"test_dynptr_clone", SETUP_SKB_PROG}, 29cfa7b011SJoanne Koong }; 30cfa7b011SJoanne Koong 31cfa7b011SJoanne Koong static void verify_success(const char *prog_name, enum test_setup_type setup_type) 320cf7052aSJoanne Koong { 330cf7052aSJoanne Koong struct dynptr_success *skel; 340cf7052aSJoanne Koong struct bpf_program *prog; 350cf7052aSJoanne Koong struct bpf_link *link; 36cfa7b011SJoanne Koong int err; 370cf7052aSJoanne Koong 380cf7052aSJoanne Koong skel = dynptr_success__open(); 390cf7052aSJoanne Koong if (!ASSERT_OK_PTR(skel, "dynptr_success__open")) 400cf7052aSJoanne Koong return; 410cf7052aSJoanne Koong 420cf7052aSJoanne Koong skel->bss->pid = getpid(); 430cf7052aSJoanne Koong 440cf7052aSJoanne Koong prog = bpf_object__find_program_by_name(skel->obj, prog_name); 450cf7052aSJoanne Koong if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name")) 460cf7052aSJoanne Koong goto cleanup; 470cf7052aSJoanne Koong 48cfa7b011SJoanne Koong bpf_program__set_autoload(prog, true); 49cfa7b011SJoanne Koong 50cfa7b011SJoanne Koong err = dynptr_success__load(skel); 51cfa7b011SJoanne Koong if (!ASSERT_OK(err, "dynptr_success__load")) 52cfa7b011SJoanne Koong goto cleanup; 53cfa7b011SJoanne Koong 54cfa7b011SJoanne Koong switch (setup_type) { 55cfa7b011SJoanne Koong case SETUP_SYSCALL_SLEEP: 560cf7052aSJoanne Koong link = bpf_program__attach(prog); 570cf7052aSJoanne Koong if (!ASSERT_OK_PTR(link, "bpf_program__attach")) 580cf7052aSJoanne Koong goto cleanup; 590cf7052aSJoanne Koong 600cf7052aSJoanne Koong usleep(1); 610cf7052aSJoanne Koong 620cf7052aSJoanne Koong bpf_link__destroy(link); 63cfa7b011SJoanne Koong break; 64cfa7b011SJoanne Koong case SETUP_SKB_PROG: 65cfa7b011SJoanne Koong { 66cfa7b011SJoanne Koong int prog_fd; 67cfa7b011SJoanne Koong char buf[64]; 68cfa7b011SJoanne Koong 69cfa7b011SJoanne Koong LIBBPF_OPTS(bpf_test_run_opts, topts, 70cfa7b011SJoanne Koong .data_in = &pkt_v4, 71cfa7b011SJoanne Koong .data_size_in = sizeof(pkt_v4), 72cfa7b011SJoanne Koong .data_out = buf, 73cfa7b011SJoanne Koong .data_size_out = sizeof(buf), 74cfa7b011SJoanne Koong .repeat = 1, 75cfa7b011SJoanne Koong ); 76cfa7b011SJoanne Koong 77cfa7b011SJoanne Koong prog_fd = bpf_program__fd(prog); 78cfa7b011SJoanne Koong if (!ASSERT_GE(prog_fd, 0, "prog_fd")) 79cfa7b011SJoanne Koong goto cleanup; 80cfa7b011SJoanne Koong 81cfa7b011SJoanne Koong err = bpf_prog_test_run_opts(prog_fd, &topts); 82cfa7b011SJoanne Koong 83cfa7b011SJoanne Koong if (!ASSERT_OK(err, "test_run")) 84cfa7b011SJoanne Koong goto cleanup; 85cfa7b011SJoanne Koong 86cfa7b011SJoanne Koong break; 87cfa7b011SJoanne Koong } 88cfa7b011SJoanne Koong } 89cfa7b011SJoanne Koong 90cfa7b011SJoanne Koong ASSERT_EQ(skel->bss->err, 0, "err"); 910cf7052aSJoanne Koong 920cf7052aSJoanne Koong cleanup: 930cf7052aSJoanne Koong dynptr_success__destroy(skel); 940cf7052aSJoanne Koong } 950cf7052aSJoanne Koong 960cf7052aSJoanne Koong void test_dynptr(void) 970cf7052aSJoanne Koong { 980cf7052aSJoanne Koong int i; 990cf7052aSJoanne Koong 10050a7cedbSJoanne Koong for (i = 0; i < ARRAY_SIZE(success_tests); i++) { 101cfa7b011SJoanne Koong if (!test__start_subtest(success_tests[i].prog_name)) 1020cf7052aSJoanne Koong continue; 1030cf7052aSJoanne Koong 104cfa7b011SJoanne Koong verify_success(success_tests[i].prog_name, success_tests[i].type); 1050cf7052aSJoanne Koong } 10626c386ecSAndrii Nakryiko 10726c386ecSAndrii Nakryiko RUN_TESTS(dynptr_fail); 1080cf7052aSJoanne Koong } 109