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);
203LIBBPF_API bool bpf_program__autoload(const struct bpf_program *prog);
204LIBBPF_API int bpf_program__set_autoload(struct bpf_program *prog, bool autoload);
205
206
207LIBBPF_API size_t bpf_program__size(const struct bpf_program *prog);
208
209LIBBPF_API int bpf_program__load(struct bpf_program *prog, char *license,
210 __u32 kern_version);
211LIBBPF_API int bpf_program__fd(const struct bpf_program *prog);
212LIBBPF_API int bpf_program__pin_instance(struct bpf_program *prog,
213 const char *path,
214 int instance);
215LIBBPF_API int bpf_program__unpin_instance(struct bpf_program *prog,
216 const char *path,
217 int instance);
218LIBBPF_API int bpf_program__pin(struct bpf_program *prog, const char *path);
219LIBBPF_API int bpf_program__unpin(struct bpf_program *prog, const char *path);
220LIBBPF_API void bpf_program__unload(struct bpf_program *prog);
221
222struct bpf_link;
223
224LIBBPF_API struct bpf_link *bpf_link__open(const char *path);
225LIBBPF_API int bpf_link__fd(const struct bpf_link *link);
226LIBBPF_API const char *bpf_link__pin_path(const struct bpf_link *link);
227LIBBPF_API int bpf_link__pin(struct bpf_link *link, const char *path);
228LIBBPF_API int bpf_link__unpin(struct bpf_link *link);
229LIBBPF_API int bpf_link__update_program(struct bpf_link *link,
230 struct bpf_program *prog);
231LIBBPF_API void bpf_link__disconnect(struct bpf_link *link);
232LIBBPF_API int bpf_link__detach(struct bpf_link *link);
233LIBBPF_API int bpf_link__destroy(struct bpf_link *link);
234
235LIBBPF_API struct bpf_link *
236bpf_program__attach(struct bpf_program *prog);
237LIBBPF_API struct bpf_link *
238bpf_program__attach_perf_event(struct bpf_program *prog, int pfd);
239LIBBPF_API struct bpf_link *
240bpf_program__attach_kprobe(struct bpf_program *prog, bool retprobe,
241 const char *func_name);
242LIBBPF_API struct bpf_link *
243bpf_program__attach_uprobe(struct bpf_program *prog, bool retprobe,
244 pid_t pid, const char *binary_path,
245 size_t func_offset);
246LIBBPF_API struct bpf_link *
247bpf_program__attach_tracepoint(struct bpf_program *prog,
248 const char *tp_category,
249 const char *tp_name);
250LIBBPF_API struct bpf_link *
251bpf_program__attach_raw_tracepoint(struct bpf_program *prog,
252 const char *tp_name);
253LIBBPF_API struct bpf_link *
254bpf_program__attach_trace(struct bpf_program *prog);
255LIBBPF_API struct bpf_link *
256bpf_program__attach_lsm(struct bpf_program *prog);
257LIBBPF_API struct bpf_link *
258bpf_program__attach_cgroup(struct bpf_program *prog, int cgroup_fd);
259LIBBPF_API struct bpf_link *
260bpf_program__attach_netns(struct bpf_program *prog, int netns_fd);
261LIBBPF_API struct bpf_link *
262bpf_program__attach_xdp(struct bpf_program *prog, int ifindex);
263
264struct bpf_map;
265
266LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(struct bpf_map *map);
267
268struct bpf_iter_attach_opts {
269 size_t sz;
270 union bpf_iter_link_info *link_info;
271 __u32 link_info_len;
272};
273#define bpf_iter_attach_opts__last_field link_info_len
274
275LIBBPF_API struct bpf_link *
276bpf_program__attach_iter(struct bpf_program *prog,
277 const struct bpf_iter_attach_opts *opts);
278
279struct bpf_insn;
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310struct bpf_prog_prep_result {
311
312
313
314
315 struct bpf_insn *new_insn_ptr;
316 int new_insn_cnt;
317
318
319 int *pfd;
320};
321
322
323
324
325
326
327
328
329
330
331
332
333
334typedef int (*bpf_program_prep_t)(struct bpf_program *prog, int n,
335 struct bpf_insn *insns, int insns_cnt,
336 struct bpf_prog_prep_result *res);
337
338LIBBPF_API int bpf_program__set_prep(struct bpf_program *prog, int nr_instance,
339 bpf_program_prep_t prep);
340
341LIBBPF_API int bpf_program__nth_fd(const struct bpf_program *prog, int n);
342
343
344
345
346LIBBPF_API int bpf_program__set_socket_filter(struct bpf_program *prog);
347LIBBPF_API int bpf_program__set_tracepoint(struct bpf_program *prog);
348LIBBPF_API int bpf_program__set_raw_tracepoint(struct bpf_program *prog);
349LIBBPF_API int bpf_program__set_kprobe(struct bpf_program *prog);
350LIBBPF_API int bpf_program__set_lsm(struct bpf_program *prog);
351LIBBPF_API int bpf_program__set_sched_cls(struct bpf_program *prog);
352LIBBPF_API int bpf_program__set_sched_act(struct bpf_program *prog);
353LIBBPF_API int bpf_program__set_xdp(struct bpf_program *prog);
354LIBBPF_API int bpf_program__set_perf_event(struct bpf_program *prog);
355LIBBPF_API int bpf_program__set_tracing(struct bpf_program *prog);
356LIBBPF_API int bpf_program__set_struct_ops(struct bpf_program *prog);
357LIBBPF_API int bpf_program__set_extension(struct bpf_program *prog);
358LIBBPF_API int bpf_program__set_sk_lookup(struct bpf_program *prog);
359
360LIBBPF_API enum bpf_prog_type bpf_program__get_type(struct bpf_program *prog);
361LIBBPF_API void bpf_program__set_type(struct bpf_program *prog,
362 enum bpf_prog_type type);
363
364LIBBPF_API enum bpf_attach_type
365bpf_program__get_expected_attach_type(struct bpf_program *prog);
366LIBBPF_API void
367bpf_program__set_expected_attach_type(struct bpf_program *prog,
368 enum bpf_attach_type type);
369
370LIBBPF_API int
371bpf_program__set_attach_target(struct bpf_program *prog, int attach_prog_fd,
372 const char *attach_func_name);
373
374LIBBPF_API bool bpf_program__is_socket_filter(const struct bpf_program *prog);
375LIBBPF_API bool bpf_program__is_tracepoint(const struct bpf_program *prog);
376LIBBPF_API bool bpf_program__is_raw_tracepoint(const struct bpf_program *prog);
377LIBBPF_API bool bpf_program__is_kprobe(const struct bpf_program *prog);
378LIBBPF_API bool bpf_program__is_lsm(const struct bpf_program *prog);
379LIBBPF_API bool bpf_program__is_sched_cls(const struct bpf_program *prog);
380LIBBPF_API bool bpf_program__is_sched_act(const struct bpf_program *prog);
381LIBBPF_API bool bpf_program__is_xdp(const struct bpf_program *prog);
382LIBBPF_API bool bpf_program__is_perf_event(const struct bpf_program *prog);
383LIBBPF_API bool bpf_program__is_tracing(const struct bpf_program *prog);
384LIBBPF_API bool bpf_program__is_struct_ops(const struct bpf_program *prog);
385LIBBPF_API bool bpf_program__is_extension(const struct bpf_program *prog);
386LIBBPF_API bool bpf_program__is_sk_lookup(const struct bpf_program *prog);
387
388
389
390
391
392
393
394struct bpf_map_def {
395 unsigned int type;
396 unsigned int key_size;
397 unsigned int value_size;
398 unsigned int max_entries;
399 unsigned int map_flags;
400};
401
402
403
404
405
406LIBBPF_API struct bpf_map *
407bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name);
408
409LIBBPF_API int
410bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name);
411
412
413
414
415
416LIBBPF_API struct bpf_map *
417bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset);
418
419LIBBPF_API struct bpf_map *
420bpf_map__next(const struct bpf_map *map, const struct bpf_object *obj);
421#define bpf_object__for_each_map(pos, obj) \
422 for ((pos) = bpf_map__next(NULL, (obj)); \
423 (pos) != NULL; \
424 (pos) = bpf_map__next((pos), (obj)))
425#define bpf_map__for_each bpf_object__for_each_map
426
427LIBBPF_API struct bpf_map *
428bpf_map__prev(const struct bpf_map *map, const struct bpf_object *obj);
429
430
431LIBBPF_API int bpf_map__fd(const struct bpf_map *map);
432LIBBPF_API int bpf_map__reuse_fd(struct bpf_map *map, int fd);
433
434LIBBPF_API const struct bpf_map_def *bpf_map__def(const struct bpf_map *map);
435
436LIBBPF_API const char *bpf_map__name(const struct bpf_map *map);
437
438LIBBPF_API enum bpf_map_type bpf_map__type(const struct bpf_map *map);
439LIBBPF_API int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type);
440
441LIBBPF_API __u32 bpf_map__max_entries(const struct bpf_map *map);
442LIBBPF_API int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries);
443LIBBPF_API int bpf_map__resize(struct bpf_map *map, __u32 max_entries);
444
445LIBBPF_API __u32 bpf_map__map_flags(const struct bpf_map *map);
446LIBBPF_API int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags);
447
448LIBBPF_API __u32 bpf_map__numa_node(const struct bpf_map *map);
449LIBBPF_API int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node);
450
451LIBBPF_API __u32 bpf_map__key_size(const struct bpf_map *map);
452LIBBPF_API int bpf_map__set_key_size(struct bpf_map *map, __u32 size);
453
454LIBBPF_API __u32 bpf_map__value_size(const struct bpf_map *map);
455LIBBPF_API int bpf_map__set_value_size(struct bpf_map *map, __u32 size);
456
457LIBBPF_API __u32 bpf_map__btf_key_type_id(const struct bpf_map *map);
458LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map);
459
460LIBBPF_API __u32 bpf_map__ifindex(const struct bpf_map *map);
461LIBBPF_API int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex);
462
463typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *);
464LIBBPF_API int bpf_map__set_priv(struct bpf_map *map, void *priv,
465 bpf_map_clear_priv_t clear_priv);
466LIBBPF_API void *bpf_map__priv(const struct bpf_map *map);
467LIBBPF_API int bpf_map__set_initial_value(struct bpf_map *map,
468 const void *data, size_t size);
469LIBBPF_API bool bpf_map__is_offload_neutral(const struct bpf_map *map);
470LIBBPF_API bool bpf_map__is_internal(const struct bpf_map *map);
471LIBBPF_API int bpf_map__set_pin_path(struct bpf_map *map, const char *path);
472LIBBPF_API const char *bpf_map__get_pin_path(const struct bpf_map *map);
473LIBBPF_API bool bpf_map__is_pinned(const struct bpf_map *map);
474LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path);
475LIBBPF_API int bpf_map__unpin(struct bpf_map *map, const char *path);
476
477LIBBPF_API int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd);
478
479LIBBPF_API long libbpf_get_error(const void *ptr);
480
481struct bpf_prog_load_attr {
482 const char *file;
483 enum bpf_prog_type prog_type;
484 enum bpf_attach_type expected_attach_type;
485 int ifindex;
486 int log_level;
487 int prog_flags;
488};
489
490LIBBPF_API int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,
491 struct bpf_object **pobj, int *prog_fd);
492LIBBPF_API int bpf_prog_load(const char *file, enum bpf_prog_type type,
493 struct bpf_object **pobj, int *prog_fd);
494
495struct xdp_link_info {
496 __u32 prog_id;
497 __u32 drv_prog_id;
498 __u32 hw_prog_id;
499 __u32 skb_prog_id;
500 __u8 attach_mode;
501};
502
503struct bpf_xdp_set_link_opts {
504 size_t sz;
505 int old_fd;
506};
507#define bpf_xdp_set_link_opts__last_field old_fd
508
509LIBBPF_API int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags);
510LIBBPF_API int bpf_set_link_xdp_fd_opts(int ifindex, int fd, __u32 flags,
511 const struct bpf_xdp_set_link_opts *opts);
512LIBBPF_API int bpf_get_link_xdp_id(int ifindex, __u32 *prog_id, __u32 flags);
513LIBBPF_API int bpf_get_link_xdp_info(int ifindex, struct xdp_link_info *info,
514 size_t info_size, __u32 flags);
515
516
517struct ring_buffer;
518
519typedef int (*ring_buffer_sample_fn)(void *ctx, void *data, size_t size);
520
521struct ring_buffer_opts {
522 size_t sz;
523};
524
525#define ring_buffer_opts__last_field sz
526
527LIBBPF_API struct ring_buffer *
528ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx,
529 const struct ring_buffer_opts *opts);
530LIBBPF_API void ring_buffer__free(struct ring_buffer *rb);
531LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd,
532 ring_buffer_sample_fn sample_cb, void *ctx);
533LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms);
534LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb);
535
536
537struct perf_buffer;
538
539typedef void (*perf_buffer_sample_fn)(void *ctx, int cpu,
540 void *data, __u32 size);
541typedef void (*perf_buffer_lost_fn)(void *ctx, int cpu, __u64 cnt);
542
543
544struct perf_buffer_opts {
545
546 perf_buffer_sample_fn sample_cb;
547
548 perf_buffer_lost_fn lost_cb;
549
550 void *ctx;
551};
552
553LIBBPF_API struct perf_buffer *
554perf_buffer__new(int map_fd, size_t page_cnt,
555 const struct perf_buffer_opts *opts);
556
557enum bpf_perf_event_ret {
558 LIBBPF_PERF_EVENT_DONE = 0,
559 LIBBPF_PERF_EVENT_ERROR = -1,
560 LIBBPF_PERF_EVENT_CONT = -2,
561};
562
563struct perf_event_header;
564
565typedef enum bpf_perf_event_ret
566(*perf_buffer_event_fn)(void *ctx, int cpu, struct perf_event_header *event);
567
568
569struct perf_buffer_raw_opts {
570
571 struct perf_event_attr *attr;
572
573 perf_buffer_event_fn event_cb;
574
575 void *ctx;
576
577
578
579 int cpu_cnt;
580
581 int *cpus;
582
583 int *map_keys;
584};
585
586LIBBPF_API struct perf_buffer *
587perf_buffer__new_raw(int map_fd, size_t page_cnt,
588 const struct perf_buffer_raw_opts *opts);
589
590LIBBPF_API void perf_buffer__free(struct perf_buffer *pb);
591LIBBPF_API int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms);
592LIBBPF_API int perf_buffer__consume(struct perf_buffer *pb);
593
594typedef enum bpf_perf_event_ret
595 (*bpf_perf_event_print_t)(struct perf_event_header *hdr,
596 void *private_data);
597LIBBPF_API enum bpf_perf_event_ret
598bpf_perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size,
599 void **copy_mem, size_t *copy_size,
600 bpf_perf_event_print_t fn, void *private_data);
601
602struct bpf_prog_linfo;
603struct bpf_prog_info;
604
605LIBBPF_API void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo);
606LIBBPF_API struct bpf_prog_linfo *
607bpf_prog_linfo__new(const struct bpf_prog_info *info);
608LIBBPF_API const struct bpf_line_info *
609bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo,
610 __u64 addr, __u32 func_idx, __u32 nr_skip);
611LIBBPF_API const struct bpf_line_info *
612bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo,
613 __u32 insn_off, __u32 nr_skip);
614
615
616
617
618
619
620
621
622
623LIBBPF_API bool bpf_probe_prog_type(enum bpf_prog_type prog_type,
624 __u32 ifindex);
625LIBBPF_API bool bpf_probe_map_type(enum bpf_map_type map_type, __u32 ifindex);
626LIBBPF_API bool bpf_probe_helper(enum bpf_func_id id,
627 enum bpf_prog_type prog_type, __u32 ifindex);
628LIBBPF_API bool bpf_probe_large_insn_limit(__u32 ifindex);
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659enum bpf_prog_info_array {
660 BPF_PROG_INFO_FIRST_ARRAY = 0,
661 BPF_PROG_INFO_JITED_INSNS = 0,
662 BPF_PROG_INFO_XLATED_INSNS,
663 BPF_PROG_INFO_MAP_IDS,
664 BPF_PROG_INFO_JITED_KSYMS,
665 BPF_PROG_INFO_JITED_FUNC_LENS,
666 BPF_PROG_INFO_FUNC_INFO,
667 BPF_PROG_INFO_LINE_INFO,
668 BPF_PROG_INFO_JITED_LINE_INFO,
669 BPF_PROG_INFO_PROG_TAGS,
670 BPF_PROG_INFO_LAST_ARRAY,
671};
672
673struct bpf_prog_info_linear {
674
675 __u32 info_len;
676
677 __u32 data_len;
678
679 __u64 arrays;
680 struct bpf_prog_info info;
681 __u8 data[];
682};
683
684LIBBPF_API struct bpf_prog_info_linear *
685bpf_program__get_prog_info_linear(int fd, __u64 arrays);
686
687LIBBPF_API void
688bpf_program__bpil_addr_to_offs(struct bpf_prog_info_linear *info_linear);
689
690LIBBPF_API void
691bpf_program__bpil_offs_to_addr(struct bpf_prog_info_linear *info_linear);
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707LIBBPF_API int libbpf_num_possible_cpus(void);
708
709struct bpf_map_skeleton {
710 const char *name;
711 struct bpf_map **map;
712 void **mmaped;
713};
714
715struct bpf_prog_skeleton {
716 const char *name;
717 struct bpf_program **prog;
718 struct bpf_link **link;
719};
720
721struct bpf_object_skeleton {
722 size_t sz;
723
724 const char *name;
725 void *data;
726 size_t data_sz;
727
728 struct bpf_object **obj;
729
730 int map_cnt;
731 int map_skel_sz;
732 struct bpf_map_skeleton *maps;
733
734 int prog_cnt;
735 int prog_skel_sz;
736 struct bpf_prog_skeleton *progs;
737};
738
739LIBBPF_API int
740bpf_object__open_skeleton(struct bpf_object_skeleton *s,
741 const struct bpf_object_open_opts *opts);
742LIBBPF_API int bpf_object__load_skeleton(struct bpf_object_skeleton *s);
743LIBBPF_API int bpf_object__attach_skeleton(struct bpf_object_skeleton *s);
744LIBBPF_API void bpf_object__detach_skeleton(struct bpf_object_skeleton *s);
745LIBBPF_API void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s);
746
747enum libbpf_tristate {
748 TRI_NO = 0,
749 TRI_YES = 1,
750 TRI_MODULE = 2,
751};
752
753#ifdef __cplusplus
754}
755#endif
756
757#endif
758