1 /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
4 * common eBPF ELF operations.
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.
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!)
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.
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>
23 #ifndef __LIBBPF_BPF_H
24 #define __LIBBPF_BPF_H
26 #include <linux/bpf.h>
31 #include "libbpf_common.h"
37 struct bpf_create_map_attr
{
39 enum bpf_map_type map_type
;
46 __u32 btf_key_type_id
;
47 __u32 btf_value_type_id
;
51 __u32 btf_vmlinux_value_type_id
;
56 bpf_create_map_xattr(const struct bpf_create_map_attr
*create_attr
);
57 LIBBPF_API
int bpf_create_map_node(enum bpf_map_type map_type
, const char *name
,
58 int key_size
, int value_size
,
59 int max_entries
, __u32 map_flags
, int node
);
60 LIBBPF_API
int bpf_create_map_name(enum bpf_map_type map_type
, const char *name
,
61 int key_size
, int value_size
,
62 int max_entries
, __u32 map_flags
);
63 LIBBPF_API
int bpf_create_map(enum bpf_map_type map_type
, int key_size
,
64 int value_size
, int max_entries
, __u32 map_flags
);
65 LIBBPF_API
int bpf_create_map_in_map_node(enum bpf_map_type map_type
,
66 const char *name
, int key_size
,
67 int inner_map_fd
, int max_entries
,
68 __u32 map_flags
, int node
);
69 LIBBPF_API
int bpf_create_map_in_map(enum bpf_map_type map_type
,
70 const char *name
, int key_size
,
71 int inner_map_fd
, int max_entries
,
74 struct bpf_load_program_attr
{
75 enum bpf_prog_type prog_type
;
76 enum bpf_attach_type expected_attach_type
;
78 const struct bpf_insn
*insns
;
90 __u32 func_info_rec_size
;
91 const void *func_info
;
93 __u32 line_info_rec_size
;
94 const void *line_info
;
100 /* Flags to direct loading requirements */
101 #define MAPS_RELAX_COMPAT 0x01
103 /* Recommend log buffer size */
104 #define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */
106 bpf_load_program_xattr(const struct bpf_load_program_attr
*load_attr
,
107 char *log_buf
, size_t log_buf_sz
);
108 LIBBPF_API
int bpf_load_program(enum bpf_prog_type type
,
109 const struct bpf_insn
*insns
, size_t insns_cnt
,
110 const char *license
, __u32 kern_version
,
111 char *log_buf
, size_t log_buf_sz
);
112 LIBBPF_API
int bpf_verify_program(enum bpf_prog_type type
,
113 const struct bpf_insn
*insns
,
114 size_t insns_cnt
, __u32 prog_flags
,
115 const char *license
, __u32 kern_version
,
116 char *log_buf
, size_t log_buf_sz
,
119 LIBBPF_API
int bpf_map_update_elem(int fd
, const void *key
, const void *value
,
122 LIBBPF_API
int bpf_map_lookup_elem(int fd
, const void *key
, void *value
);
123 LIBBPF_API
int bpf_map_lookup_elem_flags(int fd
, const void *key
, void *value
,
125 LIBBPF_API
int bpf_map_lookup_and_delete_elem(int fd
, const void *key
,
127 LIBBPF_API
int bpf_map_delete_elem(int fd
, const void *key
);
128 LIBBPF_API
int bpf_map_get_next_key(int fd
, const void *key
, void *next_key
);
129 LIBBPF_API
int bpf_map_freeze(int fd
);
131 struct bpf_map_batch_opts
{
132 size_t sz
; /* size of this struct for forward/backward compatibility */
136 #define bpf_map_batch_opts__last_field flags
138 LIBBPF_API
int bpf_map_delete_batch(int fd
, void *keys
,
140 const struct bpf_map_batch_opts
*opts
);
141 LIBBPF_API
int bpf_map_lookup_batch(int fd
, void *in_batch
, void *out_batch
,
142 void *keys
, void *values
, __u32
*count
,
143 const struct bpf_map_batch_opts
*opts
);
144 LIBBPF_API
int bpf_map_lookup_and_delete_batch(int fd
, void *in_batch
,
145 void *out_batch
, void *keys
,
146 void *values
, __u32
*count
,
147 const struct bpf_map_batch_opts
*opts
);
148 LIBBPF_API
int bpf_map_update_batch(int fd
, void *keys
, void *values
,
150 const struct bpf_map_batch_opts
*opts
);
152 LIBBPF_API
int bpf_obj_pin(int fd
, const char *pathname
);
153 LIBBPF_API
int bpf_obj_get(const char *pathname
);
155 struct bpf_prog_attach_opts
{
156 size_t sz
; /* size of this struct for forward/backward compatibility */
160 #define bpf_prog_attach_opts__last_field replace_prog_fd
162 LIBBPF_API
int bpf_prog_attach(int prog_fd
, int attachable_fd
,
163 enum bpf_attach_type type
, unsigned int flags
);
164 LIBBPF_API
int bpf_prog_attach_xattr(int prog_fd
, int attachable_fd
,
165 enum bpf_attach_type type
,
166 const struct bpf_prog_attach_opts
*opts
);
167 LIBBPF_API
int bpf_prog_detach(int attachable_fd
, enum bpf_attach_type type
);
168 LIBBPF_API
int bpf_prog_detach2(int prog_fd
, int attachable_fd
,
169 enum bpf_attach_type type
);
171 struct bpf_prog_test_run_attr
{
176 void *data_out
; /* optional */
177 __u32 data_size_out
; /* in: max length of data_out
178 * out: length of data_out */
179 __u32 retval
; /* out: return code of the BPF program */
180 __u32 duration
; /* out: average per repetition in ns */
181 const void *ctx_in
; /* optional */
183 void *ctx_out
; /* optional */
184 __u32 ctx_size_out
; /* in: max length of ctx_out
185 * out: length of cxt_out */
188 LIBBPF_API
int bpf_prog_test_run_xattr(struct bpf_prog_test_run_attr
*test_attr
);
191 * bpf_prog_test_run does not check that data_out is large enough. Consider
192 * using bpf_prog_test_run_xattr instead.
194 LIBBPF_API
int bpf_prog_test_run(int prog_fd
, int repeat
, void *data
,
195 __u32 size
, void *data_out
, __u32
*size_out
,
196 __u32
*retval
, __u32
*duration
);
197 LIBBPF_API
int bpf_prog_get_next_id(__u32 start_id
, __u32
*next_id
);
198 LIBBPF_API
int bpf_map_get_next_id(__u32 start_id
, __u32
*next_id
);
199 LIBBPF_API
int bpf_btf_get_next_id(__u32 start_id
, __u32
*next_id
);
200 LIBBPF_API
int bpf_prog_get_fd_by_id(__u32 id
);
201 LIBBPF_API
int bpf_map_get_fd_by_id(__u32 id
);
202 LIBBPF_API
int bpf_btf_get_fd_by_id(__u32 id
);
203 LIBBPF_API
int bpf_obj_get_info_by_fd(int prog_fd
, void *info
, __u32
*info_len
);
204 LIBBPF_API
int bpf_prog_query(int target_fd
, enum bpf_attach_type type
,
205 __u32 query_flags
, __u32
*attach_flags
,
206 __u32
*prog_ids
, __u32
*prog_cnt
);
207 LIBBPF_API
int bpf_raw_tracepoint_open(const char *name
, int prog_fd
);
208 LIBBPF_API
int bpf_load_btf(void *btf
, __u32 btf_size
, char *log_buf
,
209 __u32 log_buf_size
, bool do_log
);
210 LIBBPF_API
int bpf_task_fd_query(int pid
, int fd
, __u32 flags
, char *buf
,
211 __u32
*buf_len
, __u32
*prog_id
, __u32
*fd_type
,
212 __u64
*probe_offset
, __u64
*probe_addr
);
218 #endif /* __LIBBPF_BPF_H */