From patchwork Tue Feb 13 13:48:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ori Kam X-Patchwork-Id: 136637 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 209C043AD8; Tue, 13 Feb 2024 14:50:46 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0D90340647; Tue, 13 Feb 2024 14:50:46 +0100 (CET) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2040.outbound.protection.outlook.com [40.107.236.40]) by mails.dpdk.org (Postfix) with ESMTP id EECE340294 for ; Tue, 13 Feb 2024 14:50:43 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=JueWj32C9+CaEixB1pudGbivQQ0jSIVvo2bMfuOWTnp4Fc3gbL6E/D+lZBzxryuBv3CfavSz1n3ZrG5760D90vcK6ikIj48px/UbrQIL57Z0gBuhvATOkm5MyVb805/BhYOLez2+QnlEV5ItGiMaS1E2drO261F5tSxPwi3CeIS4ClpEwrnVBQMX419zsnqRzHYRjGLYvOwnZ7o4LOx159z5SL3bzKVQ4FJKp+m+uTiD2pydn/YOFstMEZGjYQISqOfCVDlJq4gxljR209qj84wX/gqzr4sxy8KhMME6PLjCXNKighaL45esbTgMgjmiPRSCvMC3vedGCn0tBGzcdA== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=HCu50r8PMOXbWO6KcSdBRJbde6eBlQ6RLKMDZNrsfSc=; b=FUCjTGzLwWXGAcZjyfE3RhZhHS2yfJcHNC3SMQ051jEzf0KXOnLnmLkp1eimLM23LRk3MxVwHuDcpk7XQmwq+2WaJU5kl1XacWYwmqXkQCLoZ/EzXHze+mEJxjzf3KYrfJW+hEEcHkHkD9J0/RHnh6VkX1Y/MXHN9FbSRQAiFWcCtlYSRgu2Zv5gbfrrzBkFvUNl36fE2q1vbe3Tjdg2ZaAOYVcR0mkj6t5Gbisnzc1BDxXDbT/GKhB78U2ko/VYTp0+4FU1TlHFyybVFleThX9rYZBDbwp99YyvKcNuZYE51Dcswgz/YfErU4Ypyi0h0LxTWbppP1gxidLkeTgySw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=amd.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=HCu50r8PMOXbWO6KcSdBRJbde6eBlQ6RLKMDZNrsfSc=; b=UGJIDWATTRttQdhergVVQlIuyTv/yThdknOqSwxXZibnqN2z7G0l4LExxNaTPJ9v6YhJ5VufUxeIqUZEnROqzRzOFxvH7euek1hrnlLlCpTXqFbwti69FporY+pA+9wB7Wxan6irorPcnO5r3wHFgvXXySO5McLd7cD8TEI+QlskLscap0csJ0ybBFbLqT/4zh9d+AKobTj2V/RWlg8UVZ7JHvldz14cvZpbMbQZJzFZg15WL7WJu81eQ1SmW+SJR9cncItILCHphalTKi151y7Ldveyz/NmLqApAZkm57Cqc8folrKjzTvUoY9vxHCtVgohFfwbbzj+NlehlksgKQ== Received: from PH8PR07CA0016.namprd07.prod.outlook.com (2603:10b6:510:2cd::24) by PH7PR12MB5733.namprd12.prod.outlook.com (2603:10b6:510:1e0::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7292.11; Tue, 13 Feb 2024 13:50:39 +0000 Received: from SN1PEPF0002BA4B.namprd03.prod.outlook.com (2603:10b6:510:2cd:cafe::73) by PH8PR07CA0016.outlook.office365.com (2603:10b6:510:2cd::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7270.40 via Frontend Transport; Tue, 13 Feb 2024 13:50:39 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by SN1PEPF0002BA4B.mail.protection.outlook.com (10.167.242.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7292.25 via Frontend Transport; Tue, 13 Feb 2024 13:50:39 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Tue, 13 Feb 2024 05:50:23 -0800 Received: from nvidia.com (10.126.230.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1258.12; Tue, 13 Feb 2024 05:50:20 -0800 From: Ori Kam To: , , , , , Thomas Monjalon CC: , , Subject: [PATCH v3 1/4] ethdev: introduce encap hash calculation Date: Tue, 13 Feb 2024 15:48:30 +0200 Message-ID: <20240213134834.16762-1-orika@nvidia.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240128093943.4461-1-orika@nvidia.com> References: <20240128093943.4461-1-orika@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [10.126.230.35] X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF0002BA4B:EE_|PH7PR12MB5733:EE_ X-MS-Office365-Filtering-Correlation-Id: c5608110-9649-497a-8be6-08dc2c9ac391 X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Pw5S7xn8GI/lvR8nC7ngOXEC3/gvno67fZJIPIVcRRQ46v8kicA4teOldkp0tFneipeHerAbKGKHRxImmBKBPrhwjJc5ye7iC59zzpOdJgWfhfxJ98+uhW4tRx9RR5R4dGoAmxxYhvGxTO/pTx6AMP3+OF3ncMZntbbfKQojwqh2lexc6ruHYkEMFNSMehE2g5jGUzvnEV0/aZM4jIsilBR+BdH2YBfV2jSrqjaCuSNeUfdT1T+PRSbUjMf/t2V/1u45pUMB7sHxQN6hGReCPFdOtx0Un6bC6FqIWgVejEhQokWreuBxKmA9se1c3mPuSnnY6W3QWFOvZL4N9pB+ypo7HGnKfdQD7N66mhs8GzJXWeQPjsm1Cw8rSIH+TatWRzGAy4JnTrJHPzINs/H8VM33dsHhdG9Rk4rBlV/JY5a7n/3DTIMZh8oQ8pVoD14JC6DtlKHGuFiQaVc0z12lmeVTPqRj5DWwAPwrPM6r/I2j8diLDsHPghKAKyjI61ZKkZkzu00WRnGBx2mnS8TP8W+FVTMoLERME45ZS4Dx0gR8AgWXgjQmT67pruZOmgQAz3P9vBFCYG5vvsU+8QLCOQWIDyPv/Gm5iPObxbuLfGM= X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230031)(4636009)(376002)(39860400002)(346002)(396003)(136003)(230273577357003)(230922051799003)(64100799003)(82310400011)(1800799012)(451199024)(186009)(36840700001)(46966006)(40470700004)(41300700001)(82740400003)(36756003)(316002)(7636003)(54906003)(6666004)(86362001)(8676002)(356005)(4326008)(478600001)(26005)(6286002)(70206006)(70586007)(1076003)(110136005)(2616005)(83380400001)(426003)(8936002)(7696005)(336012)(16526019)(107886003)(5660300002)(2906002)(55016003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Feb 2024 13:50:39.6042 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c5608110-9649-497a-8be6-08dc2c9ac391 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF0002BA4B.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5733 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org During encapsulation of a packet, it is possible to change some outer headers to improve flow destribution. For example, from VXLAN RFC: "It is recommended that the UDP source port number be calculated using a hash of fields from the inner packet -- one example being a hash of the inner Ethernet frame's headers. This is to enable a level of entropy for the ECMP/load-balancing" The tunnel protocol defines which outer field should hold this hash, but it doesn't define the hash calculation algorithm. An application that uses flow offloads gets the first few packets (exception path) and then decides to offload the flow. As a result, there are two different paths that a packet from a given flow may take. SW for the first few packets or HW for the rest. When the packet goes through the SW, the SW encapsulates the packet and must use the same hash calculation as the HW will do for the rest of the packets in this flow. the new function rte_flow_calc_encap_hash can query the hash value fromm the driver for a given packet as if the packet was passed through the HW. Signed-off-by: Ori Kam Acked-by: Dariusz Sosnowski --- doc/guides/prog_guide/rte_flow.rst | 14 +++++++ doc/guides/rel_notes/release_24_03.rst | 6 ++- lib/ethdev/rte_flow.c | 29 ++++++++++++++ lib/ethdev/rte_flow.h | 53 ++++++++++++++++++++++++++ lib/ethdev/rte_flow_driver.h | 5 +++ lib/ethdev/version.map | 1 + 6 files changed, 107 insertions(+), 1 deletion(-) diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index 34dc06ec66..294862d502 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -4226,6 +4226,20 @@ as it would be calculated in the HW. uint8_t pattern_template_index, uint32_t *hash, struct rte_flow_error *error); +Calculate encapsulation hash +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Calculating hash of a packet as it would be calculated by the HW, when encapsulating +a packet. + +When the HW execute an encapsulation action, for example VXLAN tunnel, +it may calculate an hash of the packet to be encapsulated. +This hash is stored in the outer header of the tunnel. +This allow better spreading of traffic. + +This function can be used for packets of a flow that are not offloaded and +pass through the SW instead of the HW, for example, SYN/FIN packets. + .. _flow_isolated_mode: Flow isolated mode diff --git a/doc/guides/rel_notes/release_24_03.rst b/doc/guides/rel_notes/release_24_03.rst index 358998e988..cf114ead89 100644 --- a/doc/guides/rel_notes/release_24_03.rst +++ b/doc/guides/rel_notes/release_24_03.rst @@ -60,6 +60,11 @@ New Features * Added new function ``rte_eth_find_rss_algo`` to get RSS hash algorithm by its name. +* **Added hash calculation of an encapsulated packet as done by the HW.** + + Added function to calculate hash when doing tunnel encapsulation: + ``rte_flow_calc_encap_hash()`` + * **Added flow matching of random value.** * Added ``RTE_FLOW_ITEM_TYPE_RANDOM`` to match random value. @@ -102,7 +107,6 @@ New Features * Added HW steering support for modify field ``RTE_FLOW_FIELD_GENEVE_OPT_CLASS`` flow action. * Added HW steering support for modify field ``RTE_FLOW_FIELD_GENEVE_OPT_DATA`` flow action. - Removed Items ------------- diff --git a/lib/ethdev/rte_flow.c b/lib/ethdev/rte_flow.c index b06da0cc00..7a4f7a94f6 100644 --- a/lib/ethdev/rte_flow.c +++ b/lib/ethdev/rte_flow.c @@ -2484,3 +2484,32 @@ rte_flow_calc_table_hash(uint16_t port_id, const struct rte_flow_template_table hash, error); return flow_err(port_id, ret, error); } + +int +rte_flow_calc_encap_hash(uint16_t port_id, const struct rte_flow_item pattern[], + enum rte_flow_encap_hash_field dest_field, uint8_t hash_len, + uint8_t *hash, struct rte_flow_error *error) +{ + int ret; + struct rte_eth_dev *dev; + const struct rte_flow_ops *ops; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + ops = rte_flow_ops_get(port_id, error); + if (!ops || !ops->flow_calc_encap_hash) + return rte_flow_error_set(error, ENOTSUP, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "calc encap hash is not supported"); + if (dest_field > RTE_FLOW_ENCAP_HASH_FIELD_NVGRE_FLOW_ID) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "hash dest field is not defined"); + if ((dest_field == RTE_FLOW_ENCAP_HASH_FIELD_SRC_PORT && hash_len != 2) || + (dest_field == RTE_FLOW_ENCAP_HASH_FIELD_NVGRE_FLOW_ID && hash_len != 1)) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "hash len doesn't match the requested field len"); + dev = &rte_eth_devices[port_id]; + ret = ops->flow_calc_encap_hash(dev, pattern, dest_field, hash, error); + return flow_err(port_id, ret, error); +} diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index 09c1b13381..48e4f47844 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -6846,6 +6846,59 @@ rte_flow_calc_table_hash(uint16_t port_id, const struct rte_flow_template_table const struct rte_flow_item pattern[], uint8_t pattern_template_index, uint32_t *hash, struct rte_flow_error *error); +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Destination field type for the hash calculation, when encap action is used. + * The encap field implies the size, meaning XXX_SRC_PORT hash len is 2 bytes, + * while XXX_NVGRE_FLOW_ID hash len is 1 byte. + * + * @see function rte_flow_calc_encap_hash + */ +enum rte_flow_encap_hash_field { + /** Calculate hash placed in UDP source port field. */ + RTE_FLOW_ENCAP_HASH_FIELD_SRC_PORT, + /** Calculate hash placed in NVGRE flow ID field. */ + RTE_FLOW_ENCAP_HASH_FIELD_NVGRE_FLOW_ID, +}; + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice. + * + * Simulate HW hash calculation that is done when an encap action is being used. + * This hash can be stored in tunnel outer header to improve packet distribution. + * + * @param[in] port_id + * Port identifier of Ethernet device. + * @param[in] pattern + * The values to be used in the hash calculation. + * @param[in] dest_field + * Type of destination field for hash calculation. + * @param[in] hash_len + * The length of the hash pointer in bytes. Should be according to dest_field. + * @param[out] hash + * Used to return the calculated hash. It will be written in network order, + * so hash[0] is the MSB. + * The number of bytes is based on the destination field type. + * @param[out] error + * Perform verbose error reporting if not NULL. + * PMDs initialize this structure in case of error only. + * + * @return + * - (0) if success. + * - (-ENODEV) if *port_id* invalid. + * - (-ENOTSUP) if underlying device does not support this functionality. + * - (-EINVAL) if *pattern* doesn't hold enough information to calculate the hash + * or the dest is not supported. + */ +__rte_experimental +int +rte_flow_calc_encap_hash(uint16_t port_id, const struct rte_flow_item pattern[], + enum rte_flow_encap_hash_field dest_field, uint8_t hash_len, + uint8_t *hash, struct rte_flow_error *error); + #ifdef __cplusplus } #endif diff --git a/lib/ethdev/rte_flow_driver.h b/lib/ethdev/rte_flow_driver.h index f35f659503..447163655a 100644 --- a/lib/ethdev/rte_flow_driver.h +++ b/lib/ethdev/rte_flow_driver.h @@ -370,6 +370,11 @@ struct rte_flow_ops { (struct rte_eth_dev *dev, const struct rte_flow_template_table *table, const struct rte_flow_item pattern[], uint8_t pattern_template_index, uint32_t *hash, struct rte_flow_error *error); + /** @see rte_flow_calc_encap_hash() */ + int (*flow_calc_encap_hash) + (struct rte_eth_dev *dev, const struct rte_flow_item pattern[], + enum rte_flow_encap_hash_field dest_field, uint8_t *hash, + struct rte_flow_error *error); }; /** diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index a050baab0f..360898d067 100644 --- a/lib/ethdev/version.map +++ b/lib/ethdev/version.map @@ -319,6 +319,7 @@ EXPERIMENTAL { # added in 24.03 rte_eth_find_rss_algo; + rte_flow_calc_encap_hash; }; INTERNAL {