By this commit, using `bpftool net unload`, the loaded XDP prog can be unloaded. Unloading the BPF prog will be done through libbpf 'bpf_set_link_xdp_fd' with the progfd set to -1.
Signed-off-by: Daniel T. Lee <danieltim...@gmail.com> --- tools/bpf/bpftool/net.c | 55 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/tools/bpf/bpftool/net.c b/tools/bpf/bpftool/net.c index d3a4f18b5b95..9d353b6e7d6d 100644 --- a/tools/bpf/bpftool/net.c +++ b/tools/bpf/bpftool/net.c @@ -281,6 +281,31 @@ static int parse_load_args(int argc, char **argv, int *progfd, return 0; } +static int parse_unload_args(int argc, char **argv, + enum net_load_type *load_type, int *ifindex) +{ + if (!REQ_ARGS(2)) + return -EINVAL; + + *load_type = parse_load_type(*argv); + if (*load_type == __MAX_NET_LOAD_TYPE) { + p_err("invalid net load/unload type"); + return -EINVAL; + } + + NEXT_ARG(); + if (!REQ_ARGS(1)) + return -EINVAL; + + *ifindex = if_nametoindex(*argv); + if (!*ifindex) { + p_err("Invalid ifname"); + return -EINVAL; + } + + return 0; +} + static int do_load_unload_xdp(int *progfd, enum net_load_type *load_type, int *ifindex) { @@ -323,6 +348,31 @@ static int do_load(int argc, char **argv) return 0; } +static int do_unload(int argc, char **argv) +{ + enum net_load_type load_type; + int err, progfd, ifindex; + + err = parse_unload_args(argc, argv, &load_type, &ifindex); + if (err) + return err; + + /* to unload xdp prog */ + progfd = -1; + if (is_prefix("xdp", load_type_strings[load_type])) + err = do_load_unload_xdp(&progfd, &load_type, &ifindex); + + if (err < 0) { + p_err("link set %s failed", load_type_strings[load_type]); + return -1; + } + + if (json_output) + jsonw_null(json_wtr); + + return 0; +} + static int do_show(int argc, char **argv) { struct bpf_attach_info attach_info = {}; @@ -406,6 +456,7 @@ static int do_help(int argc, char **argv) fprintf(stderr, "Usage: %s %s { show | list } [dev <devname>]\n" " %s %s load PROG LOAD_TYPE <devname>\n" + " %s %s unload LOAD_TYPE <devname>\n" " %s %s help\n" "\n" " " HELP_SPEC_PROGRAM "\n" @@ -415,7 +466,8 @@ static int do_help(int argc, char **argv) " to dump program attachments. For program types\n" " sk_{filter,skb,msg,reuseport} and lwt/seg6, please\n" " consult iproute2.\n", - 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; } @@ -424,6 +476,7 @@ static const struct cmd cmds[] = { { "show", do_show }, { "list", do_show }, { "load", do_load }, + { "unload", do_unload }, { "help", do_help }, { 0 } }; -- 2.20.1