summaryrefslogtreecommitdiffstats
path: root/tools/bpf/bpftool/prog.c
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2018-07-10 14:43:00 -0700
committerDaniel Borkmann <daniel@iogearbox.net>2018-07-11 22:13:33 +0200
commit49f2cba3e57a4d71e3e7001cc2934b563ee495f4 (patch)
treec226a462ea9fab37433185f530a664431b4a4340 /tools/bpf/bpftool/prog.c
parentb60df2a0e11fcd24186c312b0307ab8494031e27 (diff)
downloadlinux-49f2cba3e57a4d71e3e7001cc2934b563ee495f4.tar.gz
linux-49f2cba3e57a4d71e3e7001cc2934b563ee495f4.tar.bz2
linux-49f2cba3e57a4d71e3e7001cc2934b563ee495f4.zip
tools: bpftool: allow users to specify program type for prog load
Sometimes program section names don't match with libbpf's expectation. In particular XDP's default section names differ between libbpf and iproute2. Allow users to pass program type on command line. Name the types like the libbpf expected section names. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'tools/bpf/bpftool/prog.c')
-rw-r--r--tools/bpf/bpftool/prog.c44
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],