2018-10-05 16:40:00 -07:00
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2018-01-30 21:55:03 +01:00
2015-07-01 02:14:03 +00:00
/*
* common eBPF ELF operations .
*
* Copyright ( C ) 2013 - 2015 Alexei Starovoitov < ast @ kernel . org >
* Copyright ( C ) 2015 Wang Nan < wangnan0 @ huawei . com >
* Copyright ( C ) 2015 Huawei Inc .
2016-07-04 11:02:42 +00:00
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ;
* version 2.1 of the License ( not later ! )
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program ; if not , see < http : //www.gnu.org/licenses>
2015-07-01 02:14:03 +00:00
*/
2018-10-03 15:26:42 -07:00
# ifndef __LIBBPF_BPF_H
# define __LIBBPF_BPF_H
2015-07-01 02:14:03 +00:00
# include <linux/bpf.h>
2018-04-20 10:05:16 +02:00
# include <stdbool.h>
2017-02-07 21:56:05 +01:00
# include <stddef.h>
2015-07-01 02:14:03 +00:00
2018-11-21 09:29:44 -08:00
# ifdef __cplusplus
extern " C " {
# endif
2018-10-15 22:50:34 -07:00
# ifndef LIBBPF_API
# define LIBBPF_API __attribute__((visibility("default")))
# endif
2018-04-18 15:56:05 -07:00
struct bpf_create_map_attr {
const char * name ;
enum bpf_map_type map_type ;
__u32 map_flags ;
__u32 key_size ;
__u32 value_size ;
__u32 max_entries ;
__u32 numa_node ;
__u32 btf_fd ;
2018-05-22 15:04:24 -07:00
__u32 btf_key_type_id ;
__u32 btf_value_type_id ;
2018-05-16 14:02:49 -07:00
__u32 map_ifindex ;
2018-08-08 01:01:31 -07:00
__u32 inner_map_fd ;
2018-04-18 15:56:05 -07:00
} ;
2018-10-15 22:50:34 -07:00
LIBBPF_API int
bpf_create_map_xattr ( const struct bpf_create_map_attr * create_attr ) ;
LIBBPF_API int bpf_create_map_node ( enum bpf_map_type map_type , const char * name ,
int key_size , int value_size ,
int max_entries , __u32 map_flags , int node ) ;
LIBBPF_API int bpf_create_map_name ( enum bpf_map_type map_type , const char * name ,
int key_size , int value_size ,
int max_entries , __u32 map_flags ) ;
LIBBPF_API int bpf_create_map ( enum bpf_map_type map_type , int key_size ,
int value_size , int max_entries , __u32 map_flags ) ;
LIBBPF_API int bpf_create_map_in_map_node ( enum bpf_map_type map_type ,
const char * name , int key_size ,
int inner_map_fd , int max_entries ,
__u32 map_flags , int node ) ;
LIBBPF_API int bpf_create_map_in_map ( enum bpf_map_type map_type ,
const char * name , int key_size ,
int inner_map_fd , int max_entries ,
__u32 map_flags ) ;
2015-07-01 02:14:03 +00:00
2018-03-30 15:08:01 -07:00
struct bpf_load_program_attr {
enum bpf_prog_type prog_type ;
enum bpf_attach_type expected_attach_type ;
const char * name ;
const struct bpf_insn * insns ;
size_t insns_cnt ;
const char * license ;
__u32 kern_version ;
2018-05-16 14:02:49 -07:00
__u32 prog_ifindex ;
2018-11-19 15:29:14 -08:00
__u32 prog_btf_fd ;
__u32 func_info_rec_size ;
const void * func_info ;
__u32 func_info_cnt ;
2018-12-07 16:42:31 -08:00
__u32 line_info_rec_size ;
const void * line_info ;
__u32 line_info_cnt ;
tools/bpf: add log_level to bpf_load_program_attr
The kernel verifier has three levels of logs:
0: no logs
1: logs mostly useful
> 1: verbose
Current libbpf API functions bpf_load_program_xattr() and
bpf_load_program() cannot specify log_level.
The bcc, however, provides an interface for user to
specify log_level 2 for verbose output.
This patch added log_level into structure
bpf_load_program_attr, so users, including bcc, can use
bpf_load_program_xattr() to change log_level. The
supported log_level is 0, 1, and 2.
The bpf selftest test_sock.c is modified to enable log_level = 2.
If the "verbose" in test_sock.c is changed to true,
the test will output logs like below:
$ ./test_sock
func#0 @0
0: R1=ctx(id=0,off=0,imm=0) R10=fp0,call_-1
0: (bf) r6 = r1
1: R1=ctx(id=0,off=0,imm=0) R6_w=ctx(id=0,off=0,imm=0) R10=fp0,call_-1
1: (61) r7 = *(u32 *)(r6 +28)
invalid bpf_context access off=28 size=4
Test case: bind4 load with invalid access: src_ip6 .. [PASS]
...
Test case: bind6 allow all .. [PASS]
Summary: 16 PASSED, 0 FAILED
Some test_sock tests are negative tests and verbose verifier
log will be printed out as shown in the above.
Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2019-02-07 09:34:51 -08:00
__u32 log_level ;
2018-03-30 15:08:01 -07:00
} ;
2018-10-15 11:19:55 -07:00
/* Flags to direct loading requirements */
# define MAPS_RELAX_COMPAT 0x01
2015-07-01 02:14:06 +00:00
/* Recommend log buffer size */
2019-04-01 21:27:47 -07:00
# define BPF_LOG_BUF_SIZE (16 * 1024 * 1024) /* verifier maximum in kernels <= 5.1 */
2018-10-15 22:50:34 -07:00
LIBBPF_API int
bpf_load_program_xattr ( const struct bpf_load_program_attr * load_attr ,
char * log_buf , size_t log_buf_sz ) ;
LIBBPF_API int bpf_load_program ( enum bpf_prog_type type ,
const struct bpf_insn * insns , size_t insns_cnt ,
const char * license , __u32 kern_version ,
char * log_buf , size_t log_buf_sz ) ;
LIBBPF_API int bpf_verify_program ( enum bpf_prog_type type ,
const struct bpf_insn * insns ,
2018-11-30 21:08:14 -08:00
size_t insns_cnt , __u32 prog_flags ,
2018-10-15 22:50:34 -07:00
const char * license , __u32 kern_version ,
char * log_buf , size_t log_buf_sz ,
int log_level ) ;
2015-07-01 02:14:06 +00:00
2018-10-15 22:50:34 -07:00
LIBBPF_API int bpf_map_update_elem ( int fd , const void * key , const void * value ,
__u64 flags ) ;
2016-11-26 07:03:25 +00:00
2018-10-15 22:50:34 -07:00
LIBBPF_API int bpf_map_lookup_elem ( int fd , const void * key , void * value ) ;
2019-01-31 15:40:11 -08:00
LIBBPF_API int bpf_map_lookup_elem_flags ( int fd , const void * key , void * value ,
__u64 flags ) ;
2018-10-18 15:16:41 +02:00
LIBBPF_API int bpf_map_lookup_and_delete_elem ( int fd , const void * key ,
void * value ) ;
2018-10-15 22:50:34 -07:00
LIBBPF_API int bpf_map_delete_elem ( int fd , const void * key ) ;
LIBBPF_API int bpf_map_get_next_key ( int fd , const void * key , void * next_key ) ;
LIBBPF_API int bpf_obj_pin ( int fd , const char * pathname ) ;
LIBBPF_API int bpf_obj_get ( const char * pathname ) ;
LIBBPF_API int bpf_prog_attach ( int prog_fd , int attachable_fd ,
enum bpf_attach_type type , unsigned int flags ) ;
LIBBPF_API int bpf_prog_detach ( int attachable_fd , enum bpf_attach_type type ) ;
LIBBPF_API int bpf_prog_detach2 ( int prog_fd , int attachable_fd ,
enum bpf_attach_type type ) ;
2018-12-03 11:31:25 +00:00
struct bpf_prog_test_run_attr {
int prog_fd ;
int repeat ;
const void * data_in ;
__u32 data_size_in ;
void * data_out ; /* optional */
__u32 data_size_out ; /* in: max length of data_out
* out : length of data_out */
__u32 retval ; /* out: return code of the BPF program */
__u32 duration ; /* out: average per repetition in ns */
} ;
LIBBPF_API int bpf_prog_test_run_xattr ( struct bpf_prog_test_run_attr * test_attr ) ;
/*
* bpf_prog_test_run does not check that data_out is large enough . Consider
* using bpf_prog_test_run_xattr instead .
*/
2018-10-15 22:50:34 -07:00
LIBBPF_API int bpf_prog_test_run ( int prog_fd , int repeat , void * data ,
__u32 size , void * data_out , __u32 * size_out ,
__u32 * retval , __u32 * duration ) ;
LIBBPF_API int bpf_prog_get_next_id ( __u32 start_id , __u32 * next_id ) ;
LIBBPF_API int bpf_map_get_next_id ( __u32 start_id , __u32 * next_id ) ;
LIBBPF_API int bpf_prog_get_fd_by_id ( __u32 id ) ;
LIBBPF_API int bpf_map_get_fd_by_id ( __u32 id ) ;
LIBBPF_API int bpf_btf_get_fd_by_id ( __u32 id ) ;
LIBBPF_API int bpf_obj_get_info_by_fd ( int prog_fd , void * info , __u32 * info_len ) ;
LIBBPF_API int bpf_prog_query ( int target_fd , enum bpf_attach_type type ,
__u32 query_flags , __u32 * attach_flags ,
__u32 * prog_ids , __u32 * prog_cnt ) ;
LIBBPF_API int bpf_raw_tracepoint_open ( const char * name , int prog_fd ) ;
LIBBPF_API int bpf_load_btf ( void * btf , __u32 btf_size , char * log_buf ,
__u32 log_buf_size , bool do_log ) ;
LIBBPF_API int bpf_task_fd_query ( int pid , int fd , __u32 flags , char * buf ,
__u32 * buf_len , __u32 * prog_id , __u32 * fd_type ,
__u64 * probe_offset , __u64 * probe_addr ) ;
2018-11-21 09:29:44 -08:00
# ifdef __cplusplus
} /* extern "C" */
# endif
2018-10-03 15:26:42 -07:00
# endif /* __LIBBPF_BPF_H */