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 9F5E24548E; Wed, 19 Jun 2024 11:15:13 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id ACB69427AE; Wed, 19 Jun 2024 11:15:08 +0200 (CEST) Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2120.outbound.protection.outlook.com [40.107.244.120]) by mails.dpdk.org (Postfix) with ESMTP id 4DE474021D for ; Wed, 19 Jun 2024 11:14:32 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=jKzcWfABoUqUWZYuehlshig2kn8SydBY0ZjjXbhixVeDAvi+UNVg81m2j/PUeblV5lMEN3zyi52zvjIXIFSbzWzoBWMkmUQw1Ws0VnyUn1guDmki34MqoXaUg+Oid8DzZ96mUXHE1jm0ge165dqt4OmxrUkRX0CvjXsk2rn20oWZPeZrL6UAkyxbI1JNJluwAHuHzk6NoZ5RXsrQ+gAOU2uzR9EPCbtLCe2OedPvyuQJKN90wWZJI8Yx+pux1/PXWOtLUpS8YV3tz8snqAQKlmiEQPZHwAlTiLxCOH0P/DbGK3AWCryegFXDSzkK1Jf7BC4/o71RU1RW+HYfBoHG6A== 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=NMFf3HTwwxgDnwual7RH4cRB/3m5f1DpXXmzKOuMsVM=; b=JKuoVNX+txan09IrSWhgnS3iOg+Kc8bRUBtzHi473aQuHgYk8bhSenvoEJbd4thMREH+52lXf19TP9NSZo1BbRt126adhBRkMurtdfUN20erpEDVMlxPLoWIRzvAnZBiclZ0ollKEEpJstbZSKhfvK3FXd+DJ78+EqOQzFXL99dSWSo+22xbJt8aRPhOdcf0y3KQFGXQg404lD6YQfybcqtg+BbBdfAOEkocGZKYKVwVu4BCk3XA1AqpUaoeyvSoAv3+sDPoOR4qwFSfy4jfN+KLhywO+QMQemYXGKfIZ3tHfMnetWtNTQUkQLpVOSRufnQSE9aqO4Rc4osmFUTu1Q== 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=NMFf3HTwwxgDnwual7RH4cRB/3m5f1DpXXmzKOuMsVM=; b=Nk3133SZY3sxW2r8qiPxXN/4SpnT/ywW/KTKE7GqI48CqbP8lqJMjz9hz04zYqDUNq9RvS8J7fOowgR7DxWrk2EYkkR4WIb99FqCGvDgbGk4ky0sJJwOa0BtK8thfAW/sBz6sOk2lK8I6IZmskGetJ4MmTTYZVGhgThQ6f5/Shc= 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:30 +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:30 +0000 From: Chaoyong He To: dev@dpdk.org Cc: oss-drivers@corigine.com, Chaoyong He , Long Wu , Peng Zhang Subject: [PATCH 02/21] net/nfp: pack parameters of flow item function Date: Wed, 19 Jun 2024 17:13:39 +0800 Message-Id: <20240619091358.3479247-3-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: f312c0ec-78c1-4663-2cf3-08dc9040382a 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?cVkZjPTDsfBxDhO+Okt2OEN3QbUKmsEkvSZUkz7GIot7DO1yn6M+rAEP5mK9?= =?us-ascii?Q?+OQSsk+QwAKweIJP47M3p+CCsbEgMjdW/ADL7j8LvY0GkIsNyts0t5cEj3ad?= =?us-ascii?Q?7J/kakRDSvCW+4irRtV9OyhI7jGJqZXMa44ZmmBG8mvWlRRxS2svM4ESJTtD?= =?us-ascii?Q?LeTsqq7T3A0rLf3+TcjvwzQpFrDqHyETbbk2us5+svLGtzbuyUNwuM4QJSxA?= =?us-ascii?Q?gqn2G+V9Ki3T8yosDtG/jK+PW67cN/JFtjHWahDsUv3A/aryNFhGgZQ4yUap?= =?us-ascii?Q?e/bEDp4dm9Rzgju7uSxb0xJFO4d5i1nz9EBXeL+x0Ypw9VWzdeQA0EoEYycP?= =?us-ascii?Q?KhvlicNYSxPwAS/Ma//3ddasogUzSeATY8BQySxLD3gsSpAYCRM8tQzV21aM?= =?us-ascii?Q?6Ggn4NwZAN38aw/ecVh7/YAmVtOCfc4+qPohc1VSRwVX5WShCGRkIkT+roct?= =?us-ascii?Q?XpoEEgkmpuf/4CxfrC586UjSBMU7bLI3BVH+Aw7IfTyCpo6B6GLe/aAfRhoa?= =?us-ascii?Q?borqr5e1EWjEtxUYXpW4Pnm4QpVynX4Fo7ayzMhR1300KSGC0m8JuL2w3NRP?= =?us-ascii?Q?0amGuZQnwknBu+jJOWgtWmRB9AFaUWL9b5gCIGmnSa6JAZWwtusgk8OU1mf9?= =?us-ascii?Q?REkg/g0YG3oBzZwskSgp0GoaHSzHCCuyE49sY2TODXUvNx3NjST2/tME2+Ki?= =?us-ascii?Q?qvv/bpraXxM8s7dEfATzAJD9+0S6SfLd2GBdvkWjRHncLsXLUvw7W5LLW5oq?= =?us-ascii?Q?QsxU/HZ+j3C9qRuyAq7ovPaqhHEj5IXIn975EUNb1jPrets8GsIFbZqT+qvj?= =?us-ascii?Q?ofcHLjJKcX2a4eo78vpHui1dq2L+YtCt8bP3iRHOVV0dBbOqG5t4NkuZIeXi?= =?us-ascii?Q?qcbPoHvz+GXDvBVfI57CNjS4KTBbvzg46hvDsTMDDsegoFiVMH3MIJkwBhRh?= =?us-ascii?Q?tYRcC6Yrkc7IvvlgMMgaSSa0OxHYmdN6AIdRm+LGZtgWRXxdbxBAKs7Mt4fG?= =?us-ascii?Q?febJ7+XIPg2bSJSlen4wHRN6iJWea/xZO6wED1dgllORoHQjbtqFjbLqeng/?= =?us-ascii?Q?+I7fzvM2q2sHHgVEdkMF+T3PC1VRj0sWL6pakpP9tlMAVtTT2QOd1Rq5ROnP?= =?us-ascii?Q?XCaYu2rxK5OookdJPVHOOwUQZYAco4HjtlEypPXiMChaQpihodsFzjIbVa8j?= =?us-ascii?Q?4GR6lCAAdelGncgYHNMzweg6iVRtrbNwAHSjNOX4RLfUrqRFLiZmMvO3KGt/?= =?us-ascii?Q?7/IJl63ZNG52L5TcfSU7dsA8VnwxoEwDzs8xCMWoBCH4fmYGT48hLVUwVIwc?= =?us-ascii?Q?63WgNSJRtFVbL5W1E3s0P6AQbqoVTSuCUDDGhjZ6O/wgWyjoRdl2dFrBW/b6?= =?us-ascii?Q?rdbFoiY=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?WIhslq1IlnYFz/fR9gQq28cdPX1plAQlPKiGExrCG0F15QTGp5kYVTw5nTuN?= =?us-ascii?Q?qHpxxsKwNFH0An7Ta0XJ4BEfIjlo6EqcH5Qmvl9x6r8yZnA15fC8R+5DTqa4?= =?us-ascii?Q?E6/bJ6xtzFLu1dN7Tv4cKx3XPqKYfGC22Cc/eLD/j16GrzL81i+RQsufQGg4?= =?us-ascii?Q?UhDpvTuD4MLvPIAxrrd+bPluVjPQ3fmtZfaRDEcOZY6edy41/TppesznEzsI?= =?us-ascii?Q?g3+1nDzL4KKrmOGibPk2mfTFGeE1AEq5geVKyK2eiM37USqzz9ULdTTOqPJU?= =?us-ascii?Q?jc43zn/IoGSTS4vFUbPuf9WQrVRHRCvAwCv6SDv4k/0K/EZ99cnZbDOoQjZm?= =?us-ascii?Q?5PvsLFydi0mgbYdJwq1VDGHv7arfSwsU7ympy6qFFeogj+GkJaXJQthaBYJN?= =?us-ascii?Q?yJdbzDl1IaO+zQbDsI9B4HrivNo40RzIwk6sEbE6BtWc2W63f0rIktNHqcKz?= =?us-ascii?Q?XzVovoF0JsaEyN7zLhvXi7m0W+VcA7I+MCEiLqXOwY23WNhwtp3YGJs1EorM?= =?us-ascii?Q?1kZYZ9ZepXhRCkEc6fXvs3AViVWRyHmTNsEj3iyBUXLJccyJrwZWBe1A4l5K?= =?us-ascii?Q?gBLGKMT2GRzYzOK3djPPfYNfejSNEEoUDzo91wvBA+pbxLd5ZXub9cB/55XD?= =?us-ascii?Q?TjBqsMsNtaxhu5LymhqOKd9oJuXLz6ZkyfqgZo6RQ9u7lCoSf3TVI1jlqbri?= =?us-ascii?Q?7xPWr37XBbOgoeuT/+RkVr/NajFeMCcHUh24T6YvZy6hESaDg9oSlFt7O9w7?= =?us-ascii?Q?JKJzb1bz6CMrWU8Cj2FI0PAxzS/E0jTD+HtSepDUzebw6AYGlYdDgE0ikP4B?= =?us-ascii?Q?LZUMD84M+RGxNSv008XhhnDSkqgkwbDszkVxpZ4wCQDdKxPSJGs75IaKNhn+?= =?us-ascii?Q?C1yhqicnIVp2cOE5yNGSCQqm/GuN5cgmIF3HhkWDC9rhfixPXYRWTEKwV9ee?= =?us-ascii?Q?iT6SPFgpIXr/CbvjoPrOF+7xHmemmzRJzK5Kl5eLkPwcDJUhXAvkUzlUGXiW?= =?us-ascii?Q?OmCKYU5evwGFjJKt4wJpCIdgvfw0ScnHfB6R+SwHkhJNegPzsY5w5Y021Z9t?= =?us-ascii?Q?5drEyDg94KFF0IVoO4lJsH9IW0gLYZ0K6GrY28AXKm7qyVvD6zwECM0++YK+?= =?us-ascii?Q?T6Qdi3I3LxiCt/4Ax+tickgHjW6aeLBxlvcTgpy+eWj9lI24eLniCrF0NMkW?= =?us-ascii?Q?/gmjBN2ZZ3GL4TGpUa8gV88npvLmnh2Gv6K2UC9KUPBIrxIrMtphL1Uz+PK2?= =?us-ascii?Q?52ITB00aMhZZOeAVumopc168hidzb2JzGJsX8g6ZN4vIeCgFTvdgXQ6Z9IrM?= =?us-ascii?Q?SEKhLEwE8f1AsFgjmpwV5tUSzWz2J1K1Z+aRnM3NLnN5temZilXNlTe9/QOF?= =?us-ascii?Q?frJ/Ddyb7Polc810KoP5MERyyW+l56M4QHzZWN0mRMj/DahECpr/B0oCmE7L?= =?us-ascii?Q?R75nByCZYDonsthx7zR18keOVc5QhH6GAV3uTVfCXCYO0e1iCpzhibBIfHju?= =?us-ascii?Q?Ji/lAW1+sLMj+OVGN6unT62mpcL4/4+6psjoyVytkmPo1T5kcrdJKF4o5M0e?= =?us-ascii?Q?gwwubzxKR/Jju/IoeVs5w11anPLfPTBOxNjsLO5eUj39sNLsMAtviLOXTUax?= =?us-ascii?Q?zw=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: f312c0ec-78c1-4663-2cf3-08dc9040382a 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:30.5956 (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: 9Cyujl7O7e08ZrXPiCOsJlh+ElmcDlR1Rs2ogGaX4KYizCeb3/aN4A4sjGT9jmbgt/FvPqLFEYFevpFrNIgoTfMxAKD5dAYbA7voSzae4zE= 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 Pack parameters of flow item process function into a single structure, which makes the logic more clear. Signed-off-by: Chaoyong He Reviewed-by: Long Wu Reviewed-by: Peng Zhang --- drivers/net/nfp/flower/nfp_flower_flow.c | 322 ++++++++++------------- 1 file changed, 146 insertions(+), 176 deletions(-) diff --git a/drivers/net/nfp/flower/nfp_flower_flow.c b/drivers/net/nfp/flower/nfp_flower_flow.c index 45a020b228..4dacac1d28 100644 --- a/drivers/net/nfp/flower/nfp_flower_flow.c +++ b/drivers/net/nfp/flower/nfp_flower_flow.c @@ -115,6 +115,16 @@ sizeof(struct rte_flow_item_gre) + \ sizeof(rte_be32_t)) /* Gre key */ +struct nfp_flow_merge_param { + struct nfp_app_fw_flower *app_fw_flower; + struct rte_flow *nfp_flow; + char **mbuf_off; + const struct rte_flow_item *item; + const struct nfp_flow_item_proc *proc; + bool is_mask; + bool is_outer_layer; +}; + /* Process structure associated with a flow item */ struct nfp_flow_item_proc { /** Bit-mask for fields supported by this PMD. */ @@ -124,13 +134,7 @@ struct nfp_flow_item_proc { /** Size in bytes for @p mask_support and @p mask_default. */ const size_t mask_sz; /** Merge a pattern item into a flow rule handle. */ - int (*merge)(struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - bool is_outer_layer); + int (*merge)(struct nfp_flow_merge_param *param); /** List of possible subsequent items. */ const enum rte_flow_item_type *const next_item; }; @@ -1200,28 +1204,24 @@ nfp_flow_is_tunnel(struct rte_flow *nfp_flow) } static int -nfp_flow_merge_eth(__rte_unused struct nfp_app_fw_flower *app_fw_flower, - __rte_unused struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - __rte_unused bool is_outer_layer) +nfp_flow_merge_eth(struct nfp_flow_merge_param *param) { struct nfp_flower_mac_mpls *eth; + const struct rte_flow_item *item; const struct rte_flow_item_eth *spec; const struct rte_flow_item_eth *mask; + item = param->item; spec = item->spec; if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge eth: no item->spec!"); goto eth_end; } - mask = item->mask ? item->mask : proc->mask_default; - eth = (void *)*mbuf_off; + mask = item->mask ? item->mask : param->proc->mask_default; + eth = (void *)(*param->mbuf_off); - if (is_mask) { + if (param->is_mask) { memcpy(eth->mac_src, mask->hdr.src_addr.addr_bytes, RTE_ETHER_ADDR_LEN); memcpy(eth->mac_dst, mask->hdr.dst_addr.addr_bytes, RTE_ETHER_ADDR_LEN); } else { @@ -1230,37 +1230,33 @@ nfp_flow_merge_eth(__rte_unused struct nfp_app_fw_flower *app_fw_flower, } eth->mpls_lse = 0; - *mbuf_off += sizeof(struct nfp_flower_mac_mpls); + *param->mbuf_off += sizeof(struct nfp_flower_mac_mpls); eth_end: return 0; } static int -nfp_flow_merge_vlan(__rte_unused struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - __rte_unused char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - __rte_unused bool is_outer_layer) +nfp_flow_merge_vlan(struct nfp_flow_merge_param *param) { + const struct rte_flow_item *item; struct nfp_flower_meta_tci *meta_tci; const struct rte_flow_item_vlan *spec; const struct rte_flow_item_vlan *mask; + item = param->item; spec = item->spec; if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge vlan: no item->spec!"); return 0; } - mask = item->mask ? item->mask : proc->mask_default; - if (is_mask) { - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.mask_data; + mask = item->mask ? item->mask : param->proc->mask_default; + if (param->is_mask) { + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.mask_data; meta_tci->tci |= mask->hdr.vlan_tci; } else { - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; meta_tci->tci |= spec->hdr.vlan_tci; } @@ -1268,16 +1264,11 @@ nfp_flow_merge_vlan(__rte_unused struct nfp_app_fw_flower *app_fw_flower, } static int -nfp_flow_merge_ipv4(__rte_unused struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - bool is_outer_layer) +nfp_flow_merge_ipv4(struct nfp_flow_merge_param *param) { struct nfp_flower_ipv4 *ipv4; const struct rte_ipv4_hdr *hdr; + const struct rte_flow_item *item; struct nfp_flower_meta_tci *meta_tci; const struct rte_flow_item_ipv4 *spec; const struct rte_flow_item_ipv4 *mask; @@ -1285,30 +1276,31 @@ nfp_flow_merge_ipv4(__rte_unused struct nfp_app_fw_flower *app_fw_flower, struct nfp_flower_ipv4_udp_tun *ipv4_udp_tun; struct nfp_flower_ipv4_gre_tun *ipv4_gre_tun; + item = param->item; spec = item->spec; - mask = item->mask ? item->mask : proc->mask_default; - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + mask = item->mask ? item->mask : param->proc->mask_default; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_EXT_META) != 0) ext_meta = (struct nfp_flower_ext_meta *)(meta_tci + 1); - if (is_outer_layer && nfp_flow_is_tunnel(nfp_flow)) { + if (param->is_outer_layer && nfp_flow_is_tunnel(param->nfp_flow)) { if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge ipv4: no item->spec!"); return 0; } - hdr = is_mask ? &mask->hdr : &spec->hdr; + hdr = param->is_mask ? &mask->hdr : &spec->hdr; if (ext_meta != NULL && (rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2) & NFP_FLOWER_LAYER2_GRE) != 0) { - ipv4_gre_tun = (struct nfp_flower_ipv4_gre_tun *)*mbuf_off; + ipv4_gre_tun = (struct nfp_flower_ipv4_gre_tun *)(*param->mbuf_off); ipv4_gre_tun->ip_ext.tos = hdr->type_of_service; ipv4_gre_tun->ip_ext.ttl = hdr->time_to_live; ipv4_gre_tun->ipv4.src = hdr->src_addr; ipv4_gre_tun->ipv4.dst = hdr->dst_addr; } else { - ipv4_udp_tun = (struct nfp_flower_ipv4_udp_tun *)*mbuf_off; + ipv4_udp_tun = (struct nfp_flower_ipv4_udp_tun *)(*param->mbuf_off); ipv4_udp_tun->ip_ext.tos = hdr->type_of_service; ipv4_udp_tun->ip_ext.ttl = hdr->time_to_live; @@ -1321,15 +1313,15 @@ nfp_flow_merge_ipv4(__rte_unused struct nfp_app_fw_flower *app_fw_flower, * rte_flow has ipv4 before L4 but NFP flower fw requires L4 before ipv4. */ if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_TP) != 0) - *mbuf_off += sizeof(struct nfp_flower_tp_ports); + *param->mbuf_off += sizeof(struct nfp_flower_tp_ports); if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge ipv4: no item->spec!"); goto ipv4_end; } - hdr = is_mask ? &mask->hdr : &spec->hdr; - ipv4 = (struct nfp_flower_ipv4 *)*mbuf_off; + hdr = param->is_mask ? &mask->hdr : &spec->hdr; + ipv4 = (struct nfp_flower_ipv4 *)(*param->mbuf_off); ipv4->ip_ext.tos = hdr->type_of_service; ipv4->ip_ext.proto = hdr->next_proto_id; @@ -1338,24 +1330,19 @@ nfp_flow_merge_ipv4(__rte_unused struct nfp_app_fw_flower *app_fw_flower, ipv4->ipv4_dst = hdr->dst_addr; ipv4_end: - *mbuf_off += sizeof(struct nfp_flower_ipv4); + *param->mbuf_off += sizeof(struct nfp_flower_ipv4); } return 0; } static int -nfp_flow_merge_ipv6(__rte_unused struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - bool is_outer_layer) +nfp_flow_merge_ipv6(struct nfp_flow_merge_param *param) { uint32_t vtc_flow; struct nfp_flower_ipv6 *ipv6; const struct rte_ipv6_hdr *hdr; + const struct rte_flow_item *item; struct nfp_flower_meta_tci *meta_tci; const struct rte_flow_item_ipv6 *spec; const struct rte_flow_item_ipv6 *mask; @@ -1363,24 +1350,25 @@ nfp_flow_merge_ipv6(__rte_unused struct nfp_app_fw_flower *app_fw_flower, struct nfp_flower_ipv6_udp_tun *ipv6_udp_tun; struct nfp_flower_ipv6_gre_tun *ipv6_gre_tun; + item = param->item; spec = item->spec; - mask = item->mask ? item->mask : proc->mask_default; - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + mask = item->mask ? item->mask : param->proc->mask_default; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_EXT_META) != 0) ext_meta = (struct nfp_flower_ext_meta *)(meta_tci + 1); - if (is_outer_layer && nfp_flow_is_tunnel(nfp_flow)) { + if (param->is_outer_layer && nfp_flow_is_tunnel(param->nfp_flow)) { if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge ipv6: no item->spec!"); return 0; } - hdr = is_mask ? &mask->hdr : &spec->hdr; + hdr = param->is_mask ? &mask->hdr : &spec->hdr; vtc_flow = rte_be_to_cpu_32(hdr->vtc_flow); if (ext_meta != NULL && (rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2) & NFP_FLOWER_LAYER2_GRE) != 0) { - ipv6_gre_tun = (struct nfp_flower_ipv6_gre_tun *)*mbuf_off; + ipv6_gre_tun = (struct nfp_flower_ipv6_gre_tun *)(*param->mbuf_off); ipv6_gre_tun->ip_ext.tos = vtc_flow >> RTE_IPV6_HDR_TC_SHIFT; ipv6_gre_tun->ip_ext.ttl = hdr->hop_limits; @@ -1389,7 +1377,7 @@ nfp_flow_merge_ipv6(__rte_unused struct nfp_app_fw_flower *app_fw_flower, memcpy(ipv6_gre_tun->ipv6.ipv6_dst, hdr->dst_addr, sizeof(ipv6_gre_tun->ipv6.ipv6_dst)); } else { - ipv6_udp_tun = (struct nfp_flower_ipv6_udp_tun *)*mbuf_off; + ipv6_udp_tun = (struct nfp_flower_ipv6_udp_tun *)(*param->mbuf_off); ipv6_udp_tun->ip_ext.tos = vtc_flow >> RTE_IPV6_HDR_TC_SHIFT; ipv6_udp_tun->ip_ext.ttl = hdr->hop_limits; @@ -1404,16 +1392,16 @@ nfp_flow_merge_ipv6(__rte_unused struct nfp_app_fw_flower *app_fw_flower, * rte_flow has ipv6 before L4 but NFP flower fw requires L4 before ipv6. */ if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_TP) != 0) - *mbuf_off += sizeof(struct nfp_flower_tp_ports); + *param->mbuf_off += sizeof(struct nfp_flower_tp_ports); if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge ipv6: no item->spec!"); goto ipv6_end; } - hdr = is_mask ? &mask->hdr : &spec->hdr; + hdr = param->is_mask ? &mask->hdr : &spec->hdr; vtc_flow = rte_be_to_cpu_32(hdr->vtc_flow); - ipv6 = (struct nfp_flower_ipv6 *)*mbuf_off; + ipv6 = (struct nfp_flower_ipv6 *)(*param->mbuf_off); ipv6->ip_ext.tos = vtc_flow >> RTE_IPV6_HDR_TC_SHIFT; ipv6->ip_ext.proto = hdr->proto; @@ -1422,22 +1410,17 @@ nfp_flow_merge_ipv6(__rte_unused struct nfp_app_fw_flower *app_fw_flower, memcpy(ipv6->ipv6_dst, hdr->dst_addr, sizeof(ipv6->ipv6_dst)); ipv6_end: - *mbuf_off += sizeof(struct nfp_flower_ipv6); + *param->mbuf_off += sizeof(struct nfp_flower_ipv6); } return 0; } static int -nfp_flow_merge_tcp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - __rte_unused bool is_outer_layer) +nfp_flow_merge_tcp(struct nfp_flow_merge_param *param) { uint8_t tcp_flags; + const struct rte_flow_item *item; struct nfp_flower_tp_ports *ports; struct nfp_flower_ipv4 *ipv4 = NULL; struct nfp_flower_ipv6 *ipv6 = NULL; @@ -1445,11 +1428,11 @@ nfp_flow_merge_tcp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, const struct rte_flow_item_tcp *mask; struct nfp_flower_meta_tci *meta_tci; - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV4) != 0) { ipv4 = (struct nfp_flower_ipv4 *) - (*mbuf_off - sizeof(struct nfp_flower_ipv4)); - if (is_mask) + (*param->mbuf_off - sizeof(struct nfp_flower_ipv4)); + if (param->is_mask) ipv4->ip_ext.proto = 0xFF; else ipv4->ip_ext.proto = IPPROTO_TCP; @@ -1457,8 +1440,8 @@ nfp_flow_merge_tcp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, ((char *)ipv4 - sizeof(struct nfp_flower_tp_ports)); } else if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV6) != 0) { ipv6 = (struct nfp_flower_ipv6 *) - (*mbuf_off - sizeof(struct nfp_flower_ipv6)); - if (is_mask) + (*param->mbuf_off - sizeof(struct nfp_flower_ipv6)); + if (param->is_mask) ipv6->ip_ext.proto = 0xFF; else ipv6->ip_ext.proto = IPPROTO_TCP; @@ -1469,14 +1452,15 @@ nfp_flow_merge_tcp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, return -EINVAL; } + item = param->item; spec = item->spec; if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge tcp: no item->spec!"); return 0; } - mask = item->mask ? item->mask : proc->mask_default; - if (is_mask) { + mask = item->mask ? item->mask : param->proc->mask_default; + if (param->is_mask) { ports->port_src = mask->hdr.src_port; ports->port_dst = mask->hdr.dst_port; tcp_flags = mask->hdr.tcp_flags; @@ -1514,14 +1498,9 @@ nfp_flow_merge_tcp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, } static int -nfp_flow_merge_udp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - bool is_outer_layer) +nfp_flow_merge_udp(struct nfp_flow_merge_param *param) { + const struct rte_flow_item *item; struct nfp_flower_tp_ports *ports; struct nfp_flower_ipv4 *ipv4 = NULL; struct nfp_flower_ipv6 *ipv6 = NULL; @@ -1530,16 +1509,16 @@ nfp_flow_merge_udp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, struct nfp_flower_meta_tci *meta_tci; /* Don't add L4 info if working on a inner layer pattern */ - if (!is_outer_layer) { + if (!param->is_outer_layer) { PMD_DRV_LOG(INFO, "Detected inner layer UDP, skipping."); return 0; } - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV4) != 0) { ipv4 = (struct nfp_flower_ipv4 *) - (*mbuf_off - sizeof(struct nfp_flower_ipv4)); - if (is_mask) + (*param->mbuf_off - sizeof(struct nfp_flower_ipv4)); + if (param->is_mask) ipv4->ip_ext.proto = 0xFF; else ipv4->ip_ext.proto = IPPROTO_UDP; @@ -1547,8 +1526,8 @@ nfp_flow_merge_udp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, ((char *)ipv4 - sizeof(struct nfp_flower_tp_ports)); } else if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV6) != 0) { ipv6 = (struct nfp_flower_ipv6 *) - (*mbuf_off - sizeof(struct nfp_flower_ipv6)); - if (is_mask) + (*param->mbuf_off - sizeof(struct nfp_flower_ipv6)); + if (param->is_mask) ipv6->ip_ext.proto = 0xFF; else ipv6->ip_ext.proto = IPPROTO_UDP; @@ -1559,14 +1538,15 @@ nfp_flow_merge_udp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, return -EINVAL; } + item = param->item; spec = item->spec; if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge udp: no item->spec!"); return 0; } - mask = item->mask ? item->mask : proc->mask_default; - if (is_mask) { + mask = item->mask ? item->mask : param->proc->mask_default; + if (param->is_mask) { ports->port_src = mask->hdr.src_port; ports->port_dst = mask->hdr.dst_port; } else { @@ -1578,14 +1558,9 @@ nfp_flow_merge_udp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, } static int -nfp_flow_merge_sctp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - __rte_unused bool is_outer_layer) +nfp_flow_merge_sctp(struct nfp_flow_merge_param *param) { + const struct rte_flow_item *item; struct nfp_flower_tp_ports *ports; struct nfp_flower_ipv4 *ipv4 = NULL; struct nfp_flower_ipv6 *ipv6 = NULL; @@ -1593,11 +1568,11 @@ nfp_flow_merge_sctp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, const struct rte_flow_item_sctp *spec; const struct rte_flow_item_sctp *mask; - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV4) != 0) { ipv4 = (struct nfp_flower_ipv4 *) - (*mbuf_off - sizeof(struct nfp_flower_ipv4)); - if (is_mask) + (*param->mbuf_off - sizeof(struct nfp_flower_ipv4)); + if (param->is_mask) ipv4->ip_ext.proto = 0xFF; else ipv4->ip_ext.proto = IPPROTO_SCTP; @@ -1605,8 +1580,8 @@ nfp_flow_merge_sctp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, ((char *)ipv4 - sizeof(struct nfp_flower_tp_ports)); } else if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_IPV6) != 0) { ipv6 = (struct nfp_flower_ipv6 *) - (*mbuf_off - sizeof(struct nfp_flower_ipv6)); - if (is_mask) + (*param->mbuf_off - sizeof(struct nfp_flower_ipv6)); + if (param->is_mask) ipv6->ip_ext.proto = 0xFF; else ipv6->ip_ext.proto = IPPROTO_SCTP; @@ -1617,14 +1592,15 @@ nfp_flow_merge_sctp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, return -EINVAL; } + item = param->item; spec = item->spec; if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge sctp: no item->spec!"); return 0; } - mask = item->mask ? item->mask : proc->mask_default; - if (is_mask) { + mask = item->mask ? item->mask : param->proc->mask_default; + if (param->is_mask) { ports->port_src = mask->hdr.src_port; ports->port_dst = mask->hdr.dst_port; } else { @@ -1636,16 +1612,11 @@ nfp_flow_merge_sctp(__rte_unused struct nfp_app_fw_flower *app_fw_flower, } static int -nfp_flow_merge_vxlan(struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - __rte_unused bool is_outer_layer) +nfp_flow_merge_vxlan(struct nfp_flow_merge_param *param) { int ret = 0; const struct rte_vxlan_hdr *hdr; + const struct rte_flow_item *item; struct nfp_flower_ipv4_udp_tun *tun4; struct nfp_flower_ipv6_udp_tun *tun6; struct nfp_flower_meta_tci *meta_tci; @@ -1653,52 +1624,48 @@ nfp_flow_merge_vxlan(struct nfp_app_fw_flower *app_fw_flower, const struct rte_flow_item_vxlan *mask; struct nfp_flower_ext_meta *ext_meta = NULL; - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_EXT_META) != 0) ext_meta = (struct nfp_flower_ext_meta *)(meta_tci + 1); + item = param->item; spec = item->spec; if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge vxlan: no item->spec!"); goto vxlan_end; } - mask = item->mask ? item->mask : proc->mask_default; - hdr = is_mask ? &mask->hdr : &spec->hdr; + mask = item->mask ? item->mask : param->proc->mask_default; + hdr = param->is_mask ? &mask->hdr : &spec->hdr; if (ext_meta != NULL && (rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2) & NFP_FLOWER_LAYER2_TUN_IPV6) != 0) { - tun6 = (struct nfp_flower_ipv6_udp_tun *)*mbuf_off; + tun6 = (struct nfp_flower_ipv6_udp_tun *)(*param->mbuf_off); tun6->tun_id = hdr->vx_vni; - if (!is_mask) - ret = nfp_tun_add_ipv6_off(app_fw_flower, tun6->ipv6.ipv6_dst); + if (!param->is_mask) + ret = nfp_tun_add_ipv6_off(param->app_fw_flower, tun6->ipv6.ipv6_dst); } else { - tun4 = (struct nfp_flower_ipv4_udp_tun *)*mbuf_off; + tun4 = (struct nfp_flower_ipv4_udp_tun *)(*param->mbuf_off); tun4->tun_id = hdr->vx_vni; - if (!is_mask) - ret = nfp_tun_add_ipv4_off(app_fw_flower, tun4->ipv4.dst); + if (!param->is_mask) + ret = nfp_tun_add_ipv4_off(param->app_fw_flower, tun4->ipv4.dst); } vxlan_end: if (ext_meta != NULL && (rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2) & NFP_FLOWER_LAYER2_TUN_IPV6) != 0) - *mbuf_off += sizeof(struct nfp_flower_ipv6_udp_tun); + *param->mbuf_off += sizeof(struct nfp_flower_ipv6_udp_tun); else - *mbuf_off += sizeof(struct nfp_flower_ipv4_udp_tun); + *param->mbuf_off += sizeof(struct nfp_flower_ipv4_udp_tun); return ret; } static int -nfp_flow_merge_geneve(struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - __rte_unused bool is_outer_layer) +nfp_flow_merge_geneve(struct nfp_flow_merge_param *param) { int ret = 0; + const struct rte_flow_item *item; struct nfp_flower_ipv4_udp_tun *tun4; struct nfp_flower_ipv6_udp_tun *tun6; struct nfp_flower_meta_tci *meta_tci; @@ -1707,73 +1674,68 @@ nfp_flow_merge_geneve(struct nfp_app_fw_flower *app_fw_flower, const struct rte_flow_item_geneve *geneve; struct nfp_flower_ext_meta *ext_meta = NULL; - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; if ((meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_EXT_META) != 0) ext_meta = (struct nfp_flower_ext_meta *)(meta_tci + 1); + item = param->item; spec = item->spec; if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge geneve: no item->spec!"); goto geneve_end; } - mask = item->mask ? item->mask : proc->mask_default; - geneve = is_mask ? mask : spec; + mask = item->mask ? item->mask : param->proc->mask_default; + geneve = param->is_mask ? mask : spec; if (ext_meta != NULL && (rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2) & NFP_FLOWER_LAYER2_TUN_IPV6) != 0) { - tun6 = (struct nfp_flower_ipv6_udp_tun *)*mbuf_off; + tun6 = (struct nfp_flower_ipv6_udp_tun *)(*param->mbuf_off); tun6->tun_id = rte_cpu_to_be_32((geneve->vni[0] << 16) | (geneve->vni[1] << 8) | (geneve->vni[2])); - if (!is_mask) - ret = nfp_tun_add_ipv6_off(app_fw_flower, tun6->ipv6.ipv6_dst); + if (!param->is_mask) + ret = nfp_tun_add_ipv6_off(param->app_fw_flower, tun6->ipv6.ipv6_dst); } else { - tun4 = (struct nfp_flower_ipv4_udp_tun *)*mbuf_off; + tun4 = (struct nfp_flower_ipv4_udp_tun *)(*param->mbuf_off); tun4->tun_id = rte_cpu_to_be_32((geneve->vni[0] << 16) | (geneve->vni[1] << 8) | (geneve->vni[2])); - if (!is_mask) - ret = nfp_tun_add_ipv4_off(app_fw_flower, tun4->ipv4.dst); + if (!param->is_mask) + ret = nfp_tun_add_ipv4_off(param->app_fw_flower, tun4->ipv4.dst); } geneve_end: if (ext_meta != NULL && (rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2) & NFP_FLOWER_LAYER2_TUN_IPV6) != 0) { - *mbuf_off += sizeof(struct nfp_flower_ipv6_udp_tun); + *param->mbuf_off += sizeof(struct nfp_flower_ipv6_udp_tun); } else { - *mbuf_off += sizeof(struct nfp_flower_ipv4_udp_tun); + *param->mbuf_off += sizeof(struct nfp_flower_ipv4_udp_tun); } return ret; } static int -nfp_flow_merge_gre(__rte_unused struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - __rte_unused const struct rte_flow_item *item, - __rte_unused const struct nfp_flow_item_proc *proc, - bool is_mask, - __rte_unused bool is_outer_layer) +nfp_flow_merge_gre(struct nfp_flow_merge_param *param) { struct nfp_flower_meta_tci *meta_tci; struct nfp_flower_ext_meta *ext_meta; struct nfp_flower_ipv4_gre_tun *tun4; struct nfp_flower_ipv6_gre_tun *tun6; - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; ext_meta = (struct nfp_flower_ext_meta *)(meta_tci + 1); /* NVGRE is the only supported GRE tunnel type */ if ((rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2) & NFP_FLOWER_LAYER2_TUN_IPV6) != 0) { - tun6 = (struct nfp_flower_ipv6_gre_tun *)*mbuf_off; - if (is_mask) + tun6 = (struct nfp_flower_ipv6_gre_tun *)(*param->mbuf_off); + if (param->is_mask) tun6->ethertype = rte_cpu_to_be_16(~0); else tun6->ethertype = rte_cpu_to_be_16(0x6558); } else { - tun4 = (struct nfp_flower_ipv4_gre_tun *)*mbuf_off; - if (is_mask) + tun4 = (struct nfp_flower_ipv4_gre_tun *)(*param->mbuf_off); + if (param->is_mask) tun4->ethertype = rte_cpu_to_be_16(~0); else tun4->ethertype = rte_cpu_to_be_16(0x6558); @@ -1783,56 +1745,52 @@ nfp_flow_merge_gre(__rte_unused struct nfp_app_fw_flower *app_fw_flower, } static int -nfp_flow_merge_gre_key(struct nfp_app_fw_flower *app_fw_flower, - struct rte_flow *nfp_flow, - char **mbuf_off, - const struct rte_flow_item *item, - const struct nfp_flow_item_proc *proc, - bool is_mask, - __rte_unused bool is_outer_layer) +nfp_flow_merge_gre_key(struct nfp_flow_merge_param *param) { int ret = 0; rte_be32_t tun_key; const rte_be32_t *spec; const rte_be32_t *mask; + const struct rte_flow_item *item; struct nfp_flower_meta_tci *meta_tci; struct nfp_flower_ext_meta *ext_meta; struct nfp_flower_ipv4_gre_tun *tun4; struct nfp_flower_ipv6_gre_tun *tun6; - meta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data; + meta_tci = (struct nfp_flower_meta_tci *)param->nfp_flow->payload.unmasked_data; ext_meta = (struct nfp_flower_ext_meta *)(meta_tci + 1); + item = param->item; spec = item->spec; if (spec == NULL) { PMD_DRV_LOG(DEBUG, "nfp flow merge gre key: no item->spec!"); goto gre_key_end; } - mask = item->mask ? item->mask : proc->mask_default; - tun_key = is_mask ? *mask : *spec; + mask = item->mask ? item->mask : param->proc->mask_default; + tun_key = param->is_mask ? *mask : *spec; if ((rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2) & NFP_FLOWER_LAYER2_TUN_IPV6) != 0) { - tun6 = (struct nfp_flower_ipv6_gre_tun *)*mbuf_off; + tun6 = (struct nfp_flower_ipv6_gre_tun *)(*param->mbuf_off); tun6->tun_key = tun_key; tun6->tun_flags = rte_cpu_to_be_16(NFP_FL_GRE_FLAG_KEY); - if (!is_mask) - ret = nfp_tun_add_ipv6_off(app_fw_flower, tun6->ipv6.ipv6_dst); + if (!param->is_mask) + ret = nfp_tun_add_ipv6_off(param->app_fw_flower, tun6->ipv6.ipv6_dst); } else { - tun4 = (struct nfp_flower_ipv4_gre_tun *)*mbuf_off; + tun4 = (struct nfp_flower_ipv4_gre_tun *)(*param->mbuf_off); tun4->tun_key = tun_key; tun4->tun_flags = rte_cpu_to_be_16(NFP_FL_GRE_FLAG_KEY); - if (!is_mask) - ret = nfp_tun_add_ipv4_off(app_fw_flower, tun4->ipv4.dst); + if (!param->is_mask) + ret = nfp_tun_add_ipv4_off(param->app_fw_flower, tun4->ipv4.dst); } gre_key_end: if ((rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2) & NFP_FLOWER_LAYER2_TUN_IPV6) != 0) - *mbuf_off += sizeof(struct nfp_flower_ipv6_gre_tun); + *param->mbuf_off += sizeof(struct nfp_flower_ipv6_gre_tun); else - *mbuf_off += sizeof(struct nfp_flower_ipv4_gre_tun); + *param->mbuf_off += sizeof(struct nfp_flower_ipv4_gre_tun); return ret; } @@ -2133,15 +2091,27 @@ nfp_flow_compile_item_proc(struct nfp_flower_representor *repr, break; } - ret = proc->merge(app_fw_flower, nfp_flow, mbuf_off_exact, item, - proc, false, is_outer_layer); + struct nfp_flow_merge_param param = { + .app_fw_flower = app_fw_flower, + .nfp_flow = nfp_flow, + .item = item, + .proc = proc, + .is_outer_layer = is_outer_layer, + }; + + /* Proc the exact match section */ + param.mbuf_off = mbuf_off_exact; + param.is_mask = false; + ret = proc->merge(¶m); if (ret != 0) { PMD_DRV_LOG(ERR, "nfp flow item %d exact merge failed", item->type); break; } - ret = proc->merge(app_fw_flower, nfp_flow, mbuf_off_mask, item, - proc, true, is_outer_layer); + /*Proc the mask section */ + param.mbuf_off = mbuf_off_mask; + param.is_mask = true; + ret = proc->merge(¶m); if (ret != 0) { PMD_DRV_LOG(ERR, "nfp flow item %d mask merge failed", item->type); break; -- 2.39.1