From patchwork Thu Jan 25 13:30:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Baum X-Patchwork-Id: 136163 X-Patchwork-Delegate: rasland@nvidia.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 E246D439C1; Thu, 25 Jan 2024 14:33:44 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 18C4142E8F; Thu, 25 Jan 2024 14:31:51 +0100 (CET) Received: from NAM02-BN1-obe.outbound.protection.outlook.com (mail-bn1nam02on2051.outbound.protection.outlook.com [40.107.212.51]) by mails.dpdk.org (Postfix) with ESMTP id 4369F42E7F for ; Thu, 25 Jan 2024 14:31:48 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=W1hid8I9CqzWk3spGDL3tROVH8jTtlW8/HU7YpjwOfvZNLUMuPt6nsdGRlf0HJ65nW7gWNYSaziu1MIAbaku3lPllZhLGnaj1Dq/6s747nS0auZPfa+0TY/6cPlYv2CP25xU6Yh32FDUFU4j/nr7k/fd34JSLsj35yxlQWWhW1uyvYPwt/FJ/iB9ShVRXrpF8Kt+HWlG/Vbhlzq/C9lcTysFy04+vFK9//QzfAqYtO2bA61spWAtsEwfQkYyf4/F2N5xTCg7utPAaeYIsfr39eTwKyPdUBdVxpmu7nXgpGGjDtwzEY30yfSzZ/HFG+p0v6BB7Uc+ZaFWLIgsBc+39g== 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=o+XnjwzRTc+o8TKMvjNXYTLMLpQLSsglgSXT2Auz2D4=; b=jBPaVw2sutT3Hl70MFVOQUb+Msp9JatuJlAKURWSdK3ZzklsPmMcRc23DLW7I47LWxPV2oDFFptCAp/Cht+CTd0bMphIhJOj4rLS7LFtqcd6y2nyyo+BNPXJH7AP9E7AidCA8wD3TlCxidAg4bnE6k5l3dsBjM/C1bVwsgit8OGvXIYN+PEFV6fmxoreL5Ev4x8lb0fuQhsmD+XirRQ1/VC0K11KxzhcEMD5UsTQP+0AotyepzDTunHlxmqH18jKkBMLtHLyyEPhf3uFCbx/RCuohHuUq21LsMrL7Am+1/eH5IiV81hSNCZIfadK3nlAkodRp+xtRkfXTMJMUkd+pA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.233) smtp.rcpttodomain=dpdk.org 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=o+XnjwzRTc+o8TKMvjNXYTLMLpQLSsglgSXT2Auz2D4=; b=c+ubj41AkOKf6csPjc5jfx7lbmR0RNGMVHAst82bhAWK8LMoMY/6rBQ6PzcZI6uz52BMxDnWtt2WNGtTDfUSqE/1AJAZM/aXCXXh9Xapa9m7SISLUkim6eqCy+2GA25ypbUhg0MwLEEvBDJHRO7csjtBXDjiR3I9YTIzzc7+1cM2t4m/gAsd/LFuEH3v2ZL1363Z1O+NXLfedDRX2StoZMKBcEH+cCW95mDHSSXVoXt6Zt7dKon7vW6bA1Rv2hR9dZdvIKELor3HUvdDYXm3ciWQtfFK+IvnDhLV/rJcOsMbIygA3qx2C28mgEO5bE5qS7iR25RUS9/0K/QFCMdkww== Received: from CY5PR17CA0033.namprd17.prod.outlook.com (2603:10b6:930:12::8) by PH7PR12MB9066.namprd12.prod.outlook.com (2603:10b6:510:1f6::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7228.22; Thu, 25 Jan 2024 13:31:43 +0000 Received: from CY4PEPF0000EDD7.namprd03.prod.outlook.com (2603:10b6:930:12:cafe::b8) by CY5PR17CA0033.outlook.office365.com (2603:10b6:930:12::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7228.26 via Frontend Transport; Thu, 25 Jan 2024 13:31:42 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.233) 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.118.233 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.233; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.233) by CY4PEPF0000EDD7.mail.protection.outlook.com (10.167.241.211) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7228.16 via Frontend Transport; Thu, 25 Jan 2024 13:31:42 +0000 Received: from drhqmail203.nvidia.com (10.126.190.182) by mail.nvidia.com (10.127.129.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 25 Jan 2024 05:31:35 -0800 Received: from drhqmail202.nvidia.com (10.126.190.181) by drhqmail203.nvidia.com (10.126.190.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41; Thu, 25 Jan 2024 05:31:34 -0800 Received: from nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.41 via Frontend Transport; Thu, 25 Jan 2024 05:31:32 -0800 From: Michael Baum To: CC: Matan Azrad , Raslan Darawsheh , Dariusz Sosnowski , Viacheslav Ovsiienko , Ori Kam , Suanming Mou , Alex Vesker Subject: [PATCH v2 18/23] net/mlx5/hws: support GENEVE options header Date: Thu, 25 Jan 2024 15:30:38 +0200 Message-ID: <20240125133043.575860-19-michaelba@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240125133043.575860-1-michaelba@nvidia.com> References: <20231203112543.844014-1-michaelba@nvidia.com> <20240125133043.575860-1-michaelba@nvidia.com> MIME-Version: 1.0 X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000EDD7:EE_|PH7PR12MB9066:EE_ X-MS-Office365-Filtering-Correlation-Id: 61b6b559-e7c9-4673-5f28-08dc1da9f80e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: aMmxZUTVn0lVfwpeywXDLDADmgQ4Uib83+65BeN/XKWNQin0zjpV3Tuqt+CpWKEQumBqwvxqui5wBd8sLPF7fuQHjx2jdclUhLkqQ8F2agJCKi24DmJxokhmwsqlG+x+j46Z1yN3NwZgzFUIDgOvmdX7qw3YkRW2jpoHril+uS+G4MLrDTOSXzOpmIrfetdRAv44kD4jSNmASd5S8OQj8rEDuWNzSyEPb6JdU8qOwWwz/O7O7t6v3UA4OrNwnPj5kUeO23aBjGj2PJKKcrpm8BOGaR+SaUrZch7Is3Bfgbld9RCCbPfUkvGtldig5Jmgba90NXH7eTN3gbFWRMkSCkwM07N3nxjgW/nM28c6rYUnEkZYsOK4KG4QloeGIcGZgLrgwv9xZOdz9GgH8nAyNAn+voQWHtlndfRNkCBkusrurNqBk2tJwWmUaV23EK5v1ZO8JLEIynBuVowo8PNWTYcuGk5kiyAoYSIXyeywYiyt5K0vGPgeYymUUZ8UICC5B3sncv7JcgXiZiGhmJa/b9MEVpzPm/1ekfiyEvLt+ofMqnW1jCX/twQbCLUoSRDXT7N/u+Bj4+ZdxqTzqI2p191S5XzbVLrnDGD/t1JjzbWvP5vp81sEz+P1x7z4BVU/mUYHkqG+aBRKZo4GpDEztEKafpmoVRZGbYgSy2+GEZB1SUAXJ9DshZhA0yJXsVyDLciGcxZ2/nbJmaRifHSObTMEkCj61PMSwvFa03pKIhw= X-Forefront-Antispam-Report: CIP:216.228.118.233; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc7edge2.nvidia.com; CAT:NONE; SFS:(13230031)(4636009)(376002)(39860400002)(346002)(136003)(396003)(230922051799003)(451199024)(64100799003)(186009)(1800799012)(82310400011)(36840700001)(40470700004)(46966006)(36756003)(2906002)(41300700001)(70206006)(54906003)(316002)(5660300002)(6916009)(86362001)(70586007)(47076005)(7696005)(26005)(1076003)(336012)(426003)(2616005)(6286002)(107886003)(478600001)(40480700001)(83380400001)(55016003)(40460700003)(82740400003)(8676002)(4326008)(8936002)(36860700001)(356005)(7636003); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Jan 2024 13:31:42.7044 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 61b6b559-e7c9-4673-5f28-08dc1da9f80e X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.118.233]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000EDD7.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB9066 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 From: Alex Vesker Add support for matching multiple GENEVE options. Options header introduces new complexities since there can be more than one GENEVE option. This requires us to track the total DWs used for matching. Current code supports 8DWs for data including type, class, length. There is also an optimization to use a special OK bit to reduce the use of limited data DWs. Signed-off-by: Alex Vesker Acked-by: Suanming Mou --- drivers/net/mlx5/hws/mlx5dr_definer.c | 147 ++++++++++++++++++++++++-- drivers/net/mlx5/hws/mlx5dr_definer.h | 24 +++++ 2 files changed, 165 insertions(+), 6 deletions(-) diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.c b/drivers/net/mlx5/hws/mlx5dr_definer.c index 7c0ce805f1..79d98bbf78 100644 --- a/drivers/net/mlx5/hws/mlx5dr_definer.c +++ b/drivers/net/mlx5/hws/mlx5dr_definer.c @@ -118,6 +118,8 @@ struct mlx5dr_definer_conv_data { uint8_t relaxed; uint8_t tunnel; uint8_t mpls_idx; + uint8_t geneve_opt_ok_idx; + uint8_t geneve_opt_data_idx; enum rte_flow_item_type last_item; }; @@ -702,6 +704,29 @@ mlx5dr_definer_geneve_vni_set(struct mlx5dr_definer_fc *fc, memcpy(tag + fc->byte_off, v->vni, sizeof(v->vni)); } +static void +mlx5dr_definer_geneve_opt_ctrl_set(struct mlx5dr_definer_fc *fc, + const void *item_spec, + uint8_t *tag) +{ + const struct rte_flow_item_geneve_opt *v = item_spec; + uint32_t dw0 = 0; + + dw0 |= v->option_type << __mlx5_dw_bit_off(header_geneve_opt, type); + dw0 |= rte_cpu_to_be_16(v->option_class) << __mlx5_dw_bit_off(header_geneve_opt, class); + DR_SET(tag, dw0, fc->byte_off, fc->bit_off, fc->bit_mask); +} + +static void +mlx5dr_definer_geneve_opt_data_set(struct mlx5dr_definer_fc *fc, + const void *item_spec, + uint8_t *tag) +{ + const struct rte_flow_item_geneve_opt *v = item_spec; + + DR_SET_BE32(tag, v->data[fc->extra_data], fc->byte_off, fc->bit_off, fc->bit_mask); +} + static void mlx5dr_definer_ib_l4_qp_set(struct mlx5dr_definer_fc *fc, const void *item_spec, @@ -1356,7 +1381,6 @@ mlx5dr_definer_conv_item_port(struct mlx5dr_definer_conv_data *cd, struct mlx5dr_cmd_query_caps *caps = cd->ctx->caps; const struct rte_flow_item_ethdev *m = item->mask; struct mlx5dr_definer_fc *fc; - uint8_t bit_offset = 0; if (m->port_id) { if (!caps->wire_regc_mask) { @@ -1365,16 +1389,13 @@ mlx5dr_definer_conv_item_port(struct mlx5dr_definer_conv_data *cd, return rte_errno; } - while (!(caps->wire_regc_mask & (1 << bit_offset))) - bit_offset++; - fc = &cd->fc[MLX5DR_DEFINER_FNAME_VPORT_REG_C_0]; fc->item_idx = item_idx; fc->tag_set = &mlx5dr_definer_vport_set; fc->tag_mask_set = &mlx5dr_definer_ones_set; DR_CALC_SET_HDR(fc, registers, register_c_0); - fc->bit_off = bit_offset; - fc->bit_mask = caps->wire_regc_mask >> bit_offset; + fc->bit_off = __builtin_ctz(caps->wire_regc_mask); + fc->bit_mask = caps->wire_regc_mask >> fc->bit_off; } else { DR_LOG(ERR, "Pord ID item mask must specify ID mask"); rte_errno = EINVAL; @@ -2314,6 +2335,116 @@ mlx5dr_definer_conv_item_geneve(struct mlx5dr_definer_conv_data *cd, return 0; } +static int +mlx5dr_definer_conv_item_geneve_opt(struct mlx5dr_definer_conv_data *cd, + struct rte_flow_item *item, + int item_idx) +{ + const struct rte_flow_item_geneve_opt *m = item->mask; + const struct rte_flow_item_geneve_opt *v = item->spec; + struct mlx5_hl_data *hl_ok_bit, *hl_dws; + struct mlx5dr_definer_fc *fc; + uint8_t num_of_dws, i; + bool ok_bit_on_class; + int ret; + + if (!m || !(m->option_class || m->option_type || m->data)) + return 0; + + if (!v || m->option_type != 0xff) { + DR_LOG(ERR, "Cannot match geneve opt without valid opt type"); + goto out_not_supp; + } + + if (m->option_class && m->option_class != RTE_BE16(UINT16_MAX)) { + DR_LOG(ERR, "Geneve option class has invalid mask"); + goto out_not_supp; + } + + ret = mlx5_get_geneve_hl_data(cd->ctx, + v->option_type, + v->option_class, + &hl_ok_bit, + &num_of_dws, + &hl_dws, + &ok_bit_on_class); + if (ret) { + DR_LOG(ERR, "Geneve opt type and class %d not supported", v->option_type); + goto out_not_supp; + } + + if (!ok_bit_on_class && m->option_class) { + /* DW0 is used, we will match type, class */ + if (!num_of_dws || hl_dws[0].dw_mask != UINT32_MAX) { + DR_LOG(ERR, "Geneve opt type %d DW0 not supported", v->option_type); + goto out_not_supp; + } + + if (MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_0 + cd->geneve_opt_data_idx > + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_7) { + DR_LOG(ERR, "Max match geneve opt DWs reached"); + goto out_not_supp; + } + + fc = &cd->fc[MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_0 + cd->geneve_opt_data_idx++]; + fc->item_idx = item_idx; + fc->tag_set = &mlx5dr_definer_geneve_opt_ctrl_set; + fc->byte_off = hl_dws[0].dw_offset * DW_SIZE; + fc->bit_mask = UINT32_MAX; + } else { + /* DW0 is not used, we must verify geneve opt type exists in packet */ + if (!hl_ok_bit->dw_mask) { + DR_LOG(ERR, "Geneve opt OK bits not supported"); + goto out_not_supp; + } + + if (MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_0 + cd->geneve_opt_ok_idx > + MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_7) { + DR_LOG(ERR, "Max match geneve opt reached"); + goto out_not_supp; + } + + fc = &cd->fc[MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_0 + cd->geneve_opt_ok_idx++]; + fc->item_idx = item_idx; + fc->tag_set = &mlx5dr_definer_ones_set; + fc->byte_off = hl_ok_bit->dw_offset * DW_SIZE + + __builtin_clz(hl_ok_bit->dw_mask) / 8; + fc->bit_off = __builtin_ctz(hl_ok_bit->dw_mask); + fc->bit_mask = 0x1; + } + + for (i = 1; i < num_of_dws; i++) { + /* Process each valid geneve option data DW1..N */ + if (!m->data[i - 1]) + continue; + + if (hl_dws[i].dw_mask != UINT32_MAX) { + DR_LOG(ERR, "Matching Geneve opt data[%d] not supported", i - 1); + goto out_not_supp; + } + + if (MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_0 + cd->geneve_opt_data_idx > + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_7) { + DR_LOG(ERR, "Max match geneve options DWs reached"); + goto out_not_supp; + } + + fc = &cd->fc[MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_0 + cd->geneve_opt_data_idx++]; + fc->item_idx = item_idx; + fc->tag_set = &mlx5dr_definer_geneve_opt_data_set; + fc->byte_off = hl_dws[i].dw_offset * DW_SIZE; + fc->bit_mask = m->data[i - 1]; + /* Use extra_data for data[] set offset */ + fc->extra_data = i - 1; + } + + return 0; + +out_not_supp: + rte_errno = ENOTSUP; + return rte_errno; +} + static int mlx5dr_definer_mt_set_fc(struct mlx5dr_match_template *mt, struct mlx5dr_definer_fc *fc, @@ -2756,6 +2887,10 @@ mlx5dr_definer_conv_items_to_hl(struct mlx5dr_context *ctx, ret = mlx5dr_definer_conv_item_geneve(&cd, items, i); item_flags |= MLX5_FLOW_LAYER_GENEVE; break; + case RTE_FLOW_ITEM_TYPE_GENEVE_OPT: + ret = mlx5dr_definer_conv_item_geneve_opt(&cd, items, i); + item_flags |= MLX5_FLOW_LAYER_GENEVE_OPT; + break; case RTE_FLOW_ITEM_TYPE_IB_BTH: ret = mlx5dr_definer_conv_item_ib_l4(&cd, items, i); item_flags |= MLX5_FLOW_ITEM_IB_BTH; diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.h b/drivers/net/mlx5/hws/mlx5dr_definer.h index eb70dcd39d..ced9d9da13 100644 --- a/drivers/net/mlx5/hws/mlx5dr_definer.h +++ b/drivers/net/mlx5/hws/mlx5dr_definer.h @@ -146,6 +146,22 @@ enum mlx5dr_definer_fname { MLX5DR_DEFINER_FNAME_OKS2_MPLS2_I, MLX5DR_DEFINER_FNAME_OKS2_MPLS3_I, MLX5DR_DEFINER_FNAME_OKS2_MPLS4_I, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_0, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_1, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_2, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_3, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_4, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_5, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_6, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_OK_7, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_0, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_1, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_2, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_3, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_4, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_5, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_6, + MLX5DR_DEFINER_FNAME_GENEVE_OPT_DW_7, MLX5DR_DEFINER_FNAME_IB_L4_OPCODE, MLX5DR_DEFINER_FNAME_IB_L4_QPN, MLX5DR_DEFINER_FNAME_IB_L4_A, @@ -171,6 +187,7 @@ enum mlx5dr_definer_type { struct mlx5dr_definer_fc { uint8_t item_idx; uint8_t is_range; + uint16_t extra_data; uint32_t byte_off; int bit_off; uint32_t bit_mask; @@ -646,6 +663,13 @@ struct mlx5_ifc_header_geneve_bits { u8 reserved_at_38[0x8]; }; +struct mlx5_ifc_header_geneve_opt_bits { + u8 class[0x10]; + u8 type[0x8]; + u8 reserved[0x3]; + u8 len[0x5]; +}; + struct mlx5_ifc_header_icmp_bits { union { u8 icmp_dw1[0x20];