17
17
#include <linux/rtnetlink.h>
18
18
#include <signal.h>
19
19
#include <linux/perf_event.h>
20
+ #include <linux/err.h>
20
21
21
22
#include "bpf_rlimit.h"
22
23
#include "bpf_util.h"
30
31
pthread_t tid ;
31
32
int rx_callbacks ;
32
33
33
- static int dummyfn (void * data , int size )
34
+ static void dummyfn (void * ctx , int cpu , void * data , __u32 size )
34
35
{
35
36
struct tcp_notifier * t = data ;
36
37
37
38
if (t -> type != 0xde || t -> subtype != 0xad ||
38
39
t -> source != 0xbe || t -> hash != 0xef )
39
- return 1 ;
40
+ return ;
40
41
rx_callbacks ++ ;
41
- return 0 ;
42
42
}
43
43
44
- void tcp_notifier_poller (int fd )
44
+ void tcp_notifier_poller (struct perf_buffer * pb )
45
45
{
46
- while (1 )
47
- perf_event_poller (fd , dummyfn );
46
+ int err ;
47
+
48
+ while (1 ) {
49
+ err = perf_buffer__poll (pb , 100 );
50
+ if (err < 0 && err != - EINTR ) {
51
+ printf ("failed perf_buffer__poll: %d\n" , err );
52
+ return ;
53
+ }
54
+ }
48
55
}
49
56
50
57
static void * poller_thread (void * arg )
51
58
{
52
- int fd = * ( int * ) arg ;
59
+ struct perf_buffer * pb = arg ;
53
60
54
- tcp_notifier_poller (fd );
61
+ tcp_notifier_poller (pb );
55
62
return arg ;
56
63
}
57
64
@@ -60,52 +67,20 @@ int verify_result(const struct tcpnotify_globals *result)
60
67
return (result -> ncalls > 0 && result -> ncalls == rx_callbacks ? 0 : 1 );
61
68
}
62
69
63
- static int bpf_find_map (const char * test , struct bpf_object * obj ,
64
- const char * name )
65
- {
66
- struct bpf_map * map ;
67
-
68
- map = bpf_object__find_map_by_name (obj , name );
69
- if (!map ) {
70
- printf ("%s:FAIL:map '%s' not found\n" , test , name );
71
- return -1 ;
72
- }
73
- return bpf_map__fd (map );
74
- }
75
-
76
- static int setup_bpf_perf_event (int mapfd )
77
- {
78
- struct perf_event_attr attr = {
79
- .sample_type = PERF_SAMPLE_RAW ,
80
- .type = PERF_TYPE_SOFTWARE ,
81
- .config = PERF_COUNT_SW_BPF_OUTPUT ,
82
- };
83
- int key = 0 ;
84
- int pmu_fd ;
85
-
86
- pmu_fd = syscall (__NR_perf_event_open , & attr , -1 , 0 , -1 , 0 );
87
- if (pmu_fd < 0 )
88
- return pmu_fd ;
89
- bpf_map_update_elem (mapfd , & key , & pmu_fd , BPF_ANY );
90
-
91
- ioctl (pmu_fd , PERF_EVENT_IOC_ENABLE , 0 );
92
- return pmu_fd ;
93
- }
94
-
95
70
int main (int argc , char * * argv )
96
71
{
97
72
const char * file = "test_tcpnotify_kern.o" ;
98
- int prog_fd , map_fd , perf_event_fd ;
73
+ struct bpf_map * perf_map , * global_map ;
74
+ struct perf_buffer_opts pb_opts = {};
99
75
struct tcpnotify_globals g = {0 };
76
+ struct perf_buffer * pb = NULL ;
100
77
const char * cg_path = "/foo" ;
78
+ int prog_fd , rv , cg_fd = -1 ;
101
79
int error = EXIT_FAILURE ;
102
80
struct bpf_object * obj ;
103
- int cg_fd = -1 ;
104
- __u32 key = 0 ;
105
- int rv ;
106
81
char test_script [80 ];
107
- int pmu_fd ;
108
82
cpu_set_t cpuset ;
83
+ __u32 key = 0 ;
109
84
110
85
CPU_ZERO (& cpuset );
111
86
CPU_SET (0 , & cpuset );
@@ -133,19 +108,24 @@ int main(int argc, char **argv)
133
108
goto err ;
134
109
}
135
110
136
- perf_event_fd = bpf_find_map (__func__ , obj , "perf_event_map" );
137
- if (perf_event_fd < 0 )
111
+ perf_map = bpf_object__find_map_by_name (obj , "perf_event_map" );
112
+ if (!perf_map ) {
113
+ printf ("FAIL:map '%s' not found\n" , "perf_event_map" );
138
114
goto err ;
115
+ }
139
116
140
- map_fd = bpf_find_map (__func__ , obj , "global_map" );
141
- if (map_fd < 0 )
142
- goto err ;
117
+ global_map = bpf_object__find_map_by_name (obj , "global_map" );
118
+ if (!global_map ) {
119
+ printf ("FAIL:map '%s' not found\n" , "global_map" );
120
+ return -1 ;
121
+ }
143
122
144
- pmu_fd = setup_bpf_perf_event (perf_event_fd );
145
- if (pmu_fd < 0 || perf_event_mmap (pmu_fd ) < 0 )
123
+ pb_opts .sample_cb = dummyfn ;
124
+ pb = perf_buffer__new (bpf_map__fd (perf_map ), 8 , & pb_opts );
125
+ if (IS_ERR (pb ))
146
126
goto err ;
147
127
148
- pthread_create (& tid , NULL , poller_thread , ( void * ) & pmu_fd );
128
+ pthread_create (& tid , NULL , poller_thread , pb );
149
129
150
130
sprintf (test_script ,
151
131
"iptables -A INPUT -p tcp --dport %d -j DROP" ,
@@ -162,7 +142,7 @@ int main(int argc, char **argv)
162
142
TESTPORT );
163
143
system (test_script );
164
144
165
- rv = bpf_map_lookup_elem (map_fd , & key , & g );
145
+ rv = bpf_map_lookup_elem (bpf_map__fd ( global_map ) , & key , & g );
166
146
if (rv != 0 ) {
167
147
printf ("FAILED: bpf_map_lookup_elem returns %d\n" , rv );
168
148
goto err ;
@@ -182,5 +162,7 @@ int main(int argc, char **argv)
182
162
bpf_prog_detach (cg_fd , BPF_CGROUP_SOCK_OPS );
183
163
close (cg_fd );
184
164
cleanup_cgroup_environment ();
165
+ if (!IS_ERR_OR_NULL (pb ))
166
+ perf_buffer__free (pb );
185
167
return error ;
186
168
}
0 commit comments