@@ -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+
26022731cleanup4 :
26032732 err = bpf_prog_detach_opts (fd4 , loopback , target , & optd );
26042733 ASSERT_OK (err , "prog_detach" );
0 commit comments