diff options
Diffstat (limited to 'tools/lib/bpf/libbpf.h')
| -rw-r--r-- | tools/lib/bpf/libbpf.h | 121 | 
1 files changed, 73 insertions, 48 deletions
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 0dbf4bfba0c4..3fe12c9d1f92 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -17,14 +17,12 @@  #include <sys/types.h>  // for size_t  #include <linux/bpf.h> +#include "libbpf_common.h" +  #ifdef __cplusplus  extern "C" {  #endif -#ifndef LIBBPF_API -#define LIBBPF_API __attribute__((visibility("default"))) -#endif -  enum libbpf_errno {  	__LIBBPF_ERRNO__START = 4000, @@ -67,28 +65,6 @@ struct bpf_object_open_attr {  	enum bpf_prog_type prog_type;  }; -/* Helper macro to declare and initialize libbpf options struct - * - * This dance with uninitialized declaration, followed by memset to zero, - * followed by assignment using compound literal syntax is done to preserve - * ability to use a nice struct field initialization syntax and **hopefully** - * have all the padding bytes initialized to zero. It's not guaranteed though, - * when copying literal, that compiler won't copy garbage in literal's padding - * bytes, but that's the best way I've found and it seems to work in practice. - * - * Macro declares opts struct of given type and name, zero-initializes, - * including any extra padding, it with memset() and then assigns initial - * values provided by users in struct initializer-syntax as varargs. - */ -#define DECLARE_LIBBPF_OPTS(TYPE, NAME, ...)				    \ -	struct TYPE NAME = ({ 						    \ -		memset(&NAME, 0, sizeof(struct TYPE));			    \ -		(struct TYPE) {						    \ -			.sz = sizeof(struct TYPE),			    \ -			__VA_ARGS__					    \ -		};							    \ -	}) -  struct bpf_object_open_opts {  	/* size of this struct, for forward/backward compatiblity */  	size_t sz; @@ -101,7 +77,11 @@ struct bpf_object_open_opts {  	const char *object_name;  	/* parse map definitions non-strictly, allowing extra attributes/data */  	bool relaxed_maps; -	/* process CO-RE relocations non-strictly, allowing them to fail */ +	/* DEPRECATED: handle CO-RE relocations non-strictly, allowing failures. +	 * Value is ignored. Relocations always are processed non-strictly. +	 * Non-relocatable instructions are replaced with invalid ones to +	 * prevent accidental errors. +	 * */  	bool relaxed_core_relocs;  	/* maps that set the 'pinning' attribute in their definition will have  	 * their pin_path attribute set to a file in this directory, and be @@ -109,15 +89,19 @@ struct bpf_object_open_opts {  	 */  	const char *pin_root_path;  	__u32 attach_prog_fd; +	/* Additional kernel config content that augments and overrides +	 * system Kconfig for CONFIG_xxx externs. +	 */ +	const char *kconfig;  }; -#define bpf_object_open_opts__last_field attach_prog_fd +#define bpf_object_open_opts__last_field kconfig  LIBBPF_API struct bpf_object *bpf_object__open(const char *path);  LIBBPF_API struct bpf_object * -bpf_object__open_file(const char *path, struct bpf_object_open_opts *opts); +bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts);  LIBBPF_API struct bpf_object *  bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, -		     struct bpf_object_open_opts *opts); +		     const struct bpf_object_open_opts *opts);  /* deprecated bpf_object__open variants */  LIBBPF_API struct bpf_object * @@ -126,11 +110,6 @@ bpf_object__open_buffer(const void *obj_buf, size_t obj_buf_sz,  LIBBPF_API struct bpf_object *  bpf_object__open_xattr(struct bpf_object_open_attr *attr); -int bpf_object__section_size(const struct bpf_object *obj, const char *name, -			     __u32 *size); -int bpf_object__variable_offset(const struct bpf_object *obj, const char *name, -				__u32 *off); -  enum libbpf_pin_type {  	LIBBPF_PIN_NONE,  	/* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */ @@ -161,6 +140,7 @@ struct bpf_object_load_attr {  LIBBPF_API int bpf_object__load(struct bpf_object *obj);  LIBBPF_API int bpf_object__load_xattr(struct bpf_object_load_attr *attr);  LIBBPF_API int bpf_object__unload(struct bpf_object *obj); +  LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj);  LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj); @@ -171,6 +151,9 @@ LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj);  LIBBPF_API struct bpf_program *  bpf_object__find_program_by_title(const struct bpf_object *obj,  				  const char *title); +LIBBPF_API struct bpf_program * +bpf_object__find_program_by_name(const struct bpf_object *obj, +				 const char *name);  LIBBPF_API struct bpf_object *bpf_object__next(struct bpf_object *prev);  #define bpf_object__for_each_safe(pos, tmp)			\ @@ -214,6 +197,7 @@ LIBBPF_API void *bpf_program__priv(const struct bpf_program *prog);  LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog,  					 __u32 ifindex); +LIBBPF_API const char *bpf_program__name(const struct bpf_program *prog);  LIBBPF_API const char *bpf_program__title(const struct bpf_program *prog,  					  bool needs_copy); @@ -235,9 +219,12 @@ LIBBPF_API void bpf_program__unload(struct bpf_program *prog);  struct bpf_link; +LIBBPF_API void bpf_link__disconnect(struct bpf_link *link);  LIBBPF_API int bpf_link__destroy(struct bpf_link *link);  LIBBPF_API struct bpf_link * +bpf_program__attach(struct bpf_program *prog); +LIBBPF_API struct bpf_link *  bpf_program__attach_perf_event(struct bpf_program *prog, int pfd);  LIBBPF_API struct bpf_link *  bpf_program__attach_kprobe(struct bpf_program *prog, bool retprobe, @@ -256,6 +243,8 @@ bpf_program__attach_raw_tracepoint(struct bpf_program *prog,  LIBBPF_API struct bpf_link *  bpf_program__attach_trace(struct bpf_program *prog); +struct bpf_map; +LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(struct bpf_map *map);  struct bpf_insn;  /* @@ -332,6 +321,8 @@ LIBBPF_API int bpf_program__set_sched_act(struct bpf_program *prog);  LIBBPF_API int bpf_program__set_xdp(struct bpf_program *prog);  LIBBPF_API int bpf_program__set_perf_event(struct bpf_program *prog);  LIBBPF_API int bpf_program__set_tracing(struct bpf_program *prog); +LIBBPF_API int bpf_program__set_struct_ops(struct bpf_program *prog); +LIBBPF_API int bpf_program__set_extension(struct bpf_program *prog);  LIBBPF_API enum bpf_prog_type bpf_program__get_type(struct bpf_program *prog);  LIBBPF_API void bpf_program__set_type(struct bpf_program *prog, @@ -352,6 +343,8 @@ LIBBPF_API bool bpf_program__is_sched_act(const struct bpf_program *prog);  LIBBPF_API bool bpf_program__is_xdp(const struct bpf_program *prog);  LIBBPF_API bool bpf_program__is_perf_event(const struct bpf_program *prog);  LIBBPF_API bool bpf_program__is_tracing(const struct bpf_program *prog); +LIBBPF_API bool bpf_program__is_struct_ops(const struct bpf_program *prog); +LIBBPF_API bool bpf_program__is_extension(const struct bpf_program *prog);  /*   * No need for __attribute__((packed)), all members of 'bpf_map_def' @@ -371,7 +364,6 @@ struct bpf_map_def {   * The 'struct bpf_map' in include/linux/bpf.h is internal to the kernel,   * so no need to worry about a name clash.   */ -struct bpf_map;  LIBBPF_API struct bpf_map *  bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name); @@ -512,18 +504,6 @@ bpf_perf_event_read_simple(void *mmap_mem, size_t mmap_size, size_t page_size,  			   void **copy_mem, size_t *copy_size,  			   bpf_perf_event_print_t fn, void *private_data); -struct nlattr; -typedef int (*libbpf_dump_nlmsg_t)(void *cookie, void *msg, struct nlattr **tb); -int libbpf_netlink_open(unsigned int *nl_pid); -int libbpf_nl_get_link(int sock, unsigned int nl_pid, -		       libbpf_dump_nlmsg_t dump_link_nlmsg, void *cookie); -int libbpf_nl_get_class(int sock, unsigned int nl_pid, int ifindex, -			libbpf_dump_nlmsg_t dump_class_nlmsg, void *cookie); -int libbpf_nl_get_qdisc(int sock, unsigned int nl_pid, int ifindex, -			libbpf_dump_nlmsg_t dump_qdisc_nlmsg, void *cookie); -int libbpf_nl_get_filter(int sock, unsigned int nl_pid, int ifindex, int handle, -			 libbpf_dump_nlmsg_t dump_filter_nlmsg, void *cookie); -  struct bpf_prog_linfo;  struct bpf_prog_info; @@ -550,6 +530,7 @@ LIBBPF_API bool bpf_probe_prog_type(enum bpf_prog_type prog_type,  LIBBPF_API bool bpf_probe_map_type(enum bpf_map_type map_type, __u32 ifindex);  LIBBPF_API bool bpf_probe_helper(enum bpf_func_id id,  				 enum bpf_prog_type prog_type, __u32 ifindex); +LIBBPF_API bool bpf_probe_large_insn_limit(__u32 ifindex);  /*   * Get bpf_prog_info in continuous memory @@ -630,6 +611,50 @@ bpf_program__bpil_offs_to_addr(struct bpf_prog_info_linear *info_linear);   */  LIBBPF_API int libbpf_num_possible_cpus(void); +struct bpf_map_skeleton { +	const char *name; +	struct bpf_map **map; +	void **mmaped; +}; + +struct bpf_prog_skeleton { +	const char *name; +	struct bpf_program **prog; +	struct bpf_link **link; +}; + +struct bpf_object_skeleton { +	size_t sz; /* size of this struct, for forward/backward compatibility */ + +	const char *name; +	void *data; +	size_t data_sz; + +	struct bpf_object **obj; + +	int map_cnt; +	int map_skel_sz; /* sizeof(struct bpf_skeleton_map) */ +	struct bpf_map_skeleton *maps; + +	int prog_cnt; +	int prog_skel_sz; /* sizeof(struct bpf_skeleton_prog) */ +	struct bpf_prog_skeleton *progs; +}; + +LIBBPF_API int +bpf_object__open_skeleton(struct bpf_object_skeleton *s, +			  const struct bpf_object_open_opts *opts); +LIBBPF_API int bpf_object__load_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API int bpf_object__attach_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API void bpf_object__detach_skeleton(struct bpf_object_skeleton *s); +LIBBPF_API void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s); + +enum libbpf_tristate { +	TRI_NO = 0, +	TRI_YES = 1, +	TRI_MODULE = 2, +}; +  #ifdef __cplusplus  } /* extern "C" */  #endif  |