@@ -10,10 +10,14 @@ static void print_verifier_log(const char *log)
10
10
fprintf (stdout , "VERIFIER LOG:\n=============\n%s=============\n" , log );
11
11
}
12
12
13
- static void test_aux (const char * main_prog_name , const char * freplace_prog_name , bool expect_load )
13
+ static void test_aux (const char * main_prog_name ,
14
+ const char * to_be_replaced ,
15
+ const char * replacement ,
16
+ bool expect_load )
14
17
{
15
18
struct changes_pkt_data_freplace * freplace = NULL ;
16
19
struct bpf_program * freplace_prog = NULL ;
20
+ struct bpf_program * main_prog = NULL ;
17
21
LIBBPF_OPTS (bpf_object_open_opts , opts );
18
22
struct changes_pkt_data * main = NULL ;
19
23
char log [16 * 1024 ];
@@ -26,21 +30,25 @@ static void test_aux(const char *main_prog_name, const char *freplace_prog_name,
26
30
main = changes_pkt_data__open_opts (& opts );
27
31
if (!ASSERT_OK_PTR (main , "changes_pkt_data__open" ))
28
32
goto out ;
33
+ main_prog = bpf_object__find_program_by_name (main -> obj , main_prog_name );
34
+ if (!ASSERT_OK_PTR (main_prog , "main_prog" ))
35
+ goto out ;
36
+ bpf_program__set_autoload (main_prog , true);
29
37
err = changes_pkt_data__load (main );
30
38
print_verifier_log (log );
31
39
if (!ASSERT_OK (err , "changes_pkt_data__load" ))
32
40
goto out ;
33
41
freplace = changes_pkt_data_freplace__open_opts (& opts );
34
42
if (!ASSERT_OK_PTR (freplace , "changes_pkt_data_freplace__open" ))
35
43
goto out ;
36
- freplace_prog = bpf_object__find_program_by_name (freplace -> obj , freplace_prog_name );
44
+ freplace_prog = bpf_object__find_program_by_name (freplace -> obj , replacement );
37
45
if (!ASSERT_OK_PTR (freplace_prog , "freplace_prog" ))
38
46
goto out ;
39
47
bpf_program__set_autoload (freplace_prog , true);
40
48
bpf_program__set_autoattach (freplace_prog , true);
41
49
bpf_program__set_attach_target (freplace_prog ,
42
- bpf_program__fd (main -> progs . dummy ),
43
- main_prog_name );
50
+ bpf_program__fd (main_prog ),
51
+ to_be_replaced );
44
52
err = changes_pkt_data_freplace__load (freplace );
45
53
print_verifier_log (log );
46
54
if (expect_load ) {
@@ -62,15 +70,38 @@ static void test_aux(const char *main_prog_name, const char *freplace_prog_name,
62
70
* that either do or do not. It is only ok to freplace subprograms
63
71
* that do not change packet data with those that do not as well.
64
72
* The below tests check outcomes for each combination of such freplace.
73
+ * Also test a case when main subprogram itself is replaced and is a single
74
+ * subprogram in a program.
65
75
*/
66
76
void test_changes_pkt_data_freplace (void )
67
77
{
68
- if (test__start_subtest ("changes_with_changes" ))
69
- test_aux ("changes_pkt_data" , "changes_pkt_data" , true);
70
- if (test__start_subtest ("changes_with_doesnt_change" ))
71
- test_aux ("changes_pkt_data" , "does_not_change_pkt_data" , true);
72
- if (test__start_subtest ("doesnt_change_with_changes" ))
73
- test_aux ("does_not_change_pkt_data" , "changes_pkt_data" , false);
74
- if (test__start_subtest ("doesnt_change_with_doesnt_change" ))
75
- test_aux ("does_not_change_pkt_data" , "does_not_change_pkt_data" , true);
78
+ struct {
79
+ const char * main ;
80
+ const char * to_be_replaced ;
81
+ bool changes ;
82
+ } mains [] = {
83
+ { "main_with_subprogs" , "changes_pkt_data" , true },
84
+ { "main_with_subprogs" , "does_not_change_pkt_data" , false },
85
+ { "main_changes" , "main_changes" , true },
86
+ { "main_does_not_change" , "main_does_not_change" , false },
87
+ };
88
+ struct {
89
+ const char * func ;
90
+ bool changes ;
91
+ } replacements [] = {
92
+ { "changes_pkt_data" , true },
93
+ { "does_not_change_pkt_data" , false }
94
+ };
95
+ char buf [64 ];
96
+
97
+ for (int i = 0 ; i < ARRAY_SIZE (mains ); ++ i ) {
98
+ for (int j = 0 ; j < ARRAY_SIZE (replacements ); ++ j ) {
99
+ snprintf (buf , sizeof (buf ), "%s_with_%s" ,
100
+ mains [i ].to_be_replaced , replacements [j ].func );
101
+ if (!test__start_subtest (buf ))
102
+ continue ;
103
+ test_aux (mains [i ].main , mains [i ].to_be_replaced , replacements [j ].func ,
104
+ mains [i ].changes || !replacements [j ].changes );
105
+ }
106
+ }
76
107
}
0 commit comments