1 // SPDX-License-Identifier: GPL-2.0 2 #include <test_progs.h> 3 #include <network_helpers.h> 4 5 #include "map_kptr.skel.h" 6 #include "map_kptr_fail.skel.h" 7 8 static void test_map_kptr_success(bool test_run) 9 { 10 LIBBPF_OPTS(bpf_test_run_opts, opts, 11 .data_in = &pkt_v4, 12 .data_size_in = sizeof(pkt_v4), 13 .repeat = 1, 14 ); 15 struct map_kptr *skel; 16 int key = 0, ret; 17 char buf[16]; 18 19 skel = map_kptr__open_and_load(); 20 if (!ASSERT_OK_PTR(skel, "map_kptr__open_and_load")) 21 return; 22 23 ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.test_map_kptr_ref), &opts); 24 ASSERT_OK(ret, "test_map_kptr_ref refcount"); 25 ASSERT_OK(opts.retval, "test_map_kptr_ref retval"); 26 ret = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.test_map_kptr_ref2), &opts); 27 ASSERT_OK(ret, "test_map_kptr_ref2 refcount"); 28 ASSERT_OK(opts.retval, "test_map_kptr_ref2 retval"); 29 30 if (test_run) 31 goto exit; 32 33 ret = bpf_map__update_elem(skel->maps.array_map, 34 &key, sizeof(key), buf, sizeof(buf), 0); 35 ASSERT_OK(ret, "array_map update"); 36 ret = bpf_map__update_elem(skel->maps.array_map, 37 &key, sizeof(key), buf, sizeof(buf), 0); 38 ASSERT_OK(ret, "array_map update2"); 39 40 ret = bpf_map__update_elem(skel->maps.hash_map, 41 &key, sizeof(key), buf, sizeof(buf), 0); 42 ASSERT_OK(ret, "hash_map update"); 43 ret = bpf_map__delete_elem(skel->maps.hash_map, &key, sizeof(key), 0); 44 ASSERT_OK(ret, "hash_map delete"); 45 46 ret = bpf_map__update_elem(skel->maps.hash_malloc_map, 47 &key, sizeof(key), buf, sizeof(buf), 0); 48 ASSERT_OK(ret, "hash_malloc_map update"); 49 ret = bpf_map__delete_elem(skel->maps.hash_malloc_map, &key, sizeof(key), 0); 50 ASSERT_OK(ret, "hash_malloc_map delete"); 51 52 ret = bpf_map__update_elem(skel->maps.lru_hash_map, 53 &key, sizeof(key), buf, sizeof(buf), 0); 54 ASSERT_OK(ret, "lru_hash_map update"); 55 ret = bpf_map__delete_elem(skel->maps.lru_hash_map, &key, sizeof(key), 0); 56 ASSERT_OK(ret, "lru_hash_map delete"); 57 58 exit: 59 map_kptr__destroy(skel); 60 } 61 62 void test_map_kptr(void) 63 { 64 if (test__start_subtest("success")) { 65 test_map_kptr_success(false); 66 /* Do test_run twice, so that we see refcount going back to 1 67 * after we leave it in map from first iteration. 68 */ 69 test_map_kptr_success(true); 70 } 71 72 RUN_TESTS(map_kptr_fail); 73 } 74