get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/132297/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 132297,
    "url": "http://patches.dpdk.org/api/patches/132297/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231004093602.1278126-5-chaoyong.he@corigine.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20231004093602.1278126-5-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231004093602.1278126-5-chaoyong.he@corigine.com",
    "date": "2023-10-04T09:36:02",
    "name": "[v2,4/4] net/nfp: add support for merged flows and conntrack stats",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "7ada379e64dfc918c4fe241a053d211c315b9a61",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20231004093602.1278126-5-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 29730,
            "url": "http://patches.dpdk.org/api/series/29730/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=29730",
            "date": "2023-10-04T09:35:58",
            "name": "support offload of simple conntrack flow rules",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/29730/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/132297/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/132297/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "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])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 1AA9B4266A;\n\tWed,  4 Oct 2023 11:36:58 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4C14A406BC;\n\tWed,  4 Oct 2023 11:36:33 +0200 (CEST)",
            "from NAM12-DM6-obe.outbound.protection.outlook.com\n (mail-dm6nam12on2139.outbound.protection.outlook.com [40.107.243.139])\n by mails.dpdk.org (Postfix) with ESMTP id B1A324069F\n for <dev@dpdk.org>; Wed,  4 Oct 2023 11:36:31 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by CH0PR13MB4764.namprd13.prod.outlook.com (2603:10b6:610:df::16)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6838.33; Wed, 4 Oct\n 2023 09:36:30 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::28c0:63e2:ecd1:9314]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::28c0:63e2:ecd1:9314%4]) with mapi id 15.20.6813.027; Wed, 4 Oct 2023\n 09:36:29 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=mEZm39zlQhBLi6TK/T62bNcdy04bidbsKGTkw1hDlouc2lbHtNgLZ/yjJSfrazEuEqJvdYBY6Zrf44wA5FZqvXytyviT0ND09SyPoTG3lOnwCc3/GdSXEyqPbDAupXtSw7J4uRMBmfXkK8IChVLFmCxZl7UdpN4gfVLt3lThT671YQ4O6UXknZmKvuvJuTRFcoHPHa/2MfKnxjfxqt6KT6IPEv69BuGcFh44dilQYa7oM6SxDIWiJ2e3Niz6s4rqAWX3vXwn7EQNlWIQQ0HHDPMkXpa4YqtB/3rBIAat0uQ+++ATg95oSCoGZFq9l6svfWEaIer6raXGn0/ubk8ICw==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n 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;\n bh=8kOLcoee4DkG1zQWlqym7ubgVVvhnC7sDjcU00BHzKs=;\n b=chmGXdW8wluLSXbPFe8allj8GC4BICstVQx8uwKZBiRyFcqcPp0dJ6fBomp3asEYdYrhPHr1dvgtJLzqc7agw2cCikIbZ2HmjKG1631TKqKBayi6hsLBplsklBOmV2L+n/ANbIb6mwwRVdT3rMejIPtzPhO3zzlJGgjNWsF9jG/oH6KPakGlXMqCFvEohNLkrq8IaEjpLQdSg42u4Zmbpuvhf+C7/mAHZajUKuXteBWrlwmbOLwizr7hCmfvh1JT665f31+U+Agnmi6xU6XO5ueWs4p/bLh+TsKsR9CU3xzGalBNU7Y+8gOJmsuez0WNY8PNDI2DMomgmO5mm8b9kw==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=8kOLcoee4DkG1zQWlqym7ubgVVvhnC7sDjcU00BHzKs=;\n b=bzSuqNC2GX4HdnR3jV18XRn9m2acJ+IwcLYQ6PekiZxmDfjLzLeCmHQszQk5w7YepR+ENFYhg1Up2YOQK86dJkXBSJeGGglF8bWncJOxcT44t3jyL0v48kwyUWPWIKr3/G4s13xzntTqYSjlhmNVSAi1F/HiW2L+1l2/YAGiXHk=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com,\n\tChaoyong He <chaoyong.he@corigine.com>",
        "Subject": "[PATCH v2 4/4] net/nfp: add support for merged flows and conntrack\n stats",
        "Date": "Wed,  4 Oct 2023 17:36:02 +0800",
        "Message-Id": "<20231004093602.1278126-5-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20231004093602.1278126-1-chaoyong.he@corigine.com>",
        "References": "<20230930100053.1227215-1-chaoyong.he@corigine.com>\n <20231004093602.1278126-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "SJ0PR03CA0080.namprd03.prod.outlook.com\n (2603:10b6:a03:331::25) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|CH0PR13MB4764:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "1c1ad071-c5f4-4139-be0f-08dbc4bd633e",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n nGvlq7u5hsz1/1KiXfWB6EA//GHed8IR6Gr7pSyUOirKZY4HsEskyz0SSk8aez+2DHe579qNf+3x6n/5R7NSXaCEuIh1coyDi0JGE8lTLuWkbwYmbii386IjsyyrIcjGT2R+OEvRqmPGYLfL2cdW714MQOlBsGyVY6Nusp6Gtl9szvdYyVBMUtGFtYffPWJ/IjE76LbsCI0UWa64QqPXgqOSVzjkNnkc40V0EdCvSrFd4BsVRtrw1KkvB5CNVV3ybuIEkFBRhL4ReHp3kdjsC/77/oX1n/WHOU7B03cygXRyBSEt8JghdNoN+to9f/i4Dp4oFE11gPZs0nnZlwl4hycfcbslia8PvjcHxAZowI4k5D3ZWZ3IF4DXJQ4hIzxg1X/pEJUeyk0xuJxDswY5WJaz58mdufDozSgo5MEPAvf6hcd3s4gu65duEnxOrLHWRXWJ53WnZZmChpRkqBfRviMX2wyVW2FCf6v9DgzMly7SOFI8dfrsafcXVQoiSaDLDE+LksHfmy7BHuQs1HIp3yVJyxoKR+oP5dBtVXrfqiQanjJtV3Bo/HWhal2qA0jFzI+NRZGkfGpQ9hoSgm0V/aOdJuFI1GvCl5OD6ljzjPRYChacVok7qiL/imU33LTEhr3InDrdCeHaTTO+yQRuBoUzk/s9c29iKXulxfbi6CQ=",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230031)(39830400003)(136003)(396003)(346002)(366004)(376002)(230922051799003)(1800799009)(451199024)(186009)(64100799003)(107886003)(41300700001)(1076003)(6486002)(52116002)(2616005)(6506007)(316002)(6512007)(6916009)(66556008)(66946007)(66476007)(44832011)(8676002)(8936002)(4326008)(5660300002)(26005)(6666004)(478600001)(30864003)(2906002)(83380400001)(36756003)(38100700002)(38350700002)(86362001);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n i89DXWpAMdw0LHPaZ3RYWRUOqmKe97GtHPQHGzN7umHGeAO1fhM6qkXJEfzugaqJABxv/cmtzZGh9X67raMuXcEqiuzo53qIW7jwAcM4+gygYKWBgviXv8VVelT1oA/4QCjjDVOSjWLxL+fmfWwNmevB2YwX9+Jxn12kLrq3y1TU7wYX25n5KCA5vV0ouWc5s0pmiLGdQqZIVQUuYMlC0u8VfgjZFvHCIjbXy+NgT99PMd1QsNB4uiNp9AG50iP7ZIoQ1EYVO41JPesGgZTjqiukFuQhJrPDZvCXLNoPUam7wYoiHd/eVNhDVoodmuy0F77pQmpDVNVMNBX7fPJBcnkCsAxw6ZH8dJNRe3tVwn6Yh9b126J5cJ6Vo2zqceVM8Q4frgGCHeUDuu5/1glOEHedTyKLE7lbR8l5eShV4vnJ9T8bvNvAmv6fV9RadVjN7bZR0pRbzfToPkmeOlNELiLzdi+/vvPGgEsz6S/QDIMeXksNdY89WrlrpG5++3hLN1NZVmqx/6suIo06B+0uYyEo/mZJ/teRauJm/H+lsE3Zz9h7gVceIvJwKKqOI5096DbrER17Ye/TYWsUHqPQnaMiBC2mjD73qqCkLRYR2rY8VBlmARs1I4+CrwGyCWu0LffAgIFZgc0F9prSK3P5kt/7Fc0TCBQgh4D3m8t9Zsx6/lNZR1eQhRw49BT/rhFsxi7QXKjEnLJTVLKSn2P4G4WhAftMF9hm6y52PxSMIocwKTYWg1tdrta+3ygkyuIz+rIkg5N2tZsHPJlWVpPwe8VcFx7xp7g8vh6bhAAPoVxwsZbqMPBaUyF1NjcDc0qA7gcQ1M28iaJmcLi2mOtcj//Ajx5UacLa35aNZy3eT5solHVb3rcmXmM8qv42EoLZs4l58FTM15o6xpRmUQtrTop1/MkmnCXrPyl8gYM3Srm3tNn0ojpfcg8KTiE2JS3iT2rV3Qree8sP2eDDELc8DQlo1wj4jaAiFwyfA40xL/SJ5W8XYD7P3RUGlW549XKeXbb3vlpzf/v+qo4HpjEO/y1zCreCYf96TM2XL+MLKmIBe/vzkc7dW2Dbwkqtu8mT6W3pG49F8F8Z3Sp78vX2PI79iNJelgd219em2b1bAfYJFjqy8T6omPQuLcuD5G6tN42X1syYKMyoHT6TPXdDf9omHIj7o0RoWqkKZkm0cCR/jrWpXRO7tyLzKRH4F5d5KAsk244GAq6JMzBSBdgTIiHFLxKHPovbBb6XWWzbhygG7Nvut24Wqa6iJ4Dya/fpNDsQHgMv31r6kA6cTcM/EcQRou7VmFZxwqPDEQLI7v+IEE+A/cVnNvoZOvrHB7/2753uZ1UhG5u7rPIih6ljIACiNcfcj9vlPbqV8jt+tXo+OCW4j0dhNGcweeXFzvpQz/IFhaSUBohFQUm4WGDJsu+SZ6H+OfpHTemtiJBEG4YUczCMLensagYIJrR0jnSM+lcx/JQparWxPU5s88cXmNezPJ7I9Y4Eb1sw9kEztJTBSpftoNDOc0o5nDxU82ymSUKobnfE6XjXyVGd5YtNru9DDWcDAluE6RVZmqc8e9JdY2WaO1MsFB0YSimpNLBm1IOxgykshVy1IE8NO/f7Yg==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 1c1ad071-c5f4-4139-be0f-08dbc4bd633e",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "04 Oct 2023 09:36:29.9068 (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": "\n 5hqpU4egfDLmgD5gJ3YlciScDmi4mDOEt//g43W5SH7SMc74vsWVIJ5QzTWtQICMUp77J0x5AovB+kQ+elBUtgO/0fbNhpWmZSEpgV8959U=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CH0PR13MB4764",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Adjust the original logic to make it valid for both normal flow\nand merged flow.\nAdd the logic to update conntrack flow stats.\nAdd the support of conntrack action.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\n---\n drivers/net/nfp/flower/nfp_conntrack.c | 54 ++++++++++++++++--\n drivers/net/nfp/flower/nfp_conntrack.h |  3 +\n drivers/net/nfp/nfp_flow.c             | 79 ++++++++++++++++++++++----\n drivers/net/nfp/nfp_flow.h             |  7 ++-\n 4 files changed, 126 insertions(+), 17 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_conntrack.c b/drivers/net/nfp/flower/nfp_conntrack.c\nindex 2ea856ebab..aacd4d7dd3 100644\n--- a/drivers/net/nfp/flower/nfp_conntrack.c\n+++ b/drivers/net/nfp/flower/nfp_conntrack.c\n@@ -39,6 +39,7 @@ struct nfp_ct_flow_entry {\n \tstruct nfp_flower_representor *repr;\n \tstruct nfp_ct_zone_entry *ze;\n \tstruct nfp_initial_flow rule;\n+\tstruct nfp_fl_stats stats;\n };\n \n struct nfp_ct_map_entry {\n@@ -56,6 +57,7 @@ struct nfp_ct_zone_entry {\n \n struct nfp_ct_merge_entry {\n \tuint64_t cookie[2];\n+\tuint32_t ctx_id;\n \tLIST_ENTRY(nfp_ct_merge_entry) pre_ct_list;\n \tLIST_ENTRY(nfp_ct_merge_entry) post_ct_list;\n \tstruct nfp_initial_flow rule;\n@@ -989,12 +991,14 @@ nfp_ct_offload_add(struct nfp_flower_representor *repr,\n \tcookie = rte_rand();\n \titems = merge_entry->rule.items;\n \tactions = merge_entry->rule.actions;\n-\tnfp_flow = nfp_flow_process(repr, items, actions, false, cookie, true);\n+\tnfp_flow = nfp_flow_process(repr, items, actions, false, cookie, true, true);\n \tif (nfp_flow == NULL) {\n \t\tPMD_DRV_LOG(ERR, \"Process the merged flow rule failed.\");\n \t\treturn -EINVAL;\n \t}\n \n+\tmerge_entry->ctx_id = rte_be_to_cpu_32(nfp_flow->payload.meta->host_ctx_id);\n+\n \t/* Add the flow to hardware */\n \tpriv = repr->app_fw_flower->flow_priv;\n \tret = nfp_flower_cmsg_flow_add(repr->app_fw_flower, nfp_flow);\n@@ -1004,7 +1008,7 @@ nfp_ct_offload_add(struct nfp_flower_representor *repr,\n \t}\n \n \t/* Add the flow to flow hash table */\n-\tret = nfp_flow_table_add(priv, nfp_flow);\n+\tret = nfp_flow_table_add_merge(priv, nfp_flow);\n \tif (ret != 0) {\n \t\tPMD_DRV_LOG(ERR, \"Add the merged flow to flow table failed.\");\n \t\tgoto flow_teardown;\n@@ -1692,14 +1696,14 @@ nfp_ct_flow_setup(struct nfp_flower_representor *representor,\n \n \tif (is_ct_commit_flow(ct)) {\n \t\treturn nfp_flow_process(representor, &items[1], actions,\n-\t\t\t\tvalidate_flag, cookie, false);\n+\t\t\t\tvalidate_flag, cookie, false, false);\n \t}\n \n \tif (is_post_ct_flow(ct)) {\n \t\tif (nfp_flow_handle_post_ct(ct_item, representor, &items[1],\n \t\t\t\tactions, cookie)) {\n \t\t\treturn nfp_flow_process(representor, &items[1], actions,\n-\t\t\t\t\tvalidate_flag, cookie, false);\n+\t\t\t\t\tvalidate_flag, cookie, false, false);\n \t\t}\n \n \t\tPMD_DRV_LOG(ERR, \"Handle nfp post ct flow failed.\");\n@@ -1710,7 +1714,7 @@ nfp_ct_flow_setup(struct nfp_flower_representor *representor,\n \t\tif (nfp_flow_handle_pre_ct(ct_item, representor, &items[1],\n \t\t\t\tactions, cookie)) {\n \t\t\treturn nfp_flow_process(representor, &items[1], actions,\n-\t\t\t\t\tvalidate_flag, cookie, false);\n+\t\t\t\t\tvalidate_flag, cookie, false, false);\n \t\t}\n \n \t\tPMD_DRV_LOG(ERR, \"Handle nfp pre ct flow failed.\");\n@@ -1720,3 +1724,43 @@ nfp_ct_flow_setup(struct nfp_flower_representor *representor,\n \tPMD_DRV_LOG(ERR, \"Unsupported ct flow type.\");\n \treturn NULL;\n }\n+\n+static inline void\n+nfp_ct_flow_stats_update(struct nfp_flow_priv *priv,\n+\t\tstruct nfp_ct_merge_entry *m_ent)\n+{\n+\tuint32_t ctx_id;\n+\tstruct nfp_fl_stats *merge_stats;\n+\n+\tctx_id = m_ent->ctx_id;\n+\tmerge_stats = &priv->stats[ctx_id];\n+\n+\tm_ent->pre_ct_parent->stats.bytes  += merge_stats->bytes;\n+\tm_ent->pre_ct_parent->stats.pkts   += merge_stats->pkts;\n+\tm_ent->post_ct_parent->stats.bytes += merge_stats->bytes;\n+\tm_ent->post_ct_parent->stats.pkts  += merge_stats->pkts;\n+\n+\tmerge_stats->bytes = 0;\n+\tmerge_stats->pkts = 0;\n+}\n+\n+struct nfp_fl_stats *\n+nfp_ct_flow_stats_get(struct nfp_flow_priv *priv,\n+\t\tstruct nfp_ct_map_entry *me)\n+{\n+\tstruct nfp_ct_merge_entry *m_ent;\n+\n+\trte_spinlock_lock(&priv->stats_lock);\n+\n+\tif (me->fe->type == CT_TYPE_PRE_CT) {\n+\t\tLIST_FOREACH(m_ent, &me->fe->children, pre_ct_list)\n+\t\t\tnfp_ct_flow_stats_update(priv, m_ent);\n+\t} else {\n+\t\tLIST_FOREACH(m_ent, &me->fe->children, post_ct_list)\n+\t\t\tnfp_ct_flow_stats_update(priv, m_ent);\n+\t}\n+\n+\trte_spinlock_unlock(&priv->stats_lock);\n+\n+\treturn &me->fe->stats;\n+}\ndiff --git a/drivers/net/nfp/flower/nfp_conntrack.h b/drivers/net/nfp/flower/nfp_conntrack.h\nindex 2f47280716..5abab4e984 100644\n--- a/drivers/net/nfp/flower/nfp_conntrack.h\n+++ b/drivers/net/nfp/flower/nfp_conntrack.h\n@@ -34,4 +34,7 @@ struct rte_flow *nfp_ct_flow_setup(struct nfp_flower_representor *representor,\n \t\tbool validate_flag,\n \t\tuint64_t cookie);\n \n+struct nfp_fl_stats *nfp_ct_flow_stats_get(struct nfp_flow_priv *priv,\n+\t\tstruct nfp_ct_map_entry *me);\n+\n #endif /* __NFP_CONNTRACK_H__ */\ndiff --git a/drivers/net/nfp/nfp_flow.c b/drivers/net/nfp/nfp_flow.c\nindex a6439679d3..020e31e9de 100644\n--- a/drivers/net/nfp/nfp_flow.c\n+++ b/drivers/net/nfp/nfp_flow.c\n@@ -310,14 +310,14 @@ nfp_check_mask_add(struct nfp_flow_priv *priv,\n \t\tret = nfp_mask_table_add(priv, mask_data, mask_len, mask_id);\n \t\tif (ret != 0)\n \t\t\treturn false;\n-\n-\t\t*meta_flags |= NFP_FL_META_FLAG_MANAGE_MASK;\n \t} else {\n \t\t/* mask entry already exist */\n \t\tmask_entry->ref_cnt++;\n \t\t*mask_id = mask_entry->mask_id;\n \t}\n \n+\t*meta_flags |= NFP_FL_META_FLAG_MANAGE_MASK;\n+\n \treturn true;\n }\n \n@@ -349,7 +349,7 @@ nfp_check_mask_remove(struct nfp_flow_priv *priv,\n \treturn true;\n }\n \n-int\n+static int\n nfp_flow_table_add(struct nfp_flow_priv *priv,\n \t\tstruct rte_flow *nfp_flow)\n {\n@@ -396,6 +396,48 @@ nfp_flow_table_search(struct nfp_flow_priv *priv,\n \treturn flow_find;\n }\n \n+int\n+nfp_flow_table_add_merge(struct nfp_flow_priv *priv,\n+\t\tstruct rte_flow *nfp_flow)\n+{\n+\tstruct rte_flow *flow_find;\n+\n+\tflow_find = nfp_flow_table_search(priv, nfp_flow);\n+\tif (flow_find != NULL) {\n+\t\tif (nfp_flow->merge_flag || flow_find->merge_flag) {\n+\t\t\tflow_find->merge_flag = true;\n+\t\t\tflow_find->ref_cnt++;\n+\t\t\treturn 0;\n+\t\t}\n+\n+\t\tPMD_DRV_LOG(ERR, \"Add to flow table failed.\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn nfp_flow_table_add(priv, nfp_flow);\n+}\n+\n+static int\n+nfp_flow_table_delete_merge(struct nfp_flow_priv *priv,\n+\t\tstruct rte_flow *nfp_flow)\n+{\n+\tstruct rte_flow *flow_find;\n+\n+\tflow_find = nfp_flow_table_search(priv, nfp_flow);\n+\tif (flow_find == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Can't delete a non-existing flow.\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (nfp_flow->merge_flag || flow_find->merge_flag) {\n+\t\tflow_find->ref_cnt--;\n+\t\tif (flow_find->ref_cnt > 0)\n+\t\t\treturn 0;\n+\t}\n+\n+\treturn nfp_flow_table_delete(priv, nfp_flow);\n+}\n+\n static struct rte_flow *\n nfp_flow_alloc(struct nfp_fl_key_ls *key_layer, uint32_t port_id)\n {\n@@ -1082,6 +1124,9 @@ nfp_flow_key_layers_calculate_actions(const struct rte_flow_action actions[],\n \t\t\t\treturn -ENOTSUP;\n \t\t\t}\n \t\t\tbreak;\n+\t\tcase RTE_FLOW_ACTION_TYPE_CONNTRACK:\n+\t\t\tPMD_DRV_LOG(DEBUG, \"RTE_FLOW_ACTION_TYPE_CONNTRACK detected\");\n+\t\t\tbreak;\n \t\tdefault:\n \t\t\tPMD_DRV_LOG(ERR, \"Action type %d not supported.\", action->type);\n \t\t\treturn -ENOTSUP;\n@@ -3626,6 +3671,9 @@ nfp_flow_compile_action(struct nfp_flower_representor *representor,\n \t\t\t\treturn -EINVAL;\n \t\t\tposition += sizeof(struct nfp_fl_act_meter);\n \t\t\tbreak;\n+\t\tcase RTE_FLOW_ACTION_TYPE_CONNTRACK:\n+\t\t\tPMD_DRV_LOG(DEBUG, \"Process RTE_FLOW_ACTION_TYPE_CONNTRACK\");\n+\t\t\tbreak;\n \t\tdefault:\n \t\t\tPMD_DRV_LOG(ERR, \"Unsupported action type: %d\", action->type);\n \t\t\treturn -ENOTSUP;\n@@ -3647,7 +3695,8 @@ nfp_flow_process(struct nfp_flower_representor *representor,\n \t\tconst struct rte_flow_action actions[],\n \t\tbool validate_flag,\n \t\tuint64_t cookie,\n-\t\tbool install_flag)\n+\t\tbool install_flag,\n+\t\tbool merge_flag)\n {\n \tint ret;\n \tchar *hash_data;\n@@ -3684,6 +3733,7 @@ nfp_flow_process(struct nfp_flower_representor *representor,\n \t}\n \n \tnfp_flow->install_flag = install_flag;\n+\tnfp_flow->merge_flag = merge_flag;\n \n \tnfp_flow_compile_metadata(priv, nfp_flow, &key_layer, stats_ctx, cookie);\n \n@@ -3717,7 +3767,7 @@ nfp_flow_process(struct nfp_flower_representor *representor,\n \n \t/* Find the flow in hash table */\n \tflow_find = nfp_flow_table_search(priv, nfp_flow);\n-\tif (flow_find != NULL) {\n+\tif (flow_find != NULL && !nfp_flow->merge_flag && !flow_find->merge_flag) {\n \t\tPMD_DRV_LOG(ERR, \"This flow is already exist.\");\n \t\tif (!nfp_check_mask_remove(priv, mask_data, mask_len,\n \t\t\t\t&nfp_flow_meta->flags)) {\n@@ -3774,7 +3824,7 @@ nfp_flow_setup(struct nfp_flower_representor *representor,\n \t\treturn nfp_ct_flow_setup(representor, items, actions,\n \t\t\t\tct_item, validate_flag, cookie);\n \n-\treturn nfp_flow_process(representor, items, actions, validate_flag, cookie, true);\n+\treturn nfp_flow_process(representor, items, actions, validate_flag, cookie, true, false);\n }\n \n int\n@@ -3877,7 +3927,7 @@ nfp_flow_create(struct rte_eth_dev *dev,\n \t}\n \n \t/* Add the flow to flow hash table */\n-\tret = nfp_flow_table_add(priv, nfp_flow);\n+\tret = nfp_flow_table_add_merge(priv, nfp_flow);\n \tif (ret != 0) {\n \t\trte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n \t\t\t\tNULL, \"Add flow to the flow table failed.\");\n@@ -3988,7 +4038,7 @@ nfp_flow_destroy(struct rte_eth_dev *dev,\n \t}\n \n \t/* Delete the flow from flow hash table */\n-\tret = nfp_flow_table_delete(priv, nfp_flow);\n+\tret = nfp_flow_table_delete_merge(priv, nfp_flow);\n \tif (ret != 0) {\n \t\trte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n \t\t\t\tNULL, \"Delete flow from the flow table failed.\");\n@@ -4047,10 +4097,12 @@ nfp_flow_stats_get(struct rte_eth_dev *dev,\n \t\tvoid *data)\n {\n \tbool reset;\n+\tuint64_t cookie;\n \tuint32_t ctx_id;\n \tstruct rte_flow *flow;\n \tstruct nfp_flow_priv *priv;\n \tstruct nfp_fl_stats *stats;\n+\tstruct nfp_ct_map_entry *me;\n \tstruct rte_flow_query_count *query;\n \n \tpriv = nfp_flow_dev_to_priv(dev);\n@@ -4064,8 +4116,15 @@ nfp_flow_stats_get(struct rte_eth_dev *dev,\n \treset = query->reset;\n \tmemset(query, 0, sizeof(*query));\n \n-\tctx_id = rte_be_to_cpu_32(nfp_flow->payload.meta->host_ctx_id);\n-\tstats = &priv->stats[ctx_id];\n+\t/* Find the flow in ct_map_table */\n+\tcookie = rte_be_to_cpu_64(nfp_flow->payload.meta->host_cookie);\n+\tme = nfp_ct_map_table_search(priv, (char *)&cookie, sizeof(uint64_t));\n+\tif (me != NULL) {\n+\t\tstats = nfp_ct_flow_stats_get(priv, me);\n+\t} else {\n+\t\tctx_id = rte_be_to_cpu_32(nfp_flow->payload.meta->host_ctx_id);\n+\t\tstats = &priv->stats[ctx_id];\n+\t}\n \n \trte_spinlock_lock(&priv->stats_lock);\n \tif (stats->pkts != 0 && stats->bytes != 0) {\ndiff --git a/drivers/net/nfp/nfp_flow.h b/drivers/net/nfp/nfp_flow.h\nindex df16cab8b5..ed06eca371 100644\n--- a/drivers/net/nfp/nfp_flow.h\n+++ b/drivers/net/nfp/nfp_flow.h\n@@ -165,7 +165,9 @@ struct rte_flow {\n \tuint32_t port_id;\n \tbool install_flag;\n \tbool tcp_flag;    /**< Used in the SET_TP_* action */\n+\tbool merge_flag;\n \tenum nfp_flow_type type;\n+\tuint16_t ref_cnt;\n };\n \n /* Forward declaration */\n@@ -181,8 +183,9 @@ struct rte_flow *nfp_flow_process(struct nfp_flower_representor *representor,\n \t\tconst struct rte_flow_action actions[],\n \t\tbool validate_flag,\n \t\tuint64_t cookie,\n-\t\tbool install_flag);\n-int nfp_flow_table_add(struct nfp_flow_priv *priv,\n+\t\tbool install_flag,\n+\t\tbool merge_flag);\n+int nfp_flow_table_add_merge(struct nfp_flow_priv *priv,\n \t\tstruct rte_flow *nfp_flow);\n int nfp_flow_teardown(struct nfp_flow_priv *priv,\n \t\tstruct rte_flow *nfp_flow,\n",
    "prefixes": [
        "v2",
        "4/4"
    ]
}