get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 137955,
    "url": "http://patches.dpdk.org/api/patches/137955/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240305022923.891544-2-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": "<20240305022923.891544-2-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240305022923.891544-2-chaoyong.he@corigine.com",
    "date": "2024-03-05T02:29:19",
    "name": "[1/5] net/nfp: create new meta data module",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "ead5cb6b23408985cbd1b158d5d790e334b6c28a",
    "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/20240305022923.891544-2-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 31367,
            "url": "http://patches.dpdk.org/api/series/31367/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31367",
            "date": "2024-03-05T02:29:18",
            "name": "add new meta data module",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/31367/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/137955/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/137955/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 0F0A243B80;\n\tTue,  5 Mar 2024 03:29:53 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 13871402F1;\n\tTue,  5 Mar 2024 03:29:49 +0100 (CET)",
            "from NAM10-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam10on2097.outbound.protection.outlook.com [40.107.94.97])\n by mails.dpdk.org (Postfix) with ESMTP id 597154026B\n for <dev@dpdk.org>; Tue,  5 Mar 2024 03:29:46 +0100 (CET)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by PH0PR13MB5780.namprd13.prod.outlook.com (2603:10b6:510:11b::5)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7339.37; Tue, 5 Mar\n 2024 02:29:44 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e%5]) with mapi id 15.20.7339.035; Tue, 5 Mar 2024\n 02:29:44 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=S/W9MIQtKNHDBUAa6TzIqojPEd98rYjHhoJ1cRddPxIFF+6u5N8Q4oLjkGv5e97yGl2cMJZKz+3nCGL/Zxe67nVYjQj3Xs4Etl/Wr8VfMg5WrnlUZoChIPH+OFUS2vZkmETrHkyS8MgrEfKkwM7+8QtOHtp0wFKS2NxT9DentgtxmeyX4mkz6j6KJ8wHfq2aT5zaI8/rn6mXnnmoGxmpjrA5mV5bp1doC0oeRJrzBA8lJVnD2WhF5WOCYZYDHbzlfpP9jeMl3KoYACv/auzSpvDALBOnMDNxlVRdx7qhfqnqWpHiVXgQ5uqjUBiX+R6Li80M9ejvojR7ALAwVlknxg==",
        "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=9b9rN1X4cn+sbPozpcu46Mn7rpAyWGjaR3i+cq32sJs=;\n b=BCzrf8CELfi9jxlwekLuX8WN25k3mQ56+QIOyEQfT+vGndrAmhyatMe8SKb6T4/71Q/ZMdhBo1Awb4/5l5CXxWUREwTICf6fm398iQNHltRSjiyXZZ1wc4VCExUosAblzZI1a2EkLpB4SyvRdp+qRKciS1NpbVsxCQ+i6V+eSYd6vZNl3w3pb0UB1mYNPNDUtCv+0nJN7ySF8tK6UVxiCk7Ue7GHix9fR1742PDPkZArYcsAvbG4mdQhCzZpWbsZIbkvF/nyZCzuQxtvwcLCtyXQOAfX8FQdCdBmKkbXXrow4UkeWmON0wnzGthSof9DrjQbdcWNYz+KmPPZkzU30w==",
        "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=9b9rN1X4cn+sbPozpcu46Mn7rpAyWGjaR3i+cq32sJs=;\n b=mP3e481pO1Z8BsyEWjmFfgl/D4ENaAZ65Znw+dXN3i3ELrfZA39ugDb4/Odf6wIK81kx7S1EgBhNZzGrU/O4F30YRBTith06o29y7nt8R9Y0+bxGGHehVLwN8AgU0BW+3uILPOhn/IVwrl8jyu0+ctrOfYshitdpVZ/YxJRVBAo=",
        "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, Long Wu <long.wu@corigine.com>,\n Chaoyong He <chaoyong.he@corigine.com>",
        "Subject": "[PATCH 1/5] net/nfp: create new meta data module",
        "Date": "Tue,  5 Mar 2024 10:29:19 +0800",
        "Message-Id": "<20240305022923.891544-2-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20240305022923.891544-1-chaoyong.he@corigine.com>",
        "References": "<20240305022923.891544-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BY5PR04CA0028.namprd04.prod.outlook.com\n (2603:10b6:a03:1d0::38) 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_|PH0PR13MB5780:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "a4691bb0-a31f-4b50-ffc5-08dc3cbc1e37",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n wH/dxnJk6Ol9AF6Q56nlKUmZb4EgFwFeUXEOF+f+8stgqvOpWTny47Z7ZYoFN5MZsDYJUNYvmswnvC6gbDN0bMzqQ/De6B0TRQAE/p7DBhdsL0765QwSAxv+RZ86MYClTadF4j7VFA9kt5ZbjJOWPf1rbyhSx8a381PxXVW6+fvEt+65F9wBrm6bwyP4Nvb7ykGxuYmeF7LpFkQl4HBx1IN/L+wz4OjDXrfwJNOk/Bu9KoEOAJ3IxbBxWibTOGRQc2oQEXgZ4Q0D2UKn5dQYnSIZd++N8cmVrrum5sBWwx2WDN7Kj8EqDBBFBPkYEGdlQXRex0le9MWNXpqZ2+uRQkAJlkDoqd8R36xE7MdrQciJNG3M1shrtAL4vdJllAMmWRztRAf4IFJwr14s1VZlVPgDEWuiUr/z9J56umKdeNiMGj7kPdw4C1qNFzIlp1SpOMrJpw0ynllgeVI6N9Q8u86fWeOu+55eZIBctJqwXKOpMFcHQltNwsnMSWmC8ENJqtqjcKoWaEGFIhByJxFJlUvLfrJYDykd9EEDbhV1ccTiTgacv4/H9vQ6WYNZt+DVs15igor9gQ4+wdza+KSVsg70EUyrdPeKH02+7ktXZNcnqIaLnhjssR/cBTqm5N2v/5gkrtXUvSDPI55l7BWqTcyLE++SaeAUry30jaS+2GY9/7GrTsqEf39trmVPru+16odgvRSKuc4LJTvJMbFZmJnGUEtKSJvR0Fs2M0q0aGE=",
        "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)(376005)(38350700005); DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n 0b0aR4zsx2/E+cJmY0sxTxqmQnIMlNq+3LL6RVGM3esXXSims5Fq/HfM41LF0niTs+Y/+KzPYiFk7hLDO9TEF0TWTL2KoaxDBrtxLHxueBPdkvgGMpIYAGE0p3gWm2FwKA+PhPlrFChtTC8w9sMcby3wKvrVUmjbvc9X6sBM/IX+n9JfOZR225kSkbLEF7NuBSLqZUYLHhYo6BsMo8tkQCFpIVgtaJYtXYo1pPEFU6sJ69opzQF+kl+oNWN48TJcFedbXpWh0UhxIc95UzNnaB9ureyzK+P8euDtOOLqZxjNOC0P70oQhBzQcJ6OGOc/4KS8h8yMarjDN0AUENYBMOpJ37xm56b//3nZo9H8I1udTSLQESDbKI21qCPY+uhqAhsI5d3WT4/J165sm26kOkZRInmgASiuW/6XsYyiAiFF0GxV7GX0s0JVWRkHI3nQ3C4C+ODGg86R07Q1kIXizwcUELWlWXPF1Qb3sGyHK4QPK8B4abizTwkPIiMlWf1uB+T0zZ2edeafEtxWCvqto6PxDX0bTLFpLK++/LIio5drZIvSOn0NEwzcztS9T3KkteLxccg7cK1DkY5Xt2iHA8P33mR50UXRj8+rZuc01lY6RIH7JX2naASdHVPFIbJ/NQQAVaMyWxFgRWUvM9lrZCH0TLOuAhjv3lrVJl2GjS6hnJVRyS207jNnATQiM5nDw7ffeFC4Rani9lxMshRCIm89BpQJF76p/+AAyinZMXBBjmcpHFMURa45upCgnbBh86u4aZ4Gl/FQ6IP6NCLxi/Sa21K53g+8feHV34kGdykBvRWGwDP9Rwh4IIUyK5uYm+V+6UQUyNr4ojdDuC/4IdPz2GpU0TwZKil+OxUxdJ+j4knNOxwlTpaZEuwbY5nqmKCn2nXMZ28AkA7+orKApHr//V1tPGQctloW7roId/csrH6yRV9JTFxJqDuEs+f/8g/XNzGvo8DFGQFHKOos8vGpyMi4y0uhQpO1X9mgayIItpqTUaH5OMBqKXSqd30hM2uxhO0lC/GTwJNnYLPP2lDfnStqh54Xa1rjBO/gIZiBAE1JMtfFalOKPQc+da7Z8NGvFdOnMYDpnT6LGL18S5k2KBWIIcPREKsvPWaSVuJpgTFtkZWf6wIvvgxWlVGI1DPcNmsq7FeJPRbx6upf5kpl71nQ6/ws9OuKlA2gkEhJpnbhTuKyzUkOSDHwQW9VbxERUCmwA4BszZr5nkDbMw5qzPR9EVKEGRj097h3AMecqqBGUoui5eDjTxsv4PUuxOV405bM60lxaUEhBtTErsU6TA/ySVEKTUapN6IVjJzeBv85dPec3ryVtphvDlqT6lVoE/PE3rlLP/psqO/2nZCXzYnwoQY3VLp8N8ktVOIxfQtBArC7YfJm9Eyf48aL6sBJGUpbFWr5CCkj/exd3CK4ggMhaH3/dWXnrRyq7XF9au5HHhtBniaH7wEsAh6ZrsbE+sezgkKSOtSXHHuRjYxt2ySaeGcU9XMkv67p7cVnPxL+iUsBj63AaSzeeRr453pp5zhl9WlE/FqIM7c/vQQBTkGEdBsk7k3Xlq6ELEL1JoNlYW8alhSSLQCmHJPgBxdIxs7Br6zpnL57lkKLSQ==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n a4691bb0-a31f-4b50-ffc5-08dc3cbc1e37",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "05 Mar 2024 02:29:44.4821 (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 asGEwNIBIcT0iRK8a+5YhvKZzFwpu2PNNSh5n893LGR0EA7wyXgApxEanCw5cVaxAg/VaEyM6ZuqAymDUdb0kjlCHJA5ie5O7TbQZOVOCpI=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "PH0PR13MB5780",
        "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": "From: Long Wu <long.wu@corigine.com>\n\nMove the Rx meta data code to new 'nfp_net_meta' module, which\nmakes related logic more clean and the code architecture more\nreasonable.\nThere is no functional change, just moving verbatim code around.\n\nSigned-off-by: Long Wu <long.wu@corigine.com>\nReviewed-by: Chaoyong He <chaoyong.he@corigine.com>\n---\n drivers/common/nfp/nfp_common_ctrl.h     |  41 ---\n drivers/net/nfp/flower/nfp_flower.c      |   1 +\n drivers/net/nfp/flower/nfp_flower_cmsg.c |   1 +\n drivers/net/nfp/flower/nfp_flower_ctrl.c |   1 +\n drivers/net/nfp/meson.build              |   1 +\n drivers/net/nfp/nfd3/nfp_nfd3_dp.c       |   1 +\n drivers/net/nfp/nfdk/nfp_nfdk_dp.c       |   1 +\n drivers/net/nfp/nfp_ipsec.c              |   1 +\n drivers/net/nfp/nfp_ipsec.h              |   6 -\n drivers/net/nfp/nfp_net_common.c         |  24 +-\n drivers/net/nfp/nfp_net_common.h         |   7 +-\n drivers/net/nfp/nfp_net_meta.c           | 320 +++++++++++++++++++++++\n drivers/net/nfp/nfp_net_meta.h           | 108 ++++++++\n drivers/net/nfp/nfp_rxtx.c               | 305 +--------------------\n drivers/net/nfp/nfp_rxtx.h               |  20 --\n 15 files changed, 438 insertions(+), 400 deletions(-)\n create mode 100644 drivers/net/nfp/nfp_net_meta.c\n create mode 100644 drivers/net/nfp/nfp_net_meta.h",
    "diff": "diff --git a/drivers/common/nfp/nfp_common_ctrl.h b/drivers/common/nfp/nfp_common_ctrl.h\nindex 7749ba6459..6badf769fc 100644\n--- a/drivers/common/nfp/nfp_common_ctrl.h\n+++ b/drivers/common/nfp/nfp_common_ctrl.h\n@@ -13,47 +13,6 @@\n  */\n #define NFP_NET_CFG_BAR_SZ              (32 * 1024)\n \n-/* Offset in Freelist buffer where packet starts on RX */\n-#define NFP_NET_RX_OFFSET               32\n-\n-/* Working with metadata api (NFD version > 3.0) */\n-#define NFP_NET_META_FIELD_SIZE         4\n-#define NFP_NET_META_FIELD_MASK ((1 << NFP_NET_META_FIELD_SIZE) - 1)\n-#define NFP_NET_META_HEADER_SIZE        4\n-#define NFP_NET_META_NFDK_LENGTH        8\n-\n-/* Working with metadata vlan api (NFD version >= 2.0) */\n-#define NFP_NET_META_VLAN_INFO          16\n-#define NFP_NET_META_VLAN_OFFLOAD       31\n-#define NFP_NET_META_VLAN_TPID          3\n-#define NFP_NET_META_VLAN_MASK          ((1 << NFP_NET_META_VLAN_INFO) - 1)\n-#define NFP_NET_META_VLAN_TPID_MASK     ((1 << NFP_NET_META_VLAN_TPID) - 1)\n-#define NFP_NET_META_TPID(d)            (((d) >> NFP_NET_META_VLAN_INFO) & \\\n-\t\t\t\t\t\tNFP_NET_META_VLAN_TPID_MASK)\n-\n-/* Prepend field types */\n-#define NFP_NET_META_HASH               1 /* Next field carries hash type */\n-#define NFP_NET_META_MARK               2\n-#define NFP_NET_META_VLAN               4\n-#define NFP_NET_META_PORTID             5\n-#define NFP_NET_META_IPSEC              9\n-\n-#define NFP_META_PORT_ID_CTRL           ~0U\n-\n-/* Hash type prepended when a RSS hash was computed */\n-#define NFP_NET_RSS_NONE                0\n-#define NFP_NET_RSS_IPV4                1\n-#define NFP_NET_RSS_IPV6                2\n-#define NFP_NET_RSS_IPV6_EX             3\n-#define NFP_NET_RSS_IPV4_TCP            4\n-#define NFP_NET_RSS_IPV6_TCP            5\n-#define NFP_NET_RSS_IPV6_EX_TCP         6\n-#define NFP_NET_RSS_IPV4_UDP            7\n-#define NFP_NET_RSS_IPV6_UDP            8\n-#define NFP_NET_RSS_IPV6_EX_UDP         9\n-#define NFP_NET_RSS_IPV4_SCTP           10\n-#define NFP_NET_RSS_IPV6_SCTP           11\n-\n /*\n  * @NFP_NET_TXR_MAX:         Maximum number of TX rings\n  * @NFP_NET_TXR_MASK:        Mask for TX rings\ndiff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex c6a744e868..97219ff379 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -16,6 +16,7 @@\n #include \"../nfp_cpp_bridge.h\"\n #include \"../nfp_logs.h\"\n #include \"../nfp_mtr.h\"\n+#include \"../nfp_net_meta.h\"\n #include \"nfp_flower_ctrl.h\"\n #include \"nfp_flower_representor.h\"\n #include \"nfp_flower_service.h\"\ndiff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.c b/drivers/net/nfp/flower/nfp_flower_cmsg.c\nindex 8effe9474d..f78bfba332 100644\n--- a/drivers/net/nfp/flower/nfp_flower_cmsg.c\n+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.c\n@@ -7,6 +7,7 @@\n \n #include \"../nfpcore/nfp_nsp.h\"\n #include \"../nfp_logs.h\"\n+#include \"../nfp_net_meta.h\"\n #include \"nfp_flower_ctrl.h\"\n #include \"nfp_flower_representor.h\"\n \ndiff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.c b/drivers/net/nfp/flower/nfp_flower_ctrl.c\nindex bcb325d475..720a0d9495 100644\n--- a/drivers/net/nfp/flower/nfp_flower_ctrl.c\n+++ b/drivers/net/nfp/flower/nfp_flower_ctrl.c\n@@ -10,6 +10,7 @@\n #include \"../nfd3/nfp_nfd3.h\"\n #include \"../nfdk/nfp_nfdk.h\"\n #include \"../nfp_logs.h\"\n+#include \"../nfp_net_meta.h\"\n #include \"nfp_flower_representor.h\"\n #include \"nfp_mtr.h\"\n #include \"nfp_flower_service.h\"\ndiff --git a/drivers/net/nfp/meson.build b/drivers/net/nfp/meson.build\nindex 959ca01844..d805644ec5 100644\n--- a/drivers/net/nfp/meson.build\n+++ b/drivers/net/nfp/meson.build\n@@ -41,6 +41,7 @@ sources = files(\n         'nfp_net_common.c',\n         'nfp_net_ctrl.c',\n         'nfp_net_flow.c',\n+        'nfp_net_meta.c',\n         'nfp_rxtx.c',\n         'nfp_service.c',\n )\ndiff --git a/drivers/net/nfp/nfd3/nfp_nfd3_dp.c b/drivers/net/nfp/nfd3/nfp_nfd3_dp.c\nindex be31f4ac33..5fb76ae9d7 100644\n--- a/drivers/net/nfp/nfd3/nfp_nfd3_dp.c\n+++ b/drivers/net/nfp/nfd3/nfp_nfd3_dp.c\n@@ -10,6 +10,7 @@\n \n #include \"../flower/nfp_flower.h\"\n #include \"../nfp_logs.h\"\n+#include \"../nfp_net_meta.h\"\n \n /* Flags in the host TX descriptor */\n #define NFD3_DESC_TX_CSUM               RTE_BIT32(7)\ndiff --git a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c\nindex daf5ac5b30..8bdab5d463 100644\n--- a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c\n+++ b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c\n@@ -11,6 +11,7 @@\n \n #include \"../flower/nfp_flower.h\"\n #include \"../nfp_logs.h\"\n+#include \"../nfp_net_meta.h\"\n \n #define NFDK_TX_DESC_GATHER_MAX         17\n \ndiff --git a/drivers/net/nfp/nfp_ipsec.c b/drivers/net/nfp/nfp_ipsec.c\nindex 0b815fa983..0bf146b9be 100644\n--- a/drivers/net/nfp/nfp_ipsec.c\n+++ b/drivers/net/nfp/nfp_ipsec.c\n@@ -18,6 +18,7 @@\n #include \"nfp_net_common.h\"\n #include \"nfp_net_ctrl.h\"\n #include \"nfp_rxtx.h\"\n+#include \"nfp_net_meta.h\"\n \n #define NFP_UDP_ESP_PORT            4500\n \ndiff --git a/drivers/net/nfp/nfp_ipsec.h b/drivers/net/nfp/nfp_ipsec.h\nindex d7a729398a..4ef0e196be 100644\n--- a/drivers/net/nfp/nfp_ipsec.h\n+++ b/drivers/net/nfp/nfp_ipsec.h\n@@ -168,12 +168,6 @@ struct nfp_net_ipsec_data {\n \tstruct nfp_ipsec_session *sa_entries[NFP_NET_IPSEC_MAX_SA_CNT];\n };\n \n-enum nfp_ipsec_meta_layer {\n-\tNFP_IPSEC_META_SAIDX,       /**< Order of SA index in metadata */\n-\tNFP_IPSEC_META_SEQLOW,      /**< Order of Sequence Number (low 32bits) in metadata */\n-\tNFP_IPSEC_META_SEQHI,       /**< Order of Sequence Number (high 32bits) in metadata */\n-};\n-\n int nfp_ipsec_init(struct rte_eth_dev *dev);\n void nfp_ipsec_uninit(struct rte_eth_dev *dev);\n \ndiff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c\nindex 20e628bfd1..384e042dfd 100644\n--- a/drivers/net/nfp/nfp_net_common.c\n+++ b/drivers/net/nfp/nfp_net_common.c\n@@ -15,6 +15,7 @@\n #include \"nfpcore/nfp_mip.h\"\n #include \"nfpcore/nfp_nsp.h\"\n #include \"nfp_logs.h\"\n+#include \"nfp_net_meta.h\"\n \n #define NFP_TX_MAX_SEG       UINT8_MAX\n #define NFP_TX_MAX_MTU_SEG   8\n@@ -2038,29 +2039,6 @@ nfp_net_check_dma_mask(struct nfp_net_hw *hw,\n \treturn 0;\n }\n \n-void\n-nfp_net_init_metadata_format(struct nfp_net_hw *hw)\n-{\n-\t/*\n-\t * ABI 4.x and ctrl vNIC always use chained metadata, in other cases we allow use of\n-\t * single metadata if only RSS(v1) is supported by hw capability, and RSS(v2)\n-\t * also indicate that we are using chained metadata.\n-\t */\n-\tif (hw->ver.major == 4) {\n-\t\thw->meta_format = NFP_NET_METAFORMAT_CHAINED;\n-\t} else if ((hw->super.cap & NFP_NET_CFG_CTRL_CHAIN_META) != 0) {\n-\t\thw->meta_format = NFP_NET_METAFORMAT_CHAINED;\n-\t\t/*\n-\t\t * RSS is incompatible with chained metadata. hw->super.cap just represents\n-\t\t * firmware's ability rather than the firmware's configuration. We decide\n-\t\t * to reduce the confusion to allow us can use hw->super.cap to identify RSS later.\n-\t\t */\n-\t\thw->super.cap &= ~NFP_NET_CFG_CTRL_RSS;\n-\t} else {\n-\t\thw->meta_format = NFP_NET_METAFORMAT_SINGLE;\n-\t}\n-}\n-\n void\n nfp_net_cfg_read_version(struct nfp_net_hw *hw)\n {\ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex 628c0d3491..49a5a84044 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -16,6 +16,7 @@\n #include \"nfpcore/nfp_sync.h\"\n #include \"nfp_net_ctrl.h\"\n #include \"nfp_service.h\"\n+#include \"nfp_net_meta.h\"\n \n /* Interrupt definitions */\n #define NFP_NET_IRQ_LSC_IDX             0\n@@ -67,11 +68,6 @@ enum nfp_app_fw_id {\n \tNFP_APP_FW_FLOWER_NIC             = 0x3,\n };\n \n-enum nfp_net_meta_format {\n-\tNFP_NET_METAFORMAT_SINGLE,\n-\tNFP_NET_METAFORMAT_CHAINED,\n-};\n-\n /* Parsed control BAR TLV capabilities */\n struct nfp_net_tlv_caps {\n \tuint32_t mbox_off;               /**< VNIC mailbox area offset */\n@@ -306,7 +302,6 @@ void nfp_net_tx_desc_limits(struct nfp_net_hw *hw,\n \t\tuint16_t *min_tx_desc,\n \t\tuint16_t *max_tx_desc);\n int nfp_net_check_dma_mask(struct nfp_net_hw *hw, char *name);\n-void nfp_net_init_metadata_format(struct nfp_net_hw *hw);\n void nfp_net_cfg_read_version(struct nfp_net_hw *hw);\n int nfp_net_firmware_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size);\n bool nfp_net_is_valid_nfd_version(struct nfp_net_fw_ver version);\ndiff --git a/drivers/net/nfp/nfp_net_meta.c b/drivers/net/nfp/nfp_net_meta.c\nnew file mode 100644\nindex 0000000000..0bc22b2f88\n--- /dev/null\n+++ b/drivers/net/nfp/nfp_net_meta.c\n@@ -0,0 +1,320 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2023 Corigine, Inc.\n+ * All rights reserved.\n+ */\n+\n+#include \"nfp_net_meta.h\"\n+\n+#include \"nfp_net_common.h\"\n+#include \"nfp_ipsec.h\"\n+#include \"nfp_logs.h\"\n+\n+enum nfp_ipsec_meta_layer {\n+\tNFP_IPSEC_META_SAIDX,       /**< Order of SA index in metadata */\n+\tNFP_IPSEC_META_SEQLOW,      /**< Order of Sequence Number (low 32bits) in metadata */\n+\tNFP_IPSEC_META_SEQHI,       /**< Order of Sequence Number (high 32bits) in metadata */\n+};\n+\n+/* Parse the chained metadata from packet */\n+static bool\n+nfp_net_parse_chained_meta(uint8_t *meta_base,\n+\t\trte_be32_t meta_header,\n+\t\tstruct nfp_meta_parsed *meta)\n+{\n+\tuint32_t meta_info;\n+\tuint32_t vlan_info;\n+\tuint8_t *meta_offset;\n+\n+\tmeta_info = rte_be_to_cpu_32(meta_header);\n+\tmeta_offset = meta_base + 4;\n+\n+\tfor (; meta_info != 0; meta_info >>= NFP_NET_META_FIELD_SIZE, meta_offset += 4) {\n+\t\tswitch (meta_info & NFP_NET_META_FIELD_MASK) {\n+\t\tcase NFP_NET_META_PORTID:\n+\t\t\tmeta->port_id = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n+\t\t\tbreak;\n+\t\tcase NFP_NET_META_HASH:\n+\t\t\t/* Next field type is about the hash type */\n+\t\t\tmeta_info >>= NFP_NET_META_FIELD_SIZE;\n+\t\t\t/* Hash value is in the data field */\n+\t\t\tmeta->hash = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n+\t\t\tmeta->hash_type = meta_info & NFP_NET_META_FIELD_MASK;\n+\t\t\tbreak;\n+\t\tcase NFP_NET_META_VLAN:\n+\t\t\tvlan_info = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n+\t\t\tmeta->vlan[meta->vlan_layer].offload =\n+\t\t\t\t\tvlan_info >> NFP_NET_META_VLAN_OFFLOAD;\n+\t\t\tmeta->vlan[meta->vlan_layer].tci =\n+\t\t\t\t\tvlan_info & NFP_NET_META_VLAN_MASK;\n+\t\t\tmeta->vlan[meta->vlan_layer].tpid = NFP_NET_META_TPID(vlan_info);\n+\t\t\tmeta->vlan_layer++;\n+\t\t\tbreak;\n+\t\tcase NFP_NET_META_IPSEC:\n+\t\t\tmeta->sa_idx = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n+\t\t\tmeta->ipsec_type = meta_info & NFP_NET_META_FIELD_MASK;\n+\t\t\tbreak;\n+\t\tcase NFP_NET_META_MARK:\n+\t\t\tmeta->flags |= (1 << NFP_NET_META_MARK);\n+\t\t\tmeta->mark_id = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\t/* Unsupported metadata can be a performance issue */\n+\t\t\treturn false;\n+\t\t}\n+\t}\n+\n+\treturn true;\n+}\n+\n+/*\n+ * Parse the single metadata\n+ *\n+ * The RSS hash and hash-type are prepended to the packet data.\n+ * Get it from metadata area.\n+ */\n+static inline void\n+nfp_net_parse_single_meta(uint8_t *meta_base,\n+\t\trte_be32_t meta_header,\n+\t\tstruct nfp_meta_parsed *meta)\n+{\n+\tmeta->hash_type = rte_be_to_cpu_32(meta_header);\n+\tmeta->hash = rte_be_to_cpu_32(*(rte_be32_t *)(meta_base + 4));\n+}\n+\n+/* Set mbuf hash data based on the metadata info */\n+static void\n+nfp_net_parse_meta_hash(const struct nfp_meta_parsed *meta,\n+\t\tstruct nfp_net_rxq *rxq,\n+\t\tstruct rte_mbuf *mbuf)\n+{\n+\tstruct nfp_net_hw *hw = rxq->hw;\n+\n+\tif ((hw->super.ctrl & NFP_NET_CFG_CTRL_RSS_ANY) == 0)\n+\t\treturn;\n+\n+\tmbuf->hash.rss = meta->hash;\n+\tmbuf->ol_flags |= RTE_MBUF_F_RX_RSS_HASH;\n+}\n+\n+/* Set mbuf vlan_strip data based on metadata info */\n+static void\n+nfp_net_parse_meta_vlan(const struct nfp_meta_parsed *meta,\n+\t\tstruct nfp_net_rx_desc *rxd,\n+\t\tstruct nfp_net_rxq *rxq,\n+\t\tstruct rte_mbuf *mb)\n+{\n+\tuint32_t ctrl = rxq->hw->super.ctrl;\n+\n+\t/* Skip if hardware don't support setting vlan. */\n+\tif ((ctrl & (NFP_NET_CFG_CTRL_RXVLAN | NFP_NET_CFG_CTRL_RXVLAN_V2)) == 0)\n+\t\treturn;\n+\n+\t/*\n+\t * The firmware support two ways to send the VLAN info (with priority) :\n+\t * 1. Using the metadata when NFP_NET_CFG_CTRL_RXVLAN_V2 is set,\n+\t * 2. Using the descriptor when NFP_NET_CFG_CTRL_RXVLAN is set.\n+\t */\n+\tif ((ctrl & NFP_NET_CFG_CTRL_RXVLAN_V2) != 0) {\n+\t\tif (meta->vlan_layer > 0 && meta->vlan[0].offload != 0) {\n+\t\t\tmb->vlan_tci = rte_cpu_to_le_32(meta->vlan[0].tci);\n+\t\t\tmb->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;\n+\t\t}\n+\t} else if ((ctrl & NFP_NET_CFG_CTRL_RXVLAN) != 0) {\n+\t\tif ((rxd->rxd.flags & PCIE_DESC_RX_VLAN) != 0) {\n+\t\t\tmb->vlan_tci = rte_cpu_to_le_32(rxd->rxd.offload_info);\n+\t\t\tmb->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;\n+\t\t}\n+\t}\n+}\n+\n+/*\n+ * Set mbuf qinq_strip data based on metadata info\n+ *\n+ * The out VLAN tci are prepended to the packet data.\n+ * Extract and decode it and set the mbuf fields.\n+ *\n+ * If both RTE_MBUF_F_RX_VLAN and NFP_NET_CFG_CTRL_RXQINQ are set, the 2 VLANs\n+ *   have been stripped by the hardware and their TCIs are saved in\n+ *   mbuf->vlan_tci (inner) and mbuf->vlan_tci_outer (outer).\n+ * If NFP_NET_CFG_CTRL_RXQINQ is set and RTE_MBUF_F_RX_VLAN is unset, only the\n+ *   outer VLAN is removed from packet data, but both tci are saved in\n+ *   mbuf->vlan_tci (inner) and mbuf->vlan_tci_outer (outer).\n+ *\n+ * qinq set & vlan set : meta->vlan_layer>=2, meta->vlan[0].offload=1, meta->vlan[1].offload=1\n+ * qinq set & vlan not set: meta->vlan_layer>=2, meta->vlan[1].offload=1,meta->vlan[0].offload=0\n+ * qinq not set & vlan set: meta->vlan_layer=1, meta->vlan[0].offload=1\n+ * qinq not set & vlan not set: meta->vlan_layer=0\n+ */\n+static void\n+nfp_net_parse_meta_qinq(const struct nfp_meta_parsed *meta,\n+\t\tstruct nfp_net_rxq *rxq,\n+\t\tstruct rte_mbuf *mb)\n+{\n+\tstruct nfp_hw *hw = &rxq->hw->super;\n+\n+\tif ((hw->ctrl & NFP_NET_CFG_CTRL_RXQINQ) == 0 ||\n+\t\t\t(hw->cap & NFP_NET_CFG_CTRL_RXQINQ) == 0)\n+\t\treturn;\n+\n+\tif (meta->vlan_layer < NFP_META_MAX_VLANS)\n+\t\treturn;\n+\n+\tif (meta->vlan[0].offload == 0)\n+\t\tmb->vlan_tci = rte_cpu_to_le_16(meta->vlan[0].tci);\n+\n+\tmb->vlan_tci_outer = rte_cpu_to_le_16(meta->vlan[1].tci);\n+\tPMD_RX_LOG(DEBUG, \"Received outer vlan TCI is %u inner vlan TCI is %u\",\n+\t\t\tmb->vlan_tci_outer, mb->vlan_tci);\n+\tmb->ol_flags |= RTE_MBUF_F_RX_QINQ | RTE_MBUF_F_RX_QINQ_STRIPPED;\n+}\n+\n+/*\n+ * Set mbuf IPsec Offload features based on metadata info.\n+ *\n+ * The IPsec Offload features is prepended to the mbuf ol_flags.\n+ * Extract and decode metadata info and set the mbuf ol_flags.\n+ */\n+static void\n+nfp_net_parse_meta_ipsec(struct nfp_meta_parsed *meta,\n+\t\tstruct nfp_net_rxq *rxq,\n+\t\tstruct rte_mbuf *mbuf)\n+{\n+\tint offset;\n+\tuint32_t sa_idx;\n+\tstruct nfp_net_hw *hw;\n+\tstruct nfp_tx_ipsec_desc_msg *desc_md;\n+\n+\thw = rxq->hw;\n+\tsa_idx = meta->sa_idx;\n+\n+\tif (meta->ipsec_type != NFP_NET_META_IPSEC)\n+\t\treturn;\n+\n+\tif (sa_idx >= NFP_NET_IPSEC_MAX_SA_CNT) {\n+\t\tmbuf->ol_flags |= RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED;\n+\t} else {\n+\t\tmbuf->ol_flags |= RTE_MBUF_F_RX_SEC_OFFLOAD;\n+\t\toffset = hw->ipsec_data->pkt_dynfield_offset;\n+\t\tdesc_md = RTE_MBUF_DYNFIELD(mbuf, offset, struct nfp_tx_ipsec_desc_msg *);\n+\t\tdesc_md->sa_idx = sa_idx;\n+\t\tdesc_md->enc = 0;\n+\t}\n+}\n+\n+static void\n+nfp_net_parse_meta_mark(const struct nfp_meta_parsed *meta,\n+\t\tstruct rte_mbuf *mbuf)\n+{\n+\tif (((meta->flags >> NFP_NET_META_MARK) & 0x1) == 0)\n+\t\treturn;\n+\n+\tmbuf->hash.fdir.hi = meta->mark_id;\n+\tmbuf->ol_flags |= RTE_MBUF_F_RX_FDIR | RTE_MBUF_F_RX_FDIR_ID;\n+}\n+\n+/* Parse the metadata from packet */\n+void\n+nfp_net_parse_meta(struct nfp_net_rx_desc *rxds,\n+\t\tstruct nfp_net_rxq *rxq,\n+\t\tstruct nfp_net_hw *hw,\n+\t\tstruct rte_mbuf *mb,\n+\t\tstruct nfp_meta_parsed *meta)\n+{\n+\tuint8_t *meta_base;\n+\trte_be32_t meta_header;\n+\n+\tif (unlikely(NFP_DESC_META_LEN(rxds) == 0))\n+\t\treturn;\n+\n+\tmeta_base = rte_pktmbuf_mtod_offset(mb, uint8_t *, -NFP_DESC_META_LEN(rxds));\n+\tmeta_header = *(rte_be32_t *)meta_base;\n+\n+\tswitch (hw->meta_format) {\n+\tcase NFP_NET_METAFORMAT_CHAINED:\n+\t\tif (nfp_net_parse_chained_meta(meta_base, meta_header, meta)) {\n+\t\t\tnfp_net_parse_meta_hash(meta, rxq, mb);\n+\t\t\tnfp_net_parse_meta_vlan(meta, rxds, rxq, mb);\n+\t\t\tnfp_net_parse_meta_qinq(meta, rxq, mb);\n+\t\t\tnfp_net_parse_meta_ipsec(meta, rxq, mb);\n+\t\t\tnfp_net_parse_meta_mark(meta, mb);\n+\t\t} else {\n+\t\t\tPMD_RX_LOG(DEBUG, \"RX chained metadata format is wrong!\");\n+\t\t}\n+\t\tbreak;\n+\tcase NFP_NET_METAFORMAT_SINGLE:\n+\t\tif ((rxds->rxd.flags & PCIE_DESC_RX_RSS) != 0) {\n+\t\t\tnfp_net_parse_single_meta(meta_base, meta_header, meta);\n+\t\t\tnfp_net_parse_meta_hash(meta, rxq, mb);\n+\t\t}\n+\t\tbreak;\n+\tdefault:\n+\t\tPMD_RX_LOG(DEBUG, \"RX metadata do not exist.\");\n+\t}\n+}\n+\n+void\n+nfp_net_init_metadata_format(struct nfp_net_hw *hw)\n+{\n+\t/*\n+\t * ABI 4.x and ctrl vNIC always use chained metadata, in other cases we allow use of\n+\t * single metadata if only RSS(v1) is supported by hw capability, and RSS(v2)\n+\t * also indicate that we are using chained metadata.\n+\t */\n+\tif (hw->ver.major == 4) {\n+\t\thw->meta_format = NFP_NET_METAFORMAT_CHAINED;\n+\t} else if ((hw->super.cap & NFP_NET_CFG_CTRL_CHAIN_META) != 0) {\n+\t\thw->meta_format = NFP_NET_METAFORMAT_CHAINED;\n+\t\t/*\n+\t\t * RSS is incompatible with chained metadata. hw->super.cap just represents\n+\t\t * firmware's ability rather than the firmware's configuration. We decide\n+\t\t * to reduce the confusion to allow us can use hw->super.cap to identify RSS later.\n+\t\t */\n+\t\thw->super.cap &= ~NFP_NET_CFG_CTRL_RSS;\n+\t} else {\n+\t\thw->meta_format = NFP_NET_METAFORMAT_SINGLE;\n+\t}\n+}\n+\n+void\n+nfp_net_set_meta_vlan(struct nfp_net_meta_raw *meta_data,\n+\t\tstruct rte_mbuf *pkt,\n+\t\tuint8_t layer)\n+{\n+\tuint16_t tpid;\n+\tuint16_t vlan_tci;\n+\n+\ttpid = RTE_ETHER_TYPE_VLAN;\n+\tvlan_tci = pkt->vlan_tci;\n+\n+\tmeta_data->data[layer] = rte_cpu_to_be_32(tpid << 16 | vlan_tci);\n+}\n+\n+void\n+nfp_net_set_meta_ipsec(struct nfp_net_meta_raw *meta_data,\n+\t\tstruct nfp_net_txq *txq,\n+\t\tstruct rte_mbuf *pkt,\n+\t\tuint8_t layer,\n+\t\tuint8_t ipsec_layer)\n+{\n+\tint offset;\n+\tstruct nfp_net_hw *hw;\n+\tstruct nfp_tx_ipsec_desc_msg *desc_md;\n+\n+\thw = txq->hw;\n+\toffset = hw->ipsec_data->pkt_dynfield_offset;\n+\tdesc_md = RTE_MBUF_DYNFIELD(pkt, offset, struct nfp_tx_ipsec_desc_msg *);\n+\n+\tswitch (ipsec_layer) {\n+\tcase NFP_IPSEC_META_SAIDX:\n+\t\tmeta_data->data[layer] = desc_md->sa_idx;\n+\t\tbreak;\n+\tcase NFP_IPSEC_META_SEQLOW:\n+\t\tmeta_data->data[layer] = desc_md->esn.low;\n+\t\tbreak;\n+\tcase NFP_IPSEC_META_SEQHI:\n+\t\tmeta_data->data[layer] = desc_md->esn.hi;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+}\ndiff --git a/drivers/net/nfp/nfp_net_meta.h b/drivers/net/nfp/nfp_net_meta.h\nnew file mode 100644\nindex 0000000000..da2091ce9f\n--- /dev/null\n+++ b/drivers/net/nfp/nfp_net_meta.h\n@@ -0,0 +1,108 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2014, 2015 Netronome Systems, Inc.\n+ * All rights reserved.\n+ */\n+\n+#ifndef __NFP_NET_META_H__\n+#define __NFP_NET_META_H__\n+\n+#include \"nfp_rxtx.h\"\n+\n+/* Hash type prepended when a RSS hash was computed */\n+#define NFP_NET_RSS_NONE                0\n+#define NFP_NET_RSS_IPV4                1\n+#define NFP_NET_RSS_IPV6                2\n+#define NFP_NET_RSS_IPV6_EX             3\n+#define NFP_NET_RSS_IPV4_TCP            4\n+#define NFP_NET_RSS_IPV6_TCP            5\n+#define NFP_NET_RSS_IPV6_EX_TCP         6\n+#define NFP_NET_RSS_IPV4_UDP            7\n+#define NFP_NET_RSS_IPV6_UDP            8\n+#define NFP_NET_RSS_IPV6_EX_UDP         9\n+#define NFP_NET_RSS_IPV4_SCTP           10\n+#define NFP_NET_RSS_IPV6_SCTP           11\n+\n+/* Offset in Freelist buffer where packet starts on RX */\n+#define NFP_NET_RX_OFFSET               32\n+\n+/* Working with metadata api (NFD version > 3.0) */\n+#define NFP_NET_META_FIELD_SIZE         4\n+#define NFP_NET_META_FIELD_MASK ((1 << NFP_NET_META_FIELD_SIZE) - 1)\n+#define NFP_NET_META_HEADER_SIZE        4\n+#define NFP_NET_META_NFDK_LENGTH        8\n+\n+/* Working with metadata vlan api (NFD version >= 2.0) */\n+#define NFP_NET_META_VLAN_INFO          16\n+#define NFP_NET_META_VLAN_OFFLOAD       31\n+#define NFP_NET_META_VLAN_TPID          3\n+#define NFP_NET_META_VLAN_MASK          ((1 << NFP_NET_META_VLAN_INFO) - 1)\n+#define NFP_NET_META_VLAN_TPID_MASK     ((1 << NFP_NET_META_VLAN_TPID) - 1)\n+#define NFP_NET_META_TPID(d)            (((d) >> NFP_NET_META_VLAN_INFO) & \\\n+\t\t\t\t\t\tNFP_NET_META_VLAN_TPID_MASK)\n+\n+/* Prepend field types */\n+#define NFP_NET_META_HASH               1 /* Next field carries hash type */\n+#define NFP_NET_META_MARK               2\n+#define NFP_NET_META_VLAN               4\n+#define NFP_NET_META_PORTID             5\n+#define NFP_NET_META_IPSEC              9\n+\n+#define NFP_META_PORT_ID_CTRL           ~0U\n+\n+#define NFP_DESC_META_LEN(d) ((d)->rxd.meta_len_dd & PCIE_DESC_RX_META_LEN_MASK)\n+\n+/* Maximum number of NFP packet metadata fields. */\n+#define NFP_META_MAX_FIELDS      8\n+\n+/* Maximum number of supported VLANs in parsed form packet metadata. */\n+#define NFP_META_MAX_VLANS       2\n+\n+enum nfp_net_meta_format {\n+\tNFP_NET_METAFORMAT_SINGLE,\n+\tNFP_NET_METAFORMAT_CHAINED,\n+};\n+\n+/* Describe the raw metadata format. */\n+struct nfp_net_meta_raw {\n+\tuint32_t header; /**< Field type header (see format in nfp.rst) */\n+\tuint32_t data[NFP_META_MAX_FIELDS]; /**< Array of each fields data member */\n+\tuint8_t length; /**< Number of valid fields in @header */\n+};\n+\n+/* Record metadata parsed from packet */\n+struct nfp_meta_parsed {\n+\tuint32_t port_id;         /**< Port id value */\n+\tuint32_t sa_idx;          /**< IPsec SA index */\n+\tuint32_t hash;            /**< RSS hash value */\n+\tuint32_t mark_id;         /**< Mark id value */\n+\tuint16_t flags;           /**< Bitmap to indicate if meta exist */\n+\tuint8_t hash_type;        /**< RSS hash type */\n+\tuint8_t ipsec_type;       /**< IPsec type */\n+\tuint8_t vlan_layer;       /**< The valid number of value in @vlan[] */\n+\t/**\n+\t * Holds information parses from NFP_NET_META_VLAN.\n+\t * The inner most vlan starts at position 0\n+\t */\n+\tstruct {\n+\t\tuint8_t offload;  /**< Flag indicates whether VLAN is offloaded */\n+\t\tuint8_t tpid;     /**< Vlan TPID */\n+\t\tuint16_t tci;     /**< Vlan TCI (PCP + Priority + VID) */\n+\t} vlan[NFP_META_MAX_VLANS];\n+};\n+\n+void nfp_net_init_metadata_format(struct nfp_net_hw *hw);\n+void nfp_net_parse_meta(struct nfp_net_rx_desc *rxds,\n+\t\tstruct nfp_net_rxq *rxq,\n+\t\tstruct nfp_net_hw *hw,\n+\t\tstruct rte_mbuf *mb,\n+\t\tstruct nfp_meta_parsed *meta);\n+void nfp_net_set_meta_vlan(struct nfp_net_meta_raw *meta_data,\n+\t\tstruct rte_mbuf *pkt,\n+\t\tuint8_t layer);\n+void nfp_net_set_meta_ipsec(struct nfp_net_meta_raw *meta_data,\n+\t\tstruct nfp_net_txq *txq,\n+\t\tstruct rte_mbuf *pkt,\n+\t\tuint8_t layer,\n+\t\tuint8_t ipsec_layer);\n+\n+#endif /* __NFP_NET_META_H__ */\ndiff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c\nindex cbcf57d769..0256eba456 100644\n--- a/drivers/net/nfp/nfp_rxtx.c\n+++ b/drivers/net/nfp/nfp_rxtx.c\n@@ -16,30 +16,7 @@\n \n #include \"nfp_ipsec.h\"\n #include \"nfp_logs.h\"\n-\n-/* Maximum number of supported VLANs in parsed form packet metadata. */\n-#define NFP_META_MAX_VLANS       2\n-\n-/* Record metadata parsed from packet */\n-struct nfp_meta_parsed {\n-\tuint32_t port_id;         /**< Port id value */\n-\tuint32_t sa_idx;          /**< IPsec SA index */\n-\tuint32_t hash;            /**< RSS hash value */\n-\tuint32_t mark_id;         /**< Mark id value */\n-\tuint16_t flags;           /**< Bitmap to indicate if meta exist */\n-\tuint8_t hash_type;        /**< RSS hash type */\n-\tuint8_t ipsec_type;       /**< IPsec type */\n-\tuint8_t vlan_layer;       /**< The valid number of value in @vlan[] */\n-\t/**\n-\t * Holds information parses from NFP_NET_META_VLAN.\n-\t * The inner most vlan starts at position 0\n-\t */\n-\tstruct {\n-\t\tuint8_t offload;  /**< Flag indicates whether VLAN is offloaded */\n-\t\tuint8_t tpid;     /**< Vlan TPID */\n-\t\tuint16_t tci;     /**< Vlan TCI (PCP + Priority + VID) */\n-\t} vlan[NFP_META_MAX_VLANS];\n-};\n+#include \"nfp_net_meta.h\"\n \n /*\n  * The bit format and map of nfp packet type for rxd.offload_info in Rx descriptor.\n@@ -254,242 +231,6 @@ nfp_net_rx_queue_count(void *rx_queue)\n \treturn count;\n }\n \n-/* Parse the chained metadata from packet */\n-static bool\n-nfp_net_parse_chained_meta(uint8_t *meta_base,\n-\t\trte_be32_t meta_header,\n-\t\tstruct nfp_meta_parsed *meta)\n-{\n-\tuint32_t meta_info;\n-\tuint32_t vlan_info;\n-\tuint8_t *meta_offset;\n-\n-\tmeta_info = rte_be_to_cpu_32(meta_header);\n-\tmeta_offset = meta_base + 4;\n-\n-\tfor (; meta_info != 0; meta_info >>= NFP_NET_META_FIELD_SIZE, meta_offset += 4) {\n-\t\tswitch (meta_info & NFP_NET_META_FIELD_MASK) {\n-\t\tcase NFP_NET_META_PORTID:\n-\t\t\tmeta->port_id = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n-\t\t\tbreak;\n-\t\tcase NFP_NET_META_HASH:\n-\t\t\t/* Next field type is about the hash type */\n-\t\t\tmeta_info >>= NFP_NET_META_FIELD_SIZE;\n-\t\t\t/* Hash value is in the data field */\n-\t\t\tmeta->hash = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n-\t\t\tmeta->hash_type = meta_info & NFP_NET_META_FIELD_MASK;\n-\t\t\tbreak;\n-\t\tcase NFP_NET_META_VLAN:\n-\t\t\tvlan_info = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n-\t\t\tmeta->vlan[meta->vlan_layer].offload =\n-\t\t\t\t\tvlan_info >> NFP_NET_META_VLAN_OFFLOAD;\n-\t\t\tmeta->vlan[meta->vlan_layer].tci =\n-\t\t\t\t\tvlan_info & NFP_NET_META_VLAN_MASK;\n-\t\t\tmeta->vlan[meta->vlan_layer].tpid = NFP_NET_META_TPID(vlan_info);\n-\t\t\tmeta->vlan_layer++;\n-\t\t\tbreak;\n-\t\tcase NFP_NET_META_IPSEC:\n-\t\t\tmeta->sa_idx = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n-\t\t\tmeta->ipsec_type = meta_info & NFP_NET_META_FIELD_MASK;\n-\t\t\tbreak;\n-\t\tcase NFP_NET_META_MARK:\n-\t\t\tmeta->flags |= (1 << NFP_NET_META_MARK);\n-\t\t\tmeta->mark_id = rte_be_to_cpu_32(*(rte_be32_t *)meta_offset);\n-\t\t\tbreak;\n-\t\tdefault:\n-\t\t\t/* Unsupported metadata can be a performance issue */\n-\t\t\treturn false;\n-\t\t}\n-\t}\n-\n-\treturn true;\n-}\n-\n-/* Set mbuf hash data based on the metadata info */\n-static void\n-nfp_net_parse_meta_hash(const struct nfp_meta_parsed *meta,\n-\t\tstruct nfp_net_rxq *rxq,\n-\t\tstruct rte_mbuf *mbuf)\n-{\n-\tstruct nfp_net_hw *hw = rxq->hw;\n-\n-\tif ((hw->super.ctrl & NFP_NET_CFG_CTRL_RSS_ANY) == 0)\n-\t\treturn;\n-\n-\tmbuf->hash.rss = meta->hash;\n-\tmbuf->ol_flags |= RTE_MBUF_F_RX_RSS_HASH;\n-}\n-\n-/*\n- * Parse the single metadata\n- *\n- * The RSS hash and hash-type are prepended to the packet data.\n- * Get it from metadata area.\n- */\n-static inline void\n-nfp_net_parse_single_meta(uint8_t *meta_base,\n-\t\trte_be32_t meta_header,\n-\t\tstruct nfp_meta_parsed *meta)\n-{\n-\tmeta->hash_type = rte_be_to_cpu_32(meta_header);\n-\tmeta->hash = rte_be_to_cpu_32(*(rte_be32_t *)(meta_base + 4));\n-}\n-\n-/* Set mbuf vlan_strip data based on metadata info */\n-static void\n-nfp_net_parse_meta_vlan(const struct nfp_meta_parsed *meta,\n-\t\tstruct nfp_net_rx_desc *rxd,\n-\t\tstruct nfp_net_rxq *rxq,\n-\t\tstruct rte_mbuf *mb)\n-{\n-\tuint32_t ctrl = rxq->hw->super.ctrl;\n-\n-\t/* Skip if hardware don't support setting vlan. */\n-\tif ((ctrl & (NFP_NET_CFG_CTRL_RXVLAN | NFP_NET_CFG_CTRL_RXVLAN_V2)) == 0)\n-\t\treturn;\n-\n-\t/*\n-\t * The firmware support two ways to send the VLAN info (with priority) :\n-\t * 1. Using the metadata when NFP_NET_CFG_CTRL_RXVLAN_V2 is set,\n-\t * 2. Using the descriptor when NFP_NET_CFG_CTRL_RXVLAN is set.\n-\t */\n-\tif ((ctrl & NFP_NET_CFG_CTRL_RXVLAN_V2) != 0) {\n-\t\tif (meta->vlan_layer > 0 && meta->vlan[0].offload != 0) {\n-\t\t\tmb->vlan_tci = rte_cpu_to_le_32(meta->vlan[0].tci);\n-\t\t\tmb->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;\n-\t\t}\n-\t} else if ((ctrl & NFP_NET_CFG_CTRL_RXVLAN) != 0) {\n-\t\tif ((rxd->rxd.flags & PCIE_DESC_RX_VLAN) != 0) {\n-\t\t\tmb->vlan_tci = rte_cpu_to_le_32(rxd->rxd.offload_info);\n-\t\t\tmb->ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;\n-\t\t}\n-\t}\n-}\n-\n-/*\n- * Set mbuf qinq_strip data based on metadata info\n- *\n- * The out VLAN tci are prepended to the packet data.\n- * Extract and decode it and set the mbuf fields.\n- *\n- * If both RTE_MBUF_F_RX_VLAN and NFP_NET_CFG_CTRL_RXQINQ are set, the 2 VLANs\n- *   have been stripped by the hardware and their TCIs are saved in\n- *   mbuf->vlan_tci (inner) and mbuf->vlan_tci_outer (outer).\n- * If NFP_NET_CFG_CTRL_RXQINQ is set and RTE_MBUF_F_RX_VLAN is unset, only the\n- *   outer VLAN is removed from packet data, but both tci are saved in\n- *   mbuf->vlan_tci (inner) and mbuf->vlan_tci_outer (outer).\n- *\n- * qinq set & vlan set : meta->vlan_layer>=2, meta->vlan[0].offload=1, meta->vlan[1].offload=1\n- * qinq set & vlan not set: meta->vlan_layer>=2, meta->vlan[1].offload=1,meta->vlan[0].offload=0\n- * qinq not set & vlan set: meta->vlan_layer=1, meta->vlan[0].offload=1\n- * qinq not set & vlan not set: meta->vlan_layer=0\n- */\n-static void\n-nfp_net_parse_meta_qinq(const struct nfp_meta_parsed *meta,\n-\t\tstruct nfp_net_rxq *rxq,\n-\t\tstruct rte_mbuf *mb)\n-{\n-\tstruct nfp_hw *hw = &rxq->hw->super;\n-\n-\tif ((hw->ctrl & NFP_NET_CFG_CTRL_RXQINQ) == 0)\n-\t\treturn;\n-\n-\tif (meta->vlan_layer < NFP_META_MAX_VLANS)\n-\t\treturn;\n-\n-\tif (meta->vlan[0].offload == 0)\n-\t\tmb->vlan_tci = rte_cpu_to_le_16(meta->vlan[0].tci);\n-\n-\tmb->vlan_tci_outer = rte_cpu_to_le_16(meta->vlan[1].tci);\n-\tPMD_RX_LOG(DEBUG, \"Received outer vlan TCI is %u inner vlan TCI is %u\",\n-\t\t\tmb->vlan_tci_outer, mb->vlan_tci);\n-\tmb->ol_flags |= RTE_MBUF_F_RX_QINQ | RTE_MBUF_F_RX_QINQ_STRIPPED;\n-}\n-\n-/*\n- * Set mbuf IPsec Offload features based on metadata info.\n- *\n- * The IPsec Offload features is prepended to the mbuf ol_flags.\n- * Extract and decode metadata info and set the mbuf ol_flags.\n- */\n-static void\n-nfp_net_parse_meta_ipsec(struct nfp_meta_parsed *meta,\n-\t\tstruct nfp_net_rxq *rxq,\n-\t\tstruct rte_mbuf *mbuf)\n-{\n-\tint offset;\n-\tuint32_t sa_idx;\n-\tstruct nfp_net_hw *hw;\n-\tstruct nfp_tx_ipsec_desc_msg *desc_md;\n-\n-\thw = rxq->hw;\n-\tsa_idx = meta->sa_idx;\n-\n-\tif (meta->ipsec_type != NFP_NET_META_IPSEC)\n-\t\treturn;\n-\n-\tif (sa_idx >= NFP_NET_IPSEC_MAX_SA_CNT) {\n-\t\tmbuf->ol_flags |= RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED;\n-\t} else {\n-\t\tmbuf->ol_flags |= RTE_MBUF_F_RX_SEC_OFFLOAD;\n-\t\toffset = hw->ipsec_data->pkt_dynfield_offset;\n-\t\tdesc_md = RTE_MBUF_DYNFIELD(mbuf, offset, struct nfp_tx_ipsec_desc_msg *);\n-\t\tdesc_md->sa_idx = sa_idx;\n-\t\tdesc_md->enc = 0;\n-\t}\n-}\n-\n-static void\n-nfp_net_parse_meta_mark(const struct nfp_meta_parsed *meta,\n-\t\tstruct rte_mbuf *mbuf)\n-{\n-\tif (((meta->flags >> NFP_NET_META_MARK) & 0x1) == 0)\n-\t\treturn;\n-\n-\tmbuf->hash.fdir.hi = meta->mark_id;\n-\tmbuf->ol_flags |= RTE_MBUF_F_RX_FDIR | RTE_MBUF_F_RX_FDIR_ID;\n-}\n-\n-/* Parse the metadata from packet */\n-static void\n-nfp_net_parse_meta(struct nfp_net_rx_desc *rxds,\n-\t\tstruct nfp_net_rxq *rxq,\n-\t\tstruct nfp_net_hw *hw,\n-\t\tstruct rte_mbuf *mb,\n-\t\tstruct nfp_meta_parsed *meta)\n-{\n-\tuint8_t *meta_base;\n-\trte_be32_t meta_header;\n-\n-\tif (unlikely(NFP_DESC_META_LEN(rxds) == 0))\n-\t\treturn;\n-\n-\tmeta_base = rte_pktmbuf_mtod_offset(mb, uint8_t *, -NFP_DESC_META_LEN(rxds));\n-\tmeta_header = *(rte_be32_t *)meta_base;\n-\n-\tswitch (hw->meta_format) {\n-\tcase NFP_NET_METAFORMAT_CHAINED:\n-\t\tif (nfp_net_parse_chained_meta(meta_base, meta_header, meta)) {\n-\t\t\tnfp_net_parse_meta_hash(meta, rxq, mb);\n-\t\t\tnfp_net_parse_meta_vlan(meta, rxds, rxq, mb);\n-\t\t\tnfp_net_parse_meta_qinq(meta, rxq, mb);\n-\t\t\tnfp_net_parse_meta_ipsec(meta, rxq, mb);\n-\t\t\tnfp_net_parse_meta_mark(meta, mb);\n-\t\t} else {\n-\t\t\tPMD_RX_LOG(DEBUG, \"RX chained metadata format is wrong!\");\n-\t\t}\n-\t\tbreak;\n-\tcase NFP_NET_METAFORMAT_SINGLE:\n-\t\tif ((rxds->rxd.flags & PCIE_DESC_RX_RSS) != 0) {\n-\t\t\tnfp_net_parse_single_meta(meta_base, meta_header, meta);\n-\t\t\tnfp_net_parse_meta_hash(meta, rxq, mb);\n-\t\t}\n-\t\tbreak;\n-\tdefault:\n-\t\tPMD_RX_LOG(DEBUG, \"RX metadata do not exist.\");\n-\t}\n-}\n-\n /**\n  * Set packet type to mbuf based on parsed structure.\n  *\n@@ -1038,50 +779,6 @@ nfp_net_reset_tx_queue(struct nfp_net_txq *txq)\n \ttxq->rd_p = 0;\n }\n \n-void\n-nfp_net_set_meta_vlan(struct nfp_net_meta_raw *meta_data,\n-\t\tstruct rte_mbuf *pkt,\n-\t\tuint8_t layer)\n-{\n-\tuint16_t tpid;\n-\tuint16_t vlan_tci;\n-\n-\ttpid = RTE_ETHER_TYPE_VLAN;\n-\tvlan_tci = pkt->vlan_tci;\n-\n-\tmeta_data->data[layer] = rte_cpu_to_be_32(tpid << 16 | vlan_tci);\n-}\n-\n-void\n-nfp_net_set_meta_ipsec(struct nfp_net_meta_raw *meta_data,\n-\t\tstruct nfp_net_txq *txq,\n-\t\tstruct rte_mbuf *pkt,\n-\t\tuint8_t layer,\n-\t\tuint8_t ipsec_layer)\n-{\n-\tint offset;\n-\tstruct nfp_net_hw *hw;\n-\tstruct nfp_tx_ipsec_desc_msg *desc_md;\n-\n-\thw = txq->hw;\n-\toffset = hw->ipsec_data->pkt_dynfield_offset;\n-\tdesc_md = RTE_MBUF_DYNFIELD(pkt, offset, struct nfp_tx_ipsec_desc_msg *);\n-\n-\tswitch (ipsec_layer) {\n-\tcase NFP_IPSEC_META_SAIDX:\n-\t\tmeta_data->data[layer] = desc_md->sa_idx;\n-\t\tbreak;\n-\tcase NFP_IPSEC_META_SEQLOW:\n-\t\tmeta_data->data[layer] = desc_md->esn.low;\n-\t\tbreak;\n-\tcase NFP_IPSEC_META_SEQHI:\n-\t\tmeta_data->data[layer] = desc_md->esn.hi;\n-\t\tbreak;\n-\tdefault:\n-\t\tbreak;\n-\t}\n-}\n-\n int\n nfp_net_tx_queue_setup(struct rte_eth_dev *dev,\n \t\tuint16_t queue_idx,\ndiff --git a/drivers/net/nfp/nfp_rxtx.h b/drivers/net/nfp/nfp_rxtx.h\nindex 5695a31636..6ecabc232c 100644\n--- a/drivers/net/nfp/nfp_rxtx.h\n+++ b/drivers/net/nfp/nfp_rxtx.h\n@@ -8,18 +8,6 @@\n \n #include <ethdev_driver.h>\n \n-#define NFP_DESC_META_LEN(d) ((d)->rxd.meta_len_dd & PCIE_DESC_RX_META_LEN_MASK)\n-\n-/* Maximum number of NFP packet metadata fields. */\n-#define NFP_META_MAX_FIELDS      8\n-\n-/* Describe the raw metadata format. */\n-struct nfp_net_meta_raw {\n-\tuint32_t header; /**< Field type header (see format in nfp.rst) */\n-\tuint32_t data[NFP_META_MAX_FIELDS]; /**< Array of each fields data member */\n-\tuint8_t length; /**< Number of valid fields in @header */\n-};\n-\n /* Descriptor alignment */\n #define NFP_ALIGN_RING_DESC 128\n \n@@ -238,13 +226,5 @@ int nfp_net_tx_queue_setup(struct rte_eth_dev *dev,\n \t\tunsigned int socket_id,\n \t\tconst struct rte_eth_txconf *tx_conf);\n uint32_t nfp_net_tx_free_bufs(struct nfp_net_txq *txq);\n-void nfp_net_set_meta_vlan(struct nfp_net_meta_raw *meta_data,\n-\t\tstruct rte_mbuf *pkt,\n-\t\tuint8_t layer);\n-void nfp_net_set_meta_ipsec(struct nfp_net_meta_raw *meta_data,\n-\t\tstruct nfp_net_txq *txq,\n-\t\tstruct rte_mbuf *pkt,\n-\t\tuint8_t layer,\n-\t\tuint8_t ipsec_layer);\n \n #endif /* __NFP_RXTX_H__ */\n",
    "prefixes": [
        "1/5"
    ]
}