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