diff options
Diffstat (limited to 'tools/bpf/bpftool/prog.c')
-rw-r--r-- | tools/bpf/bpftool/prog.c | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index 21c74de7156f..98695585bbb6 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -688,6 +688,7 @@ static int do_load(int argc, char **argv) const char *objfile, *pinfile; struct bpf_object *obj; int prog_fd; + int err; if (!REQ_ARGS(2)) return -1; @@ -695,7 +696,37 @@ static int do_load(int argc, char **argv) pinfile = GET_ARG(); while (argc) { - if (is_prefix(*argv, "dev")) { + if (is_prefix(*argv, "type")) { + char *type; + + NEXT_ARG(); + + if (attr.prog_type != BPF_PROG_TYPE_UNSPEC) { + p_err("program type already specified"); + return -1; + } + if (!REQ_ARGS(1)) + return -1; + + /* Put a '/' at the end of type to appease libbpf */ + type = malloc(strlen(*argv) + 2); + if (!type) { + p_err("mem alloc failed"); + return -1; + } + *type = 0; + strcat(type, *argv); + strcat(type, "/"); + + err = libbpf_prog_type_by_name(type, &attr.prog_type, + &attr.expected_attach_type); + free(type); + if (err < 0) { + p_err("unknown program type '%s'", *argv); + return err; + } + NEXT_ARG(); + } else if (is_prefix(*argv, "dev")) { NEXT_ARG(); if (attr.ifindex) { @@ -713,7 +744,7 @@ static int do_load(int argc, char **argv) } NEXT_ARG(); } else { - p_err("expected no more arguments or 'dev', got: '%s'?", + p_err("expected no more arguments, 'type' or 'dev', got: '%s'?", *argv); return -1; } @@ -753,10 +784,17 @@ static int do_help(int argc, char **argv) " %s %s dump xlated PROG [{ file FILE | opcodes | visual }]\n" " %s %s dump jited PROG [{ file FILE | opcodes }]\n" " %s %s pin PROG FILE\n" - " %s %s load OBJ FILE [dev NAME]\n" + " %s %s load OBJ FILE [type TYPE] [dev NAME]\n" " %s %s help\n" "\n" " " HELP_SPEC_PROGRAM "\n" + " TYPE := { socket | kprobe | kretprobe | classifier | action |\n" + " tracepoint | raw_tracepoint | xdp | perf_event | cgroup/skb |\n" + " cgroup/sock | cgroup/dev | lwt_in | lwt_out | lwt_xmit |\n" + " lwt_seg6local | sockops | sk_skb | sk_msg | lirc_mode2 |\n" + " cgroup/bind4 | cgroup/bind6 | cgroup/post_bind4 |\n" + " cgroup/post_bind6 | cgroup/connect4 | cgroup/connect6 |\n" + " cgroup/sendmsg4 | cgroup/sendmsg6 }\n" " " HELP_SPEC_OPTIONS "\n" "", bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2], |