Message ID | 20190801081133.13200-3-danieltimlee@gmail.com |
---|---|
State | Changes Requested |
Delegated to: | BPF Maintainers |
Headers | show |
Series | tools: bpftool: add net attach/detach command to attach XDP prog | expand |
On Thu, Aug 1, 2019 at 2:04 AM Daniel T. Lee <danieltimlee@gmail.com> wrote: > > By this commit, using `bpftool net detach`, the attached XDP prog can > be detached. Detaching 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 <danieltimlee@gmail.com> > --- > Changes in v2: > - command 'unload' changed to 'detach' for the consistency > > 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 f3b57660b303..2ae9a613b05c 100644 > --- a/tools/bpf/bpftool/net.c > +++ b/tools/bpf/bpftool/net.c > @@ -281,6 +281,31 @@ static int parse_attach_args(int argc, char **argv, int *progfd, > return 0; > } > > +static int parse_detach_args(int argc, char **argv, > + enum net_attach_type *attach_type, int *ifindex) > +{ > + if (!REQ_ARGS(2)) > + return -EINVAL; > + > + *attach_type = parse_attach_type(*argv); > + if (*attach_type == __MAX_NET_ATTACH_TYPE) { > + p_err("invalid net attach/detach 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_attach_detach_xdp(int *progfd, enum net_attach_type *attach_type, > int *ifindex) > { > @@ -323,6 +348,31 @@ static int do_attach(int argc, char **argv) > return 0; > } > > +static int do_detach(int argc, char **argv) > +{ > + enum net_attach_type attach_type; > + int err, progfd, ifindex; > + > + err = parse_detach_args(argc, argv, &attach_type, &ifindex); > + if (err) > + return err; > + > + /* to detach xdp prog */ > + progfd = -1; > + if (is_prefix("xdp", attach_type_strings[attach_type])) > + err = do_attach_detach_xdp(&progfd, &attach_type, &ifindex); Similar to previous patch, parameters no need to be pointer. > + > + if (err < 0) { > + p_err("link set %s failed", attach_type_strings[attach_type]); > + return -1; Maybe "return err"? > + } > + > + 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 attach PROG LOAD_TYPE <devname>\n" > + " %s %s detach 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 }, > { "attach", do_attach }, > + { "detach", do_detach }, > { "help", do_help }, > { 0 } > }; > -- > 2.20.1 >
On Fri, Aug 2, 2019 at 3:26 PM Y Song <ys114321@gmail.com> wrote: > > On Thu, Aug 1, 2019 at 2:04 AM Daniel T. Lee <danieltimlee@gmail.com> wrote: > > > > By this commit, using `bpftool net detach`, the attached XDP prog can > > be detached. Detaching 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 <danieltimlee@gmail.com> > > --- > > Changes in v2: > > - command 'unload' changed to 'detach' for the consistency > > > > 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 f3b57660b303..2ae9a613b05c 100644 > > --- a/tools/bpf/bpftool/net.c > > +++ b/tools/bpf/bpftool/net.c > > @@ -281,6 +281,31 @@ static int parse_attach_args(int argc, char **argv, int *progfd, > > return 0; > > } > > > > +static int parse_detach_args(int argc, char **argv, > > + enum net_attach_type *attach_type, int *ifindex) > > +{ > > + if (!REQ_ARGS(2)) > > + return -EINVAL; > > + > > + *attach_type = parse_attach_type(*argv); > > + if (*attach_type == __MAX_NET_ATTACH_TYPE) { > > + p_err("invalid net attach/detach 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_attach_detach_xdp(int *progfd, enum net_attach_type *attach_type, > > int *ifindex) > > { > > @@ -323,6 +348,31 @@ static int do_attach(int argc, char **argv) > > return 0; > > } > > > > +static int do_detach(int argc, char **argv) > > +{ > > + enum net_attach_type attach_type; > > + int err, progfd, ifindex; > > + > > + err = parse_detach_args(argc, argv, &attach_type, &ifindex); > > + if (err) > > + return err; > > + > > + /* to detach xdp prog */ > > + progfd = -1; > > + if (is_prefix("xdp", attach_type_strings[attach_type])) > > + err = do_attach_detach_xdp(&progfd, &attach_type, &ifindex); > > Similar to previous patch, parameters no need to be pointer. > I will change the parameter as pass by value. > > + > > + if (err < 0) { > > + p_err("link set %s failed", attach_type_strings[attach_type]); > > + return -1; > > Maybe "return err"? > Hadn't thought of that. I will change to it! > > + } > > + > > + 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 attach PROG LOAD_TYPE <devname>\n" > > + " %s %s detach 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 }, > > { "attach", do_attach }, > > + { "detach", do_detach }, > > { "help", do_help }, > > { 0 } > > }; > > -- > > 2.20.1 > > Thanks for the review!
diff --git a/tools/bpf/bpftool/net.c b/tools/bpf/bpftool/net.c index f3b57660b303..2ae9a613b05c 100644 --- a/tools/bpf/bpftool/net.c +++ b/tools/bpf/bpftool/net.c @@ -281,6 +281,31 @@ static int parse_attach_args(int argc, char **argv, int *progfd, return 0; } +static int parse_detach_args(int argc, char **argv, + enum net_attach_type *attach_type, int *ifindex) +{ + if (!REQ_ARGS(2)) + return -EINVAL; + + *attach_type = parse_attach_type(*argv); + if (*attach_type == __MAX_NET_ATTACH_TYPE) { + p_err("invalid net attach/detach 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_attach_detach_xdp(int *progfd, enum net_attach_type *attach_type, int *ifindex) { @@ -323,6 +348,31 @@ static int do_attach(int argc, char **argv) return 0; } +static int do_detach(int argc, char **argv) +{ + enum net_attach_type attach_type; + int err, progfd, ifindex; + + err = parse_detach_args(argc, argv, &attach_type, &ifindex); + if (err) + return err; + + /* to detach xdp prog */ + progfd = -1; + if (is_prefix("xdp", attach_type_strings[attach_type])) + err = do_attach_detach_xdp(&progfd, &attach_type, &ifindex); + + if (err < 0) { + p_err("link set %s failed", attach_type_strings[attach_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 attach PROG LOAD_TYPE <devname>\n" + " %s %s detach 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 }, { "attach", do_attach }, + { "detach", do_detach }, { "help", do_help }, { 0 } };
By this commit, using `bpftool net detach`, the attached XDP prog can be detached. Detaching 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 <danieltimlee@gmail.com> --- Changes in v2: - command 'unload' changed to 'detach' for the consistency tools/bpf/bpftool/net.c | 55 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-)