From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4905AA04B5; Tue, 27 Oct 2020 00:19:59 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 93D311E2B; Tue, 27 Oct 2020 00:19:56 +0100 (CET) Received: from hqnvemgate25.nvidia.com (hqnvemgate25.nvidia.com [216.228.121.64]) by dpdk.org (Postfix) with ESMTP id 4E17E1D9E for ; Tue, 27 Oct 2020 00:19:54 +0100 (CET) Received: from hqmail.nvidia.com (Not Verified[216.228.121.13]) by hqnvemgate25.nvidia.com (using TLS: TLSv1.2, AES256-SHA) id ; Mon, 26 Oct 2020 16:19:56 -0700 Received: from HQMAIL111.nvidia.com (172.20.187.18) by HQMAIL101.nvidia.com (172.20.187.10) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Mon, 26 Oct 2020 23:19:52 +0000 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (104.47.58.108) by HQMAIL111.nvidia.com (172.20.187.18) with Microsoft SMTP Server (TLS) id 15.0.1473.3 via Frontend Transport; Mon, 26 Oct 2020 23:19:52 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=oIIhvLQV0Zs16fL/eWwaQXJChVtnApF7X8Lh+KI/EhKHDQ2dMcacaaXPof1byZPnA1MzSOJoL5lo13vg3uyfExwPjLQLiKPfjY1WwN6Ux/O9/ymWjCNoyNpV4BA+48Aoi2WjOp1H5i3KtJQkjEdZ7v458gsHJSDETOHoHSIvrRAE5H1y0lNe/ClntCui0sfh9/qcokKjGknKSSAJmiyOhcijuDg5D7sFfFvdey+NtzC4R61aiZCYMfUBkKDM5Wt5xuIV+4UFk8/qxSZqve+PLMR1vi+oHK9RxTyjnKB0yKCK7buU9JemPRU/KeQEibNlhGockwYSmROnrUph7op5Lg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=x7kxkIVKO274ORuo/Lx+ADp6ZpFNjMAO2i4DU5Ibesk=; b=JUBcd7k/t1iV+3e9DLKwfFTTLc4f9c9ZmekQsHu2+1H1NxIJDuaoZ6+7AlCbrsttHior9Uc+wExuYU0jKUnGeMQpUVa+vhv57NRlDuDFpqgnoDnmjJslFRaM1NnfPP7p9jUKfiZesvu6Tx6hHr9ErnGCJ7JDS2rI4EaPNC5xyG2JfTar6reraqWKmCrIgTGZyAYQ9TzfFBBa96NWj4WsIVHcbNL0NjLqbiftHly4mwUSaykMlSVt0+UteIxZXQQx+BFhG+/bI3qyK4EPaPV1Tk28Qh1ishkUy9I81aGU82lezocIU5mPwGUcvH2M4XobVXTnNBo6iiMyNlG6rtO1wg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none Received: from DM6PR12MB2748.namprd12.prod.outlook.com (2603:10b6:5:43::28) by DM6PR12MB4026.namprd12.prod.outlook.com (2603:10b6:5:1cc::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3477.20; Mon, 26 Oct 2020 23:19:49 +0000 Received: from DM6PR12MB2748.namprd12.prod.outlook.com ([fe80::f506:4af8:281b:cdeb]) by DM6PR12MB2748.namprd12.prod.outlook.com ([fe80::f506:4af8:281b:cdeb%7]) with mapi id 15.20.3477.028; Mon, 26 Oct 2020 23:19:49 +0000 From: Raslan Darawsheh To: Matan Azrad , Slava Ovsiienko CC: "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH] net/mlx5: support the new VLAN matching fields Thread-Index: AQHWquh+eiZSp1pdJEe7lViGY6C1lqmqhxLg Date: Mon, 26 Oct 2020 23:19:49 +0000 Message-ID: References: <1603641819-290447-1-git-send-email-matan@nvidia.com> In-Reply-To: <1603641819-290447-1-git-send-email-matan@nvidia.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: nvidia.com; dkim=none (message not signed) header.d=none;nvidia.com; dmarc=none action=none header.from=nvidia.com; x-originating-ip: [188.161.229.126] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 0e076745-c169-4bf4-4c07-08d87a05a273 x-ms-traffictypediagnostic: DM6PR12MB4026: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:5797; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: khBa92X4cS/fu6wQrq9gD9nrWz6rTLkOZ8FcVgg4ej3RVUeZmi4NrLdF514eFCjWu60R4NuJ+FaW88n9VIlEt7EbL5UtSWCgHvpSVAo+0/PIdPJzj95IrAuIDvppfym/MyK7M8yFYmjWzJjGD1mWnqaEcZ2nd0xoK06OOhhS0oj7+j5p9djbP5c88OPEgw7uQVkcmytSGHgdnKCdOwcs2PcCHHTdn7MFR6Ji66f5zG0WZRVa01+vulBD++78rwMxvFt4ppoxlXn0o0bPdUT1Q2vMDQRhZ3t85z9yF+kW1X3a9MoSc9cM+uy8iPBdROIXZdWo/KvCnF+m/KAmZdJrALWPqOg+RYM+1QNPc7zrB81nXp4ObgwIkGfCC+xP/CCDQeTqQMiqma5T6te6bj2reQ== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR12MB2748.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(396003)(346002)(366004)(376002)(136003)(39860400002)(2906002)(45080400002)(316002)(26005)(6506007)(478600001)(6636002)(9686003)(8936002)(110136005)(4326008)(55016002)(64756008)(66446008)(83380400001)(53546011)(33656002)(66946007)(66476007)(30864003)(5660300002)(966005)(76116006)(71200400001)(66556008)(52536014)(7696005)(8676002)(86362001)(186003); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: E+U2MPpE71VW2VFsVrFwyh4tg2y+mC5Zi0H62HEVgsJEfvKUGnDu25UihfLm4f6JGu549AH1ErTjxPzUG1WWYtbG/KzKa4AAwqoFalNxNGbU1WnkxZ5f5gmcg8mPiZp5hXr5NYg1ObkE3ru82inAn2SOfuxWFSxM7mRWlM9z/ayhRaMh8GdoqzarDVXRw3Ex2o0LYX3IySl4uxdWNbteVRoj8R2ow0AUW5EgOfJB6RzZfyxfjupPqa+cRao5ZO0pOUFJYqkli2cFDzip6+qnzj9+BaHJooZ1qzYeW3HtrdzggKWXyTWF3I+8ce/SqtguYzi6f7+TXN6cx/saedfL4l2y4In6UkjyFN3Hzd6mSxd69fuWQ4rO60azlpVz1C4evRBbNzdTLBEZzaS5nsnKn9G+eeRzN3msrwjjDO7V+NxvciGBk+aoKL762oKtermEfN0dDcr/lOc3KHTeZXFSktOiR6iIcwbfwU9H6Kms3GNmwDrNe+tU1L95tvnoz0KyDOU/vPz8Tos++l2RKLkWVuksg9424pvsMDU/Tuulh/zxvq8lICi29vTOOVOqM0VEL78v2Pm6qpTmoB2AUbZqL6kl4KjmvqVq9eDt/TTpXrwz02a4xSibWM+f/0oTnQQJn63FAmWEgRmzndX8WUBNFQ== Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR12MB2748.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0e076745-c169-4bf4-4c07-08d87a05a273 X-MS-Exchange-CrossTenant-originalarrivaltime: 26 Oct 2020 23:19:49.0766 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ITHnXzbhYw7dSgzMbcsuMF3gQoaDUtXGDxfRMAUOAiMvJnZUBHeIxNe0XznGNGMO1ny47XszSExr3+MMRt/zYQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4026 X-OriginatorOrg: Nvidia.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1603754396; bh=x7kxkIVKO274ORuo/Lx+ADp6ZpFNjMAO2i4DU5Ibesk=; h=ARC-Seal:ARC-Message-Signature:ARC-Authentication-Results:From:To: CC:Subject:Thread-Topic:Thread-Index:Date:Message-ID:References: In-Reply-To:Accept-Language:Content-Language:X-MS-Has-Attach: X-MS-TNEF-Correlator:authentication-results:x-originating-ip: x-ms-publictraffictype:x-ms-office365-filtering-correlation-id: x-ms-traffictypediagnostic:x-ms-exchange-transport-forked: x-microsoft-antispam-prvs:x-ms-oob-tlc-oobclassifiers: x-ms-exchange-senderadcheck:x-microsoft-antispam: x-microsoft-antispam-message-info:x-forefront-antispam-report: x-ms-exchange-antispam-messagedata:Content-Type: Content-Transfer-Encoding:MIME-Version: X-MS-Exchange-CrossTenant-AuthAs: X-MS-Exchange-CrossTenant-AuthSource: X-MS-Exchange-CrossTenant-Network-Message-Id: X-MS-Exchange-CrossTenant-originalarrivaltime: X-MS-Exchange-CrossTenant-fromentityheader: X-MS-Exchange-CrossTenant-id:X-MS-Exchange-CrossTenant-mailboxtype: X-MS-Exchange-CrossTenant-userprincipalname: X-MS-Exchange-Transport-CrossTenantHeadersStamped:X-OriginatorOrg; b=SDyEKyhOMEkBaS+tzUs6sWBD+Ty6O3YlTP9OYWJPSuhn9pmNAu4zx8tmqbb9yP6uT M2nNs/6l4b+pIIqMDSHvhA0O9+go0bnJJdkofwHps21dY/zav3VLazDYmG/iccaETn EY3JO7vOxgI5rldbs9UorFeHgm6tMr7wP29SrJzJFtpdB0XT0CpNcMZPo77ZSN5M8q NNTWtt15ZdIChyqov/fUrsqmyWl+3v9Pcqn5BDmAmxoCrH2tKlyRjs1mapTsjz1KnZ rGXRzy7F/7Oox0jQxKNQkMNuwhvKzh5QAwcNZpzFUz2FDBEJZyEIOTuXZAARhdBGTx O0EPX1TqMrI3A== Subject: Re: [dpdk-dev] [PATCH] net/mlx5: support the new VLAN matching fields 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Hi, > -----Original Message----- > From: dev On Behalf Of Matan Azrad > Sent: Sunday, October 25, 2020 6:04 PM > To: Slava Ovsiienko > Cc: dev@dpdk.org > Subject: [dpdk-dev] [PATCH] net/mlx5: support the new VLAN matching > fields >=20 > The fields ``has_vlan`` and ``has_more_vlan`` were added in rte_flow by > patch [1]. >=20 > Using these fields, the application can match all the VLAN options by > single flow: any, VLAN only and non-VLAN only. >=20 > Add the support for the fields. > By the way, add the support for QinQ packets matching. >=20 > VLAN\QinQ limitations are listed in the driver document. >=20 > [1] > https://nam11.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2Fpatc > hes.dpdk.org%2Fpatch%2F80965%2F&data=3D04%7C01%7Crasland%40nvi > dia.com%7C94645c5c01464724cccc08d878ff9f90%7C43083d15727340c1b7db39 > efd9ccc17a%7C0%7C0%7C637392386576427312%7CUnknown%7CTWFpbGZs > b3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn > 0%3D%7C1000&sdata=3DV7AAqp8X8hOEdSq51wGtPSYVOucQi2gEcFExhua > Sjls%3D&reserved=3D0 >=20 > Signed-off-by: Matan Azrad > Acked-by: Dekel Peled > Acked-by: Ori Kam > --- > doc/guides/nics/mlx5.rst | 24 +++-- > doc/guides/rel_notes/release_20_11.rst | 3 + > drivers/net/mlx5/mlx5_flow.c | 5 +- > drivers/net/mlx5/mlx5_flow.h | 2 +- > drivers/net/mlx5/mlx5_flow_dv.c | 176 +++++++++++++++++----------= --- > --- > drivers/net/mlx5/mlx5_flow_verbs.c | 2 +- > 6 files changed, 117 insertions(+), 95 deletions(-) >=20 > diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst > index 66524f1..79cb436 100644 > --- a/doc/guides/nics/mlx5.rst > +++ b/doc/guides/nics/mlx5.rst > @@ -122,23 +122,29 @@ Limitations >=20 > Will match any ipv4 packet (VLAN included). >=20 > -- When using DV flow engine (``dv_flow_en`` =3D 1), flow pattern without > VLAN item > - will match untagged packets only. > +- When using Verbs flow engine (``dv_flow_en`` =3D 0), multi-tagged(QinQ= ) > match is not supported. > + > +- When using DV flow engine (``dv_flow_en`` =3D 1), flow pattern with an= y > VLAN specification will match only single-tagged packets unless the ETH i= tem > ``type`` field is 0x88A8 or the VLAN item ``has_more_vlan`` field is 1. > The flow rule:: >=20 > flow create 0 ingress pattern eth / ipv4 / end ... >=20 > - Will match untagged packets only. > - The flow rule:: > + Will match any ipv4 packet. > + The flow rules:: >=20 > - flow create 0 ingress pattern eth / vlan / ipv4 / end ... > + flow create 0 ingress pattern eth / vlan / end ... > + flow create 0 ingress pattern eth has_vlan is 1 / end ... > + flow create 0 ingress pattern eth type is 0x8100 / end ... >=20 > - Will match tagged packets only, with any VLAN ID value. > - The flow rule:: > + Will match single-tagged packets only, with any VLAN ID value. > + The flow rules:: >=20 > - flow create 0 ingress pattern eth / vlan vid is 3 / ipv4 / end .= .. > + flow create 0 ingress pattern eth type is 0x88A8 / end ... > + flow create 0 ingress pattern eth / vlan has_more_vlan is 1 / en= d ... > + > + Will match multi-tagged packets only, with any VLAN ID value. >=20 > - Will only match tagged packets with VLAN ID 3. > +- A flow pattern with 2 sequential VLAN items is not supported. >=20 > - VLAN pop offload command: >=20 > diff --git a/doc/guides/rel_notes/release_20_11.rst > b/doc/guides/rel_notes/release_20_11.rst > index dd59fe8..56b3198 100644 > --- a/doc/guides/rel_notes/release_20_11.rst > +++ b/doc/guides/rel_notes/release_20_11.rst > @@ -353,6 +353,9 @@ New Features > * Updated the supported timeout for Age action to the maximal value > supported > by rte_flow API. > * Added support of Age action query. > + * Added support for QinQ packets matching. > + * Added support for the new vlan fields ``has_vlan`` in the eth item a= nd > + ``has_more_vlan`` in the vlan item. >=20 > Removed Items > ------------- > diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c > index 949b9ce..9bc1465 100644 > --- a/drivers/net/mlx5/mlx5_flow.c > +++ b/drivers/net/mlx5/mlx5_flow.c > @@ -1794,6 +1794,8 @@ struct mlx5_flow_tunnel_info { > * Item specification. > * @param[in] item_flags > * Bit-fields that holds the items detected until now. > + * @param[in] ext_vlan_sup > + * Whether extended VLAN features are supported or not. > * @param[out] error > * Pointer to error structure. > * > @@ -1914,7 +1916,7 @@ struct mlx5_flow_tunnel_info { > */ > int > mlx5_flow_validate_item_eth(const struct rte_flow_item *item, > - uint64_t item_flags, > + uint64_t item_flags, bool ext_vlan_sup, > struct rte_flow_error *error) > { > const struct rte_flow_item_eth *mask =3D item->mask; > @@ -1922,6 +1924,7 @@ struct mlx5_flow_tunnel_info { > .dst.addr_bytes =3D "\xff\xff\xff\xff\xff\xff", > .src.addr_bytes =3D "\xff\xff\xff\xff\xff\xff", > .type =3D RTE_BE16(0xffff), > + .has_vlan =3D ext_vlan_sup ? 1 : 0, > }; > int ret; > int tunnel =3D !!(item_flags & MLX5_FLOW_LAYER_TUNNEL); > diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h > index 20beb96..8b5a93f 100644 > --- a/drivers/net/mlx5/mlx5_flow.h > +++ b/drivers/net/mlx5/mlx5_flow.h > @@ -1306,7 +1306,7 @@ int mlx5_flow_item_acceptable(const struct > rte_flow_item *item, > bool range_accepted, > struct rte_flow_error *error); > int mlx5_flow_validate_item_eth(const struct rte_flow_item *item, > - uint64_t item_flags, > + uint64_t item_flags, bool ext_vlan_sup, > struct rte_flow_error *error); > int mlx5_flow_validate_item_gre(const struct rte_flow_item *item, > uint64_t item_flags, > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c > b/drivers/net/mlx5/mlx5_flow_dv.c > index 504d842..7bfab7d 100644 > --- a/drivers/net/mlx5/mlx5_flow_dv.c > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > @@ -1676,6 +1676,7 @@ struct field_modify_info modify_tcp[] =3D { > const struct rte_flow_item_vlan nic_mask =3D { > .tci =3D RTE_BE16(UINT16_MAX), > .inner_type =3D RTE_BE16(UINT16_MAX), > + .has_more_vlan =3D 1, > }; > const int tunnel =3D !!(item_flags & MLX5_FLOW_LAYER_TUNNEL); > int ret; > @@ -5358,7 +5359,7 @@ struct field_modify_info modify_tcp[] =3D { > break; > case RTE_FLOW_ITEM_TYPE_ETH: > ret =3D mlx5_flow_validate_item_eth(items, > item_flags, > - error); > + true, error); > if (ret < 0) > return ret; > last_item =3D tunnel ? MLX5_FLOW_LAYER_INNER_L2 : > @@ -6360,9 +6361,10 @@ struct field_modify_info modify_tcp[] =3D { > .dst.addr_bytes =3D "\xff\xff\xff\xff\xff\xff", > .src.addr_bytes =3D "\xff\xff\xff\xff\xff\xff", > .type =3D RTE_BE16(0xffff), > + .has_vlan =3D 0, > }; > - void *headers_m; > - void *headers_v; > + void *hdrs_m; > + void *hdrs_v; > char *l24_v; > unsigned int i; >=20 > @@ -6371,38 +6373,26 @@ struct field_modify_info modify_tcp[] =3D { > if (!eth_m) > eth_m =3D &nic_mask; > if (inner) { > - headers_m =3D MLX5_ADDR_OF(fte_match_param, matcher, > + hdrs_m =3D MLX5_ADDR_OF(fte_match_param, matcher, > inner_headers); > - headers_v =3D MLX5_ADDR_OF(fte_match_param, key, > inner_headers); > + hdrs_v =3D MLX5_ADDR_OF(fte_match_param, key, > inner_headers); > } else { > - headers_m =3D MLX5_ADDR_OF(fte_match_param, matcher, > + hdrs_m =3D MLX5_ADDR_OF(fte_match_param, matcher, > outer_headers); > - headers_v =3D MLX5_ADDR_OF(fte_match_param, key, > outer_headers); > + hdrs_v =3D MLX5_ADDR_OF(fte_match_param, key, > outer_headers); > } > - memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_m, > dmac_47_16), > + memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, hdrs_m, > dmac_47_16), > ð_m->dst, sizeof(eth_m->dst)); > /* The value must be in the range of the mask. */ > - l24_v =3D MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v, > dmac_47_16); > + l24_v =3D MLX5_ADDR_OF(fte_match_set_lyr_2_4, hdrs_v, > dmac_47_16); > for (i =3D 0; i < sizeof(eth_m->dst); ++i) > l24_v[i] =3D eth_m->dst.addr_bytes[i] & eth_v- > >dst.addr_bytes[i]; > - memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_m, > smac_47_16), > + memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, hdrs_m, > smac_47_16), > ð_m->src, sizeof(eth_m->src)); > - l24_v =3D MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v, > smac_47_16); > + l24_v =3D MLX5_ADDR_OF(fte_match_set_lyr_2_4, hdrs_v, > smac_47_16); > /* The value must be in the range of the mask. */ > for (i =3D 0; i < sizeof(eth_m->dst); ++i) > l24_v[i] =3D eth_m->src.addr_bytes[i] & eth_v- > >src.addr_bytes[i]; > - if (eth_v->type) { > - /* When ethertype is present set mask for tagged VLAN. */ > - MLX5_SET(fte_match_set_lyr_2_4, headers_m, cvlan_tag, > 1); > - /* Set value for tagged VLAN if ethertype is 802.1Q. */ > - if (eth_v->type =3D=3D RTE_BE16(RTE_ETHER_TYPE_VLAN) || > - eth_v->type =3D=3D RTE_BE16(RTE_ETHER_TYPE_QINQ)) { > - MLX5_SET(fte_match_set_lyr_2_4, headers_v, > cvlan_tag, > - 1); > - /* Return here to avoid setting match on ethertype. > */ > - return; > - } > - } > /* > * HW supports match on one Ethertype, the Ethertype following the > last > * VLAN tag of the packet (see PRM). > @@ -6411,19 +6401,42 @@ struct field_modify_info modify_tcp[] =3D { > * ethertype, and use ip_version field instead. > * eCPRI over Ether layer will use type value 0xAEFE. > */ > - if (eth_v->type =3D=3D RTE_BE16(RTE_ETHER_TYPE_IPV4) && > - eth_m->type =3D=3D 0xFFFF) { > - flow_dv_set_match_ip_version(group, headers_v, > headers_m, 4); > - } else if (eth_v->type =3D=3D RTE_BE16(RTE_ETHER_TYPE_IPV6) && > - eth_m->type =3D=3D 0xFFFF) { > - flow_dv_set_match_ip_version(group, headers_v, > headers_m, 6); > - } else { > - MLX5_SET(fte_match_set_lyr_2_4, headers_m, ethertype, > - rte_be_to_cpu_16(eth_m->type)); > - l24_v =3D MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v, > - ethertype); > - *(uint16_t *)(l24_v) =3D eth_m->type & eth_v->type; > + if (eth_m->type =3D=3D 0xFFFF) { > + /* Set cvlan_tag mask for any single\multi\un-tagged case. */ > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, cvlan_tag, 1); > + switch (eth_v->type) { > + case RTE_BE16(RTE_ETHER_TYPE_VLAN): > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, > cvlan_tag, 1); > + return; > + case RTE_BE16(RTE_ETHER_TYPE_QINQ): > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, > svlan_tag, 1); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, > svlan_tag, 1); > + return; > + case RTE_BE16(RTE_ETHER_TYPE_IPV4): > + flow_dv_set_match_ip_version(group, hdrs_v, > hdrs_m, 4); > + return; > + case RTE_BE16(RTE_ETHER_TYPE_IPV6): > + flow_dv_set_match_ip_version(group, hdrs_v, > hdrs_m, 6); > + return; > + default: > + break; > + } > + } > + if (eth_m->has_vlan) { > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, cvlan_tag, 1); > + if (eth_v->has_vlan) { > + /* > + * Here, when also has_more_vlan field in VLAN item > is > + * not set, only single-tagged packets will be > matched. > + */ > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, > cvlan_tag, 1); > + return; > + } > } > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, ethertype, > + rte_be_to_cpu_16(eth_m->type)); > + l24_v =3D MLX5_ADDR_OF(fte_match_set_lyr_2_4, hdrs_v, > ethertype); > + *(uint16_t *)(l24_v) =3D eth_m->type & eth_v->type; > } >=20 > /** > @@ -6448,19 +6461,19 @@ struct field_modify_info modify_tcp[] =3D { > { > const struct rte_flow_item_vlan *vlan_m =3D item->mask; > const struct rte_flow_item_vlan *vlan_v =3D item->spec; > - void *headers_m; > - void *headers_v; > + void *hdrs_m; > + void *hdrs_v; > uint16_t tci_m; > uint16_t tci_v; >=20 > if (inner) { > - headers_m =3D MLX5_ADDR_OF(fte_match_param, matcher, > + hdrs_m =3D MLX5_ADDR_OF(fte_match_param, matcher, > inner_headers); > - headers_v =3D MLX5_ADDR_OF(fte_match_param, key, > inner_headers); > + hdrs_v =3D MLX5_ADDR_OF(fte_match_param, key, > inner_headers); > } else { > - headers_m =3D MLX5_ADDR_OF(fte_match_param, matcher, > + hdrs_m =3D MLX5_ADDR_OF(fte_match_param, matcher, > outer_headers); > - headers_v =3D MLX5_ADDR_OF(fte_match_param, key, > outer_headers); > + hdrs_v =3D MLX5_ADDR_OF(fte_match_param, key, > outer_headers); > /* > * This is workaround, masks are not supported, > * and pre-validated. > @@ -6473,37 +6486,54 @@ struct field_modify_info modify_tcp[] =3D { > * When VLAN item exists in flow, mark packet as tagged, > * even if TCI is not specified. > */ > - MLX5_SET(fte_match_set_lyr_2_4, headers_m, cvlan_tag, 1); > - MLX5_SET(fte_match_set_lyr_2_4, headers_v, cvlan_tag, 1); > + if (!MLX5_GET(fte_match_set_lyr_2_4, hdrs_v, svlan_tag)) { > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, cvlan_tag, 1); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, cvlan_tag, 1); > + } > if (!vlan_v) > return; > if (!vlan_m) > vlan_m =3D &rte_flow_item_vlan_mask; > tci_m =3D rte_be_to_cpu_16(vlan_m->tci); > tci_v =3D rte_be_to_cpu_16(vlan_m->tci & vlan_v->tci); > - MLX5_SET(fte_match_set_lyr_2_4, headers_m, first_vid, tci_m); > - MLX5_SET(fte_match_set_lyr_2_4, headers_v, first_vid, tci_v); > - MLX5_SET(fte_match_set_lyr_2_4, headers_m, first_cfi, tci_m >> > 12); > - MLX5_SET(fte_match_set_lyr_2_4, headers_v, first_cfi, tci_v >> 12); > - MLX5_SET(fte_match_set_lyr_2_4, headers_m, first_prio, tci_m >> > 13); > - MLX5_SET(fte_match_set_lyr_2_4, headers_v, first_prio, tci_v >> > 13); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, first_vid, tci_m); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, first_vid, tci_v); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, first_cfi, tci_m >> 12); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, first_cfi, tci_v >> 12); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, first_prio, tci_m >> 13); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, first_prio, tci_v >> 13); > /* > * HW is optimized for IPv4/IPv6. In such cases, avoid setting > * ethertype, and use ip_version field instead. > */ > - if (vlan_v->inner_type =3D=3D RTE_BE16(RTE_ETHER_TYPE_IPV4) && > - vlan_m->inner_type =3D=3D 0xFFFF) { > - flow_dv_set_match_ip_version(group, headers_v, > headers_m, 4); > - } else if (vlan_v->inner_type =3D=3D RTE_BE16(RTE_ETHER_TYPE_IPV6) > && > - vlan_m->inner_type =3D=3D 0xFFFF) { > - flow_dv_set_match_ip_version(group, headers_v, > headers_m, 6); > - } else { > - MLX5_SET(fte_match_set_lyr_2_4, headers_m, ethertype, > - rte_be_to_cpu_16(vlan_m->inner_type)); > - MLX5_SET(fte_match_set_lyr_2_4, headers_v, ethertype, > - rte_be_to_cpu_16(vlan_m->inner_type & > - vlan_v->inner_type)); > + if (vlan_m->inner_type =3D=3D 0xFFFF) { > + switch (vlan_v->inner_type) { > + case RTE_BE16(RTE_ETHER_TYPE_VLAN): > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, > svlan_tag, 1); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, > svlan_tag, 1); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, > cvlan_tag, 0); > + return; > + case RTE_BE16(RTE_ETHER_TYPE_IPV4): > + flow_dv_set_match_ip_version(group, hdrs_v, > hdrs_m, 4); > + return; > + case RTE_BE16(RTE_ETHER_TYPE_IPV6): > + flow_dv_set_match_ip_version(group, hdrs_v, > hdrs_m, 6); > + return; > + default: > + break; > + } > } > + if (vlan_m->has_more_vlan && vlan_v->has_more_vlan) { > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, svlan_tag, 1); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, svlan_tag, 1); > + /* Only one vlan_tag bit can be set. */ > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, cvlan_tag, 0); > + return; > + } > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_m, ethertype, > + rte_be_to_cpu_16(vlan_m->inner_type)); > + MLX5_SET(fte_match_set_lyr_2_4, hdrs_v, ethertype, > + rte_be_to_cpu_16(vlan_m->inner_type & vlan_v- > >inner_type)); > } >=20 > /** > @@ -6515,8 +6545,6 @@ struct field_modify_info modify_tcp[] =3D { > * Flow matcher value. > * @param[in] item > * Flow pattern to translate. > - * @param[in] item_flags > - * Bit-fields that holds the items detected until now. > * @param[in] inner > * Item is inner pattern. > * @param[in] group > @@ -6525,7 +6553,6 @@ struct field_modify_info modify_tcp[] =3D { > static void > flow_dv_translate_item_ipv4(void *matcher, void *key, > const struct rte_flow_item *item, > - const uint64_t item_flags, > int inner, uint32_t group) > { > const struct rte_flow_item_ipv4 *ipv4_m =3D item->mask; > @@ -6555,13 +6582,6 @@ struct field_modify_info modify_tcp[] =3D { > headers_v =3D MLX5_ADDR_OF(fte_match_param, key, > outer_headers); > } > flow_dv_set_match_ip_version(group, headers_v, headers_m, 4); > - /* > - * On outer header (which must contains L2), or inner header with L2, > - * set cvlan_tag mask bit to mark this packet as untagged. > - * This should be done even if item->spec is empty. > - */ > - if (!inner || item_flags & MLX5_FLOW_LAYER_INNER_L2) > - MLX5_SET(fte_match_set_lyr_2_4, headers_m, cvlan_tag, > 1); > if (!ipv4_v) > return; > if (!ipv4_m) > @@ -6608,8 +6628,6 @@ struct field_modify_info modify_tcp[] =3D { > * Flow matcher value. > * @param[in] item > * Flow pattern to translate. > - * @param[in] item_flags > - * Bit-fields that holds the items detected until now. > * @param[in] inner > * Item is inner pattern. > * @param[in] group > @@ -6618,7 +6636,6 @@ struct field_modify_info modify_tcp[] =3D { > static void > flow_dv_translate_item_ipv6(void *matcher, void *key, > const struct rte_flow_item *item, > - const uint64_t item_flags, > int inner, uint32_t group) > { > const struct rte_flow_item_ipv6 *ipv6_m =3D item->mask; > @@ -6657,13 +6674,6 @@ struct field_modify_info modify_tcp[] =3D { > headers_v =3D MLX5_ADDR_OF(fte_match_param, key, > outer_headers); > } > flow_dv_set_match_ip_version(group, headers_v, headers_m, 6); > - /* > - * On outer header (which must contains L2), or inner header with L2, > - * set cvlan_tag mask bit to mark this packet as untagged. > - * This should be done even if item->spec is empty. > - */ > - if (!inner || item_flags & MLX5_FLOW_LAYER_INNER_L2) > - MLX5_SET(fte_match_set_lyr_2_4, headers_m, cvlan_tag, > 1); > if (!ipv6_v) > return; > if (!ipv6_m) > @@ -9915,7 +9925,7 @@ struct field_modify_info modify_tcp[] =3D { > mlx5_flow_tunnel_ip_check(items, next_protocol, > &item_flags, &tunnel); > flow_dv_translate_item_ipv4(match_mask, > match_value, > - items, item_flags, tunnel, > + items, tunnel, > dev_flow->dv.group); > matcher.priority =3D MLX5_PRIORITY_MAP_L3; > last_item =3D tunnel ? > MLX5_FLOW_LAYER_INNER_L3_IPV4 : > @@ -9938,7 +9948,7 @@ struct field_modify_info modify_tcp[] =3D { > mlx5_flow_tunnel_ip_check(items, next_protocol, > &item_flags, &tunnel); > flow_dv_translate_item_ipv6(match_mask, > match_value, > - items, item_flags, tunnel, > + items, tunnel, > dev_flow->dv.group); > matcher.priority =3D MLX5_PRIORITY_MAP_L3; > last_item =3D tunnel ? > MLX5_FLOW_LAYER_INNER_L3_IPV6 : > diff --git a/drivers/net/mlx5/mlx5_flow_verbs.c > b/drivers/net/mlx5/mlx5_flow_verbs.c > index 9cc4410..f0e1bca 100644 > --- a/drivers/net/mlx5/mlx5_flow_verbs.c > +++ b/drivers/net/mlx5/mlx5_flow_verbs.c > @@ -1263,7 +1263,7 @@ > break; > case RTE_FLOW_ITEM_TYPE_ETH: > ret =3D mlx5_flow_validate_item_eth(items, > item_flags, > - error); > + false, error); > if (ret < 0) > return ret; > last_item =3D tunnel ? MLX5_FLOW_LAYER_INNER_L2 : > -- > 1.8.3.1 Patch applied to next-net-mlx, Kindest regards, Raslan Darawsheh