| .. | .. |
|---|
| 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 */ |
|---|