1886225bbSStanislav Fomichev // SPDX-License-Identifier: GPL-2.0 2886225bbSStanislav Fomichev #include <test_progs.h> 3886225bbSStanislav Fomichev 42c2837b0SAndrii Nakryiko #define nr_iters 2 52c2837b0SAndrii Nakryiko 6*d3f7b166SYucong Sun void serial_test_bpf_obj_id(void) 7886225bbSStanislav Fomichev { 8886225bbSStanislav Fomichev const __u64 array_magic_value = 0xfaceb00c; 9886225bbSStanislav Fomichev const __u32 array_key = 0; 10886225bbSStanislav Fomichev const char *file = "./test_obj_id.o"; 11886225bbSStanislav Fomichev const char *expected_prog_name = "test_obj_id"; 12886225bbSStanislav Fomichev const char *expected_map_name = "test_map_id"; 13886225bbSStanislav Fomichev const __u64 nsec_per_sec = 1000000000; 14886225bbSStanislav Fomichev 152c2837b0SAndrii Nakryiko struct bpf_object *objs[nr_iters] = {}; 162c2837b0SAndrii Nakryiko struct bpf_link *links[nr_iters] = {}; 172c2837b0SAndrii Nakryiko struct bpf_program *prog; 18886225bbSStanislav Fomichev int prog_fds[nr_iters], map_fds[nr_iters]; 19886225bbSStanislav Fomichev /* +1 to test for the info_len returned by kernel */ 20886225bbSStanislav Fomichev struct bpf_prog_info prog_infos[nr_iters + 1]; 21886225bbSStanislav Fomichev struct bpf_map_info map_infos[nr_iters + 1]; 222c2837b0SAndrii Nakryiko struct bpf_link_info link_infos[nr_iters + 1]; 23886225bbSStanislav Fomichev /* Each prog only uses one map. +1 to test nr_map_ids 24886225bbSStanislav Fomichev * returned by kernel. 25886225bbSStanislav Fomichev */ 26886225bbSStanislav Fomichev __u32 map_ids[nr_iters + 1]; 272c2837b0SAndrii Nakryiko char jited_insns[128], xlated_insns[128], zeros[128], tp_name[128]; 28886225bbSStanislav Fomichev __u32 i, next_id, info_len, nr_id_found, duration = 0; 29886225bbSStanislav Fomichev struct timespec real_time_ts, boot_time_ts; 30886225bbSStanislav Fomichev int err = 0; 31886225bbSStanislav Fomichev __u64 array_value; 32886225bbSStanislav Fomichev uid_t my_uid = getuid(); 33886225bbSStanislav Fomichev time_t now, load_time; 34886225bbSStanislav Fomichev 35886225bbSStanislav Fomichev err = bpf_prog_get_fd_by_id(0); 36886225bbSStanislav Fomichev CHECK(err >= 0 || errno != ENOENT, 37886225bbSStanislav Fomichev "get-fd-by-notexist-prog-id", "err %d errno %d\n", err, errno); 38886225bbSStanislav Fomichev 39886225bbSStanislav Fomichev err = bpf_map_get_fd_by_id(0); 40886225bbSStanislav Fomichev CHECK(err >= 0 || errno != ENOENT, 41886225bbSStanislav Fomichev "get-fd-by-notexist-map-id", "err %d errno %d\n", err, errno); 42886225bbSStanislav Fomichev 432c2837b0SAndrii Nakryiko err = bpf_link_get_fd_by_id(0); 442c2837b0SAndrii Nakryiko CHECK(err >= 0 || errno != ENOENT, 452c2837b0SAndrii Nakryiko "get-fd-by-notexist-link-id", "err %d errno %d\n", err, errno); 46886225bbSStanislav Fomichev 47886225bbSStanislav Fomichev /* Check bpf_obj_get_info_by_fd() */ 48886225bbSStanislav Fomichev bzero(zeros, sizeof(zeros)); 49886225bbSStanislav Fomichev for (i = 0; i < nr_iters; i++) { 50886225bbSStanislav Fomichev now = time(NULL); 512c2837b0SAndrii Nakryiko err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, 52886225bbSStanislav Fomichev &objs[i], &prog_fds[i]); 53886225bbSStanislav Fomichev /* test_obj_id.o is a dumb prog. It should never fail 54886225bbSStanislav Fomichev * to load. 55886225bbSStanislav Fomichev */ 5662d69f24SStanislav Fomichev if (CHECK_FAIL(err)) 5762d69f24SStanislav Fomichev continue; 58886225bbSStanislav Fomichev 59886225bbSStanislav Fomichev /* Insert a magic value to the map */ 60886225bbSStanislav Fomichev map_fds[i] = bpf_find_map(__func__, objs[i], "test_map_id"); 6162d69f24SStanislav Fomichev if (CHECK_FAIL(map_fds[i] < 0)) 6262d69f24SStanislav Fomichev goto done; 63886225bbSStanislav Fomichev err = bpf_map_update_elem(map_fds[i], &array_key, 64886225bbSStanislav Fomichev &array_magic_value, 0); 6562d69f24SStanislav Fomichev if (CHECK_FAIL(err)) 6662d69f24SStanislav Fomichev goto done; 67886225bbSStanislav Fomichev 682c2837b0SAndrii Nakryiko prog = bpf_object__find_program_by_title(objs[i], 692c2837b0SAndrii Nakryiko "raw_tp/sys_enter"); 702c2837b0SAndrii Nakryiko if (CHECK_FAIL(!prog)) 712c2837b0SAndrii Nakryiko goto done; 722c2837b0SAndrii Nakryiko links[i] = bpf_program__attach(prog); 732c2837b0SAndrii Nakryiko err = libbpf_get_error(links[i]); 742c2837b0SAndrii Nakryiko if (CHECK(err, "prog_attach", "prog #%d, err %d\n", i, err)) { 752c2837b0SAndrii Nakryiko links[i] = NULL; 762c2837b0SAndrii Nakryiko goto done; 772c2837b0SAndrii Nakryiko } 782c2837b0SAndrii Nakryiko 79886225bbSStanislav Fomichev /* Check getting map info */ 80886225bbSStanislav Fomichev info_len = sizeof(struct bpf_map_info) * 2; 81886225bbSStanislav Fomichev bzero(&map_infos[i], info_len); 82886225bbSStanislav Fomichev err = bpf_obj_get_info_by_fd(map_fds[i], &map_infos[i], 83886225bbSStanislav Fomichev &info_len); 84886225bbSStanislav Fomichev if (CHECK(err || 85886225bbSStanislav Fomichev map_infos[i].type != BPF_MAP_TYPE_ARRAY || 86886225bbSStanislav Fomichev map_infos[i].key_size != sizeof(__u32) || 87886225bbSStanislav Fomichev map_infos[i].value_size != sizeof(__u64) || 88886225bbSStanislav Fomichev map_infos[i].max_entries != 1 || 89886225bbSStanislav Fomichev map_infos[i].map_flags != 0 || 90886225bbSStanislav Fomichev info_len != sizeof(struct bpf_map_info) || 91886225bbSStanislav Fomichev strcmp((char *)map_infos[i].name, expected_map_name), 92886225bbSStanislav Fomichev "get-map-info(fd)", 93a918b03eSStanislav Fomichev "err %d errno %d type %d(%d) info_len %u(%zu) key_size %u value_size %u max_entries %u map_flags %X name %s(%s)\n", 94886225bbSStanislav Fomichev err, errno, 95886225bbSStanislav Fomichev map_infos[i].type, BPF_MAP_TYPE_ARRAY, 96886225bbSStanislav Fomichev info_len, sizeof(struct bpf_map_info), 97886225bbSStanislav Fomichev map_infos[i].key_size, 98886225bbSStanislav Fomichev map_infos[i].value_size, 99886225bbSStanislav Fomichev map_infos[i].max_entries, 100886225bbSStanislav Fomichev map_infos[i].map_flags, 101886225bbSStanislav Fomichev map_infos[i].name, expected_map_name)) 102886225bbSStanislav Fomichev goto done; 103886225bbSStanislav Fomichev 104886225bbSStanislav Fomichev /* Check getting prog info */ 105886225bbSStanislav Fomichev info_len = sizeof(struct bpf_prog_info) * 2; 106886225bbSStanislav Fomichev bzero(&prog_infos[i], info_len); 107886225bbSStanislav Fomichev bzero(jited_insns, sizeof(jited_insns)); 108886225bbSStanislav Fomichev bzero(xlated_insns, sizeof(xlated_insns)); 109886225bbSStanislav Fomichev prog_infos[i].jited_prog_insns = ptr_to_u64(jited_insns); 110886225bbSStanislav Fomichev prog_infos[i].jited_prog_len = sizeof(jited_insns); 111886225bbSStanislav Fomichev prog_infos[i].xlated_prog_insns = ptr_to_u64(xlated_insns); 112886225bbSStanislav Fomichev prog_infos[i].xlated_prog_len = sizeof(xlated_insns); 113886225bbSStanislav Fomichev prog_infos[i].map_ids = ptr_to_u64(map_ids + i); 114886225bbSStanislav Fomichev prog_infos[i].nr_map_ids = 2; 115886225bbSStanislav Fomichev err = clock_gettime(CLOCK_REALTIME, &real_time_ts); 11662d69f24SStanislav Fomichev if (CHECK_FAIL(err)) 11762d69f24SStanislav Fomichev goto done; 118886225bbSStanislav Fomichev err = clock_gettime(CLOCK_BOOTTIME, &boot_time_ts); 11962d69f24SStanislav Fomichev if (CHECK_FAIL(err)) 12062d69f24SStanislav Fomichev goto done; 121886225bbSStanislav Fomichev err = bpf_obj_get_info_by_fd(prog_fds[i], &prog_infos[i], 122886225bbSStanislav Fomichev &info_len); 123886225bbSStanislav Fomichev load_time = (real_time_ts.tv_sec - boot_time_ts.tv_sec) 124886225bbSStanislav Fomichev + (prog_infos[i].load_time / nsec_per_sec); 125886225bbSStanislav Fomichev if (CHECK(err || 1262c2837b0SAndrii Nakryiko prog_infos[i].type != BPF_PROG_TYPE_RAW_TRACEPOINT || 127886225bbSStanislav Fomichev info_len != sizeof(struct bpf_prog_info) || 1280ff97e56SAndrii Nakryiko (env.jit_enabled && !prog_infos[i].jited_prog_len) || 1290ff97e56SAndrii Nakryiko (env.jit_enabled && 130886225bbSStanislav Fomichev !memcmp(jited_insns, zeros, sizeof(zeros))) || 131886225bbSStanislav Fomichev !prog_infos[i].xlated_prog_len || 132886225bbSStanislav Fomichev !memcmp(xlated_insns, zeros, sizeof(zeros)) || 133886225bbSStanislav Fomichev load_time < now - 60 || load_time > now + 60 || 134886225bbSStanislav Fomichev prog_infos[i].created_by_uid != my_uid || 135886225bbSStanislav Fomichev prog_infos[i].nr_map_ids != 1 || 136886225bbSStanislav Fomichev *(int *)(long)prog_infos[i].map_ids != map_infos[i].id || 137886225bbSStanislav Fomichev strcmp((char *)prog_infos[i].name, expected_prog_name), 138886225bbSStanislav Fomichev "get-prog-info(fd)", 1392c2837b0SAndrii Nakryiko "err %d errno %d i %d type %d(%d) info_len %u(%zu) " 1402c2837b0SAndrii Nakryiko "jit_enabled %d jited_prog_len %u xlated_prog_len %u " 1412c2837b0SAndrii Nakryiko "jited_prog %d xlated_prog %d load_time %lu(%lu) " 1422c2837b0SAndrii Nakryiko "uid %u(%u) nr_map_ids %u(%u) map_id %u(%u) " 1432c2837b0SAndrii Nakryiko "name %s(%s)\n", 144886225bbSStanislav Fomichev err, errno, i, 145886225bbSStanislav Fomichev prog_infos[i].type, BPF_PROG_TYPE_SOCKET_FILTER, 146886225bbSStanislav Fomichev info_len, sizeof(struct bpf_prog_info), 1470ff97e56SAndrii Nakryiko env.jit_enabled, 148886225bbSStanislav Fomichev prog_infos[i].jited_prog_len, 149886225bbSStanislav Fomichev prog_infos[i].xlated_prog_len, 150886225bbSStanislav Fomichev !!memcmp(jited_insns, zeros, sizeof(zeros)), 151886225bbSStanislav Fomichev !!memcmp(xlated_insns, zeros, sizeof(zeros)), 152886225bbSStanislav Fomichev load_time, now, 153886225bbSStanislav Fomichev prog_infos[i].created_by_uid, my_uid, 154886225bbSStanislav Fomichev prog_infos[i].nr_map_ids, 1, 155886225bbSStanislav Fomichev *(int *)(long)prog_infos[i].map_ids, map_infos[i].id, 156886225bbSStanislav Fomichev prog_infos[i].name, expected_prog_name)) 157886225bbSStanislav Fomichev goto done; 1582c2837b0SAndrii Nakryiko 1592c2837b0SAndrii Nakryiko /* Check getting link info */ 1602c2837b0SAndrii Nakryiko info_len = sizeof(struct bpf_link_info) * 2; 1612c2837b0SAndrii Nakryiko bzero(&link_infos[i], info_len); 1629028bbccSAndrii Nakryiko link_infos[i].raw_tracepoint.tp_name = ptr_to_u64(&tp_name); 1632c2837b0SAndrii Nakryiko link_infos[i].raw_tracepoint.tp_name_len = sizeof(tp_name); 1642c2837b0SAndrii Nakryiko err = bpf_obj_get_info_by_fd(bpf_link__fd(links[i]), 1652c2837b0SAndrii Nakryiko &link_infos[i], &info_len); 1662c2837b0SAndrii Nakryiko if (CHECK(err || 1672c2837b0SAndrii Nakryiko link_infos[i].type != BPF_LINK_TYPE_RAW_TRACEPOINT || 1682c2837b0SAndrii Nakryiko link_infos[i].prog_id != prog_infos[i].id || 1699028bbccSAndrii Nakryiko link_infos[i].raw_tracepoint.tp_name != ptr_to_u64(&tp_name) || 1709028bbccSAndrii Nakryiko strcmp(u64_to_ptr(link_infos[i].raw_tracepoint.tp_name), 1712c2837b0SAndrii Nakryiko "sys_enter") || 1722c2837b0SAndrii Nakryiko info_len != sizeof(struct bpf_link_info), 1732c2837b0SAndrii Nakryiko "get-link-info(fd)", 1742c2837b0SAndrii Nakryiko "err %d errno %d info_len %u(%zu) type %d(%d) id %d " 1752c2837b0SAndrii Nakryiko "prog_id %d (%d) tp_name %s(%s)\n", 1762c2837b0SAndrii Nakryiko err, errno, 1772c2837b0SAndrii Nakryiko info_len, sizeof(struct bpf_link_info), 1782c2837b0SAndrii Nakryiko link_infos[i].type, BPF_LINK_TYPE_RAW_TRACEPOINT, 1792c2837b0SAndrii Nakryiko link_infos[i].id, 1802c2837b0SAndrii Nakryiko link_infos[i].prog_id, prog_infos[i].id, 1819028bbccSAndrii Nakryiko (const char *)u64_to_ptr(link_infos[i].raw_tracepoint.tp_name), 1822c2837b0SAndrii Nakryiko "sys_enter")) 1832c2837b0SAndrii Nakryiko goto done; 1842c2837b0SAndrii Nakryiko 185886225bbSStanislav Fomichev } 186886225bbSStanislav Fomichev 187886225bbSStanislav Fomichev /* Check bpf_prog_get_next_id() */ 188886225bbSStanislav Fomichev nr_id_found = 0; 189886225bbSStanislav Fomichev next_id = 0; 190886225bbSStanislav Fomichev while (!bpf_prog_get_next_id(next_id, &next_id)) { 191886225bbSStanislav Fomichev struct bpf_prog_info prog_info = {}; 192886225bbSStanislav Fomichev __u32 saved_map_id; 193886225bbSStanislav Fomichev int prog_fd; 194886225bbSStanislav Fomichev 195886225bbSStanislav Fomichev info_len = sizeof(prog_info); 196886225bbSStanislav Fomichev 197886225bbSStanislav Fomichev prog_fd = bpf_prog_get_fd_by_id(next_id); 198886225bbSStanislav Fomichev if (prog_fd < 0 && errno == ENOENT) 199886225bbSStanislav Fomichev /* The bpf_prog is in the dead row */ 200886225bbSStanislav Fomichev continue; 201886225bbSStanislav Fomichev if (CHECK(prog_fd < 0, "get-prog-fd(next_id)", 202886225bbSStanislav Fomichev "prog_fd %d next_id %d errno %d\n", 203886225bbSStanislav Fomichev prog_fd, next_id, errno)) 204886225bbSStanislav Fomichev break; 205886225bbSStanislav Fomichev 206886225bbSStanislav Fomichev for (i = 0; i < nr_iters; i++) 207886225bbSStanislav Fomichev if (prog_infos[i].id == next_id) 208886225bbSStanislav Fomichev break; 209886225bbSStanislav Fomichev 210886225bbSStanislav Fomichev if (i == nr_iters) 211886225bbSStanislav Fomichev continue; 212886225bbSStanislav Fomichev 213886225bbSStanislav Fomichev nr_id_found++; 214886225bbSStanislav Fomichev 215886225bbSStanislav Fomichev /* Negative test: 216886225bbSStanislav Fomichev * prog_info.nr_map_ids = 1 217886225bbSStanislav Fomichev * prog_info.map_ids = NULL 218886225bbSStanislav Fomichev */ 219886225bbSStanislav Fomichev prog_info.nr_map_ids = 1; 220886225bbSStanislav Fomichev err = bpf_obj_get_info_by_fd(prog_fd, &prog_info, &info_len); 221886225bbSStanislav Fomichev if (CHECK(!err || errno != EFAULT, 222886225bbSStanislav Fomichev "get-prog-fd-bad-nr-map-ids", "err %d errno %d(%d)", 223886225bbSStanislav Fomichev err, errno, EFAULT)) 224886225bbSStanislav Fomichev break; 225886225bbSStanislav Fomichev bzero(&prog_info, sizeof(prog_info)); 226886225bbSStanislav Fomichev info_len = sizeof(prog_info); 227886225bbSStanislav Fomichev 228886225bbSStanislav Fomichev saved_map_id = *(int *)((long)prog_infos[i].map_ids); 229886225bbSStanislav Fomichev prog_info.map_ids = prog_infos[i].map_ids; 230886225bbSStanislav Fomichev prog_info.nr_map_ids = 2; 231886225bbSStanislav Fomichev err = bpf_obj_get_info_by_fd(prog_fd, &prog_info, &info_len); 232886225bbSStanislav Fomichev prog_infos[i].jited_prog_insns = 0; 233886225bbSStanislav Fomichev prog_infos[i].xlated_prog_insns = 0; 234886225bbSStanislav Fomichev CHECK(err || info_len != sizeof(struct bpf_prog_info) || 235886225bbSStanislav Fomichev memcmp(&prog_info, &prog_infos[i], info_len) || 236886225bbSStanislav Fomichev *(int *)(long)prog_info.map_ids != saved_map_id, 237886225bbSStanislav Fomichev "get-prog-info(next_id->fd)", 238a918b03eSStanislav Fomichev "err %d errno %d info_len %u(%zu) memcmp %d map_id %u(%u)\n", 239886225bbSStanislav Fomichev err, errno, info_len, sizeof(struct bpf_prog_info), 240886225bbSStanislav Fomichev memcmp(&prog_info, &prog_infos[i], info_len), 241886225bbSStanislav Fomichev *(int *)(long)prog_info.map_ids, saved_map_id); 242886225bbSStanislav Fomichev close(prog_fd); 243886225bbSStanislav Fomichev } 244886225bbSStanislav Fomichev CHECK(nr_id_found != nr_iters, 245886225bbSStanislav Fomichev "check total prog id found by get_next_id", 246886225bbSStanislav Fomichev "nr_id_found %u(%u)\n", 247886225bbSStanislav Fomichev nr_id_found, nr_iters); 248886225bbSStanislav Fomichev 249886225bbSStanislav Fomichev /* Check bpf_map_get_next_id() */ 250886225bbSStanislav Fomichev nr_id_found = 0; 251886225bbSStanislav Fomichev next_id = 0; 252886225bbSStanislav Fomichev while (!bpf_map_get_next_id(next_id, &next_id)) { 253886225bbSStanislav Fomichev struct bpf_map_info map_info = {}; 254886225bbSStanislav Fomichev int map_fd; 255886225bbSStanislav Fomichev 256886225bbSStanislav Fomichev info_len = sizeof(map_info); 257886225bbSStanislav Fomichev 258886225bbSStanislav Fomichev map_fd = bpf_map_get_fd_by_id(next_id); 259886225bbSStanislav Fomichev if (map_fd < 0 && errno == ENOENT) 260886225bbSStanislav Fomichev /* The bpf_map is in the dead row */ 261886225bbSStanislav Fomichev continue; 262886225bbSStanislav Fomichev if (CHECK(map_fd < 0, "get-map-fd(next_id)", 263886225bbSStanislav Fomichev "map_fd %d next_id %u errno %d\n", 264886225bbSStanislav Fomichev map_fd, next_id, errno)) 265886225bbSStanislav Fomichev break; 266886225bbSStanislav Fomichev 267886225bbSStanislav Fomichev for (i = 0; i < nr_iters; i++) 268886225bbSStanislav Fomichev if (map_infos[i].id == next_id) 269886225bbSStanislav Fomichev break; 270886225bbSStanislav Fomichev 271886225bbSStanislav Fomichev if (i == nr_iters) 272886225bbSStanislav Fomichev continue; 273886225bbSStanislav Fomichev 274886225bbSStanislav Fomichev nr_id_found++; 275886225bbSStanislav Fomichev 276886225bbSStanislav Fomichev err = bpf_map_lookup_elem(map_fd, &array_key, &array_value); 27762d69f24SStanislav Fomichev if (CHECK_FAIL(err)) 27862d69f24SStanislav Fomichev goto done; 279886225bbSStanislav Fomichev 280886225bbSStanislav Fomichev err = bpf_obj_get_info_by_fd(map_fd, &map_info, &info_len); 281886225bbSStanislav Fomichev CHECK(err || info_len != sizeof(struct bpf_map_info) || 282886225bbSStanislav Fomichev memcmp(&map_info, &map_infos[i], info_len) || 283886225bbSStanislav Fomichev array_value != array_magic_value, 284886225bbSStanislav Fomichev "check get-map-info(next_id->fd)", 285a918b03eSStanislav Fomichev "err %d errno %d info_len %u(%zu) memcmp %d array_value %llu(%llu)\n", 286886225bbSStanislav Fomichev err, errno, info_len, sizeof(struct bpf_map_info), 287886225bbSStanislav Fomichev memcmp(&map_info, &map_infos[i], info_len), 288886225bbSStanislav Fomichev array_value, array_magic_value); 289886225bbSStanislav Fomichev 290886225bbSStanislav Fomichev close(map_fd); 291886225bbSStanislav Fomichev } 292886225bbSStanislav Fomichev CHECK(nr_id_found != nr_iters, 293886225bbSStanislav Fomichev "check total map id found by get_next_id", 294886225bbSStanislav Fomichev "nr_id_found %u(%u)\n", 295886225bbSStanislav Fomichev nr_id_found, nr_iters); 296886225bbSStanislav Fomichev 2972c2837b0SAndrii Nakryiko /* Check bpf_link_get_next_id() */ 2982c2837b0SAndrii Nakryiko nr_id_found = 0; 2992c2837b0SAndrii Nakryiko next_id = 0; 3002c2837b0SAndrii Nakryiko while (!bpf_link_get_next_id(next_id, &next_id)) { 3012c2837b0SAndrii Nakryiko struct bpf_link_info link_info; 3022c2837b0SAndrii Nakryiko int link_fd, cmp_res; 3032c2837b0SAndrii Nakryiko 3042c2837b0SAndrii Nakryiko info_len = sizeof(link_info); 3052c2837b0SAndrii Nakryiko memset(&link_info, 0, info_len); 3062c2837b0SAndrii Nakryiko 3072c2837b0SAndrii Nakryiko link_fd = bpf_link_get_fd_by_id(next_id); 3082c2837b0SAndrii Nakryiko if (link_fd < 0 && errno == ENOENT) 3092c2837b0SAndrii Nakryiko /* The bpf_link is in the dead row */ 3102c2837b0SAndrii Nakryiko continue; 3112c2837b0SAndrii Nakryiko if (CHECK(link_fd < 0, "get-link-fd(next_id)", 3122c2837b0SAndrii Nakryiko "link_fd %d next_id %u errno %d\n", 3132c2837b0SAndrii Nakryiko link_fd, next_id, errno)) 3142c2837b0SAndrii Nakryiko break; 3152c2837b0SAndrii Nakryiko 316886225bbSStanislav Fomichev for (i = 0; i < nr_iters; i++) 3172c2837b0SAndrii Nakryiko if (link_infos[i].id == next_id) 3182c2837b0SAndrii Nakryiko break; 3192c2837b0SAndrii Nakryiko 3202c2837b0SAndrii Nakryiko if (i == nr_iters) 3212c2837b0SAndrii Nakryiko continue; 3222c2837b0SAndrii Nakryiko 3232c2837b0SAndrii Nakryiko nr_id_found++; 3242c2837b0SAndrii Nakryiko 3252c2837b0SAndrii Nakryiko err = bpf_obj_get_info_by_fd(link_fd, &link_info, &info_len); 3262c2837b0SAndrii Nakryiko cmp_res = memcmp(&link_info, &link_infos[i], 3272c2837b0SAndrii Nakryiko offsetof(struct bpf_link_info, raw_tracepoint)); 3282c2837b0SAndrii Nakryiko CHECK(err || info_len != sizeof(link_info) || cmp_res, 3292c2837b0SAndrii Nakryiko "check get-link-info(next_id->fd)", 3302c2837b0SAndrii Nakryiko "err %d errno %d info_len %u(%zu) memcmp %d\n", 3312c2837b0SAndrii Nakryiko err, errno, info_len, sizeof(struct bpf_link_info), 3322c2837b0SAndrii Nakryiko cmp_res); 3332c2837b0SAndrii Nakryiko 3342c2837b0SAndrii Nakryiko close(link_fd); 3352c2837b0SAndrii Nakryiko } 3362c2837b0SAndrii Nakryiko CHECK(nr_id_found != nr_iters, 3372c2837b0SAndrii Nakryiko "check total link id found by get_next_id", 3382c2837b0SAndrii Nakryiko "nr_id_found %u(%u)\n", nr_id_found, nr_iters); 3392c2837b0SAndrii Nakryiko 3402c2837b0SAndrii Nakryiko done: 3412c2837b0SAndrii Nakryiko for (i = 0; i < nr_iters; i++) { 3422c2837b0SAndrii Nakryiko bpf_link__destroy(links[i]); 343886225bbSStanislav Fomichev bpf_object__close(objs[i]); 344886225bbSStanislav Fomichev } 3452c2837b0SAndrii Nakryiko } 346