From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00044.outbound.protection.outlook.com [40.107.0.44]) by dpdk.org (Postfix) with ESMTP id ED4F14F98 for ; Mon, 5 Nov 2018 08:20:45 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ee33pfwJp5VIPEwagP++rWbenOUk7K9wNBeQVLOBtl8=; b=S5y+aLJVfRrrmLpWPRAHcY8fodf2temhs3cKDgEtHwLKcTZ63nHO1iTqYaQ799Af6B0Nbq6izgRMby8bDbk9s5ekx0NBH4KzURW3NlMdS7i3HMgozevabHm5q+YoCacNQ4u23EjkGkCqr2KdvaAkbYo5OFhDQ1d1zKaE2RKVlao= Received: from DB3PR0502MB3980.eurprd05.prod.outlook.com (52.134.72.27) by DB3PR0502MB4076.eurprd05.prod.outlook.com (52.134.66.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1294.30; Mon, 5 Nov 2018 07:20:44 +0000 Received: from DB3PR0502MB3980.eurprd05.prod.outlook.com ([fe80::58e7:97d8:f9c1:4323]) by DB3PR0502MB3980.eurprd05.prod.outlook.com ([fe80::58e7:97d8:f9c1:4323%3]) with mapi id 15.20.1294.028; Mon, 5 Nov 2018 07:20:44 +0000 From: Yongseok Koh To: Shahaf Shuler CC: "dev@dpdk.org" , Ori Kam , Yongseok Koh Thread-Topic: [PATCH v2 1/3] net/mlx5: fix Verbs flow tunnel Thread-Index: AQHUdNgQsUtxjTMsqU6WigTcJP4Q5w== Date: Mon, 5 Nov 2018 07:20:44 +0000 Message-ID: <20181105072032.42374-2-yskoh@mellanox.com> References: <20181102210801.28370-1-yskoh@mellanox.com> <20181105072032.42374-1-yskoh@mellanox.com> In-Reply-To: <20181105072032.42374-1-yskoh@mellanox.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: BYAPR07CA0030.namprd07.prod.outlook.com (2603:10b6:a02:bc::43) To DB3PR0502MB3980.eurprd05.prod.outlook.com (2603:10a6:8:10::27) authentication-results: spf=none (sender IP is ) smtp.mailfrom=yskoh@mellanox.com; x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [209.116.155.178] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; DB3PR0502MB4076; 6:I0JKB7LSWcMJNLCb6HJJ6hQp1+HW3HLxj6+eIc6QfmD+mKVbOagE0zT4433yv5dTKdOP7RTKI5kmwL17ISkteR7koIom/2F9TIeCAM58vLyqKReKy9/GsyinScB8Wc5QFQb/0H0j+HfSuMzzrZD2IOdiQm5hMFb6wgqX/MBX5PA7d0DcQv3624GRR/H6Ux8ubf3Ry2LYHFBNe6KMmB+t1agKCt/9HFAxXTGnnKFMlHgBp8wNpjdhV1vAuxEUcATiXCkkVhqv5F0xR46TT8mWQmMqNTRgZ24LYG+bTpv3Fx4peSwAmTvmidChPxiIt7OV5BPwPPQRIOxfkghIKFp4C4XzH3/wcnRjs0/YjfOV4gUZ2kDxMM2cMNPOS7DSG760H9hknf5qafxHfTWpVB9Nsel0dStLFwggNM3XKgg+ZzkdHLiklKBNYnMTTmOL0Sn9i1QQQ26px8Ud8lx3uqMY7Q==; 5:aVhMF7jlc4GuwCqvayA1XOaQ9FX1OLUaTupGgj40vDjitGEqRMf3sjN2PlFRIQIF1fey5pmQHa7dto7oJc0tF56MmyWTRcwLV3Dgfjy2U1jHsWPUfWqT1U+dfmsAoWMGr81grsSwCITIOrVLik6q+aTTe95/0+wxLdgsGg7GZ2c=; 7:8jd+46hvIlHuo8gT0OvMfoZr4SO3L3a7yWpIjKHLom2H+8WuJhhkSbZpFYGPiORyF79oagypqegyLAKsN6l9dBofRCi8DMhpVctr8+4i4L2IHlHtUZTBym8XIQECHs45nnxwuDVXpM3BOBOhG9Yy9g== x-ms-office365-filtering-correlation-id: 4ef168a4-a0c4-4441-ef74-08d642ef32e7 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:DB3PR0502MB4076; x-ms-traffictypediagnostic: DB3PR0502MB4076: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(788757137089); x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(10201501046)(3002001)(93006095)(93001095)(3231382)(944501410)(52105095)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123560045)(20161123562045)(201708071742011)(7699051)(76991095); SRVR:DB3PR0502MB4076; BCL:0; PCL:0; RULEID:; SRVR:DB3PR0502MB4076; x-forefront-prvs: 08476BC6EF x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(346002)(376002)(366004)(396003)(136003)(39860400002)(51234002)(189003)(199004)(66066001)(106356001)(25786009)(446003)(11346002)(97736004)(256004)(14454004)(105586002)(14444005)(68736007)(6512007)(53946003)(2900100001)(2906002)(53936002)(3846002)(6116002)(1076002)(37006003)(6506007)(386003)(52116002)(99286004)(36756003)(4744004)(7736002)(305945005)(6486002)(316002)(6436002)(54906003)(186003)(4326008)(102836004)(86362001)(71190400001)(71200400001)(81166006)(81156014)(486006)(8676002)(6862004)(6636002)(5660300001)(478600001)(107886003)(575784001)(476003)(2616005)(8936002)(76176011)(26005)(569006); DIR:OUT; SFP:1101; SCL:1; SRVR:DB3PR0502MB4076; H:DB3PR0502MB3980.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: wd9aPATq3ExKb5x8FLn5pIxzFyRVrId+SW8AdtEAp+G19PUq86zD3/2twPw7I46V9RW0yjpQwWPVJFgxojIQHjxC0o06WG/3hACIGHyKzOThZJSlLvmNlXMUq9Zv5tIy7Q6wujO6HS17j5lzEiKmFyjrXAbZ9IrITjR3GInk59SXbxVh+XfZiEJmcvbB9GmVQs62gzbovJypS0N0ecKy2jF397U7ENfjcDRIUg+X8u9kcnh70EleJpBnx0QI7k9g/BFsABATNV3/eOyzfLZF8R0HTuuTPqKjJNspLvwD+wCTlCo+BIzztLUhTYPq8f3Zn6IS9EyLbUWIsgd0xA5NkMnYh4Vg7/pwhpm4d2PAV68= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4ef168a4-a0c4-4441-ef74-08d642ef32e7 X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Nov 2018 07:20:44.2556 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR0502MB4076 Subject: [dpdk-dev] [PATCH v2 1/3] net/mlx5: fix Verbs flow tunnel X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 05 Nov 2018 07:20:46 -0000 1) Fix layer parsing In translation of tunneled flows, dev_flow->layers must not be used to check tunneled layer as it contains all the layers parsed from flow_drv_prepare(). Checking tunneled layer is needed to set IBV_FLOW_SPEC_INNER and it should be based on dynamic parsing. With dev_flow->layers on a tunneled flow, items will always be interpreted as inner as dev_flow->layer already has all the items. 2) Refactoring code It is partly because flow_verbs_translate_item_*() sets layer flag. Same code is repeating in multiple locations and that could be error-prone. - Introduce VERBS_SPEC_INNER() to unify setting IBV_FLOW_SPEC_INNER. - flow_verbs_translate_item_*() doesn't set parsing result - MLX5_FLOW_LAYER_*. - flow_verbs_translate_item_*() doesn't set priority or adjust hashfields but does only item translation. Both have to be done outside. - Make more consistent between Verbs and DV. 3) Remove flow_verbs_mark_update() This code can never be reached as validation prohibits specifying mark and flag actions together. No need to convert flag to mark. Fixes: 84c406e74524 ("net/mlx5: add flow translate function") Cc: orika@mellanox.com Signed-off-by: Yongseok Koh Acked-by: Ori Kam --- drivers/net/mlx5/mlx5_flow_verbs.c | 568 +++++++++++++++++----------------= ---- 1 file changed, 258 insertions(+), 310 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flo= w_verbs.c index 54ac620c72..43fcd0d29e 100644 --- a/drivers/net/mlx5/mlx5_flow_verbs.c +++ b/drivers/net/mlx5/mlx5_flow_verbs.c @@ -33,6 +33,9 @@ #include "mlx5_glue.h" #include "mlx5_flow.h" =20 +#define VERBS_SPEC_INNER(item_flags) \ + (!!((item_flags) & MLX5_FLOW_LAYER_TUNNEL) ? IBV_FLOW_SPEC_INNER : 0) + /** * Create Verbs flow counter with Verbs library. * @@ -231,27 +234,26 @@ flow_verbs_counter_query(struct rte_eth_dev *dev __rt= e_unused, } =20 /** - * Add a verbs item specification into @p flow. + * Add a verbs item specification into @p verbs. * - * @param[in, out] flow - * Pointer to flow structure. + * @param[out] verbs + * Pointer to verbs structure. * @param[in] src * Create specification. * @param[in] size * Size in bytes of the specification to copy. */ static void -flow_verbs_spec_add(struct mlx5_flow *flow, void *src, unsigned int size) +flow_verbs_spec_add(struct mlx5_flow_verbs *verbs, void *src, unsigned int= size) { - struct mlx5_flow_verbs *verbs =3D &flow->verbs; + void *dst; =20 - if (verbs->specs) { - void *dst; - - dst =3D (void *)(verbs->specs + verbs->size); - memcpy(dst, src, size); - ++verbs->attr->num_of_specs; - } + if (!verbs) + return; + assert(verbs->specs); + dst =3D (void *)(verbs->specs + verbs->size); + memcpy(dst, src, size); + ++verbs->attr->num_of_specs; verbs->size +=3D size; } =20 @@ -260,24 +262,23 @@ flow_verbs_spec_add(struct mlx5_flow *flow, void *src= , unsigned int size) * the input is valid and that there is space to insert the requested item * into the flow. * + * @param[in, out] dev_flow + * Pointer to dev_flow structure. * @param[in] item * Item specification. * @param[in] item_flags - * Bit field with all detected items. - * @param[in, out] dev_flow - * Pointer to dev_flow structure. + * Parsed item flags. */ static void -flow_verbs_translate_item_eth(const struct rte_flow_item *item, - uint64_t *item_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_item_eth(struct mlx5_flow *dev_flow, + const struct rte_flow_item *item, + uint64_t item_flags) { const struct rte_flow_item_eth *spec =3D item->spec; const struct rte_flow_item_eth *mask =3D item->mask; - const int tunnel =3D !!(*item_flags & MLX5_FLOW_LAYER_TUNNEL); const unsigned int size =3D sizeof(struct ibv_flow_spec_eth); struct ibv_flow_spec_eth eth =3D { - .type =3D IBV_FLOW_SPEC_ETH | (tunnel ? IBV_FLOW_SPEC_INNER : 0), + .type =3D IBV_FLOW_SPEC_ETH | VERBS_SPEC_INNER(item_flags), .size =3D size, }; =20 @@ -298,11 +299,8 @@ flow_verbs_translate_item_eth(const struct rte_flow_it= em *item, eth.val.src_mac[i] &=3D eth.mask.src_mac[i]; } eth.val.ether_type &=3D eth.mask.ether_type; - dev_flow->verbs.attr->priority =3D MLX5_PRIORITY_MAP_L2; } - flow_verbs_spec_add(dev_flow, ð, size); - *item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L2 : - MLX5_FLOW_LAYER_OUTER_L2; + flow_verbs_spec_add(&dev_flow->verbs, ð, size); } =20 /** @@ -344,24 +342,24 @@ flow_verbs_item_vlan_update(struct ibv_flow_attr *att= r, * the input is valid and that there is space to insert the requested item * into the flow. * - * @param[in] item - * Item specification. - * @param[in, out] item_flags - * Bit mask that holds all detected items. * @param[in, out] dev_flow * Pointer to dev_flow structure. + * @param[in] item + * Item specification. + * @param[in] item_flags + * Parsed item flags. */ static void -flow_verbs_translate_item_vlan(const struct rte_flow_item *item, - uint64_t *item_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_item_vlan(struct mlx5_flow *dev_flow, + const struct rte_flow_item *item, + uint64_t item_flags) { const struct rte_flow_item_vlan *spec =3D item->spec; const struct rte_flow_item_vlan *mask =3D item->mask; unsigned int size =3D sizeof(struct ibv_flow_spec_eth); - const int tunnel =3D !!(*item_flags & MLX5_FLOW_LAYER_TUNNEL); + const int tunnel =3D !!(item_flags & MLX5_FLOW_LAYER_TUNNEL); struct ibv_flow_spec_eth eth =3D { - .type =3D IBV_FLOW_SPEC_ETH | (tunnel ? IBV_FLOW_SPEC_INNER : 0), + .type =3D IBV_FLOW_SPEC_ETH | VERBS_SPEC_INNER(item_flags), .size =3D size, }; const uint32_t l2m =3D tunnel ? MLX5_FLOW_LAYER_INNER_L2 : @@ -377,16 +375,10 @@ flow_verbs_translate_item_vlan(const struct rte_flow_= item *item, eth.mask.ether_type =3D mask->inner_type; eth.val.ether_type &=3D eth.mask.ether_type; } - if (!(*item_flags & l2m)) { - dev_flow->verbs.attr->priority =3D MLX5_PRIORITY_MAP_L2; - flow_verbs_spec_add(dev_flow, ð, size); - } else { + if (!(item_flags & l2m)) + flow_verbs_spec_add(&dev_flow->verbs, ð, size); + else flow_verbs_item_vlan_update(dev_flow->verbs.attr, ð); - size =3D 0; /* Only an update is done in eth specification. */ - } - *item_flags |=3D tunnel ? - (MLX5_FLOW_LAYER_INNER_L2 | MLX5_FLOW_LAYER_INNER_VLAN) : - (MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_OUTER_VLAN); } =20 /** @@ -394,32 +386,28 @@ flow_verbs_translate_item_vlan(const struct rte_flow_= item *item, * the input is valid and that there is space to insert the requested item * into the flow. * + * @param[in, out] dev_flow + * Pointer to dev_flow structure. * @param[in] item * Item specification. - * @param[in, out] item_flags - * Bit mask that marks all detected items. - * @param[in, out] dev_flow - * Pointer to sepacific flow structure. + * @param[in] item_flags + * Parsed item flags. */ static void -flow_verbs_translate_item_ipv4(const struct rte_flow_item *item, - uint64_t *item_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_item_ipv4(struct mlx5_flow *dev_flow, + const struct rte_flow_item *item, + uint64_t item_flags) { const struct rte_flow_item_ipv4 *spec =3D item->spec; const struct rte_flow_item_ipv4 *mask =3D item->mask; - const int tunnel =3D !!(*item_flags & MLX5_FLOW_LAYER_TUNNEL); unsigned int size =3D sizeof(struct ibv_flow_spec_ipv4_ext); struct ibv_flow_spec_ipv4_ext ipv4 =3D { - .type =3D IBV_FLOW_SPEC_IPV4_EXT | - (tunnel ? IBV_FLOW_SPEC_INNER : 0), + .type =3D IBV_FLOW_SPEC_IPV4_EXT | VERBS_SPEC_INNER(item_flags), .size =3D size, }; =20 if (!mask) mask =3D &rte_flow_item_ipv4_mask; - *item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 : - MLX5_FLOW_LAYER_OUTER_L3_IPV4; if (spec) { ipv4.val =3D (struct ibv_flow_ipv4_ext_filter){ .src_ip =3D spec->hdr.src_addr, @@ -439,12 +427,7 @@ flow_verbs_translate_item_ipv4(const struct rte_flow_i= tem *item, ipv4.val.proto &=3D ipv4.mask.proto; ipv4.val.tos &=3D ipv4.mask.tos; } - dev_flow->verbs.hash_fields |=3D - mlx5_flow_hashfields_adjust(dev_flow, tunnel, - MLX5_IPV4_LAYER_TYPES, - MLX5_IPV4_IBV_RX_HASH); - dev_flow->verbs.attr->priority =3D MLX5_PRIORITY_MAP_L3; - flow_verbs_spec_add(dev_flow, &ipv4, size); + flow_verbs_spec_add(&dev_flow->verbs, &ipv4, size); } =20 /** @@ -452,31 +435,28 @@ flow_verbs_translate_item_ipv4(const struct rte_flow_= item *item, * the input is valid and that there is space to insert the requested item * into the flow. * + * @param[in, out] dev_flow + * Pointer to dev_flow structure. * @param[in] item * Item specification. - * @param[in, out] item_flags - * Bit mask that marks all detected items. - * @param[in, out] dev_flow - * Pointer to sepacific flow structure. + * @param[in] item_flags + * Parsed item flags. */ static void -flow_verbs_translate_item_ipv6(const struct rte_flow_item *item, - uint64_t *item_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_item_ipv6(struct mlx5_flow *dev_flow, + const struct rte_flow_item *item, + uint64_t item_flags) { const struct rte_flow_item_ipv6 *spec =3D item->spec; const struct rte_flow_item_ipv6 *mask =3D item->mask; - const int tunnel =3D !!(dev_flow->layers & MLX5_FLOW_LAYER_TUNNEL); unsigned int size =3D sizeof(struct ibv_flow_spec_ipv6); struct ibv_flow_spec_ipv6 ipv6 =3D { - .type =3D IBV_FLOW_SPEC_IPV6 | (tunnel ? IBV_FLOW_SPEC_INNER : 0), + .type =3D IBV_FLOW_SPEC_IPV6 | VERBS_SPEC_INNER(item_flags), .size =3D size, }; =20 if (!mask) mask =3D &rte_flow_item_ipv6_mask; - *item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 : - MLX5_FLOW_LAYER_OUTER_L3_IPV6; if (spec) { unsigned int i; uint32_t vtc_flow_val; @@ -516,12 +496,7 @@ flow_verbs_translate_item_ipv6(const struct rte_flow_i= tem *item, ipv6.val.next_hdr &=3D ipv6.mask.next_hdr; ipv6.val.hop_limit &=3D ipv6.mask.hop_limit; } - dev_flow->verbs.hash_fields |=3D - mlx5_flow_hashfields_adjust(dev_flow, tunnel, - MLX5_IPV6_LAYER_TYPES, - MLX5_IPV6_IBV_RX_HASH); - dev_flow->verbs.attr->priority =3D MLX5_PRIORITY_MAP_L3; - flow_verbs_spec_add(dev_flow, &ipv6, size); + flow_verbs_spec_add(&dev_flow->verbs, &ipv6, size); } =20 /** @@ -529,46 +504,38 @@ flow_verbs_translate_item_ipv6(const struct rte_flow_= item *item, * the input is valid and that there is space to insert the requested item * into the flow. * + * @param[in, out] dev_flow + * Pointer to dev_flow structure. * @param[in] item * Item specification. - * @param[in, out] item_flags - * Bit mask that marks all detected items. - * @param[in, out] dev_flow - * Pointer to sepacific flow structure. + * @param[in] item_flags + * Parsed item flags. */ static void -flow_verbs_translate_item_udp(const struct rte_flow_item *item, - uint64_t *item_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_item_tcp(struct mlx5_flow *dev_flow, + const struct rte_flow_item *item, + uint64_t item_flags __rte_unused) { - const struct rte_flow_item_udp *spec =3D item->spec; - const struct rte_flow_item_udp *mask =3D item->mask; - const int tunnel =3D !!(*item_flags & MLX5_FLOW_LAYER_TUNNEL); + const struct rte_flow_item_tcp *spec =3D item->spec; + const struct rte_flow_item_tcp *mask =3D item->mask; unsigned int size =3D sizeof(struct ibv_flow_spec_tcp_udp); - struct ibv_flow_spec_tcp_udp udp =3D { - .type =3D IBV_FLOW_SPEC_UDP | (tunnel ? IBV_FLOW_SPEC_INNER : 0), + struct ibv_flow_spec_tcp_udp tcp =3D { + .type =3D IBV_FLOW_SPEC_TCP | VERBS_SPEC_INNER(item_flags), .size =3D size, }; =20 if (!mask) - mask =3D &rte_flow_item_udp_mask; - *item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L4_UDP : - MLX5_FLOW_LAYER_OUTER_L4_UDP; + mask =3D &rte_flow_item_tcp_mask; if (spec) { - udp.val.dst_port =3D spec->hdr.dst_port; - udp.val.src_port =3D spec->hdr.src_port; - udp.mask.dst_port =3D mask->hdr.dst_port; - udp.mask.src_port =3D mask->hdr.src_port; + tcp.val.dst_port =3D spec->hdr.dst_port; + tcp.val.src_port =3D spec->hdr.src_port; + tcp.mask.dst_port =3D mask->hdr.dst_port; + tcp.mask.src_port =3D mask->hdr.src_port; /* Remove unwanted bits from values. */ - udp.val.src_port &=3D udp.mask.src_port; - udp.val.dst_port &=3D udp.mask.dst_port; + tcp.val.src_port &=3D tcp.mask.src_port; + tcp.val.dst_port &=3D tcp.mask.dst_port; } - dev_flow->verbs.hash_fields |=3D - mlx5_flow_hashfields_adjust(dev_flow, tunnel, ETH_RSS_UDP, - (IBV_RX_HASH_SRC_PORT_UDP | - IBV_RX_HASH_DST_PORT_UDP)); - dev_flow->verbs.attr->priority =3D MLX5_PRIORITY_MAP_L4; - flow_verbs_spec_add(dev_flow, &udp, size); + flow_verbs_spec_add(&dev_flow->verbs, &tcp, size); } =20 /** @@ -576,46 +543,38 @@ flow_verbs_translate_item_udp(const struct rte_flow_i= tem *item, * the input is valid and that there is space to insert the requested item * into the flow. * + * @param[in, out] dev_flow + * Pointer to dev_flow structure. * @param[in] item * Item specification. - * @param[in, out] item_flags - * Bit mask that marks all detected items. - * @param[in, out] dev_flow - * Pointer to sepacific flow structure. + * @param[in] item_flags + * Parsed item flags. */ static void -flow_verbs_translate_item_tcp(const struct rte_flow_item *item, - uint64_t *item_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_item_udp(struct mlx5_flow *dev_flow, + const struct rte_flow_item *item, + uint64_t item_flags __rte_unused) { - const struct rte_flow_item_tcp *spec =3D item->spec; - const struct rte_flow_item_tcp *mask =3D item->mask; - const int tunnel =3D !!(dev_flow->layers & MLX5_FLOW_LAYER_TUNNEL); + const struct rte_flow_item_udp *spec =3D item->spec; + const struct rte_flow_item_udp *mask =3D item->mask; unsigned int size =3D sizeof(struct ibv_flow_spec_tcp_udp); - struct ibv_flow_spec_tcp_udp tcp =3D { - .type =3D IBV_FLOW_SPEC_TCP | (tunnel ? IBV_FLOW_SPEC_INNER : 0), + struct ibv_flow_spec_tcp_udp udp =3D { + .type =3D IBV_FLOW_SPEC_UDP | VERBS_SPEC_INNER(item_flags), .size =3D size, }; =20 if (!mask) - mask =3D &rte_flow_item_tcp_mask; - *item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L4_TCP : - MLX5_FLOW_LAYER_OUTER_L4_TCP; + mask =3D &rte_flow_item_udp_mask; if (spec) { - tcp.val.dst_port =3D spec->hdr.dst_port; - tcp.val.src_port =3D spec->hdr.src_port; - tcp.mask.dst_port =3D mask->hdr.dst_port; - tcp.mask.src_port =3D mask->hdr.src_port; + udp.val.dst_port =3D spec->hdr.dst_port; + udp.val.src_port =3D spec->hdr.src_port; + udp.mask.dst_port =3D mask->hdr.dst_port; + udp.mask.src_port =3D mask->hdr.src_port; /* Remove unwanted bits from values. */ - tcp.val.src_port &=3D tcp.mask.src_port; - tcp.val.dst_port &=3D tcp.mask.dst_port; + udp.val.src_port &=3D udp.mask.src_port; + udp.val.dst_port &=3D udp.mask.dst_port; } - dev_flow->verbs.hash_fields |=3D - mlx5_flow_hashfields_adjust(dev_flow, tunnel, ETH_RSS_TCP, - (IBV_RX_HASH_SRC_PORT_TCP | - IBV_RX_HASH_DST_PORT_TCP)); - dev_flow->verbs.attr->priority =3D MLX5_PRIORITY_MAP_L4; - flow_verbs_spec_add(dev_flow, &tcp, size); + flow_verbs_spec_add(&dev_flow->verbs, &udp, size); } =20 /** @@ -623,17 +582,17 @@ flow_verbs_translate_item_tcp(const struct rte_flow_i= tem *item, * the input is valid and that there is space to insert the requested item * into the flow. * + * @param[in, out] dev_flow + * Pointer to dev_flow structure. * @param[in] item * Item specification. - * @param[in, out] item_flags - * Bit mask that marks all detected items. - * @param[in, out] dev_flow - * Pointer to sepacific flow structure. + * @param[in] item_flags + * Parsed item flags. */ static void -flow_verbs_translate_item_vxlan(const struct rte_flow_item *item, - uint64_t *item_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_item_vxlan(struct mlx5_flow *dev_flow, + const struct rte_flow_item *item, + uint64_t item_flags __rte_unused) { const struct rte_flow_item_vxlan *spec =3D item->spec; const struct rte_flow_item_vxlan *mask =3D item->mask; @@ -657,9 +616,7 @@ flow_verbs_translate_item_vxlan(const struct rte_flow_i= tem *item, /* Remove unwanted bits from values. */ vxlan.val.tunnel_id &=3D vxlan.mask.tunnel_id; } - flow_verbs_spec_add(dev_flow, &vxlan, size); - dev_flow->verbs.attr->priority =3D MLX5_PRIORITY_MAP_L2; - *item_flags |=3D MLX5_FLOW_LAYER_VXLAN; + flow_verbs_spec_add(&dev_flow->verbs, &vxlan, size); } =20 /** @@ -667,17 +624,17 @@ flow_verbs_translate_item_vxlan(const struct rte_flow= _item *item, * the input is valid and that there is space to insert the requested item * into the flow. * + * @param[in, out] dev_flow + * Pointer to dev_flow structure. * @param[in] item * Item specification. - * @param[in, out] item_flags - * Bit mask that marks all detected items. - * @param[in, out] dev_flow - * Pointer to sepacific flow structure. + * @param[in] item_flags + * Parsed item flags. */ static void -flow_verbs_translate_item_vxlan_gpe(const struct rte_flow_item *item, - uint64_t *item_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_item_vxlan_gpe(struct mlx5_flow *dev_flow, + const struct rte_flow_item *item, + uint64_t item_flags __rte_unused) { const struct rte_flow_item_vxlan_gpe *spec =3D item->spec; const struct rte_flow_item_vxlan_gpe *mask =3D item->mask; @@ -701,9 +658,7 @@ flow_verbs_translate_item_vxlan_gpe(const struct rte_fl= ow_item *item, /* Remove unwanted bits from values. */ vxlan_gpe.val.tunnel_id &=3D vxlan_gpe.mask.tunnel_id; } - flow_verbs_spec_add(dev_flow, &vxlan_gpe, size); - dev_flow->verbs.attr->priority =3D MLX5_PRIORITY_MAP_L2; - *item_flags |=3D MLX5_FLOW_LAYER_VXLAN_GPE; + flow_verbs_spec_add(&dev_flow->verbs, &vxlan_gpe, size); } =20 /** @@ -763,17 +718,17 @@ flow_verbs_item_gre_ip_protocol_update(struct ibv_flo= w_attr *attr, * the input is valid and that there is space to insert the requested item * into the flow. * + * @param[in, out] dev_flow + * Pointer to dev_flow structure. * @param[in] item * Item specification. - * @param[in, out] item_flags - * Bit mask that marks all detected items. - * @param[in, out] dev_flow - * Pointer to sepacific flow structure. + * @param[in] item_flags + * Parsed item flags. */ static void -flow_verbs_translate_item_gre(const struct rte_flow_item *item __rte_unuse= d, - uint64_t *item_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_item_gre(struct mlx5_flow *dev_flow, + const struct rte_flow_item *item __rte_unused, + uint64_t item_flags) { struct mlx5_flow_verbs *verbs =3D &dev_flow->verbs; #ifndef HAVE_IBV_DEVICE_MPLS_SUPPORT @@ -804,7 +759,7 @@ flow_verbs_translate_item_gre(const struct rte_flow_ite= m *item __rte_unused, tunnel.val.key &=3D tunnel.mask.key; } #endif - if (*item_flags & MLX5_FLOW_LAYER_OUTER_L3_IPV4) + if (item_flags & MLX5_FLOW_LAYER_OUTER_L3_IPV4) flow_verbs_item_gre_ip_protocol_update(verbs->attr, IBV_FLOW_SPEC_IPV4_EXT, IPPROTO_GRE); @@ -812,9 +767,7 @@ flow_verbs_translate_item_gre(const struct rte_flow_ite= m *item __rte_unused, flow_verbs_item_gre_ip_protocol_update(verbs->attr, IBV_FLOW_SPEC_IPV6, IPPROTO_GRE); - flow_verbs_spec_add(dev_flow, &tunnel, size); - verbs->attr->priority =3D MLX5_PRIORITY_MAP_L2; - *item_flags |=3D MLX5_FLOW_LAYER_GRE; + flow_verbs_spec_add(verbs, &tunnel, size); } =20 /** @@ -822,17 +775,17 @@ flow_verbs_translate_item_gre(const struct rte_flow_i= tem *item __rte_unused, * the input is valid and that there is space to insert the requested acti= on * into the flow. This function also return the action that was added. * + * @param[in, out] dev_flow + * Pointer to dev_flow structure. * @param[in] item * Item specification. - * @param[in, out] item_flags - * Bit mask that marks all detected items. - * @param[in, out] dev_flow - * Pointer to sepacific flow structure. + * @param[in] item_flags + * Parsed item flags. */ static void -flow_verbs_translate_item_mpls(const struct rte_flow_item *item __rte_unus= ed, - uint64_t *action_flags __rte_unused, - struct mlx5_flow *dev_flow __rte_unused) +flow_verbs_translate_item_mpls(struct mlx5_flow *dev_flow __rte_unused, + const struct rte_flow_item *item __rte_unused, + uint64_t item_flags __rte_unused) { #ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT const struct rte_flow_item_mpls *spec =3D item->spec; @@ -851,25 +804,24 @@ flow_verbs_translate_item_mpls(const struct rte_flow_= item *item __rte_unused, /* Remove unwanted bits from values. */ mpls.val.label &=3D mpls.mask.label; } - flow_verbs_spec_add(dev_flow, &mpls, size); - dev_flow->verbs.attr->priority =3D MLX5_PRIORITY_MAP_L2; - *action_flags |=3D MLX5_FLOW_LAYER_MPLS; + flow_verbs_spec_add(&dev_flow->verbs, &mpls, size); #endif } =20 /** * Convert the @p action into a Verbs specification. This function assumes= that * the input is valid and that there is space to insert the requested acti= on - * into the flow. This function also return the action that was added. + * into the flow. * - * @param[in, out] action_flags - * Pointer to the detected actions. * @param[in] dev_flow * Pointer to mlx5_flow. + * @param[in] action + * Action configuration. */ static void -flow_verbs_translate_action_drop(uint64_t *action_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_action_drop + (struct mlx5_flow *dev_flow, + const struct rte_flow_action *action __rte_unused) { unsigned int size =3D sizeof(struct ibv_flow_spec_action_drop); struct ibv_flow_spec_action_drop drop =3D { @@ -877,26 +829,22 @@ flow_verbs_translate_action_drop(uint64_t *action_fla= gs, .size =3D size, }; =20 - flow_verbs_spec_add(dev_flow, &drop, size); - *action_flags |=3D MLX5_FLOW_ACTION_DROP; + flow_verbs_spec_add(&dev_flow->verbs, &drop, size); } =20 /** * Convert the @p action into a Verbs specification. This function assumes= that * the input is valid and that there is space to insert the requested acti= on - * into the flow. This function also return the action that was added. + * into the flow. * - * @param[in] action - * Action configuration. - * @param[in, out] action_flags - * Pointer to the detected actions. * @param[in] dev_flow * Pointer to mlx5_flow. + * @param[in] action + * Action configuration. */ static void -flow_verbs_translate_action_queue(const struct rte_flow_action *action, - uint64_t *action_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_action_queue(struct mlx5_flow *dev_flow, + const struct rte_flow_action *action) { const struct rte_flow_action_queue *queue =3D action->conf; struct rte_flow *flow =3D dev_flow->flow; @@ -904,13 +852,12 @@ flow_verbs_translate_action_queue(const struct rte_fl= ow_action *action, if (flow->queue) (*flow->queue)[0] =3D queue->index; flow->rss.queue_num =3D 1; - *action_flags |=3D MLX5_FLOW_ACTION_QUEUE; } =20 /** * Convert the @p action into a Verbs specification. This function assumes= that * the input is valid and that there is space to insert the requested acti= on - * into the flow. This function also return the action that was added. + * into the flow. * * @param[in] action * Action configuration. @@ -920,9 +867,8 @@ flow_verbs_translate_action_queue(const struct rte_flow= _action *action, * Pointer to mlx5_flow. */ static void -flow_verbs_translate_action_rss(const struct rte_flow_action *action, - uint64_t *action_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_action_rss(struct mlx5_flow *dev_flow, + const struct rte_flow_action *action) { const struct rte_flow_action_rss *rss =3D action->conf; const uint8_t *rss_key; @@ -938,26 +884,22 @@ flow_verbs_translate_action_rss(const struct rte_flow= _action *action, /* RSS type 0 indicates default RSS type (ETH_RSS_IP). */ flow->rss.types =3D !rss->types ? ETH_RSS_IP : rss->types; flow->rss.level =3D rss->level; - *action_flags |=3D MLX5_FLOW_ACTION_RSS; } =20 /** * Convert the @p action into a Verbs specification. This function assumes= that * the input is valid and that there is space to insert the requested acti= on - * into the flow. This function also return the action that was added. + * into the flow. * - * @param[in] action - * Action configuration. - * @param[in, out] action_flags - * Pointer to the detected actions. * @param[in] dev_flow * Pointer to mlx5_flow. + * @param[in] action + * Action configuration. */ static void flow_verbs_translate_action_flag - (const struct rte_flow_action *action __rte_unused, - uint64_t *action_flags, - struct mlx5_flow *dev_flow) + (struct mlx5_flow *dev_flow, + const struct rte_flow_action *action __rte_unused) { unsigned int size =3D sizeof(struct ibv_flow_spec_action_tag); struct ibv_flow_spec_action_tag tag =3D { @@ -965,87 +907,44 @@ flow_verbs_translate_action_flag .size =3D size, .tag_id =3D mlx5_flow_mark_set(MLX5_FLOW_MARK_DEFAULT), }; - *action_flags |=3D MLX5_FLOW_ACTION_MARK; - flow_verbs_spec_add(dev_flow, &tag, size); -} =20 -/** - * Update verbs specification to modify the flag to mark. - * - * @param[in, out] verbs - * Pointer to the mlx5_flow_verbs structure. - * @param[in] mark_id - * Mark identifier to replace the flag. - */ -static void -flow_verbs_mark_update(struct mlx5_flow_verbs *verbs, uint32_t mark_id) -{ - struct ibv_spec_header *hdr; - int i; - - if (!verbs) - return; - /* Update Verbs specification. */ - hdr =3D (struct ibv_spec_header *)verbs->specs; - if (!hdr) - return; - for (i =3D 0; i !=3D verbs->attr->num_of_specs; ++i) { - if (hdr->type =3D=3D IBV_FLOW_SPEC_ACTION_TAG) { - struct ibv_flow_spec_action_tag *t =3D - (struct ibv_flow_spec_action_tag *)hdr; - - t->tag_id =3D mlx5_flow_mark_set(mark_id); - } - hdr =3D (struct ibv_spec_header *)((uintptr_t)hdr + hdr->size); - } + flow_verbs_spec_add(&dev_flow->verbs, &tag, size); } =20 /** * Convert the @p action into a Verbs specification. This function assumes= that * the input is valid and that there is space to insert the requested acti= on - * into the flow. This function also return the action that was added. + * into the flow. * - * @param[in] action - * Action configuration. - * @param[in, out] action_flags - * Pointer to the detected actions. * @param[in] dev_flow * Pointer to mlx5_flow. + * @param[in] action + * Action configuration. */ static void -flow_verbs_translate_action_mark(const struct rte_flow_action *action, - uint64_t *action_flags, - struct mlx5_flow *dev_flow) +flow_verbs_translate_action_mark(struct mlx5_flow *dev_flow, + const struct rte_flow_action *action) { const struct rte_flow_action_mark *mark =3D action->conf; unsigned int size =3D sizeof(struct ibv_flow_spec_action_tag); struct ibv_flow_spec_action_tag tag =3D { .type =3D IBV_FLOW_SPEC_ACTION_TAG, .size =3D size, + .tag_id =3D mlx5_flow_mark_set(mark->id), }; - struct mlx5_flow_verbs *verbs =3D &dev_flow->verbs; =20 - if (*action_flags & MLX5_FLOW_ACTION_FLAG) { - flow_verbs_mark_update(verbs, mark->id); - size =3D 0; - } else { - tag.tag_id =3D mlx5_flow_mark_set(mark->id); - flow_verbs_spec_add(dev_flow, &tag, size); - } - *action_flags |=3D MLX5_FLOW_ACTION_MARK; + flow_verbs_spec_add(&dev_flow->verbs, &tag, size); } =20 /** * Convert the @p action into a Verbs specification. This function assumes= that * the input is valid and that there is space to insert the requested acti= on - * into the flow. This function also return the action that was added. + * into the flow. * * @param[in] dev * Pointer to the Ethernet device structure. * @param[in] action * Action configuration. - * @param[in, out] action_flags - * Pointer to the detected actions. * @param[in] dev_flow * Pointer to mlx5_flow. * @param[out] error @@ -1055,10 +954,9 @@ flow_verbs_translate_action_mark(const struct rte_flo= w_action *action, * 0 On success else a negative errno value is returned and rte_errno is= set. */ static int -flow_verbs_translate_action_count(struct rte_eth_dev *dev, +flow_verbs_translate_action_count(struct mlx5_flow *dev_flow, const struct rte_flow_action *action, - uint64_t *action_flags, - struct mlx5_flow *dev_flow, + struct rte_eth_dev *dev, struct rte_flow_error *error) { const struct rte_flow_action_count *count =3D action->conf; @@ -1082,13 +980,12 @@ flow_verbs_translate_action_count(struct rte_eth_dev= *dev, "cannot get counter" " context."); } - *action_flags |=3D MLX5_FLOW_ACTION_COUNT; #if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42) counter.counter_set_handle =3D flow->counter->cs->handle; - flow_verbs_spec_add(dev_flow, &counter, size); + flow_verbs_spec_add(&dev_flow->verbs, &counter, size); #elif defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45) counter.counters =3D flow->counter->cs; - flow_verbs_spec_add(dev_flow, &counter, size); + flow_verbs_spec_add(&dev_flow->verbs, &counter, size); #endif return 0; } @@ -1120,7 +1017,6 @@ flow_verbs_validate(struct rte_eth_dev *dev, int ret; uint64_t action_flags =3D 0; uint64_t item_flags =3D 0; - int tunnel =3D 0; uint8_t next_protocol =3D 0xff; =20 if (items =3D=3D NULL) @@ -1129,9 +1025,9 @@ flow_verbs_validate(struct rte_eth_dev *dev, if (ret < 0) return ret; for (; items->type !=3D RTE_FLOW_ITEM_TYPE_END; items++) { + int tunnel =3D !!(item_flags & MLX5_FLOW_LAYER_TUNNEL); int ret =3D 0; =20 - tunnel =3D !!(item_flags & MLX5_FLOW_LAYER_TUNNEL); switch (items->type) { case RTE_FLOW_ITEM_TYPE_VOID: break; @@ -1148,8 +1044,10 @@ flow_verbs_validate(struct rte_eth_dev *dev, error); if (ret < 0) return ret; - item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_VLAN : - MLX5_FLOW_LAYER_OUTER_VLAN; + item_flags |=3D tunnel ? (MLX5_FLOW_LAYER_INNER_L2 | + MLX5_FLOW_LAYER_INNER_VLAN) : + (MLX5_FLOW_LAYER_OUTER_L2 | + MLX5_FLOW_LAYER_OUTER_VLAN); break; case RTE_FLOW_ITEM_TYPE_IPV4: ret =3D mlx5_flow_validate_item_ipv4(items, item_flags, @@ -1399,8 +1297,11 @@ flow_verbs_get_items_and_size(const struct rte_flow_= item items[], break; case RTE_FLOW_ITEM_TYPE_VLAN: size +=3D sizeof(struct ibv_flow_spec_eth); - detected_items |=3D tunnel ? MLX5_FLOW_LAYER_INNER_VLAN : - MLX5_FLOW_LAYER_OUTER_VLAN; + detected_items |=3D + tunnel ? (MLX5_FLOW_LAYER_INNER_L2 | + MLX5_FLOW_LAYER_INNER_VLAN) : + (MLX5_FLOW_LAYER_OUTER_L2 | + MLX5_FLOW_LAYER_OUTER_VLAN); break; case RTE_FLOW_ITEM_TYPE_IPV4: size +=3D sizeof(struct ibv_flow_spec_ipv4_ext); @@ -1532,50 +1433,48 @@ flow_verbs_translate(struct rte_eth_dev *dev, const struct rte_flow_action actions[], struct rte_flow_error *error) { - uint64_t action_flags =3D 0; + struct rte_flow *flow =3D dev_flow->flow; uint64_t item_flags =3D 0; + uint64_t action_flags =3D 0; uint64_t priority =3D attr->priority; + uint32_t subpriority =3D 0; struct priv *priv =3D dev->data->dev_private; =20 if (priority =3D=3D MLX5_FLOW_PRIO_RSVD) priority =3D priv->config.flow_prio - 1; for (; actions->type !=3D RTE_FLOW_ACTION_TYPE_END; actions++) { int ret; + switch (actions->type) { case RTE_FLOW_ACTION_TYPE_VOID: break; case RTE_FLOW_ACTION_TYPE_FLAG: - flow_verbs_translate_action_flag(actions, - &action_flags, - dev_flow); + flow_verbs_translate_action_flag(dev_flow, actions); + action_flags |=3D MLX5_FLOW_ACTION_FLAG; break; case RTE_FLOW_ACTION_TYPE_MARK: - flow_verbs_translate_action_mark(actions, - &action_flags, - dev_flow); + flow_verbs_translate_action_mark(dev_flow, actions); + action_flags |=3D MLX5_FLOW_ACTION_MARK; break; case RTE_FLOW_ACTION_TYPE_DROP: - flow_verbs_translate_action_drop(&action_flags, - dev_flow); + flow_verbs_translate_action_drop(dev_flow, actions); + action_flags |=3D MLX5_FLOW_ACTION_DROP; break; case RTE_FLOW_ACTION_TYPE_QUEUE: - flow_verbs_translate_action_queue(actions, - &action_flags, - dev_flow); + flow_verbs_translate_action_queue(dev_flow, actions); + action_flags |=3D MLX5_FLOW_ACTION_QUEUE; break; case RTE_FLOW_ACTION_TYPE_RSS: - flow_verbs_translate_action_rss(actions, - &action_flags, - dev_flow); + flow_verbs_translate_action_rss(dev_flow, actions); + action_flags |=3D MLX5_FLOW_ACTION_RSS; break; case RTE_FLOW_ACTION_TYPE_COUNT: - ret =3D flow_verbs_translate_action_count(dev, + ret =3D flow_verbs_translate_action_count(dev_flow, actions, - &action_flags, - dev_flow, - error); + dev, error); if (ret < 0) return ret; + action_flags |=3D MLX5_FLOW_ACTION_COUNT; break; default: return rte_flow_error_set(error, ENOTSUP, @@ -1584,51 +1483,100 @@ flow_verbs_translate(struct rte_eth_dev *dev, "action not supported"); } } - /* Device flow should have action flags by flow_drv_prepare(). */ - assert(dev_flow->flow->actions =3D=3D action_flags); + flow->actions =3D action_flags; for (; items->type !=3D RTE_FLOW_ITEM_TYPE_END; items++) { + int tunnel =3D !!(item_flags & MLX5_FLOW_LAYER_TUNNEL); + switch (items->type) { case RTE_FLOW_ITEM_TYPE_VOID: break; case RTE_FLOW_ITEM_TYPE_ETH: - flow_verbs_translate_item_eth(items, &item_flags, - dev_flow); + flow_verbs_translate_item_eth(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L2; + item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L2 : + MLX5_FLOW_LAYER_OUTER_L2; break; case RTE_FLOW_ITEM_TYPE_VLAN: - flow_verbs_translate_item_vlan(items, &item_flags, - dev_flow); + flow_verbs_translate_item_vlan(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L2; + item_flags |=3D tunnel ? (MLX5_FLOW_LAYER_INNER_L2 | + MLX5_FLOW_LAYER_INNER_VLAN) : + (MLX5_FLOW_LAYER_OUTER_L2 | + MLX5_FLOW_LAYER_OUTER_VLAN); break; case RTE_FLOW_ITEM_TYPE_IPV4: - flow_verbs_translate_item_ipv4(items, &item_flags, - dev_flow); + flow_verbs_translate_item_ipv4(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L3; + dev_flow->verbs.hash_fields |=3D + mlx5_flow_hashfields_adjust + (dev_flow, tunnel, + MLX5_IPV4_LAYER_TYPES, + MLX5_IPV4_IBV_RX_HASH); + item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 : + MLX5_FLOW_LAYER_OUTER_L3_IPV4; break; case RTE_FLOW_ITEM_TYPE_IPV6: - flow_verbs_translate_item_ipv6(items, &item_flags, - dev_flow); - break; - case RTE_FLOW_ITEM_TYPE_UDP: - flow_verbs_translate_item_udp(items, &item_flags, - dev_flow); + flow_verbs_translate_item_ipv6(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L3; + dev_flow->verbs.hash_fields |=3D + mlx5_flow_hashfields_adjust + (dev_flow, tunnel, + MLX5_IPV6_LAYER_TYPES, + MLX5_IPV6_IBV_RX_HASH); + item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 : + MLX5_FLOW_LAYER_OUTER_L3_IPV6; break; case RTE_FLOW_ITEM_TYPE_TCP: - flow_verbs_translate_item_tcp(items, &item_flags, - dev_flow); + flow_verbs_translate_item_tcp(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L4; + dev_flow->verbs.hash_fields |=3D + mlx5_flow_hashfields_adjust + (dev_flow, tunnel, ETH_RSS_TCP, + (IBV_RX_HASH_SRC_PORT_TCP | + IBV_RX_HASH_DST_PORT_TCP)); + item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L4_TCP : + MLX5_FLOW_LAYER_OUTER_L4_TCP; + break; + case RTE_FLOW_ITEM_TYPE_UDP: + flow_verbs_translate_item_udp(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L4; + dev_flow->verbs.hash_fields |=3D + mlx5_flow_hashfields_adjust + (dev_flow, tunnel, ETH_RSS_UDP, + (IBV_RX_HASH_SRC_PORT_UDP | + IBV_RX_HASH_DST_PORT_UDP)); + item_flags |=3D tunnel ? MLX5_FLOW_LAYER_INNER_L4_UDP : + MLX5_FLOW_LAYER_OUTER_L4_UDP; break; case RTE_FLOW_ITEM_TYPE_VXLAN: - flow_verbs_translate_item_vxlan(items, &item_flags, - dev_flow); + flow_verbs_translate_item_vxlan(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L2; + item_flags |=3D MLX5_FLOW_LAYER_VXLAN; break; case RTE_FLOW_ITEM_TYPE_VXLAN_GPE: - flow_verbs_translate_item_vxlan_gpe(items, &item_flags, - dev_flow); + flow_verbs_translate_item_vxlan_gpe(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L2; + item_flags |=3D MLX5_FLOW_LAYER_VXLAN_GPE; break; case RTE_FLOW_ITEM_TYPE_GRE: - flow_verbs_translate_item_gre(items, &item_flags, - dev_flow); + flow_verbs_translate_item_gre(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L2; + item_flags |=3D MLX5_FLOW_LAYER_GRE; break; case RTE_FLOW_ITEM_TYPE_MPLS: - flow_verbs_translate_item_mpls(items, &item_flags, - dev_flow); + flow_verbs_translate_item_mpls(dev_flow, items, + item_flags); + subpriority =3D MLX5_PRIORITY_MAP_L2; + item_flags |=3D MLX5_FLOW_LAYER_MPLS; break; default: return rte_flow_error_set(error, ENOTSUP, @@ -1637,9 +1585,9 @@ flow_verbs_translate(struct rte_eth_dev *dev, "item not supported"); } } + dev_flow->layers =3D item_flags; dev_flow->verbs.attr->priority =3D - mlx5_flow_adjust_priority(dev, priority, - dev_flow->verbs.attr->priority); + mlx5_flow_adjust_priority(dev, priority, subpriority); return 0; } =20 --=20 2.11.0