get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 118955,
    "url": "http://patches.dpdk.org/api/patches/118955/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1666427069-10553-9-git-send-email-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": "<1666427069-10553-9-git-send-email-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1666427069-10553-9-git-send-email-chaoyong.he@corigine.com",
    "date": "2022-10-22T08:24:12",
    "name": "[v2,08/25] net/nfp: prepare for IPv6 UDP tunnel decap flow action",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "2d4444936b88290938bd0db74367e4401a399ffe",
    "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/1666427069-10553-9-git-send-email-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 25372,
            "url": "http://patches.dpdk.org/api/series/25372/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=25372",
            "date": "2022-10-22T08:24:04",
            "name": "add the extend rte_flow offload support of nfp PMD",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/25372/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/118955/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/118955/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 E8F6BA0032;\n\tSat, 22 Oct 2022 10:25:53 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id C6EE742826;\n\tSat, 22 Oct 2022 10:25:11 +0200 (CEST)",
            "from NAM04-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam04on2121.outbound.protection.outlook.com [40.107.101.121])\n by mails.dpdk.org (Postfix) with ESMTP id CDED04280E\n for <dev@dpdk.org>; Sat, 22 Oct 2022 10:25:04 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by PH7PR13MB5454.namprd13.prod.outlook.com (2603:10b6:510:130::22)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5746.8; Sat, 22 Oct\n 2022 08:25:03 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::7c26:1a0b:2825:6f4b]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::7c26:1a0b:2825:6f4b%4]) with mapi id 15.20.5723.014; Sat, 22 Oct 2022\n 08:25:03 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=LKRmgoB/RuyzTAZajkP+RZP0b01VHIRqBJZq+SJbLGwWnzBiYvxsW/Agn2vy/tfIWzb9ucg0eoKjHBOs9iN3O6wzSdjfODajYX/yeycv1emg3MfyrlWu3Ifd371OVwcHNPdAx3P7iYn8G9aQRA0mTk4Nq+tzQ+jK7OtOXbXvPLjKqTiuFtUP2reSTQGkpJ+HVFA4EKBgM2M6FvyDeydNiy3IOSy0suxbHKguaj6dyJoPtXYjFm2YCnzAkrD2yLJ+hQIQkuLfISvpcuXI2plDg9VkK7oDhjL3pjTUp+B5bG1sVNLVY+bbQFetqVoDmxm0G/GCezDHAuX/Iq4bdlLzfg==",
        "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=jliCd/nIeGTL/9h591nPJmFwNw8wmS1SEpWrvudXAvg=;\n b=keDLoFz0UWchbGUXv7hu1dc5i4A2IqosMyrv502DwurvGgl+NRi9qXvK9D/qXTXz39c93eNXARs4NvtpbaXmS+KHIKyHwH5k5eU5YEYd5VNY67UutcpP13evHbRC6WZrp8Jmix6qGtYgdu0crNd6GYPID1QtSBA2uiMyvbNt9NHt2KYEgLbBPAJX0McpxPbjcANtw23Bs+gR4IKUV10eV0+jtF5IuseX/cb1Ivd6IS0XwNycrb6gqwKSsckL3sYG5uUeQInrUv500xIZ/sh4bX6xHDRfODsiT69sp5by6TnZpKLIvW/XgW2F2Td40Z+ToNdJ6TTWk47a5HER97Grfw==",
        "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=jliCd/nIeGTL/9h591nPJmFwNw8wmS1SEpWrvudXAvg=;\n b=GcSHOphly6oNBmIhHiR5iW/NBApGIsaZ9r2V/DBQ9fZ+mun7ubfCjbUrXVq8fNogDug3IWOHVsfaRGyK+8lwPffJ30TY+yEJD7MnSdXwfv5CJIIX/qZc6NbpZ6IpdsZ+7qESbY8jdlWvUYPBpSio+xeQkFSzAosToRTrG/E7l1I=",
        "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, niklas.soderlund@corigine.com,\n Chaoyong He <chaoyong.he@corigine.com>",
        "Subject": "[PATCH v2 08/25] net/nfp: prepare for IPv6 UDP tunnel decap flow\n action",
        "Date": "Sat, 22 Oct 2022 16:24:12 +0800",
        "Message-Id": "<1666427069-10553-9-git-send-email-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1666427069-10553-1-git-send-email-chaoyong.he@corigine.com>",
        "References": "<1666063359-34283-1-git-send-email-chaoyong.he@corigine.com>\n <1666427069-10553-1-git-send-email-chaoyong.he@corigine.com>",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-ClientProxiedBy": "SG2PR02CA0056.apcprd02.prod.outlook.com\n (2603:1096:4:54::20) 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_|PH7PR13MB5454:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "9f520451-c213-48db-3983-08dab406eac4",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n dulH9spawytQdEbHg0IBO84Nq+28fUT0z4BmNadupRA3S5TzipXYfs0+0z52FPI81F26fWXf+6fCwmfgx4KJZCSdVslozdkJzc8nNnDLyfyYAhHt6D8RAllxq7dpplPHTzLd7zVn/sIGS4bpIHKsTbiJKfY7IZcQltMgwGD9LFipMgnx7TCQ0kIZu2QY8b4odepXSpNIG1EmOe4WCKTMQgJAN9YrYJ3ch/hyrPNCIRbk/OWlb2bE2dU64m/CTrE4pLUJEhR+Ft6F3fu6NLhI2c1PXI8ZTbgNhx6u9ZZLLJpIpA2V/DLZrScpwjBFeArVNKIKWpVH84L/OlynJFdTAFgm8rQUi76FFcdzaqfT4sSi7NweM2/FLPKVdDYVIRo0otUHKcyWXQcEWvstpMWTZ5rZAJ0NuOVQG6HHSWAUmK8SLBCkBNRruCAzRFDG0R4CDyrOl6R4RTv51ZLPHLkkSWbUoD4FzRL6IPOWqs8uLtaykTTprkJdvW4eHGXSKtiFZse26vin5w4F4x9Xb2HilglutuBvVhXEfKAQ6YNh9VUtWiMMwCweWSVRQSKO1m3opmba5p5/cwQVnLIjx1RcrDWU11jhw99PdCeJcEGmJH5ZOy5LRIa5PneXd3I+PCU2M/x2yXzVR/5zWEUTY31NjH7uvescguzZNIgAieD4Zmkw8kL0ZOu/CjkUCLVVNlR78p/V8Tg0owoChb6rZ7WaTJNcD0iJyDDKMhNnLHzd9mJPtWCKEJ2KkZ5C215quKmz1WQkXaxIduFQ5U+DyfdTrhSGqQBFU/K+BucO8y3culI=",
        "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:(13230022)(4636009)(346002)(366004)(396003)(376002)(39840400004)(136003)(451199015)(186003)(6916009)(316002)(66574015)(83380400001)(2616005)(38350700002)(86362001)(44832011)(30864003)(38100700002)(66556008)(5660300002)(41300700001)(107886003)(478600001)(6506007)(6486002)(6666004)(8676002)(26005)(6512007)(8936002)(4326008)(2906002)(52116002)(66946007)(66476007)(36756003);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "=?utf-8?q?0cGTgQxGPmfVR7RNZiEHh+UzyIa9?=\n\t=?utf-8?q?F/I4tb8lkbVi3z6Fls90dcmf06XqiptpqSARVziQCmAa2hVtF7PNGCguOh3GpBkfp?=\n\t=?utf-8?q?a8h3xVBDQ+qvNEC8fo3+3UvizQxURHHQoMOuOq9GNsUyGY1XyiPZMzPSTQJ5Y16vI?=\n\t=?utf-8?q?6hjQSKu34L65gN3Ej5zWvT7cx/owy/AxsgYVE3APYkTRtqsRnlDLg5sSbkO1GSZjX?=\n\t=?utf-8?q?uRY5obsG5P9MNg6aviZ6FxGC00YADCg1RyHf3Ph4/nYpkAw0ye+eKAjAgkQAeiGz+?=\n\t=?utf-8?q?QjQkg5T0yV86Evh9atnZSSTRZEOeRHDqiggr1RRrkSo+VHfbiam0Xne2AmXljcOfk?=\n\t=?utf-8?q?4LoLktd2MvRTaCitpm4CdeFgatLMcfwhbA2xxx+0m/mC+LpIQe4N6E+jO6QMqUcAC?=\n\t=?utf-8?q?xrfNFJ/lZ7R2gvWiyC1yD0W2Eg0C5AoCv2ig7hSI+lzCws8rNy2B2ELLaO4DDh9z9?=\n\t=?utf-8?q?rPrmnYZZHih4e1XOjGEW2Q19Sq2WzGwmYJC8Y0tuiMyxu8PGbmyTL1KOwGErinVI1?=\n\t=?utf-8?q?3ArF+zmu7duQHPSOLazUP8Dv4FpJmDYJAZTUvAsAO8iWj0U0Ohs5FQb55D5aB7Tyu?=\n\t=?utf-8?q?9ZS53SGV1E7F1kzqQKF6mb8jl0wHPZtSvSuG4qx1BCsRCTy/V3/cB4Y85Ay1mvTt/?=\n\t=?utf-8?q?m0h/aI0xQ5sbFmtcH/7wA1GmwOD5WqOmE6LCMDM3X3P8ETf8msk1QQk2YCe9JvSSe?=\n\t=?utf-8?q?k9yf8YDqQYxgVfo+HnqaCFtCGyQM5dVBvU0kKfYiXDy0aaKjuAe5+tVhmGNbxwqzp?=\n\t=?utf-8?q?bdNnavVr2SsBqneINLIZ4OsndqHViMxFH3pSbdO6CQhJ3L/I2cNlz+uIDhdDMkkSL?=\n\t=?utf-8?q?k06P2HlVh7buIEviXuv+Umi4NAC43vV3IQr0QR8WRqMjn7iJvLDEqoJQ8zm+YgUAx?=\n\t=?utf-8?q?wW4/oxY0BWhBH8A7MTP9EXt4wAmoO16Wt8A4DnmXlM/on8PvH4CHNfsLF6ILyzOz6?=\n\t=?utf-8?q?uVBjigWm+/tRdyJMU5+yQVI2hnp20Jv9DnZ03Lu6Gb/yJ7Ek2CtbWv3cpCFF2ny1W?=\n\t=?utf-8?q?CX5jwNX/bNr1CuQUas0ShYxl6zgfTvwi3ulS3NY2fAEZQZWCg21Mf/rVhv35KFbjt?=\n\t=?utf-8?q?4dQXt/a6yfh5YlISIa+dQW5L9/LbUh+d8zZO5CjsgBT29hRaqpdqEUUIYAQwGMe1B?=\n\t=?utf-8?q?juInexy+qPqVLmAYewR1waTj1RQzr0+zYMaDDcRHqA4bjr5bu61nZrss2u6r2E9zJ?=\n\t=?utf-8?q?cpJQhdF6RtrDYrxDC3j3YcxAedm7VipZ5jnzVhHpEiCJr94VFSA9xQ7TV+Ijq1i1i?=\n\t=?utf-8?q?arSAJwtfwV8goBDrIVHCJy7DlQIzs1wHSh1x56CWDgetp4MFAwwJ2wTmkGziIoJ37?=\n\t=?utf-8?q?D8riu9liHZ4qgNAMYKfNABqjsps3fCnwmECSlvSw6GEM83Gv2JRFLO2wduP1bY0K5?=\n\t=?utf-8?q?6ruZMgqRFirZFxe7qHd4qTTmGxWqknPtmG2WvxXdhZzqlmx4MDx5nvVhlXVIibU+j?=\n\t=?utf-8?q?mR74Af0TZAuJLw16Pkyfvu/43KUesa0bbCyhj1wdQMlbF1aoZU+C189I9kih7NAWg?=\n\t=?utf-8?q?d4ZRbJo3a6NlSwn6B6fXsoYx30/0Ca3TKA=3D=3D?=",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 9f520451-c213-48db-3983-08dab406eac4",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "22 Oct 2022 08:25:02.9128 (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 PkxlogRLtjOqq0yTzgweLw/ZkOPIk9pqEV4hCFbCU2X/CMyYwjgVF9neKBE2RKBMTjy0ZzTPw/VNz/F3eKz0TyP1CLeqx3OwM6Mab55w4y8=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "PH7PR13MB5454",
        "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": "Add the related data structure and functions, prepare for\nthe decap action of IPv6 UDP tunnel.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@corigine.com>\n---\n drivers/net/nfp/flower/nfp_flower_cmsg.c |  42 +++++++++\n drivers/net/nfp/flower/nfp_flower_cmsg.h |  24 +++++\n drivers/net/nfp/nfp_flow.c               | 145 ++++++++++++++++++++++++++++++-\n drivers/net/nfp/nfp_flow.h               |   9 ++\n 4 files changed, 217 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.c b/drivers/net/nfp/flower/nfp_flower_cmsg.c\nindex f18f3de..76815cf 100644\n--- a/drivers/net/nfp/flower/nfp_flower_cmsg.c\n+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.c\n@@ -348,6 +348,48 @@\n }\n \n int\n+nfp_flower_cmsg_tun_off_v6(struct nfp_app_fw_flower *app_fw_flower)\n+{\n+\tuint16_t cnt;\n+\tuint32_t count = 0;\n+\tstruct rte_mbuf *mbuf;\n+\tstruct nfp_flow_priv *priv;\n+\tstruct nfp_ipv6_addr_entry *entry;\n+\tstruct nfp_flower_cmsg_tun_ipv6_addr *msg;\n+\n+\tmbuf = rte_pktmbuf_alloc(app_fw_flower->ctrl_pktmbuf_pool);\n+\tif (mbuf == NULL) {\n+\t\tPMD_DRV_LOG(DEBUG, \"Failed to alloc mbuf for v6 tun addr\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tmsg = nfp_flower_cmsg_init(mbuf, NFP_FLOWER_CMSG_TYPE_TUN_IPS_V6, sizeof(*msg));\n+\n+\tpriv = app_fw_flower->flow_priv;\n+\trte_spinlock_lock(&priv->ipv6_off_lock);\n+\tLIST_FOREACH(entry, &priv->ipv6_off_list, next) {\n+\t\tif (count >= NFP_FL_IPV6_ADDRS_MAX) {\n+\t\t\trte_spinlock_unlock(&priv->ipv6_off_lock);\n+\t\t\tPMD_DRV_LOG(ERR, \"IPv6 offload exceeds limit.\");\n+\t\t\treturn -ERANGE;\n+\t\t}\n+\t\tmemcpy(&msg->ipv6_addr[count * 16], entry->ipv6_addr, 16UL);\n+\t\tcount++;\n+\t}\n+\tmsg->count = rte_cpu_to_be_32(count);\n+\trte_spinlock_unlock(&priv->ipv6_off_lock);\n+\n+\tcnt = nfp_flower_ctrl_vnic_xmit(app_fw_flower, mbuf);\n+\tif (cnt == 0) {\n+\t\tPMD_DRV_LOG(ERR, \"Send cmsg through ctrl vnic failed.\");\n+\t\trte_pktmbuf_free(mbuf);\n+\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int\n nfp_flower_cmsg_pre_tunnel_rule(struct nfp_app_fw_flower *app_fw_flower,\n \t\tstruct nfp_fl_rule_metadata *nfp_flow_meta,\n \t\tuint16_t mac_idx,\ndiff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.h b/drivers/net/nfp/flower/nfp_flower_cmsg.h\nindex 0933dac..61f2f83 100644\n--- a/drivers/net/nfp/flower/nfp_flower_cmsg.h\n+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.h\n@@ -280,6 +280,29 @@ struct nfp_flower_cmsg_tun_ipv4_addr {\n \trte_be32_t ipv4_addr[NFP_FL_IPV4_ADDRS_MAX];\n };\n \n+#define NFP_FL_IPV6_ADDRS_MAX        4\n+\n+/*\n+ * NFP_FLOWER_CMSG_TYPE_TUN_IP_V6\n+ *    Bit    3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0\n+ *    -----\\ 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0\n+ *          +---------------------------------------------------------------+\n+ *        0 |                    Number of IP Addresses                     |\n+ *          +---------------------------------------------------------------+\n+ *        1 |                        IP Address1 #1                         |\n+ *          +---------------------------------------------------------------+\n+ *        2 |                        IP Address1 #2                         |\n+ *          +---------------------------------------------------------------+\n+ *          |                             ...                               |\n+ *          +---------------------------------------------------------------+\n+ *       16 |                        IP Address4 #4                         |\n+ *          +---------------------------------------------------------------+\n+ */\n+struct nfp_flower_cmsg_tun_ipv6_addr {\n+\trte_be32_t count;\n+\tuint8_t ipv6_addr[NFP_FL_IPV6_ADDRS_MAX * 16];\n+};\n+\n /*\n  * NFP_FLOWER_CMSG_TYPE_FLOW_STATS\n  *    Bit    3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0\n@@ -802,6 +825,7 @@ int nfp_flower_cmsg_tun_neigh_v4_rule(struct nfp_app_fw_flower *app_fw_flower,\n int nfp_flower_cmsg_tun_neigh_v6_rule(struct nfp_app_fw_flower *app_fw_flower,\n \t\tstruct nfp_flower_cmsg_tun_neigh_v6 *payload);\n int nfp_flower_cmsg_tun_off_v4(struct nfp_app_fw_flower *app_fw_flower);\n+int nfp_flower_cmsg_tun_off_v6(struct nfp_app_fw_flower *app_fw_flower);\n int nfp_flower_cmsg_pre_tunnel_rule(struct nfp_app_fw_flower *app_fw_flower,\n \t\tstruct nfp_fl_rule_metadata *nfp_flow_meta,\n \t\tuint16_t mac_idx,\ndiff --git a/drivers/net/nfp/nfp_flow.c b/drivers/net/nfp/nfp_flow.c\nindex c088d24..ad484b9 100644\n--- a/drivers/net/nfp/nfp_flow.c\n+++ b/drivers/net/nfp/nfp_flow.c\n@@ -476,16 +476,95 @@ struct nfp_pre_tun_entry {\n \treturn 0;\n }\n \n+__rte_unused static int\n+nfp_tun_add_ipv6_off(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tuint8_t ipv6[])\n+{\n+\tstruct nfp_flow_priv *priv;\n+\tstruct nfp_ipv6_addr_entry *entry;\n+\tstruct nfp_ipv6_addr_entry *tmp_entry;\n+\n+\tpriv = app_fw_flower->flow_priv;\n+\n+\trte_spinlock_lock(&priv->ipv6_off_lock);\n+\tLIST_FOREACH(entry, &priv->ipv6_off_list, next) {\n+\t\tif (!memcmp(entry->ipv6_addr, ipv6, sizeof(entry->ipv6_addr))) {\n+\t\t\tentry->ref_count++;\n+\t\t\trte_spinlock_unlock(&priv->ipv6_off_lock);\n+\t\t\treturn 0;\n+\t\t}\n+\t}\n+\trte_spinlock_unlock(&priv->ipv6_off_lock);\n+\n+\ttmp_entry = rte_zmalloc(\"nfp_ipv6_off\", sizeof(struct nfp_ipv6_addr_entry), 0);\n+\tif (tmp_entry == NULL) {\n+\t\tPMD_DRV_LOG(ERR, \"Mem error when offloading IP6 address.\");\n+\t\treturn -ENOMEM;\n+\t}\n+\tmemcpy(tmp_entry->ipv6_addr, ipv6, sizeof(tmp_entry->ipv6_addr));\n+\ttmp_entry->ref_count = 1;\n+\n+\trte_spinlock_lock(&priv->ipv6_off_lock);\n+\tLIST_INSERT_HEAD(&priv->ipv6_off_list, tmp_entry, next);\n+\trte_spinlock_unlock(&priv->ipv6_off_lock);\n+\n+\treturn nfp_flower_cmsg_tun_off_v6(app_fw_flower);\n+}\n+\n+static int\n+nfp_tun_del_ipv6_off(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tuint8_t ipv6[])\n+{\n+\tstruct nfp_flow_priv *priv;\n+\tstruct nfp_ipv6_addr_entry *entry;\n+\n+\tpriv = app_fw_flower->flow_priv;\n+\n+\trte_spinlock_lock(&priv->ipv6_off_lock);\n+\tLIST_FOREACH(entry, &priv->ipv6_off_list, next) {\n+\t\tif (!memcmp(entry->ipv6_addr, ipv6, sizeof(entry->ipv6_addr))) {\n+\t\t\tentry->ref_count--;\n+\t\t\tif (entry->ref_count == 0) {\n+\t\t\t\tLIST_REMOVE(entry, next);\n+\t\t\t\trte_free(entry);\n+\t\t\t\trte_spinlock_unlock(&priv->ipv6_off_lock);\n+\t\t\t\treturn nfp_flower_cmsg_tun_off_v6(app_fw_flower);\n+\t\t\t}\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\trte_spinlock_unlock(&priv->ipv6_off_lock);\n+\n+\treturn 0;\n+}\n+\n static int\n nfp_tun_check_ip_off_del(struct nfp_flower_representor *repr,\n \t\tstruct rte_flow *nfp_flow)\n {\n \tint ret;\n+\tuint32_t key_layer2 = 0;\n \tstruct nfp_flower_ipv4_udp_tun *udp4;\n+\tstruct nfp_flower_ipv6_udp_tun *udp6;\n+\tstruct nfp_flower_meta_tci *meta_tci;\n+\tstruct nfp_flower_ext_meta *ext_meta = NULL;\n \n-\tudp4 = (struct nfp_flower_ipv4_udp_tun *)(nfp_flow->payload.mask_data -\n-\t\t\tsizeof(struct nfp_flower_ipv4_udp_tun));\n-\tret = nfp_tun_del_ipv4_off(repr->app_fw_flower, udp4->ipv4.dst);\n+\tmeta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data;\n+\tif (meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_EXT_META)\n+\t\text_meta = (struct nfp_flower_ext_meta *)(meta_tci + 1);\n+\n+\tif (ext_meta != NULL)\n+\t\tkey_layer2 = rte_be_to_cpu_32(ext_meta->nfp_flow_key_layer2);\n+\n+\tif (key_layer2 & NFP_FLOWER_LAYER2_TUN_IPV6) {\n+\t\tudp6 = (struct nfp_flower_ipv6_udp_tun *)(nfp_flow->payload.mask_data -\n+\t\t\t\tsizeof(struct nfp_flower_ipv6_udp_tun));\n+\t\tret = nfp_tun_del_ipv6_off(repr->app_fw_flower, udp6->ipv6.ipv6_dst);\n+\t} else {\n+\t\tudp4 = (struct nfp_flower_ipv4_udp_tun *)(nfp_flow->payload.mask_data -\n+\t\t\t\tsizeof(struct nfp_flower_ipv4_udp_tun));\n+\t\tret = nfp_tun_del_ipv4_off(repr->app_fw_flower, udp4->ipv4.dst);\n+\t}\n \n \treturn ret;\n }\n@@ -2078,6 +2157,59 @@ struct nfp_pre_tun_entry {\n \treturn nfp_flower_cmsg_tun_neigh_v6_rule(app_fw_flower, &payload);\n }\n \n+__rte_unused static int\n+nfp_flower_add_tun_neigh_v6_decap(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct rte_flow *nfp_flow)\n+{\n+\tstruct nfp_fl_tun *tmp;\n+\tstruct nfp_fl_tun *tun;\n+\tstruct nfp_flow_priv *priv;\n+\tstruct nfp_flower_ipv6 *ipv6;\n+\tstruct nfp_flower_mac_mpls *eth;\n+\tstruct nfp_flower_in_port *port;\n+\tstruct nfp_flower_meta_tci *meta_tci;\n+\tstruct nfp_flower_cmsg_tun_neigh_v6 payload;\n+\n+\tmeta_tci = (struct nfp_flower_meta_tci *)nfp_flow->payload.unmasked_data;\n+\tport = (struct nfp_flower_in_port *)(meta_tci + 1);\n+\teth = (struct nfp_flower_mac_mpls *)(port + 1);\n+\n+\tif (meta_tci->nfp_flow_key_layer & NFP_FLOWER_LAYER_TP)\n+\t\tipv6 = (struct nfp_flower_ipv6 *)((char *)eth +\n+\t\t\t\tsizeof(struct nfp_flower_mac_mpls) +\n+\t\t\t\tsizeof(struct nfp_flower_tp_ports));\n+\telse\n+\t\tipv6 = (struct nfp_flower_ipv6 *)((char *)eth +\n+\t\t\t\tsizeof(struct nfp_flower_mac_mpls));\n+\n+\ttun = &nfp_flow->tun;\n+\ttun->payload.v6_flag = 1;\n+\tmemcpy(tun->payload.dst.dst_ipv6, ipv6->ipv6_src, sizeof(tun->payload.dst.dst_ipv6));\n+\tmemcpy(tun->payload.src.src_ipv6, ipv6->ipv6_dst, sizeof(tun->payload.src.src_ipv6));\n+\tmemcpy(tun->payload.dst_addr, eth->mac_src, RTE_ETHER_ADDR_LEN);\n+\tmemcpy(tun->payload.src_addr, eth->mac_dst, RTE_ETHER_ADDR_LEN);\n+\n+\ttun->ref_cnt = 1;\n+\tpriv = app_fw_flower->flow_priv;\n+\tLIST_FOREACH(tmp, &priv->nn_list, next) {\n+\t\tif (memcmp(&tmp->payload, &tun->payload, sizeof(struct nfp_fl_tun_entry)) == 0) {\n+\t\t\ttmp->ref_cnt++;\n+\t\t\treturn 0;\n+\t\t}\n+\t}\n+\n+\tLIST_INSERT_HEAD(&priv->nn_list, tun, next);\n+\n+\tmemset(&payload, 0, sizeof(struct nfp_flower_cmsg_tun_neigh_v6));\n+\tmemcpy(payload.dst_ipv6, ipv6->ipv6_src, sizeof(payload.dst_ipv6));\n+\tmemcpy(payload.src_ipv6, ipv6->ipv6_dst, sizeof(payload.src_ipv6));\n+\tmemcpy(payload.common.dst_mac, eth->mac_src, RTE_ETHER_ADDR_LEN);\n+\tmemcpy(payload.common.src_mac, eth->mac_dst, RTE_ETHER_ADDR_LEN);\n+\tpayload.common.port_id = port->in_port;\n+\n+\treturn nfp_flower_cmsg_tun_neigh_v6_rule(app_fw_flower, &payload);\n+}\n+\n static int\n nfp_flower_del_tun_neigh_v6(struct nfp_app_fw_flower *app_fw_flower,\n \t\tuint8_t *ipv6)\n@@ -2401,6 +2533,9 @@ struct nfp_pre_tun_entry {\n \tnfp_mac_idx = (find_entry->mac_index << 8) |\n \t\t\tNFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT |\n \t\t\tNFP_TUN_PRE_TUN_IDX_BIT;\n+\tif (nfp_flow->tun.payload.v6_flag != 0)\n+\t\tnfp_mac_idx |= NFP_TUN_PRE_TUN_IPV6_BIT;\n+\n \tret = nfp_flower_cmsg_tun_mac_rule(repr->app_fw_flower, &repr->mac_addr,\n \t\t\tnfp_mac_idx, true);\n \tif (ret != 0) {\n@@ -3263,6 +3398,10 @@ struct nfp_pre_tun_entry {\n \trte_spinlock_init(&priv->ipv4_off_lock);\n \tLIST_INIT(&priv->ipv4_off_list);\n \n+\t/* ipv6 off list */\n+\trte_spinlock_init(&priv->ipv6_off_lock);\n+\tLIST_INIT(&priv->ipv6_off_list);\n+\n \t/* neighbor next list */\n \tLIST_INIT(&priv->nn_list);\n \ndiff --git a/drivers/net/nfp/nfp_flow.h b/drivers/net/nfp/nfp_flow.h\nindex f536da2..a6994e0 100644\n--- a/drivers/net/nfp/nfp_flow.h\n+++ b/drivers/net/nfp/nfp_flow.h\n@@ -177,6 +177,12 @@ struct nfp_ipv4_addr_entry {\n \tint ref_count;\n };\n \n+struct nfp_ipv6_addr_entry {\n+\tLIST_ENTRY(nfp_ipv6_addr_entry) next;\n+\tuint8_t ipv6_addr[16];\n+\tint ref_count;\n+};\n+\n #define NFP_TUN_PRE_TUN_RULE_LIMIT  32\n \n struct nfp_flow_priv {\n@@ -201,6 +207,9 @@ struct nfp_flow_priv {\n \t/* IPv4 off */\n \tLIST_HEAD(, nfp_ipv4_addr_entry) ipv4_off_list; /**< Store ipv4 off */\n \trte_spinlock_t ipv4_off_lock; /**< Lock the ipv4 off list */\n+\t/* IPv6 off */\n+\tLIST_HEAD(, nfp_ipv6_addr_entry) ipv6_off_list; /**< Store ipv6 off */\n+\trte_spinlock_t ipv6_off_lock; /**< Lock the ipv6 off list */\n \t/* neighbor next */\n \tLIST_HEAD(, nfp_fl_tun)nn_list; /**< Store nn entry */\n };\n",
    "prefixes": [
        "v2",
        "08/25"
    ]
}