Skip to content

Commit 3822538

Browse files
committed
selftests/bpf: Add additional mprog query test coverage
Add several new test cases which assert corner cases on the mprog query mechanism, for example, around passing in a too small or a larger array than the current count. ./test_progs -t tc_opts torvalds#252 tc_opts_after:OK torvalds#253 tc_opts_append:OK torvalds#254 tc_opts_basic:OK torvalds#255 tc_opts_before:OK torvalds#256 tc_opts_chain_classic:OK torvalds#257 tc_opts_chain_mixed:OK torvalds#258 tc_opts_delete_empty:OK torvalds#259 tc_opts_demixed:OK torvalds#260 tc_opts_detach:OK torvalds#261 tc_opts_detach_after:OK torvalds#262 tc_opts_detach_before:OK torvalds#263 tc_opts_dev_cleanup:OK torvalds#264 tc_opts_invalid:OK torvalds#265 tc_opts_max:OK torvalds#266 tc_opts_mixed:OK torvalds#267 tc_opts_prepend:OK torvalds#268 tc_opts_query:OK torvalds#269 tc_opts_query_attach:OK torvalds#270 tc_opts_replace:OK torvalds#271 tc_opts_revision:OK Summary: 20/0 PASSED, 0 SKIPPED, 0 FAILED Signed-off-by: Daniel Borkmann <[email protected]>
1 parent a3c2dd9 commit 3822538

File tree

1 file changed

+130
-1
lines changed
  • tools/testing/selftests/bpf/prog_tests

1 file changed

+130
-1
lines changed

tools/testing/selftests/bpf/prog_tests/tc_opts.c

+130-1
Original file line numberDiff line numberDiff line change
@@ -2471,7 +2471,7 @@ static void test_tc_opts_query_target(int target)
24712471
__u32 fd1, fd2, fd3, fd4, id1, id2, id3, id4;
24722472
struct test_tc_link *skel;
24732473
union bpf_attr attr;
2474-
__u32 prog_ids[5];
2474+
__u32 prog_ids[10];
24752475
int err;
24762476

24772477
skel = test_tc_link__open_and_load();
@@ -2599,6 +2599,135 @@ static void test_tc_opts_query_target(int target)
25992599
ASSERT_EQ(attr.query.link_ids, 0, "link_ids");
26002600
ASSERT_EQ(attr.query.link_attach_flags, 0, "link_attach_flags");
26012601

2602+
/* Test 3: Query with smaller prog_ids array */
2603+
memset(&attr, 0, attr_size);
2604+
attr.query.target_ifindex = loopback;
2605+
attr.query.attach_type = target;
2606+
2607+
memset(prog_ids, 0, sizeof(prog_ids));
2608+
attr.query.prog_ids = ptr_to_u64(prog_ids);
2609+
attr.query.count = 2;
2610+
2611+
err = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, attr_size);
2612+
ASSERT_EQ(err, -1, "prog_query_should_fail");
2613+
ASSERT_EQ(errno, ENOSPC, "prog_query_should_fail");
2614+
2615+
ASSERT_EQ(attr.query.count, 4, "count");
2616+
ASSERT_EQ(attr.query.revision, 5, "revision");
2617+
ASSERT_EQ(attr.query.query_flags, 0, "query_flags");
2618+
ASSERT_EQ(attr.query.attach_flags, 0, "attach_flags");
2619+
ASSERT_EQ(attr.query.target_ifindex, loopback, "target_ifindex");
2620+
ASSERT_EQ(attr.query.attach_type, target, "attach_type");
2621+
ASSERT_EQ(attr.query.prog_ids, ptr_to_u64(prog_ids), "prog_ids");
2622+
ASSERT_EQ(prog_ids[0], id1, "prog_ids[0]");
2623+
ASSERT_EQ(prog_ids[1], id2, "prog_ids[1]");
2624+
ASSERT_EQ(prog_ids[2], 0, "prog_ids[2]");
2625+
ASSERT_EQ(prog_ids[3], 0, "prog_ids[3]");
2626+
ASSERT_EQ(prog_ids[4], 0, "prog_ids[4]");
2627+
ASSERT_EQ(attr.query.prog_attach_flags, 0, "prog_attach_flags");
2628+
ASSERT_EQ(attr.query.link_ids, 0, "link_ids");
2629+
ASSERT_EQ(attr.query.link_attach_flags, 0, "link_attach_flags");
2630+
2631+
/* Test 4: Query with larger prog_ids array */
2632+
memset(&attr, 0, attr_size);
2633+
attr.query.target_ifindex = loopback;
2634+
attr.query.attach_type = target;
2635+
2636+
memset(prog_ids, 0, sizeof(prog_ids));
2637+
attr.query.prog_ids = ptr_to_u64(prog_ids);
2638+
attr.query.count = 10;
2639+
2640+
err = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, attr_size);
2641+
if (!ASSERT_OK(err, "prog_query"))
2642+
goto cleanup4;
2643+
2644+
ASSERT_EQ(attr.query.count, 4, "count");
2645+
ASSERT_EQ(attr.query.revision, 5, "revision");
2646+
ASSERT_EQ(attr.query.query_flags, 0, "query_flags");
2647+
ASSERT_EQ(attr.query.attach_flags, 0, "attach_flags");
2648+
ASSERT_EQ(attr.query.target_ifindex, loopback, "target_ifindex");
2649+
ASSERT_EQ(attr.query.attach_type, target, "attach_type");
2650+
ASSERT_EQ(attr.query.prog_ids, ptr_to_u64(prog_ids), "prog_ids");
2651+
ASSERT_EQ(prog_ids[0], id1, "prog_ids[0]");
2652+
ASSERT_EQ(prog_ids[1], id2, "prog_ids[1]");
2653+
ASSERT_EQ(prog_ids[2], id3, "prog_ids[2]");
2654+
ASSERT_EQ(prog_ids[3], id4, "prog_ids[3]");
2655+
ASSERT_EQ(prog_ids[4], 0, "prog_ids[4]");
2656+
ASSERT_EQ(attr.query.prog_attach_flags, 0, "prog_attach_flags");
2657+
ASSERT_EQ(attr.query.link_ids, 0, "link_ids");
2658+
ASSERT_EQ(attr.query.link_attach_flags, 0, "link_attach_flags");
2659+
2660+
/* Test 5: Query with NULL prog_ids array but with count > 0 */
2661+
memset(&attr, 0, attr_size);
2662+
attr.query.target_ifindex = loopback;
2663+
attr.query.attach_type = target;
2664+
2665+
memset(prog_ids, 0, sizeof(prog_ids));
2666+
attr.query.count = sizeof(prog_ids);
2667+
2668+
err = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, attr_size);
2669+
if (!ASSERT_OK(err, "prog_query"))
2670+
goto cleanup4;
2671+
2672+
ASSERT_EQ(attr.query.count, 4, "count");
2673+
ASSERT_EQ(attr.query.revision, 5, "revision");
2674+
ASSERT_EQ(attr.query.query_flags, 0, "query_flags");
2675+
ASSERT_EQ(attr.query.attach_flags, 0, "attach_flags");
2676+
ASSERT_EQ(attr.query.target_ifindex, loopback, "target_ifindex");
2677+
ASSERT_EQ(attr.query.attach_type, target, "attach_type");
2678+
ASSERT_EQ(prog_ids[0], 0, "prog_ids[0]");
2679+
ASSERT_EQ(prog_ids[1], 0, "prog_ids[1]");
2680+
ASSERT_EQ(prog_ids[2], 0, "prog_ids[2]");
2681+
ASSERT_EQ(prog_ids[3], 0, "prog_ids[3]");
2682+
ASSERT_EQ(prog_ids[4], 0, "prog_ids[4]");
2683+
ASSERT_EQ(attr.query.prog_ids, 0, "prog_ids");
2684+
ASSERT_EQ(attr.query.prog_attach_flags, 0, "prog_attach_flags");
2685+
ASSERT_EQ(attr.query.link_ids, 0, "link_ids");
2686+
ASSERT_EQ(attr.query.link_attach_flags, 0, "link_attach_flags");
2687+
2688+
/* Test 6: Query with non-NULL prog_ids array but with count == 0 */
2689+
memset(&attr, 0, attr_size);
2690+
attr.query.target_ifindex = loopback;
2691+
attr.query.attach_type = target;
2692+
2693+
memset(prog_ids, 0, sizeof(prog_ids));
2694+
attr.query.prog_ids = ptr_to_u64(prog_ids);
2695+
2696+
err = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, attr_size);
2697+
if (!ASSERT_OK(err, "prog_query"))
2698+
goto cleanup4;
2699+
2700+
ASSERT_EQ(attr.query.count, 4, "count");
2701+
ASSERT_EQ(attr.query.revision, 5, "revision");
2702+
ASSERT_EQ(attr.query.query_flags, 0, "query_flags");
2703+
ASSERT_EQ(attr.query.attach_flags, 0, "attach_flags");
2704+
ASSERT_EQ(attr.query.target_ifindex, loopback, "target_ifindex");
2705+
ASSERT_EQ(attr.query.attach_type, target, "attach_type");
2706+
ASSERT_EQ(prog_ids[0], 0, "prog_ids[0]");
2707+
ASSERT_EQ(prog_ids[1], 0, "prog_ids[1]");
2708+
ASSERT_EQ(prog_ids[2], 0, "prog_ids[2]");
2709+
ASSERT_EQ(prog_ids[3], 0, "prog_ids[3]");
2710+
ASSERT_EQ(prog_ids[4], 0, "prog_ids[4]");
2711+
ASSERT_EQ(attr.query.prog_ids, ptr_to_u64(prog_ids), "prog_ids");
2712+
ASSERT_EQ(attr.query.prog_attach_flags, 0, "prog_attach_flags");
2713+
ASSERT_EQ(attr.query.link_ids, 0, "link_ids");
2714+
ASSERT_EQ(attr.query.link_attach_flags, 0, "link_attach_flags");
2715+
2716+
/* Test 7: Query with invalid flags */
2717+
attr.query.attach_flags = 0;
2718+
attr.query.query_flags = 1;
2719+
2720+
err = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, attr_size);
2721+
ASSERT_EQ(err, -1, "prog_query_should_fail");
2722+
ASSERT_EQ(errno, EINVAL, "prog_query_should_fail");
2723+
2724+
attr.query.attach_flags = 1;
2725+
attr.query.query_flags = 0;
2726+
2727+
err = syscall(__NR_bpf, BPF_PROG_QUERY, &attr, attr_size);
2728+
ASSERT_EQ(err, -1, "prog_query_should_fail");
2729+
ASSERT_EQ(errno, EINVAL, "prog_query_should_fail");
2730+
26022731
cleanup4:
26032732
err = bpf_prog_detach_opts(fd4, loopback, target, &optd);
26042733
ASSERT_OK(err, "prog_detach");

0 commit comments

Comments
 (0)