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}, 23d911ba7cSJoanne Koong {"test_adjust", SETUP_SYSCALL_SLEEP}, 24d911ba7cSJoanne Koong {"test_adjust_err", SETUP_SYSCALL_SLEEP}, 25d911ba7cSJoanne Koong {"test_zero_size_dynptr", SETUP_SYSCALL_SLEEP}, 26d911ba7cSJoanne Koong {"test_dynptr_is_null", SETUP_SYSCALL_SLEEP}, 27d911ba7cSJoanne Koong {"test_dynptr_is_rdonly", SETUP_SKB_PROG}, 28d911ba7cSJoanne Koong {"test_dynptr_clone", SETUP_SKB_PROG}, 29*1ce33b6cSDaniel Rosenberg {"test_dynptr_skb_no_buff", SETUP_SKB_PROG}, 30cfa7b011SJoanne Koong }; 31cfa7b011SJoanne Koong 32cfa7b011SJoanne Koong static void verify_success(const char *prog_name, enum test_setup_type setup_type) 330cf7052aSJoanne Koong { 340cf7052aSJoanne Koong struct dynptr_success *skel; 350cf7052aSJoanne Koong struct bpf_program *prog; 360cf7052aSJoanne Koong struct bpf_link *link; 37cfa7b011SJoanne Koong int err; 380cf7052aSJoanne Koong 390cf7052aSJoanne Koong skel = dynptr_success__open(); 400cf7052aSJoanne Koong if (!ASSERT_OK_PTR(skel, "dynptr_success__open")) 410cf7052aSJoanne Koong return; 420cf7052aSJoanne Koong 430cf7052aSJoanne Koong skel->bss->pid = getpid(); 440cf7052aSJoanne Koong 450cf7052aSJoanne Koong prog = bpf_object__find_program_by_name(skel->obj, prog_name); 460cf7052aSJoanne Koong if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name")) 470cf7052aSJoanne Koong goto cleanup; 480cf7052aSJoanne Koong 49cfa7b011SJoanne Koong bpf_program__set_autoload(prog, true); 50cfa7b011SJoanne Koong 51cfa7b011SJoanne Koong err = dynptr_success__load(skel); 52cfa7b011SJoanne Koong if (!ASSERT_OK(err, "dynptr_success__load")) 53cfa7b011SJoanne Koong goto cleanup; 54cfa7b011SJoanne Koong 55cfa7b011SJoanne Koong switch (setup_type) { 56cfa7b011SJoanne Koong case SETUP_SYSCALL_SLEEP: 570cf7052aSJoanne Koong link = bpf_program__attach(prog); 580cf7052aSJoanne Koong if (!ASSERT_OK_PTR(link, "bpf_program__attach")) 590cf7052aSJoanne Koong goto cleanup; 600cf7052aSJoanne Koong 610cf7052aSJoanne Koong usleep(1); 620cf7052aSJoanne Koong 630cf7052aSJoanne Koong bpf_link__destroy(link); 64cfa7b011SJoanne Koong break; 65cfa7b011SJoanne Koong case SETUP_SKB_PROG: 66cfa7b011SJoanne Koong { 67cfa7b011SJoanne Koong int prog_fd; 68cfa7b011SJoanne Koong char buf[64]; 69cfa7b011SJoanne Koong 70cfa7b011SJoanne Koong LIBBPF_OPTS(bpf_test_run_opts, topts, 71cfa7b011SJoanne Koong .data_in = &pkt_v4, 72cfa7b011SJoanne Koong .data_size_in = sizeof(pkt_v4), 73cfa7b011SJoanne Koong .data_out = buf, 74cfa7b011SJoanne Koong .data_size_out = sizeof(buf), 75cfa7b011SJoanne Koong .repeat = 1, 76cfa7b011SJoanne Koong ); 77cfa7b011SJoanne Koong 78cfa7b011SJoanne Koong prog_fd = bpf_program__fd(prog); 79cfa7b011SJoanne Koong if (!ASSERT_GE(prog_fd, 0, "prog_fd")) 80cfa7b011SJoanne Koong goto cleanup; 81cfa7b011SJoanne Koong 82cfa7b011SJoanne Koong err = bpf_prog_test_run_opts(prog_fd, &topts); 83cfa7b011SJoanne Koong 84cfa7b011SJoanne Koong if (!ASSERT_OK(err, "test_run")) 85cfa7b011SJoanne Koong goto cleanup; 86cfa7b011SJoanne Koong 87cfa7b011SJoanne Koong break; 88cfa7b011SJoanne Koong } 89cfa7b011SJoanne Koong } 90cfa7b011SJoanne Koong 91cfa7b011SJoanne Koong ASSERT_EQ(skel->bss->err, 0, "err"); 920cf7052aSJoanne Koong 930cf7052aSJoanne Koong cleanup: 940cf7052aSJoanne Koong dynptr_success__destroy(skel); 950cf7052aSJoanne Koong } 960cf7052aSJoanne Koong 970cf7052aSJoanne Koong void test_dynptr(void) 980cf7052aSJoanne Koong { 990cf7052aSJoanne Koong int i; 1000cf7052aSJoanne Koong 10150a7cedbSJoanne Koong for (i = 0; i < ARRAY_SIZE(success_tests); i++) { 102cfa7b011SJoanne Koong if (!test__start_subtest(success_tests[i].prog_name)) 1030cf7052aSJoanne Koong continue; 1040cf7052aSJoanne Koong 105cfa7b011SJoanne Koong verify_success(success_tests[i].prog_name, success_tests[i].type); 1060cf7052aSJoanne Koong } 10726c386ecSAndrii Nakryiko 10826c386ecSAndrii Nakryiko RUN_TESTS(dynptr_fail); 1090cf7052aSJoanne Koong } 110