From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jakub Kicinski Subject: [PATCH iproute2/master 11/11] iplink: communicate ifindex for xdp offload Date: Thu, 23 Nov 2017 18:12:08 -0800 Message-ID: <20171124021208.13419-12-jakub.kicinski@netronome.com> References: <20171124021208.13419-1-jakub.kicinski@netronome.com> Cc: oss-drivers@netronome.com, daniel@iogearbox.net, Jakub Kicinski To: netdev@vger.kernel.org Return-path: Received: from mail-pl0-f65.google.com ([209.85.160.65]:37536 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752424AbdKXCM1 (ORCPT ); Thu, 23 Nov 2017 21:12:27 -0500 Received: by mail-pl0-f65.google.com with SMTP id 61so3569606plf.4 for ; Thu, 23 Nov 2017 18:12:27 -0800 (PST) In-Reply-To: <20171124021208.13419-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org List-ID: 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 --- ip/iplink.c | 4 ++-- ip/iplink_xdp.c | 10 ++++++++-- ip/xdp.h | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ip/iplink.c b/ip/iplink.c index 0360a0753d4a..4928f1d9489e 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 edaec2a250e7..6eeb820af0c3 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 1efd591b087c..7400792bbeb7 100644 --- a/ip/xdp.h +++ b/ip/xdp.h @@ -3,8 +3,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__ */ -- 2.14.1