Add low-level wrapper API for BPF_STRUCT_OPS_ASSOCIATE_PROG command in bpf() syscall. Signed-off-by: Amery Hung --- tools/lib/bpf/bpf.c | 18 ++++++++++++++++++ tools/lib/bpf/bpf.h | 19 +++++++++++++++++++ tools/lib/bpf/libbpf.map | 1 + 3 files changed, 38 insertions(+) diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 339b19797237..230fc2fa98f9 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -1397,3 +1397,21 @@ int bpf_prog_stream_read(int prog_fd, __u32 stream_id, void *buf, __u32 buf_len, err = sys_bpf(BPF_PROG_STREAM_READ_BY_FD, &attr, attr_sz); return libbpf_err_errno(err); } + +int bpf_struct_ops_associate_prog(int map_fd, int prog_fd, + struct bpf_struct_ops_associate_prog_opts *opts) +{ + const size_t attr_sz = offsetofend(union bpf_attr, struct_ops_assoc_prog); + union bpf_attr attr; + int err; + + if (!OPTS_VALID(opts, bpf_struct_ops_associate_prog_opts)) + return libbpf_err(-EINVAL); + + memset(&attr, 0, attr_sz); + attr.struct_ops_assoc_prog.map_fd = map_fd; + attr.struct_ops_assoc_prog.prog_fd = prog_fd; + + err = sys_bpf(BPF_STRUCT_OPS_ASSOCIATE_PROG, &attr, attr_sz); + return libbpf_err_errno(err); +} diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index e983a3e40d61..99fe189ca7c6 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -733,6 +733,25 @@ struct bpf_prog_stream_read_opts { LIBBPF_API int bpf_prog_stream_read(int prog_fd, __u32 stream_id, void *buf, __u32 buf_len, struct bpf_prog_stream_read_opts *opts); +struct bpf_struct_ops_associate_prog_opts { + size_t sz; + size_t :0; +}; +#define bpf_struct_ops_associate_prog_opts__last_field sz +/** + * @brief **bpf_struct_ops_associate_prog** associate a BPF program with a + * struct_ops map. + * + * @param map_fd FD for the struct_ops map to be associated with a BPF progam + * @param prog_fd FD for the BPF program + * @param opts optional options, can be NULL + * + * @return 0 on success; negative error code, otherwise (errno is also set to + * the error code) + */ +LIBBPF_API int bpf_struct_ops_associate_prog(int map_fd, int prog_fd, + struct bpf_struct_ops_associate_prog_opts *opts); + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map index 8ed8749907d4..3a156a663210 100644 --- a/tools/lib/bpf/libbpf.map +++ b/tools/lib/bpf/libbpf.map @@ -451,4 +451,5 @@ LIBBPF_1.7.0 { global: bpf_map__set_exclusive_program; bpf_map__exclusive_program; + bpf_struct_ops_associate_prog; } LIBBPF_1.6.0; -- 2.47.3