hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/tools/lib/bpf/libbpf.h
....@@ -1,4 +1,4 @@
1
-/* SPDX-License-Identifier: LGPL-2.1 */
1
+/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
22
33 /*
44 * Common eBPF ELF object loading operations.
....@@ -6,28 +6,22 @@
66 * Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org>
77 * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
88 * 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>
229 */
23
-#ifndef __BPF_LIBBPF_H
24
-#define __BPF_LIBBPF_H
10
+#ifndef __LIBBPF_LIBBPF_H
11
+#define __LIBBPF_LIBBPF_H
2512
13
+#include <stdarg.h>
2614 #include <stdio.h>
2715 #include <stdint.h>
2816 #include <stdbool.h>
2917 #include <sys/types.h> // for size_t
3018 #include <linux/bpf.h>
19
+
20
+#include "libbpf_common.h"
21
+
22
+#ifdef __cplusplus
23
+extern "C" {
24
+#endif
3125
3226 enum libbpf_errno {
3327 __LIBBPF_ERRNO__START = 4000,
....@@ -46,22 +40,22 @@
4640 LIBBPF_ERRNO__PROGTYPE, /* Kernel doesn't support this program type */
4741 LIBBPF_ERRNO__WRNGPID, /* Wrong pid in netlink message */
4842 LIBBPF_ERRNO__INVSEQ, /* Invalid netlink sequence */
43
+ LIBBPF_ERRNO__NLPARSE, /* netlink parsing error */
4944 __LIBBPF_ERRNO__END,
5045 };
5146
52
-int libbpf_strerror(int err, char *buf, size_t size);
47
+LIBBPF_API int libbpf_strerror(int err, char *buf, size_t size);
5348
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
+};
6154
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);
6559
6660 /* Hide internal to user */
6761 struct bpf_object;
....@@ -71,25 +65,97 @@
7165 enum bpf_prog_type prog_type;
7266 };
7367
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
+};
81138
82139 /* 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);
88143
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);
91146
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);
93159 #define bpf_object__for_each_safe(pos, tmp) \
94160 for ((pos) = bpf_object__next(NULL), \
95161 (tmp) = bpf_object__next(pos); \
....@@ -97,38 +163,122 @@
97163 (pos) = (tmp), (tmp) = bpf_object__next(tmp))
98164
99165 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);
103169
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);
106177
107178 /* Accessors of bpf_program */
108179 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);
111182
112183 #define bpf_object__for_each_program(pos, obj) \
113184 for ((pos) = bpf_program__next(NULL, (obj)); \
114185 (pos) != NULL; \
115186 (pos) = bpf_program__next((pos), (obj)))
116187
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);
119190
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 *);
122192
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);
125195
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);
127199
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);
132282
133283 struct bpf_insn;
134284
....@@ -189,34 +339,55 @@
189339 struct bpf_insn *insns, int insns_cnt,
190340 struct bpf_prog_prep_result *res);
191341
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);
194344
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);
196346
197347 /*
198348 * Adjust type of BPF program. Default is kprobe.
199349 */
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);
211363
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);
220391
221392 /*
222393 * No need for __attribute__((packed)), all members of 'bpf_map_def'
....@@ -236,54 +407,157 @@
236407 * The 'struct bpf_map' in include/linux/bpf.h is internal to the kernel,
237408 * so no need to worry about a name clash.
238409 */
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);
242415
243416 /*
244417 * Get bpf_map through the offset of corresponding struct bpf_map_def
245418 * in the BPF object file.
246419 */
247
-struct bpf_map *
420
+LIBBPF_API struct bpf_map *
248421 bpf_object__find_map_by_offset(struct bpf_object *obj, size_t offset);
249422
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) \
253426 for ((pos) = bpf_map__next(NULL, (obj)); \
254427 (pos) != NULL; \
255428 (pos) = bpf_map__next((pos), (obj)))
429
+#define bpf_map__for_each bpf_object__for_each_map
256430
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);
262466
263467 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);
271480
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);
273484
274485 struct bpf_prog_load_attr {
275486 const char *file;
276487 enum bpf_prog_type prog_type;
277488 enum bpf_attach_type expected_attach_type;
278489 int ifindex;
490
+ int log_level;
491
+ int prog_flags;
279492 };
280493
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);
285498
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);
287561
288562 enum bpf_perf_event_ret {
289563 LIBBPF_PERF_EVENT_DONE = 0,
....@@ -291,10 +565,202 @@
291565 LIBBPF_PERF_EVENT_CONT = -2,
292566 };
293567
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" */
300764 #endif
765
+
766
+#endif /* __LIBBPF_LIBBPF_H */