get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 47668,
    "url": "http://patches.dpdk.org/api/patches/47668/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1541074741-41368-9-git-send-email-viacheslavo@mellanox.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": "<1541074741-41368-9-git-send-email-viacheslavo@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1541074741-41368-9-git-send-email-viacheslavo@mellanox.com",
    "date": "2018-11-01T12:19:30",
    "name": "[v3,08/13] net/mlx5: add VXLAN support to flow translate routine",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "de6da7c9960f25bf58482e45583723392d19f29e",
    "submitter": {
        "id": 1102,
        "url": "http://patches.dpdk.org/api/people/1102/?format=api",
        "name": "Slava Ovsiienko",
        "email": "viacheslavo@mellanox.com"
    },
    "delegate": {
        "id": 6624,
        "url": "http://patches.dpdk.org/api/users/6624/?format=api",
        "username": "shahafs",
        "first_name": "Shahaf",
        "last_name": "Shuler",
        "email": "shahafs@mellanox.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1541074741-41368-9-git-send-email-viacheslavo@mellanox.com/mbox/",
    "series": [
        {
            "id": 2204,
            "url": "http://patches.dpdk.org/api/series/2204/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=2204",
            "date": "2018-11-01T12:19:21",
            "name": "net/mlx5: e-switch VXLAN encap/decap hardware offload",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/2204/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/47668/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/47668/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id BB7E01B1FD;\n\tThu,  1 Nov 2018 13:19:39 +0100 (CET)",
            "from EUR03-AM5-obe.outbound.protection.outlook.com\n\t(mail-eopbgr30086.outbound.protection.outlook.com [40.107.3.86])\n\tby dpdk.org (Postfix) with ESMTP id 0E01C1B128\n\tfor <dev@dpdk.org>; Thu,  1 Nov 2018 13:19:32 +0100 (CET)",
            "from AM4PR05MB3265.eurprd05.prod.outlook.com (10.171.186.150) by\n\tAM4PR05MB1457.eurprd05.prod.outlook.com (10.164.79.27) with Microsoft\n\tSMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.1273.20; Thu, 1 Nov 2018 12:19:30 +0000",
            "from AM4PR05MB3265.eurprd05.prod.outlook.com\n\t([fe80::544b:a68d:e6a5:ba6e]) by\n\tAM4PR05MB3265.eurprd05.prod.outlook.com\n\t([fe80::544b:a68d:e6a5:ba6e%2]) with mapi id 15.20.1273.030;\n\tThu, 1 Nov 2018 12:19:30 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com;\n\ts=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=oT0ulev6lZibJHKOWQeaDk2XXvqLiv1yRGSXX8Bonh8=;\n\tb=FqVh/bJRnFEi1DIVZ1uhLLvXknEOKWc8OadLehvSsZdI1Gkk7kgO078Tlo5uBNTMcujRVGlJ7tuo7ThkcRKtXmvaL7NyczfhHSEb3i95oRIl1eLUKCJ8ZIeD0AyNPuwn4ZKBbmOYanrxh+hF3KUdFJkL+vy6iYKpA1ohqwA1Be8=",
        "From": "Slava Ovsiienko <viacheslavo@mellanox.com>",
        "To": "Shahaf Shuler <shahafs@mellanox.com>",
        "CC": "\"dev@dpdk.org\" <dev@dpdk.org>, Yongseok Koh <yskoh@mellanox.com>, Slava\n\tOvsiienko <viacheslavo@mellanox.com>",
        "Thread-Topic": "[PATCH v3 08/13] net/mlx5: add VXLAN support to flow translate\n\troutine",
        "Thread-Index": "AQHUcd0jQtdgEtvl4EaIlHcUNYyHRw==",
        "Date": "Thu, 1 Nov 2018 12:19:30 +0000",
        "Message-ID": "<1541074741-41368-9-git-send-email-viacheslavo@mellanox.com>",
        "References": "<1539612815-47199-1-git-send-email-viacheslavo@mellanox.com>\n\t<1541074741-41368-1-git-send-email-viacheslavo@mellanox.com>",
        "In-Reply-To": "<1541074741-41368-1-git-send-email-viacheslavo@mellanox.com>",
        "Accept-Language": "en-US",
        "Content-Language": "en-US",
        "X-MS-Has-Attach": "",
        "X-MS-TNEF-Correlator": "",
        "x-clientproxiedby": "LO2P265CA0079.GBRP265.PROD.OUTLOOK.COM\n\t(2603:10a6:600:8::19) To AM4PR05MB3265.eurprd05.prod.outlook.com\n\t(2603:10a6:205:4::22)",
        "authentication-results": "spf=none (sender IP is )\n\tsmtp.mailfrom=viacheslavo@mellanox.com; ",
        "x-ms-exchange-messagesentrepresentingtype": "1",
        "x-originating-ip": "[37.142.13.130]",
        "x-ms-publictraffictype": "Email",
        "x-microsoft-exchange-diagnostics": "1; AM4PR05MB1457;\n\t6:fP3gT5/7efCPY7OsbKmqtM192J9NX/YOkX5U2v34zQSMftXCwATlQ77Vpg5QUyDVxEpXtZCOLnQUt1EqEeqeGdRUoKJCSIjKB+J3HQ4udn3u5qmol4xSw/UVfEs6oKf/8MCSRuWKtmXMblNc+cjkR3m7P6ZtqNIbK84OpXUTkWmiiWOB/ka+u+ipTmL5xd8rQGapdWY61Lqa6qkETNmY6Ii/80Jhdk93hi/SVwTps9WjzQDF8J7kfe6evxJjz7OUF4OabdHTch3+utR+d/ELH0gl1FDn7qeuG3QJEu4BAak5PNFOsOAXQZevGtozuUzRJueZidhpIZ13UU/mS1oFfJprQVPBceZbaNn+O1ItI/rotPoQLvzg4eJ/qEy7HUbPqw83/qhtGnU6AAkRF1JAvIzycoMvXOIbzl7dZVg1O+ptuOSoOACA0WrWgjeBMGdxj7l/CX5GCzsCWrUH9pO7rw==;\n\t5:FgEIEU2fmkudIOqUOQSP3fpE+RNtxCrDHqHHsKXntP5f/xEG+wNqttDDA/PLQBXwiKF60R7ockoGRaFnDQVeX7CmueAbqH/a05WENFGwi2SxnPWzyGL2CnNDOBDA0nVYaGLGs9fGDFZGeHjFHLUJ4G3PYk/3nB1jjw2kEbsT6ow=;\n\t7:yHwKWXgRLWz6fKttIUGZstvsflg/LF++Q6X79+8fwsWvfvbiYzjdg7aQIGbNdDtGMUxwbtRPOdkZkSV9fAFVhP69sTz3sfXpjacqR+VvMq65fOHWHPdA1wPXB6m2cwQ10tBeQOGXNP0n4zV1BmODdw==",
        "x-ms-office365-filtering-correlation-id": "4c05045a-bd53-42d6-d799-08d63ff445db",
        "x-ms-office365-filtering-ht": "Tenant",
        "x-microsoft-antispam": "BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020);\n\tSRVR:AM4PR05MB1457; ",
        "x-ms-traffictypediagnostic": "AM4PR05MB1457:",
        "x-microsoft-antispam-prvs": "<AM4PR05MB1457599B1D2538394E7E9BABD2CE0@AM4PR05MB1457.eurprd05.prod.outlook.com>",
        "x-exchange-antispam-report-test": "UriScan:;",
        "x-ms-exchange-senderadcheck": "1",
        "x-exchange-antispam-report-cfa-test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3231382)(944501410)(52105095)(93006095)(93001095)(10201501046)(3002001)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(201708071742011)(7699051)(76991095);\n\tSRVR:AM4PR05MB1457; BCL:0; PCL:0; RULEID:; SRVR:AM4PR05MB1457; ",
        "x-forefront-prvs": "0843C17679",
        "x-forefront-antispam-report": "SFV:NSPM;\n\tSFS:(10009020)(376002)(396003)(39860400002)(346002)(136003)(366004)(199004)(189003)(11346002)(446003)(106356001)(476003)(105586002)(4326008)(97736004)(2616005)(478600001)(6636002)(5250100002)(99286004)(486006)(66066001)(6862004)(2900100001)(25786009)(37006003)(54906003)(5660300001)(316002)(8936002)(8676002)(81156014)(81166006)(4744004)(68736007)(7736002)(305945005)(3846002)(6116002)(76176011)(2906002)(102836004)(26005)(186003)(386003)(6506007)(107886003)(14454004)(6486002)(52116002)(53946003)(6512007)(53936002)(6436002)(36756003)(86362001)(575784001)(71190400001)(71200400001)(14444005)(256004)(579004);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:AM4PR05MB1457;\n\tH:AM4PR05MB3265.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en;\n\tPTR:InfoNoRecords; A:1; MX:1; ",
        "received-spf": "None (protection.outlook.com: mellanox.com does not designate\n\tpermitted sender hosts)",
        "x-microsoft-antispam-message-info": "guUuOZK5z9NJROyOwGa5dgpVhv9WFNfdch6NbcA8U5lm4bfX58RECSKRbUP5e4ATl1uQaN7IC/6q467ye00sJxVgvWYLDvCoNwaNtc+nEjKfOQifG61Moy5j/abRliIXZAD5YVrJVQ8BWpE/LTMLX6O04q5r768Yhc8um4+G7NZDLNgcIqkSTzNBovPo8n0AIqRqjcBSHy7+0UrO2WshLMK+Iol/KBENxjy0wmLFKFxe1yfTxwXLYWShNgAQ25MASbdN6OKKnpSyAn4exVAHxNCmtEdQymmyuaHT8n6lDq/Ct3mWEvYiVV1LxXnsGofrzIbhfnxg9/Sx+C2+u1ABleYAMb9Lj53ahWig3k7Tgww=",
        "spamdiagnosticoutput": "1:99",
        "spamdiagnosticmetadata": "NSPM",
        "Content-Type": "text/plain; charset=\"iso-8859-1\"",
        "Content-Transfer-Encoding": "quoted-printable",
        "MIME-Version": "1.0",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "4c05045a-bd53-42d6-d799-08d63ff445db",
        "X-MS-Exchange-CrossTenant-originalarrivaltime": "01 Nov 2018 12:19:30.0796\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-fromentityheader": "Hosted",
        "X-MS-Exchange-CrossTenant-id": "a652971c-7d2e-4d9b-a6a4-d149256f461b",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "AM4PR05MB1457",
        "Subject": "[dpdk-dev] [PATCH v3 08/13] net/mlx5: add VXLAN support to flow\n\ttranslate routine",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "This part of patchset adds support of VXLAN-related items and\nactions to the flow translation routine. Later some tunnel types,\nother than VXLAN can be addedd (GRE). No VTEP devices are created at\nthis point, the flow rule is just translated, not applied yet.\n\nSuggested-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>\nSigned-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>\n---\n drivers/net/mlx5/mlx5_flow_tcf.c | 535 ++++++++++++++++++++++++++++++++++-----\n 1 file changed, 472 insertions(+), 63 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5_flow_tcf.c b/drivers/net/mlx5/mlx5_flow_tcf.c\nindex b5be264..c404a63 100644\n--- a/drivers/net/mlx5/mlx5_flow_tcf.c\n+++ b/drivers/net/mlx5/mlx5_flow_tcf.c\n@@ -2020,8 +2020,8 @@ struct pedit_parser {\n \t\t\tif (ret < 0)\n \t\t\t\treturn ret;\n \t\t\titem_flags |= (item_flags & MLX5_FLOW_LAYER_TUNNEL) ?\n-\t\t\t\t\tMLX5_FLOW_LAYER_INNER_L2 :\n-\t\t\t\t\tMLX5_FLOW_LAYER_OUTER_L2;\n+\t\t\t\t\t\tMLX5_FLOW_LAYER_INNER_L2 :\n+\t\t\t\t\t\tMLX5_FLOW_LAYER_OUTER_L2;\n \t\t\t/* TODO:\n \t\t\t * Redundant check due to different supported mask.\n \t\t\t * Same for the rest of items.\n@@ -2179,7 +2179,7 @@ struct pedit_parser {\n \t\t\t\treturn -rte_errno;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_VXLAN:\n-\t\t\tif (!(action_flags & RTE_FLOW_ACTION_TYPE_VXLAN_DECAP))\n+\t\t\tif (!(action_flags & MLX5_FLOW_ACTION_VXLAN_DECAP))\n \t\t\t\treturn rte_flow_error_set\n \t\t\t\t\t(error, ENOTSUP,\n \t\t\t\t\t RTE_FLOW_ERROR_TYPE_ITEM,\n@@ -2762,6 +2762,241 @@ struct pedit_parser {\n }\n \n /**\n+ * Convert VXLAN VNI to 32-bit integer.\n+ *\n+ * @param[in] vni\n+ *   VXLAN VNI in 24-bit wire format.\n+ *\n+ * @return\n+ *   VXLAN VNI as a 32-bit integer value in network endian.\n+ */\n+static inline rte_be32_t\n+vxlan_vni_as_be32(const uint8_t vni[3])\n+{\n+\tunion {\n+\t\tuint8_t vni[4];\n+\t\trte_be32_t dword;\n+\t} ret = {\n+\t\t.vni = { 0, vni[0], vni[1], vni[2] },\n+\t};\n+\treturn ret.dword;\n+}\n+\n+/**\n+ * Helper function to process RTE_FLOW_ITEM_TYPE_ETH entry in configuration\n+ * of action RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP. Fills the MAC address fields\n+ * in the encapsulation parameters structure. The item must be prevalidated,\n+ * no any validation checks performed by function.\n+ *\n+ * @param[in] spec\n+ *   RTE_FLOW_ITEM_TYPE_ETH entry specification.\n+ * @param[in] mask\n+ *   RTE_FLOW_ITEM_TYPE_ETH entry mask.\n+ * @param[out] encap\n+ *   Structure to fill the gathered MAC address data.\n+ */\n+static void\n+flow_tcf_parse_vxlan_encap_eth(const struct rte_flow_item_eth *spec,\n+\t\t\t       const struct rte_flow_item_eth *mask,\n+\t\t\t       struct flow_tcf_vxlan_encap *encap)\n+{\n+\t/* Item must be validated before. No redundant checks. */\n+\tassert(spec);\n+\tif (!mask || !memcmp(&mask->dst,\n+\t\t\t     &rte_flow_item_eth_mask.dst,\n+\t\t\t     sizeof(rte_flow_item_eth_mask.dst))) {\n+\t\t/*\n+\t\t * Ethernet addresses are not supported by\n+\t\t * tc as tunnel_key parameters. Destination\n+\t\t * address is needed to form encap packet\n+\t\t * header and retrieved by kernel from\n+\t\t * implicit sources (ARP table, etc),\n+\t\t * address masks are not supported at all.\n+\t\t */\n+\t\tencap->eth.dst = spec->dst;\n+\t\tencap->mask |= FLOW_TCF_ENCAP_ETH_DST;\n+\t}\n+\tif (!mask || !memcmp(&mask->src,\n+\t\t\t     &rte_flow_item_eth_mask.src,\n+\t\t\t     sizeof(rte_flow_item_eth_mask.src))) {\n+\t\t/*\n+\t\t * Ethernet addresses are not supported by\n+\t\t * tc as tunnel_key parameters. Source ethernet\n+\t\t * address is ignored anyway.\n+\t\t */\n+\t\tencap->eth.src = spec->src;\n+\t\tencap->mask |= FLOW_TCF_ENCAP_ETH_SRC;\n+\t}\n+}\n+\n+/**\n+ * Helper function to process RTE_FLOW_ITEM_TYPE_IPV4 entry in configuration\n+ * of action RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP. Fills the IPV4 address fields\n+ * in the encapsulation parameters structure. The item must be prevalidated,\n+ * no any validation checks performed by function.\n+ *\n+ * @param[in] spec\n+ *   RTE_FLOW_ITEM_TYPE_IPV4 entry specification.\n+ * @param[out] encap\n+ *   Structure to fill the gathered IPV4 address data.\n+ */\n+static void\n+flow_tcf_parse_vxlan_encap_ipv4(const struct rte_flow_item_ipv4 *spec,\n+\t\t\t\tstruct flow_tcf_vxlan_encap *encap)\n+{\n+\t/* Item must be validated before. No redundant checks. */\n+\tassert(spec);\n+\tencap->ipv4.dst = spec->hdr.dst_addr;\n+\tencap->ipv4.src = spec->hdr.src_addr;\n+\tencap->mask |= FLOW_TCF_ENCAP_IPV4_SRC |\n+\t\t       FLOW_TCF_ENCAP_IPV4_DST;\n+}\n+\n+/**\n+ * Helper function to process RTE_FLOW_ITEM_TYPE_IPV6 entry in configuration\n+ * of action RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP. Fills the IPV6 address fields\n+ * in the encapsulation parameters structure. The item must be prevalidated,\n+ * no any validation checks performed by function.\n+ *\n+ * @param[in] spec\n+ *   RTE_FLOW_ITEM_TYPE_IPV6 entry specification.\n+ * @param[out] encap\n+ *   Structure to fill the gathered IPV6 address data.\n+ */\n+static void\n+flow_tcf_parse_vxlan_encap_ipv6(const struct rte_flow_item_ipv6 *spec,\n+\t\t\t\tstruct flow_tcf_vxlan_encap *encap)\n+{\n+\t/* Item must be validated before. No redundant checks. */\n+\tassert(spec);\n+\tmemcpy(encap->ipv6.dst, spec->hdr.dst_addr, sizeof(encap->ipv6.dst));\n+\tmemcpy(encap->ipv6.src, spec->hdr.src_addr, sizeof(encap->ipv6.src));\n+\tencap->mask |= FLOW_TCF_ENCAP_IPV6_SRC |\n+\t\t       FLOW_TCF_ENCAP_IPV6_DST;\n+}\n+\n+/**\n+ * Helper function to process RTE_FLOW_ITEM_TYPE_UDP entry in configuration\n+ * of action RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP. Fills the UDP port fields\n+ * in the encapsulation parameters structure. The item must be prevalidated,\n+ * no any validation checks performed by function.\n+ *\n+ * @param[in] spec\n+ *   RTE_FLOW_ITEM_TYPE_UDP entry specification.\n+ * @param[in] mask\n+ *   RTE_FLOW_ITEM_TYPE_UDP entry mask.\n+ * @param[out] encap\n+ *   Structure to fill the gathered UDP port data.\n+ */\n+static void\n+flow_tcf_parse_vxlan_encap_udp(const struct rte_flow_item_udp *spec,\n+\t\t\t       const struct rte_flow_item_udp *mask,\n+\t\t\t       struct flow_tcf_vxlan_encap *encap)\n+{\n+\tassert(spec);\n+\tencap->udp.dst = spec->hdr.dst_port;\n+\tencap->mask |= FLOW_TCF_ENCAP_UDP_DST;\n+\tif (!mask || mask->hdr.src_port != RTE_BE16(0x0000)) {\n+\t\tencap->udp.src = spec->hdr.src_port;\n+\t\tencap->mask |= FLOW_TCF_ENCAP_IPV4_SRC;\n+\t}\n+}\n+\n+/**\n+ * Helper function to process RTE_FLOW_ITEM_TYPE_VXLAN entry in configuration\n+ * of action RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP. Fills the VNI fields\n+ * in the encapsulation parameters structure. The item must be prevalidated,\n+ * no any validation checks performed by function.\n+ *\n+ * @param[in] spec\n+ *   RTE_FLOW_ITEM_TYPE_VXLAN entry specification.\n+ * @param[out] encap\n+ *   Structure to fill the gathered VNI address data.\n+ */\n+static void\n+flow_tcf_parse_vxlan_encap_vni(const struct rte_flow_item_vxlan *spec,\n+\t\t\t       struct flow_tcf_vxlan_encap *encap)\n+{\n+\t/* Item must be validated before. Do not redundant checks. */\n+\tassert(spec);\n+\tmemcpy(encap->vxlan.vni, spec->vni, sizeof(encap->vxlan.vni));\n+\tencap->mask |= FLOW_TCF_ENCAP_VXLAN_VNI;\n+}\n+\n+/**\n+ * Populate consolidated encapsulation object from list of pattern items.\n+ *\n+ * Helper function to process configuration of action such as\n+ * RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP. The item list should be\n+ * validated, there is no way to return an meaningful error.\n+ *\n+ * @param[in] action\n+ *   RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP action object.\n+ *   List of pattern items to gather data from.\n+ * @param[out] src\n+ *   Structure to fill gathered data.\n+ */\n+static void\n+flow_tcf_vxlan_encap_parse(const struct rte_flow_action *action,\n+\t\t\t   struct flow_tcf_vxlan_encap *encap)\n+{\n+\tunion {\n+\t\tconst struct rte_flow_item_eth *eth;\n+\t\tconst struct rte_flow_item_ipv4 *ipv4;\n+\t\tconst struct rte_flow_item_ipv6 *ipv6;\n+\t\tconst struct rte_flow_item_udp *udp;\n+\t\tconst struct rte_flow_item_vxlan *vxlan;\n+\t} spec, mask;\n+\tconst struct rte_flow_item *items;\n+\n+\tassert(action->type == RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP);\n+\tassert(action->conf);\n+\n+\titems = ((const struct rte_flow_action_vxlan_encap *)\n+\t\t\t\t\taction->conf)->definition;\n+\tassert(items);\n+\tfor (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {\n+\t\tswitch (items->type) {\n+\t\tcase RTE_FLOW_ITEM_TYPE_VOID:\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_ETH:\n+\t\t\tmask.eth = items->mask;\n+\t\t\tspec.eth = items->spec;\n+\t\t\tflow_tcf_parse_vxlan_encap_eth\n+\t\t\t\t\t\t(spec.eth, mask.eth, encap);\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_IPV4:\n+\t\t\tspec.ipv4 = items->spec;\n+\t\t\tflow_tcf_parse_vxlan_encap_ipv4(spec.ipv4, encap);\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_IPV6:\n+\t\t\tspec.ipv6 = items->spec;\n+\t\t\tflow_tcf_parse_vxlan_encap_ipv6(spec.ipv6, encap);\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_UDP:\n+\t\t\tmask.udp = items->mask;\n+\t\t\tspec.udp = items->spec;\n+\t\t\tflow_tcf_parse_vxlan_encap_udp\n+\t\t\t\t\t\t(spec.udp, mask.udp, encap);\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_VXLAN:\n+\t\t\tspec.vxlan = items->spec;\n+\t\t\tflow_tcf_parse_vxlan_encap_vni(spec.vxlan, encap);\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tassert(false);\n+\t\t\tDRV_LOG(WARNING,\n+\t\t\t\t\"unsupported item %p type %d,\"\n+\t\t\t\t\" items must be validated\"\n+\t\t\t\t\" before flow creation\",\n+\t\t\t\t(const void *)items, items->type);\n+\t\t\tencap->mask = 0;\n+\t\t\treturn;\n+\t\t}\n+\t}\n+}\n+\n+/**\n  * Translate flow for Linux TC flower and construct Netlink message.\n  *\n  * @param[in] priv\n@@ -2795,6 +3030,7 @@ struct pedit_parser {\n \t\tconst struct rte_flow_item_ipv6 *ipv6;\n \t\tconst struct rte_flow_item_tcp *tcp;\n \t\tconst struct rte_flow_item_udp *udp;\n+\t\tconst struct rte_flow_item_vxlan *vxlan;\n \t} spec, mask;\n \tunion {\n \t\tconst struct rte_flow_action_port_id *port_id;\n@@ -2805,6 +3041,14 @@ struct pedit_parser {\n \t\tconst struct rte_flow_action_of_set_vlan_pcp *\n \t\t\tof_set_vlan_pcp;\n \t} conf;\n+\tunion {\n+\t\tstruct flow_tcf_tunnel_hdr *hdr;\n+\t\tstruct flow_tcf_vxlan_decap *vxlan;\n+\t} decap;\n+\tunion {\n+\t\tstruct flow_tcf_tunnel_hdr *hdr;\n+\t\tstruct flow_tcf_vxlan_encap *vxlan;\n+\t} encap;\n \tstruct flow_tcf_ptoi ptoi[PTOI_TABLE_SZ_MAX(dev)];\n \tstruct nlmsghdr *nlh = dev_flow->tcf.nlh;\n \tstruct tcmsg *tcm = dev_flow->tcf.tcm;\n@@ -2822,6 +3066,16 @@ struct pedit_parser {\n \n \tclaim_nonzero(flow_tcf_build_ptoi_table(dev, ptoi,\n \t\t\t\t\t\tPTOI_TABLE_SZ_MAX(dev)));\n+\tencap.hdr = NULL;\n+\tdecap.hdr = NULL;\n+\tif (dev_flow->flow->actions & MLX5_FLOW_ACTION_VXLAN_ENCAP) {\n+\t\tencap.vxlan = dev_flow->tcf.vxlan_encap;\n+\t\tencap.vxlan->hdr.type = FLOW_TCF_TUNACT_VXLAN_ENCAP;\n+\t}\n+\tif (dev_flow->flow->actions & MLX5_FLOW_ACTION_VXLAN_DECAP) {\n+\t\tdecap.vxlan = dev_flow->tcf.vxlan_decap;\n+\t\tdecap.vxlan->hdr.type = FLOW_TCF_TUNACT_VXLAN_DECAP;\n+\t}\n \tnlh = dev_flow->tcf.nlh;\n \ttcm = dev_flow->tcf.tcm;\n \t/* Prepare API must have been called beforehand. */\n@@ -2839,7 +3093,6 @@ struct pedit_parser {\n \t\tmnl_attr_put_u32(nlh, TCA_CHAIN, attr->group);\n \tmnl_attr_put_strz(nlh, TCA_KIND, \"flower\");\n \tna_flower = mnl_attr_nest_start(nlh, TCA_OPTIONS);\n-\tmnl_attr_put_u32(nlh, TCA_FLOWER_FLAGS, TCA_CLS_FLAGS_SKIP_SW);\n \tfor (; items->type != RTE_FLOW_ITEM_TYPE_END; items++) {\n \t\tunsigned int i;\n \n@@ -2867,7 +3120,9 @@ struct pedit_parser {\n \t\t\ttcm->tcm_ifindex = ptoi[i].ifindex;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_ETH:\n-\t\t\titem_flags |= MLX5_FLOW_LAYER_OUTER_L2;\n+\t\t\titem_flags |= (item_flags & MLX5_FLOW_LAYER_VXLAN) ?\n+\t\t\t\t\t\tMLX5_FLOW_LAYER_INNER_L2 :\n+\t\t\t\t\t\tMLX5_FLOW_LAYER_OUTER_L2;\n \t\t\tmask.eth = flow_tcf_item_mask\n \t\t\t\t(items, &rte_flow_item_eth_mask,\n \t\t\t\t &flow_tcf_mask_supported.eth,\n@@ -2878,6 +3133,14 @@ struct pedit_parser {\n \t\t\tif (mask.eth == &flow_tcf_mask_empty.eth)\n \t\t\t\tbreak;\n \t\t\tspec.eth = items->spec;\n+\t\t\tif (decap.vxlan &&\n+\t\t\t    !(item_flags & MLX5_FLOW_LAYER_VXLAN)) {\n+\t\t\t\tDRV_LOG(WARNING,\n+\t\t\t\t\t\"outer L2 addresses cannot be forced\"\n+\t\t\t\t\t\" for vxlan decapsulation, parameter\"\n+\t\t\t\t\t\" ignored\");\n+\t\t\t\tbreak;\n+\t\t\t}\n \t\t\tif (mask.eth->type) {\n \t\t\t\tmnl_attr_put_u16(nlh, TCA_FLOWER_KEY_ETH_TYPE,\n \t\t\t\t\t\t spec.eth->type);\n@@ -2899,8 +3162,11 @@ struct pedit_parser {\n \t\t\t\t\t     ETHER_ADDR_LEN,\n \t\t\t\t\t     mask.eth->src.addr_bytes);\n \t\t\t}\n+\t\t\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_VLAN:\n+\t\t\tassert(!encap.hdr);\n+\t\t\tassert(!decap.hdr);\n \t\t\titem_flags |= MLX5_FLOW_LAYER_OUTER_VLAN;\n \t\t\tmask.vlan = flow_tcf_item_mask\n \t\t\t\t(items, &rte_flow_item_vlan_mask,\n@@ -2932,6 +3198,7 @@ struct pedit_parser {\n \t\t\t\t\t\t rte_be_to_cpu_16\n \t\t\t\t\t\t (spec.vlan->tci &\n \t\t\t\t\t\t  RTE_BE16(0x0fff)));\n+\t\t\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_IPV4:\n \t\t\titem_flags |= MLX5_FLOW_LAYER_OUTER_L3_IPV4;\n@@ -2942,36 +3209,52 @@ struct pedit_parser {\n \t\t\t\t sizeof(flow_tcf_mask_supported.ipv4),\n \t\t\t\t error);\n \t\t\tassert(mask.ipv4);\n-\t\t\tif (!eth_type_set || !vlan_eth_type_set)\n-\t\t\t\tmnl_attr_put_u16(nlh,\n+\t\t\tspec.ipv4 = items->spec;\n+\t\t\tif (!decap.vxlan) {\n+\t\t\t\tif (!eth_type_set && !vlan_eth_type_set)\n+\t\t\t\t\tmnl_attr_put_u16(nlh,\n \t\t\t\t\t\t vlan_present ?\n \t\t\t\t\t\t TCA_FLOWER_KEY_VLAN_ETH_TYPE :\n \t\t\t\t\t\t TCA_FLOWER_KEY_ETH_TYPE,\n \t\t\t\t\t\t RTE_BE16(ETH_P_IP));\n-\t\t\teth_type_set = 1;\n-\t\t\tvlan_eth_type_set = 1;\n-\t\t\tif (mask.ipv4 == &flow_tcf_mask_empty.ipv4)\n-\t\t\t\tbreak;\n-\t\t\tspec.ipv4 = items->spec;\n-\t\t\tif (mask.ipv4->hdr.next_proto_id) {\n-\t\t\t\tmnl_attr_put_u8(nlh, TCA_FLOWER_KEY_IP_PROTO,\n-\t\t\t\t\t\tspec.ipv4->hdr.next_proto_id);\n-\t\t\t\tip_proto_set = 1;\n+\t\t\t\teth_type_set = 1;\n+\t\t\t\tvlan_eth_type_set = 1;\n+\t\t\t\tif (mask.ipv4 == &flow_tcf_mask_empty.ipv4)\n+\t\t\t\t\tbreak;\n+\t\t\t\tif (mask.ipv4->hdr.next_proto_id) {\n+\t\t\t\t\tmnl_attr_put_u8\n+\t\t\t\t\t\t(nlh, TCA_FLOWER_KEY_IP_PROTO,\n+\t\t\t\t\t\t spec.ipv4->hdr.next_proto_id);\n+\t\t\t\t\tip_proto_set = 1;\n+\t\t\t\t}\n+\t\t\t} else {\n+\t\t\t\tassert(mask.ipv4 != &flow_tcf_mask_empty.ipv4);\n \t\t\t}\n \t\t\tif (mask.ipv4->hdr.src_addr) {\n-\t\t\t\tmnl_attr_put_u32(nlh, TCA_FLOWER_KEY_IPV4_SRC,\n-\t\t\t\t\t\t spec.ipv4->hdr.src_addr);\n-\t\t\t\tmnl_attr_put_u32(nlh,\n-\t\t\t\t\t\t TCA_FLOWER_KEY_IPV4_SRC_MASK,\n-\t\t\t\t\t\t mask.ipv4->hdr.src_addr);\n+\t\t\t\tmnl_attr_put_u32\n+\t\t\t\t\t(nlh, decap.vxlan ?\n+\t\t\t\t\t TCA_FLOWER_KEY_ENC_IPV4_SRC :\n+\t\t\t\t\t TCA_FLOWER_KEY_IPV4_SRC,\n+\t\t\t\t\t spec.ipv4->hdr.src_addr);\n+\t\t\t\tmnl_attr_put_u32\n+\t\t\t\t\t(nlh, decap.vxlan ?\n+\t\t\t\t\t TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK :\n+\t\t\t\t\t TCA_FLOWER_KEY_IPV4_SRC_MASK,\n+\t\t\t\t\t mask.ipv4->hdr.src_addr);\n \t\t\t}\n \t\t\tif (mask.ipv4->hdr.dst_addr) {\n-\t\t\t\tmnl_attr_put_u32(nlh, TCA_FLOWER_KEY_IPV4_DST,\n-\t\t\t\t\t\t spec.ipv4->hdr.dst_addr);\n-\t\t\t\tmnl_attr_put_u32(nlh,\n-\t\t\t\t\t\t TCA_FLOWER_KEY_IPV4_DST_MASK,\n-\t\t\t\t\t\t mask.ipv4->hdr.dst_addr);\n+\t\t\t\tmnl_attr_put_u32\n+\t\t\t\t\t(nlh, decap.vxlan ?\n+\t\t\t\t\t TCA_FLOWER_KEY_ENC_IPV4_DST :\n+\t\t\t\t\t TCA_FLOWER_KEY_IPV4_DST,\n+\t\t\t\t\t spec.ipv4->hdr.dst_addr);\n+\t\t\t\tmnl_attr_put_u32\n+\t\t\t\t\t(nlh, decap.vxlan ?\n+\t\t\t\t\t TCA_FLOWER_KEY_ENC_IPV4_DST_MASK :\n+\t\t\t\t\t TCA_FLOWER_KEY_IPV4_DST_MASK,\n+\t\t\t\t\t mask.ipv4->hdr.dst_addr);\n \t\t\t}\n+\t\t\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_IPV6:\n \t\t\titem_flags |= MLX5_FLOW_LAYER_OUTER_L3_IPV6;\n@@ -2982,38 +3265,53 @@ struct pedit_parser {\n \t\t\t\t sizeof(flow_tcf_mask_supported.ipv6),\n \t\t\t\t error);\n \t\t\tassert(mask.ipv6);\n-\t\t\tif (!eth_type_set || !vlan_eth_type_set)\n-\t\t\t\tmnl_attr_put_u16(nlh,\n-\t\t\t\t\t\t vlan_present ?\n-\t\t\t\t\t\t TCA_FLOWER_KEY_VLAN_ETH_TYPE :\n-\t\t\t\t\t\t TCA_FLOWER_KEY_ETH_TYPE,\n-\t\t\t\t\t\t RTE_BE16(ETH_P_IPV6));\n-\t\t\teth_type_set = 1;\n-\t\t\tvlan_eth_type_set = 1;\n-\t\t\tif (mask.ipv6 == &flow_tcf_mask_empty.ipv6)\n-\t\t\t\tbreak;\n \t\t\tspec.ipv6 = items->spec;\n-\t\t\tif (mask.ipv6->hdr.proto) {\n-\t\t\t\tmnl_attr_put_u8(nlh, TCA_FLOWER_KEY_IP_PROTO,\n-\t\t\t\t\t\tspec.ipv6->hdr.proto);\n-\t\t\t\tip_proto_set = 1;\n+\t\t\tif (!decap.vxlan) {\n+\t\t\t\tif (!eth_type_set || !vlan_eth_type_set) {\n+\t\t\t\t\tmnl_attr_put_u16(nlh,\n+\t\t\t\t\t\tvlan_present ?\n+\t\t\t\t\t\tTCA_FLOWER_KEY_VLAN_ETH_TYPE :\n+\t\t\t\t\t\tTCA_FLOWER_KEY_ETH_TYPE,\n+\t\t\t\t\t\tRTE_BE16(ETH_P_IPV6));\n+\t\t\t\t}\n+\t\t\t\teth_type_set = 1;\n+\t\t\t\tvlan_eth_type_set = 1;\n+\t\t\t\tif (mask.ipv6 == &flow_tcf_mask_empty.ipv6)\n+\t\t\t\t\tbreak;\n+\t\t\t\tif (mask.ipv6->hdr.proto) {\n+\t\t\t\t\tmnl_attr_put_u8\n+\t\t\t\t\t\t(nlh, TCA_FLOWER_KEY_IP_PROTO,\n+\t\t\t\t\t\t spec.ipv6->hdr.proto);\n+\t\t\t\t\tip_proto_set = 1;\n+\t\t\t\t}\n+\t\t\t} else {\n+\t\t\t\tassert(mask.ipv6 != &flow_tcf_mask_empty.ipv6);\n \t\t\t}\n \t\t\tif (!IN6_IS_ADDR_UNSPECIFIED(mask.ipv6->hdr.src_addr)) {\n-\t\t\t\tmnl_attr_put(nlh, TCA_FLOWER_KEY_IPV6_SRC,\n-\t\t\t\t\t     sizeof(spec.ipv6->hdr.src_addr),\n+\t\t\t\tmnl_attr_put(nlh, decap.vxlan ?\n+\t\t\t\t\t     TCA_FLOWER_KEY_ENC_IPV6_SRC :\n+\t\t\t\t\t     TCA_FLOWER_KEY_IPV6_SRC,\n+\t\t\t\t\t     IPV6_ADDR_LEN,\n \t\t\t\t\t     spec.ipv6->hdr.src_addr);\n-\t\t\t\tmnl_attr_put(nlh, TCA_FLOWER_KEY_IPV6_SRC_MASK,\n-\t\t\t\t\t     sizeof(mask.ipv6->hdr.src_addr),\n+\t\t\t\tmnl_attr_put(nlh, decap.vxlan ?\n+\t\t\t\t\t     TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK :\n+\t\t\t\t\t     TCA_FLOWER_KEY_IPV6_SRC_MASK,\n+\t\t\t\t\t     IPV6_ADDR_LEN,\n \t\t\t\t\t     mask.ipv6->hdr.src_addr);\n \t\t\t}\n \t\t\tif (!IN6_IS_ADDR_UNSPECIFIED(mask.ipv6->hdr.dst_addr)) {\n-\t\t\t\tmnl_attr_put(nlh, TCA_FLOWER_KEY_IPV6_DST,\n-\t\t\t\t\t     sizeof(spec.ipv6->hdr.dst_addr),\n+\t\t\t\tmnl_attr_put(nlh, decap.vxlan ?\n+\t\t\t\t\t     TCA_FLOWER_KEY_ENC_IPV6_DST :\n+\t\t\t\t\t     TCA_FLOWER_KEY_IPV6_DST,\n+\t\t\t\t\t     IPV6_ADDR_LEN,\n \t\t\t\t\t     spec.ipv6->hdr.dst_addr);\n-\t\t\t\tmnl_attr_put(nlh, TCA_FLOWER_KEY_IPV6_DST_MASK,\n-\t\t\t\t\t     sizeof(mask.ipv6->hdr.dst_addr),\n+\t\t\t\tmnl_attr_put(nlh, decap.vxlan ?\n+\t\t\t\t\t     TCA_FLOWER_KEY_ENC_IPV6_DST_MASK :\n+\t\t\t\t\t     TCA_FLOWER_KEY_IPV6_DST_MASK,\n+\t\t\t\t\t     IPV6_ADDR_LEN,\n \t\t\t\t\t     mask.ipv6->hdr.dst_addr);\n \t\t\t}\n+\t\t\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_UDP:\n \t\t\titem_flags |= MLX5_FLOW_LAYER_OUTER_L4_UDP;\n@@ -3024,26 +3322,45 @@ struct pedit_parser {\n \t\t\t\t sizeof(flow_tcf_mask_supported.udp),\n \t\t\t\t error);\n \t\t\tassert(mask.udp);\n-\t\t\tif (!ip_proto_set)\n-\t\t\t\tmnl_attr_put_u8(nlh, TCA_FLOWER_KEY_IP_PROTO,\n-\t\t\t\t\t\tIPPROTO_UDP);\n-\t\t\tif (mask.udp == &flow_tcf_mask_empty.udp)\n-\t\t\t\tbreak;\n \t\t\tspec.udp = items->spec;\n+\t\t\tif (!decap.vxlan) {\n+\t\t\t\tif (!ip_proto_set)\n+\t\t\t\t\tmnl_attr_put_u8\n+\t\t\t\t\t\t(nlh, TCA_FLOWER_KEY_IP_PROTO,\n+\t\t\t\t\t\tIPPROTO_UDP);\n+\t\t\t\tif (mask.udp == &flow_tcf_mask_empty.udp)\n+\t\t\t\t\tbreak;\n+\t\t\t} else {\n+\t\t\t\tassert(mask.udp != &flow_tcf_mask_empty.udp);\n+\t\t\t\tdecap.vxlan->udp_port =\n+\t\t\t\t\trte_be_to_cpu_16\n+\t\t\t\t\t\t(spec.udp->hdr.dst_port);\n+\t\t\t}\n \t\t\tif (mask.udp->hdr.src_port) {\n-\t\t\t\tmnl_attr_put_u16(nlh, TCA_FLOWER_KEY_UDP_SRC,\n-\t\t\t\t\t\t spec.udp->hdr.src_port);\n-\t\t\t\tmnl_attr_put_u16(nlh,\n-\t\t\t\t\t\t TCA_FLOWER_KEY_UDP_SRC_MASK,\n-\t\t\t\t\t\t mask.udp->hdr.src_port);\n+\t\t\t\tmnl_attr_put_u16\n+\t\t\t\t\t(nlh, decap.vxlan ?\n+\t\t\t\t\t TCA_FLOWER_KEY_ENC_UDP_SRC_PORT :\n+\t\t\t\t\t TCA_FLOWER_KEY_UDP_SRC,\n+\t\t\t\t\t spec.udp->hdr.src_port);\n+\t\t\t\tmnl_attr_put_u16\n+\t\t\t\t\t(nlh, decap.vxlan ?\n+\t\t\t\t\t TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK :\n+\t\t\t\t\t TCA_FLOWER_KEY_UDP_SRC_MASK,\n+\t\t\t\t\t mask.udp->hdr.src_port);\n \t\t\t}\n \t\t\tif (mask.udp->hdr.dst_port) {\n-\t\t\t\tmnl_attr_put_u16(nlh, TCA_FLOWER_KEY_UDP_DST,\n-\t\t\t\t\t\t spec.udp->hdr.dst_port);\n-\t\t\t\tmnl_attr_put_u16(nlh,\n-\t\t\t\t\t\t TCA_FLOWER_KEY_UDP_DST_MASK,\n-\t\t\t\t\t\t mask.udp->hdr.dst_port);\n+\t\t\t\tmnl_attr_put_u16\n+\t\t\t\t\t(nlh, decap.vxlan ?\n+\t\t\t\t\t TCA_FLOWER_KEY_ENC_UDP_DST_PORT :\n+\t\t\t\t\t TCA_FLOWER_KEY_UDP_DST,\n+\t\t\t\t\t spec.udp->hdr.dst_port);\n+\t\t\t\tmnl_attr_put_u16\n+\t\t\t\t\t(nlh, decap.vxlan ?\n+\t\t\t\t\t TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK :\n+\t\t\t\t\t TCA_FLOWER_KEY_UDP_DST_MASK,\n+\t\t\t\t\t mask.udp->hdr.dst_port);\n \t\t\t}\n+\t\t\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_TCP:\n \t\t\titem_flags |= MLX5_FLOW_LAYER_OUTER_L4_TCP;\n@@ -3086,6 +3403,16 @@ struct pedit_parser {\n \t\t\t\t\t rte_cpu_to_be_16\n \t\t\t\t\t\t(mask.tcp->hdr.tcp_flags));\n \t\t\t}\n+\t\t\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_VXLAN:\n+\t\t\tassert(decap.vxlan);\n+\t\t\titem_flags |= MLX5_FLOW_LAYER_VXLAN;\n+\t\t\tspec.vxlan = items->spec;\n+\t\t\tmnl_attr_put_u32(nlh,\n+\t\t\t\t\t TCA_FLOWER_KEY_ENC_KEY_ID,\n+\t\t\t\t\t vxlan_vni_as_be32(spec.vxlan->vni));\n+\t\t\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n \t\t\tbreak;\n \t\tdefault:\n \t\t\treturn rte_flow_error_set(error, ENOTSUP,\n@@ -3119,6 +3446,14 @@ struct pedit_parser {\n \t\t\tmnl_attr_put_strz(nlh, TCA_ACT_KIND, \"mirred\");\n \t\t\tna_act = mnl_attr_nest_start(nlh, TCA_ACT_OPTIONS);\n \t\t\tassert(na_act);\n+\t\t\tif (encap.hdr) {\n+\t\t\t\tassert(dev_flow->tcf.tunnel);\n+\t\t\t\tdev_flow->tcf.tunnel->ifindex_ptr =\n+\t\t\t\t\t&((struct tc_mirred *)\n+\t\t\t\t\tmnl_attr_get_payload\n+\t\t\t\t\t(mnl_nlmsg_get_payload_tail\n+\t\t\t\t\t\t(nlh)))->ifindex;\n+\t\t\t}\n \t\t\tmnl_attr_put(nlh, TCA_MIRRED_PARMS,\n \t\t\t\t     sizeof(struct tc_mirred),\n \t\t\t\t     &(struct tc_mirred){\n@@ -3236,6 +3571,74 @@ struct pedit_parser {\n \t\t\t\t\tconf.of_set_vlan_pcp->vlan_pcp;\n \t\t\t}\n \t\t\tbreak;\n+\t\tcase RTE_FLOW_ACTION_TYPE_VXLAN_DECAP:\n+\t\t\tassert(decap.vxlan);\n+\t\t\tassert(dev_flow->tcf.tunnel);\n+\t\t\tdev_flow->tcf.tunnel->ifindex_ptr =\n+\t\t\t\t(unsigned int *)&tcm->tcm_ifindex;\n+\t\t\tna_act_index =\n+\t\t\t\tmnl_attr_nest_start(nlh, na_act_index_cur++);\n+\t\t\tassert(na_act_index);\n+\t\t\tmnl_attr_put_strz(nlh, TCA_ACT_KIND, \"tunnel_key\");\n+\t\t\tna_act = mnl_attr_nest_start(nlh, TCA_ACT_OPTIONS);\n+\t\t\tassert(na_act);\n+\t\t\tmnl_attr_put(nlh, TCA_TUNNEL_KEY_PARMS,\n+\t\t\t\tsizeof(struct tc_tunnel_key),\n+\t\t\t\t&(struct tc_tunnel_key){\n+\t\t\t\t\t.action = TC_ACT_PIPE,\n+\t\t\t\t\t.t_action = TCA_TUNNEL_KEY_ACT_RELEASE,\n+\t\t\t\t\t});\n+\t\t\tmnl_attr_nest_end(nlh, na_act);\n+\t\t\tmnl_attr_nest_end(nlh, na_act_index);\n+\t\t\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ACTION_TYPE_VXLAN_ENCAP:\n+\t\t\tassert(encap.vxlan);\n+\t\t\tflow_tcf_vxlan_encap_parse(actions, encap.vxlan);\n+\t\t\tna_act_index =\n+\t\t\t\tmnl_attr_nest_start(nlh, na_act_index_cur++);\n+\t\t\tassert(na_act_index);\n+\t\t\tmnl_attr_put_strz(nlh, TCA_ACT_KIND, \"tunnel_key\");\n+\t\t\tna_act = mnl_attr_nest_start(nlh, TCA_ACT_OPTIONS);\n+\t\t\tassert(na_act);\n+\t\t\tmnl_attr_put(nlh, TCA_TUNNEL_KEY_PARMS,\n+\t\t\t\tsizeof(struct tc_tunnel_key),\n+\t\t\t\t&(struct tc_tunnel_key){\n+\t\t\t\t\t.action = TC_ACT_PIPE,\n+\t\t\t\t\t.t_action = TCA_TUNNEL_KEY_ACT_SET,\n+\t\t\t\t\t});\n+\t\t\tif (encap.vxlan->mask & FLOW_TCF_ENCAP_UDP_DST)\n+\t\t\t\tmnl_attr_put_u16(nlh,\n+\t\t\t\t\t TCA_TUNNEL_KEY_ENC_DST_PORT,\n+\t\t\t\t\t encap.vxlan->udp.dst);\n+\t\t\tif (encap.vxlan->mask & FLOW_TCF_ENCAP_IPV4_SRC)\n+\t\t\t\tmnl_attr_put_u32(nlh,\n+\t\t\t\t\t TCA_TUNNEL_KEY_ENC_IPV4_SRC,\n+\t\t\t\t\t encap.vxlan->ipv4.src);\n+\t\t\tif (encap.vxlan->mask & FLOW_TCF_ENCAP_IPV4_DST)\n+\t\t\t\tmnl_attr_put_u32(nlh,\n+\t\t\t\t\t TCA_TUNNEL_KEY_ENC_IPV4_DST,\n+\t\t\t\t\t encap.vxlan->ipv4.dst);\n+\t\t\tif (encap.vxlan->mask & FLOW_TCF_ENCAP_IPV6_SRC)\n+\t\t\t\tmnl_attr_put(nlh,\n+\t\t\t\t\t TCA_TUNNEL_KEY_ENC_IPV6_SRC,\n+\t\t\t\t\t sizeof(encap.vxlan->ipv6.src),\n+\t\t\t\t\t &encap.vxlan->ipv6.src);\n+\t\t\tif (encap.vxlan->mask & FLOW_TCF_ENCAP_IPV6_DST)\n+\t\t\t\tmnl_attr_put(nlh,\n+\t\t\t\t\t TCA_TUNNEL_KEY_ENC_IPV6_DST,\n+\t\t\t\t\t sizeof(encap.vxlan->ipv6.dst),\n+\t\t\t\t\t &encap.vxlan->ipv6.dst);\n+\t\t\tif (encap.vxlan->mask & FLOW_TCF_ENCAP_VXLAN_VNI)\n+\t\t\t\tmnl_attr_put_u32(nlh,\n+\t\t\t\t\t TCA_TUNNEL_KEY_ENC_KEY_ID,\n+\t\t\t\t\t vxlan_vni_as_be32\n+\t\t\t\t\t\t(encap.vxlan->vxlan.vni));\n+\t\t\tmnl_attr_put_u8(nlh, TCA_TUNNEL_KEY_NO_CSUM, 0);\n+\t\t\tmnl_attr_nest_end(nlh, na_act);\n+\t\t\tmnl_attr_nest_end(nlh, na_act_index);\n+\t\t\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n+\t\t\tbreak;\n \t\tcase RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC:\n \t\tcase RTE_FLOW_ACTION_TYPE_SET_IPV4_DST:\n \t\tcase RTE_FLOW_ACTION_TYPE_SET_IPV6_SRC:\n@@ -3262,7 +3665,13 @@ struct pedit_parser {\n \tassert(na_flower);\n \tassert(na_flower_act);\n \tmnl_attr_nest_end(nlh, na_flower_act);\n+\tmnl_attr_put_u32(nlh, TCA_FLOWER_FLAGS,\n+\t\tdecap.vxlan ? 0 : TCA_CLS_FLAGS_SKIP_SW);\n \tmnl_attr_nest_end(nlh, na_flower);\n+\tif (dev_flow->tcf.tunnel && dev_flow->tcf.tunnel->ifindex_ptr)\n+\t\tdev_flow->tcf.tunnel->ifindex_org =\n+\t\t\t*dev_flow->tcf.tunnel->ifindex_ptr;\n+\tassert(dev_flow->tcf.nlsize >= nlh->nlmsg_len);\n \treturn 0;\n }\n \n",
    "prefixes": [
        "v3",
        "08/13"
    ]
}