1886225bbSStanislav Fomichev // SPDX-License-Identifier: GPL-2.0
2886225bbSStanislav Fomichev #include <test_progs.h>
3886225bbSStanislav Fomichev 
42c2837b0SAndrii Nakryiko #define nr_iters 2
52c2837b0SAndrii Nakryiko 
serial_test_bpf_obj_id(void)6d3f7b166SYucong 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;
10afef88e6SDaniel Müller 	const char *file = "./test_obj_id.bpf.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 
47*c5a237a4SIlya Leoshkevich 	/* Check bpf_map_get_info_by_fd() */
48886225bbSStanislav Fomichev 	bzero(zeros, sizeof(zeros));
49886225bbSStanislav Fomichev 	for (i = 0; i < nr_iters; i++) {
50886225bbSStanislav Fomichev 		now = time(NULL);
51cbdb1461SAndrii Nakryiko 		err = bpf_prog_test_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 
68a393ea80SKui-Feng Lee 		prog = bpf_object__find_program_by_name(objs[i],
69a393ea80SKui-Feng Lee 							"test_obj_id");
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);
82*c5a237a4SIlya Leoshkevich 		err = bpf_map_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;
121*c5a237a4SIlya Leoshkevich 		err = bpf_prog_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);
164*c5a237a4SIlya Leoshkevich 		err = bpf_link_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;
220*c5a237a4SIlya Leoshkevich 		err = bpf_prog_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;
231*c5a237a4SIlya Leoshkevich 		err = bpf_prog_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 
280*c5a237a4SIlya Leoshkevich 		err = bpf_map_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 
325*c5a237a4SIlya Leoshkevich 		err = bpf_link_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