2
2
/* Copyright (c) 2019 Facebook */
3
3
#include <test_progs.h>
4
4
5
- #define PROG_CNT 3
6
-
7
- void test_fexit_bpf2bpf (void )
5
+ static void test_fexit_bpf2bpf_common (const char * obj_file ,
6
+ const char * target_obj_file ,
7
+ int prog_cnt ,
8
+ const char * * prog_name )
8
9
{
9
- const char * prog_name [PROG_CNT ] = {
10
- "fexit/test_pkt_access" ,
11
- "fexit/test_pkt_access_subprog1" ,
12
- "fexit/test_pkt_access_subprog2" ,
13
- };
14
10
struct bpf_object * obj = NULL , * pkt_obj ;
15
11
int err , pkt_fd , i ;
16
- struct bpf_link * link [ PROG_CNT ] = {} ;
17
- struct bpf_program * prog [ PROG_CNT ] ;
12
+ struct bpf_link * * link = NULL ;
13
+ struct bpf_program * * prog = NULL ;
18
14
__u32 duration , retval ;
19
15
struct bpf_map * data_map ;
20
16
const int zero = 0 ;
21
- u64 result [ PROG_CNT ] ;
17
+ u64 * result = NULL ;
22
18
23
- err = bpf_prog_load ("./test_pkt_access.o" , BPF_PROG_TYPE_UNSPEC ,
19
+ err = bpf_prog_load (target_obj_file , BPF_PROG_TYPE_UNSPEC ,
24
20
& pkt_obj , & pkt_fd );
25
21
if (CHECK (err , "prog_load sched cls" , "err %d errno %d\n" , err , errno ))
26
22
return ;
27
23
DECLARE_LIBBPF_OPTS (bpf_object_open_opts , opts ,
28
24
.attach_prog_fd = pkt_fd ,
29
25
);
30
26
31
- obj = bpf_object__open_file ("./fexit_bpf2bpf.o" , & opts );
27
+ link = calloc (sizeof (struct bpf_link * ), prog_cnt );
28
+ prog = calloc (sizeof (struct bpf_program * ), prog_cnt );
29
+ result = malloc (prog_cnt * sizeof (u64 ));
30
+ if (CHECK (!link || !prog || !result , "alloc_memory" ,
31
+ "failed to alloc memory" ))
32
+ goto close_prog ;
33
+
34
+ obj = bpf_object__open_file (obj_file , & opts );
32
35
if (CHECK (IS_ERR_OR_NULL (obj ), "obj_open" ,
33
36
"failed to open fexit_bpf2bpf: %ld\n" ,
34
37
PTR_ERR (obj )))
@@ -38,7 +41,7 @@ void test_fexit_bpf2bpf(void)
38
41
if (CHECK (err , "obj_load" , "err %d\n" , err ))
39
42
goto close_prog ;
40
43
41
- for (i = 0 ; i < PROG_CNT ; i ++ ) {
44
+ for (i = 0 ; i < prog_cnt ; i ++ ) {
42
45
prog [i ] = bpf_object__find_program_by_title (obj , prog_name [i ]);
43
46
if (CHECK (!prog [i ], "find_prog" , "prog %s not found\n" , prog_name [i ]))
44
47
goto close_prog ;
@@ -56,21 +59,54 @@ void test_fexit_bpf2bpf(void)
56
59
"err %d errno %d retval %d duration %d\n" ,
57
60
err , errno , retval , duration );
58
61
59
- err = bpf_map_lookup_elem (bpf_map__fd (data_map ), & zero , & result );
62
+ err = bpf_map_lookup_elem (bpf_map__fd (data_map ), & zero , result );
60
63
if (CHECK (err , "get_result" ,
61
64
"failed to get output data: %d\n" , err ))
62
65
goto close_prog ;
63
66
64
- for (i = 0 ; i < PROG_CNT ; i ++ )
67
+ for (i = 0 ; i < prog_cnt ; i ++ )
65
68
if (CHECK (result [i ] != 1 , "result" , "fexit_bpf2bpf failed err %ld\n" ,
66
69
result [i ]))
67
70
goto close_prog ;
68
71
69
72
close_prog :
70
- for (i = 0 ; i < PROG_CNT ; i ++ )
73
+ for (i = 0 ; i < prog_cnt ; i ++ )
71
74
if (!IS_ERR_OR_NULL (link [i ]))
72
75
bpf_link__destroy (link [i ]);
73
76
if (!IS_ERR_OR_NULL (obj ))
74
77
bpf_object__close (obj );
75
78
bpf_object__close (pkt_obj );
79
+ free (link );
80
+ free (prog );
81
+ free (result );
82
+ }
83
+
84
+ static void test_target_no_callees (void )
85
+ {
86
+ const char * prog_name [] = {
87
+ "fexit/test_pkt_md_access" ,
88
+ };
89
+ test_fexit_bpf2bpf_common ("./fexit_bpf2bpf_simple.o" ,
90
+ "./test_pkt_md_access.o" ,
91
+ ARRAY_SIZE (prog_name ),
92
+ prog_name );
93
+ }
94
+
95
+ static void test_target_yes_callees (void )
96
+ {
97
+ const char * prog_name [] = {
98
+ "fexit/test_pkt_access" ,
99
+ "fexit/test_pkt_access_subprog1" ,
100
+ "fexit/test_pkt_access_subprog2" ,
101
+ };
102
+ test_fexit_bpf2bpf_common ("./fexit_bpf2bpf.o" ,
103
+ "./test_pkt_access.o" ,
104
+ ARRAY_SIZE (prog_name ),
105
+ prog_name );
106
+ }
107
+
108
+ void test_fexit_bpf2bpf (void )
109
+ {
110
+ test_target_no_callees ();
111
+ test_target_yes_callees ();
76
112
}
0 commit comments