From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-VE1-obe.outbound.protection.outlook.com (mail-eopbgr20054.outbound.protection.outlook.com [40.107.2.54]) by dpdk.org (Postfix) with ESMTP id 2F5903977 for ; Wed, 10 Oct 2018 02:45:32 +0200 (CEST) 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=p6+7BiAitfkwaJJ+3/0r47dtaquK4XUI0c6XIQpzeYY=; b=l5Gn1382Iox+nGNa9gcJVBzZb8fg6wdwVRqTH7BCYVI/0Wg9/Wuq+qJ6Dz8Hb0vaz5ldFKzmEqhtWygeNdpD6Na1Y323DlXXg++LoXDlXMYEUjaUen9U9hKd331K3ivhb43wQCBEo1GdBwshVGNBuPvW/81U/JjmSS2vVlJgVy8= Received: from DB3PR0502MB3980.eurprd05.prod.outlook.com (52.134.72.27) by DB3PR0502MB4010.eurprd05.prod.outlook.com (52.134.66.28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1207.23; Wed, 10 Oct 2018 00:45:30 +0000 Received: from DB3PR0502MB3980.eurprd05.prod.outlook.com ([fe80::1cb0:661b:ecab:6045]) by DB3PR0502MB3980.eurprd05.prod.outlook.com ([fe80::1cb0:661b:ecab:6045%2]) with mapi id 15.20.1207.029; Wed, 10 Oct 2018 00:45:30 +0000 From: Yongseok Koh To: Dekel Peled CC: Shahaf Shuler , "dev@dpdk.org" , Ori Kam Thread-Topic: [PATCH v3 4/4] net/mlx5: add L2 and L3 decap to Direct Verbs flow Thread-Index: AQHUYAwFrEFEsCsg6kq6ESjhZhVqDKUXpPQA Date: Wed, 10 Oct 2018 00:45:30 +0000 Message-ID: <20181010004521.GH9031@mtidpdk.mti.labs.mlnx> References: <1538922308-9516-1-git-send-email-dekelp@mellanox.com> <1539113137-4914-5-git-send-email-dekelp@mellanox.com> In-Reply-To: <1539113137-4914-5-git-send-email-dekelp@mellanox.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: CY4PR19CA0036.namprd19.prod.outlook.com (2603:10b6:903:103::22) 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; DB3PR0502MB4010; 6:WDlPR1kuj0E7LfHLubefyuO1EQM/C5i4AIXckjaiM6ILD/rgmhih7F7OlwN2F9XWkW9FbJQ8WLZITjw5V+jnewINC6kR762RLgw7kcAeDl3ZS0kzKcKly6iv2TjpWpjSeqcW0YzfUzq7LaIC7fIylUcjENqBTcXSfrJFR11EEexSszCE077hV5OgOwjajVRZwJzYCiNFzxzNiVUPs0mZEFTvL4vJCexOEK4ti0GRvTU8E5rF/E5C2dVQF1N7TAICfsZFRBQrp58OWYoTGoGgOwzwoSEgFQY9QP91daQm9kcSLlWZIaWmfTaTFA3aAdBg1GbQPH59661+Mz1EEQtuWk+E2sgGyo+KnFnUTmeR6L2Tam/UPZai6mRRiNCDZgz65c5eWzljM4Kab40bymsmx4m3PDEM0ObutODECpzUUmWKe61Q4b/BqqYLF3zKeLN8eI3GV/T1YI2CgwkClj+dgA==; 5:5k51NxngqXjqEpuVADGy0s27BY9jPHSuHOGh3zk4goBmo1WzmnvqQ+NmaBgGokhDU1C90xpO1fg0Suo5wnbM/wCng+mj5C/QHNp7aRAlErQ1sab0ltWOvsk682OHUr73mqn9WbKOPUBa8mn02TRyWBUt4ERiC1KFGsChUdKeauc=; 7:KybgdsaY3Ww4S629SpW3ELEdSV3RXEQZiAUYelh86xni0EseeU8JFUcwPvR29Nq53k5GZAUw/4/7fUWaMC/8TLaxWAAeWxpAUNBG7bLt5SJkoPRFovgUugZL+BSAjyd1RWlqOWt6kF+c9baKVQLWFh0O5W96JJc2YxXjNBW4tNDg75+FtU7WwfN+dtrynekZB54Ex1FfM+wIBKGIhppc+VgLgswGGwNi3WDVSE639rwx+GMjvjTanXbnzvy/eHIa x-ms-office365-filtering-correlation-id: 8737843f-2d8c-46bf-0132-08d62e49ad60 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:DB3PR0502MB4010; x-ms-traffictypediagnostic: DB3PR0502MB4010: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(3231355)(944501410)(52105095)(6055026)(149066)(150057)(6041310)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051); SRVR:DB3PR0502MB4010; BCL:0; PCL:0; RULEID:; SRVR:DB3PR0502MB4010; x-forefront-prvs: 08213D42D3 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(396003)(376002)(39860400002)(136003)(366004)(346002)(189003)(199004)(33896004)(5660300001)(71200400001)(71190400001)(2906002)(386003)(6506007)(106356001)(107886003)(316002)(26005)(478600001)(66066001)(6636002)(186003)(102836004)(5250100002)(25786009)(68736007)(54906003)(256004)(81156014)(53936002)(7736002)(6512007)(81166006)(105586002)(11346002)(476003)(4326008)(229853002)(486006)(1076002)(8676002)(33656002)(9686003)(446003)(52116002)(305945005)(6862004)(99286004)(6436002)(2900100001)(8936002)(14454004)(6486002)(14444005)(6246003)(86362001)(3846002)(6116002)(76176011)(97736004); DIR:OUT; SFP:1101; SCL:1; SRVR:DB3PR0502MB4010; 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: 1hK/doqsOY3GnOHWMHCtL6QizulNnYKkGiM5mzD/7MKLbWAsZuicJLSAsCmqAyi59Ad1S2aUH5yq7D8Uo0m1sH+ctgURh75C5Ur9h5itKtHLfQ6qSy8kvetHQkhA2/iciC3jWrgxUf78+MqnyPKprGi7MXbjDAJrfHCLk519Ejgg18tblXNVxcMNgOm+I3uXEhnMXoHt+PKfl2rX8w+l1/JZMcVfGLQp98KJY0mEk3WbT7MXKPm4B21ijM222h3dhpJqYF1Wk931N1ddPXRT8SexHpYIbi5yeR+pTP0TqpCVI+rlw9neMJmtr0Ql27NbcAxkpKpu2aHEaa6ayIutMd0lSjUFH38CoqJzOQxuYo0= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-ID: <2B50B9D1BFD08B4B88D22BD0D8925E5B@eurprd05.prod.outlook.com> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8737843f-2d8c-46bf-0132-08d62e49ad60 X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Oct 2018 00:45:30.2048 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB3PR0502MB4010 Subject: Re: [dpdk-dev] [PATCH v3 4/4] net/mlx5: add L2 and L3 decap to Direct Verbs flow 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: Wed, 10 Oct 2018 00:45:32 -0000 On Tue, Oct 09, 2018 at 10:25:37PM +0300, Dekel Peled wrote: > This patch adds support for Direct Verbs decap operations, L2 and L3. >=20 > Signed-off-by: Dekel Peled > --- Acked-by: Yongseok Koh Thanks > drivers/net/mlx5/mlx5_flow_dv.c | 215 ++++++++++++++++++++++++++++++++++= ++++++ > 1 file changed, 215 insertions(+) >=20 > diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow= _dv.c > index 73a22ba..d4ff812 100644 > --- a/drivers/net/mlx5/mlx5_flow_dv.c > +++ b/drivers/net/mlx5/mlx5_flow_dv.c > @@ -120,6 +120,12 @@ > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > "can't have 2 encap actions in same" > " flow"); > + if (action_flags & (MLX5_FLOW_ACTION_TUNNEL_DECAP | > + MLX5_FLOW_ACTION_TUNNEL_DECAP_L3)) > + return rte_flow_error_set(error, EINVAL, > + RTE_FLOW_ERROR_TYPE_ACTION, NULL, > + "can't encap and decap in same" > + " flow"); > if (attr->ingress) > return rte_flow_error_set(error, ENOTSUP, > RTE_FLOW_ERROR_TYPE_ATTR_INGRESS, > @@ -167,6 +173,12 @@ > RTE_FLOW_ERROR_TYPE_ACTION, NULL, > "can't have 2 encap actions in same" > " flow"); > + if (action_flags & (MLX5_FLOW_ACTION_TUNNEL_DECAP | > + MLX5_FLOW_ACTION_TUNNEL_DECAP_L3)) > + return rte_flow_error_set(error, EINVAL, > + RTE_FLOW_ERROR_TYPE_ACTION, NULL, > + "can't encap and decap in same" > + " flow"); > if (attr->ingress) > return rte_flow_error_set(error, ENOTSUP, > RTE_FLOW_ERROR_TYPE_ATTR_INGRESS, > @@ -177,6 +189,100 @@ > } > =20 > /** > + * Validate the tunnel decap action > + * > + * @param[in] action_flags > + * holds the actions detected until now. > + * @param[in] attr > + * Pointer to flow attributes > + * @param[out] error > + * Pointer to error structure. > + * > + * @return > + * 0 on success, a negative errno value otherwise and rte_ernno is set= . > + */ > +static int > +flow_dv_validate_action_tunnel_decap(uint64_t action_flags, > + const struct rte_flow_attr *attr, > + struct rte_flow_error *error) > +{ > + if (action_flags & MLX5_FLOW_ACTION_DROP) > + return rte_flow_error_set(error, EINVAL, > + RTE_FLOW_ERROR_TYPE_ACTION, NULL, > + "can't drop and decap in same flow"); > + if (action_flags & (MLX5_FLOW_ACTION_TUNNEL_DECAP | > + MLX5_FLOW_ACTION_TUNNEL_DECAP_L3)) > + return rte_flow_error_set(error, EINVAL, > + RTE_FLOW_ERROR_TYPE_ACTION, NULL, > + "can't have 2 decap actions in same" > + " flow"); > + if (action_flags & (MLX5_FLOW_ACTION_TUNNEL_ENCAP | > + MLX5_FLOW_ACTION_TUNNEL_ENCAP_L3)) > + return rte_flow_error_set(error, EINVAL, > + RTE_FLOW_ERROR_TYPE_ACTION, NULL, > + "can't encap and decap in same" > + " flow"); > + if (attr->egress) > + return rte_flow_error_set(error, ENOTSUP, > + RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, NULL, > + "decap action not supported for " > + "egress"); > + return 0; > +} > + > +/** > + * Validate the tunnel decap L3 action > + * > + * @param[in] action_flags > + * holds the actions detected until now. > + * @param[in] action > + * Pointer to the decap action. > + * @param[in] attr > + * Pointer to flow attributes > + * @param[out] error > + * Pointer to error structure. > + * > + * @return > + * 0 on success, a negative errno value otherwise and rte_ernno is set= . > + */ > +static int > +flow_dv_validate_action_tunnel_decap_l3(uint64_t action_flags, > + const struct rte_flow_action *action, > + const struct rte_flow_attr *attr, > + struct rte_flow_error *error) > +{ > + const struct rte_flow_action_tunnel_decap_l3 *tunnel_decap_l3 =3D > + action->conf; > + > + if (!tunnel_decap_l3 || !(tunnel_decap_l3->buf)) > + return rte_flow_error_set(error, EINVAL, > + RTE_FLOW_ERROR_TYPE_ACTION, action, > + "configuration cannot be null"); > + if (action_flags & MLX5_FLOW_ACTION_DROP) > + return rte_flow_error_set(error, EINVAL, > + RTE_FLOW_ERROR_TYPE_ACTION, NULL, > + "can't drop and decap in same flow"); > + if (action_flags & (MLX5_FLOW_ACTION_TUNNEL_DECAP | > + MLX5_FLOW_ACTION_TUNNEL_DECAP_L3)) > + return rte_flow_error_set(error, EINVAL, > + RTE_FLOW_ERROR_TYPE_ACTION, NULL, > + "can't have 2 decap actions in same" > + " flow"); > + if (action_flags & (MLX5_FLOW_ACTION_TUNNEL_ENCAP | > + MLX5_FLOW_ACTION_TUNNEL_ENCAP_L3)) > + return rte_flow_error_set(error, EINVAL, > + RTE_FLOW_ERROR_TYPE_ACTION, NULL, > + "can't encap and decap in same" > + " flow"); > + if (attr->egress) > + return rte_flow_error_set(error, ENOTSUP, > + RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, NULL, > + "decap action not supported for " > + "egress"); > + return 0; > +} > + > +/** > * Convert encap action to DV specification. > * > * @param[in] dev > @@ -246,6 +352,72 @@ > } > =20 > /** > + * Convert decap action to DV specification. > + * > + * @param[in] dev > + * Pointer to rte_eth_dev structure. > + * @param[in] action > + * Pointer to action structure. > + * @param[out] error > + * Pointer to the error structure. > + * > + * @return > + * Pointer to action on success, NULL otherwise and rte_errno is set. > + */ > +static struct ibv_flow_action * > +flow_dv_create_decap(struct rte_eth_dev *dev, > + const struct rte_flow_action *action __rte_unused, > + struct rte_flow_error *error) > +{ > + struct ibv_flow_action *decap_verb =3D NULL; > + struct priv *priv =3D dev->data->dev_private; > + > + decap_verb =3D mlx5_glue->dv_create_flow_action_packet_reformat > + (priv->ctx, 0, NULL, > + MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L2_TUNNEL_TO_L2, > + MLX5DV_FLOW_TABLE_TYPE_NIC_RX); > + if (!decap_verb) > + rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, > + NULL, "cannot create decap action"); > + return decap_verb; > +} > + > +/** > + * Convert decap L3 action to DV specification. > + * > + * @param[in] dev > + * Pointer to rte_eth_dev structure. > + * @param[in] action > + * Pointer to action structure. > + * @param[out] error > + * Pointer to the error structure. > + * > + * @return > + * Pointer to action on success, NULL otherwise and rte_errno is set. > + */ > +static struct ibv_flow_action * > +flow_dv_create_decap_l3(struct rte_eth_dev *dev, > + const struct rte_flow_action *action, > + struct rte_flow_error *error) > +{ > + struct ibv_flow_action *decap_l3_verb =3D NULL; > + const struct rte_flow_action_tunnel_decap_l3 *decap_l3_data; > + struct priv *priv =3D dev->data->dev_private; > + > + decap_l3_data =3D > + (const struct rte_flow_action_tunnel_decap_l3 *)action->conf; > + decap_l3_verb =3D mlx5_glue->dv_create_flow_action_packet_reformat > + (priv->ctx, decap_l3_data->size, > + decap_l3_data->size ? decap_l3_data->buf : NULL, > + MLX5DV_FLOW_ACTION_PACKET_REFORMAT_TYPE_L3_TUNNEL_TO_L2, > + MLX5DV_FLOW_TABLE_TYPE_NIC_RX); > + if (!decap_l3_verb) > + rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION, > + NULL, "cannot create decap L3 action"); > + return decap_l3_verb; > +} > + > +/** > * Verify the @p attributes will be correctly understood by the NIC and = store > * them in the @p flow if everything is correct. > * > @@ -506,6 +678,20 @@ > return ret; > action_flags |=3D MLX5_FLOW_ACTION_TUNNEL_ENCAP_L3; > break; > + case RTE_FLOW_ACTION_TYPE_TUNNEL_DECAP: > + ret =3D flow_dv_validate_action_tunnel_decap > + (action_flags, attr, error); > + if (ret < 0) > + return ret; > + action_flags |=3D MLX5_FLOW_ACTION_TUNNEL_DECAP; > + break; > + case RTE_FLOW_ACTION_TYPE_TUNNEL_DECAP_L3: > + ret =3D flow_dv_validate_action_tunnel_decap_l3 > + (action_flags, actions, attr, error); > + if (ret < 0) > + return ret; > + action_flags |=3D MLX5_FLOW_ACTION_TUNNEL_DECAP_L3; > + break; > default: > return rte_flow_error_set(error, ENOTSUP, > RTE_FLOW_ERROR_TYPE_ACTION, > @@ -1301,6 +1487,30 @@ > flow->actions |=3D MLX5_FLOW_ACTION_TUNNEL_ENCAP_L3; > actions_n++; > break; > + case RTE_FLOW_ACTION_TYPE_TUNNEL_DECAP: > + dev_flow->dv.actions[actions_n].type =3D > + MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > + dev_flow->dv.actions[actions_n].action =3D > + flow_dv_create_decap(dev, action, error); > + if (!(dev_flow->dv.actions[actions_n].action)) > + return -rte_errno; > + dev_flow->dv.decap_verb =3D > + dev_flow->dv.actions[actions_n].action; > + flow->actions |=3D MLX5_FLOW_ACTION_TUNNEL_DECAP; > + actions_n++; > + break; > + case RTE_FLOW_ACTION_TYPE_TUNNEL_DECAP_L3: > + dev_flow->dv.actions[actions_n].type =3D > + MLX5DV_FLOW_ACTION_IBV_FLOW_ACTION; > + dev_flow->dv.actions[actions_n].action =3D > + flow_dv_create_decap_l3(dev, action, error); > + if (!(dev_flow->dv.actions[actions_n].action)) > + return -rte_errno; > + dev_flow->dv.decap_verb =3D > + dev_flow->dv.actions[actions_n].action; > + flow->actions |=3D MLX5_FLOW_ACTION_TUNNEL_DECAP_L3; > + actions_n++; > + break; > default: > break; > } > @@ -1661,6 +1871,11 @@ > (dev_flow->dv.encap_verb)); > dev_flow->dv.encap_verb =3D NULL; > } > + if (dev_flow->dv.decap_verb) { > + claim_zero(mlx5_glue->destroy_flow_action > + (dev_flow->dv.decap_verb)); > + dev_flow->dv.decap_verb =3D NULL; > + } > rte_free(dev_flow); > } > } > --=20 > 1.8.3.1 >=20