diff options
Diffstat (limited to 'tools/bpf/bpftool/net.c')
| -rw-r--r-- | tools/bpf/bpftool/net.c | 54 | 
1 files changed, 54 insertions, 0 deletions
diff --git a/tools/bpf/bpftool/net.c b/tools/bpf/bpftool/net.c index db0e7de49d49..67e99c56bc88 100644 --- a/tools/bpf/bpftool/net.c +++ b/tools/bpf/bpftool/net.c @@ -3,6 +3,7 @@  #define _GNU_SOURCE  #include <errno.h> +#include <fcntl.h>  #include <stdlib.h>  #include <string.h>  #include <unistd.h> @@ -12,6 +13,8 @@  #include <linux/rtnetlink.h>  #include <linux/tc_act/tc_bpf.h>  #include <sys/socket.h> +#include <sys/stat.h> +#include <sys/types.h>  #include <bpf.h>  #include <nlattr.h> @@ -48,6 +51,10 @@ struct bpf_filter_t {  	int		ifindex;  }; +struct bpf_attach_info { +	__u32 flow_dissector_id; +}; +  static int dump_link_nlmsg(void *cookie, void *msg, struct nlattr **tb)  {  	struct bpf_netdev_t *netinfo = cookie; @@ -180,8 +187,45 @@ out:  	return 0;  } +static int query_flow_dissector(struct bpf_attach_info *attach_info) +{ +	__u32 attach_flags; +	__u32 prog_ids[1]; +	__u32 prog_cnt; +	int err; +	int fd; + +	fd = open("/proc/self/ns/net", O_RDONLY); +	if (fd < 0) { +		p_err("can't open /proc/self/ns/net: %d", +		      strerror(errno)); +		return -1; +	} +	prog_cnt = ARRAY_SIZE(prog_ids); +	err = bpf_prog_query(fd, BPF_FLOW_DISSECTOR, 0, +			     &attach_flags, prog_ids, &prog_cnt); +	close(fd); +	if (err) { +		if (errno == EINVAL) { +			/* Older kernel's don't support querying +			 * flow dissector programs. +			 */ +			errno = 0; +			return 0; +		} +		p_err("can't query prog: %s", strerror(errno)); +		return -1; +	} + +	if (prog_cnt == 1) +		attach_info->flow_dissector_id = prog_ids[0]; + +	return 0; +} +  static int do_show(int argc, char **argv)  { +	struct bpf_attach_info attach_info = {};  	int i, sock, ret, filter_idx = -1;  	struct bpf_netdev_t dev_array;  	unsigned int nl_pid; @@ -199,6 +243,10 @@ static int do_show(int argc, char **argv)  		usage();  	} +	ret = query_flow_dissector(&attach_info); +	if (ret) +		return -1; +  	sock = libbpf_netlink_open(&nl_pid);  	if (sock < 0) {  		fprintf(stderr, "failed to open netlink sock\n"); @@ -227,6 +275,12 @@ static int do_show(int argc, char **argv)  		}  		NET_END_ARRAY("\n");  	} + +	NET_START_ARRAY("flow_dissector", "%s:\n"); +	if (attach_info.flow_dissector_id > 0) +		NET_DUMP_UINT("id", "id %u", attach_info.flow_dissector_id); +	NET_END_ARRAY("\n"); +  	NET_END_OBJECT;  	if (json_output)  		jsonw_end_array(json_wtr);  |