Commit | Line | Data |
---|---|---|
1b76c13e WN |
1 | /* |
2 | * Common eBPF ELF object loading operations. | |
3 | * | |
4 | * Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org> | |
5 | * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com> | |
6 | * Copyright (C) 2015 Huawei Inc. | |
7 | */ | |
8 | #ifndef __BPF_LIBBPF_H | |
9 | #define __BPF_LIBBPF_H | |
10 | ||
1a5e3fb1 | 11 | #include <stdio.h> |
aa9b1ac3 | 12 | #include <stdbool.h> |
6371ca3b WN |
13 | #include <linux/err.h> |
14 | ||
15 | enum libbpf_errno { | |
16 | __LIBBPF_ERRNO__START = 4000, | |
17 | ||
18 | /* Something wrong in libelf */ | |
19 | LIBBPF_ERRNO__LIBELF = __LIBBPF_ERRNO__START, | |
20 | LIBBPF_ERRNO__FORMAT, /* BPF object format invalid */ | |
21 | LIBBPF_ERRNO__KVERSION, /* Incorrect or no 'version' section */ | |
22 | LIBBPF_ERRNO__ENDIAN, /* Endian missmatch */ | |
23 | LIBBPF_ERRNO__INTERNAL, /* Internal error in libbpf */ | |
24 | LIBBPF_ERRNO__RELOC, /* Relocation failed */ | |
25 | LIBBPF_ERRNO__LOAD, /* Load program failure for unknown reason */ | |
26 | LIBBPF_ERRNO__VERIFY, /* Kernel verifier blocks program loading */ | |
27 | LIBBPF_ERRNO__PROG2BIG, /* Program too big */ | |
28 | LIBBPF_ERRNO__KVER, /* Incorrect kernel version */ | |
29 | __LIBBPF_ERRNO__END, | |
30 | }; | |
31 | ||
32 | int libbpf_strerror(int err, char *buf, size_t size); | |
1a5e3fb1 | 33 | |
b3f59d66 WN |
34 | /* |
35 | * In include/linux/compiler-gcc.h, __printf is defined. However | |
36 | * it should be better if libbpf.h doesn't depend on Linux header file. | |
37 | * So instead of __printf, here we use gcc attribute directly. | |
38 | */ | |
39 | typedef int (*libbpf_print_fn_t)(const char *, ...) | |
40 | __attribute__((format(printf, 1, 2))); | |
41 | ||
42 | void libbpf_set_print(libbpf_print_fn_t warn, | |
43 | libbpf_print_fn_t info, | |
44 | libbpf_print_fn_t debug); | |
45 | ||
1a5e3fb1 WN |
46 | /* Hide internal to user */ |
47 | struct bpf_object; | |
48 | ||
49 | struct bpf_object *bpf_object__open(const char *path); | |
6c956392 | 50 | struct bpf_object *bpf_object__open_buffer(void *obj_buf, |
acf860ae WN |
51 | size_t obj_buf_sz, |
52 | const char *name); | |
1a5e3fb1 WN |
53 | void bpf_object__close(struct bpf_object *object); |
54 | ||
52d3352e WN |
55 | /* Load/unload object into/from kernel */ |
56 | int bpf_object__load(struct bpf_object *obj); | |
57 | int bpf_object__unload(struct bpf_object *obj); | |
acf860ae | 58 | const char *bpf_object__get_name(struct bpf_object *obj); |
45825d8a | 59 | unsigned int bpf_object__get_kversion(struct bpf_object *obj); |
52d3352e | 60 | |
9a208eff WN |
61 | struct bpf_object *bpf_object__next(struct bpf_object *prev); |
62 | #define bpf_object__for_each_safe(pos, tmp) \ | |
63 | for ((pos) = bpf_object__next(NULL), \ | |
64 | (tmp) = bpf_object__next(pos); \ | |
65 | (pos) != NULL; \ | |
66 | (pos) = (tmp), (tmp) = bpf_object__next(tmp)) | |
67 | ||
aa9b1ac3 WN |
68 | /* Accessors of bpf_program. */ |
69 | struct bpf_program; | |
70 | struct bpf_program *bpf_program__next(struct bpf_program *prog, | |
71 | struct bpf_object *obj); | |
72 | ||
73 | #define bpf_object__for_each_program(pos, obj) \ | |
74 | for ((pos) = bpf_program__next(NULL, (obj)); \ | |
75 | (pos) != NULL; \ | |
76 | (pos) = bpf_program__next((pos), (obj))) | |
77 | ||
78 | typedef void (*bpf_program_clear_priv_t)(struct bpf_program *, | |
79 | void *); | |
80 | ||
81 | int bpf_program__set_private(struct bpf_program *prog, void *priv, | |
82 | bpf_program_clear_priv_t clear_priv); | |
83 | ||
84 | int bpf_program__get_private(struct bpf_program *prog, | |
85 | void **ppriv); | |
86 | ||
715f8db9 | 87 | const char *bpf_program__title(struct bpf_program *prog, bool needs_copy); |
aa9b1ac3 WN |
88 | |
89 | int bpf_program__fd(struct bpf_program *prog); | |
90 | ||
34090915 WN |
91 | /* |
92 | * We don't need __attribute__((packed)) now since it is | |
93 | * unnecessary for 'bpf_map_def' because they are all aligned. | |
94 | * In addition, using it will trigger -Wpacked warning message, | |
95 | * and will be treated as an error due to -Werror. | |
96 | */ | |
97 | struct bpf_map_def { | |
98 | unsigned int type; | |
99 | unsigned int key_size; | |
100 | unsigned int value_size; | |
101 | unsigned int max_entries; | |
102 | }; | |
103 | ||
1b76c13e | 104 | #endif |