3
3
#include "kprobe_multi.skel.h"
4
4
#include "trace_helpers.h"
5
5
6
- static void kprobe_multi_test_run (struct kprobe_multi * skel )
6
+ static void kprobe_multi_test_run (struct kprobe_multi * skel , bool test_return )
7
7
{
8
8
LIBBPF_OPTS (bpf_test_run_opts , topts );
9
9
int err , prog_fd ;
@@ -22,14 +22,16 @@ static void kprobe_multi_test_run(struct kprobe_multi *skel)
22
22
ASSERT_EQ (skel -> bss -> kprobe_test7_result , 1 , "kprobe_test7_result" );
23
23
ASSERT_EQ (skel -> bss -> kprobe_test8_result , 1 , "kprobe_test8_result" );
24
24
25
- ASSERT_EQ (skel -> bss -> kretprobe_test1_result , 1 , "kretprobe_test1_result" );
26
- ASSERT_EQ (skel -> bss -> kretprobe_test2_result , 1 , "kretprobe_test2_result" );
27
- ASSERT_EQ (skel -> bss -> kretprobe_test3_result , 1 , "kretprobe_test3_result" );
28
- ASSERT_EQ (skel -> bss -> kretprobe_test4_result , 1 , "kretprobe_test4_result" );
29
- ASSERT_EQ (skel -> bss -> kretprobe_test5_result , 1 , "kretprobe_test5_result" );
30
- ASSERT_EQ (skel -> bss -> kretprobe_test6_result , 1 , "kretprobe_test6_result" );
31
- ASSERT_EQ (skel -> bss -> kretprobe_test7_result , 1 , "kretprobe_test7_result" );
32
- ASSERT_EQ (skel -> bss -> kretprobe_test8_result , 1 , "kretprobe_test8_result" );
25
+ if (test_return ) {
26
+ ASSERT_EQ (skel -> bss -> kretprobe_test1_result , 1 , "kretprobe_test1_result" );
27
+ ASSERT_EQ (skel -> bss -> kretprobe_test2_result , 1 , "kretprobe_test2_result" );
28
+ ASSERT_EQ (skel -> bss -> kretprobe_test3_result , 1 , "kretprobe_test3_result" );
29
+ ASSERT_EQ (skel -> bss -> kretprobe_test4_result , 1 , "kretprobe_test4_result" );
30
+ ASSERT_EQ (skel -> bss -> kretprobe_test5_result , 1 , "kretprobe_test5_result" );
31
+ ASSERT_EQ (skel -> bss -> kretprobe_test6_result , 1 , "kretprobe_test6_result" );
32
+ ASSERT_EQ (skel -> bss -> kretprobe_test7_result , 1 , "kretprobe_test7_result" );
33
+ ASSERT_EQ (skel -> bss -> kretprobe_test8_result , 1 , "kretprobe_test8_result" );
34
+ }
33
35
}
34
36
35
37
static void test_skel_api (void )
@@ -46,7 +48,7 @@ static void test_skel_api(void)
46
48
if (!ASSERT_OK (err , "kprobe_multi__attach" ))
47
49
goto cleanup ;
48
50
49
- kprobe_multi_test_run (skel );
51
+ kprobe_multi_test_run (skel , true );
50
52
51
53
cleanup :
52
54
kprobe_multi__destroy (skel );
@@ -73,7 +75,7 @@ static void test_link_api(struct bpf_link_create_opts *opts)
73
75
if (!ASSERT_GE (link2_fd , 0 , "link_fd" ))
74
76
goto cleanup ;
75
77
76
- kprobe_multi_test_run (skel );
78
+ kprobe_multi_test_run (skel , true );
77
79
78
80
cleanup :
79
81
if (link1_fd != -1 )
@@ -127,6 +129,178 @@ static void test_link_api_syms(void)
127
129
test_link_api (& opts );
128
130
}
129
131
132
+ static void
133
+ test_attach_api (const char * pattern , struct bpf_kprobe_multi_opts * opts )
134
+ {
135
+ struct bpf_link * link1 = NULL , * link2 = NULL ;
136
+ struct kprobe_multi * skel = NULL ;
137
+
138
+ skel = kprobe_multi__open_and_load ();
139
+ if (!ASSERT_OK_PTR (skel , "fentry_raw_skel_load" ))
140
+ goto cleanup ;
141
+
142
+ skel -> bss -> pid = getpid ();
143
+ link1 = bpf_program__attach_kprobe_multi_opts (skel -> progs .test_kprobe ,
144
+ pattern , opts );
145
+ if (!ASSERT_OK_PTR (link1 , "bpf_program__attach_kprobe_multi_opts" ))
146
+ goto cleanup ;
147
+
148
+ if (opts ) {
149
+ opts -> retprobe = true;
150
+ link2 = bpf_program__attach_kprobe_multi_opts (skel -> progs .test_kretprobe ,
151
+ pattern , opts );
152
+ if (!ASSERT_OK_PTR (link2 , "bpf_program__attach_kprobe_multi_opts" ))
153
+ goto cleanup ;
154
+ }
155
+
156
+ kprobe_multi_test_run (skel , !!opts );
157
+
158
+ cleanup :
159
+ bpf_link__destroy (link2 );
160
+ bpf_link__destroy (link1 );
161
+ kprobe_multi__destroy (skel );
162
+ }
163
+
164
+ static void test_attach_api_pattern (void )
165
+ {
166
+ LIBBPF_OPTS (bpf_kprobe_multi_opts , opts );
167
+
168
+ test_attach_api ("bpf_fentry_test*" , & opts );
169
+ test_attach_api ("bpf_fentry_test?" , NULL );
170
+ }
171
+
172
+ static void test_attach_api_addrs (void )
173
+ {
174
+ LIBBPF_OPTS (bpf_kprobe_multi_opts , opts );
175
+ unsigned long long addrs [8 ];
176
+
177
+ GET_ADDR ("bpf_fentry_test1" , addrs [0 ]);
178
+ GET_ADDR ("bpf_fentry_test2" , addrs [1 ]);
179
+ GET_ADDR ("bpf_fentry_test3" , addrs [2 ]);
180
+ GET_ADDR ("bpf_fentry_test4" , addrs [3 ]);
181
+ GET_ADDR ("bpf_fentry_test5" , addrs [4 ]);
182
+ GET_ADDR ("bpf_fentry_test6" , addrs [5 ]);
183
+ GET_ADDR ("bpf_fentry_test7" , addrs [6 ]);
184
+ GET_ADDR ("bpf_fentry_test8" , addrs [7 ]);
185
+
186
+ opts .addrs = (const unsigned long * ) addrs ;
187
+ opts .cnt = ARRAY_SIZE (addrs );
188
+ test_attach_api (NULL , & opts );
189
+ }
190
+
191
+ static void test_attach_api_syms (void )
192
+ {
193
+ LIBBPF_OPTS (bpf_kprobe_multi_opts , opts );
194
+ const char * syms [8 ] = {
195
+ "bpf_fentry_test1" ,
196
+ "bpf_fentry_test2" ,
197
+ "bpf_fentry_test3" ,
198
+ "bpf_fentry_test4" ,
199
+ "bpf_fentry_test5" ,
200
+ "bpf_fentry_test6" ,
201
+ "bpf_fentry_test7" ,
202
+ "bpf_fentry_test8" ,
203
+ };
204
+
205
+ opts .syms = syms ;
206
+ opts .cnt = ARRAY_SIZE (syms );
207
+ test_attach_api (NULL , & opts );
208
+ }
209
+
210
+ static void test_attach_api_fails (void )
211
+ {
212
+ LIBBPF_OPTS (bpf_kprobe_multi_opts , opts );
213
+ struct kprobe_multi * skel = NULL ;
214
+ struct bpf_link * link = NULL ;
215
+ unsigned long long addrs [2 ];
216
+ const char * syms [2 ] = {
217
+ "bpf_fentry_test1" ,
218
+ "bpf_fentry_test2" ,
219
+ };
220
+ __u64 cookies [2 ];
221
+
222
+ addrs [0 ] = ksym_get_addr ("bpf_fentry_test1" );
223
+ addrs [1 ] = ksym_get_addr ("bpf_fentry_test2" );
224
+
225
+ if (!ASSERT_FALSE (!addrs [0 ] || !addrs [1 ], "ksym_get_addr" ))
226
+ goto cleanup ;
227
+
228
+ skel = kprobe_multi__open_and_load ();
229
+ if (!ASSERT_OK_PTR (skel , "fentry_raw_skel_load" ))
230
+ goto cleanup ;
231
+
232
+ skel -> bss -> pid = getpid ();
233
+
234
+ /* fail_1 - pattern and opts NULL */
235
+ link = bpf_program__attach_kprobe_multi_opts (skel -> progs .test_kprobe ,
236
+ NULL , NULL );
237
+ if (!ASSERT_ERR_PTR (link , "fail_1" ))
238
+ goto cleanup ;
239
+
240
+ if (!ASSERT_EQ (libbpf_get_error (link ), - EINVAL , "fail_1_error" ))
241
+ goto cleanup ;
242
+
243
+ /* fail_2 - both addrs and syms set */
244
+ opts .addrs = (const unsigned long * ) addrs ;
245
+ opts .syms = syms ;
246
+ opts .cnt = ARRAY_SIZE (syms );
247
+ opts .cookies = NULL ;
248
+
249
+ link = bpf_program__attach_kprobe_multi_opts (skel -> progs .test_kprobe ,
250
+ NULL , & opts );
251
+ if (!ASSERT_ERR_PTR (link , "fail_2" ))
252
+ goto cleanup ;
253
+
254
+ if (!ASSERT_EQ (libbpf_get_error (link ), - EINVAL , "fail_2_error" ))
255
+ goto cleanup ;
256
+
257
+ /* fail_3 - pattern and addrs set */
258
+ opts .addrs = (const unsigned long * ) addrs ;
259
+ opts .syms = NULL ;
260
+ opts .cnt = ARRAY_SIZE (syms );
261
+ opts .cookies = NULL ;
262
+
263
+ link = bpf_program__attach_kprobe_multi_opts (skel -> progs .test_kprobe ,
264
+ "ksys_*" , & opts );
265
+ if (!ASSERT_ERR_PTR (link , "fail_3" ))
266
+ goto cleanup ;
267
+
268
+ if (!ASSERT_EQ (libbpf_get_error (link ), - EINVAL , "fail_3_error" ))
269
+ goto cleanup ;
270
+
271
+ /* fail_4 - pattern and cnt set */
272
+ opts .addrs = NULL ;
273
+ opts .syms = NULL ;
274
+ opts .cnt = ARRAY_SIZE (syms );
275
+ opts .cookies = NULL ;
276
+
277
+ link = bpf_program__attach_kprobe_multi_opts (skel -> progs .test_kprobe ,
278
+ "ksys_*" , & opts );
279
+ if (!ASSERT_ERR_PTR (link , "fail_4" ))
280
+ goto cleanup ;
281
+
282
+ if (!ASSERT_EQ (libbpf_get_error (link ), - EINVAL , "fail_4_error" ))
283
+ goto cleanup ;
284
+
285
+ /* fail_5 - pattern and cookies */
286
+ opts .addrs = NULL ;
287
+ opts .syms = NULL ;
288
+ opts .cnt = 0 ;
289
+ opts .cookies = cookies ;
290
+
291
+ link = bpf_program__attach_kprobe_multi_opts (skel -> progs .test_kprobe ,
292
+ "ksys_*" , & opts );
293
+ if (!ASSERT_ERR_PTR (link , "fail_5" ))
294
+ goto cleanup ;
295
+
296
+ if (!ASSERT_EQ (libbpf_get_error (link ), - EINVAL , "fail_5_error" ))
297
+ goto cleanup ;
298
+
299
+ cleanup :
300
+ bpf_link__destroy (link );
301
+ kprobe_multi__destroy (skel );
302
+ }
303
+
130
304
void test_kprobe_multi_test (void )
131
305
{
132
306
if (!ASSERT_OK (load_kallsyms (), "load_kallsyms" ))
@@ -138,4 +312,12 @@ void test_kprobe_multi_test(void)
138
312
test_link_api_syms ();
139
313
if (test__start_subtest ("link_api_syms" ))
140
314
test_link_api_addrs ();
315
+ if (test__start_subtest ("attach_api_pattern" ))
316
+ test_attach_api_pattern ();
317
+ if (test__start_subtest ("attach_api_addrs" ))
318
+ test_attach_api_addrs ();
319
+ if (test__start_subtest ("attach_api_syms" ))
320
+ test_attach_api_syms ();
321
+ if (test__start_subtest ("attach_api_fails" ))
322
+ test_attach_api_fails ();
141
323
}
0 commit comments