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_mem(const void *obj_buf, size_t obj_buf_sz,
104 const struct bpf_object_open_opts *opts);
105
106
107LIBBPF_API struct bpf_object *
108bpf_object__open_buffer(const void *obj_buf, size_t obj_buf_sz,
109 const char *name);
110LIBBPF_API struct bpf_object *
111bpf_object__open_xattr(struct bpf_object_open_attr *attr);
112
113enum libbpf_pin_type {
114 LIBBPF_PIN_NONE,
115
116 LIBBPF_PIN_BY_NAME,
117};
118
119
120
121
122
123LIBBPF_API int bpf_object__pin_maps(struct bpf_object *obj, const char *path);
124LIBBPF_API int bpf_object__unpin_maps(struct bpf_object *obj,
125 const char *path);
126LIBBPF_API int bpf_object__pin_programs(struct bpf_object *obj,
127 const char *path);
128LIBBPF_API int bpf_object__unpin_programs(struct bpf_object *obj,
129 const char *path);
130LIBBPF_API int bpf_object__pin(struct bpf_object *object, const char *path);
131LIBBPF_API void bpf_object__close(struct bpf_object *object);
132
133struct bpf_object_load_attr {
134 struct bpf_object *obj;
135 int log_level;
136 const char *target_btf_path;
137};
138
139
140LIBBPF_API int bpf_object__load(struct bpf_object *obj);
141LIBBPF_API int bpf_object__load_xattr(struct bpf_object_load_attr *attr);
142LIBBPF_API int bpf_object__unload(struct bpf_object *obj);
143
144LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj);
145LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj);
146
147struct btf;
148LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj);
149LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj);
150
151LIBBPF_API struct bpf_program *
152bpf_object__find_program_by_title(const struct bpf_object *obj,
153 const char *title);
154LIBBPF_API struct bpf_program *
155bpf_object__find_program_by_name(const struct bpf_object *obj,
156 const char *name);
157
158LIBBPF_API struct bpf_object *bpf_object__next(struct bpf_object *prev);
159#define bpf_object__for_each_safe(pos, tmp) \
160 for ((pos) = bpf_object__next(NULL), \
161 (tmp) = bpf_object__next(pos); \
162 (pos) != NULL; \
163 (pos) = (tmp), (tmp) = bpf_object__next(tmp))
164
165typedef void (*bpf_object_clear_priv_t)(struct bpf_object *, void *);
166LIBBPF_API int bpf_object__set_priv(struct bpf_object *obj, void *priv,
167 bpf_object_clear_priv_t clear_priv);
168LIBBPF_API void *bpf_object__priv(const struct bpf_object *prog);
169
170LIBBPF_API int
171libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type,
172 enum bpf_attach_type *expected_attach_type);
173LIBBPF_API int libbpf_attach_type_by_name(const char *name,
174 enum bpf_attach_type *attach_type);
175LIBBPF_API int libbpf_find_vmlinux_btf_id(const char *name,
176 enum bpf_attach_type attach_type);
177
178
179struct bpf_program;
180LIBBPF_API struct bpf_program *bpf_program__next(struct bpf_program *prog,
181 const struct bpf_object *obj);
182
183#define bpf_object__for_each_program(pos, obj) \
184 for ((pos) = bpf_program__next(NULL, (obj)); \
185 (pos) != NULL; \
186 (pos) = bpf_program__next((pos), (obj)))
187
188LIBBPF_API struct bpf_program *bpf_program__prev(struct bpf_program *prog,
189 const struct bpf_object *obj);
190
191typedef void (*bpf_program_clear_priv_t)(struct bpf_program *, void *);
192
193LIBBPF_API int bpf_program__set_priv(struct bpf_program *prog, void *priv,
194 bpf_program_clear_priv_t clear_priv);
195
196LIBBPF_API void *bpf_program__priv(const struct bpf_program *prog);
197LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog,
198 __u32 ifindex);
199
200LIBBPF_API const char *bpf_program__name(const struct bpf_program *prog);
201LIBBPF_API const char *bpf_program__title(const struct bpf_program *prog,
202 bool needs_copy);
203
204
205LIBBPF_API size_t bpf_program__size(const struct bpf_program *prog);
206
207LIBBPF_API int bpf_program__load(struct bpf_program *prog, char *license,
208 __u32 kern_version);
209LIBBPF_API int bpf_program__fd(const struct bpf_program *prog);
210LIBBPF_API int bpf_program__pin_instance(struct bpf_program *prog,
211 const char *path,
212 int instance);
213LIBBPF_API int bpf_program__unpin_instance(struct bpf_program *prog,
214 const char *path,
215 int instance);
216LIBBPF_API int bpf_program__pin(struct bpf_program *prog, const char *path);
217LIBBPF_API int bpf_program__unpin(struct bpf_program *prog, const char *path);
218LIBBPF_API void bpf_program__unload(struct bpf_program *prog);
219
220struct bpf_link;
221
222LIBBPF_API struct bpf_link *bpf_link__open(const char *path);
223LIBBPF_API int bpf_link__fd(const struct bpf_link *link);
224LIBBPF_API const char *bpf_link__pin_path(const struct bpf_link *link);
225LIBBPF_API int bpf_link__pin(struct bpf_link *link, const char *path);
226LIBBPF_API int bpf_link__unpin(struct bpf_link *link);
227LIBBPF_API int bpf_link__update_program(struct bpf_link *link,
228 struct bpf_program *prog);
229LIBBPF_API void bpf_link__disconnect(struct bpf_link *link);
230LIBBPF_API int bpf_link__destroy(struct bpf_link *link);
231
232LIBBPF_API struct bpf_link *
233bpf_program__attach(struct bpf_program *prog);
234LIBBPF_API struct bpf_link *
235bpf_program__attach_perf_event(struct bpf_program *prog, int pfd);
236LIBBPF_API struct bpf_link *
237bpf_program__attach_kprobe(struct bpf_program *prog, bool retprobe,
238 const char *func_name);
239LIBBPF_API struct bpf_link *
240bpf_program__attach_uprobe(struct bpf_program *prog, bool retprobe,
241 pid_t pid, const char *binary_path,
242 size_t func_offset);
243LIBBPF_API struct bpf_link *
244bpf_program__attach_tracepoint(struct bpf_program *prog,
245 const char *tp_category,
246 const char *tp_name);
247LIBBPF_API struct bpf_link *
248bpf_program__attach_raw_tracepoint(struct bpf_program *prog,
249 const char *tp_name);
250LIBBPF_API struct bpf_link *
251bpf_program__attach_trace(struct bpf_program *prog);
252LIBBPF_API struct bpf_link *
253bpf_program__attach_lsm(struct bpf_program *prog);
254LIBBPF_API struct bpf_link *
255bpf_program__attach_cgroup(struct bpf_program *prog, int cgroup_fd);
256
257struct bpf_map;
258
259LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(struct bpf_map *map);
260
261struct bpf_insn;
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292struct bpf_prog_prep_result {
293
294
295
296
297 struct bpf_insn *new_insn_ptr;
298 int new_insn_cnt;
299
300
301 int *pfd;
302};
303
304
305
306
307
308
309
310
311
312
313
314
315
316typedef int (*bpf_program_prep_t)(struct bpf_program *prog, int n,
317 struct bpf_insn *insns, int insns_cnt,
318 struct bpf_prog_prep_result *res);
319
320LIBBPF_API int bpf_program__set_prep(struct bpf_program *prog, int nr_instance,
321 bpf_program_prep_t prep);
322
323LIBBPF_API int bpf_program__nth_fd(const struct bpf_program *prog, int n);
324
325
326
327
328LIBBPF_API int bpf_program__set_socket_filter(struct bpf_program *prog);
329LIBBPF_API int bpf_program__set_tracepoint(struct bpf_program *prog);
330LIBBPF_API int bpf_program__set_raw_tracepoint(struct bpf_program *prog);
331LIBBPF_API int bpf_program__set_kprobe(struct bpf_program *prog);
332LIBBPF_API int bpf_program__set_lsm(struct bpf_program *prog);
333LIBBPF_API int bpf_program__set_sched_cls(struct bpf_program *prog);
334LIBBPF_API int bpf_program__set_sched_act(struct bpf_program *prog);
335LIBBPF_API int bpf_program__set_xdp(struct bpf_program *prog);
336LIBBPF_API int bpf_program__set_perf_event(struct bpf_program *prog);
337LIBBPF_API int bpf_program__set_tracing(struct bpf_program *prog);
338LIBBPF_API int bpf_program__set_struct_ops(struct bpf_program *prog);
339LIBBPF_API int bpf_program__set_extension(struct bpf_program *prog);
340
341LIBBPF_API enum bpf_prog_type bpf_program__get_type(struct bpf_program *prog);
342LIBBPF_API void bpf_program__set_type(struct bpf_program *prog,
343 enum bpf_prog_type type);
344
345LIBBPF_API enum bpf_attach_type
346bpf_program__get_expected_attach_type(struct bpf_program *prog);
347LIBBPF_API void
348bpf_program__set_expected_attach_type(struct bpf_program *prog,
349 enum bpf_attach_type type);
350
351LIBBPF_API int
352bpf_program__set_attach_target(struct bpf_program *prog, int attach_prog_fd,
353 const char *attach_func_name);
354
355LIBBPF_API bool bpf_program__is_socket_filter(const struct bpf_program *prog);
356LIBBPF_API bool bpf_program__is_tracepoint(const struct bpf_program *prog);
357LIBBPF_API bool bpf_program__is_raw_tracepoint(const struct bpf_program *prog);
358LIBBPF_API bool bpf_program__is_kprobe(const struct bpf_program *prog);
359LIBBPF_API bool bpf_program__is_lsm(const struct bpf_program *prog);
360LIBBPF_API bool bpf_program__is_sched_cls(const struct bpf_program *prog);
361LIBBPF_API bool bpf_program__is_sched_act(const struct bpf_program *prog);
362LIBBPF_API bool bpf_program__is_xdp(const struct bpf_program *prog);
363LIBBPF_API bool bpf_program__is_perf_event(const struct bpf_program *prog);
364LIBBPF_API bool bpf_program__is_tracing(const struct bpf_program *prog);
365LIBBPF_API bool bpf_program__is_struct_ops(const struct bpf_program *prog);
366LIBBPF_API bool bpf_program__is_extension(const struct bpf_program *prog);
367
368
369
370
371
372
373
374struct bpf_map_def {
375 unsigned int type;
376 unsigned int key_size;
377 unsigned int value_size;
378 unsigned int max_entries;
379 unsigned int map_flags;
380};
381
382
383
384
385
386LIBBPF_API struct bpf_map *
387bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name);
388
389LIBBPF_API int
390bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name);
391
392
393
394
395
396LIBBPF_API struct bpf_map *
397bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset);
398
399LIBBPF_API struct bpf_map *
400bpf_map__next(const struct bpf_map *map, const struct bpf_object *obj);
401#define bpf_object__for_each_map(pos, obj) \
402 for ((pos) = bpf_map__next(NULL, (obj)); \
403 (pos) != NULL; \
404 (pos) = bpf_map__next((pos), (obj)))
405#define bpf_map__for_each bpf_object__for_each_map
406
407LIBBPF_API struct bpf_map *
408bpf_map__prev(const struct bpf_map *map, const struct bpf_object *obj);
409
410LIBBPF_API int bpf_map__fd(const struct bpf_map *map);
411LIBBPF_API const struct bpf_map_def *bpf_map__def(const struct bpf_map *map);
412LIBBPF_API const char *bpf_map__name(const struct bpf_map *map);
413LIBBPF_API __u32 bpf_map__btf_key_type_id(const struct bpf_map *map);
414LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map);
415
416typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *);
417LIBBPF_API int bpf_map__set_priv(struct bpf_map *map, void *priv,
418 bpf_map_clear_priv_t clear_priv);
419LIBBPF_API void *bpf_map__priv(const struct bpf_map *map);
420LIBBPF_API int bpf_map__set_initial_value(struct bpf_map *map,
421 const void *data, size_t size);
422LIBBPF_API int bpf_map__reuse_fd(struct bpf_map *map, int fd);
423LIBBPF_API int bpf_map__resize(struct bpf_map *map, __u32 max_entries);
424LIBBPF_API bool bpf_map__is_offload_neutral(const struct bpf_map *map);
425LIBBPF_API bool bpf_map__is_internal(const struct bpf_map *map);
426LIBBPF_API void bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex);
427LIBBPF_API int bpf_map__set_pin_path(struct bpf_map *map, const char *path);
428LIBBPF_API const char *bpf_map__get_pin_path(const struct bpf_map *map);
429LIBBPF_API bool bpf_map__is_pinned(const struct bpf_map *map);
430LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path);
431LIBBPF_API int bpf_map__unpin(struct bpf_map *map, const char *path);
432
433LIBBPF_API int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd);
434
435LIBBPF_API long libbpf_get_error(const void *ptr);
436
437struct bpf_prog_load_attr {
438 const char *file;
439 enum bpf_prog_type prog_type;
440 enum bpf_attach_type expected_attach_type;
441 int ifindex;
442 int log_level;
443 int prog_flags;
444};
445
446LIBBPF_API int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
447 struct bpf_object **pobj, int *prog_fd);
448LIBBPF_API int bpf_prog_load(const char *file, enum bpf_prog_type type,
449 struct bpf_object **pobj, int *prog_fd);
450
451struct xdp_link_info {
452 __u32 prog_id;
453 __u32 drv_prog_id;
454 __u32 hw_prog_id;
455 __u32 skb_prog_id;
456 __u8 attach_mode;
457};
458
459struct bpf_xdp_set_link_opts {
460 size_t sz;
461 int old_fd;
462};
463#define bpf_xdp_set_link_opts__last_field old_fd
464
465LIBBPF_API int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags);
466LIBBPF_API int bpf_set_link_xdp_fd_opts(int ifindex, int fd, __u32 flags,
467 const struct bpf_xdp_set_link_opts *opts);
468LIBBPF_API int bpf_get_link_xdp_id(int ifindex, __u32 *prog_id, __u32 flags);
469LIBBPF_API int bpf_get_link_xdp_info(int ifindex, struct xdp_link_info *info,
470 size_t info_size, __u32 flags);
471
472struct perf_buffer;
473
474typedef void (*perf_buffer_sample_fn)(void *ctx, int cpu,
475 void *data, __u32 size);
476typedef void (*perf_buffer_lost_fn)(void *ctx, int cpu, __u64 cnt);
477
478
479struct perf_buffer_opts {
480
481 perf_buffer_sample_fn sample_cb;
482
483 perf_buffer_lost_fn lost_cb;
484
485 void *ctx;
486};
487
488LIBBPF_API struct perf_buffer *
489perf_buffer__new(int map_fd, size_t page_cnt,
490 const struct perf_buffer_opts *opts);
491
492enum bpf_perf_event_ret {
493 LIBBPF_PERF_EVENT_DONE = 0,
494 LIBBPF_PERF_EVENT_ERROR = -1,
495 LIBBPF_PERF_EVENT_CONT = -2,
496};
497
498struct perf_event_header;
499
500typedef enum bpf_perf_event_ret
501(*perf_buffer_event_fn)(void *ctx, int cpu, struct perf_event_header *event);
502
503
504struct perf_buffer_raw_opts {
505
506 struct perf_event_attr *attr;
507
508 perf_buffer_event_fn event_cb;
509
510 void *ctx;
511
512
513
514 int cpu_cnt;
515
516 int *cpus;
517
518 int *map_keys;
519};
520
521LIBBPF_API struct perf_buffer *
522perf_buffer__new_raw(int map_fd, size_t page_cnt,
523 const struct perf_buffer_raw_opts *opts);
524
525LIBBPF_API void perf_buffer__free(struct perf_buffer *pb);
526LIBBPF_API int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms);
527
528typedef enum bpf_perf_event_ret
529 (*bpf_perf_event_print_t)(struct perf_event_header *hdr,
530 void *private_data);
531LIBBPF_API enum bpf_perf_event_ret
532bpf_perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size,
533 void **copy_mem, size_t *copy_size,
534 bpf_perf_event_print_t fn, void *private_data);
535
536struct bpf_prog_linfo;
537struct bpf_prog_info;
538
539LIBBPF_API void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo);
540LIBBPF_API struct bpf_prog_linfo *
541bpf_prog_linfo__new(const struct bpf_prog_info *info);
542LIBBPF_API const struct bpf_line_info *
543bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo,
544 __u64 addr, __u32 func_idx, __u32 nr_skip);
545LIBBPF_API const struct bpf_line_info *
546bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo,
547 __u32 insn_off, __u32 nr_skip);
548
549
550
551
552
553
554
555
556
557LIBBPF_API bool bpf_probe_prog_type(enum bpf_prog_type prog_type,
558 __u32 ifindex);
559LIBBPF_API bool bpf_probe_map_type(enum bpf_map_type map_type, __u32 ifindex);
560LIBBPF_API bool bpf_probe_helper(enum bpf_func_id id,
561 enum bpf_prog_type prog_type, __u32 ifindex);
562LIBBPF_API bool bpf_probe_large_insn_limit(__u32 ifindex);
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593enum bpf_prog_info_array {
594 BPF_PROG_INFO_FIRST_ARRAY = 0,
595 BPF_PROG_INFO_JITED_INSNS = 0,
596 BPF_PROG_INFO_XLATED_INSNS,
597 BPF_PROG_INFO_MAP_IDS,
598 BPF_PROG_INFO_JITED_KSYMS,
599 BPF_PROG_INFO_JITED_FUNC_LENS,
600 BPF_PROG_INFO_FUNC_INFO,
601 BPF_PROG_INFO_LINE_INFO,
602 BPF_PROG_INFO_JITED_LINE_INFO,
603 BPF_PROG_INFO_PROG_TAGS,
604 BPF_PROG_INFO_LAST_ARRAY,
605};
606
607struct bpf_prog_info_linear {
608
609 __u32 info_len;
610
611 __u32 data_len;
612
613 __u64 arrays;
614 struct bpf_prog_info info;
615 __u8 data[];
616};
617
618LIBBPF_API struct bpf_prog_info_linear *
619bpf_program__get_prog_info_linear(int fd, __u64 arrays);
620
621LIBBPF_API void
622bpf_program__bpil_addr_to_offs(struct bpf_prog_info_linear *info_linear);
623
624LIBBPF_API void
625bpf_program__bpil_offs_to_addr(struct bpf_prog_info_linear *info_linear);
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641LIBBPF_API int libbpf_num_possible_cpus(void);
642
643struct bpf_map_skeleton {
644 const char *name;
645 struct bpf_map **map;
646 void **mmaped;
647};
648
649struct bpf_prog_skeleton {
650 const char *name;
651 struct bpf_program **prog;
652 struct bpf_link **link;
653};
654
655struct bpf_object_skeleton {
656 size_t sz;
657
658 const char *name;
659 void *data;
660 size_t data_sz;
661
662 struct bpf_object **obj;
663
664 int map_cnt;
665 int map_skel_sz;
666 struct bpf_map_skeleton *maps;
667
668 int prog_cnt;
669 int prog_skel_sz;
670 struct bpf_prog_skeleton *progs;
671};
672
673LIBBPF_API int
674bpf_object__open_skeleton(struct bpf_object_skeleton *s,
675 const struct bpf_object_open_opts *opts);
676LIBBPF_API int bpf_object__load_skeleton(struct bpf_object_skeleton *s);
677LIBBPF_API int bpf_object__attach_skeleton(struct bpf_object_skeleton *s);
678LIBBPF_API void bpf_object__detach_skeleton(struct bpf_object_skeleton *s);
679LIBBPF_API void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s);
680
681enum libbpf_tristate {
682 TRI_NO = 0,
683 TRI_YES = 1,
684 TRI_MODULE = 2,
685};
686
687#ifdef __cplusplus
688}
689#endif
690
691#endif
692