.. | .. |
---|
1 | | -/* SPDX-License-Identifier: LGPL-2.1 */ |
---|
| 1 | +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ |
---|
2 | 2 | |
---|
3 | 3 | /* |
---|
4 | 4 | * Common eBPF ELF object loading operations. |
---|
.. | .. |
---|
6 | 6 | * Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org> |
---|
7 | 7 | * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com> |
---|
8 | 8 | * Copyright (C) 2015 Huawei Inc. |
---|
9 | | - * |
---|
10 | | - * This program is free software; you can redistribute it and/or |
---|
11 | | - * modify it under the terms of the GNU Lesser General Public |
---|
12 | | - * License as published by the Free Software Foundation; |
---|
13 | | - * version 2.1 of the License (not later!) |
---|
14 | | - * |
---|
15 | | - * This program is distributed in the hope that it will be useful, |
---|
16 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
17 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
18 | | - * GNU Lesser General Public License for more details. |
---|
19 | | - * |
---|
20 | | - * You should have received a copy of the GNU Lesser General Public |
---|
21 | | - * License along with this program; if not, see <http://www.gnu.org/licenses> |
---|
22 | 9 | */ |
---|
23 | | -#ifndef __BPF_LIBBPF_H |
---|
24 | | -#define __BPF_LIBBPF_H |
---|
| 10 | +#ifndef __LIBBPF_LIBBPF_H |
---|
| 11 | +#define __LIBBPF_LIBBPF_H |
---|
25 | 12 | |
---|
| 13 | +#include <stdarg.h> |
---|
26 | 14 | #include <stdio.h> |
---|
27 | 15 | #include <stdint.h> |
---|
28 | 16 | #include <stdbool.h> |
---|
29 | 17 | #include <sys/types.h> // for size_t |
---|
30 | 18 | #include <linux/bpf.h> |
---|
| 19 | + |
---|
| 20 | +#include "libbpf_common.h" |
---|
| 21 | + |
---|
| 22 | +#ifdef __cplusplus |
---|
| 23 | +extern "C" { |
---|
| 24 | +#endif |
---|
31 | 25 | |
---|
32 | 26 | enum libbpf_errno { |
---|
33 | 27 | __LIBBPF_ERRNO__START = 4000, |
---|
.. | .. |
---|
46 | 40 | LIBBPF_ERRNO__PROGTYPE, /* Kernel doesn't support this program type */ |
---|
47 | 41 | LIBBPF_ERRNO__WRNGPID, /* Wrong pid in netlink message */ |
---|
48 | 42 | LIBBPF_ERRNO__INVSEQ, /* Invalid netlink sequence */ |
---|
| 43 | + LIBBPF_ERRNO__NLPARSE, /* netlink parsing error */ |
---|
49 | 44 | __LIBBPF_ERRNO__END, |
---|
50 | 45 | }; |
---|
51 | 46 | |
---|
52 | | -int libbpf_strerror(int err, char *buf, size_t size); |
---|
| 47 | +LIBBPF_API int libbpf_strerror(int err, char *buf, size_t size); |
---|
53 | 48 | |
---|
54 | | -/* |
---|
55 | | - * __printf is defined in include/linux/compiler-gcc.h. However, |
---|
56 | | - * it would be better if libbpf.h didn't depend on Linux header files. |
---|
57 | | - * So instead of __printf, here we use gcc attribute directly. |
---|
58 | | - */ |
---|
59 | | -typedef int (*libbpf_print_fn_t)(const char *, ...) |
---|
60 | | - __attribute__((format(printf, 1, 2))); |
---|
| 49 | +enum libbpf_print_level { |
---|
| 50 | + LIBBPF_WARN, |
---|
| 51 | + LIBBPF_INFO, |
---|
| 52 | + LIBBPF_DEBUG, |
---|
| 53 | +}; |
---|
61 | 54 | |
---|
62 | | -void libbpf_set_print(libbpf_print_fn_t warn, |
---|
63 | | - libbpf_print_fn_t info, |
---|
64 | | - libbpf_print_fn_t debug); |
---|
| 55 | +typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level, |
---|
| 56 | + const char *, va_list ap); |
---|
| 57 | + |
---|
| 58 | +LIBBPF_API libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn); |
---|
65 | 59 | |
---|
66 | 60 | /* Hide internal to user */ |
---|
67 | 61 | struct bpf_object; |
---|
.. | .. |
---|
71 | 65 | enum bpf_prog_type prog_type; |
---|
72 | 66 | }; |
---|
73 | 67 | |
---|
74 | | -struct bpf_object *bpf_object__open(const char *path); |
---|
75 | | -struct bpf_object *bpf_object__open_xattr(struct bpf_object_open_attr *attr); |
---|
76 | | -struct bpf_object *bpf_object__open_buffer(void *obj_buf, |
---|
77 | | - size_t obj_buf_sz, |
---|
78 | | - const char *name); |
---|
79 | | -int bpf_object__pin(struct bpf_object *object, const char *path); |
---|
80 | | -void bpf_object__close(struct bpf_object *object); |
---|
| 68 | +struct bpf_object_open_opts { |
---|
| 69 | + /* size of this struct, for forward/backward compatiblity */ |
---|
| 70 | + size_t sz; |
---|
| 71 | + /* object name override, if provided: |
---|
| 72 | + * - for object open from file, this will override setting object |
---|
| 73 | + * name from file path's base name; |
---|
| 74 | + * - for object open from memory buffer, this will specify an object |
---|
| 75 | + * name and will override default "<addr>-<buf-size>" name; |
---|
| 76 | + */ |
---|
| 77 | + const char *object_name; |
---|
| 78 | + /* parse map definitions non-strictly, allowing extra attributes/data */ |
---|
| 79 | + bool relaxed_maps; |
---|
| 80 | + /* DEPRECATED: handle CO-RE relocations non-strictly, allowing failures. |
---|
| 81 | + * Value is ignored. Relocations always are processed non-strictly. |
---|
| 82 | + * Non-relocatable instructions are replaced with invalid ones to |
---|
| 83 | + * prevent accidental errors. |
---|
| 84 | + * */ |
---|
| 85 | + bool relaxed_core_relocs; |
---|
| 86 | + /* maps that set the 'pinning' attribute in their definition will have |
---|
| 87 | + * their pin_path attribute set to a file in this directory, and be |
---|
| 88 | + * auto-pinned to that path on load; defaults to "/sys/fs/bpf". |
---|
| 89 | + */ |
---|
| 90 | + const char *pin_root_path; |
---|
| 91 | + __u32 attach_prog_fd; |
---|
| 92 | + /* Additional kernel config content that augments and overrides |
---|
| 93 | + * system Kconfig for CONFIG_xxx externs. |
---|
| 94 | + */ |
---|
| 95 | + const char *kconfig; |
---|
| 96 | +}; |
---|
| 97 | +#define bpf_object_open_opts__last_field kconfig |
---|
| 98 | + |
---|
| 99 | +LIBBPF_API struct bpf_object *bpf_object__open(const char *path); |
---|
| 100 | +LIBBPF_API struct bpf_object * |
---|
| 101 | +bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts); |
---|
| 102 | +LIBBPF_API struct bpf_object * |
---|
| 103 | +bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, |
---|
| 104 | + const struct bpf_object_open_opts *opts); |
---|
| 105 | + |
---|
| 106 | +/* deprecated bpf_object__open variants */ |
---|
| 107 | +LIBBPF_API struct bpf_object * |
---|
| 108 | +bpf_object__open_buffer(const void *obj_buf, size_t obj_buf_sz, |
---|
| 109 | + const char *name); |
---|
| 110 | +LIBBPF_API struct bpf_object * |
---|
| 111 | +bpf_object__open_xattr(struct bpf_object_open_attr *attr); |
---|
| 112 | + |
---|
| 113 | +enum libbpf_pin_type { |
---|
| 114 | + LIBBPF_PIN_NONE, |
---|
| 115 | + /* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */ |
---|
| 116 | + LIBBPF_PIN_BY_NAME, |
---|
| 117 | +}; |
---|
| 118 | + |
---|
| 119 | +/* pin_maps and unpin_maps can both be called with a NULL path, in which case |
---|
| 120 | + * they will use the pin_path attribute of each map (and ignore all maps that |
---|
| 121 | + * don't have a pin_path set). |
---|
| 122 | + */ |
---|
| 123 | +LIBBPF_API int bpf_object__pin_maps(struct bpf_object *obj, const char *path); |
---|
| 124 | +LIBBPF_API int bpf_object__unpin_maps(struct bpf_object *obj, |
---|
| 125 | + const char *path); |
---|
| 126 | +LIBBPF_API int bpf_object__pin_programs(struct bpf_object *obj, |
---|
| 127 | + const char *path); |
---|
| 128 | +LIBBPF_API int bpf_object__unpin_programs(struct bpf_object *obj, |
---|
| 129 | + const char *path); |
---|
| 130 | +LIBBPF_API int bpf_object__pin(struct bpf_object *object, const char *path); |
---|
| 131 | +LIBBPF_API void bpf_object__close(struct bpf_object *object); |
---|
| 132 | + |
---|
| 133 | +struct bpf_object_load_attr { |
---|
| 134 | + struct bpf_object *obj; |
---|
| 135 | + int log_level; |
---|
| 136 | + const char *target_btf_path; |
---|
| 137 | +}; |
---|
81 | 138 | |
---|
82 | 139 | /* Load/unload object into/from kernel */ |
---|
83 | | -int bpf_object__load(struct bpf_object *obj); |
---|
84 | | -int bpf_object__unload(struct bpf_object *obj); |
---|
85 | | -const char *bpf_object__name(struct bpf_object *obj); |
---|
86 | | -unsigned int bpf_object__kversion(struct bpf_object *obj); |
---|
87 | | -int bpf_object__btf_fd(const struct bpf_object *obj); |
---|
| 140 | +LIBBPF_API int bpf_object__load(struct bpf_object *obj); |
---|
| 141 | +LIBBPF_API int bpf_object__load_xattr(struct bpf_object_load_attr *attr); |
---|
| 142 | +LIBBPF_API int bpf_object__unload(struct bpf_object *obj); |
---|
88 | 143 | |
---|
89 | | -struct bpf_program * |
---|
90 | | -bpf_object__find_program_by_title(struct bpf_object *obj, const char *title); |
---|
| 144 | +LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj); |
---|
| 145 | +LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj); |
---|
91 | 146 | |
---|
92 | | -struct bpf_object *bpf_object__next(struct bpf_object *prev); |
---|
| 147 | +struct btf; |
---|
| 148 | +LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj); |
---|
| 149 | +LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj); |
---|
| 150 | + |
---|
| 151 | +LIBBPF_API struct bpf_program * |
---|
| 152 | +bpf_object__find_program_by_title(const struct bpf_object *obj, |
---|
| 153 | + const char *title); |
---|
| 154 | +LIBBPF_API struct bpf_program * |
---|
| 155 | +bpf_object__find_program_by_name(const struct bpf_object *obj, |
---|
| 156 | + const char *name); |
---|
| 157 | + |
---|
| 158 | +LIBBPF_API struct bpf_object *bpf_object__next(struct bpf_object *prev); |
---|
93 | 159 | #define bpf_object__for_each_safe(pos, tmp) \ |
---|
94 | 160 | for ((pos) = bpf_object__next(NULL), \ |
---|
95 | 161 | (tmp) = bpf_object__next(pos); \ |
---|
.. | .. |
---|
97 | 163 | (pos) = (tmp), (tmp) = bpf_object__next(tmp)) |
---|
98 | 164 | |
---|
99 | 165 | typedef void (*bpf_object_clear_priv_t)(struct bpf_object *, void *); |
---|
100 | | -int bpf_object__set_priv(struct bpf_object *obj, void *priv, |
---|
101 | | - bpf_object_clear_priv_t clear_priv); |
---|
102 | | -void *bpf_object__priv(struct bpf_object *prog); |
---|
| 166 | +LIBBPF_API int bpf_object__set_priv(struct bpf_object *obj, void *priv, |
---|
| 167 | + bpf_object_clear_priv_t clear_priv); |
---|
| 168 | +LIBBPF_API void *bpf_object__priv(const struct bpf_object *prog); |
---|
103 | 169 | |
---|
104 | | -int libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, |
---|
105 | | - enum bpf_attach_type *expected_attach_type); |
---|
| 170 | +LIBBPF_API int |
---|
| 171 | +libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, |
---|
| 172 | + enum bpf_attach_type *expected_attach_type); |
---|
| 173 | +LIBBPF_API int libbpf_attach_type_by_name(const char *name, |
---|
| 174 | + enum bpf_attach_type *attach_type); |
---|
| 175 | +LIBBPF_API int libbpf_find_vmlinux_btf_id(const char *name, |
---|
| 176 | + enum bpf_attach_type attach_type); |
---|
106 | 177 | |
---|
107 | 178 | /* Accessors of bpf_program */ |
---|
108 | 179 | struct bpf_program; |
---|
109 | | -struct bpf_program *bpf_program__next(struct bpf_program *prog, |
---|
110 | | - struct bpf_object *obj); |
---|
| 180 | +LIBBPF_API struct bpf_program *bpf_program__next(struct bpf_program *prog, |
---|
| 181 | + const struct bpf_object *obj); |
---|
111 | 182 | |
---|
112 | 183 | #define bpf_object__for_each_program(pos, obj) \ |
---|
113 | 184 | for ((pos) = bpf_program__next(NULL, (obj)); \ |
---|
114 | 185 | (pos) != NULL; \ |
---|
115 | 186 | (pos) = bpf_program__next((pos), (obj))) |
---|
116 | 187 | |
---|
117 | | -typedef void (*bpf_program_clear_priv_t)(struct bpf_program *, |
---|
118 | | - void *); |
---|
| 188 | +LIBBPF_API struct bpf_program *bpf_program__prev(struct bpf_program *prog, |
---|
| 189 | + const struct bpf_object *obj); |
---|
119 | 190 | |
---|
120 | | -int bpf_program__set_priv(struct bpf_program *prog, void *priv, |
---|
121 | | - bpf_program_clear_priv_t clear_priv); |
---|
| 191 | +typedef void (*bpf_program_clear_priv_t)(struct bpf_program *, void *); |
---|
122 | 192 | |
---|
123 | | -void *bpf_program__priv(struct bpf_program *prog); |
---|
124 | | -void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex); |
---|
| 193 | +LIBBPF_API int bpf_program__set_priv(struct bpf_program *prog, void *priv, |
---|
| 194 | + bpf_program_clear_priv_t clear_priv); |
---|
125 | 195 | |
---|
126 | | -const char *bpf_program__title(struct bpf_program *prog, bool needs_copy); |
---|
| 196 | +LIBBPF_API void *bpf_program__priv(const struct bpf_program *prog); |
---|
| 197 | +LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog, |
---|
| 198 | + __u32 ifindex); |
---|
127 | 199 | |
---|
128 | | -int bpf_program__fd(struct bpf_program *prog); |
---|
129 | | -int bpf_program__pin_instance(struct bpf_program *prog, const char *path, |
---|
130 | | - int instance); |
---|
131 | | -int bpf_program__pin(struct bpf_program *prog, const char *path); |
---|
| 200 | +LIBBPF_API const char *bpf_program__name(const struct bpf_program *prog); |
---|
| 201 | +LIBBPF_API const char *bpf_program__section_name(const struct bpf_program *prog); |
---|
| 202 | +LIBBPF_API LIBBPF_DEPRECATED("BPF program title is confusing term; please use bpf_program__section_name() instead") |
---|
| 203 | +const char *bpf_program__title(const struct bpf_program *prog, bool needs_copy); |
---|
| 204 | +LIBBPF_API bool bpf_program__autoload(const struct bpf_program *prog); |
---|
| 205 | +LIBBPF_API int bpf_program__set_autoload(struct bpf_program *prog, bool autoload); |
---|
| 206 | + |
---|
| 207 | +/* returns program size in bytes */ |
---|
| 208 | +LIBBPF_API size_t bpf_program__size(const struct bpf_program *prog); |
---|
| 209 | + |
---|
| 210 | +LIBBPF_API int bpf_program__load(struct bpf_program *prog, char *license, |
---|
| 211 | + __u32 kern_version); |
---|
| 212 | +LIBBPF_API int bpf_program__fd(const struct bpf_program *prog); |
---|
| 213 | +LIBBPF_API int bpf_program__pin_instance(struct bpf_program *prog, |
---|
| 214 | + const char *path, |
---|
| 215 | + int instance); |
---|
| 216 | +LIBBPF_API int bpf_program__unpin_instance(struct bpf_program *prog, |
---|
| 217 | + const char *path, |
---|
| 218 | + int instance); |
---|
| 219 | +LIBBPF_API int bpf_program__pin(struct bpf_program *prog, const char *path); |
---|
| 220 | +LIBBPF_API int bpf_program__unpin(struct bpf_program *prog, const char *path); |
---|
| 221 | +LIBBPF_API void bpf_program__unload(struct bpf_program *prog); |
---|
| 222 | + |
---|
| 223 | +struct bpf_link; |
---|
| 224 | + |
---|
| 225 | +LIBBPF_API struct bpf_link *bpf_link__open(const char *path); |
---|
| 226 | +LIBBPF_API int bpf_link__fd(const struct bpf_link *link); |
---|
| 227 | +LIBBPF_API const char *bpf_link__pin_path(const struct bpf_link *link); |
---|
| 228 | +LIBBPF_API int bpf_link__pin(struct bpf_link *link, const char *path); |
---|
| 229 | +LIBBPF_API int bpf_link__unpin(struct bpf_link *link); |
---|
| 230 | +LIBBPF_API int bpf_link__update_program(struct bpf_link *link, |
---|
| 231 | + struct bpf_program *prog); |
---|
| 232 | +LIBBPF_API void bpf_link__disconnect(struct bpf_link *link); |
---|
| 233 | +LIBBPF_API int bpf_link__detach(struct bpf_link *link); |
---|
| 234 | +LIBBPF_API int bpf_link__destroy(struct bpf_link *link); |
---|
| 235 | + |
---|
| 236 | +LIBBPF_API struct bpf_link * |
---|
| 237 | +bpf_program__attach(struct bpf_program *prog); |
---|
| 238 | +LIBBPF_API struct bpf_link * |
---|
| 239 | +bpf_program__attach_perf_event(struct bpf_program *prog, int pfd); |
---|
| 240 | +LIBBPF_API struct bpf_link * |
---|
| 241 | +bpf_program__attach_kprobe(struct bpf_program *prog, bool retprobe, |
---|
| 242 | + const char *func_name); |
---|
| 243 | +LIBBPF_API struct bpf_link * |
---|
| 244 | +bpf_program__attach_uprobe(struct bpf_program *prog, bool retprobe, |
---|
| 245 | + pid_t pid, const char *binary_path, |
---|
| 246 | + size_t func_offset); |
---|
| 247 | +LIBBPF_API struct bpf_link * |
---|
| 248 | +bpf_program__attach_tracepoint(struct bpf_program *prog, |
---|
| 249 | + const char *tp_category, |
---|
| 250 | + const char *tp_name); |
---|
| 251 | +LIBBPF_API struct bpf_link * |
---|
| 252 | +bpf_program__attach_raw_tracepoint(struct bpf_program *prog, |
---|
| 253 | + const char *tp_name); |
---|
| 254 | +LIBBPF_API struct bpf_link * |
---|
| 255 | +bpf_program__attach_trace(struct bpf_program *prog); |
---|
| 256 | +LIBBPF_API struct bpf_link * |
---|
| 257 | +bpf_program__attach_lsm(struct bpf_program *prog); |
---|
| 258 | +LIBBPF_API struct bpf_link * |
---|
| 259 | +bpf_program__attach_cgroup(struct bpf_program *prog, int cgroup_fd); |
---|
| 260 | +LIBBPF_API struct bpf_link * |
---|
| 261 | +bpf_program__attach_netns(struct bpf_program *prog, int netns_fd); |
---|
| 262 | +LIBBPF_API struct bpf_link * |
---|
| 263 | +bpf_program__attach_xdp(struct bpf_program *prog, int ifindex); |
---|
| 264 | +LIBBPF_API struct bpf_link * |
---|
| 265 | +bpf_program__attach_freplace(struct bpf_program *prog, |
---|
| 266 | + int target_fd, const char *attach_func_name); |
---|
| 267 | + |
---|
| 268 | +struct bpf_map; |
---|
| 269 | + |
---|
| 270 | +LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(struct bpf_map *map); |
---|
| 271 | + |
---|
| 272 | +struct bpf_iter_attach_opts { |
---|
| 273 | + size_t sz; /* size of this struct for forward/backward compatibility */ |
---|
| 274 | + union bpf_iter_link_info *link_info; |
---|
| 275 | + __u32 link_info_len; |
---|
| 276 | +}; |
---|
| 277 | +#define bpf_iter_attach_opts__last_field link_info_len |
---|
| 278 | + |
---|
| 279 | +LIBBPF_API struct bpf_link * |
---|
| 280 | +bpf_program__attach_iter(struct bpf_program *prog, |
---|
| 281 | + const struct bpf_iter_attach_opts *opts); |
---|
132 | 282 | |
---|
133 | 283 | struct bpf_insn; |
---|
134 | 284 | |
---|
.. | .. |
---|
189 | 339 | struct bpf_insn *insns, int insns_cnt, |
---|
190 | 340 | struct bpf_prog_prep_result *res); |
---|
191 | 341 | |
---|
192 | | -int bpf_program__set_prep(struct bpf_program *prog, int nr_instance, |
---|
193 | | - bpf_program_prep_t prep); |
---|
| 342 | +LIBBPF_API int bpf_program__set_prep(struct bpf_program *prog, int nr_instance, |
---|
| 343 | + bpf_program_prep_t prep); |
---|
194 | 344 | |
---|
195 | | -int bpf_program__nth_fd(struct bpf_program *prog, int n); |
---|
| 345 | +LIBBPF_API int bpf_program__nth_fd(const struct bpf_program *prog, int n); |
---|
196 | 346 | |
---|
197 | 347 | /* |
---|
198 | 348 | * Adjust type of BPF program. Default is kprobe. |
---|
199 | 349 | */ |
---|
200 | | -int bpf_program__set_socket_filter(struct bpf_program *prog); |
---|
201 | | -int bpf_program__set_tracepoint(struct bpf_program *prog); |
---|
202 | | -int bpf_program__set_raw_tracepoint(struct bpf_program *prog); |
---|
203 | | -int bpf_program__set_kprobe(struct bpf_program *prog); |
---|
204 | | -int bpf_program__set_sched_cls(struct bpf_program *prog); |
---|
205 | | -int bpf_program__set_sched_act(struct bpf_program *prog); |
---|
206 | | -int bpf_program__set_xdp(struct bpf_program *prog); |
---|
207 | | -int bpf_program__set_perf_event(struct bpf_program *prog); |
---|
208 | | -void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type); |
---|
209 | | -void bpf_program__set_expected_attach_type(struct bpf_program *prog, |
---|
210 | | - enum bpf_attach_type type); |
---|
| 350 | +LIBBPF_API int bpf_program__set_socket_filter(struct bpf_program *prog); |
---|
| 351 | +LIBBPF_API int bpf_program__set_tracepoint(struct bpf_program *prog); |
---|
| 352 | +LIBBPF_API int bpf_program__set_raw_tracepoint(struct bpf_program *prog); |
---|
| 353 | +LIBBPF_API int bpf_program__set_kprobe(struct bpf_program *prog); |
---|
| 354 | +LIBBPF_API int bpf_program__set_lsm(struct bpf_program *prog); |
---|
| 355 | +LIBBPF_API int bpf_program__set_sched_cls(struct bpf_program *prog); |
---|
| 356 | +LIBBPF_API int bpf_program__set_sched_act(struct bpf_program *prog); |
---|
| 357 | +LIBBPF_API int bpf_program__set_xdp(struct bpf_program *prog); |
---|
| 358 | +LIBBPF_API int bpf_program__set_perf_event(struct bpf_program *prog); |
---|
| 359 | +LIBBPF_API int bpf_program__set_tracing(struct bpf_program *prog); |
---|
| 360 | +LIBBPF_API int bpf_program__set_struct_ops(struct bpf_program *prog); |
---|
| 361 | +LIBBPF_API int bpf_program__set_extension(struct bpf_program *prog); |
---|
| 362 | +LIBBPF_API int bpf_program__set_sk_lookup(struct bpf_program *prog); |
---|
211 | 363 | |
---|
212 | | -bool bpf_program__is_socket_filter(struct bpf_program *prog); |
---|
213 | | -bool bpf_program__is_tracepoint(struct bpf_program *prog); |
---|
214 | | -bool bpf_program__is_raw_tracepoint(struct bpf_program *prog); |
---|
215 | | -bool bpf_program__is_kprobe(struct bpf_program *prog); |
---|
216 | | -bool bpf_program__is_sched_cls(struct bpf_program *prog); |
---|
217 | | -bool bpf_program__is_sched_act(struct bpf_program *prog); |
---|
218 | | -bool bpf_program__is_xdp(struct bpf_program *prog); |
---|
219 | | -bool bpf_program__is_perf_event(struct bpf_program *prog); |
---|
| 364 | +LIBBPF_API enum bpf_prog_type bpf_program__get_type(struct bpf_program *prog); |
---|
| 365 | +LIBBPF_API void bpf_program__set_type(struct bpf_program *prog, |
---|
| 366 | + enum bpf_prog_type type); |
---|
| 367 | + |
---|
| 368 | +LIBBPF_API enum bpf_attach_type |
---|
| 369 | +bpf_program__get_expected_attach_type(struct bpf_program *prog); |
---|
| 370 | +LIBBPF_API void |
---|
| 371 | +bpf_program__set_expected_attach_type(struct bpf_program *prog, |
---|
| 372 | + enum bpf_attach_type type); |
---|
| 373 | + |
---|
| 374 | +LIBBPF_API int |
---|
| 375 | +bpf_program__set_attach_target(struct bpf_program *prog, int attach_prog_fd, |
---|
| 376 | + const char *attach_func_name); |
---|
| 377 | + |
---|
| 378 | +LIBBPF_API bool bpf_program__is_socket_filter(const struct bpf_program *prog); |
---|
| 379 | +LIBBPF_API bool bpf_program__is_tracepoint(const struct bpf_program *prog); |
---|
| 380 | +LIBBPF_API bool bpf_program__is_raw_tracepoint(const struct bpf_program *prog); |
---|
| 381 | +LIBBPF_API bool bpf_program__is_kprobe(const struct bpf_program *prog); |
---|
| 382 | +LIBBPF_API bool bpf_program__is_lsm(const struct bpf_program *prog); |
---|
| 383 | +LIBBPF_API bool bpf_program__is_sched_cls(const struct bpf_program *prog); |
---|
| 384 | +LIBBPF_API bool bpf_program__is_sched_act(const struct bpf_program *prog); |
---|
| 385 | +LIBBPF_API bool bpf_program__is_xdp(const struct bpf_program *prog); |
---|
| 386 | +LIBBPF_API bool bpf_program__is_perf_event(const struct bpf_program *prog); |
---|
| 387 | +LIBBPF_API bool bpf_program__is_tracing(const struct bpf_program *prog); |
---|
| 388 | +LIBBPF_API bool bpf_program__is_struct_ops(const struct bpf_program *prog); |
---|
| 389 | +LIBBPF_API bool bpf_program__is_extension(const struct bpf_program *prog); |
---|
| 390 | +LIBBPF_API bool bpf_program__is_sk_lookup(const struct bpf_program *prog); |
---|
220 | 391 | |
---|
221 | 392 | /* |
---|
222 | 393 | * No need for __attribute__((packed)), all members of 'bpf_map_def' |
---|
.. | .. |
---|
236 | 407 | * The 'struct bpf_map' in include/linux/bpf.h is internal to the kernel, |
---|
237 | 408 | * so no need to worry about a name clash. |
---|
238 | 409 | */ |
---|
239 | | -struct bpf_map; |
---|
240 | | -struct bpf_map * |
---|
241 | | -bpf_object__find_map_by_name(struct bpf_object *obj, const char *name); |
---|
| 410 | +LIBBPF_API struct bpf_map * |
---|
| 411 | +bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name); |
---|
| 412 | + |
---|
| 413 | +LIBBPF_API int |
---|
| 414 | +bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name); |
---|
242 | 415 | |
---|
243 | 416 | /* |
---|
244 | 417 | * Get bpf_map through the offset of corresponding struct bpf_map_def |
---|
245 | 418 | * in the BPF object file. |
---|
246 | 419 | */ |
---|
247 | | -struct bpf_map * |
---|
| 420 | +LIBBPF_API struct bpf_map * |
---|
248 | 421 | bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset); |
---|
249 | 422 | |
---|
250 | | -struct bpf_map * |
---|
251 | | -bpf_map__next(struct bpf_map *map, struct bpf_object *obj); |
---|
252 | | -#define bpf_map__for_each(pos, obj) \ |
---|
| 423 | +LIBBPF_API struct bpf_map * |
---|
| 424 | +bpf_map__next(const struct bpf_map *map, const struct bpf_object *obj); |
---|
| 425 | +#define bpf_object__for_each_map(pos, obj) \ |
---|
253 | 426 | for ((pos) = bpf_map__next(NULL, (obj)); \ |
---|
254 | 427 | (pos) != NULL; \ |
---|
255 | 428 | (pos) = bpf_map__next((pos), (obj))) |
---|
| 429 | +#define bpf_map__for_each bpf_object__for_each_map |
---|
256 | 430 | |
---|
257 | | -int bpf_map__fd(struct bpf_map *map); |
---|
258 | | -const struct bpf_map_def *bpf_map__def(struct bpf_map *map); |
---|
259 | | -const char *bpf_map__name(struct bpf_map *map); |
---|
260 | | -__u32 bpf_map__btf_key_type_id(const struct bpf_map *map); |
---|
261 | | -__u32 bpf_map__btf_value_type_id(const struct bpf_map *map); |
---|
| 431 | +LIBBPF_API struct bpf_map * |
---|
| 432 | +bpf_map__prev(const struct bpf_map *map, const struct bpf_object *obj); |
---|
| 433 | + |
---|
| 434 | +/* get/set map FD */ |
---|
| 435 | +LIBBPF_API int bpf_map__fd(const struct bpf_map *map); |
---|
| 436 | +LIBBPF_API int bpf_map__reuse_fd(struct bpf_map *map, int fd); |
---|
| 437 | +/* get map definition */ |
---|
| 438 | +LIBBPF_API const struct bpf_map_def *bpf_map__def(const struct bpf_map *map); |
---|
| 439 | +/* get map name */ |
---|
| 440 | +LIBBPF_API const char *bpf_map__name(const struct bpf_map *map); |
---|
| 441 | +/* get/set map type */ |
---|
| 442 | +LIBBPF_API enum bpf_map_type bpf_map__type(const struct bpf_map *map); |
---|
| 443 | +LIBBPF_API int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type); |
---|
| 444 | +/* get/set map size (max_entries) */ |
---|
| 445 | +LIBBPF_API __u32 bpf_map__max_entries(const struct bpf_map *map); |
---|
| 446 | +LIBBPF_API int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries); |
---|
| 447 | +LIBBPF_API int bpf_map__resize(struct bpf_map *map, __u32 max_entries); |
---|
| 448 | +/* get/set map flags */ |
---|
| 449 | +LIBBPF_API __u32 bpf_map__map_flags(const struct bpf_map *map); |
---|
| 450 | +LIBBPF_API int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags); |
---|
| 451 | +/* get/set map NUMA node */ |
---|
| 452 | +LIBBPF_API __u32 bpf_map__numa_node(const struct bpf_map *map); |
---|
| 453 | +LIBBPF_API int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node); |
---|
| 454 | +/* get/set map key size */ |
---|
| 455 | +LIBBPF_API __u32 bpf_map__key_size(const struct bpf_map *map); |
---|
| 456 | +LIBBPF_API int bpf_map__set_key_size(struct bpf_map *map, __u32 size); |
---|
| 457 | +/* get/set map value size */ |
---|
| 458 | +LIBBPF_API __u32 bpf_map__value_size(const struct bpf_map *map); |
---|
| 459 | +LIBBPF_API int bpf_map__set_value_size(struct bpf_map *map, __u32 size); |
---|
| 460 | +/* get map key/value BTF type IDs */ |
---|
| 461 | +LIBBPF_API __u32 bpf_map__btf_key_type_id(const struct bpf_map *map); |
---|
| 462 | +LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map); |
---|
| 463 | +/* get/set map if_index */ |
---|
| 464 | +LIBBPF_API __u32 bpf_map__ifindex(const struct bpf_map *map); |
---|
| 465 | +LIBBPF_API int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex); |
---|
262 | 466 | |
---|
263 | 467 | typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *); |
---|
264 | | -int bpf_map__set_priv(struct bpf_map *map, void *priv, |
---|
265 | | - bpf_map_clear_priv_t clear_priv); |
---|
266 | | -void *bpf_map__priv(struct bpf_map *map); |
---|
267 | | -int bpf_map__reuse_fd(struct bpf_map *map, int fd); |
---|
268 | | -bool bpf_map__is_offload_neutral(struct bpf_map *map); |
---|
269 | | -void bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex); |
---|
270 | | -int bpf_map__pin(struct bpf_map *map, const char *path); |
---|
| 468 | +LIBBPF_API int bpf_map__set_priv(struct bpf_map *map, void *priv, |
---|
| 469 | + bpf_map_clear_priv_t clear_priv); |
---|
| 470 | +LIBBPF_API void *bpf_map__priv(const struct bpf_map *map); |
---|
| 471 | +LIBBPF_API int bpf_map__set_initial_value(struct bpf_map *map, |
---|
| 472 | + const void *data, size_t size); |
---|
| 473 | +LIBBPF_API bool bpf_map__is_offload_neutral(const struct bpf_map *map); |
---|
| 474 | +LIBBPF_API bool bpf_map__is_internal(const struct bpf_map *map); |
---|
| 475 | +LIBBPF_API int bpf_map__set_pin_path(struct bpf_map *map, const char *path); |
---|
| 476 | +LIBBPF_API const char *bpf_map__get_pin_path(const struct bpf_map *map); |
---|
| 477 | +LIBBPF_API bool bpf_map__is_pinned(const struct bpf_map *map); |
---|
| 478 | +LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path); |
---|
| 479 | +LIBBPF_API int bpf_map__unpin(struct bpf_map *map, const char *path); |
---|
271 | 480 | |
---|
272 | | -long libbpf_get_error(const void *ptr); |
---|
| 481 | +LIBBPF_API int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd); |
---|
| 482 | + |
---|
| 483 | +LIBBPF_API long libbpf_get_error(const void *ptr); |
---|
273 | 484 | |
---|
274 | 485 | struct bpf_prog_load_attr { |
---|
275 | 486 | const char *file; |
---|
276 | 487 | enum bpf_prog_type prog_type; |
---|
277 | 488 | enum bpf_attach_type expected_attach_type; |
---|
278 | 489 | int ifindex; |
---|
| 490 | + int log_level; |
---|
| 491 | + int prog_flags; |
---|
279 | 492 | }; |
---|
280 | 493 | |
---|
281 | | -int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, |
---|
282 | | - struct bpf_object **pobj, int *prog_fd); |
---|
283 | | -int bpf_prog_load(const char *file, enum bpf_prog_type type, |
---|
284 | | - struct bpf_object **pobj, int *prog_fd); |
---|
| 494 | +LIBBPF_API int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, |
---|
| 495 | + struct bpf_object **pobj, int *prog_fd); |
---|
| 496 | +LIBBPF_API int bpf_prog_load(const char *file, enum bpf_prog_type type, |
---|
| 497 | + struct bpf_object **pobj, int *prog_fd); |
---|
285 | 498 | |
---|
286 | | -int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags); |
---|
| 499 | +struct xdp_link_info { |
---|
| 500 | + __u32 prog_id; |
---|
| 501 | + __u32 drv_prog_id; |
---|
| 502 | + __u32 hw_prog_id; |
---|
| 503 | + __u32 skb_prog_id; |
---|
| 504 | + __u8 attach_mode; |
---|
| 505 | +}; |
---|
| 506 | + |
---|
| 507 | +struct bpf_xdp_set_link_opts { |
---|
| 508 | + size_t sz; |
---|
| 509 | + int old_fd; |
---|
| 510 | + size_t :0; |
---|
| 511 | +}; |
---|
| 512 | +#define bpf_xdp_set_link_opts__last_field old_fd |
---|
| 513 | + |
---|
| 514 | +LIBBPF_API int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags); |
---|
| 515 | +LIBBPF_API int bpf_set_link_xdp_fd_opts(int ifindex, int fd, __u32 flags, |
---|
| 516 | + const struct bpf_xdp_set_link_opts *opts); |
---|
| 517 | +LIBBPF_API int bpf_get_link_xdp_id(int ifindex, __u32 *prog_id, __u32 flags); |
---|
| 518 | +LIBBPF_API int bpf_get_link_xdp_info(int ifindex, struct xdp_link_info *info, |
---|
| 519 | + size_t info_size, __u32 flags); |
---|
| 520 | + |
---|
| 521 | +/* Ring buffer APIs */ |
---|
| 522 | +struct ring_buffer; |
---|
| 523 | + |
---|
| 524 | +typedef int (*ring_buffer_sample_fn)(void *ctx, void *data, size_t size); |
---|
| 525 | + |
---|
| 526 | +struct ring_buffer_opts { |
---|
| 527 | + size_t sz; /* size of this struct, for forward/backward compatiblity */ |
---|
| 528 | +}; |
---|
| 529 | + |
---|
| 530 | +#define ring_buffer_opts__last_field sz |
---|
| 531 | + |
---|
| 532 | +LIBBPF_API struct ring_buffer * |
---|
| 533 | +ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx, |
---|
| 534 | + const struct ring_buffer_opts *opts); |
---|
| 535 | +LIBBPF_API void ring_buffer__free(struct ring_buffer *rb); |
---|
| 536 | +LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd, |
---|
| 537 | + ring_buffer_sample_fn sample_cb, void *ctx); |
---|
| 538 | +LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms); |
---|
| 539 | +LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb); |
---|
| 540 | + |
---|
| 541 | +/* Perf buffer APIs */ |
---|
| 542 | +struct perf_buffer; |
---|
| 543 | + |
---|
| 544 | +typedef void (*perf_buffer_sample_fn)(void *ctx, int cpu, |
---|
| 545 | + void *data, __u32 size); |
---|
| 546 | +typedef void (*perf_buffer_lost_fn)(void *ctx, int cpu, __u64 cnt); |
---|
| 547 | + |
---|
| 548 | +/* common use perf buffer options */ |
---|
| 549 | +struct perf_buffer_opts { |
---|
| 550 | + /* if specified, sample_cb is called for each sample */ |
---|
| 551 | + perf_buffer_sample_fn sample_cb; |
---|
| 552 | + /* if specified, lost_cb is called for each batch of lost samples */ |
---|
| 553 | + perf_buffer_lost_fn lost_cb; |
---|
| 554 | + /* ctx is provided to sample_cb and lost_cb */ |
---|
| 555 | + void *ctx; |
---|
| 556 | +}; |
---|
| 557 | + |
---|
| 558 | +LIBBPF_API struct perf_buffer * |
---|
| 559 | +perf_buffer__new(int map_fd, size_t page_cnt, |
---|
| 560 | + const struct perf_buffer_opts *opts); |
---|
287 | 561 | |
---|
288 | 562 | enum bpf_perf_event_ret { |
---|
289 | 563 | LIBBPF_PERF_EVENT_DONE = 0, |
---|
.. | .. |
---|
291 | 565 | LIBBPF_PERF_EVENT_CONT = -2, |
---|
292 | 566 | }; |
---|
293 | 567 | |
---|
294 | | -typedef enum bpf_perf_event_ret (*bpf_perf_event_print_t)(void *event, |
---|
295 | | - void *priv); |
---|
296 | | -int bpf_perf_event_read_simple(void *mem, unsigned long size, |
---|
297 | | - unsigned long page_size, |
---|
298 | | - void **buf, size_t *buf_len, |
---|
299 | | - bpf_perf_event_print_t fn, void *priv); |
---|
| 568 | +struct perf_event_header; |
---|
| 569 | + |
---|
| 570 | +typedef enum bpf_perf_event_ret |
---|
| 571 | +(*perf_buffer_event_fn)(void *ctx, int cpu, struct perf_event_header *event); |
---|
| 572 | + |
---|
| 573 | +/* raw perf buffer options, giving most power and control */ |
---|
| 574 | +struct perf_buffer_raw_opts { |
---|
| 575 | + /* perf event attrs passed directly into perf_event_open() */ |
---|
| 576 | + struct perf_event_attr *attr; |
---|
| 577 | + /* raw event callback */ |
---|
| 578 | + perf_buffer_event_fn event_cb; |
---|
| 579 | + /* ctx is provided to event_cb */ |
---|
| 580 | + void *ctx; |
---|
| 581 | + /* if cpu_cnt == 0, open all on all possible CPUs (up to the number of |
---|
| 582 | + * max_entries of given PERF_EVENT_ARRAY map) |
---|
| 583 | + */ |
---|
| 584 | + int cpu_cnt; |
---|
| 585 | + /* if cpu_cnt > 0, cpus is an array of CPUs to open ring buffers on */ |
---|
| 586 | + int *cpus; |
---|
| 587 | + /* if cpu_cnt > 0, map_keys specify map keys to set per-CPU FDs for */ |
---|
| 588 | + int *map_keys; |
---|
| 589 | +}; |
---|
| 590 | + |
---|
| 591 | +LIBBPF_API struct perf_buffer * |
---|
| 592 | +perf_buffer__new_raw(int map_fd, size_t page_cnt, |
---|
| 593 | + const struct perf_buffer_raw_opts *opts); |
---|
| 594 | + |
---|
| 595 | +LIBBPF_API void perf_buffer__free(struct perf_buffer *pb); |
---|
| 596 | +LIBBPF_API int perf_buffer__epoll_fd(const struct perf_buffer *pb); |
---|
| 597 | +LIBBPF_API int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms); |
---|
| 598 | +LIBBPF_API int perf_buffer__consume(struct perf_buffer *pb); |
---|
| 599 | +LIBBPF_API int perf_buffer__consume_buffer(struct perf_buffer *pb, size_t buf_idx); |
---|
| 600 | +LIBBPF_API size_t perf_buffer__buffer_cnt(const struct perf_buffer *pb); |
---|
| 601 | +LIBBPF_API int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_idx); |
---|
| 602 | + |
---|
| 603 | +typedef enum bpf_perf_event_ret |
---|
| 604 | + (*bpf_perf_event_print_t)(struct perf_event_header *hdr, |
---|
| 605 | + void *private_data); |
---|
| 606 | +LIBBPF_API enum bpf_perf_event_ret |
---|
| 607 | +bpf_perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size, |
---|
| 608 | + void **copy_mem, size_t *copy_size, |
---|
| 609 | + bpf_perf_event_print_t fn, void *private_data); |
---|
| 610 | + |
---|
| 611 | +struct bpf_prog_linfo; |
---|
| 612 | +struct bpf_prog_info; |
---|
| 613 | + |
---|
| 614 | +LIBBPF_API void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo); |
---|
| 615 | +LIBBPF_API struct bpf_prog_linfo * |
---|
| 616 | +bpf_prog_linfo__new(const struct bpf_prog_info *info); |
---|
| 617 | +LIBBPF_API const struct bpf_line_info * |
---|
| 618 | +bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo, |
---|
| 619 | + __u64 addr, __u32 func_idx, __u32 nr_skip); |
---|
| 620 | +LIBBPF_API const struct bpf_line_info * |
---|
| 621 | +bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo, |
---|
| 622 | + __u32 insn_off, __u32 nr_skip); |
---|
| 623 | + |
---|
| 624 | +/* |
---|
| 625 | + * Probe for supported system features |
---|
| 626 | + * |
---|
| 627 | + * Note that running many of these probes in a short amount of time can cause |
---|
| 628 | + * the kernel to reach the maximal size of lockable memory allowed for the |
---|
| 629 | + * user, causing subsequent probes to fail. In this case, the caller may want |
---|
| 630 | + * to adjust that limit with setrlimit(). |
---|
| 631 | + */ |
---|
| 632 | +LIBBPF_API bool bpf_probe_prog_type(enum bpf_prog_type prog_type, |
---|
| 633 | + __u32 ifindex); |
---|
| 634 | +LIBBPF_API bool bpf_probe_map_type(enum bpf_map_type map_type, __u32 ifindex); |
---|
| 635 | +LIBBPF_API bool bpf_probe_helper(enum bpf_func_id id, |
---|
| 636 | + enum bpf_prog_type prog_type, __u32 ifindex); |
---|
| 637 | +LIBBPF_API bool bpf_probe_large_insn_limit(__u32 ifindex); |
---|
| 638 | + |
---|
| 639 | +/* |
---|
| 640 | + * Get bpf_prog_info in continuous memory |
---|
| 641 | + * |
---|
| 642 | + * struct bpf_prog_info has multiple arrays. The user has option to choose |
---|
| 643 | + * arrays to fetch from kernel. The following APIs provide an uniform way to |
---|
| 644 | + * fetch these data. All arrays in bpf_prog_info are stored in a single |
---|
| 645 | + * continuous memory region. This makes it easy to store the info in a |
---|
| 646 | + * file. |
---|
| 647 | + * |
---|
| 648 | + * Before writing bpf_prog_info_linear to files, it is necessary to |
---|
| 649 | + * translate pointers in bpf_prog_info to offsets. Helper functions |
---|
| 650 | + * bpf_program__bpil_addr_to_offs() and bpf_program__bpil_offs_to_addr() |
---|
| 651 | + * are introduced to switch between pointers and offsets. |
---|
| 652 | + * |
---|
| 653 | + * Examples: |
---|
| 654 | + * # To fetch map_ids and prog_tags: |
---|
| 655 | + * __u64 arrays = (1UL << BPF_PROG_INFO_MAP_IDS) | |
---|
| 656 | + * (1UL << BPF_PROG_INFO_PROG_TAGS); |
---|
| 657 | + * struct bpf_prog_info_linear *info_linear = |
---|
| 658 | + * bpf_program__get_prog_info_linear(fd, arrays); |
---|
| 659 | + * |
---|
| 660 | + * # To save data in file |
---|
| 661 | + * bpf_program__bpil_addr_to_offs(info_linear); |
---|
| 662 | + * write(f, info_linear, sizeof(*info_linear) + info_linear->data_len); |
---|
| 663 | + * |
---|
| 664 | + * # To read data from file |
---|
| 665 | + * read(f, info_linear, <proper_size>); |
---|
| 666 | + * bpf_program__bpil_offs_to_addr(info_linear); |
---|
| 667 | + */ |
---|
| 668 | +enum bpf_prog_info_array { |
---|
| 669 | + BPF_PROG_INFO_FIRST_ARRAY = 0, |
---|
| 670 | + BPF_PROG_INFO_JITED_INSNS = 0, |
---|
| 671 | + BPF_PROG_INFO_XLATED_INSNS, |
---|
| 672 | + BPF_PROG_INFO_MAP_IDS, |
---|
| 673 | + BPF_PROG_INFO_JITED_KSYMS, |
---|
| 674 | + BPF_PROG_INFO_JITED_FUNC_LENS, |
---|
| 675 | + BPF_PROG_INFO_FUNC_INFO, |
---|
| 676 | + BPF_PROG_INFO_LINE_INFO, |
---|
| 677 | + BPF_PROG_INFO_JITED_LINE_INFO, |
---|
| 678 | + BPF_PROG_INFO_PROG_TAGS, |
---|
| 679 | + BPF_PROG_INFO_LAST_ARRAY, |
---|
| 680 | +}; |
---|
| 681 | + |
---|
| 682 | +struct bpf_prog_info_linear { |
---|
| 683 | + /* size of struct bpf_prog_info, when the tool is compiled */ |
---|
| 684 | + __u32 info_len; |
---|
| 685 | + /* total bytes allocated for data, round up to 8 bytes */ |
---|
| 686 | + __u32 data_len; |
---|
| 687 | + /* which arrays are included in data */ |
---|
| 688 | + __u64 arrays; |
---|
| 689 | + struct bpf_prog_info info; |
---|
| 690 | + __u8 data[]; |
---|
| 691 | +}; |
---|
| 692 | + |
---|
| 693 | +LIBBPF_API struct bpf_prog_info_linear * |
---|
| 694 | +bpf_program__get_prog_info_linear(int fd, __u64 arrays); |
---|
| 695 | + |
---|
| 696 | +LIBBPF_API void |
---|
| 697 | +bpf_program__bpil_addr_to_offs(struct bpf_prog_info_linear *info_linear); |
---|
| 698 | + |
---|
| 699 | +LIBBPF_API void |
---|
| 700 | +bpf_program__bpil_offs_to_addr(struct bpf_prog_info_linear *info_linear); |
---|
| 701 | + |
---|
| 702 | +/* |
---|
| 703 | + * A helper function to get the number of possible CPUs before looking up |
---|
| 704 | + * per-CPU maps. Negative errno is returned on failure. |
---|
| 705 | + * |
---|
| 706 | + * Example usage: |
---|
| 707 | + * |
---|
| 708 | + * int ncpus = libbpf_num_possible_cpus(); |
---|
| 709 | + * if (ncpus < 0) { |
---|
| 710 | + * // error handling |
---|
| 711 | + * } |
---|
| 712 | + * long values[ncpus]; |
---|
| 713 | + * bpf_map_lookup_elem(per_cpu_map_fd, key, values); |
---|
| 714 | + * |
---|
| 715 | + */ |
---|
| 716 | +LIBBPF_API int libbpf_num_possible_cpus(void); |
---|
| 717 | + |
---|
| 718 | +struct bpf_map_skeleton { |
---|
| 719 | + const char *name; |
---|
| 720 | + struct bpf_map **map; |
---|
| 721 | + void **mmaped; |
---|
| 722 | +}; |
---|
| 723 | + |
---|
| 724 | +struct bpf_prog_skeleton { |
---|
| 725 | + const char *name; |
---|
| 726 | + struct bpf_program **prog; |
---|
| 727 | + struct bpf_link **link; |
---|
| 728 | +}; |
---|
| 729 | + |
---|
| 730 | +struct bpf_object_skeleton { |
---|
| 731 | + size_t sz; /* size of this struct, for forward/backward compatibility */ |
---|
| 732 | + |
---|
| 733 | + const char *name; |
---|
| 734 | + void *data; |
---|
| 735 | + size_t data_sz; |
---|
| 736 | + |
---|
| 737 | + struct bpf_object **obj; |
---|
| 738 | + |
---|
| 739 | + int map_cnt; |
---|
| 740 | + int map_skel_sz; /* sizeof(struct bpf_skeleton_map) */ |
---|
| 741 | + struct bpf_map_skeleton *maps; |
---|
| 742 | + |
---|
| 743 | + int prog_cnt; |
---|
| 744 | + int prog_skel_sz; /* sizeof(struct bpf_skeleton_prog) */ |
---|
| 745 | + struct bpf_prog_skeleton *progs; |
---|
| 746 | +}; |
---|
| 747 | + |
---|
| 748 | +LIBBPF_API int |
---|
| 749 | +bpf_object__open_skeleton(struct bpf_object_skeleton *s, |
---|
| 750 | + const struct bpf_object_open_opts *opts); |
---|
| 751 | +LIBBPF_API int bpf_object__load_skeleton(struct bpf_object_skeleton *s); |
---|
| 752 | +LIBBPF_API int bpf_object__attach_skeleton(struct bpf_object_skeleton *s); |
---|
| 753 | +LIBBPF_API void bpf_object__detach_skeleton(struct bpf_object_skeleton *s); |
---|
| 754 | +LIBBPF_API void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s); |
---|
| 755 | + |
---|
| 756 | +enum libbpf_tristate { |
---|
| 757 | + TRI_NO = 0, |
---|
| 758 | + TRI_YES = 1, |
---|
| 759 | + TRI_MODULE = 2, |
---|
| 760 | +}; |
---|
| 761 | + |
---|
| 762 | +#ifdef __cplusplus |
---|
| 763 | +} /* extern "C" */ |
---|
300 | 764 | #endif |
---|
| 765 | + |
---|
| 766 | +#endif /* __LIBBPF_LIBBPF_H */ |
---|