linux/tools/lib/bpf/libbpf.h
<<
>>
Prefs
   1/*
   2 * Common eBPF ELF object loading operations.
   3 *
   4 * Copyright (C) 2013-2015 Alexei Starovoitov <ast@kernel.org>
   5 * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
   6 * Copyright (C) 2015 Huawei Inc.
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU Lesser General Public
  10 * License as published by the Free Software Foundation;
  11 * version 2.1 of the License (not later!)
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU Lesser General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU Lesser General Public
  19 * License along with this program; if not,  see <http://www.gnu.org/licenses>
  20 */
  21#ifndef __BPF_LIBBPF_H
  22#define __BPF_LIBBPF_H
  23
  24#include <stdio.h>
  25#include <stdbool.h>
  26#include <linux/err.h>
  27
  28enum libbpf_errno {
  29        __LIBBPF_ERRNO__START = 4000,
  30
  31        /* Something wrong in libelf */
  32        LIBBPF_ERRNO__LIBELF = __LIBBPF_ERRNO__START,
  33        LIBBPF_ERRNO__FORMAT,   /* BPF object format invalid */
  34        LIBBPF_ERRNO__KVERSION, /* Incorrect or no 'version' section */
  35        LIBBPF_ERRNO__ENDIAN,   /* Endian mismatch */
  36        LIBBPF_ERRNO__INTERNAL, /* Internal error in libbpf */
  37        LIBBPF_ERRNO__RELOC,    /* Relocation failed */
  38        LIBBPF_ERRNO__LOAD,     /* Load program failure for unknown reason */
  39        LIBBPF_ERRNO__VERIFY,   /* Kernel verifier blocks program loading */
  40        LIBBPF_ERRNO__PROG2BIG, /* Program too big */
  41        LIBBPF_ERRNO__KVER,     /* Incorrect kernel version */
  42        LIBBPF_ERRNO__PROGTYPE, /* Kernel doesn't support this program type */
  43        __LIBBPF_ERRNO__END,
  44};
  45
  46int libbpf_strerror(int err, char *buf, size_t size);
  47
  48/*
  49 * In include/linux/compiler-gcc.h, __printf is defined. However
  50 * it should be better if libbpf.h doesn't depend on Linux header file.
  51 * So instead of __printf, here we use gcc attribute directly.
  52 */
  53typedef int (*libbpf_print_fn_t)(const char *, ...)
  54        __attribute__((format(printf, 1, 2)));
  55
  56void libbpf_set_print(libbpf_print_fn_t warn,
  57                      libbpf_print_fn_t info,
  58                      libbpf_print_fn_t debug);
  59
  60/* Hide internal to user */
  61struct bpf_object;
  62
  63struct bpf_object *bpf_object__open(const char *path);
  64struct bpf_object *bpf_object__open_buffer(void *obj_buf,
  65                                           size_t obj_buf_sz,
  66                                           const char *name);
  67void bpf_object__close(struct bpf_object *object);
  68
  69/* Load/unload object into/from kernel */
  70int bpf_object__load(struct bpf_object *obj);
  71int bpf_object__unload(struct bpf_object *obj);
  72const char *bpf_object__name(struct bpf_object *obj);
  73unsigned int bpf_object__kversion(struct bpf_object *obj);
  74
  75struct bpf_object *bpf_object__next(struct bpf_object *prev);
  76#define bpf_object__for_each_safe(pos, tmp)                     \
  77        for ((pos) = bpf_object__next(NULL),            \
  78                (tmp) = bpf_object__next(pos);          \
  79             (pos) != NULL;                             \
  80             (pos) = (tmp), (tmp) = bpf_object__next(tmp))
  81
  82/* Accessors of bpf_program. */
  83struct bpf_program;
  84struct bpf_program *bpf_program__next(struct bpf_program *prog,
  85                                      struct bpf_object *obj);
  86
  87#define bpf_object__for_each_program(pos, obj)          \
  88        for ((pos) = bpf_program__next(NULL, (obj));    \
  89             (pos) != NULL;                             \
  90             (pos) = bpf_program__next((pos), (obj)))
  91
  92typedef void (*bpf_program_clear_priv_t)(struct bpf_program *,
  93                                         void *);
  94
  95int bpf_program__set_priv(struct bpf_program *prog, void *priv,
  96                          bpf_program_clear_priv_t clear_priv);
  97
  98void *bpf_program__priv(struct bpf_program *prog);
  99
 100const char *bpf_program__title(struct bpf_program *prog, bool needs_copy);
 101
 102int bpf_program__fd(struct bpf_program *prog);
 103
 104struct bpf_insn;
 105
 106/*
 107 * Libbpf allows callers to adjust BPF programs before being loaded
 108 * into kernel. One program in an object file can be transform into
 109 * multiple variants to be attached to different code.
 110 *
 111 * bpf_program_prep_t, bpf_program__set_prep and bpf_program__nth_fd
 112 * are APIs for this propose.
 113 *
 114 * - bpf_program_prep_t:
 115 *   It defines 'preprocessor', which is a caller defined function
 116 *   passed to libbpf through bpf_program__set_prep(), and will be
 117 *   called before program is loaded. The processor should adjust
 118 *   the program one time for each instances according to the number
 119 *   passed to it.
 120 *
 121 * - bpf_program__set_prep:
 122 *   Attachs a preprocessor to a BPF program. The number of instances
 123 *   whould be created is also passed through this function.
 124 *
 125 * - bpf_program__nth_fd:
 126 *   After the program is loaded, get resuling fds from bpf program for
 127 *   each instances.
 128 *
 129 * If bpf_program__set_prep() is not used, the program whould be loaded
 130 * without adjustment during bpf_object__load(). The program has only
 131 * one instance. In this case bpf_program__fd(prog) is equal to
 132 * bpf_program__nth_fd(prog, 0).
 133 */
 134
 135struct bpf_prog_prep_result {
 136        /*
 137         * If not NULL, load new instruction array.
 138         * If set to NULL, don't load this instance.
 139         */
 140        struct bpf_insn *new_insn_ptr;
 141        int new_insn_cnt;
 142
 143        /* If not NULL, result fd is set to it */
 144        int *pfd;
 145};
 146
 147/*
 148 * Parameters of bpf_program_prep_t:
 149 *  - prog:     The bpf_program being loaded.
 150 *  - n:        Index of instance being generated.
 151 *  - insns:    BPF instructions array.
 152 *  - insns_cnt:Number of instructions in insns.
 153 *  - res:      Output parameter, result of transformation.
 154 *
 155 * Return value:
 156 *  - Zero: pre-processing success.
 157 *  - Non-zero: pre-processing, stop loading.
 158 */
 159typedef int (*bpf_program_prep_t)(struct bpf_program *prog, int n,
 160                                  struct bpf_insn *insns, int insns_cnt,
 161                                  struct bpf_prog_prep_result *res);
 162
 163int bpf_program__set_prep(struct bpf_program *prog, int nr_instance,
 164                          bpf_program_prep_t prep);
 165
 166int bpf_program__nth_fd(struct bpf_program *prog, int n);
 167
 168/*
 169 * Adjust type of bpf program. Default is kprobe.
 170 */
 171int bpf_program__set_tracepoint(struct bpf_program *prog);
 172int bpf_program__set_kprobe(struct bpf_program *prog);
 173
 174bool bpf_program__is_tracepoint(struct bpf_program *prog);
 175bool bpf_program__is_kprobe(struct bpf_program *prog);
 176
 177/*
 178 * We don't need __attribute__((packed)) now since it is
 179 * unnecessary for 'bpf_map_def' because they are all aligned.
 180 * In addition, using it will trigger -Wpacked warning message,
 181 * and will be treated as an error due to -Werror.
 182 */
 183struct bpf_map_def {
 184        unsigned int type;
 185        unsigned int key_size;
 186        unsigned int value_size;
 187        unsigned int max_entries;
 188};
 189
 190/*
 191 * There is another 'struct bpf_map' in include/linux/map.h. However,
 192 * it is not a uapi header so no need to consider name clash.
 193 */
 194struct bpf_map;
 195struct bpf_map *
 196bpf_object__find_map_by_name(struct bpf_object *obj, const char *name);
 197
 198struct bpf_map *
 199bpf_map__next(struct bpf_map *map, struct bpf_object *obj);
 200#define bpf_map__for_each(pos, obj)             \
 201        for ((pos) = bpf_map__next(NULL, (obj));        \
 202             (pos) != NULL;                             \
 203             (pos) = bpf_map__next((pos), (obj)))
 204
 205int bpf_map__fd(struct bpf_map *map);
 206const struct bpf_map_def *bpf_map__def(struct bpf_map *map);
 207const char *bpf_map__name(struct bpf_map *map);
 208
 209typedef void (*bpf_map_clear_priv_t)(struct bpf_map *, void *);
 210int bpf_map__set_priv(struct bpf_map *map, void *priv,
 211                      bpf_map_clear_priv_t clear_priv);
 212void *bpf_map__priv(struct bpf_map *map);
 213
 214#endif
 215