Commit 0bb52b0d authored by Quentin Monnet's avatar Quentin Monnet Committed by Daniel Borkmann
Browse files

tools: bpftool: add "bpftool map freeze" subcommand



Add a new subcommand to freeze maps from user space.

Signed-off-by: default avatarQuentin Monnet <quentin.monnet@netronome.com>
Reviewed-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent c354ff2e
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ MAP COMMANDS
|	**bpftool** **map pop**        *MAP*
|	**bpftool** **map enqueue**    *MAP* **value** *VALUE*
|	**bpftool** **map dequeue**    *MAP*
|	**bpftool** **map freeze**     *MAP*
|	**bpftool** **map help**
|
|	*MAP* := { **id** *MAP_ID* | **pinned** *FILE* }
@@ -127,6 +128,14 @@ DESCRIPTION
	**bpftool map dequeue**  *MAP*
		  Dequeue and print **value** from the queue.

	**bpftool map freeze**  *MAP*
		  Freeze the map as read-only from user space. Entries from a
		  frozen map can not longer be updated or deleted with the
		  **bpf\ ()** system call. This operation is not reversible,
		  and the map remains immutable from user space until its
		  destruction. However, read and write permissions for BPF
		  programs to the map remain unchanged.

	**bpftool map help**
		  Print short help message.

+2 −2
Original line number Diff line number Diff line
@@ -449,7 +449,7 @@ _bpftool()
        map)
            local MAP_TYPE='id pinned'
            case $command in
                show|list|dump|peek|pop|dequeue)
                show|list|dump|peek|pop|dequeue|freeze)
                    case $prev in
                        $command)
                            COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
@@ -638,7 +638,7 @@ _bpftool()
                    [[ $prev == $object ]] && \
                        COMPREPLY=( $( compgen -W 'delete dump getnext help \
                            lookup pin event_pipe show list update create \
                            peek push enqueue pop dequeue' -- \
                            peek push enqueue pop dequeue freeze' -- \
                            "$cur" ) )
                    ;;
            esac
+33 −1
Original line number Diff line number Diff line
@@ -1262,6 +1262,35 @@ exit_free:
	return err;
}

static int do_freeze(int argc, char **argv)
{
	int err, fd;

	if (!REQ_ARGS(2))
		return -1;

	fd = map_parse_fd(&argc, &argv);
	if (fd < 0)
		return -1;

	if (argc) {
		close(fd);
		return BAD_ARG();
	}

	err = bpf_map_freeze(fd);
	close(fd);
	if (err) {
		p_err("failed to freeze map: %s", strerror(errno));
		return err;
	}

	if (json_output)
		jsonw_null(json_wtr);

	return 0;
}

static int do_help(int argc, char **argv)
{
	if (json_output) {
@@ -1286,6 +1315,7 @@ static int do_help(int argc, char **argv)
		"       %s %s pop        MAP\n"
		"       %s %s enqueue    MAP value VALUE\n"
		"       %s %s dequeue    MAP\n"
		"       %s %s freeze     MAP\n"
		"       %s %s help\n"
		"\n"
		"       " HELP_SPEC_MAP "\n"
@@ -1304,7 +1334,8 @@ static int do_help(int argc, char **argv)
		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2]);
		bin_name, argv[-2], bin_name, argv[-2], bin_name, argv[-2],
		bin_name, argv[-2]);

	return 0;
}
@@ -1326,6 +1357,7 @@ static const struct cmd cmds[] = {
	{ "enqueue",	do_update },
	{ "pop",	do_pop_dequeue },
	{ "dequeue",	do_pop_dequeue },
	{ "freeze",	do_freeze },
	{ 0 }
};