Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba6dd679 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by Daniel Borkmann
Browse files

tools: bpftool: add support for loading programs for offload



Extend the bpftool prog load command to also accept "dev"
parameter, which will allow us to load programs onto devices.

Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarQuentin Monnet <quentin.monnet@netronome.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 8d1fc3de
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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.

+21 −2
Original line number Diff line number Diff line
@@ -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)
                    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 ]] && \
+33 −2
Original line number Diff line number Diff line
@@ -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"