2021-07-13 20:33 UTC+0200 ~ Lorenzo Fontana <fontanalorenz@xxxxxxxxx> > This allows consumers of libbpf to iterate trough the insns > of a program without loading it first directly after the ELF parsing. > > Being able to do that is useful to create tooling that can show > the structure of a BPF program using libbpf without having to > parse the ELF separately. > > Usage: > struct bpf_insn *insn; > insn = bpf_program__insns(prog); > > Signed-off-by: Lorenzo Fontana <fontanalorenz@xxxxxxxxx> > --- > tools/lib/bpf/libbpf.c | 5 +++++ > tools/lib/bpf/libbpf.h | 1 + > 2 files changed, 6 insertions(+) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 1e04ce724240..67d51531f6b6 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -8866,6 +8866,11 @@ void *bpf_program__priv(const struct bpf_program *prog) > return prog ? prog->priv : libbpf_err_ptr(-EINVAL); > } > > +struct bpf_insn *bpf_program__insns(const struct bpf_program *prog) > +{ > + return prog ? prog->insns : libbpf_err_ptr(-EINVAL); > +} > + > void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) > { > prog->prog_ifindex = ifindex; > diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h > index 6e61342ba56c..e4a1c98ae6d9 100644 > --- a/tools/lib/bpf/libbpf.h > +++ b/tools/lib/bpf/libbpf.h > @@ -195,6 +195,7 @@ typedef void (*bpf_program_clear_priv_t)(struct bpf_program *, void *); > LIBBPF_API int bpf_program__set_priv(struct bpf_program *prog, void *priv, > bpf_program_clear_priv_t clear_priv); > > +LIBBPF_API struct bpf_insn *bpf_program__insns(const struct bpf_program *prog); > LIBBPF_API void *bpf_program__priv(const struct bpf_program *prog); > LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog, > __u32 ifindex); > If you make it part of the API, the new function should also have an entry in tools/lib/bpf/libbpf.map. Quentin