]> git.baikalelectronics.ru Git - kernel.git/commitdiff
tools: bpftool: Allow all prog/map handles for pinning objects
authorQuentin Monnet <quentin@isovalent.com>
Thu, 12 Mar 2020 18:46:07 +0000 (18:46 +0000)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 12 Mar 2020 23:24:08 +0000 (00:24 +0100)
Documentation and interactive help for bpftool have always explained
that the regular handles for programs (id|name|tag|pinned) and maps
(id|name|pinned) can be passed to the utility when attempting to pin
objects (bpftool prog pin PROG / bpftool map pin MAP).

THIS IS A LIE!! The tool actually accepts only ids, as the parsing is
done in do_pin_any() in common.c instead of reusing the parsing
functions that have long been generic for program and map handles.

Instead of fixing the doc, fix the code. It is trivial to reuse the
generic parsing, and to simplify do_pin_any() in the process.

Do not accept to pin multiple objects at the same time with
prog_parse_fds() or map_parse_fds() (this would require a more complex
syntax for passing multiple sysfs paths and validating that they
correspond to the number of e.g. programs we find for a given name or
tag).

Signed-off-by: Quentin Monnet <quentin@isovalent.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20200312184608.12050-2-quentin@isovalent.com
tools/bpf/bpftool/common.c
tools/bpf/bpftool/main.h
tools/bpf/bpftool/map.c
tools/bpf/bpftool/prog.c

index b75b8ec5469c207cce1dc4c72f8e21bcea5a7ce9..ad634516ba8028c916d2f9284d0a244f31daca46 100644 (file)
@@ -211,39 +211,14 @@ int do_pin_fd(int fd, const char *name)
        return err;
 }
 
-int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32))
+int do_pin_any(int argc, char **argv, int (*get_fd)(int *, char ***))
 {
-       unsigned int id;
-       char *endptr;
        int err;
        int fd;
 
-       if (argc < 3) {
-               p_err("too few arguments, id ID and FILE path is required");
-               return -1;
-       } else if (argc > 3) {
-               p_err("too many arguments");
-               return -1;
-       }
-
-       if (!is_prefix(*argv, "id")) {
-               p_err("expected 'id' got %s", *argv);
-               return -1;
-       }
-       NEXT_ARG();
-
-       id = strtoul(*argv, &endptr, 0);
-       if (*endptr) {
-               p_err("can't parse %s as ID", *argv);
-               return -1;
-       }
-       NEXT_ARG();
-
-       fd = get_fd_by_id(id);
-       if (fd < 0) {
-               p_err("can't open object by id (%u): %s", id, strerror(errno));
-               return -1;
-       }
+       fd = get_fd(&argc, &argv);
+       if (fd < 0)
+               return fd;
 
        err = do_pin_fd(fd, *argv);
 
index 724ef9d941d37c9183934855df3e97c8debafcb7..d57972dd0f2b60c38a8682dd7c480758bfb122f8 100644 (file)
@@ -146,7 +146,7 @@ char *get_fdinfo(int fd, const char *key);
 int open_obj_pinned(char *path, bool quiet);
 int open_obj_pinned_any(char *path, enum bpf_obj_type exp_type);
 int mount_bpffs_for_pin(const char *name);
-int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(__u32));
+int do_pin_any(int argc, char **argv, int (*get_fd_by_id)(int *, char ***));
 int do_pin_fd(int fd, const char *name);
 
 int do_prog(int argc, char **arg);
index e6c85680b34d70d810b287926a1a77b4e265c027..693a632f6813be20e2310e408a3beddcf9ee4d82 100644 (file)
@@ -1384,7 +1384,7 @@ static int do_pin(int argc, char **argv)
 {
        int err;
 
-       err = do_pin_any(argc, argv, bpf_map_get_fd_by_id);
+       err = do_pin_any(argc, argv, map_parse_fd);
        if (!err && json_output)
                jsonw_null(json_wtr);
        return err;
index 925c6c66aad77e52a5ec9611a94996b2fd9ffa18..d0966380ad0e7572678692abb88d4d7a9f74675f 100644 (file)
@@ -813,7 +813,7 @@ static int do_pin(int argc, char **argv)
 {
        int err;
 
-       err = do_pin_any(argc, argv, bpf_prog_get_fd_by_id);
+       err = do_pin_any(argc, argv, prog_parse_fd);
        if (!err && json_output)
                jsonw_null(json_wtr);
        return err;