diff options
Diffstat (limited to 'tools/testing/selftests/bpf/prog_tests/dynptr.c')
| -rw-r--r-- | tools/testing/selftests/bpf/prog_tests/dynptr.c | 74 | 
1 files changed, 58 insertions, 16 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/dynptr.c b/tools/testing/selftests/bpf/prog_tests/dynptr.c index b99264ec0d9c..d176c34a7d2e 100644 --- a/tools/testing/selftests/bpf/prog_tests/dynptr.c +++ b/tools/testing/selftests/bpf/prog_tests/dynptr.c @@ -2,20 +2,32 @@  /* Copyright (c) 2022 Facebook */  #include <test_progs.h> +#include <network_helpers.h>  #include "dynptr_fail.skel.h"  #include "dynptr_success.skel.h" -static const char * const success_tests[] = { -	"test_read_write", -	"test_data_slice", -	"test_ringbuf", +enum test_setup_type { +	SETUP_SYSCALL_SLEEP, +	SETUP_SKB_PROG,  }; -static void verify_success(const char *prog_name) +static struct { +	const char *prog_name; +	enum test_setup_type type; +} success_tests[] = { +	{"test_read_write", SETUP_SYSCALL_SLEEP}, +	{"test_dynptr_data", SETUP_SYSCALL_SLEEP}, +	{"test_ringbuf", SETUP_SYSCALL_SLEEP}, +	{"test_skb_readonly", SETUP_SKB_PROG}, +	{"test_dynptr_skb_data", SETUP_SKB_PROG}, +}; + +static void verify_success(const char *prog_name, enum test_setup_type setup_type)  {  	struct dynptr_success *skel;  	struct bpf_program *prog;  	struct bpf_link *link; +       int err;  	skel = dynptr_success__open();  	if (!ASSERT_OK_PTR(skel, "dynptr_success__open")) @@ -23,23 +35,53 @@ static void verify_success(const char *prog_name)  	skel->bss->pid = getpid(); -	dynptr_success__load(skel); -	if (!ASSERT_OK_PTR(skel, "dynptr_success__load")) -		goto cleanup; -  	prog = bpf_object__find_program_by_name(skel->obj, prog_name);  	if (!ASSERT_OK_PTR(prog, "bpf_object__find_program_by_name"))  		goto cleanup; -	link = bpf_program__attach(prog); -	if (!ASSERT_OK_PTR(link, "bpf_program__attach")) +       bpf_program__set_autoload(prog, true); + +	err = dynptr_success__load(skel); +	if (!ASSERT_OK(err, "dynptr_success__load"))  		goto cleanup; -	usleep(1); +	switch (setup_type) { +	case SETUP_SYSCALL_SLEEP: +		link = bpf_program__attach(prog); +		if (!ASSERT_OK_PTR(link, "bpf_program__attach")) +			goto cleanup; -	ASSERT_EQ(skel->bss->err, 0, "err"); +		usleep(1); + +		bpf_link__destroy(link); +		break; +	case SETUP_SKB_PROG: +	{ +		int prog_fd; +		char buf[64]; + +		LIBBPF_OPTS(bpf_test_run_opts, topts, +			    .data_in = &pkt_v4, +			    .data_size_in = sizeof(pkt_v4), +			    .data_out = buf, +			    .data_size_out = sizeof(buf), +			    .repeat = 1, +		); -	bpf_link__destroy(link); +		prog_fd = bpf_program__fd(prog); +		if (!ASSERT_GE(prog_fd, 0, "prog_fd")) +			goto cleanup; + +		err = bpf_prog_test_run_opts(prog_fd, &topts); + +		if (!ASSERT_OK(err, "test_run")) +			goto cleanup; + +		break; +	} +	} + +	ASSERT_EQ(skel->bss->err, 0, "err");  cleanup:  	dynptr_success__destroy(skel); @@ -50,10 +92,10 @@ void test_dynptr(void)  	int i;  	for (i = 0; i < ARRAY_SIZE(success_tests); i++) { -		if (!test__start_subtest(success_tests[i])) +		if (!test__start_subtest(success_tests[i].prog_name))  			continue; -		verify_success(success_tests[i]); +		verify_success(success_tests[i].prog_name, success_tests[i].type);  	}  	RUN_TESTS(dynptr_fail);  | 
