get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 132253,
    "url": "http://patchwork.dpdk.org/api/patches/132253/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230930100053.1227215-5-chaoyong.he@corigine.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20230930100053.1227215-5-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230930100053.1227215-5-chaoyong.he@corigine.com",
    "date": "2023-09-30T10:00:53",
    "name": "[4/4] net/nfp: add support for merged flows and conntrack stats",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "7ada379e64dfc918c4fe241a053d211c315b9a61",
    "submitter": {
        "id": 2554,
        "url": "http://patchwork.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20230930100053.1227215-5-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 29708,
            "url": "http://patchwork.dpdk.org/api/series/29708/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29708",
            "date": "2023-09-30T10:00:49",
            "name": "support offload of simple conntrack flow rules",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/29708/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/132253/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/132253/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 16CE042682;\n\tSat, 30 Sep 2023 12:02:18 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 28CD9402E6;\n\tSat, 30 Sep 2023 12:01:51 +0200 (CEST)",
            "from NAM02-DM3-obe.outbound.protection.outlook.com\n (mail-dm3nam02on2098.outbound.protection.outlook.com [40.107.95.98])\n by mails.dpdk.org (Postfix) with ESMTP id 7E960402D4\n for <dev@dpdk.org>; Sat, 30 Sep 2023 12:01:47 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by PH7PR13MB5429.namprd13.prod.outlook.com (2603:10b6:510:138::10)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6813.21; Sat, 30 Sep\n 2023 10:01:45 +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; Sat, 30 Sep 2023\n 10:01:45 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=R6ZrjQt07vJoti/YRFz/zU6vz30VHqd44n+uwmeVdd/cpBaigjpcne3dESwVtDj9/TKWfxOhFrBfZrDUiW2OY6DA4Br1t8SFT0DFFLfLtql+pXWt7cuyClwLfVuJ2Oz5OrdHj967g/s5aOTrQ57qWoJEfRjyMajMJU/97hLaWPV3Bo/HaHuEhAhwULnYpgKCRR7e5zky01gL2lk0IHSTtP0l2NqTtLD6ieNzrJF6E2neBHQjg1MlbI5eQmIIfzSXYaGWTkqulJKK4C4N2G4tDEQ1RooD/E8vOT6AioirWmjdc7wioXM2sfLSAOpk5KoA5G5jZmmFzOCdnxCoD5Ahzg==",
        "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=frXfWlVZkhGDsd4v6Wl0/94gs1hhmI8UqdmQEuGMtlk=;\n b=cgu8utM/3L1uU2O3garWLnWYOwsib0DNWHowgEbf3VsvQ4kAdzWEsb5duJnaZxDC/EtdvZkFJ9gDhN/BsoTyDYy9lM7v+LFlSEWHZkPSNrke83pquWJI3ozjhilGCH2p6euKsH4ymgnZh35PI/2xsIgkYNaLJc/nBnQUNlHeb0o+FtzT0Dg/dQ5B+qfPF0m9cZEx95EgVJ2YG8Oax84paKmRqJvHZDzTxmUIAyjAq/t534lJwvEjU7RH0D+/eV3JNcdsoU1VIOXzqbqjS9k2bIngBkCnN0Vv6ocg7TzMFUVxsjRYsy7JrYCxovoMW8RDdyFt8qOtyrfCIv1kkopMKw==",
        "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=frXfWlVZkhGDsd4v6Wl0/94gs1hhmI8UqdmQEuGMtlk=;\n b=GdCy2TARIauCgbQhHnnhlBgiyFV69XoJPPBDmB1d7rSb0nj7pEeyp9EmrvcwynFH5RMzYzPHuBjVlNQ0iUnQqGWpnm3r2KRjXV6KtiB8fa5a4JsorlMX8TQFuiJfsc4T2u1CaPIdRymv24UJYzLNwjk0gK6B65jB137KWtuuOvE=",
        "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 4/4] net/nfp: add support for merged flows and conntrack stats",
        "Date": "Sat, 30 Sep 2023 18:00:53 +0800",
        "Message-Id": "<20230930100053.1227215-5-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20230930100053.1227215-1-chaoyong.he@corigine.com>",
        "References": "<20230930100053.1227215-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "PH8PR22CA0022.namprd22.prod.outlook.com\n (2603:10b6:510:2d1::17) 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_|PH7PR13MB5429:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "7891d467-8a02-4484-2b6d-08dbc19c4124",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n Tcuoh107SlV7G4Tl7SaK10qPWlTF8l+EJDGpelrX21vVNpsCvuzydytaJqnnGDFqepLcHM7RyCmhTpGe33ROn410MbtONSRg1iyM+XeyTziHb25cSrISIiBkgaCuDkSyhFfmXgFRsOBAgp/KSmFxY9CF3stGaRcF/OHK7qkoKnlHBUWS5zI9Ar+VyGGXnpstOwLf54OvURuAZ3SoO1p/92HA18j5paSIom5JUiGnu5lRSGgaXwEZ+gg8sgWZOs/cvrlbank+8amAhlAJabbPjPiTCersOC2ol1Z9oIxdmXXYJB1NFnTUaqODxdxNlwfewsnC9PAgJNlVx6kVNZRXlAqv953wxurIJFEQ8RVcZ408pgjer9my1CdLyy+Xz3Og1OmUwQsD4/wfOgum5N/+4GxTfoH+eHXrO3ej01kVJU1YJar8kWR8O8Sjram4PKAJU72Aci7DD7HoolHJtpFDkacbtdolYymAHPp7ozIrXuAgFUbR8sVtQUkQECI3sEl2E0HjwYI4zjbYUkQRCGrppkS1uneSRl6CNyO8+4vuumb9Ax2sYw3i9YsWxYUGCmLI0JH/s5cF4t6vJnBQ+PM9OSqH1zuHy7eZ6jB6rBQiqZIruYL5+rPNIZqgBUzCypaRAkqItaNSbkO+kAI4jezPQddV2tyfjkscchR8A+IQwh4=",
        "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)(366004)(346002)(136003)(39830400003)(396003)(376002)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66946007)(6916009)(8676002)(44832011)(316002)(4326008)(66476007)(66556008)(38100700002)(38350700002)(86362001)(6486002)(478600001)(30864003)(41300700001)(2906002)(5660300002)(8936002)(6512007)(2616005)(52116002)(107886003)(1076003)(26005)(36756003)(6666004)(83380400001)(6506007);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n ywZR8ejwKbwZ8zb7gs77uVrX+8O/yhyXuLeA2D6nHS6OjBSjBoN0wf7Y4YrGijt/S2gX9XR+4oUGLErtI13ahJ6q13GsX8dM7m8Hfs9aMSXVvTjP8d488/tJRpyWmzNNiRQ6Hq1DtsxdV9YdguNhQjSyHhtG2BptIzFTgJQU7joGyexh2F9y66RhgtO4g8QVpQLA8TBroqmWRElJ1SwAyyGN23ndeRsn8OzYfndnjN7tgonVPdPDMTWVGnM1G3krBgzJWpXUc3GhvFhu9v2jibLYZ98QGMw5YCL7CrId1hWmfUJ1lujR2RzhgF7KCfoKVZgc5D9xmNEmkLUrV7F9xUCzvcV87RyADvTOWK9emOOCSbrR+dIu2YWlAu7PFKjsi1lelj5qp7p5bUhmaJzmW2QKUeoIyp+p0pOPuY7gWpC9P6781e14n9WUb1w4SNw80gXhWA56Gu3xxi9Ld8vZanG0EUtMVV8hjI2yM7ocah2I1QDAFiyGdT02JW0+TRqu83MFczj2FY3/ErpwbGkYxvIc5Raq4LvAgHTlSG7LcgV/qmm1F6OXKUAV5aaw1kJJQK3gJ6PXZ+vF1BRnaNSbNXPMNSLM2avGOSXMYR7HtziBamzNH9QGtTtkSp05sIFdQ2QEYVuya890HsFUromAjXw5o99HSHUmsV3vonq5EAL+QhwF0PVdKLT0V9bF9pNfIemg8LMAoTS6PNe433oZ+IhqTc1ExSxRE+FLdhinLjm0WXBLIIcipKjB85WnmnVnZAIkf/u1zuq7K9D0surBombnCfOOGiCgYO30GKvhvEqvwn2HG8ZZQcfKD3URl/qbEfPj/HzaOSvDSyuZzSh13HBENVgvKVDnYE8NwZZ//eN8fXzXppAnKQvn7ddJWjXbOA3nINhFDcgzW2uXFHMSZt/W4ski8noALQ7FInNiSDsdlqq9HartzdXiEFamwLEeOy6A9HEPZkQ62nKo0PJYvgbASEStw5X1ZR/Puvs8O2kq/GC6J29cpbmNTRAw6vWLWzN8Hpo9MzHA9JfHXy2x7YLNS9Wzm31MJexiDL8OXunkVV38/9yMsEa4zyhyqOhAkO4/Ama7MPhS8gJ0+vu55/wKSObfkeAxSnhAcQuwEoyerYdhFV+TQ2GoVh3PW0t0ET23GLR2sNBIxhiPCxetO5FaOAFikk8kfUmqVrKZyhKrpRl963Mg0sSW+cx3oU40gZxu7U9/mmcaHkeJUjhGOkaCCwqEFebKYe/Ry8rXY4PrDRhkypHJVjoSwIGVgwPbB2svqxhEsVsQXFH1Yp1gtqP5tv2vPQ6p1MimUMwd9mPId6rKJvDAF1ZCJ1FofhNG3USPhZXMVnbuVCHBIFbuAENBFtAGMBHFNBKtzYn5GkruZrkcwwT0DVPP3El6mZf+WcTrxVnxZPxVp/AGqsVAtPA3IvnH+UlRYFNhARWTv65TCVnkBvM41YJosECsoSy5Zriwhic7t1YkQ9oLrcMjYxRFBEVG2QbLcQQuYFX8gUnTbhJtE4gEd9UNQs1Leuwtkr3WHrsKmQWSDWlKqW/aFbyfcZ174MwCCFAi08CT8mqPdfYdYeuxsi7kxfvihQyVUGPLlJFlN3iQk+LaxOQ+cQ==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 7891d467-8a02-4484-2b6d-08dbc19c4124",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "30 Sep 2023 10:01:45.8055 (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 csz0/xqHWDsTuche9xuReT61FFKuzU+gVAqFuG5of12SWiaQvHiHHKrWzdNdQiRvuhyvZXhPR4jdyIglGDbHK4mfV3u0trA/ftHyVhLOtH0=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "PH7PR13MB5429",
        "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 ct 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 d81e2970fb..3df2411ce4 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@@ -999,12 +1001,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@@ -1014,7 +1018,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@@ -1702,14 +1706,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@@ -1720,7 +1724,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@@ -1730,3 +1734,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": [
        "4/4"
    ]
}