From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3E07AA034F for ; Mon, 6 Dec 2021 11:38:42 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0400640040; Mon, 6 Dec 2021 11:38:42 +0100 (CET) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2077.outbound.protection.outlook.com [40.107.223.77]) by mails.dpdk.org (Postfix) with ESMTP id 0E8E340040 for ; Mon, 6 Dec 2021 11:38:41 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=i5Ssj5XebHMlvUiIbaeV0f3xGoad4ipqm6anaVsBq8x0irKcyXkr4KFzcYS7aau1qtFedLaOsIkF8lToNgmWI2wHM4ZtyITPrGrjvalKLIZPcjMP+ezcn7gapH579JDzEocjC29yHwzt9GYPWCZHxBHddjhMSvl1f0O+YOqGiqngQTmQtA9+TYacR07rMkpqBLZzAmDzFeXxBu8o8buRJxaj6OpwqiYx9pYUZwH2TSuRwKYOlpD4oGt6zWBJWOHt4ZaIC7hkVl5NAEQASasfF+gPuRujzGcoNzxZhE5TFnS8F+vmIwoMukV1B48l3xd1ZegKuvtB4raEvFNlbmRc6A== 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=ZCCtChUl2vHpIMXaeSoLv6S3rarHfVe9SiQ1/ycaVPg=; b=bGXns+9BvBBDdtkDNm/qzeMSyFyutRl0EN7/5bYQRrQuePHxQjY+tziPPNGo8SGy2780G1xQKk1Z8SATGTiBSgP8ajYUCUz/FiosKx/igE8XqdDY+RBnviw4QfGR6wuASzV32nHVBXDqJ+H3R5j+2jFDScW9eCfPPd3/jnUXi+SjJUCZSTQrkVcarDOisUjXSk6SJXMerN/OfbgwwWn7dOUxned0B27hSzaQdIVnwQVVtvj/O36qVeR4/quLCFy6iIDoJ48DfGFK/CjPL+qxG4QLmCx1Ql4Xw3RBxiJSVR00LEjcESVxV95rtZnoWo4CCLTbxLJm3WCTEpoXv9w7rg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.34) smtp.rcpttodomain=canonical.com smtp.mailfrom=nvidia.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none 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=ZCCtChUl2vHpIMXaeSoLv6S3rarHfVe9SiQ1/ycaVPg=; b=YP7awMtLGFGc1gON0aBkYQxZ4RU8PH1Fwcxp5Zi09xK9323y8Z6M1Rp64OCpZuX8koaNUPWhJi7ruXxdZcrZzv3bKh816kXnjONLnGX3he4BAM3cuTwpEh1C8uwLsrXN99pnMbP0a0UeCIhyqPyEDY1oF1NGPU3Nm7KP1MW+ubBm7Xgw87989kr04lXO7wEYDEPqqMe2gyF9yKcRYd5QNaSjmQfsO6IqlTv5Jn4oPSKgfnawshsvq3/wvkDtIXmubFMoDgLe86GTvKLbBmnrH3E6u+em94PmUQsaiq07AaFEFCua+pXjxmewGrkwwJ8ukebeTpwkYcudHSTqiCsoOQ== Received: from BN6PR21CA0016.namprd21.prod.outlook.com (2603:10b6:404:8e::26) by MN2PR12MB3069.namprd12.prod.outlook.com (2603:10b6:208:c4::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4734.24; Mon, 6 Dec 2021 10:38:38 +0000 Received: from BN8NAM11FT032.eop-nam11.prod.protection.outlook.com (2603:10b6:404:8e:cafe::84) by BN6PR21CA0016.outlook.office365.com (2603:10b6:404:8e::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4801.3 via Frontend Transport; Mon, 6 Dec 2021 10:38:38 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.34) 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.112.34 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.34; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.34) by BN8NAM11FT032.mail.protection.outlook.com (10.13.177.88) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4755.13 via Frontend Transport; Mon, 6 Dec 2021 10:38:38 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Mon, 6 Dec 2021 10:38:37 +0000 Received: from nvidia.com (172.20.187.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.986.9; Mon, 6 Dec 2021 02:38:35 -0800 From: Gregory Etelson To: CC: , , , , , Christian Ehrhardt Subject: [PATCH 19.11 v2 1/2] net/mlx5: fix GRE protocol type translation Date: Mon, 6 Dec 2021 12:38:22 +0200 Message-ID: <20211206103822.29812-1-getelson@nvidia.com> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20211202160314.26638-1-getelson@nvidia.com> References: <20211202160314.26638-1-getelson@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [172.20.187.6] X-ClientProxiedBy: HQMAIL105.nvidia.com (172.20.187.12) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 44594d2a-6c1a-468b-2644-08d9b8a49060 X-MS-TrafficTypeDiagnostic: MN2PR12MB3069:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:85; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5uwxatKtvfkvNMBbHfoAD4QXp1Xjf9L45mADfMpzHxLSTqeNgo3aQrdS3dg3/lo05wmXRcqqlc14ycH94GX7M6BfVjk3o93zLD0E4FPRltQzoxLa1xRwKpX1R4kFBKGvZozNdPkFWqji0vveyPuTwcXbnBUHVUaIVLRUDwx4YKG7LpJzlBmVvlq12m9DEj8tJoKnWm6eZHsa/XAsqq4/o0SHhawoH+0dkzjTQD7SRHTfj0rsVOZYNwsH0uHIWbVFGzsVGuSGnPPK4Qs0p25yh6LJjHZbwNpzxCTli7cxKkOS5VRMpFAWGImSiexgILzuzOu95gWSyP9EsZSXjSRgYy81chs6p1nVI8vIjHpuqruzVa933PCmZsqB0OARMEI0l0I38JVlYCGpYgPbiv9mufKqUbPKZQqm/JCrw3NoIVcvlv7ravgDU7YAcX1Ey90/1PoAJUfa9+pVwu1NIeFnuuxZk6vV+IXLYVFWuQgPn8r7FVUrlR4X3bWL+nzsZl6N+59sZy9AIpo7A5bkxFfPF7ok7fB+ZZYDc4wgEn7h2eWClnXUlmTjqJ9LjMDw5VkE6YQy5MhbxxQDlZ5QclbIZy00sLW5jUwKn9DlTwC47ms96kaqT/vE7Zb2nBmHjbtr/e65g7lu0MyUMcTDOWWPIOTU/iv9hHxvfrd8ySyXi4+m8GKnUjlUgrhH5eusEpdljNwTtZQArg9CO20ILY2RL7QDC8Ym/47AY9Egqrm8WEkmEUX16kd/ryAWo063MTv5 X-Forefront-Antispam-Report: CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE; SFS:(4636009)(36840700001)(46966006)(40470700001)(16526019)(55016003)(82310400004)(37006003)(316002)(1076003)(36860700001)(6862004)(83380400001)(6666004)(26005)(54906003)(336012)(6286002)(186003)(36756003)(426003)(86362001)(7049001)(7696005)(6200100001)(40460700001)(356005)(2906002)(5660300002)(7636003)(2616005)(8676002)(70586007)(4326008)(70206006)(8936002)(47076005)(508600001); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Dec 2021 10:38:38.4201 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 44594d2a-6c1a-468b-2644-08d9b8a49060 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT032.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB3069 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org [ upstream commit be26e81bfc1cb681d3ee0764aa6733000869984a ] When application creates several flows to match on GRE tunnel without explicitly specifying GRE protocol type value in flow rules, PMD will translate that to zero mask. RDMA-CORE cannot distinguish between different inner flow types and produces identical matchers for each zero mask. The patch extracts inner header type from flow rule and forces it in GRE protocol type, if application did not specify any without explicitly specifying GRE protocol type value in flow rules, protocol type value. Fixes: fc2c498ccb94 ("net/mlx5: add Direct Verbs translate items") Cc: stable@dpdk.org Signed-off-by: Gregory Etelson Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5_flow_dv.c | 70 +++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index 8dec8d9ff5..a65a670045 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -5875,18 +5875,19 @@ flow_dv_translate_item_gre_key(void *matcher, void *key, * Flow matcher value. * @param[in] item * Flow pattern to translate. - * @param[in] inner - * Item is inner pattern. + * @param[in] pattern_flags + * Accumulated pattern flags. */ static void flow_dv_translate_item_gre(void *matcher, void *key, const struct rte_flow_item *item, - int inner) + uint64_t pattern_flags) { + static const struct rte_flow_item_gre empty_gre = {0,}; const struct rte_flow_item_gre *gre_m = item->mask; const struct rte_flow_item_gre *gre_v = item->spec; - void *headers_m; - void *headers_v; + void *headers_m = MLX5_ADDR_OF(fte_match_param, matcher, outer_headers); + void *headers_v = MLX5_ADDR_OF(fte_match_param, key, outer_headers); void *misc_m = MLX5_ADDR_OF(fte_match_param, matcher, misc_parameters); void *misc_v = MLX5_ADDR_OF(fte_match_param, key, misc_parameters); struct { @@ -5903,26 +5904,17 @@ flow_dv_translate_item_gre(void *matcher, void *key, uint16_t value; }; } gre_crks_rsvd0_ver_m, gre_crks_rsvd0_ver_v; + uint16_t protocol_m, protocol_v; - if (inner) { - headers_m = MLX5_ADDR_OF(fte_match_param, matcher, - inner_headers); - headers_v = MLX5_ADDR_OF(fte_match_param, key, inner_headers); - } else { - headers_m = MLX5_ADDR_OF(fte_match_param, matcher, - outer_headers); - headers_v = MLX5_ADDR_OF(fte_match_param, key, outer_headers); - } MLX5_SET(fte_match_set_lyr_2_4, headers_m, ip_protocol, 0xff); MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol, IPPROTO_GRE); - if (!gre_v) - return; - if (!gre_m) - gre_m = &rte_flow_item_gre_mask; - MLX5_SET(fte_match_set_misc, misc_m, gre_protocol, - rte_be_to_cpu_16(gre_m->protocol)); - MLX5_SET(fte_match_set_misc, misc_v, gre_protocol, - rte_be_to_cpu_16(gre_v->protocol & gre_m->protocol)); + if (!gre_v) { + gre_v = &empty_gre; + gre_m = &empty_gre; + } else { + if (!gre_m) + gre_m = &rte_flow_item_gre_mask; + } gre_crks_rsvd0_ver_m.value = rte_be_to_cpu_16(gre_m->c_rsvd0_ver); gre_crks_rsvd0_ver_v.value = rte_be_to_cpu_16(gre_v->c_rsvd0_ver); MLX5_SET(fte_match_set_misc, misc_m, gre_c_present, @@ -5940,6 +5932,16 @@ flow_dv_translate_item_gre(void *matcher, void *key, MLX5_SET(fte_match_set_misc, misc_v, gre_s_present, gre_crks_rsvd0_ver_v.s_present & gre_crks_rsvd0_ver_m.s_present); + protocol_m = rte_be_to_cpu_16(gre_m->protocol); + protocol_v = rte_be_to_cpu_16(gre_v->protocol); + if (!protocol_m) { + /* Force next protocol to prevent matchers duplication */ + protocol_m = 0xFFFF; + protocol_v = mlx5_translate_tunnel_etypes(pattern_flags); + } + MLX5_SET(fte_match_set_misc, misc_m, gre_protocol, protocol_m); + MLX5_SET(fte_match_set_misc, misc_v, gre_protocol, + protocol_m & protocol_v); } /** @@ -5951,13 +5953,13 @@ flow_dv_translate_item_gre(void *matcher, void *key, * Flow matcher value. * @param[in] item * Flow pattern to translate. - * @param[in] inner - * Item is inner pattern. + * @param[in] pattern_flags + * Accumulated pattern flags. */ static void flow_dv_translate_item_nvgre(void *matcher, void *key, const struct rte_flow_item *item, - int inner) + unsigned long pattern_flags) { const struct rte_flow_item_nvgre *nvgre_m = item->mask; const struct rte_flow_item_nvgre *nvgre_v = item->spec; @@ -5984,7 +5986,7 @@ flow_dv_translate_item_nvgre(void *matcher, void *key, .mask = &gre_mask, .last = NULL, }; - flow_dv_translate_item_gre(matcher, key, &gre_item, inner); + flow_dv_translate_item_gre(matcher, key, &gre_item, pattern_flags); if (!nvgre_v) return; if (!nvgre_m) @@ -7788,11 +7790,10 @@ __flow_dv_translate(struct rte_eth_dev *dev, MLX5_FLOW_LAYER_OUTER_L4_UDP; break; case RTE_FLOW_ITEM_TYPE_GRE: - flow_dv_translate_item_gre(match_mask, match_value, - items, tunnel); matcher.priority = flow->rss.level >= 2 ? MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4; last_item = MLX5_FLOW_LAYER_GRE; + tunnel_item = items; break; case RTE_FLOW_ITEM_TYPE_GRE_KEY: flow_dv_translate_item_gre_key(match_mask, @@ -7800,11 +7801,10 @@ __flow_dv_translate(struct rte_eth_dev *dev, last_item = MLX5_FLOW_LAYER_GRE_KEY; break; case RTE_FLOW_ITEM_TYPE_NVGRE: - flow_dv_translate_item_nvgre(match_mask, match_value, - items, tunnel); matcher.priority = flow->rss.level >= 2 ? MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4; last_item = MLX5_FLOW_LAYER_GRE; + tunnel_item = items; break; case RTE_FLOW_ITEM_TYPE_VXLAN: flow_dv_translate_item_vxlan(match_mask, match_value, @@ -7892,6 +7892,16 @@ __flow_dv_translate(struct rte_eth_dev *dev, else if (item_flags & MLX5_FLOW_LAYER_GENEVE) flow_dv_translate_item_geneve(match_mask, match_value, tunnel_item, item_flags); + else if (item_flags & MLX5_FLOW_LAYER_GRE) { + if (tunnel_item->type == RTE_FLOW_ITEM_TYPE_GRE) + flow_dv_translate_item_gre(match_mask, match_value, + tunnel_item, item_flags); + else if (tunnel_item->type == RTE_FLOW_ITEM_TYPE_NVGRE) + flow_dv_translate_item_nvgre(match_mask, match_value, + tunnel_item, item_flags); + else + RTE_VERIFY(false); + } assert(!flow_dv_check_valid_spec(matcher.mask.buf, dev_flow->dv.value.buf)); /* -- 2.34.0