OSDN Git Service

tools: bpftool: add support for loading programs for offload
authorJakub Kicinski <jakub.kicinski@netronome.com>
Tue, 10 Jul 2018 21:42:58 +0000 (14:42 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 11 Jul 2018 20:13:33 +0000 (22:13 +0200)
Extend the bpftool prog load command to also accept "dev"
parameter, which will allow us to load programs onto devices.

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>
tools/bpf/bpftool/Documentation/bpftool-prog.rst
tools/bpf/bpftool/bash-completion/bpftool
tools/bpf/bpftool/prog.c

index 43d34a5..41723c6 100644 (file)
@@ -24,7 +24,7 @@ MAP COMMANDS
 |      **bpftool** **prog dump xlated** *PROG* [{**file** *FILE* | **opcodes** | **visual**}]
 |      **bpftool** **prog dump jited**  *PROG* [{**file** *FILE* | **opcodes**}]
 |      **bpftool** **prog pin** *PROG* *FILE*
-|      **bpftool** **prog load** *OBJ* *FILE*
+|      **bpftool** **prog load** *OBJ* *FILE* [**dev** *NAME*]
 |      **bpftool** **prog help**
 |
 |      *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* }
@@ -64,8 +64,10 @@ DESCRIPTION
 
                  Note: *FILE* must be located in *bpffs* mount.
 
-       **bpftool prog load** *OBJ* *FILE*
+       **bpftool prog load** *OBJ* *FILE* [**dev** *NAME*]
                  Load bpf program from binary *OBJ* and pin as *FILE*.
+                 If **dev** *NAME* is specified program will be loaded onto
+                 given networking device (offload).
 
                  Note: *FILE* must be located in *bpffs* mount.
 
index ce0bc0c..238c2f8 100644 (file)
@@ -99,6 +99,12 @@ _bpftool_get_prog_tags()
         command sed -n 's/.*"tag": "\(.*\)",$/\1/p' )" -- "$cur" ) )
 }
 
+_sysfs_get_netdevs()
+{
+    COMPREPLY+=( $( compgen -W "$( ls /sys/class/net 2>/dev/null )" -- \
+        "$cur" ) )
+}
+
 # For bpftool map update: retrieve type of the map to update.
 _bpftool_map_update_map_type()
 {
@@ -262,8 +268,21 @@ _bpftool()
                     return 0
                     ;;
                 load)
-                    _filedir
-                    return 0
+                    if [[ ${#words[@]} -lt 6 ]]; then
+                        _filedir
+                        return 0
+                    fi
+
+                    case $prev in
+                        dev)
+                            _sysfs_get_netdevs
+                            return 0
+                            ;;
+                        *)
+                            _bpftool_once_attr 'dev'
+                            return 0
+                            ;;
+                    esac
                     ;;
                 *)
                     [[ $prev == $object ]] && \
index a5ef46c..21c74de 100644 (file)
@@ -39,6 +39,7 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
+#include <net/if.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
@@ -681,6 +682,9 @@ static int do_pin(int argc, char **argv)
 
 static int do_load(int argc, char **argv)
 {
+       struct bpf_prog_load_attr attr = {
+               .prog_type      = BPF_PROG_TYPE_UNSPEC,
+       };
        const char *objfile, *pinfile;
        struct bpf_object *obj;
        int prog_fd;
@@ -690,7 +694,34 @@ static int do_load(int argc, char **argv)
        objfile = GET_ARG();
        pinfile = GET_ARG();
 
-       if (bpf_prog_load(objfile, BPF_PROG_TYPE_UNSPEC, &obj, &prog_fd)) {
+       while (argc) {
+               if (is_prefix(*argv, "dev")) {
+                       NEXT_ARG();
+
+                       if (attr.ifindex) {
+                               p_err("offload device already specified");
+                               return -1;
+                       }
+                       if (!REQ_ARGS(1))
+                               return -1;
+
+                       attr.ifindex = if_nametoindex(*argv);
+                       if (!attr.ifindex) {
+                               p_err("unrecognized netdevice '%s': %s",
+                                     *argv, strerror(errno));
+                               return -1;
+                       }
+                       NEXT_ARG();
+               } else {
+                       p_err("expected no more arguments or 'dev', got: '%s'?",
+                             *argv);
+                       return -1;
+               }
+       }
+
+       attr.file = objfile;
+
+       if (bpf_prog_load_xattr(&attr, &obj, &prog_fd)) {
                p_err("failed to load program");
                return -1;
        }
@@ -722,7 +753,7 @@ 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\n"
+               "       %s %s load  OBJ  FILE [dev NAME]\n"
                "       %s %s help\n"
                "\n"
                "       " HELP_SPEC_PROGRAM "\n"