@@ -10,10 +10,14 @@ static void print_verifier_log(const char *log)
1010 fprintf (stdout , "VERIFIER LOG:\n=============\n%s=============\n" , log );
1111}
1212
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 )
1417{
1518 struct changes_pkt_data_freplace * freplace = NULL ;
1619 struct bpf_program * freplace_prog = NULL ;
20+ struct bpf_program * main_prog = NULL ;
1721 LIBBPF_OPTS (bpf_object_open_opts , opts );
1822 struct changes_pkt_data * main = NULL ;
1923 char log [16 * 1024 ];
@@ -26,21 +30,25 @@ static void test_aux(const char *main_prog_name, const char *freplace_prog_name,
2630 main = changes_pkt_data__open_opts (& opts );
2731 if (!ASSERT_OK_PTR (main , "changes_pkt_data__open" ))
2832 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);
2937 err = changes_pkt_data__load (main );
3038 print_verifier_log (log );
3139 if (!ASSERT_OK (err , "changes_pkt_data__load" ))
3240 goto out ;
3341 freplace = changes_pkt_data_freplace__open_opts (& opts );
3442 if (!ASSERT_OK_PTR (freplace , "changes_pkt_data_freplace__open" ))
3543 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 );
3745 if (!ASSERT_OK_PTR (freplace_prog , "freplace_prog" ))
3846 goto out ;
3947 bpf_program__set_autoload (freplace_prog , true);
4048 bpf_program__set_autoattach (freplace_prog , true);
4149 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 );
4452 err = changes_pkt_data_freplace__load (freplace );
4553 print_verifier_log (log );
4654 if (expect_load ) {
@@ -62,15 +70,38 @@ static void test_aux(const char *main_prog_name, const char *freplace_prog_name,
6270 * that either do or do not. It is only ok to freplace subprograms
6371 * that do not change packet data with those that do not as well.
6472 * 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.
6575 */
6676void test_changes_pkt_data_freplace (void )
6777{
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+ }
76107}
0 commit comments