From: Jakub Kicinski Date: Fri, 24 Nov 2017 02:12:08 +0000 (-0800) Subject: iplink: communicate ifindex for xdp offload X-Git-Tag: v4.15.0~110 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4f2eb14f71bfb091228f4a9979c01daa207d4582;p=thirdparty%2Fiproute2.git iplink: communicate ifindex for xdp offload When xdpoffload option is used, communicate the ifindex down to the kernel to trigger device-specific load. Signed-off-by: Jakub Kicinski Reviewed-by: Quentin Monnet Acked-by: Daniel Borkmann --- diff --git a/ip/iplink.c b/ip/iplink.c index 2c51ef7dd..0a8eb56fb 100644 --- a/ip/iplink.c +++ b/ip/iplink.c @@ -631,8 +631,8 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req, bool offload = strcmp(*argv, "xdpoffload") == 0; NEXT_ARG(); - if (xdp_parse(&argc, &argv, req, generic, drv, - offload)) + if (xdp_parse(&argc, &argv, req, dev_index, + generic, drv, offload)) exit(-1); } else if (strcmp(*argv, "netns") == 0) { NEXT_ARG(); diff --git a/ip/iplink_xdp.c b/ip/iplink_xdp.c index edaec2a25..6eeb820af 100644 --- a/ip/iplink_xdp.c +++ b/ip/iplink_xdp.c @@ -48,8 +48,8 @@ static int xdp_delete(struct xdp_req *xdp) return 0; } -int xdp_parse(int *argc, char ***argv, struct iplink_req *req, bool generic, - bool drv, bool offload) +int xdp_parse(int *argc, char ***argv, struct iplink_req *req, __u32 ifindex, + bool generic, bool drv, bool offload) { struct bpf_cfg_in cfg = { .type = BPF_PROG_TYPE_XDP, @@ -60,6 +60,12 @@ int xdp_parse(int *argc, char ***argv, struct iplink_req *req, bool generic, .req = req, }; + if (offload) { + if (!ifindex) + incomplete_command(); + cfg.ifindex = ifindex; + } + if (!force) xdp.flags |= XDP_FLAGS_UPDATE_IF_NOEXIST; if (generic) diff --git a/ip/xdp.h b/ip/xdp.h index 215a6dcb9..7e10696ad 100644 --- a/ip/xdp.h +++ b/ip/xdp.h @@ -4,8 +4,8 @@ #include "utils.h" -int xdp_parse(int *argc, char ***argv, struct iplink_req *req, bool generic, - bool drv, bool offload); +int xdp_parse(int *argc, char ***argv, struct iplink_req *req, __u32 ifindex, + bool generic, bool drv, bool offload); void xdp_dump(FILE *fp, struct rtattr *tb, bool link, bool details); #endif /* __XDP__ */