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 D7B4F4548E; Wed, 19 Jun 2024 11:15:40 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 10C88427D3; Wed, 19 Jun 2024 11:15:21 +0200 (CEST) Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2110.outbound.protection.outlook.com [40.107.101.110]) by mails.dpdk.org (Postfix) with ESMTP id EED304021D for ; Wed, 19 Jun 2024 11:14:43 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ewgZIkTJTYOvMMmckjVBA8gRsTvoKU+nn+t4F3Kq1wSPfcjHU96mA4P19Z9x3VZJyoBD1mwQMYRvl42PEv+d6iIGCGXKPZzi1rbcqwzp+CEICmV5vS1XXG3e3LCmISqik88vog7uwVOrGQLoJyMNK1W//izKT76CMLPh08GK7LwpDIUnJgJ82y/v4D5VsJsp5ZuY8JM886WFN57486XkOvTKf2WTHfJWEgcYNfDJYch5rJmtZhAQkyH3Fy2wWrG+AwJae4gd/ETJmHe7FNiCyt77qTSTeJ8Xh73kXgVJUY3jukZFv4w8gJ6fxrk1Q2eJ8HLAT+xjhbU3ZvsNQZJyQw== 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=rKjjQa+eWleuR/x32T/OPh3F6HPQRL7sQltCfRxq4qM=; b=mK8dQPA6Jh8huOXNvMSUo8V15vtSpf5C9zIPW5wj9ZO5aWJJFq+qDS6T7f//QGiV2zMQoBtdEKJZ1PkBChtV0IFjK/5MGGVuP3FOQvRrFYIL5O/2U6EPH4y1BOxKO4JX/1RJKqh94oxe/p4e40gOfbpAtP7KVSYnVvFzKGuLwdrQT2LW2lywonzBaKb/fXOVQFttW0P4Z6FGSh5CGmXONdFSWfL2OCGKQct4iYTHfRaT7sBkbc2pMFWdII293SPBCepxy4UEbHkH0dmNkFLco9g4yG1K4T0UpSKNNgUcZ6YhpSIuXwcK/EzTVR/0yFEAw982FvbAbSq7Nn6FBtYedw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rKjjQa+eWleuR/x32T/OPh3F6HPQRL7sQltCfRxq4qM=; b=dS2tVISXZd5nTuLlyFW59iAnJLUYaI56GPX5+WPZuX6yYARDWZnuSta440MGHzTPkfuSukc0u4t2bzYXdUB/8H3sV/Tb015yALdD46Rl+BaHmjzpyJKeNqdsJjjpD1pCvkbK/cLtVmj62ZrIEPki6RDoil3E2hfnldfDU67uWc4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) by SJ0PR13MB5523.namprd13.prod.outlook.com (2603:10b6:a03:425::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7677.31; Wed, 19 Jun 2024 09:14:41 +0000 Received: from SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::b900:5f05:766f:833]) by SJ0PR13MB5545.namprd13.prod.outlook.com ([fe80::b900:5f05:766f:833%4]) with mapi id 15.20.7677.030; Wed, 19 Jun 2024 09:14:41 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH 05/21] net/nfp: refactor flow action compile function Date: Wed, 19 Jun 2024 17:13:42 +0800 Message-Id: <20240619091358.3479247-6-chaoyong.he@corigine.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20240619091358.3479247-1-chaoyong.he@corigine.com> References: <20240619091358.3479247-1-chaoyong.he@corigine.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: BYAPR05CA0027.namprd05.prod.outlook.com (2603:10b6:a03:c0::40) To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|SJ0PR13MB5523:EE_ X-MS-Office365-Filtering-Correlation-Id: f7b0ff17-d50e-4f1e-6d18-08dc90403fb8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230037|52116011|376011|1800799021|366013|38350700011; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?7Q6cUf3OG4P/qmnK5vR7u9TEQRHNQFeE/06EkJQqqjOxCyKnnxkP+n6P57TF?= =?us-ascii?Q?Pst4L1BVhHWsa8ETahK1QvK31QPooWfPls3AiMQt7vBiVzcv4PbX6SHf0tMJ?= =?us-ascii?Q?+OXXRSsn3t/qWI36CGLQeDCnjHHlB0Jr76ilm0q3eaa6A6h15LJweCIjbQxd?= =?us-ascii?Q?yTve/YqgX6yP/TfCke7WboCMF+EYb+CZvcva2hHnwljB5j2PDNFolyDZ7ny4?= =?us-ascii?Q?xR0SSzcw21HAaIwcuvC2CGcaTWc0+aItJHKtO8vW5/lbrWgWZxbrzewMhdAZ?= =?us-ascii?Q?xnhCxdmMiQPZ6DG+6qwEPfR1I5KxKHzVq0fjibp1pYY7pgL56cmNDJTxuAXz?= =?us-ascii?Q?EHvRHPXzq7OPHfGhJ36d4D3PnLORo2rvu9Q1jbcDRBe+nUSalqsxVIlH5puI?= =?us-ascii?Q?67gnRF86/4lXA5hi/a7cnhMDuj7d22I5Buos0dn72oU52IN+gtrHIrv1zpHy?= =?us-ascii?Q?woSxwcs6B/f5gJKYvMhIfJIZ88esetqsXrbUrX1cV79cm5ApIEPT14fi1Z9F?= =?us-ascii?Q?LHInd4BHpm9CQlQcLLuNS5U8O89GBbnx+FLBh2cUgA6qBsi2Uee7voUwrhT9?= =?us-ascii?Q?C+Jheb7ek5HpfIRgAwiKeoz/XjmfVMestKWbUMMKeT5i+QpC+06DE15obXvX?= =?us-ascii?Q?RRqofDaa7tuuo0exVsoUWnXwECcPEBfVMBRo7heg1sXserlPCl9/+lGjF1jH?= =?us-ascii?Q?PtFzm1z+MHdWbzNt/KAktfRLJAaA/iLojTVo2fD6ibqKt+45ntTqVmXlA2vg?= =?us-ascii?Q?+HqMX0DXKULNN4JStSwxw6vPXNreQpkE6TNen4buZG8ofgc9yC21xxYTZ/we?= =?us-ascii?Q?Df3yBTpybf5ThS5Xla9p31DdjRUkRkMx+1UjOBLZcRnokR940qd0a1gjtDxv?= =?us-ascii?Q?KCReAGvlPSWfMbFUTs/TMwXL1gAh50fJbPRJI9f6x5s11I/dyN9Xv+Vw0FvS?= =?us-ascii?Q?nvjFGT5bNrgmCyoIRCkoHpe+cFOaEDNOw8VHzeU0ePwG0JVMUmvkvyBF2VQX?= =?us-ascii?Q?Xe3p7P40NiFrDuAKtIjWdkrBi0tnhm0jSY6Xqaa4zXCNn4cD05PpZfcwPqHy?= =?us-ascii?Q?AwCHew0md4+fgpnUxIijhjgWuaUorfDJ6W6x9xnIcVH2J4kHkCBEYfxR5geV?= =?us-ascii?Q?hbAsjGCiuHpII9OeG1jz3c4Ww8JL0u3gbU27bXNGUmQJZQloZ7IJeKcj1cJQ?= =?us-ascii?Q?AJkA7wr7u8hquKVB9GdPnxHd5itYczYJjEn5fSX0dWokN72nPa9ISe271slC?= =?us-ascii?Q?0jd2RhBwu78scBlftGugOtVaMATmavqKYXFuAtkWSqRkWdqyLkMh0+UW1Rpz?= =?us-ascii?Q?UNzbqkwqj4I/MLA9ecH+6kNLyOeAFttdK6z33DTs7LlRT5LKTJMgRkuuGpaL?= =?us-ascii?Q?uxgdM38=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230037)(52116011)(376011)(1800799021)(366013)(38350700011); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?SCDhykuiqALmAnPCtVd0+oMLEB+4L0I6c3K9eCPC0RxP3yXTBANZRNAM7ucd?= =?us-ascii?Q?nEzp4f7TzSysC/Ml8I6CWr3pTYrbRb1MRq4fNXJgdDLSSDqI4Gn83kXGCwIy?= =?us-ascii?Q?X4GIBLdhd98LeMaPNgL9r3yc/6TbE4xNGXxKUjAEcNj6VofMZFxiBklmtu4u?= =?us-ascii?Q?fc4VqPmr7t4ZSFh+btn6KQXjIdB3tcY2G1QxoI/F19Nc1tthHiHMMvyfUoYw?= =?us-ascii?Q?u9xvYyekuXuJG94Dk+eF/5PgbcMJYgGiDTsG6CXSqWLVM1kMWv9zI8Fu/FBD?= =?us-ascii?Q?Ij0b7CKoAYtmM8WH3c/uRBYW2u5010oEz0tZYjzn5hpFPuhTgyQnsxtm/1Pf?= =?us-ascii?Q?jGP++ym7fUD+Wxi0P9Uo+e96gJgN7eP3d3mH15jUfEA002OjZkMM/eKAE4Ry?= =?us-ascii?Q?AWtGoCS0eOusjw9AZZdbnREqkveBYQnjgZ9ctX6EyKhN2bXK3LO2p6+HYpw/?= =?us-ascii?Q?eVCtBTviIMLgowtyHawfzUuvCI0UPuwT4WvF/ykURBX9E9xuEK+X8APBLMH5?= =?us-ascii?Q?RrpoQm3yF2weIwysMxwMpv8JNe9VF5wbE4CxAYC7YvQlqUoYIkL+nDc9MGBO?= =?us-ascii?Q?GtjoxSpAhgZwf0FAAJAWVIx5KDmDXCAqoz9GcffLIrAILFyzLbSMQqc+YDuD?= =?us-ascii?Q?JvQYhDzZU4vcN84cU1LYhog424wwX4qJW3AL7R+cbytkLdjKja+WmaRIspRx?= =?us-ascii?Q?vluATuNlyaQZq+/tomm69SxHno0c2LhZVZioT05b1PRiuQojTn74850dnhif?= =?us-ascii?Q?yjZv5q0qrHSC+k/UDMVZjuzzAG0rODQtfjZxw7uWic+XBhCDNg85zrc+eOhH?= =?us-ascii?Q?/8+PxY6dLOeT4iwstHczyjb48l1ZdjvyvDek649Zl5ikzKTqKooOEEzq7pVk?= =?us-ascii?Q?0us7bRlnV0S3BX+zGuO6ndK4p2C5Tksqqs39IqyLPSCJrglZ5wbCPBOiXk40?= =?us-ascii?Q?lWvDqrJy/ggbMDtxw+NySpwLjSt+TKI1GyyUAK5d2SZTA/Aefh8joPaxHIng?= =?us-ascii?Q?6O5EOyWTgbWTFbBicz4bD7VsK6dAvB4qCMylM1LzWguBiAVGLvEjuk6qbj90?= =?us-ascii?Q?eTx80rxpdR1oRztrzNFnsK4+V4o46JZjpVYIgTFOogqSUoKbFOvNxBGmPvdE?= =?us-ascii?Q?Gh7hNeA0bmuiq5eA/BR8Y8XJvE8xLCwzvNYMYH5/pSiZAkqoKfaZ5rfaeYv+?= =?us-ascii?Q?XCXyWHK+3X6djj2JJPCJmqxqzSAjtnlEARUVDRVAMN4K9cu9LsS8LvI3Qebf?= =?us-ascii?Q?t4qJ495AAgkov00QBEIbMK4QVw3VHqosSiMZfTdvnd19B2YHDaON6r6gcGV7?= =?us-ascii?Q?zdIdQvbyOyiVAzA2wkvcoyXnfY8XdjiRRxi51uc1An0SzV5/6eMbFHMeBQzR?= =?us-ascii?Q?3zraG//cjEo2K5E5PRi5yX8WJVLIswrW34V+JoPej/dOR53tTDjzTbp77Zid?= =?us-ascii?Q?ci4lARQ0pBzEtpwgG30kSxHM07HfDH0TP6d0E4jIPgMonCySbyPTTFLUy61N?= =?us-ascii?Q?JnrUm3C4ozBc2QWjXT3fZcQN1gS2PHsrZ1Zic+aOvtmtxM2yB5Pgu5PfJLZO?= =?us-ascii?Q?owMpMOCNCmzbNQ76tXMQ65NtNJsJnIUcnj9KEdrDAML//OBBLeCrNgloTr4n?= =?us-ascii?Q?iQ=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: f7b0ff17-d50e-4f1e-6d18-08dc90403fb8 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2024 09:14:41.8202 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: QRa0U24uUOkHS24wTQPUJ9kzYCX7hg2hqrkwBnNxu+PEKDnQaAIjvQcLuVovdgFwTe52jjVz9MldAfnavLK3H9o/g02L7GEqnXsGpbEPXIM= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR13MB5523 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 Refactor the flow action compile function, break the big function with a long 'switch' control statement into a array of small functions, which makes the logic more clear and easy to reuse. Signed-off-by: Chaoyong He Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- drivers/net/nfp/flower/nfp_flower_flow.c | 627 ++++++++++++++--------- 1 file changed, 399 insertions(+), 228 deletions(-) diff --git a/drivers/net/nfp/flower/nfp_flower_flow.c b/drivers/net/nfp/flower/nfp_flower_flow.c index 9477e4a94f..bfd4645afb 100644 --- a/drivers/net/nfp/flower/nfp_flower_flow.c +++ b/drivers/net/nfp/flower/nfp_flower_flow.c @@ -3689,252 +3689,423 @@ nfp_flow_count_output(const struct rte_flow_action actions[]) return count; } +struct nfp_action_compile_param { + const struct rte_flow_action *action; + char *action_data; + char *position; + uint32_t *output_cnt; + struct rte_flow *nfp_flow; + struct nfp_action_flag *flag; + struct nfp_flower_representor *repr; + struct nfp_fl_rule_metadata *nfp_flow_meta; +}; + +typedef int (*nfp_flow_action_compile_fn)(struct nfp_action_compile_param *param); + +static int +nfp_flow_action_compile_stub(struct nfp_action_compile_param *param __rte_unused) +{ + return 0; +} + +static int +nfp_flow_action_compile_drop(struct nfp_action_compile_param *param) +{ + param->flag->drop_flag = true; + + return 0; +} + +static int +nfp_flow_action_compile_repr_port(struct nfp_action_compile_param *param) +{ + int ret; + uint32_t output_cnt; + + output_cnt = *param->output_cnt - 1; + *param->output_cnt = output_cnt; + + ret = nfp_flow_action_output_stage(param->position, param->action, + param->nfp_flow_meta, output_cnt); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed process RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT"); + return ret; + } + + param->position += sizeof(struct nfp_fl_act_output); + + return 0; +} + +static int +nfp_flow_action_compile_port_id(struct nfp_action_compile_param *param) +{ + int ret; + uint32_t output_cnt; + + output_cnt = *param->output_cnt - 1; + *param->output_cnt = output_cnt; + + ret = nfp_flow_action_output(param->position, param->action, + param->nfp_flow_meta, output_cnt); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed process RTE_FLOW_ACTION_TYPE_PORT_ID"); + return ret; + } + + param->position += sizeof(struct nfp_fl_act_output); + + return 0; +} + +static int +nfp_flow_action_compile_mac_src(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_mac(param->position, param->action, true, + param->flag->mac_set_flag); + if (!param->flag->mac_set_flag) { + param->position += sizeof(struct nfp_fl_act_set_eth); + param->flag->mac_set_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_compile_mac_dst(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_mac(param->position, param->action, false, + param->flag->mac_set_flag); + if (!param->flag->mac_set_flag) { + param->position += sizeof(struct nfp_fl_act_set_eth); + param->flag->mac_set_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_compile_pop_vlan(struct nfp_action_compile_param *param) +{ + nfp_flow_action_pop_vlan(param->position, param->nfp_flow_meta); + param->position += sizeof(struct nfp_fl_act_pop_vlan); + + return 0; +} + +static int +nfp_flow_action_compile_push_vlan(struct nfp_action_compile_param *param) +{ + int ret; + + ret = nfp_flow_action_push_vlan(param->position, param->action); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed process RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN"); + return ret; + } + + param->position += sizeof(struct nfp_fl_act_push_vlan); + + return 0; +} + +static int +nfp_flow_action_compile_ipv4_src(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_ip(param->position, param->action, true, + param->flag->ip_set_flag); + if (!param->flag->ip_set_flag) { + param->position += sizeof(struct nfp_fl_act_set_ip4_addrs); + param->flag->ip_set_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_compile_ipv4_dst(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_ip(param->position, param->action, false, + param->flag->ip_set_flag); + if (!param->flag->ip_set_flag) { + param->position += sizeof(struct nfp_fl_act_set_ip4_addrs); + param->flag->ip_set_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_compile_ipv6_src(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_ipv6(param->position, param->action, true); + param->position += sizeof(struct nfp_fl_act_set_ipv6_addr); + + return 0; +} + +static int +nfp_flow_action_compile_ipv6_dst(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_ipv6(param->position, param->action, false); + param->position += sizeof(struct nfp_fl_act_set_ipv6_addr); + + return 0; +} + +static int +nfp_flow_action_compile_tp_src(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_tp(param->position, param->action, true, + param->flag->tp_set_flag, param->nfp_flow->tcp_flag); + if (!param->flag->tp_set_flag) { + param->position += sizeof(struct nfp_fl_act_set_tport); + param->flag->tp_set_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_compile_tp_dst(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_tp(param->position, param->action, false, + param->flag->tp_set_flag, param->nfp_flow->tcp_flag); + if (!param->flag->tp_set_flag) { + param->position += sizeof(struct nfp_fl_act_set_tport); + param->flag->tp_set_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_compile_ttl(struct nfp_action_compile_param *param) +{ + struct nfp_flower_meta_tci *meta_tci; + + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; + if (meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV4) { + nfp_flow_action_set_ttl(param->position, param->action, + param->flag->ttl_tos_flag); + if (!param->flag->ttl_tos_flag) { + param->position += sizeof(struct nfp_fl_act_set_ip4_ttl_tos); + param->flag->ttl_tos_flag = true; + } + } else { + nfp_flow_action_set_hl(param->position, param->action, + param->flag->ttl_tos_flag); + if (!param->flag->tc_hl_flag) { + param->position += sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl); + param->flag->tc_hl_flag = true; + } + } + + return 0; +} + +static int +nfp_flow_action_compile_ipv4_dscp(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_tos(param->position, param->action, + param->flag->ttl_tos_flag); + if (!param->flag->ttl_tos_flag) { + param->position += sizeof(struct nfp_fl_act_set_ip4_ttl_tos); + param->flag->ttl_tos_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_compile_ipv6_dscp(struct nfp_action_compile_param *param) +{ + nfp_flow_action_set_tc(param->position, param->action, + param->flag->ttl_tos_flag); + if (!param->flag->tc_hl_flag) { + param->position += sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl); + param->flag->tc_hl_flag = true; + } + + return 0; +} + +static int +nfp_flow_action_compile_vxlan_encap(struct nfp_action_compile_param *param) +{ + int ret; + + ret = nfp_flow_action_vxlan_encap(param->repr->app_fw_flower, + param->position, param->action_data, param->action, + param->nfp_flow_meta, ¶m->nfp_flow->tun); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed process RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP"); + return ret; + } + + param->position += sizeof(struct nfp_fl_act_pre_tun); + param->position += sizeof(struct nfp_fl_act_set_tun); + param->nfp_flow->type = NFP_FLOW_ENCAP; + + return 0; +} + +static int +nfp_flow_action_compile_raw_encap(struct nfp_action_compile_param *param) +{ + int ret; + + ret = nfp_flow_action_raw_encap(param->repr->app_fw_flower, + param->position, param->action_data, param->action, + param->nfp_flow_meta, ¶m->nfp_flow->tun); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed process RTE_FLOW_ACTION_TYPE_RAW_ENCAP"); + return ret; + } + + param->position += sizeof(struct nfp_fl_act_pre_tun); + param->position += sizeof(struct nfp_fl_act_set_tun); + param->nfp_flow->type = NFP_FLOW_ENCAP; + + return 0; +} + +static int +nfp_flow_action_compile_tnl_decap(struct nfp_action_compile_param *param) +{ + int ret; + + ret = nfp_flow_action_tunnel_decap(param->repr, param->action, + param->nfp_flow_meta, param->nfp_flow); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed process tunnel decap"); + return ret; + } + + param->nfp_flow->type = NFP_FLOW_DECAP; + param->nfp_flow->install_flag = false; + if (param->action->conf != NULL) + param->nfp_flow->tun.payload.v6_flag = 1; + + return 0; +} + +static int +nfp_flow_action_compile_meter(struct nfp_action_compile_param *param) +{ + int ret; + + ret = nfp_flow_action_meter(param->repr, param->action, + param->position, ¶m->nfp_flow->mtr_id); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed process RTE_FLOW_ACTION_TYPE_METER"); + return -EINVAL; + } + + param->position += sizeof(struct nfp_fl_act_meter); + + return 0; +} + +static int +nfp_flow_action_compile_mark(struct nfp_action_compile_param *param) +{ + nfp_flow_action_mark(param->position, param->action); + param->position += sizeof(struct nfp_fl_act_mark); + + return 0; +} + +static int +nfp_flow_action_compile_rss(struct nfp_action_compile_param *param) +{ + int ret; + + ret = nfp_flow_action_rss_add(param->repr, param->action, + ¶m->nfp_flow->rss); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed process RTE_FLOW_ACTION_TYPE_RSS"); + return ret; + } + + param->nfp_flow->type = NFP_FLOW_RSS; + + return 0; +} + +static nfp_flow_action_compile_fn action_compile_fns[] = { + [RTE_FLOW_ACTION_TYPE_VOID] = nfp_flow_action_compile_stub, + [RTE_FLOW_ACTION_TYPE_DROP] = nfp_flow_action_compile_drop, + [RTE_FLOW_ACTION_TYPE_COUNT] = nfp_flow_action_compile_stub, + [RTE_FLOW_ACTION_TYPE_JUMP] = nfp_flow_action_compile_stub, + [RTE_FLOW_ACTION_TYPE_PORT_ID] = nfp_flow_action_compile_port_id, + [RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT] = nfp_flow_action_compile_repr_port, + [RTE_FLOW_ACTION_TYPE_SET_MAC_SRC] = nfp_flow_action_compile_mac_src, + [RTE_FLOW_ACTION_TYPE_SET_MAC_DST] = nfp_flow_action_compile_mac_dst, + [RTE_FLOW_ACTION_TYPE_OF_POP_VLAN] = nfp_flow_action_compile_pop_vlan, + [RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN] = nfp_flow_action_compile_push_vlan, + [RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID] = nfp_flow_action_compile_stub, + [RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP] = nfp_flow_action_compile_stub, + [RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC] = nfp_flow_action_compile_ipv4_src, + [RTE_FLOW_ACTION_TYPE_SET_IPV4_DST] = nfp_flow_action_compile_ipv4_dst, + [RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC] = nfp_flow_action_compile_ipv6_src, + [RTE_FLOW_ACTION_TYPE_SET_IPV6_DST] = nfp_flow_action_compile_ipv6_dst, + [RTE_FLOW_ACTION_TYPE_SET_TP_SRC] = nfp_flow_action_compile_tp_src, + [RTE_FLOW_ACTION_TYPE_SET_TP_DST] = nfp_flow_action_compile_tp_dst, + [RTE_FLOW_ACTION_TYPE_SET_TTL] = nfp_flow_action_compile_ttl, + [RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP] = nfp_flow_action_compile_ipv4_dscp, + [RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP] = nfp_flow_action_compile_ipv6_dscp, + [RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP] = nfp_flow_action_compile_vxlan_encap, + [RTE_FLOW_ACTION_TYPE_RAW_ENCAP] = nfp_flow_action_compile_raw_encap, + [RTE_FLOW_ACTION_TYPE_VXLAN_DECAP] = nfp_flow_action_compile_tnl_decap, + [RTE_FLOW_ACTION_TYPE_RAW_DECAP] = nfp_flow_action_compile_tnl_decap, + [RTE_FLOW_ACTION_TYPE_METER] = nfp_flow_action_compile_meter, + [RTE_FLOW_ACTION_TYPE_CONNTRACK] = nfp_flow_action_compile_stub, + [RTE_FLOW_ACTION_TYPE_MARK] = nfp_flow_action_compile_mark, + [RTE_FLOW_ACTION_TYPE_RSS] = nfp_flow_action_compile_rss, +}; + static int nfp_flow_compile_action(struct nfp_flower_representor *representor, const struct rte_flow_action actions[], struct rte_flow *nfp_flow) { int ret = 0; - uint32_t count; - char *position; - char *action_data; + uint32_t output_cnt; uint32_t total_actions = 0; struct nfp_action_flag flag = {}; const struct rte_flow_action *action; - struct nfp_flower_meta_tci *meta_tci; struct nfp_fl_rule_metadata *nfp_flow_meta; + struct nfp_action_compile_param param = { + .action_data = nfp_flow->payload.action_data, + .position = nfp_flow->payload.action_data, + .nfp_flow = nfp_flow, + .nfp_flow_meta = nfp_flow->payload.meta, + .repr = representor, + .flag = &flag, + }; - nfp_flow_meta = nfp_flow->payload.meta; - action_data = nfp_flow->payload.action_data; - position = action_data; - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; - - count = nfp_flow_count_output(actions); + output_cnt = nfp_flow_count_output(actions); + param.output_cnt = &output_cnt; for (action = actions; action->type != RTE_FLOW_ACTION_TYPE_END; ++action) { - switch (action->type) { - case RTE_FLOW_ACTION_TYPE_VOID: - break; - case RTE_FLOW_ACTION_TYPE_DROP: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_DROP"); - flag.drop_flag = true; - break; - case RTE_FLOW_ACTION_TYPE_COUNT: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_COUNT"); - break; - case RTE_FLOW_ACTION_TYPE_JUMP: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_JUMP"); - break; - case RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT"); - count--; - ret = nfp_flow_action_output_stage(position, action, nfp_flow_meta, count); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Failed when process" - " RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT"); - return ret; - } - - position += sizeof(struct nfp_fl_act_output); - break; - case RTE_FLOW_ACTION_TYPE_PORT_ID: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_PORT_ID"); - count--; - ret = nfp_flow_action_output(position, action, nfp_flow_meta, count); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Failed when process" - " RTE_FLOW_ACTION_TYPE_PORT_ID"); - return ret; - } - - position += sizeof(struct nfp_fl_act_output); - break; - case RTE_FLOW_ACTION_TYPE_SET_MAC_SRC: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_MAC_SRC"); - nfp_flow_action_set_mac(position, action, true, flag.mac_set_flag); - if (!flag.mac_set_flag) { - position += sizeof(struct nfp_fl_act_set_eth); - flag.mac_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_MAC_DST: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_MAC_DST"); - nfp_flow_action_set_mac(position, action, false, flag.mac_set_flag); - if (!flag.mac_set_flag) { - position += sizeof(struct nfp_fl_act_set_eth); - flag.mac_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_OF_POP_VLAN: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_OF_POP_VLAN"); - nfp_flow_action_pop_vlan(position, nfp_flow_meta); - position += sizeof(struct nfp_fl_act_pop_vlan); - break; - case RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN"); - ret = nfp_flow_action_push_vlan(position, action); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Failed when process" - " RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN"); - return ret; - } + if (action->type >= RTE_DIM(action_compile_fns) || + action_compile_fns[action->type] == NULL) { + PMD_DRV_LOG(ERR, "Flow action %d unsupported", action->type); + return -ERANGE; + } - /* - * RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP and - * RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID - * have also been processed. - */ - action += 2; - position += sizeof(struct nfp_fl_act_push_vlan); - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC"); - nfp_flow_action_set_ip(position, action, true, flag.ip_set_flag); - if (!flag.ip_set_flag) { - position += sizeof(struct nfp_fl_act_set_ip4_addrs); - flag.ip_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV4_DST: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_IPV4_DST"); - nfp_flow_action_set_ip(position, action, false, flag.ip_set_flag); - if (!flag.ip_set_flag) { - position += sizeof(struct nfp_fl_act_set_ip4_addrs); - flag.ip_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC"); - nfp_flow_action_set_ipv6(position, action, true); - position += sizeof(struct nfp_fl_act_set_ipv6_addr); - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV6_DST: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_IPV6_DST"); - nfp_flow_action_set_ipv6(position, action, false); - position += sizeof(struct nfp_fl_act_set_ipv6_addr); - break; - case RTE_FLOW_ACTION_TYPE_SET_TP_SRC: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_TP_SRC"); - nfp_flow_action_set_tp(position, action, true, - flag.tp_set_flag, nfp_flow->tcp_flag); - if (!flag.tp_set_flag) { - position += sizeof(struct nfp_fl_act_set_tport); - flag.tp_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_TP_DST: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_TP_DST"); - nfp_flow_action_set_tp(position, action, false, - flag.tp_set_flag, nfp_flow->tcp_flag); - if (!flag.tp_set_flag) { - position += sizeof(struct nfp_fl_act_set_tport); - flag.tp_set_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_TTL: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_TTL"); - if (meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV4) { - nfp_flow_action_set_ttl(position, action, flag.ttl_tos_flag); - if (!flag.ttl_tos_flag) { - position += sizeof(struct nfp_fl_act_set_ip4_ttl_tos); - flag.ttl_tos_flag = true; - } - } else { - nfp_flow_action_set_hl(position, action, flag.tc_hl_flag); - if (!flag.tc_hl_flag) { - position += sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl); - flag.tc_hl_flag = true; - } - } - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_IPV4_DSCP"); - nfp_flow_action_set_tos(position, action, flag.ttl_tos_flag); - if (!flag.ttl_tos_flag) { - position += sizeof(struct nfp_fl_act_set_ip4_ttl_tos); - flag.ttl_tos_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_SET_IPV6_DSCP"); - nfp_flow_action_set_tc(position, action, flag.tc_hl_flag); - if (!flag.tc_hl_flag) { - position += sizeof(struct nfp_fl_act_set_ipv6_tc_hl_fl); - flag.tc_hl_flag = true; - } - break; - case RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP"); - ret = nfp_flow_action_vxlan_encap(representor->app_fw_flower, - position, action_data, action, nfp_flow_meta, - &nfp_flow->tun); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Failed when process" - " RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP"); - return ret; - } - position += sizeof(struct nfp_fl_act_pre_tun); - position += sizeof(struct nfp_fl_act_set_tun); - nfp_flow->type = NFP_FLOW_ENCAP; - break; - case RTE_FLOW_ACTION_TYPE_RAW_ENCAP: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_RAW_ENCAP"); - ret = nfp_flow_action_raw_encap(representor->app_fw_flower, - position, action_data, action, nfp_flow_meta, - &nfp_flow->tun); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Failed when process" - " RTE_FLOW_ACTION_TYPE_RAW_ENCAP"); - return ret; - } - position += sizeof(struct nfp_fl_act_pre_tun); - position += sizeof(struct nfp_fl_act_set_tun); - nfp_flow->type = NFP_FLOW_ENCAP; - break; - case RTE_FLOW_ACTION_TYPE_VXLAN_DECAP: - case RTE_FLOW_ACTION_TYPE_RAW_DECAP: - PMD_DRV_LOG(DEBUG, "process action tunnel decap"); - ret = nfp_flow_action_tunnel_decap(representor, action, - nfp_flow_meta, nfp_flow); - if (ret != 0) { - PMD_DRV_LOG(ERR, "Failed when process tunnel decap"); - return ret; - } - nfp_flow->type = NFP_FLOW_DECAP; - nfp_flow->install_flag = false; - if (action->conf != NULL) - nfp_flow->tun.payload.v6_flag = 1; - break; - case RTE_FLOW_ACTION_TYPE_METER: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_METER"); - ret = nfp_flow_action_meter(representor, action, - position, &nfp_flow->mtr_id); - if (ret != 0) - return -EINVAL; - position += sizeof(struct nfp_fl_act_meter); - break; - case RTE_FLOW_ACTION_TYPE_CONNTRACK: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_CONNTRACK"); - break; - case RTE_FLOW_ACTION_TYPE_MARK: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_MARK"); - nfp_flow_action_mark(position, action); - position += sizeof(struct nfp_fl_act_mark); - break; - case RTE_FLOW_ACTION_TYPE_RSS: - PMD_DRV_LOG(DEBUG, "Process RTE_FLOW_ACTION_TYPE_RSS"); - ret = nfp_flow_action_rss_add(representor, action, &nfp_flow->rss); - if (ret != 0) - return ret; - nfp_flow->type = NFP_FLOW_RSS; - break; - default: - PMD_DRV_LOG(ERR, "Unsupported action type: %d", action->type); - return -ENOTSUP; + param.action = action; + ret = action_compile_fns[action->type](¶m); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Flow action %d compile fail", action->type); + return ret; } + total_actions++; } + nfp_flow_meta = nfp_flow->payload.meta; if (flag.drop_flag) nfp_flow_meta->shortcut = rte_cpu_to_be_32(NFP_FL_SC_ACT_DROP); else if (total_actions > 1) -- 2.39.1