[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190121094650.77df960a@maciek-lenovo>
Date: Mon, 21 Jan 2019 09:46:50 +0100
From: Maciej Fijałkowski
<maciejromanfijalkowski@...il.com>
To: Jesper Dangaard Brouer <brouer@...hat.com>
Cc: Daniel Borkmann <borkmann@...earbox.net>,
Björn Töpel
<bjorn.topel@...el.com>,
Alexei Starovoitov <alexei.starovoitov@...il.com>,
Jakub Kicinski <jakub.kicinski@...ronome.com>,
Jean Hsiao <jhsiao@...hat.com>, netdev <netdev@...r.kernel.org>
Subject: Re: [PATCH bpf-next 6/6] samples: bpf: Check the prog id before
exiting
Dnia 2019-01-17, o godz. 12:36:50
Jesper Dangaard Brouer <brouer@...hat.com> napisał(a):
> On Thu, 17 Jan 2019 02:01:15 +0100
> Maciej Fijalkowski <maciejromanfijalkowski@...il.com> wrote:
>
> > Check the program id within the signal handler on polling xdp samples
> > that were previously converted to libbpf usage. Avoid the situation of
> > unloading the program that was not attached by sample that is exiting.
>
> I love that you are doing this work! QA have already hit these kind of
> issues, and I've had to deal with figuring out why certain combination
> of QA testing was failing.
>
Glad to hear that! This actually also came from our validation engineers, so it
seems this is a common issue. I have also seen some old email threads where you
were mentioning this problem.
> Bjørn and I are working on hashing out XDP programs per RXQ see[1]. I
> do think that this API:
> bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
>
> Will be will be compatible with our proposed semantic[1], as this reads
> the "global-prog" (and later if match unloads the "global-prog").
>
> [1]
> https://github.com/xdp-project/xdp-project/blob/master/areas/core/xdp_per_rxq01.org#interface-semantics
>
> > Signed-off-by: Maciej Fijalkowski <maciejromanfijalkowski@...il.com>
> > Reviewed-by: Jakub Kicinski <jakub.kicinski@...ronome.com>
> > ---
> > samples/bpf/xdp1_user.c | 19 +++++++++++++++-
> > samples/bpf/xdp_adjust_tail_user.c | 25 +++++++++++++++++----
> > samples/bpf/xdp_redirect_map_user.c | 37 ++++++++++++++++++++++++++++---
> > samples/bpf/xdp_redirect_user.c | 38 +++++++++++++++++++++++++++++---
> > samples/bpf/xdp_router_ipv4_user.c | 43
> > ++++++++++++++++++++++--------------- samples/bpf/xdp_rxq_info_user.c |
> > 28 +++++++++++++++++++----- samples/bpf/xdp_sample_pkts_user.c | 29
> > ++++++++++++++++++++----- samples/bpf/xdp_tx_iptunnel_user.c | 23
> > +++++++++++++++++--- samples/bpf/xdpsock_user.c | 18
> > +++++++++++++++- 9 files changed, 218 insertions(+), 42 deletions(-)
> >
> > diff --git a/samples/bpf/xdp1_user.c b/samples/bpf/xdp1_user.c
> > index 505bce207165..3acc0e1d589a 100644
> > --- a/samples/bpf/xdp1_user.c
> > +++ b/samples/bpf/xdp1_user.c
> > @@ -23,10 +23,17 @@
> >
> > static int ifindex;
> > static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > +static __u32 prog_id;
> >
> > static void int_exit(int sig)
> > {
> > - bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > + __u32 curr_prog_id;
> > +
> > + bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
> > + if (prog_id == curr_prog_id)
> > + bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > + else
> > + printf("program on interface changed, not removing\n");
> > exit(0);
> > }
> >
> > @@ -74,11 +81,14 @@ int main(int argc, char **argv)
> > struct bpf_prog_load_attr prog_load_attr = {
> > .prog_type = BPF_PROG_TYPE_XDP,
> > };
> > + struct bpf_prog_info info = {};
> > + __u32 info_len = sizeof(info);
> > const char *optstr = "FSN";
> > int prog_fd, map_fd, opt;
> > struct bpf_object *obj;
> > struct bpf_map *map;
> > char filename[256];
> > + int err;
> >
> > while ((opt = getopt(argc, argv, optstr)) != -1) {
> > switch (opt) {
> > @@ -139,6 +149,13 @@ int main(int argc, char **argv)
> > return 1;
> > }
> >
> > + err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > + if (err) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return err;
> > + }
> > + prog_id = info.id;
> > +
> > poll_stats(map_fd, 2);
> >
> > return 0;
> > diff --git a/samples/bpf/xdp_adjust_tail_user.c
> > b/samples/bpf/xdp_adjust_tail_user.c index 049bddf7778b..01fc700d6a0c 100644
> > --- a/samples/bpf/xdp_adjust_tail_user.c
> > +++ b/samples/bpf/xdp_adjust_tail_user.c
> > @@ -25,11 +25,19 @@
> >
> > static int ifindex = -1;
> > static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > +static __u32 prog_id;
> >
> > static void int_exit(int sig)
> > {
> > - if (ifindex > -1)
> > - bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > + __u32 curr_prog_id;
> > +
> > + if (ifindex > -1) {
> > + bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
> > + if (prog_id == curr_prog_id)
> > + bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > + else
> > + printf("program on interface changed, not
> > removing\n");
> > + }
> > exit(0);
> > }
> >
> > @@ -72,11 +80,14 @@ int main(int argc, char **argv)
> > };
> > unsigned char opt_flags[256] = {};
> > const char *optstr = "i:T:SNFh";
> > + struct bpf_prog_info info = {};
> > + __u32 info_len = sizeof(info);
> > unsigned int kill_after_s = 0;
> > int i, prog_fd, map_fd, opt;
> > struct bpf_object *obj;
> > struct bpf_map *map;
> > char filename[256];
> > + int err;
> >
> > for (i = 0; i < strlen(optstr); i++)
> > if (optstr[i] != 'h' && 'a' <= optstr[i] && optstr[i] <=
> > 'z') @@ -146,9 +157,15 @@ int main(int argc, char **argv)
> > return 1;
> > }
> >
> > - poll_stats(map_fd, kill_after_s);
> > + err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > + if (err) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return 1;
> > + }
> > + prog_id = info.id;
> >
> > - bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > + poll_stats(map_fd, kill_after_s);
> > + int_exit(0);
> >
> > return 0;
> > }
> > diff --git a/samples/bpf/xdp_redirect_map_user.c
> > b/samples/bpf/xdp_redirect_map_user.c index 470e1a7e8810..cae7b9cead74
> > 100644 --- a/samples/bpf/xdp_redirect_map_user.c
> > +++ b/samples/bpf/xdp_redirect_map_user.c
> > @@ -29,15 +29,29 @@
> > static int ifindex_in;
> > static int ifindex_out;
> > static bool ifindex_out_xdp_dummy_attached = true;
> > +static __u32 prog_id;
> > +static __u32 dummy_prog_id;
> >
> > static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > static int rxcnt_map_fd;
> >
> > static void int_exit(int sig)
> > {
> > - bpf_set_link_xdp_fd(ifindex_in, -1, xdp_flags);
> > - if (ifindex_out_xdp_dummy_attached)
> > - bpf_set_link_xdp_fd(ifindex_out, -1, xdp_flags);
> > + __u32 curr_prog_id;
> > +
> > + bpf_get_link_xdp_id(ifindex_in, &curr_prog_id, xdp_flags);
> > + if (prog_id == curr_prog_id)
> > + bpf_set_link_xdp_fd(ifindex_in, -1, xdp_flags);
> > + else
> > + printf("program on iface IN changed, not removing\n");
> > +
> > + if (ifindex_out_xdp_dummy_attached) {
> > + bpf_get_link_xdp_id(ifindex_out, &curr_prog_id, xdp_flags);
> > + if (dummy_prog_id == curr_prog_id)
> > + bpf_set_link_xdp_fd(ifindex_out, -1, xdp_flags);
> > + else
> > + printf("program on iface OUT changed, not
> > removing\n");
> > + }
> > exit(0);
> > }
> >
> > @@ -82,6 +96,8 @@ int main(int argc, char **argv)
> > .prog_type = BPF_PROG_TYPE_XDP,
> > };
> > struct bpf_program *prog, *dummy_prog;
> > + struct bpf_prog_info info = {};
> > + __u32 info_len = sizeof(info);
> > int prog_fd, dummy_prog_fd;
> > const char *optstr = "FSN";
> > struct bpf_object *obj;
> > @@ -153,6 +169,13 @@ int main(int argc, char **argv)
> > return 1;
> > }
> >
> > + ret = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > + if (ret) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return ret;
> > + }
> > + prog_id = info.id;
> > +
> > /* Loading dummy XDP prog on out-device */
> > if (bpf_set_link_xdp_fd(ifindex_out, dummy_prog_fd,
> > (xdp_flags | XDP_FLAGS_UPDATE_IF_NOEXIST)) <
> > 0) { @@ -160,6 +183,14 @@ int main(int argc, char **argv)
> > ifindex_out_xdp_dummy_attached = false;
> > }
> >
> > + memset(&info, 0, sizeof(info));
> > + ret = bpf_obj_get_info_by_fd(dummy_prog_fd, &info, &info_len);
> > + if (ret) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return ret;
> > + }
> > + dummy_prog_id = info.id;
> > +
> > signal(SIGINT, int_exit);
> > signal(SIGTERM, int_exit);
> >
> > diff --git a/samples/bpf/xdp_redirect_user.c
> > b/samples/bpf/xdp_redirect_user.c index be6058cda97c..230b1e5e7f61 100644
> > --- a/samples/bpf/xdp_redirect_user.c
> > +++ b/samples/bpf/xdp_redirect_user.c
> > @@ -29,15 +29,30 @@
> > static int ifindex_in;
> > static int ifindex_out;
> > static bool ifindex_out_xdp_dummy_attached = true;
> > +static __u32 prog_id;
> > +static __u32 dummy_prog_id;
> >
> > static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > static int rxcnt_map_fd;
> >
> > static void int_exit(int sig)
> > {
> > - bpf_set_link_xdp_fd(ifindex_in, -1, xdp_flags);
> > - if (ifindex_out_xdp_dummy_attached)
> > - bpf_set_link_xdp_fd(ifindex_out, -1, xdp_flags);
> > + __u32 curr_prog_id;
> > +
> > + bpf_get_link_xdp_id(ifindex_in, &curr_prog_id, xdp_flags);
> > + if (prog_id == curr_prog_id)
> > + bpf_set_link_xdp_fd(ifindex_in, -1, xdp_flags);
> > + else
> > + printf("program on iface IN changed, not removing\n");
> > +
> > + if (ifindex_out_xdp_dummy_attached) {
> > + bpf_get_link_xdp_id(ifindex_out, &curr_prog_id,
> > + xdp_flags);
> > + if (dummy_prog_id == curr_prog_id)
> > + bpf_set_link_xdp_fd(ifindex_out, -1, xdp_flags);
> > + else
> > + printf("program on iface OUT changed, not
> > removing\n");
> > + }
> > exit(0);
> > }
> >
> > @@ -84,6 +99,8 @@ int main(int argc, char **argv)
> > };
> > struct bpf_program *prog, *dummy_prog;
> > int prog_fd, tx_port_map_fd, opt;
> > + struct bpf_prog_info info = {};
> > + __u32 info_len = sizeof(info);
> > const char *optstr = "FSN";
> > struct bpf_object *obj;
> > char filename[256];
> > @@ -154,6 +171,13 @@ int main(int argc, char **argv)
> > return 1;
> > }
> >
> > + ret = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > + if (ret) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return ret;
> > + }
> > + prog_id = info.id;
> > +
> > /* Loading dummy XDP prog on out-device */
> > if (bpf_set_link_xdp_fd(ifindex_out, dummy_prog_fd,
> > (xdp_flags | XDP_FLAGS_UPDATE_IF_NOEXIST)) <
> > 0) { @@ -161,6 +185,14 @@ int main(int argc, char **argv)
> > ifindex_out_xdp_dummy_attached = false;
> > }
> >
> > + memset(&info, 0, sizeof(info));
> > + ret = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > + if (ret) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return ret;
> > + }
> > + dummy_prog_id = info.id;
> > +
> > signal(SIGINT, int_exit);
> > signal(SIGTERM, int_exit);
> >
> > diff --git a/samples/bpf/xdp_router_ipv4_user.c
> > b/samples/bpf/xdp_router_ipv4_user.c index 208d6a996478..3991bd42b20c 100644
> > --- a/samples/bpf/xdp_router_ipv4_user.c
> > +++ b/samples/bpf/xdp_router_ipv4_user.c
> > @@ -30,7 +30,8 @@
> >
> > int sock, sock_arp, flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > static int total_ifindex;
> > -int *ifindex_list;
> > +static int *ifindex_list;
> > +static __u32 *prog_id_list;
> > char buf[8192];
> > static int lpm_map_fd;
> > static int rxcnt_map_fd;
> > @@ -41,23 +42,26 @@ static int tx_port_map_fd;
> > static int get_route_table(int rtm_family);
> > static void int_exit(int sig)
> > {
> > + __u32 prog_id;
> > int i = 0;
> >
> > - for (i = 0; i < total_ifindex; i++)
> > - bpf_set_link_xdp_fd(ifindex_list[i], -1, flags);
> > + for (i = 0; i < total_ifindex; i++) {
> > + bpf_get_link_xdp_id(ifindex_list[i], &prog_id, flags);
> > + if (prog_id_list[i] == prog_id)
> > + bpf_set_link_xdp_fd(ifindex_list[i], -1, flags);
> > + else
> > + printf("program on iface %d changed, not
> > removing\n",
> > + ifindex_list[i]);
> > + }
> > exit(0);
> > }
> >
> > static void close_and_exit(int sig)
> > {
> > - int i = 0;
> > -
> > close(sock);
> > close(sock_arp);
> >
> > - for (i = 0; i < total_ifindex; i++)
> > - bpf_set_link_xdp_fd(ifindex_list[i], -1, flags);
> > - exit(0);
> > + int_exit(0);
> > }
> >
> > /* Get the mac address of the interface given interface name */
> > @@ -186,13 +190,8 @@ static void read_route(struct nlmsghdr *nh, int nll)
> > route.iface_name = alloca(sizeof(char *) * IFNAMSIZ);
> > route.iface_name = if_indextoname(route.iface,
> > route.iface_name); route.mac = getmac(route.iface_name);
> > - if (route.mac == -1) {
> > - int i = 0;
> > -
> > - for (i = 0; i < total_ifindex; i++)
> > - bpf_set_link_xdp_fd(ifindex_list[i], -1,
> > flags);
> > - exit(0);
> > - }
> > + if (route.mac == -1)
> > + int_exit(0);
> > assert(bpf_map_update_elem(tx_port_map_fd,
> > &route.iface, &route.iface, 0)
> > == 0); if (rtm_family == AF_INET) {
> > @@ -625,12 +624,14 @@ int main(int ac, char **argv)
> > struct bpf_prog_load_attr prog_load_attr = {
> > .prog_type = BPF_PROG_TYPE_XDP,
> > };
> > + struct bpf_prog_info info = {};
> > + __u32 info_len = sizeof(info);
> > const char *optstr = "SF";
> > struct bpf_object *obj;
> > char filename[256];
> > char **ifname_list;
> > int prog_fd, opt;
> > - int i = 1;
> > + int err, i = 1;
> >
> > snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
> > prog_load_attr.file = filename;
> > @@ -687,7 +688,7 @@ int main(int ac, char **argv)
> > return 1;
> > }
> >
> > - ifindex_list = (int *)malloc(total_ifindex * sizeof(int *));
> > + ifindex_list = (int *)calloc(total_ifindex, sizeof(int *));
> > for (i = 0; i < total_ifindex; i++) {
> > ifindex_list[i] = if_nametoindex(ifname_list[i]);
> > if (!ifindex_list[i]) {
> > @@ -696,6 +697,7 @@ int main(int ac, char **argv)
> > return 1;
> > }
> > }
> > + prog_id_list = (__u32 *)calloc(total_ifindex, sizeof(__u32 *));
> > for (i = 0; i < total_ifindex; i++) {
> > if (bpf_set_link_xdp_fd(ifindex_list[i], prog_fd, flags) <
> > 0) { printf("link set xdp fd failed\n");
> > @@ -706,6 +708,13 @@ int main(int ac, char **argv)
> >
> > return 1;
> > }
> > + err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > + if (err) {
> > + printf("can't get prog info - %s\n",
> > strerror(errno));
> > + return err;
> > + }
> > + prog_id_list[i] = info.id;
> > + memset(&info, 0, sizeof(info));
> > printf("Attached to %d\n", ifindex_list[i]);
> > }
> > signal(SIGINT, int_exit);
> > diff --git a/samples/bpf/xdp_rxq_info_user.c
> > b/samples/bpf/xdp_rxq_info_user.c index e7a98c2a440f..7602a54eeba6 100644
> > --- a/samples/bpf/xdp_rxq_info_user.c
> > +++ b/samples/bpf/xdp_rxq_info_user.c
> > @@ -29,6 +29,7 @@ static const char *__doc__ = " XDP RX-queue info extract
> > example\n\n" static int ifindex = -1;
> > static char ifname_buf[IF_NAMESIZE];
> > static char *ifname;
> > +static __u32 prog_id;
> >
> > static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> >
> > @@ -58,11 +59,19 @@ static const struct option long_options[] = {
> >
> > static void int_exit(int sig)
> > {
> > - fprintf(stderr,
> > - "Interrupted: Removing XDP program on ifindex:%d
> > device:%s\n",
> > - ifindex, ifname);
> > - if (ifindex > -1)
> > - bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > + __u32 curr_prog_id;
> > +
> > + if (ifindex > -1) {
> > + bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
> > + if (prog_id == curr_prog_id) {
> > + fprintf(stderr,
> > + "Interrupted: Removing XDP program on
> > ifindex:%d device:%s\n",
> > + ifindex, ifname);
> > + bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > + } else {
> > + printf("program on interface changed, not
> > removing\n");
> > + }
> > + }
> > exit(EXIT_OK);
> > }
> >
> > @@ -447,6 +456,8 @@ int main(int argc, char **argv)
> > struct bpf_prog_load_attr prog_load_attr = {
> > .prog_type = BPF_PROG_TYPE_XDP,
> > };
> > + struct bpf_prog_info info = {};
> > + __u32 info_len = sizeof(info);
> > int prog_fd, map_fd, opt, err;
> > bool use_separators = true;
> > struct config cfg = { 0 };
> > @@ -580,6 +591,13 @@ int main(int argc, char **argv)
> > return EXIT_FAIL_XDP;
> > }
> >
> > + err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > + if (err) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return err;
> > + }
> > + prog_id = info.id;
> > +
> > stats_poll(interval, action, cfg_options);
> > return EXIT_OK;
> > }
> > diff --git a/samples/bpf/xdp_sample_pkts_user.c
> > b/samples/bpf/xdp_sample_pkts_user.c index 362ad35b524d..dcf78fbc371e 100644
> > --- a/samples/bpf/xdp_sample_pkts_user.c
> > +++ b/samples/bpf/xdp_sample_pkts_user.c
> > @@ -24,25 +24,44 @@ static int pmu_fds[MAX_CPUS], if_idx;
> > static struct perf_event_mmap_page *headers[MAX_CPUS];
> > static char *if_name;
> > static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > +static __u32 prog_id;
> >
> > static int do_attach(int idx, int fd, const char *name)
> > {
> > + struct bpf_prog_info info = {};
> > + __u32 info_len = sizeof(info);
> > int err;
> >
> > err = bpf_set_link_xdp_fd(idx, fd, xdp_flags);
> > - if (err < 0)
> > + if (err < 0) {
> > printf("ERROR: failed to attach program to %s\n", name);
> > + return err;
> > + }
> > +
> > + err = bpf_obj_get_info_by_fd(fd, &info, &info_len);
> > + if (err) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return err;
> > + }
> > + prog_id = info.id;
> >
> > return err;
> > }
> >
> > static int do_detach(int idx, const char *name)
> > {
> > - int err;
> > + __u32 curr_prog_id;
> > + int err = 0;
> >
> > - err = bpf_set_link_xdp_fd(idx, -1, 0);
> > - if (err < 0)
> > - printf("ERROR: failed to detach program from %s\n", name);
> > + bpf_get_link_xdp_id(idx, &curr_prog_id, 0);
> > +
> > + if (prog_id == curr_prog_id) {
> > + err = bpf_set_link_xdp_fd(idx, -1, 0);
> > + if (err < 0)
> > + printf("ERROR: failed to detach prog from %s\n",
> > name);
> > + } else {
> > + printf("program on interface changed, not removing\n");
> > + }
> >
> > return err;
> > }
> > diff --git a/samples/bpf/xdp_tx_iptunnel_user.c
> > b/samples/bpf/xdp_tx_iptunnel_user.c index e3de60930d27..4c1b9b14aa79 100644
> > --- a/samples/bpf/xdp_tx_iptunnel_user.c
> > +++ b/samples/bpf/xdp_tx_iptunnel_user.c
> > @@ -27,11 +27,19 @@
> > static int ifindex = -1;
> > static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST;
> > static int rxcnt_map_fd;
> > +static __u32 prog_id;
> >
> > static void int_exit(int sig)
> > {
> > - if (ifindex > -1)
> > - bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > + __u32 curr_prog_id;
> > +
> > + if (ifindex > -1) {
> > + bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags);
> > + if (prog_id == curr_prog_id)
> > + bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > + else
> > + printf("program on interface changed, not
> > removing\n");
> > + }
> > exit(0);
> > }
> >
> > @@ -148,13 +156,15 @@ int main(int argc, char **argv)
> > int min_port = 0, max_port = 0, vip2tnl_map_fd;
> > const char *optstr = "i:a:p:s:d:m:T:P:FSNh";
> > unsigned char opt_flags[256] = {};
> > + struct bpf_prog_info info = {};
> > + __u32 info_len = sizeof(info);
> > unsigned int kill_after_s = 0;
> > struct iptnl_info tnl = {};
> > struct bpf_object *obj;
> > struct vip vip = {};
> > char filename[256];
> > int opt, prog_fd;
> > - int i;
> > + int i, err;
> >
> > tnl.family = AF_UNSPEC;
> > vip.protocol = IPPROTO_TCP;
> > @@ -276,6 +286,13 @@ int main(int argc, char **argv)
> > return 1;
> > }
> >
> > + err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > + if (err) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return err;
> > + }
> > + prog_id = info.id;
> > +
> > poll_stats(kill_after_s);
> >
> > bpf_set_link_xdp_fd(ifindex, -1, xdp_flags);
> > diff --git a/samples/bpf/xdpsock_user.c b/samples/bpf/xdpsock_user.c
> > index 188723784768..d7fb74d9a223 100644
> > --- a/samples/bpf/xdpsock_user.c
> > +++ b/samples/bpf/xdpsock_user.c
> > @@ -76,6 +76,7 @@ static int opt_poll;
> > static int opt_shared_packet_buffer;
> > static int opt_interval = 1;
> > static u32 opt_xdp_bind_flags;
> > +static __u32 prog_id;
> >
> > struct xdp_umem_uqueue {
> > u32 cached_prod;
> > @@ -631,9 +632,15 @@ static void *poller(void *arg)
> >
> > static void int_exit(int sig)
> > {
> > + __u32 curr_prog_id;
> > +
> > (void)sig;
> > dump_stats();
> > - bpf_set_link_xdp_fd(opt_ifindex, -1, opt_xdp_flags);
> > + bpf_get_link_xdp_id(opt_ifindex, &curr_prog_id, opt_xdp_flags);
> > + if (prog_id == curr_prog_id)
> > + bpf_set_link_xdp_fd(opt_ifindex, -1, opt_xdp_flags);
> > + else
> > + printf("program on interface changed, not removing\n");
> > exit(EXIT_SUCCESS);
> > }
> >
> > @@ -907,6 +914,8 @@ int main(int argc, char **argv)
> > .prog_type = BPF_PROG_TYPE_XDP,
> > };
> > int prog_fd, qidconf_map, xsks_map;
> > + struct bpf_prog_info info = {};
> > + __u32 info_len = sizeof(info);
> > struct bpf_object *obj;
> > char xdp_filename[256];
> > struct bpf_map *map;
> > @@ -953,6 +962,13 @@ int main(int argc, char **argv)
> > exit(EXIT_FAILURE);
> > }
> >
> > + ret = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len);
> > + if (ret) {
> > + printf("can't get prog info - %s\n", strerror(errno));
> > + return 1;
> > + }
> > + prog_id = info.id;
> > +
> > ret = bpf_map_update_elem(qidconf_map, &key, &opt_queue, 0);
> > if (ret) {
> > fprintf(stderr, "ERROR: bpf_map_update_elem qidconf\n");
>
>
>
Powered by blists - more mailing lists