4
4
#include "test_xdp.skel.h"
5
5
#include "test_xdp_bpf2bpf.skel.h"
6
6
7
+ struct meta {
8
+ int ifindex ;
9
+ int pkt_len ;
10
+ };
11
+
12
+ static void on_sample (void * ctx , int cpu , void * data , __u32 size )
13
+ {
14
+ int duration = 0 ;
15
+ struct meta * meta = (struct meta * )data ;
16
+ struct ipv4_packet * trace_pkt_v4 = data + sizeof (* meta );
17
+
18
+ if (CHECK (size < sizeof (pkt_v4 ) + sizeof (* meta ),
19
+ "check_size" , "size %u < %zu\n" ,
20
+ size , sizeof (pkt_v4 ) + sizeof (* meta )))
21
+ return ;
22
+
23
+ if (CHECK (meta -> ifindex != if_nametoindex ("lo" ), "check_meta_ifindex" ,
24
+ "meta->ifindex = %d\n" , meta -> ifindex ))
25
+ return ;
26
+
27
+ if (CHECK (meta -> pkt_len != sizeof (pkt_v4 ), "check_meta_pkt_len" ,
28
+ "meta->pkt_len = %zd\n" , sizeof (pkt_v4 )))
29
+ return ;
30
+
31
+ if (CHECK (memcmp (trace_pkt_v4 , & pkt_v4 , sizeof (pkt_v4 )),
32
+ "check_packet_content" , "content not the same\n" ))
33
+ return ;
34
+
35
+ * (bool * )ctx = true;
36
+ }
37
+
7
38
void test_xdp_bpf2bpf (void )
8
39
{
9
40
__u32 duration = 0 , retval , size ;
10
41
char buf [128 ];
11
42
int err , pkt_fd , map_fd ;
43
+ bool passed = false;
12
44
struct iphdr * iph = (void * )buf + sizeof (struct ethhdr );
13
45
struct iptnl_info value4 = {.family = AF_INET };
14
46
struct test_xdp * pkt_skel = NULL ;
15
47
struct test_xdp_bpf2bpf * ftrace_skel = NULL ;
16
48
struct vip key4 = {.protocol = 6 , .family = AF_INET };
17
49
struct bpf_program * prog ;
50
+ struct perf_buffer * pb = NULL ;
51
+ struct perf_buffer_opts pb_opts = {};
18
52
19
53
/* Load XDP program to introspect */
20
54
pkt_skel = test_xdp__open_and_load ();
@@ -50,6 +84,14 @@ void test_xdp_bpf2bpf(void)
50
84
if (CHECK (err , "ftrace_attach" , "ftrace attach failed: %d\n" , err ))
51
85
goto out ;
52
86
87
+ /* Set up perf buffer */
88
+ pb_opts .sample_cb = on_sample ;
89
+ pb_opts .ctx = & passed ;
90
+ pb = perf_buffer__new (bpf_map__fd (ftrace_skel -> maps .perf_buf_map ),
91
+ 1 , & pb_opts );
92
+ if (CHECK (IS_ERR (pb ), "perf_buf__new" , "err %ld\n" , PTR_ERR (pb )))
93
+ goto out ;
94
+
53
95
/* Run test program */
54
96
err = bpf_prog_test_run (pkt_fd , 1 , & pkt_v4 , sizeof (pkt_v4 ),
55
97
buf , & size , & retval , & duration );
@@ -60,6 +102,15 @@ void test_xdp_bpf2bpf(void)
60
102
err , errno , retval , size ))
61
103
goto out ;
62
104
105
+ /* Make sure bpf_xdp_output() was triggered and it sent the expected
106
+ * data to the perf ring buffer.
107
+ */
108
+ err = perf_buffer__poll (pb , 100 );
109
+ if (CHECK (err < 0 , "perf_buffer__poll" , "err %d\n" , err ))
110
+ goto out ;
111
+
112
+ CHECK_FAIL (!passed );
113
+
63
114
/* Verify test results */
64
115
if (CHECK (ftrace_skel -> bss -> test_result_fentry != if_nametoindex ("lo" ),
65
116
"result" , "fentry failed err %llu\n" ,
@@ -70,6 +121,8 @@ void test_xdp_bpf2bpf(void)
70
121
"fexit failed err %llu\n" , ftrace_skel -> bss -> test_result_fexit );
71
122
72
123
out :
124
+ if (pb )
125
+ perf_buffer__free (pb );
73
126
test_xdp__destroy (pkt_skel );
74
127
test_xdp_bpf2bpf__destroy (ftrace_skel );
75
128
}
0 commit comments