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
 
Hash Suite for Android: free password hash cracker in your pocket
[<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