From patchwork Wed Jun 16 14:42:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Kozyrev X-Patchwork-Id: 94298 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 7CD3EA0C42; Wed, 16 Jun 2021 16:42:56 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 071C64067A; Wed, 16 Jun 2021 16:42:56 +0200 (CEST) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2071.outbound.protection.outlook.com [40.107.223.71]) by mails.dpdk.org (Postfix) with ESMTP id 59ED640140; Wed, 16 Jun 2021 16:42:54 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UgOi8tWgQMzqP8UkxNEPkB0KSsgpVb+11R4Gd3RR+DSfCMqg7SrfoSLDAM/zLrvxAQvgngl6syX2UcDm/WYub/1s+zJ7AvmneSd/Y7KwuXvqP8iLK7Z6zopshcyjlw07LrvJ8GepaY8j3T93qjO0Tfs4kHRz80JWhO7mQNSUllHGjW/2pq1Clp8oQK/3zZvQN/+4GczMMNvzYWqn4DBQaZSNXZeawsFth1PCPm46nJ01NqUCPYE7Jmdgo5CatP7Pv81gOf8JHa4HTj3IKKFncl0/nSUXhgOoUcPqO0Q0p4Z3qXmyPzlLtuqycnj6iS0DRKNPWS5uGPCYCgbWnqBPaA== 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=O5VgWt4dGIC3JwaiXh+sV7mXJCkVGJlATe+JMOmA4Hs=; b=ocB001yF/UMt5l01GYreaPwUVJAwNiHs5W38ffo7RhAJZKe8fDCC/Ps8kU+WrVDMA7+ViukT2CWJsRxFj2k2vZnW0zyUDrJgK10Gh1u28I6DyRTDVX11rDGC1gpkpyVdYwjEBy+2Q/+6gMyvL4lE2Wv3t5Cal7i0AIWxw986t5tgWzMu9Fa3I3IJMzbrm4z/adMeIQqxqUzAXcd9J15at/68xR16IPzDwhsIY5SkBYmbIGz3C7ft+wLGZZx8F7dxx5ZuDdBhZuYgqPFJJ3cRAmoYfcyTD0Nqf3qfGwJMoCep+qDv+Tp0dGVwJAC9oyrdmMOkcicIhQbgRgYs6FTK/w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.34) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com; dmarc=pass (p=none sp=none 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=O5VgWt4dGIC3JwaiXh+sV7mXJCkVGJlATe+JMOmA4Hs=; b=JenEVwIUH5zJY+h7NsGYXrx6vQDDFFZc9vTwiJ+qdUcxe9XqjnBcfxQM0E6AqYdBEm4fPH9sTXUl4Qfo1algXAroThvIrxj73zEbLHM6OqWScmiDxGNI/YDjiSIfwoCQRvjQYbMQqYcNnOYO2JCClnLMwzU7fuGuWDVopgWV8AJSS2NXCkthzYk3GxkV4Nx1SdBONvOTTbKapFvygw8CSdU2r9KmPU03RWGrE63zfAkw+DvDeZVkcyORNP3wHjC90Gmao2nzY++1BTkvbbe10ff1ettJnEtaO+RUIWujSItc70906/n865LsahyLjnFcano70zeD8tEguMyjDQuaFg== Received: from BN9PR03CA0491.namprd03.prod.outlook.com (2603:10b6:408:130::16) by BYAPR12MB2664.namprd12.prod.outlook.com (2603:10b6:a03:69::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4219.24; Wed, 16 Jun 2021 14:42:52 +0000 Received: from BN8NAM11FT062.eop-nam11.prod.protection.outlook.com (2603:10b6:408:130:cafe::b5) by BN9PR03CA0491.outlook.office365.com (2603:10b6:408:130::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4242.16 via Frontend Transport; Wed, 16 Jun 2021 14:42:52 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.34) smtp.mailfrom=nvidia.com; dpdk.org; dkim=none (message not signed) header.d=none;dpdk.org; 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 BN8NAM11FT062.mail.protection.outlook.com (10.13.177.34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4242.16 via Frontend Transport; Wed, 16 Jun 2021 14:42:52 +0000 Received: from nvidia.com (172.20.187.5) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 16 Jun 2021 14:42:49 +0000 From: Alexander Kozyrev To: CC: , , , Date: Wed, 16 Jun 2021 17:42:36 +0300 Message-ID: <20210616144236.2802978-1-akozyrev@nvidia.com> X-Mailer: git-send-email 2.18.2 MIME-Version: 1.0 X-Originating-IP: [172.20.187.5] X-ClientProxiedBy: HQMAIL101.nvidia.com (172.20.187.10) To HQMAIL107.nvidia.com (172.20.187.13) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: baae5e49-f24a-4c57-5bbf-08d930d50521 X-MS-TrafficTypeDiagnostic: BYAPR12MB2664: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6108; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5viX+vdfCgHMPNe7pHjhiUP9bO/FIGXlayJm2YWg2Rwqr+UgD6Yfzf2n3mVufQ8W3ZX18C+x1OKUE0MVhMc6+z661dYf9s8Z9Cx75rBi/QjZs3K1zQM4rWnz9AaPT4N60L/AWSrzTIKYBrWp6U3ZpyV8lcKn0zgx3J3jNgsfZR1oyYoxzfwZp2jie4jE1yti45WpKq/gksSV6L9y1oZaTJaSPlknD4v2UqKZh/S4nZV/2ho9lfG9gRPkjIH/sQprx5NtdtYFSKncxxXCVf5F9QeqRb3A2shGsOUKZt2okQ9SUIWAFv/HspthERIqA9o77+0XVA7mksI39JE+RM+7udbLjCloijkz9bbZHgXkik6Dr0kP2NBIxo+9e7beEFZIC5CRsWHLDobF0YVYtYd4npg0Pm8rE0PdxqidxqQ/a5d/+ho7M48RIB9QZvpBMtcxb2XAYvYwGKXEPZlVKdNscBHdgPXB8+3Qjr0s4rVfV9EAYO64LpS6uAxTYe7Llj6t67c6Cgt/9Z5MUTMoi62FeZX9srRXCqu7E2ljW48rwSWD/zrD98wl33Rvo6jZOI84P2FcW+0E08pO0pmvCcTYi4pMsPRvXed6wiQlBmMNYRTMUl0PRQkZ95bn7fQF6zT99nCN5gwQvGoV+yod369+1mZhw18lB56mRgzOv9mUHYA= 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)(136003)(396003)(39860400002)(346002)(376002)(36840700001)(46966006)(82310400003)(36906005)(8936002)(36860700001)(55016002)(1076003)(70206006)(86362001)(6286002)(6916009)(7696005)(478600001)(4326008)(36756003)(26005)(450100002)(83380400001)(82740400003)(6666004)(356005)(7636003)(16526019)(54906003)(336012)(186003)(2616005)(47076005)(2906002)(316002)(70586007)(107886003)(5660300002)(426003)(8676002); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jun 2021 14:42:52.0126 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: baae5e49-f24a-4c57-5bbf-08d930d50521 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: BN8NAM11FT062.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR12MB2664 Subject: [dpdk-dev] [PATCH] net/mlx5: fix modify field action order for MAC 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 Sender: "dev" MAC addresses are split into 2 parts inside Mellanox NIC: bits 0-15 are separate from bits 16-47. That makes a copy from another packet field tricky because any other field is aligned to 32 bits, not 16. This causes unexpected results when using the MODIFY_FIELD action with MAC addresses. Track crossing MAC addresses boundary and arrange a proper order for the MODIFY_FIELD action involving MAC addresses. Fixes: 641dbe4fb053 ("net/mlx5: support modify field flow action") Cc: stable@dpdk.org Signed-off-by: Alexander Kozyrev Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5_flow_dv.c | 109 ++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 39 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c index dafd37ab93..ba341197e6 100644 --- a/drivers/net/mlx5/mlx5_flow_dv.c +++ b/drivers/net/mlx5/mlx5_flow_dv.c @@ -426,6 +426,8 @@ flow_dv_convert_modify_action(struct rte_flow_item *item, unsigned int off_b; uint32_t mask; uint32_t data; + bool next_field = true; + bool next_dcopy = true; if (i >= MLX5_MAX_MODIFY_NUM) return rte_flow_error_set(error, EINVAL, @@ -443,15 +445,13 @@ flow_dv_convert_modify_action(struct rte_flow_item *item, size_b = sizeof(uint32_t) * CHAR_BIT - off_b - __builtin_clz(mask); MLX5_ASSERT(size_b); - size_b = size_b == sizeof(uint32_t) * CHAR_BIT ? 0 : size_b; actions[i] = (struct mlx5_modification_cmd) { .action_type = type, .field = field->id, .offset = off_b, - .length = size_b, + .length = (size_b == sizeof(uint32_t) * CHAR_BIT) ? + 0 : size_b, }; - /* Convert entire record to expected big-endian format. */ - actions[i].data0 = rte_cpu_to_be_32(actions[i].data0); if (type == MLX5_MODIFICATION_TYPE_COPY) { MLX5_ASSERT(dcopy); actions[i].dst_field = dcopy->id; @@ -459,7 +459,27 @@ flow_dv_convert_modify_action(struct rte_flow_item *item, (int)dcopy->offset < 0 ? off_b : dcopy->offset; /* Convert entire record to big-endian format. */ actions[i].data1 = rte_cpu_to_be_32(actions[i].data1); - ++dcopy; + /* + * Destination field overflow. Copy leftovers of + * a source field to the next destination field. + */ + if ((size_b > dcopy->size * CHAR_BIT) && dcopy->size) { + actions[i].length = dcopy->size * CHAR_BIT; + field->offset += dcopy->size; + next_field = false; + } + /* + * Not enough bits in a source filed to fill a + * destination field. Switch to the next source. + */ + if (dcopy->size > field->size && + (size_b == field->size * CHAR_BIT)) { + actions[i].length = field->size * CHAR_BIT; + dcopy->offset += field->size * CHAR_BIT; + next_dcopy = false; + } + if (next_dcopy) + ++dcopy; } else { MLX5_ASSERT(item->spec); data = flow_dv_fetch_field((const uint8_t *)item->spec + @@ -468,8 +488,11 @@ flow_dv_convert_modify_action(struct rte_flow_item *item, data = (data & mask) >> off_b; actions[i].data1 = rte_cpu_to_be_32(data); } + /* Convert entire record to expected big-endian format. */ + actions[i].data0 = rte_cpu_to_be_32(actions[i].data0); + if (next_field) + ++field; ++i; - ++field; } while (field->size); if (resource->actions_num == i) return rte_flow_error_set(error, EINVAL, @@ -1433,6 +1456,7 @@ mlx5_flow_field_id_to_modify_info struct mlx5_priv *priv = dev->data->dev_private; struct mlx5_dev_config *config = &priv->config; uint32_t idx = 0; + uint32_t off = 0; uint64_t val = 0; switch (data->field) { case RTE_FLOW_FIELD_START: @@ -1440,61 +1464,63 @@ mlx5_flow_field_id_to_modify_info MLX5_ASSERT(false); break; case RTE_FLOW_FIELD_MAC_DST: + off = data->offset > 16 ? data->offset - 16 : 0; if (mask) { - if (data->offset < 32) { - info[idx] = (struct field_modify_info){4, 0, - MLX5_MODI_OUT_DMAC_47_16}; - if (width < 32) { - mask[idx] = - rte_cpu_to_be_32(0xffffffff >> - (32 - width)); + if (data->offset < 16) { + info[idx] = (struct field_modify_info){2, 0, + MLX5_MODI_OUT_DMAC_15_0}; + if (width < 16) { + mask[idx] = rte_cpu_to_be_16(0xffff >> + (16 - width)); width = 0; } else { - mask[idx] = RTE_BE32(0xffffffff); - width -= 32; + mask[idx] = RTE_BE16(0xffff); + width -= 16; } if (!width) break; ++idx; } - info[idx] = (struct field_modify_info){2, 4 * idx, - MLX5_MODI_OUT_DMAC_15_0}; - mask[idx] = rte_cpu_to_be_16(0xffff >> (16 - width)); - } else { - if (data->offset < 32) - info[idx++] = (struct field_modify_info){4, 0, + info[idx] = (struct field_modify_info){4, 4 * idx, MLX5_MODI_OUT_DMAC_47_16}; - info[idx] = (struct field_modify_info){2, 0, + mask[idx] = rte_cpu_to_be_32((0xffffffff >> + (32 - width)) << off); + } else { + if (data->offset < 16) + info[idx++] = (struct field_modify_info){2, 0, MLX5_MODI_OUT_DMAC_15_0}; + info[idx] = (struct field_modify_info){4, off, + MLX5_MODI_OUT_DMAC_47_16}; } break; case RTE_FLOW_FIELD_MAC_SRC: + off = data->offset > 16 ? data->offset - 16 : 0; if (mask) { - if (data->offset < 32) { - info[idx] = (struct field_modify_info){4, 0, - MLX5_MODI_OUT_SMAC_47_16}; - if (width < 32) { - mask[idx] = - rte_cpu_to_be_32(0xffffffff >> - (32 - width)); + if (data->offset < 16) { + info[idx] = (struct field_modify_info){2, 0, + MLX5_MODI_OUT_SMAC_15_0}; + if (width < 16) { + mask[idx] = rte_cpu_to_be_16(0xffff >> + (16 - width)); width = 0; } else { - mask[idx] = RTE_BE32(0xffffffff); - width -= 32; + mask[idx] = RTE_BE16(0xffff); + width -= 16; } if (!width) break; ++idx; } - info[idx] = (struct field_modify_info){2, 4 * idx, - MLX5_MODI_OUT_SMAC_15_0}; - mask[idx] = rte_cpu_to_be_16(0xffff >> (16 - width)); - } else { - if (data->offset < 32) - info[idx++] = (struct field_modify_info){4, 0, + info[idx] = (struct field_modify_info){4, 4 * idx, MLX5_MODI_OUT_SMAC_47_16}; - info[idx] = (struct field_modify_info){2, 0, + mask[idx] = rte_cpu_to_be_32((0xffffffff >> + (32 - width)) << off); + } else { + if (data->offset < 16) + info[idx++] = (struct field_modify_info){2, 0, MLX5_MODI_OUT_SMAC_15_0}; + info[idx] = (struct field_modify_info){4, off, + MLX5_MODI_OUT_SMAC_47_16}; } break; case RTE_FLOW_FIELD_VLAN_TYPE: @@ -1818,7 +1844,12 @@ mlx5_flow_field_id_to_modify_info val = data->value; for (idx = 0; idx < MLX5_ACT_MAX_MOD_FIELDS; idx++) { if (mask[idx]) { - if (dst_width > 16) { + if (dst_width == 48) { + /*special case for MAC addresses */ + value[idx] = rte_cpu_to_be_16(val); + val >>= 16; + dst_width -= 16; + } else if (dst_width > 16) { value[idx] = rte_cpu_to_be_32(val); val >>= 32; } else if (dst_width > 8) {