From 077bb1803cf98deea2f1a8be40f2590120bfb4b5 Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Sat, 13 May 2017 02:32:34 +0200 Subject: [PATCH 1/2] bpf: update printing of generic xdp mode Follow-up to d67b9cd28c1d ("xdp: refine xdp api with regards to generic xdp") in order to update the XDP dumping part. Signed-off-by: Daniel Borkmann --- ip/iplink_xdp.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/ip/iplink_xdp.c b/ip/iplink_xdp.c index a1380eec..98503fab 100644 --- a/ip/iplink_xdp.c +++ b/ip/iplink_xdp.c @@ -79,17 +79,20 @@ int xdp_parse(int *argc, char ***argv, struct iplink_req *req, bool generic) void xdp_dump(FILE *fp, struct rtattr *xdp) { struct rtattr *tb[IFLA_XDP_MAX + 1]; - __u32 flags = 0; + __u8 mode; parse_rtattr_nested(tb, IFLA_XDP_MAX, xdp); - if (!tb[IFLA_XDP_ATTACHED] || - !rta_getattr_u8(tb[IFLA_XDP_ATTACHED])) + if (!tb[IFLA_XDP_ATTACHED]) return; - if (tb[IFLA_XDP_FLAGS]) - flags = rta_getattr_u32(tb[IFLA_XDP_FLAGS]); - - fprintf(fp, "xdp%s ", - flags & XDP_FLAGS_SKB_MODE ? "generic" : ""); + mode = rta_getattr_u8(tb[IFLA_XDP_ATTACHED]); + if (mode == XDP_ATTACHED_NONE) + return; + else if (mode == XDP_ATTACHED_DRV) + fprintf(fp, "xdp "); + else if (mode == XDP_ATTACHED_SKB) + fprintf(fp, "xdpgeneric "); + else + fprintf(fp, "xdp[%u] ", mode); } From 218560185d2d0aa3b3ac6ab166a7e6bfee39f5e5 Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Sat, 13 May 2017 02:32:35 +0200 Subject: [PATCH 2/2] bpf: dump error to the user when retrieving pinned prog fails I noticed we currently don't dump an error message when a pinned program couldn't be retrieved, thus add a hint to the user. Signed-off-by: Daniel Borkmann --- lib/bpf.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/bpf.c b/lib/bpf.c index 04ee1ab9..ae4d97dc 100644 --- a/lib/bpf.c +++ b/lib/bpf.c @@ -648,6 +648,16 @@ static int bpf_obj_get(const char *pathname, enum bpf_prog_type type) return bpf(BPF_OBJ_GET, &attr, sizeof(attr)); } +static int bpf_obj_pinned(const char *pathname, enum bpf_prog_type type) +{ + int prog_fd = bpf_obj_get(pathname, type); + + if (prog_fd < 0) + fprintf(stderr, "Couldn\'t retrieve pinned program \'%s\': %s\n", + pathname, strerror(errno)); + return prog_fd; +} + enum bpf_mode { CBPF_BYTECODE, CBPF_FILE, @@ -750,7 +760,7 @@ static int bpf_parse(enum bpf_prog_type *type, enum bpf_mode *mode, else if (*mode == EBPF_OBJECT) ret = bpf_obj_open(file, *type, section, verbose); else if (*mode == EBPF_PINNED) - ret = bpf_obj_get(file, *type); + ret = bpf_obj_pinned(file, *type); else return -1;