1
2
3
4
5
6
7
8
9
10#ifndef __LIBBPF_LIBBPF_H
11#define __LIBBPF_LIBBPF_H
12
13#include <stdarg.h>
14#include <stdio.h>
15#include <stdint.h>
16#include <stdbool.h>
17#include <sys/types.h>
18#include <linux/bpf.h>
19
20#include "libbpf_common.h"
21
22#ifdef __cplusplus
23extern "C" {
24#endif
25
26enum libbpf_errno {
27 __LIBBPF_ERRNO__START = 4000,
28
29
30 LIBBPF_ERRNO__LIBELF = __LIBBPF_ERRNO__START,
31 LIBBPF_ERRNO__FORMAT,
32 LIBBPF_ERRNO__KVERSION,
33 LIBBPF_ERRNO__ENDIAN,
34 LIBBPF_ERRNO__INTERNAL,
35 LIBBPF_ERRNO__RELOC,
36 LIBBPF_ERRNO__LOAD,
37 LIBBPF_ERRNO__VERIFY,
38 LIBBPF_ERRNO__PROG2BIG,
39 LIBBPF_ERRNO__KVER,
40 LIBBPF_ERRNO__PROGTYPE,
41 LIBBPF_ERRNO__WRNGPID,
42 LIBBPF_ERRNO__INVSEQ,
43 LIBBPF_ERRNO__NLPARSE,
44 __LIBBPF_ERRNO__END,
45};
46
47LIBBPF_API int libbpf_strerror(int err, char *buf, size_t size);
48
49enum libbpf_print_level {
50 LIBBPF_WARN,
51 LIBBPF_INFO,
52 LIBBPF_DEBUG,
53};
54
55typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level,
56 const char *, va_list ap);
57
58LIBBPF_API libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn);
59
60
61struct bpf_object;
62
63struct bpf_object_open_attr {
64 const char *file;
65 enum bpf_prog_type prog_type;
66};
67
68struct bpf_object_open_opts {
69
70 size_t sz;
71
72
73
74
75
76
77 const char *object_name;
78
79 bool relaxed_maps;
80
81
82
83
84
85 bool relaxed_core_relocs;
86
87
88
89
90 const char *pin_root_path;
91 __u32 attach_prog_fd;
92
93
94
95 const char *kconfig;
96};
97#define bpf_object_open_opts__last_field kconfig
98
99LIBBPF_API struct bpf_object *bpf_object__open(const char *path);
100LIBBPF_API struct bpf_object *
101bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts);
102LIBBPF_API struct bpf_object *
103bpf_object__open_file_v0_0_4(const char *path,
104 const struct bpf_object_open_opts *opts);
105LIBBPF_API struct bpf_object *
106bpf_object__open_file_v0_0_6(const char *path,
107 const struct bpf_object_open_opts *opts);
108LIBBPF_API struct bpf_object *
109bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz,
110 const struct bpf_object_open_opts *opts);
111LIBBPF_API struct bpf_object *
112bpf_object__open_mem_v0_0_4(const void *obj_buf, size_t obj_buf_sz,
113 const struct bpf_object_open_opts *opts);
114LIBBPF_API struct bpf_object *
115bpf_object__open_mem_v0_0_6(const void *obj_buf, size_t obj_buf_sz,
116 const struct bpf_object_open_opts *opts);
117
118
119LIBBPF_API struct bpf_object *
120bpf_object__open_buffer(const void *obj_buf, size_t obj_buf_sz,
121 const char *name);
122LIBBPF_API struct bpf_object *
123bpf_object__open_xattr(struct bpf_object_open_attr *attr);
124
125enum libbpf_pin_type {
126 LIBBPF_PIN_NONE,
127
128 LIBBPF_PIN_BY_NAME,
129};
130
131
132
133
134
135LIBBPF_API int bpf_object__pin_maps(struct bpf_object *obj, const char *path);
136LIBBPF_API int bpf_object__unpin_maps(struct bpf_object *obj,
137 const char *path);
138LIBBPF_API int bpf_object__pin_programs(struct bpf_object *obj,
139 const char *path);
140LIBBPF_API int bpf_object__unpin_programs(struct bpf_object *obj,
141 const char *path);
142LIBBPF_API int bpf_object__pin(struct bpf_object *object, const char *path);
143LIBBPF_API void bpf_object__close(struct bpf_object *object);
144
145struct bpf_object_load_attr {
146 struct bpf_object *obj;
147 int log_level;
148 const char *target_btf_path;
149};
150
151
152LIBBPF_API int bpf_object__load(struct bpf_object *obj);
153LIBBPF_API int bpf_object__load_xattr(struct bpf_object_load_attr *attr);
154LIBBPF_API int bpf_object__unload(struct bpf_object *obj);
155
156LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj);
157LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj);
158
159struct btf;
160LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj);
161LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj);
162
163LIBBPF_API struct bpf_program *
164bpf_object__find_program_by_title(const struct bpf_object *obj,
165 const char *title);
166LIBBPF_API struct bpf_program *
167bpf_object__find_program_by_name(const struct bpf_object *obj,
168 const char *name);
169
170LIBBPF_API struct bpf_object *bpf_object__next(struct bpf_object *prev);
171#define bpf_object__for_each_safe(pos, tmp) \
172 for ((pos) = bpf_object__next(NULL), \
173 (tmp) = bpf_object__next(pos); \
174 (pos) != NULL; \
175 (pos) = (tmp), (tmp) = bpf_object__next(tmp))
176
177typedef void (*bpf_object_clear_priv_t)(struct bpf_object *, void *);
178LIBBPF_API int bpf_object__set_priv(struct bpf_object *obj, void *priv,
179 bpf_object_clear_priv_t clear_priv);
180LIBBPF_API void *bpf_object__priv(const struct bpf_object *prog);
181
182LIBBPF_API int
183libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type,
184 enum bpf_attach_type *expected_attach_type);
185LIBBPF_API int libbpf_attach_type_by_name(const char *name,
186 enum bpf_attach_type *attach_type);
187LIBBPF_API int libbpf_find_vmlinux_btf_id(const char *name,
188 enum bpf_attach_type attach_type);
189
190
191struct bpf_program;
192LIBBPF_API struct bpf_program *bpf_program__next(struct bpf_program *prog,
193 const struct bpf_object *obj);
194
195#define bpf_object__for_each_program(pos, obj) \
196 for ((pos) = bpf_program__next(NULL, (obj)); \
197 (pos) != NULL; \
198 (pos) = bpf_program__next((pos), (obj)))
199
200LIBBPF_API struct bpf_program *bpf_program__prev(struct bpf_program *prog,
201 const struct bpf_object *obj);
202
203typedef void (*bpf_program_clear_priv_t)(struct bpf_program *, void *);
204
205LIBBPF_API int bpf_program__set_priv(struct bpf_program *prog, void *priv,
206 bpf_program_clear_priv_t clear_priv);
207
208LIBBPF_API void *bpf_program__priv(const struct bpf_program *prog);
209LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog,
210 __u32 ifindex);
211
212LIBBPF_API const char *bpf_program__name(const struct bpf_program *prog);
213LIBBPF_API const char *bpf_program__title(const struct bpf_program *prog,
214 bool needs_copy);
215LIBBPF_API bool bpf_program__autoload(const struct bpf_program *prog);
216LIBBPF_API int bpf_program__set_autoload(struct bpf_program *prog, bool autoload);
217
218
219LIBBPF_API size_t bpf_program__size(const struct bpf_program *prog);
220LIBBPF_API size_t bpf_program__size_v0_0_4(const struct bpf_program *prog);
221LIBBPF_API size_t bpf_program__size_v0_0_6(const struct bpf_program *prog);
222
223LIBBPF_API int bpf_program__load(struct bpf_program *prog, char *license,
224 __u32 kern_version);
225LIBBPF_API int bpf_program__fd(const struct bpf_program *prog);
226LIBBPF_API int bpf_program__pin_instance(struct bpf_program *prog,
227 const char *path,
228 int instance);
229LIBBPF_API int bpf_program__unpin_instance(struct bpf_program *prog,
230 const char *path,
231 int instance);
232LIBBPF_API int bpf_program__pin(struct bpf_program *prog, const char *path);
233LIBBPF_API int bpf_program__unpin(struct bpf_program *prog, const char *path);
234LIBBPF_API void bpf_program__unload(struct bpf_program *prog);
235
236struct bpf_link;
237
238LIBBPF_API struct bpf_link *bpf_link__open(const char *path);
239LIBBPF_API int bpf_link__fd(const struct bpf_link *link);
240LIBBPF_API const char *bpf_link__pin_path(const struct bpf_link *link);
241LIBBPF_API int bpf_link__pin(struct bpf_link *link, const char *path);
242LIBBPF_API int bpf_link__unpin(struct bpf_link *link);
243LIBBPF_API int bpf_link__update_program(struct bpf_link *link,
244 struct bpf_program *prog);
245LIBBPF_API void bpf_link__disconnect(struct bpf_link *link);
246LIBBPF_API int bpf_link__detach(struct bpf_link *link);
247LIBBPF_API int bpf_link__destroy(struct bpf_link *link);
248
249LIBBPF_API struct bpf_link *
250bpf_program__attach(struct bpf_program *prog);
251LIBBPF_API struct bpf_link *
252bpf_program__attach_perf_event(struct bpf_program *prog, int pfd);
253LIBBPF_API struct bpf_link *
254bpf_program__attach_kprobe(struct bpf_program *prog, bool retprobe,
255 const char *func_name);
256LIBBPF_API struct bpf_link *
257bpf_program__attach_uprobe(struct bpf_program *prog, bool retprobe,
258 pid_t pid, const char *binary_path,
259 size_t func_offset);
260LIBBPF_API struct bpf_link *
261bpf_program__attach_tracepoint(struct bpf_program *prog,
262 const char *tp_category,
263 const char *tp_name);
264LIBBPF_API struct bpf_link *
265bpf_program__attach_raw_tracepoint(struct bpf_program *prog,
266 const char *tp_name);
267LIBBPF_API struct bpf_link *
268bpf_program__attach_trace(struct bpf_program *prog);
269LIBBPF_API struct bpf_link *
270bpf_program__attach_lsm(struct bpf_program *prog);
271LIBBPF_API struct bpf_link *
272bpf_program__attach_cgroup(struct bpf_program *prog, int cgroup_fd);
273LIBBPF_API struct bpf_link *
274bpf_program__attach_netns(struct bpf_program *prog, int netns_fd);
275LIBBPF_API struct bpf_link *
276bpf_program__attach_xdp(struct bpf_program *prog, int ifindex);
277LIBBPF_API struct bpf_link *
278bpf_program__attach_freplace(struct bpf_program *prog,
279 int target_fd, const char *attach_func_name);
280
281struct bpf_map;
282
283LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(struct bpf_map *map);
284
285struct bpf_iter_attach_opts {
286 size_t sz;
287 union bpf_iter_link_info *link_info;
288 __u32 link_info_len;
289};
290#define bpf_iter_attach_opts__last_field link_info_len
291
292LIBBPF_API struct bpf_link *
293bpf_program__attach_iter(struct bpf_program *prog,
294 const struct bpf_iter_attach_opts *opts);
295
296struct bpf_insn;
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327struct bpf_prog_prep_result {
328
329
330
331
332 struct bpf_insn *new_insn_ptr;
333 int new_insn_cnt;
334
335
336 int *pfd;
337};
338
339
340
341
342
343
344
345
346
347
348
349
350
351typedef int (*bpf_program_prep_t)(struct bpf_program *prog, int n,
352 struct bpf_insn *insns, int insns_cnt,
353 struct bpf_prog_prep_result *res);
354
355LIBBPF_API int bpf_program__set_prep(struct bpf_program *prog, int nr_instance,
356 bpf_program_prep_t prep);
357
358LIBBPF_API int bpf_program__nth_fd(const struct bpf_program *prog, int n);
359
360
361
362
363LIBBPF_API int bpf_program__set_socket_filter(struct bpf_program *prog);
364LIBBPF_API int bpf_program__set_tracepoint(struct bpf_program *prog);
365LIBBPF_API int bpf_program__set_raw_tracepoint(struct bpf_program *prog);
366LIBBPF_API int bpf_program__set_kprobe(struct bpf_program *prog);
367LIBBPF_API int bpf_program__set_lsm(struct bpf_program *prog);
368LIBBPF_API int bpf_program__set_sched_cls(struct bpf_program *prog);
369LIBBPF_API int bpf_program__set_sched_act(struct bpf_program *prog);
370LIBBPF_API int bpf_program__set_xdp(struct bpf_program *prog);
371LIBBPF_API int bpf_program__set_perf_event(struct bpf_program *prog);
372LIBBPF_API int bpf_program__set_tracing(struct bpf_program *prog);
373LIBBPF_API int bpf_program__set_struct_ops(struct bpf_program *prog);
374LIBBPF_API int bpf_program__set_extension(struct bpf_program *prog);
375LIBBPF_API int bpf_program__set_sk_lookup(struct bpf_program *prog);
376
377LIBBPF_API enum bpf_prog_type bpf_program__get_type(struct bpf_program *prog);
378LIBBPF_API enum bpf_prog_type
379bpf_program__get_type_v0_0_4(struct bpf_program *prog);
380LIBBPF_API enum bpf_prog_type
381bpf_program__get_type_v0_0_6(struct bpf_program *prog);
382LIBBPF_API void bpf_program__set_type(struct bpf_program *prog,
383 enum bpf_prog_type type);
384
385LIBBPF_API enum bpf_attach_type
386bpf_program__get_expected_attach_type(struct bpf_program *prog);
387LIBBPF_API enum bpf_attach_type
388bpf_program__get_expected_attach_type_v0_0_4(struct bpf_program *prog);
389LIBBPF_API enum bpf_attach_type
390bpf_program__get_expected_attach_type_v0_0_6(struct bpf_program *prog);
391LIBBPF_API void
392bpf_program__set_expected_attach_type(struct bpf_program *prog,
393 enum bpf_attach_type type);
394
395LIBBPF_API int
396bpf_program__set_attach_target(struct bpf_program *prog, int attach_prog_fd,
397 const char *attach_func_name);
398
399LIBBPF_API bool bpf_program__is_socket_filter(const struct bpf_program *prog);
400LIBBPF_API bool bpf_program__is_tracepoint(const struct bpf_program *prog);
401LIBBPF_API bool bpf_program__is_raw_tracepoint(const struct bpf_program *prog);
402LIBBPF_API bool bpf_program__is_kprobe(const struct bpf_program *prog);
403LIBBPF_API bool bpf_program__is_lsm(const struct bpf_program *prog);
404LIBBPF_API bool bpf_program__is_sched_cls(const struct bpf_program *prog);
405LIBBPF_API bool bpf_program__is_sched_act(const struct bpf_program *prog);
406LIBBPF_API bool bpf_program__is_xdp(const struct bpf_program *prog);
407LIBBPF_API bool bpf_program__is_perf_event(const struct bpf_program *prog);
408LIBBPF_API bool bpf_program__is_tracing(const struct bpf_program *prog);
409LIBBPF_API bool bpf_program__is_struct_ops(const struct bpf_program *prog);
410LIBBPF_API bool bpf_program__is_extension(const struct bpf_program *prog);
411LIBBPF_API bool bpf_program__is_sk_lookup(const struct bpf_program *prog);
412
413
414
415
416
417
418
419struct bpf_map_def {
420 unsigned int type;
421 unsigned int key_size;
422 unsigned int value_size;
423 unsigned int max_entries;
424 unsigned int map_flags;
425};
426
427
428
429
430
431LIBBPF_API struct bpf_map *
432bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name);
433
434LIBBPF_API int
435bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name);
436
437
438
439
440
441LIBBPF_API struct bpf_map *
442bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset);
443
444LIBBPF_API struct bpf_map *
445bpf_map__next(const struct bpf_map *map, const struct bpf_object *obj);
446#define bpf_object__for_each_map(pos, obj) \
447 for ((pos) = bpf_map__next(NULL, (obj)); \
448 (pos) != NULL; \
449 (pos) = bpf_map__next((pos), (obj)))
450#define bpf_map__for_each bpf_object__for_each_map
451
452LIBBPF_API struct bpf_map *
453bpf_map__prev(const struct bpf_map *map, const struct bpf_object *obj);
454
455
456LIBBPF_API int bpf_map__fd(const struct bpf_map *map);
457LIBBPF_API int bpf_map__reuse_fd(struct bpf_map *map, int fd);
458
459LIBBPF_API const struct bpf_map_def *bpf_map__def(const struct bpf_map *map);
460
461LIBBPF_API const char *bpf_map__name(const struct bpf_map *map);
462
463LIBBPF_API enum bpf_map_type bpf_map__type(const struct bpf_map *map);
464LIBBPF_API int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type);
465
466LIBBPF_API __u32 bpf_map__max_entries(const struct bpf_map *map);
467LIBBPF_API int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries);
468LIBBPF_API int bpf_map__resize(struct bpf_map *map, __u32 max_entries);
469
470LIBBPF_API __u32 bpf_map__map_flags(const struct bpf_map *map);
471LIBBPF_API int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags);
472
473LIBBPF_API __u32 bpf_map__numa_node(const struct bpf_map *map);
474LIBBPF_API int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node);
475
476LIBBPF_API __u32 bpf_map__key_size(const struct bpf_map *map);
477LIBBPF_API int bpf_map__set_key_size(struct bpf_map *map, __u32 size);
478
479LIBBPF_API __u32 bpf_map__value_size(const struct bpf_map *map);
480LIBBPF_API int bpf_map__set_value_size(struct bpf_map *map, __u32 size);
481
482LIBBPF_API __u32 bpf_map__btf_key_type_id(const struct bpf_map *map);
483LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map);
484
485LIBBPF_API __u32 bpf_map__ifindex(const struct bpf_map *map);
486LIBBPF_API int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex);
487
488typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *);
489LIBBPF_API int bpf_map__set_priv(struct bpf_map *map, void *priv,
490 bpf_map_clear_priv_t clear_priv);
491LIBBPF_API void *bpf_map__priv(const struct bpf_map *map);
492LIBBPF_API int bpf_map__set_initial_value(struct bpf_map *map,
493 const void *data, size_t size);
494LIBBPF_API bool bpf_map__is_offload_neutral(const struct bpf_map *map);
495LIBBPF_API bool bpf_map__is_internal(const struct bpf_map *map);
496LIBBPF_API int bpf_map__set_pin_path(struct bpf_map *map, const char *path);
497LIBBPF_API int bpf_map__set_pin_path_v0_0_4(struct bpf_map *map, const char *path);
498LIBBPF_API int bpf_map__set_pin_path_v0_0_6(struct bpf_map *map, const char *path);
499LIBBPF_API const char *bpf_map__get_pin_path(const struct bpf_map *map);
500LIBBPF_API const char *bpf_map__get_pin_path_v0_0_4(const struct bpf_map *map);
501LIBBPF_API const char *bpf_map__get_pin_path_v0_0_6(const struct bpf_map *map);
502LIBBPF_API bool bpf_map__is_pinned(const struct bpf_map *map);
503LIBBPF_API bool bpf_map__is_pinned_v0_0_4(const struct bpf_map *map);
504LIBBPF_API bool bpf_map__is_pinned_v0_0_6(const struct bpf_map *map);
505LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path);
506LIBBPF_API int bpf_map__unpin(struct bpf_map *map, const char *path);
507
508LIBBPF_API int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd);
509
510LIBBPF_API long libbpf_get_error(const void *ptr);
511
512struct bpf_prog_load_attr {
513 const char *file;
514 enum bpf_prog_type prog_type;
515 enum bpf_attach_type expected_attach_type;
516 int ifindex;
517 int log_level;
518 int prog_flags;
519};
520
521LIBBPF_API int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
522 struct bpf_object **pobj, int *prog_fd);
523LIBBPF_API int bpf_prog_load(const char *file, enum bpf_prog_type type,
524 struct bpf_object **pobj, int *prog_fd);
525
526struct xdp_link_info {
527 __u32 prog_id;
528 __u32 drv_prog_id;
529 __u32 hw_prog_id;
530 __u32 skb_prog_id;
531 __u8 attach_mode;
532};
533
534struct bpf_xdp_set_link_opts {
535 size_t sz;
536 int old_fd;
537};
538#define bpf_xdp_set_link_opts__last_field old_fd
539
540LIBBPF_API int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags);
541LIBBPF_API int bpf_set_link_xdp_fd_opts(int ifindex, int fd, __u32 flags,
542 const struct bpf_xdp_set_link_opts *opts);
543LIBBPF_API int bpf_get_link_xdp_id(int ifindex, __u32 *prog_id, __u32 flags);
544LIBBPF_API int bpf_get_link_xdp_info(int ifindex, struct xdp_link_info *info,
545 size_t info_size, __u32 flags);
546LIBBPF_API int bpf_get_link_xdp_info_v0_0_4(int ifindex, struct xdp_link_info *info,
547 size_t info_size, __u32 flags);
548LIBBPF_API int bpf_get_link_xdp_info_v0_0_6(int ifindex, struct xdp_link_info *info,
549 size_t info_size, __u32 flags);
550
551
552struct ring_buffer;
553
554typedef int (*ring_buffer_sample_fn)(void *ctx, void *data, size_t size);
555
556struct ring_buffer_opts {
557 size_t sz;
558};
559
560#define ring_buffer_opts__last_field sz
561
562LIBBPF_API struct ring_buffer *
563ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx,
564 const struct ring_buffer_opts *opts);
565LIBBPF_API void ring_buffer__free(struct ring_buffer *rb);
566LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd,
567 ring_buffer_sample_fn sample_cb, void *ctx);
568LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms);
569LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb);
570
571
572struct perf_buffer;
573
574typedef void (*perf_buffer_sample_fn)(void *ctx, int cpu,
575 void *data, __u32 size);
576typedef void (*perf_buffer_lost_fn)(void *ctx, int cpu, __u64 cnt);
577
578
579struct perf_buffer_opts {
580
581 perf_buffer_sample_fn sample_cb;
582
583 perf_buffer_lost_fn lost_cb;
584
585 void *ctx;
586};
587
588LIBBPF_API struct perf_buffer *
589perf_buffer__new(int map_fd, size_t page_cnt,
590 const struct perf_buffer_opts *opts);
591
592enum bpf_perf_event_ret {
593 LIBBPF_PERF_EVENT_DONE = 0,
594 LIBBPF_PERF_EVENT_ERROR = -1,
595 LIBBPF_PERF_EVENT_CONT = -2,
596};
597
598struct perf_event_header;
599
600typedef enum bpf_perf_event_ret
601(*perf_buffer_event_fn)(void *ctx, int cpu, struct perf_event_header *event);
602
603
604struct perf_buffer_raw_opts {
605
606 struct perf_event_attr *attr;
607
608 perf_buffer_event_fn event_cb;
609
610 void *ctx;
611
612
613
614 int cpu_cnt;
615
616 int *cpus;
617
618 int *map_keys;
619};
620
621LIBBPF_API struct perf_buffer *
622perf_buffer__new_raw(int map_fd, size_t page_cnt,
623 const struct perf_buffer_raw_opts *opts);
624
625LIBBPF_API void perf_buffer__free(struct perf_buffer *pb);
626LIBBPF_API int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms);
627LIBBPF_API int perf_buffer__consume(struct perf_buffer *pb);
628
629typedef enum bpf_perf_event_ret
630 (*bpf_perf_event_print_t)(struct perf_event_header *hdr,
631 void *private_data);
632LIBBPF_API enum bpf_perf_event_ret
633bpf_perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size,
634 void **copy_mem, size_t *copy_size,
635 bpf_perf_event_print_t fn, void *private_data);
636
637struct bpf_prog_linfo;
638struct bpf_prog_info;
639
640LIBBPF_API void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo);
641LIBBPF_API struct bpf_prog_linfo *
642bpf_prog_linfo__new(const struct bpf_prog_info *info);
643LIBBPF_API const struct bpf_line_info *
644bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo,
645 __u64 addr, __u32 func_idx, __u32 nr_skip);
646LIBBPF_API const struct bpf_line_info *
647bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo,
648 __u32 insn_off, __u32 nr_skip);
649
650
651
652
653
654
655
656
657
658LIBBPF_API bool bpf_probe_prog_type(enum bpf_prog_type prog_type,
659 __u32 ifindex);
660LIBBPF_API bool bpf_probe_map_type(enum bpf_map_type map_type, __u32 ifindex);
661LIBBPF_API bool bpf_probe_helper(enum bpf_func_id id,
662 enum bpf_prog_type prog_type, __u32 ifindex);
663LIBBPF_API bool bpf_probe_large_insn_limit(__u32 ifindex);
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694enum bpf_prog_info_array {
695 BPF_PROG_INFO_FIRST_ARRAY = 0,
696 BPF_PROG_INFO_JITED_INSNS = 0,
697 BPF_PROG_INFO_XLATED_INSNS,
698 BPF_PROG_INFO_MAP_IDS,
699 BPF_PROG_INFO_JITED_KSYMS,
700 BPF_PROG_INFO_JITED_FUNC_LENS,
701 BPF_PROG_INFO_FUNC_INFO,
702 BPF_PROG_INFO_LINE_INFO,
703 BPF_PROG_INFO_JITED_LINE_INFO,
704 BPF_PROG_INFO_PROG_TAGS,
705 BPF_PROG_INFO_LAST_ARRAY,
706};
707
708struct bpf_prog_info_linear {
709
710 __u32 info_len;
711
712 __u32 data_len;
713
714 __u64 arrays;
715 struct bpf_prog_info info;
716 __u8 data[];
717};
718
719LIBBPF_API struct bpf_prog_info_linear *
720bpf_program__get_prog_info_linear(int fd, __u64 arrays);
721
722LIBBPF_API void
723bpf_program__bpil_addr_to_offs(struct bpf_prog_info_linear *info_linear);
724
725LIBBPF_API void
726bpf_program__bpil_offs_to_addr(struct bpf_prog_info_linear *info_linear);
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742LIBBPF_API int libbpf_num_possible_cpus(void);
743
744struct bpf_map_skeleton {
745 const char *name;
746 struct bpf_map **map;
747 void **mmaped;
748};
749
750struct bpf_prog_skeleton {
751 const char *name;
752 struct bpf_program **prog;
753 struct bpf_link **link;
754};
755
756struct bpf_object_skeleton {
757 size_t sz;
758
759 const char *name;
760 void *data;
761 size_t data_sz;
762
763 struct bpf_object **obj;
764
765 int map_cnt;
766 int map_skel_sz;
767 struct bpf_map_skeleton *maps;
768
769 int prog_cnt;
770 int prog_skel_sz;
771 struct bpf_prog_skeleton *progs;
772};
773
774LIBBPF_API int
775bpf_object__open_skeleton(struct bpf_object_skeleton *s,
776 const struct bpf_object_open_opts *opts);
777LIBBPF_API int bpf_object__load_skeleton(struct bpf_object_skeleton *s);
778LIBBPF_API int bpf_object__attach_skeleton(struct bpf_object_skeleton *s);
779LIBBPF_API void bpf_object__detach_skeleton(struct bpf_object_skeleton *s);
780LIBBPF_API void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s);
781
782enum libbpf_tristate {
783 TRI_NO = 0,
784 TRI_YES = 1,
785 TRI_MODULE = 2,
786};
787
788#ifdef __cplusplus
789}
790#endif
791
792#endif
793