Skip to content

Commit

Permalink
tools: bpftool: add support for loading programs for offload
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jakub Kicinski authored and Daniel Borkmann committed Jul 11, 2018
1 parent 8d1fc3d commit ba6dd67
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 6 deletions.
6 changes: 4 additions & 2 deletions tools/bpf/bpftool/Documentation/bpftool-prog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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* }
Expand Down Expand Up @@ -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.

Expand Down
23 changes: 21 additions & 2 deletions tools/bpf/bpftool/bash-completion/bpftool
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand Down Expand Up @@ -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 ]] && \
Expand Down
35 changes: 33 additions & 2 deletions tools/bpf/bpftool/prog.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit ba6dd67

Please sign in to comment.