@@ -2471,7 +2471,7 @@ static void test_tc_opts_query_target(int target)
2471
2471
__u32 fd1 , fd2 , fd3 , fd4 , id1 , id2 , id3 , id4 ;
2472
2472
struct test_tc_link * skel ;
2473
2473
union bpf_attr attr ;
2474
- __u32 prog_ids [5 ];
2474
+ __u32 prog_ids [10 ];
2475
2475
int err ;
2476
2476
2477
2477
skel = test_tc_link__open_and_load ();
@@ -2599,6 +2599,135 @@ static void test_tc_opts_query_target(int target)
2599
2599
ASSERT_EQ (attr .query .link_ids , 0 , "link_ids" );
2600
2600
ASSERT_EQ (attr .query .link_attach_flags , 0 , "link_attach_flags" );
2601
2601
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
+
2602
2731
cleanup4 :
2603
2732
err = bpf_prog_detach_opts (fd4 , loopback , target , & optd );
2604
2733
ASSERT_OK (err , "prog_detach" );
0 commit comments