]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests/bpf: Test array presets in veristat
authorMykyta Yatsenko <yatsenko@meta.com>
Wed, 25 Jun 2025 16:59:04 +0000 (17:59 +0100)
committerAndrii Nakryiko <andrii@kernel.org>
Thu, 26 Jun 2025 17:28:51 +0000 (10:28 -0700)
Modify existing veristat tests to verify that array presets are applied
as expected.
Introduce few negative tests as well to check that common error modes
are handled.

Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/20250625165904.87820-4-mykyta.yatsenko5@gmail.com
tools/testing/selftests/bpf/prog_tests/test_veristat.c
tools/testing/selftests/bpf/progs/set_global_vars.c

index 47b56c258f3f43d3a706b06b10deb012ec1158f8..367f47e4a936d43c66926f21a1422390232fc46e 100644 (file)
@@ -60,13 +60,19 @@ static void test_set_global_vars_succeeds(void)
            " -G \"var_s8 = -128\" "\
            " -G \"var_u8 = 255\" "\
            " -G \"var_ea = EA2\" "\
-           " -G \"var_eb = EB2\" "\
-           " -G \"var_ec = EC2\" "\
+           " -G \"var_eb  =  EB2\" "\
+           " -G \"var_ec=EC2\" "\
            " -G \"var_b = 1\" "\
-           " -G \"struct1.struct2.u.var_u8 = 170\" "\
+           " -G \"struct1[2].struct2[1][2].u.var_u8[2]=170\" "\
            " -G \"union1.struct3.var_u8_l = 0xaa\" "\
            " -G \"union1.struct3.var_u8_h = 0xaa\" "\
-           "-vl2 > %s", fix->veristat, fix->tmpfile);
+           " -G \"arr[3]= 171\" "      \
+           " -G \"arr[EA2] =172\" "    \
+           " -G \"enum_arr[EC2]=EA3\" " \
+           " -G \"three_d[31][7][EA2]=173\"" \
+           " -G \"struct1[2].struct2[1][2].u.mat[5][3]=174\" " \
+           " -G \"struct11 [ 7 ] [ 5 ] .struct2[0][1].u.mat[3][0] = 175\" " \
+           " -vl2 > %s", fix->veristat, fix->tmpfile);
 
        read(fix->fd, fix->output, fix->sz);
        __CHECK_STR("_w=0xf000000000000001 ", "var_s64 = 0xf000000000000001");
@@ -81,8 +87,14 @@ static void test_set_global_vars_succeeds(void)
        __CHECK_STR("_w=12 ", "var_eb = EB2");
        __CHECK_STR("_w=13 ", "var_ec = EC2");
        __CHECK_STR("_w=1 ", "var_b = 1");
-       __CHECK_STR("_w=170 ", "struct1.struct2.u.var_u8 = 170");
+       __CHECK_STR("_w=170 ", "struct1[2].struct2[1][2].u.var_u8[2]=170");
        __CHECK_STR("_w=0xaaaa ", "union1.var_u16 = 0xaaaa");
+       __CHECK_STR("_w=171 ", "arr[3]= 171");
+       __CHECK_STR("_w=172 ", "arr[EA2] =172");
+       __CHECK_STR("_w=10 ", "enum_arr[EC2]=EA3");
+       __CHECK_STR("_w=173 ", "matrix[31][7][11]=173");
+       __CHECK_STR("_w=174 ", "struct1[2].struct2[1][2].u.mat[5][3]=174");
+       __CHECK_STR("_w=175 ", "struct11[7][5].struct2[0][1].u.mat[3][0]=175");
 
 out:
        teardown_fixture(fix);
@@ -129,6 +141,95 @@ out:
        teardown_fixture(fix);
 }
 
+static void test_unsupported_ptr_array_type(void)
+{
+       struct fixture *fix = init_fixture();
+
+       SYS_FAIL(out,
+                "%s set_global_vars.bpf.o -G \"ptr_arr[0] = 0\" -vl2 2> %s",
+                fix->veristat, fix->tmpfile);
+
+       read(fix->fd, fix->output, fix->sz);
+       __CHECK_STR("Can't set ptr_arr[0]. Only ints and enums are supported", "ptr_arr");
+
+out:
+       teardown_fixture(fix);
+}
+
+static void test_array_out_of_bounds(void)
+{
+       struct fixture *fix = init_fixture();
+
+       SYS_FAIL(out,
+                "%s set_global_vars.bpf.o -G \"arr[99] = 0\" -vl2 2> %s",
+                fix->veristat, fix->tmpfile);
+
+       read(fix->fd, fix->output, fix->sz);
+       __CHECK_STR("Array index 99 is out of bounds", "arr[99]");
+
+out:
+       teardown_fixture(fix);
+}
+
+static void test_array_index_not_found(void)
+{
+       struct fixture *fix = init_fixture();
+
+       SYS_FAIL(out,
+                "%s set_global_vars.bpf.o -G \"arr[EG2] = 0\" -vl2 2> %s",
+                fix->veristat, fix->tmpfile);
+
+       read(fix->fd, fix->output, fix->sz);
+       __CHECK_STR("Can't resolve enum value EG2", "arr[EG2]");
+
+out:
+       teardown_fixture(fix);
+}
+
+static void test_array_index_for_non_array(void)
+{
+       struct fixture *fix = init_fixture();
+
+       SYS_FAIL(out,
+                "%s set_global_vars.bpf.o -G \"var_b[0] = 1\" -vl2 2> %s",
+                fix->veristat, fix->tmpfile);
+
+       pread(fix->fd, fix->output, fix->sz, 0);
+       __CHECK_STR("Array index is not expected for var_b", "var_b[0] = 1");
+
+       SYS_FAIL(out,
+                "%s set_global_vars.bpf.o -G \"union1.struct3[0].var_u8_l=1\" -vl2 2> %s",
+                fix->veristat, fix->tmpfile);
+
+       pread(fix->fd, fix->output, fix->sz, 0);
+       __CHECK_STR("Array index is not expected for struct3", "union1.struct3[0].var_u8_l=1");
+
+out:
+       teardown_fixture(fix);
+}
+
+static void test_no_array_index_for_array(void)
+{
+       struct fixture *fix = init_fixture();
+
+       SYS_FAIL(out,
+                "%s set_global_vars.bpf.o -G \"arr = 1\" -vl2 2> %s",
+                fix->veristat, fix->tmpfile);
+
+       pread(fix->fd, fix->output, fix->sz, 0);
+       __CHECK_STR("Can't set arr. Only ints and enums are supported", "arr = 1");
+
+       SYS_FAIL(out,
+                "%s set_global_vars.bpf.o -G \"struct1[0].struct2.u.var_u8[2]=1\" -vl2 2> %s",
+                fix->veristat, fix->tmpfile);
+
+       pread(fix->fd, fix->output, fix->sz, 0);
+       __CHECK_STR("Can't resolve field u for non-composite type", "struct1[0].struct2.u.var_u8[2]=1");
+
+out:
+       teardown_fixture(fix);
+}
+
 void test_veristat(void)
 {
        if (test__start_subtest("set_global_vars_succeeds"))
@@ -139,6 +240,22 @@ void test_veristat(void)
 
        if (test__start_subtest("set_global_vars_from_file_succeeds"))
                test_set_global_vars_from_file_succeeds();
+
+       if (test__start_subtest("test_unsupported_ptr_array_type"))
+               test_unsupported_ptr_array_type();
+
+       if (test__start_subtest("test_array_out_of_bounds"))
+               test_array_out_of_bounds();
+
+       if (test__start_subtest("test_array_index_not_found"))
+               test_array_index_not_found();
+
+       if (test__start_subtest("test_array_index_for_non_array"))
+               test_array_index_for_non_array();
+
+       if (test__start_subtest("test_no_array_index_for_array"))
+               test_no_array_index_for_array();
+
 }
 
 #undef __CHECK_STR
index 90f5656c3991142df7d15d85160b4093bc10b40d..ebaef28b2cb3551a2406f8508f333b7d2699f42a 100644 (file)
@@ -7,22 +7,30 @@
 
 char _license[] SEC("license") = "GPL";
 
-enum Enum { EA1 = 0, EA2 = 11 };
+typedef __s32 s32;
+typedef s32 i32;
+typedef __u8 u8;
+
+enum Enum { EA1 = 0, EA2 = 11, EA3 = 10 };
 enum Enumu64 {EB1 = 0llu, EB2 = 12llu };
 enum Enums64 { EC1 = 0ll, EC2 = 13ll };
 
 const volatile __s64 var_s64 = -1;
 const volatile __u64 var_u64 = 0;
-const volatile __s32 var_s32 = -1;
+const volatile i32 var_s32 = -1;
 const volatile __u32 var_u32 = 0;
 const volatile __s16 var_s16 = -1;
 const volatile __u16 var_u16 = 0;
 const volatile __s8 var_s8 = -1;
-const volatile __u8 var_u8 = 0;
+const volatile u8 var_u8 = 0;
 const volatile enum Enum var_ea = EA1;
 const volatile enum Enumu64 var_eb = EB1;
 const volatile enum Enums64 var_ec = EC1;
 const volatile bool var_b = false;
+const volatile i32 arr[32];
+const volatile enum Enum enum_arr[32];
+const volatile i32 three_d[47][19][17];
+const volatile i32 *ptr_arr[32];
 
 struct Struct {
        int:16;
@@ -35,34 +43,38 @@ struct Struct {
                volatile struct {
                        const int:1;
                        union {
-                               const volatile __u8 var_u8;
+                               const volatile u8 var_u8[3];
                                const volatile __s16 filler3;
                                const int:1;
+                               s32 mat[7][5];
                        } u;
                };
-       } struct2;
+       } struct2[2][4];
 };
 
 const volatile __u32 stru = 0; /* same prefix as below */
-const volatile struct Struct struct1 = {.struct2 = {.u = {.var_u8 = 1}}};
+const volatile struct Struct struct1[3];
+const volatile struct Struct struct11[11][7];
 
-union Union {
-       __u16 var_u16;
-       struct Struct3 {
-               struct {
-                       __u8 var_u8_l;
-               };
+struct Struct3 {
+       struct {
+               u8 var_u8_l;
+       };
+       struct {
                struct {
-                       struct {
-                               __u8 var_u8_h;
-                       };
+                       u8 var_u8_h;
                };
-       } struct3;
+       };
 };
 
-const volatile union Union union1 = {.var_u16 = -1};
+typedef struct Struct3 Struct3_t;
 
-char arr[4] = {0};
+union Union {
+       __u16 var_u16;
+       Struct3_t struct3;
+};
+
+const volatile union Union union1 = {.var_u16 = -1};
 
 SEC("socket")
 int test_set_globals(void *ctx)
@@ -81,8 +93,14 @@ int test_set_globals(void *ctx)
        a = var_eb;
        a = var_ec;
        a = var_b;
-       a = struct1.struct2.u.var_u8;
+       a = struct1[2].struct2[1][2].u.var_u8[2];
        a = union1.var_u16;
+       a = arr[3];
+       a = arr[EA2];
+       a = enum_arr[EC2];
+       a = three_d[31][7][EA2];
+       a = struct1[2].struct2[1][2].u.mat[5][3];
+       a = struct11[7][5].struct2[0][1].u.mat[3][0];
 
        return a;
 }