From patchwork Wed Sep 5 18:52:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pieter Jansen van Vuuren X-Patchwork-Id: 966614 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=netronome.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="cP/CczgK"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 425CXP48Kpz9s3C for ; Thu, 6 Sep 2018 04:53:41 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 0A77817EB; Wed, 5 Sep 2018 18:52:57 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 9258817DF for ; Wed, 5 Sep 2018 18:52:55 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id D259B6D6 for ; Wed, 5 Sep 2018 18:52:54 +0000 (UTC) Received: by mail-qt0-f194.google.com with SMTP id g53-v6so9331705qtg.10 for ; Wed, 05 Sep 2018 11:52:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=X74/cvHGioftxvJP/aweCpc7OgmB8Jbj24y/0ZPw0EE=; b=cP/CczgKXPChhHPlkDT3cpNQg+/vhqCCcwy09UtodZV8WQShCJuQ0gIhXGGrDwft2h iFGpTsLeafr99jhzLlL8J8ZJsBZw4MGaasOR2Pg4chimcDq9d2YHOYNOyF7EChkef7Cd yq2GSQw1sCYEnrrSpQnbBRKivAcUZcTP/lzp9zRmLOp16L/JwCcYdzgumrh4GnLXRV10 gKgYg7gfsJYiwYW8NM2xxut0SJdVqpicnZj3xpmsZWS4Wzf2TVVaIFhJ2l6CMa04MFHS PBAAbBhIpw6LNBabPluXXM98ViG+raUDDCLWEvKfsPZZXYq0UCKqFlomClhS+Fbe+eOh XgQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=X74/cvHGioftxvJP/aweCpc7OgmB8Jbj24y/0ZPw0EE=; b=MC4EnmniJyewC8zD8chSnPsVr5KmEGHoftwxn+AoBF4Mifql+9EMKx5s8lFh/2/3U4 U7Gp8SCrFCOn6lxr26ijUeUSBq841VV+6hBpAevQz5nD0sCbjyB+BKqrNawBhe8hFI8w haZJbVf18UTOUbT9AWmScwDWF4RAqCwSukD4aFqVxxGKRL/ZNgqNzsCypSDOGt5SKX3P E5xVMS1qiUyFB5BiBihX8ybqGzMQJkn1IdW/tWT32u8h9F2oFPB5PC3wNvhOnNkPpMK7 5pL6w8Qtdym+JmChMM9d+izUSmaF4iAz4meAK5lR4PUfCgrNGi2hV94GRolWhy0+ipn0 n3tA== X-Gm-Message-State: APzg51C+vFotKTYdMejvPfAPHMpH79gI43ezKOq7HJGxLxuo9Uq6fXC0 6l59LE8c/wK42j5LU95ROvZ4GhVRw9c= X-Google-Smtp-Source: ANB0VdYqNbYjnqTY6QDmq/vEr0qHAkJrJzjl9FPw9jaRToXVD94T81Wx8j6ngIBVUC8gxWNXlTKaRA== X-Received: by 2002:a0c:d6c3:: with SMTP id l3-v6mr33275600qvi.154.1536173573657; Wed, 05 Sep 2018 11:52:53 -0700 (PDT) Received: from pieter-Netronome.netronome.com (host81-150-168-85.in-addr.btopenworld.com. [81.150.168.85]) by smtp.gmail.com with ESMTPSA id f23-v6sm1704491qtc.65.2018.09.05.11.52.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 05 Sep 2018 11:52:53 -0700 (PDT) From: Pieter Jansen van Vuuren To: dev@openvswitch.org Date: Wed, 5 Sep 2018 19:52:37 +0100 Message-Id: <1536173557-23165-3-git-send-email-pieter.jansenvanvuuren@netronome.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1536173557-23165-1-git-send-email-pieter.jansenvanvuuren@netronome.com> References: <1536173557-23165-1-git-send-email-pieter.jansenvanvuuren@netronome.com> X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Cc: simon.horman@netronome.com, Pieter Jansen van Vuuren Subject: [ovs-dev] [PATCH v3 2/2] lib/tc: add geneve with option match offload X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Add TC offload support for classifying geneve tunnels with options. Signed-off-by: Pieter Jansen van Vuuren Reviewed-by: Simon Horman --- include/linux/pkt_cls.h | 25 +++++++++++ lib/netdev-tc-offloads.c | 14 ++++++ lib/tc.c | 96 ++++++++++++++++++++++++++++++++++++++++ lib/tc.h | 1 + 4 files changed, 136 insertions(+) diff --git a/include/linux/pkt_cls.h b/include/linux/pkt_cls.h index a3300418e..1384d71f9 100644 --- a/include/linux/pkt_cls.h +++ b/include/linux/pkt_cls.h @@ -204,10 +204,35 @@ enum { TCA_FLOWER_KEY_ENC_IP_TOS_MASK, /* u8 */ TCA_FLOWER_KEY_ENC_IP_TTL, /* u8 */ TCA_FLOWER_KEY_ENC_IP_TTL_MASK, /* u8 */ + TCA_FLOWER_KEY_ENC_OPTS, + TCA_FLOWER_KEY_ENC_OPTS_MASK, __TCA_FLOWER_MAX, }; +enum { + TCA_FLOWER_KEY_ENC_OPTS_UNSPEC, + TCA_FLOWER_KEY_ENC_OPTS_GENEVE, /* Nested + * TCA_TUNNEL_KEY_ENC_OPTS_GENEVE + * attributes + */ + __TCA_FLOWER_KEY_ENC_OPTS_MAX, +}; + +#define TCA_FLOWER_KEY_ENC_OPTS_MAX (__TCA_FLOWER_KEY_ENC_OPTS_MAX - 1) + +enum { + TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC, + TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS, /* u16 */ + TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE, /* u8 */ + TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA, /* 4 to 128 bytes */ + + __TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX, +}; + +#define TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX \ + (__TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX - 1) + enum { TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0), TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1), diff --git a/lib/netdev-tc-offloads.c b/lib/netdev-tc-offloads.c index d07dcb2aa..b84c88c31 100644 --- a/lib/netdev-tc-offloads.c +++ b/lib/netdev-tc-offloads.c @@ -542,6 +542,17 @@ parse_tc_flower_to_match(struct tc_flower *flower, if (flower->tunnel.tp_dst) { match_set_tun_tp_dst(match, flower->tunnel.tp_dst); } + memcpy(match->flow.tunnel.metadata.opts.gnv, + flower->tunnel.metadata.opts.gnv, + flower->tunnel.metadata.present.len); + match->flow.tunnel.metadata.present.len = + flower->tunnel.metadata.present.len; + match->flow.tunnel.flags |= FLOW_TNL_F_UDPIF; + memset(match->wc.masks.tunnel.metadata.opts.gnv, 0xff, + flower->tunnel.metadata.present.len); + match->wc.masks.tunnel.metadata.present.len = + flower->tunnel.metadata.present.len; + match->wc.masks.tunnel.flags |= FLOW_TNL_F_UDPIF; } act_off = nl_msg_start_nested(buf, OVS_FLOW_ATTR_ACTIONS); @@ -1003,6 +1014,9 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, flower.tunnel.ttl = tnl->ip_ttl; flower.tunnel.tp_src = tnl->tp_src; flower.tunnel.tp_dst = tnl->tp_dst; + memcpy(flower.tunnel.metadata.opts.gnv, tnl->metadata.opts.gnv, + tnl->metadata.present.len); + flower.tunnel.metadata.present.len = tnl->metadata.present.len; flower.tunnel.tunnel = true; } memset(&mask->tunnel, 0, sizeof mask->tunnel); diff --git a/lib/tc.c b/lib/tc.c index 57c4e067b..8334d42aa 100644 --- a/lib/tc.c +++ b/lib/tc.c @@ -321,6 +321,9 @@ static const struct nl_policy tca_flower_policy[] = { .optional = true, }, [TCA_FLOWER_KEY_ENC_IP_TTL_MASK] = { .type = NL_A_U8, .optional = true, }, + [TCA_FLOWER_KEY_ENC_OPTS] = { .type = NL_A_NESTED, .optional = true, }, + [TCA_FLOWER_KEY_ENC_OPTS_MASK] = { .type = NL_A_NESTED, + .optional = true, }, }; static void @@ -387,6 +390,64 @@ nl_parse_flower_vlan(struct nlattr **attrs, struct tc_flower *flower) } } +static void +nl_parse_geneve_key(const struct nlattr *in_nlattr, struct tc_flower *flower) +{ + struct geneve_opt *opt = NULL; + const struct ofpbuf *msg; + struct nlattr *nla; + struct ofpbuf buf; + size_t left; + int cnt; + + nl_attr_get_nested(in_nlattr, &buf); + msg = &buf; + + cnt = 0; + NL_ATTR_FOR_EACH (nla, left, ofpbuf_at(msg, 0, 0), msg->size) { + uint16_t type = nl_attr_type(nla); + + switch (type) { + case TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS: + opt = &flower->tunnel.metadata.opts.gnv[cnt]; + opt->opt_class = nl_attr_get_be16(nla); + cnt += sizeof(struct geneve_opt) / 4; + flower->tunnel.metadata.present.len += sizeof(struct geneve_opt); + break; + case TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE: + opt->type = nl_attr_get_u8(nla); + break; + case TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA: + opt->length = nl_attr_get_size(nla) / 4; + memcpy(opt + 1, nl_attr_get_unspec(nla, 1), opt->length * 4); + cnt += opt->length; + flower->tunnel.metadata.present.len += opt->length * 4; + break; + } + } +} + +static void +nl_parse_flower_tunnel_opts(struct nlattr *options, struct tc_flower *flower) +{ + const struct ofpbuf *msg; + struct nlattr *nla; + struct ofpbuf buf; + size_t left; + + nl_attr_get_nested(options, &buf); + msg = &buf; + + NL_ATTR_FOR_EACH (nla, left, ofpbuf_at(msg, 0, 0), msg->size) { + uint16_t type = nl_attr_type(nla); + switch (type) { + case TCA_FLOWER_KEY_ENC_OPTS_GENEVE: + nl_parse_geneve_key(nla, flower); + break; + } + } +} + static void nl_parse_flower_tunnel(struct nlattr **attrs, struct tc_flower *flower) { @@ -423,6 +484,9 @@ nl_parse_flower_tunnel(struct nlattr **attrs, struct tc_flower *flower) flower->tunnel.ttl = nl_attr_get_u8(attrs[TCA_FLOWER_KEY_ENC_IP_TTL]); } + if (attrs[TCA_FLOWER_KEY_ENC_OPTS_MASK]) { + nl_parse_flower_tunnel_opts(attrs[TCA_FLOWER_KEY_ENC_OPTS], flower); + } } static void @@ -1714,6 +1778,37 @@ nl_msg_put_masked_value(struct ofpbuf *request, uint16_t type, nl_msg_put_unspec(request, type, data, len); } +static void +nl_msg_put_flower_tunnel_opts(struct ofpbuf *request, struct tc_flower *flower) +{ + struct geneve_opt *opt; + size_t outer, inner; + int len, cnt = 0; + + len = flower->tunnel.metadata.present.len; + if (!len) { + return; + } + + outer = nl_msg_start_nested(request, TCA_FLOWER_KEY_ENC_OPTS); + while (len) { + opt = &flower->tunnel.metadata.opts.gnv[cnt]; + inner = nl_msg_start_nested(request, TCA_FLOWER_KEY_ENC_OPTS_GENEVE); + + nl_msg_put_be16(request, TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS, + opt->opt_class); + nl_msg_put_u8(request, TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE, opt->type); + nl_msg_put_unspec(request, TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA, opt + 1, + opt->length * 4); + + cnt += sizeof(struct geneve_opt) / 4 + opt->length; + len -= sizeof(struct geneve_opt) + opt->length * 4; + + nl_msg_end_nested(request, inner); + } + nl_msg_end_nested(request, outer); +} + static void nl_msg_put_flower_tunnel(struct ofpbuf *request, struct tc_flower *flower) { @@ -1741,6 +1836,7 @@ nl_msg_put_flower_tunnel(struct ofpbuf *request, struct tc_flower *flower) } nl_msg_put_be16(request, TCA_FLOWER_KEY_ENC_UDP_DST_PORT, tp_dst); nl_msg_put_be32(request, TCA_FLOWER_KEY_ENC_KEY_ID, id); + nl_msg_put_flower_tunnel_opts(request, flower); } #define FLOWER_PUT_MASKED_VALUE(member, type) \ diff --git a/lib/tc.h b/lib/tc.h index 4ae06eb27..acc6607da 100644 --- a/lib/tc.h +++ b/lib/tc.h @@ -190,6 +190,7 @@ struct tc_flower { ovs_be16 tp_src; ovs_be16 tp_dst; ovs_be64 id; + struct tun_metadata metadata; } tunnel; struct tc_cookie act_cookie;