diff options
Diffstat (limited to 'tools/lib/bpf/libbpf.h')
| -rw-r--r-- | tools/lib/bpf/libbpf.h | 99 | 
1 files changed, 94 insertions, 5 deletions
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index e8f70977d137..0dbf4bfba0c4 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -67,18 +67,80 @@ 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; +	/* object name override, if provided: +	 * - for object open from file, this will override setting object +	 *   name from file path's base name; +	 * - for object open from memory buffer, this will specify an object +	 *   name and will override default "<addr>-<buf-size>" name; +	 */ +	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 */ +	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 +	 * auto-pinned to that path on load; defaults to "/sys/fs/bpf". +	 */ +	const char *pin_root_path; +	__u32 attach_prog_fd; +}; +#define bpf_object_open_opts__last_field attach_prog_fd +  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); +LIBBPF_API struct bpf_object * +bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, +		     struct bpf_object_open_opts *opts); + +/* deprecated bpf_object__open variants */ +LIBBPF_API struct bpf_object * +bpf_object__open_buffer(const void *obj_buf, size_t obj_buf_sz, +			const char *name); +LIBBPF_API struct bpf_object *  bpf_object__open_xattr(struct bpf_object_open_attr *attr); -struct bpf_object *__bpf_object__open_xattr(struct bpf_object_open_attr *attr, -					    int flags); -LIBBPF_API struct bpf_object *bpf_object__open_buffer(void *obj_buf, -						      size_t obj_buf_sz, -						      const char *name); +  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) */ +	LIBBPF_PIN_BY_NAME, +}; + +/* pin_maps and unpin_maps can both be called with a NULL path, in which case + * they will use the pin_path attribute of each map (and ignore all maps that + * don't have a pin_path set). + */  LIBBPF_API int bpf_object__pin_maps(struct bpf_object *obj, const char *path);  LIBBPF_API int bpf_object__unpin_maps(struct bpf_object *obj,  				      const char *path); @@ -127,6 +189,8 @@ libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type,  			 enum bpf_attach_type *expected_attach_type);  LIBBPF_API int libbpf_attach_type_by_name(const char *name,  					  enum bpf_attach_type *attach_type); +LIBBPF_API int libbpf_find_vmlinux_btf_id(const char *name, +					  enum bpf_attach_type attach_type);  /* Accessors of bpf_program */  struct bpf_program; @@ -153,6 +217,9 @@ LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog,  LIBBPF_API const char *bpf_program__title(const struct bpf_program *prog,  					  bool needs_copy); +/* returns program size in bytes */ +LIBBPF_API size_t bpf_program__size(const struct bpf_program *prog); +  LIBBPF_API int bpf_program__load(struct bpf_program *prog, char *license,  				 __u32 kern_version);  LIBBPF_API int bpf_program__fd(const struct bpf_program *prog); @@ -187,6 +254,8 @@ LIBBPF_API struct bpf_link *  bpf_program__attach_raw_tracepoint(struct bpf_program *prog,  				   const char *tp_name); +LIBBPF_API struct bpf_link * +bpf_program__attach_trace(struct bpf_program *prog);  struct bpf_insn;  /* @@ -262,8 +331,14 @@ LIBBPF_API int bpf_program__set_sched_cls(struct bpf_program *prog);  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 enum bpf_prog_type bpf_program__get_type(struct bpf_program *prog);  LIBBPF_API void bpf_program__set_type(struct bpf_program *prog,  				      enum bpf_prog_type type); + +LIBBPF_API enum bpf_attach_type +bpf_program__get_expected_attach_type(struct bpf_program *prog);  LIBBPF_API void  bpf_program__set_expected_attach_type(struct bpf_program *prog,  				      enum bpf_attach_type type); @@ -276,6 +351,7 @@ LIBBPF_API bool bpf_program__is_sched_cls(const struct bpf_program *prog);  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);  /*   * No need for __attribute__((packed)), all members of 'bpf_map_def' @@ -335,6 +411,9 @@ LIBBPF_API int bpf_map__resize(struct bpf_map *map, __u32 max_entries);  LIBBPF_API bool bpf_map__is_offload_neutral(const struct bpf_map *map);  LIBBPF_API bool bpf_map__is_internal(const struct bpf_map *map);  LIBBPF_API void bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex); +LIBBPF_API int bpf_map__set_pin_path(struct bpf_map *map, const char *path); +LIBBPF_API const char *bpf_map__get_pin_path(const struct bpf_map *map); +LIBBPF_API bool bpf_map__is_pinned(const struct bpf_map *map);  LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path);  LIBBPF_API int bpf_map__unpin(struct bpf_map *map, const char *path); @@ -356,8 +435,18 @@ LIBBPF_API int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr,  LIBBPF_API int bpf_prog_load(const char *file, enum bpf_prog_type type,  			     struct bpf_object **pobj, int *prog_fd); +struct xdp_link_info { +	__u32 prog_id; +	__u32 drv_prog_id; +	__u32 hw_prog_id; +	__u32 skb_prog_id; +	__u8 attach_mode; +}; +  LIBBPF_API int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags);  LIBBPF_API int bpf_get_link_xdp_id(int ifindex, __u32 *prog_id, __u32 flags); +LIBBPF_API int bpf_get_link_xdp_info(int ifindex, struct xdp_link_info *info, +				     size_t info_size, __u32 flags);  struct perf_buffer;  | 
