lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
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