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