diff options
| author | Larysa Zaremba <larysa.zaremba@intel.com> | 2023-05-17 19:01:04 +0300 | 
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2023-05-23 17:55:06 +0300 | 
| commit | f46392ee3dec24066e5fb260d9bd497b4cd4d191 (patch) | |
| tree | 8f2f2fd90d4706c90663dc8758f97259ac1998ec /tools/bpf/bpftool/prog.c | |
| parent | 6cc385d2cdb410fd7a774100bf865ae2da9c709b (diff) | |
| download | linux-f46392ee3dec24066e5fb260d9bd497b4cd4d191.tar.xz | |
bpftool: Specify XDP Hints ifname when loading program
Add ability to specify a network interface used to resolve XDP hints
kfuncs when loading program through bpftool.
Usage:
  bpftool prog load [...] xdpmeta_dev <ifname>
Writing just 'dev <ifname>' instead of 'xdpmeta_dev' is a very probable
mistake that results in not very descriptive errors,
so 'bpftool prog load [...] dev <ifname>' syntax becomes deprecated,
followed by 'bpftool map create [...] dev <ifname>' for consistency.
Now, to offload program, execute:
  bpftool prog load [...] offload_dev <ifname>
To offload map:
  bpftool map create [...] offload_dev <ifname>
'dev <ifname>' still performs offloading in the commands above, but now
triggers a warning and is excluded from bash completion.
'xdpmeta_dev' and 'offload_dev' are mutually exclusive options, because
'xdpmeta_dev' basically makes a program device-bound without loading it
onto the said device. For now, offloaded programs cannot use XDP hints [0],
but if this changes, using 'offload_dev <ifname>' should cover this case.
  [0] https://lore.kernel.org/bpf/a5a636cc-5b03-686f-4be0-000383b05cfc@linux.dev
Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/bpf/20230517160103.1088185-1-larysa.zaremba@intel.com
Diffstat (limited to 'tools/bpf/bpftool/prog.c')
| -rw-r--r-- | tools/bpf/bpftool/prog.c | 51 | 
1 files changed, 43 insertions, 8 deletions
diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index 1f736dc29824..8443a149dd17 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -1517,12 +1517,13 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)  	struct bpf_program *prog = NULL, *pos;  	unsigned int old_map_fds = 0;  	const char *pinmaps = NULL; +	__u32 xdpmeta_ifindex = 0; +	__u32 offload_ifindex = 0;  	bool auto_attach = false;  	struct bpf_object *obj;  	struct bpf_map *map;  	const char *pinfile;  	unsigned int i, j; -	__u32 ifindex = 0;  	const char *file;  	int idx, err; @@ -1614,17 +1615,46 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)  			map_replace[old_map_fds].fd = fd;  			old_map_fds++;  		} else if (is_prefix(*argv, "dev")) { +			p_info("Warning: 'bpftool prog load [...] dev <ifname>' syntax is deprecated.\n" +			       "Going further, please use 'offload_dev <ifname>' to offload program to device.\n" +			       "For applications using XDP hints only, use 'xdpmeta_dev <ifname>'."); +			goto offload_dev; +		} else if (is_prefix(*argv, "offload_dev")) { +offload_dev:  			NEXT_ARG(); -			if (ifindex) { -				p_err("offload device already specified"); +			if (offload_ifindex) { +				p_err("offload_dev already specified"); +				goto err_free_reuse_maps; +			} else if (xdpmeta_ifindex) { +				p_err("xdpmeta_dev and offload_dev are mutually exclusive"); +				goto err_free_reuse_maps; +			} +			if (!REQ_ARGS(1)) +				goto err_free_reuse_maps; + +			offload_ifindex = if_nametoindex(*argv); +			if (!offload_ifindex) { +				p_err("unrecognized netdevice '%s': %s", +				      *argv, strerror(errno)); +				goto err_free_reuse_maps; +			} +			NEXT_ARG(); +		} else if (is_prefix(*argv, "xdpmeta_dev")) { +			NEXT_ARG(); + +			if (xdpmeta_ifindex) { +				p_err("xdpmeta_dev already specified"); +				goto err_free_reuse_maps; +			} else if (offload_ifindex) { +				p_err("xdpmeta_dev and offload_dev are mutually exclusive");  				goto err_free_reuse_maps;  			}  			if (!REQ_ARGS(1))  				goto err_free_reuse_maps; -			ifindex = if_nametoindex(*argv); -			if (!ifindex) { +			xdpmeta_ifindex = if_nametoindex(*argv); +			if (!xdpmeta_ifindex) {  				p_err("unrecognized netdevice '%s': %s",  				      *argv, strerror(errno));  				goto err_free_reuse_maps; @@ -1671,7 +1701,12 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)  				goto err_close_obj;  		} -		bpf_program__set_ifindex(pos, ifindex); +		if (prog_type == BPF_PROG_TYPE_XDP && xdpmeta_ifindex) { +			bpf_program__set_flags(pos, BPF_F_XDP_DEV_BOUND_ONLY); +			bpf_program__set_ifindex(pos, xdpmeta_ifindex); +		} else { +			bpf_program__set_ifindex(pos, offload_ifindex); +		}  		if (bpf_program__type(pos) != prog_type)  			bpf_program__set_type(pos, prog_type);  		bpf_program__set_expected_attach_type(pos, expected_attach_type); @@ -1709,7 +1744,7 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)  	idx = 0;  	bpf_object__for_each_map(map, obj) {  		if (bpf_map__type(map) != BPF_MAP_TYPE_PERF_EVENT_ARRAY) -			bpf_map__set_ifindex(map, ifindex); +			bpf_map__set_ifindex(map, offload_ifindex);  		if (j < old_map_fds && idx == map_replace[j].idx) {  			err = bpf_map__reuse_fd(map, map_replace[j++].fd); @@ -2416,7 +2451,7 @@ static int do_help(int argc, char **argv)  		"       %1$s %2$s dump jited  PROG [{ file FILE | [opcodes] [linum] }]\n"  		"       %1$s %2$s pin   PROG FILE\n"  		"       %1$s %2$s { load | loadall } OBJ  PATH \\\n" -		"                         [type TYPE] [dev NAME] \\\n" +		"                         [type TYPE] [{ offload_dev | xdpmeta_dev } NAME] \\\n"  		"                         [map { idx IDX | name NAME } MAP]\\\n"  		"                         [pinmaps MAP_DIR]\n"  		"                         [autoattach]\n"  | 
