get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 76157,
    "url": "http://patches.dpdk.org/api/patches/76157/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200830111544.4190-8-wisamm@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": "<20200830111544.4190-8-wisamm@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200830111544.4190-8-wisamm@mellanox.com",
    "date": "2020-08-30T11:15:38",
    "name": "[07/13] app/flow-perf: add raw encap/decap actions support",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "bb335178c28c77b73b83a1a5179f7873f80c2bcd",
    "submitter": {
        "id": 938,
        "url": "http://patches.dpdk.org/api/people/938/?format=api",
        "name": "Wisam Jaddo",
        "email": "wisamm@mellanox.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/20200830111544.4190-8-wisamm@mellanox.com/mbox/",
    "series": [
        {
            "id": 11848,
            "url": "http://patches.dpdk.org/api/series/11848/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11848",
            "date": "2020-08-30T11:15:31",
            "name": "app/flow-perf: add support for new items/actions",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/11848/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/76157/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/76157/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 590BFA04AB;\n\tSun, 30 Aug 2020 13:21:33 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 3EDC51C0DB;\n\tSun, 30 Aug 2020 13:16:35 +0200 (CEST)",
            "from EUR02-AM5-obe.outbound.protection.outlook.com\n (mail-eopbgr00041.outbound.protection.outlook.com [40.107.0.41])\n by dpdk.org (Postfix) with ESMTP id A204E1C0C3\n for <dev@dpdk.org>; Sun, 30 Aug 2020 13:16:30 +0200 (CEST)",
            "from AM0PR05MB6610.eurprd05.prod.outlook.com (2603:10a6:208:12f::18)\n by AM0PR0502MB3762.eurprd05.prod.outlook.com (2603:10a6:208:1b::31)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3326.21; Sun, 30 Aug\n 2020 11:16:29 +0000",
            "from AM0PR05MB6610.eurprd05.prod.outlook.com\n ([fe80::4c8a:9848:2e2a:3598]) by AM0PR05MB6610.eurprd05.prod.outlook.com\n ([fe80::4c8a:9848:2e2a:3598%6]) with mapi id 15.20.3326.025; Sun, 30 Aug 2020\n 11:16:29 +0000",
            "from mellanox.com (37.142.13.130) by\n AM4PR05CA0008.eurprd05.prod.outlook.com (2603:10a6:205::21) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.3326.19 via Frontend Transport; Sun, 30 Aug 2020 11:16:28 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=CLFFxVIfemSPIG7s4jPgQgbP+vR2+DySORTq5R6kSa3MJdmQ3a+DSfmfbzfc0ORwFgieL1s5+W7g6xxml4IHMjqZKE0DoNlKqrqbL0KqR/kiaTM/kaegu5hnmXXZ4S4EPNCCmxxXVHNwsqtHcGJ1IRu2uYH4REW9Z4/1hmEEz+SzZurp3fN5iy3ZhlBErKMTL/Zkp52DNQ+X6+9PeDgpE20woMJbY0XtOGo+wtP0J9Ht26IOgruVLveX/FajSYTTC828pHxQ26kikhYXj/G+tY5qwiTvovbrqAFZQKCz0iC31DBm/bBk3FD1fZ/l+O8BtBUYaX4CSGsCff4sPl3w3g==",
        "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-SenderADCheck;\n bh=6YF1O/vo64bUNxC1M43ESjx7E2Aw51/jJEkpEjDT8qw=;\n b=GkWpkzwJvLMC0wBpl4lydGNMY9ANsnfDUR4mG6ZhvQtNkqYLfjhPyRoOqpY+26td86wSAOmx6U1SxpyzAaaeqpcGaJkhsGxRljd6cb8BvAJ8scdXYOuklw04EouS2t1mHSWEWeMb74CYvGpO2Jw3WhCNr3hdVhVPF2KHXjsuHw5B5LhTcsxXa2gjmncq2GFWNa+XTXyUZeuLtMNUANzxeIINPWPeWH6TSCG9YkKEyCtJjGFXc5c1FWbfglmmcjOBrIOeqXfCfor3ZqTgM5BBlrTb8uRTp9ucp0Ol6b4bx2BIbQhBboyf/gRo+z+gN29/NNcjfEx0ipe/9M0ccra5/A==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=mellanox.com; dmarc=pass action=none header.from=mellanox.com;\n dkim=pass header.d=mellanox.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=6YF1O/vo64bUNxC1M43ESjx7E2Aw51/jJEkpEjDT8qw=;\n b=Ru6zyIr1CGARRH+9TZlY9ACjKq1O1gHmg2FguuMAocIFd/ZBRxFxLWn03FqemOiQGDfQYkP9hKYiWbyQgurGOzIV6Y2oS8xEp8FXoHRVtlEDjOOVsqbG3qsO+j+K2ytTEHIzotwh41Pc1OXVJj90KPOagV0wSTDVmlbUPV9LMf0=",
        "Authentication-Results": "dpdk.org; dkim=none (message not signed)\n header.d=none;dpdk.org; dmarc=none action=none header.from=mellanox.com;",
        "From": "Wisam Jaddo <wisamm@mellanox.com>",
        "To": "dev@dpdk.org, thomas@monjalon.net, asafp@mellanox.com,\n akozyrev@nvidia.com,\n akozyrev@mellanox.com, arybchenko@solarflare.com, jackmin@mellanox.com",
        "Date": "Sun, 30 Aug 2020 11:15:38 +0000",
        "Message-Id": "<20200830111544.4190-8-wisamm@mellanox.com>",
        "X-Mailer": [
            "git-send-email 2.17.1",
            "git-send-email 2.17.1"
        ],
        "In-Reply-To": "<20200830111544.4190-1-wisamm@mellanox.com>",
        "References": "<20200830111544.4190-1-wisamm@mellanox.com>",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "AM4PR05CA0008.eurprd05.prod.outlook.com (2603:10a6:205::21)\n To AM0PR05MB6610.eurprd05.prod.outlook.com\n (2603:10a6:208:12f::18)",
        "MIME-Version": "1.0",
        "X-MS-Exchange-MessageSentRepresentingType": "1",
        "X-Originating-IP": "[37.142.13.130]",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-HT": "Tenant",
        "X-MS-Office365-Filtering-Correlation-Id": "1864ea6f-a9c3-4aaa-464c-08d84cd6247d",
        "X-MS-TrafficTypeDiagnostic": "AM0PR0502MB3762:",
        "X-LD-Processed": "a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtFwd,ExtAddr",
        "X-MS-Exchange-Transport-Forked": "True",
        "X-Microsoft-Antispam-PRVS": "\n <AM0PR0502MB376202BE22791141A61C02CCA9500@AM0PR0502MB3762.eurprd05.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:305;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n MUjLANQRaLx8Iq7ezqQLNnrJ4Cnoax+3zGYwnI9sBi3FtkbbRY6Veaj25QRMjyzzm65TarCR4zLaeBu5RBtnq6YC9++Bq5C/67Rx5Nkf6mdMYczdNTSk+3VYZmjd1BYhAga9eGRFLaoumlaNhBb5P0kfL/a3lzeoNvDyxNRMaeoI9EsntDVuPnURBjgIwm/X1qgcSjLZ4wxZz3VKnO9SFecv02Mp6RaMcgwIQ31IobynIcLKyygRfnx8ZNWQQDYaDm00VEhHbh+rscqV3CtRS1++hPwwgdgA1df/HMbQHuNc0F3FjDPGc44dJfQ6uZMU",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:AM0PR05MB6610.eurprd05.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(4636009)(366004)(396003)(136003)(39860400002)(376002)(346002)(478600001)(316002)(5660300002)(8886007)(30864003)(2906002)(6636002)(86362001)(36756003)(6666004)(1076003)(55016002)(8936002)(26005)(2616005)(7696005)(66946007)(66556008)(52116002)(83380400001)(16526019)(8676002)(186003)(956004)(66476007);\n DIR:OUT; SFP:1101;",
        "X-MS-Exchange-AntiSpam-MessageData": "\n SfZsJimoXlZ/qlRsL3pQUdOUl5AZ17EDwJjlwjvdvsFuXXS+z2/DrWuho1ssHH8+fafoyi16vdidthUiKpCazMjSGJ9mqwSo1KZetX29BC+4s3QxzB74wejsMwRztEh6Y3aGT5nNpqNLCmugjOZ3H7TZwQ792jT/FZjU61A7wC6Awe5iGgMX3ca5D2BQ7udd4/bd+88WYHFTayrxhmWoMxGYXs/DN9sUO1Okv8z1AD2h0iYIwYEC2vRc89n21ADqb5XH/fYJtqDmA8ONMbKjQjgVR2QDpEsQiSHwY2GhrCx3wRZbLc5HuIqNDjujkA/0xaEKK8qQAaBqG3Xy6NZ1AAH9Zoh//qdYn4T4e2p5J71fff75KjBJLLLMJ2TJPfE2ty4PdVkljosgKa8Bnw0qRz6wsIJmbcnRHy1TALkjnEXBNMgYWke+SbwqEdfVgL+U8SsmX3F04rSPPR9PaLhfNOBWcLj2SoA38vH+qugiPDWXubOQT6DQ1mpGtzTWHojEZnT5PNI7PaJp5EfEDCAIYb04akhb7R/3p1KfZdiGXwe4W/n3QpFRhuBftoVvNR6w8A2lWZzowNOYlvc1XKpbWIR9hx/YtO/qYZdIkQHbObb7H1QgTij38vnk/9JDY9W0J2x4XeMlk8gOZlBSDAq8ew==",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 1864ea6f-a9c3-4aaa-464c-08d84cd6247d",
        "X-MS-Exchange-CrossTenant-AuthSource": "AM0PR05MB6610.eurprd05.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "30 Aug 2020 11:16:29.4395 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "a652971c-7d2e-4d9b-a6a4-d149256f461b",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n h6x/3v/XM5yMUAYsowat3siDUhU7n9VRVUj4ijbPB1WDRB+WSd5+25DzFknoav84PsIsgnM/RV0WW8IaoFXayw==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "AM0PR0502MB3762",
        "Subject": "[dpdk-dev] [PATCH 07/13] app/flow-perf: add raw encap/decap actions\n\tsupport",
        "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 <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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Introduce raw-encap and raw-decap actions.\nThe two actions are added in command line\noptions, and for the data to encap or decap\nthe user need to parse it within the command\nline.\n\nAll values of raw-encap data is set to be fixed\nvalues.\n\nUsage example:\n\n--raw-encap=ether,ipv4,udp,vxlan\n\nSigned-off-by: Wisam Jaddo <wisamm@mellanox.com>\nAcked-by: Alexander Kozyrev <akozyrev@nvidia.com>\n---\n app/test-flow-perf/actions_gen.c       | 330 ++++++++++++++++++++++++-\n app/test-flow-perf/actions_gen.h       |   8 +-\n app/test-flow-perf/flow_gen.c          |   5 +-\n app/test-flow-perf/flow_gen.h          |   2 +\n app/test-flow-perf/main.c              |  70 +++++-\n doc/guides/rel_notes/release_20_08.rst |   1 +\n doc/guides/tools/flow-perf.rst         |  10 +\n 7 files changed, 421 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/app/test-flow-perf/actions_gen.c b/app/test-flow-perf/actions_gen.c\nindex 99e47bf786..3ae6059fb1 100644\n--- a/app/test-flow-perf/actions_gen.c\n+++ b/app/test-flow-perf/actions_gen.c\n@@ -10,6 +10,8 @@\n #include <rte_malloc.h>\n #include <rte_flow.h>\n #include <rte_ethdev.h>\n+#include <rte_vxlan.h>\n+#include <rte_gtp.h>\n \n #include \"actions_gen.h\"\n #include \"flow_gen.h\"\n@@ -22,6 +24,23 @@ struct additional_para {\n \tuint16_t *queues;\n \tuint16_t queues_number;\n \tuint32_t counter;\n+\tuint64_t encap_data;\n+\tuint64_t decap_data;\n+};\n+\n+/* Storage for struct rte_flow_action_raw_encap including external data. */\n+struct action_raw_encap_data {\n+\tstruct rte_flow_action_raw_encap conf;\n+\tuint8_t data[128];\n+\tuint8_t preserve[128];\n+\tuint16_t idx;\n+};\n+\n+/* Storage for struct rte_flow_action_raw_decap including external data. */\n+struct action_raw_decap_data {\n+\tstruct rte_flow_action_raw_decap conf;\n+\tuint8_t data[128];\n+\tuint16_t idx;\n };\n \n /* Storage for struct rte_flow_action_rss including external data. */\n@@ -437,9 +456,304 @@ add_flag(struct rte_flow_action *actions,\n \tactions[actions_counter].type = RTE_FLOW_ACTION_TYPE_FLAG;\n }\n \n+static void\n+add_ether_header(uint8_t **header, uint64_t data,\n+\t__rte_unused struct additional_para para)\n+{\n+\tstruct rte_flow_item_eth eth_item;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_ETH)))\n+\t\treturn;\n+\n+\tmemset(&eth_item, 0, sizeof(struct rte_flow_item_eth));\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_VLAN))\n+\t\teth_item.type = RTE_BE16(RTE_ETHER_TYPE_VLAN);\n+\telse if (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_IPV4))\n+\t\teth_item.type = RTE_BE16(RTE_ETHER_TYPE_IPV4);\n+\telse if (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_IPV6))\n+\t\teth_item.type = RTE_BE16(RTE_ETHER_TYPE_IPV6);\n+\tmemcpy(*header, &eth_item, sizeof(eth_item));\n+\t*header += sizeof(eth_item);\n+}\n+\n+static void\n+add_vlan_header(uint8_t **header, uint64_t data,\n+\t__rte_unused struct additional_para para)\n+{\n+\tstruct rte_flow_item_vlan vlan_item;\n+\tuint16_t vlan_value;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_VLAN)))\n+\t\treturn;\n+\n+\tvlan_value = VLAN_VALUE;\n+\n+\tmemset(&vlan_item, 0, sizeof(struct rte_flow_item_vlan));\n+\tvlan_item.tci = RTE_BE16(vlan_value);\n+\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_IPV4))\n+\t\tvlan_item.inner_type = RTE_BE16(RTE_ETHER_TYPE_IPV4);\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_IPV6))\n+\t\tvlan_item.inner_type = RTE_BE16(RTE_ETHER_TYPE_IPV6);\n+\tmemcpy(*header, &vlan_item, sizeof(vlan_item));\n+\t*header += sizeof(vlan_item);\n+}\n+\n+static void\n+add_ipv4_header(uint8_t **header, uint64_t data,\n+\tstruct additional_para para)\n+{\n+\tstruct rte_flow_item_ipv4 ipv4_item;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_IPV4)))\n+\t\treturn;\n+\n+\tmemset(&ipv4_item, 0, sizeof(struct rte_flow_item_ipv4));\n+\tipv4_item.hdr.src_addr = RTE_IPV4(127, 0, 0, 1);\n+\tipv4_item.hdr.dst_addr = RTE_BE32(para.counter);\n+\tipv4_item.hdr.version_ihl = RTE_IPV4_VHL_DEF;\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_UDP))\n+\t\tipv4_item.hdr.next_proto_id = RTE_IP_TYPE_UDP;\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_GRE))\n+\t\tipv4_item.hdr.next_proto_id = RTE_IP_TYPE_GRE;\n+\tmemcpy(*header, &ipv4_item, sizeof(ipv4_item));\n+\t*header += sizeof(ipv4_item);\n+}\n+\n+static void\n+add_ipv6_header(uint8_t **header, uint64_t data,\n+\t__rte_unused struct additional_para para)\n+{\n+\tstruct rte_flow_item_ipv6 ipv6_item;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_IPV6)))\n+\t\treturn;\n+\n+\tmemset(&ipv6_item, 0, sizeof(struct rte_flow_item_ipv6));\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_UDP))\n+\t\tipv6_item.hdr.proto = RTE_IP_TYPE_UDP;\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_GRE))\n+\t\tipv6_item.hdr.proto = RTE_IP_TYPE_GRE;\n+\tmemcpy(*header, &ipv6_item, sizeof(ipv6_item));\n+\t*header += sizeof(ipv6_item);\n+}\n+\n+static void\n+add_udp_header(uint8_t **header, uint64_t data,\n+\t__rte_unused struct additional_para para)\n+{\n+\tstruct rte_flow_item_udp udp_item;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_UDP)))\n+\t\treturn;\n+\n+\tmemset(&udp_item, 0, sizeof(struct rte_flow_item_udp));\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_VXLAN))\n+\t\tudp_item.hdr.dst_port = RTE_BE16(RTE_VXLAN_DEFAULT_PORT);\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_VXLAN_GPE))\n+\t\tudp_item.hdr.dst_port = RTE_BE16(RTE_VXLAN_GPE_UDP_PORT);\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_GENEVE))\n+\t\tudp_item.hdr.dst_port = RTE_BE16(RTE_GENEVE_UDP_PORT);\n+\tif (data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_GTP))\n+\t\tudp_item.hdr.dst_port = RTE_BE16(RTE_GTPU_UDP_PORT);\n+\t memcpy(*header, &udp_item, sizeof(udp_item));\n+\t *header += sizeof(udp_item);\n+}\n+\n+static void\n+add_vxlan_header(uint8_t **header, uint64_t data,\n+\tstruct additional_para para)\n+{\n+\tstruct rte_flow_item_vxlan vxlan_item;\n+\tuint32_t vni_value = para.counter;\n+\tuint8_t i;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_VXLAN)))\n+\t\treturn;\n+\n+\tmemset(&vxlan_item, 0, sizeof(struct rte_flow_item_vxlan));\n+\n+\tfor (i = 0; i < 3; i++)\n+\t\tvxlan_item.vni[2 - i] = vni_value >> (i * 8);\n+\tvxlan_item.flags = 0x8;\n+\n+\tmemcpy(*header, &vxlan_item, sizeof(vxlan_item));\n+\t*header += sizeof(vxlan_item);\n+}\n+\n+static void\n+add_vxlan_gpe_header(uint8_t **header, uint64_t data,\n+\tstruct additional_para para)\n+{\n+\tstruct rte_flow_item_vxlan_gpe vxlan_gpe_item;\n+\tuint32_t vni_value = para.counter;\n+\tuint8_t i;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_VXLAN_GPE)))\n+\t\treturn;\n+\n+\tmemset(&vxlan_gpe_item, 0, sizeof(struct rte_flow_item_vxlan_gpe));\n+\n+\tfor (i = 0; i < 3; i++)\n+\t\tvxlan_gpe_item.vni[2 - i] = vni_value >> (i * 8);\n+\tvxlan_gpe_item.flags = 0x0c;\n+\n+\tmemcpy(*header, &vxlan_gpe_item, sizeof(vxlan_gpe_item));\n+\t*header += sizeof(vxlan_gpe_item);\n+}\n+\n+static void\n+add_gre_header(uint8_t **header, uint64_t data,\n+\t__rte_unused struct additional_para para)\n+{\n+\tstruct rte_flow_item_gre gre_item;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_GRE)))\n+\t\treturn;\n+\n+\tmemset(&gre_item, 0, sizeof(struct rte_flow_item_gre));\n+\n+\tgre_item.protocol = RTE_BE16(RTE_ETHER_TYPE_TEB);\n+\n+\tmemcpy(*header, &gre_item, sizeof(gre_item));\n+\t*header += sizeof(gre_item);\n+}\n+\n+static void\n+add_geneve_header(uint8_t **header, uint64_t data,\n+\tstruct additional_para para)\n+{\n+\tstruct rte_flow_item_geneve geneve_item;\n+\tuint32_t vni_value = para.counter;\n+\tuint8_t i;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_GENEVE)))\n+\t\treturn;\n+\n+\tmemset(&geneve_item, 0, sizeof(struct rte_flow_item_geneve));\n+\n+\tfor (i = 0; i < 3; i++)\n+\t\tgeneve_item.vni[2 - i] = vni_value >> (i * 8);\n+\n+\tmemcpy(*header, &geneve_item, sizeof(geneve_item));\n+\t*header += sizeof(geneve_item);\n+}\n+\n+static void\n+add_gtp_header(uint8_t **header, uint64_t data,\n+\tstruct additional_para para)\n+{\n+\tstruct rte_flow_item_gtp gtp_item;\n+\n+\tif (!(data & FLOW_ITEM_MASK(RTE_FLOW_ITEM_TYPE_GTP)))\n+\t\treturn;\n+\n+\tmemset(&gtp_item, 0, sizeof(struct rte_flow_item_gtp));\n+\n+\tgtp_item.teid = RTE_BE32(para.counter);\n+\tgtp_item.msg_type = 255;\n+\n+\tmemcpy(*header, &gtp_item, sizeof(gtp_item));\n+\t*header += sizeof(gtp_item);\n+}\n+\n+static const struct encap_decap_headers {\n+\tvoid (*funct)(\n+\t\tuint8_t **header,\n+\t\tuint64_t data,\n+\t\tstruct additional_para para\n+\t\t);\n+} headers[] = {\n+\t{.funct = add_ether_header},\n+\t{.funct = add_vlan_header},\n+\t{.funct = add_ipv4_header},\n+\t{.funct = add_ipv6_header},\n+\t{.funct = add_udp_header},\n+\t{.funct = add_vxlan_header},\n+\t{.funct = add_vxlan_gpe_header},\n+\t{.funct = add_gre_header},\n+\t{.funct = add_geneve_header},\n+\t{.funct = add_gtp_header},\n+};\n+\n+static void\n+add_raw_encap(struct rte_flow_action *actions,\n+\tuint8_t actions_counter,\n+\tstruct additional_para para)\n+{\n+\tstatic struct action_raw_encap_data *action_encap_data;\n+\tuint64_t encap_data = para.encap_data;\n+\tuint8_t *header;\n+\tuint8_t i;\n+\n+\t/* Avoid double allocation. */\n+\tif (action_encap_data == NULL)\n+\t\taction_encap_data = rte_malloc(\"encap_data\",\n+\t\t\tsizeof(struct action_raw_encap_data), 0);\n+\n+\t/* Check if allocation failed. */\n+\tif (action_encap_data == NULL)\n+\t\trte_exit(EXIT_FAILURE, \"No Memory available!\");\n+\n+\t*action_encap_data = (struct action_raw_encap_data) {\n+\t\t.conf = (struct rte_flow_action_raw_encap) {\n+\t\t\t.data = action_encap_data->data,\n+\t\t},\n+\t\t\t.data = {},\n+\t};\n+\theader = action_encap_data->data;\n+\n+\tfor (i = 0; i < RTE_DIM(headers); i++)\n+\t\theaders[i].funct(&header, encap_data, para);\n+\n+\taction_encap_data->conf.size = header -\n+\t\taction_encap_data->data;\n+\n+\tactions[actions_counter].type = RTE_FLOW_ACTION_TYPE_RAW_ENCAP;\n+\tactions[actions_counter].conf = &action_encap_data->conf;\n+}\n+\n+static void\n+add_raw_decap(struct rte_flow_action *actions,\n+\tuint8_t actions_counter,\n+\tstruct additional_para para)\n+{\n+\tstatic struct action_raw_decap_data *action_decap_data;\n+\tuint64_t decap_data = para.decap_data;\n+\tuint8_t *header;\n+\tuint8_t i;\n+\n+\t/* Avoid double allocation. */\n+\tif (action_decap_data == NULL)\n+\t\taction_decap_data = rte_malloc(\"decap_data\",\n+\t\t\tsizeof(struct action_raw_decap_data), 0);\n+\n+\t/* Check if allocation failed. */\n+\tif (action_decap_data == NULL)\n+\t\trte_exit(EXIT_FAILURE, \"No Memory available!\");\n+\n+\t*action_decap_data = (struct action_raw_decap_data) {\n+\t\t.conf = (struct rte_flow_action_raw_decap) {\n+\t\t\t.data = action_decap_data->data,\n+\t\t},\n+\t\t\t.data = {},\n+\t};\n+\theader = action_decap_data->data;\n+\n+\tfor (i = 0; i < RTE_DIM(headers); i++)\n+\t\theaders[i].funct(&header, decap_data, para);\n+\n+\taction_decap_data->conf.size = header -\n+\t\taction_decap_data->data;\n+\n+\tactions[actions_counter].type = RTE_FLOW_ACTION_TYPE_RAW_DECAP;\n+\tactions[actions_counter].conf = &action_decap_data->conf;\n+}\n+\n void\n fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,\n-\tuint32_t counter, uint16_t next_table, uint16_t hairpinq)\n+\tuint32_t counter, uint16_t next_table, uint16_t hairpinq,\n+\tuint64_t encap_data, uint64_t decap_data)\n {\n \tstruct additional_para additional_para_data;\n \tuint8_t actions_counter = 0;\n@@ -459,6 +773,8 @@ fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,\n \t\t.queues = queues,\n \t\t.queues_number = RXQ_NUM,\n \t\t.counter = counter,\n+\t\t.encap_data = encap_data,\n+\t\t.decap_data = decap_data,\n \t};\n \n \tif (hairpinq != 0) {\n@@ -621,6 +937,18 @@ fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,\n \t\t\t.mask = HAIRPIN_RSS_ACTION,\n \t\t\t.funct = add_rss,\n \t\t},\n+\t\t{\n+\t\t\t.mask = FLOW_ACTION_MASK(\n+\t\t\t\tRTE_FLOW_ACTION_TYPE_RAW_ENCAP\n+\t\t\t),\n+\t\t\t.funct = add_raw_encap,\n+\t\t},\n+\t\t{\n+\t\t\t.mask = FLOW_ACTION_MASK(\n+\t\t\t\tRTE_FLOW_ACTION_TYPE_RAW_DECAP\n+\t\t\t),\n+\t\t\t.funct = add_raw_decap,\n+\t\t},\n \t};\n \n \tfor (j = 0; j < MAX_ACTIONS_NUM; j++) {\ndiff --git a/app/test-flow-perf/actions_gen.h b/app/test-flow-perf/actions_gen.h\nindex d6918a53a6..85e3176b09 100644\n--- a/app/test-flow-perf/actions_gen.h\n+++ b/app/test-flow-perf/actions_gen.h\n@@ -12,7 +12,13 @@\n \n #include \"config.h\"\n \n+#define RTE_IP_TYPE_UDP\t17\n+#define RTE_IP_TYPE_GRE\t47\n+#define RTE_VXLAN_GPE_UDP_PORT 250\n+#define RTE_GENEVE_UDP_PORT 6081\n+\n void fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,\n-\tuint32_t counter, uint16_t next_table, uint16_t hairpinq);\n+\tuint32_t counter, uint16_t next_table, uint16_t hairpinq,\n+\tuint64_t encap_data, uint64_t decap_data);\n \n #endif /* FLOW_PERF_ACTION_GEN */\ndiff --git a/app/test-flow-perf/flow_gen.c b/app/test-flow-perf/flow_gen.c\nindex b2c828c7df..a979b3856d 100644\n--- a/app/test-flow-perf/flow_gen.c\n+++ b/app/test-flow-perf/flow_gen.c\n@@ -43,6 +43,8 @@ generate_flow(uint16_t port_id,\n \tuint16_t next_table,\n \tuint32_t outer_ip_src,\n \tuint16_t hairpinq,\n+\tuint64_t encap_data,\n+\tuint64_t decap_data,\n \tstruct rte_flow_error *error)\n {\n \tstruct rte_flow_attr attr;\n@@ -57,7 +59,8 @@ generate_flow(uint16_t port_id,\n \tfill_attributes(&attr, flow_attrs, group);\n \n \tfill_actions(actions, flow_actions,\n-\t\touter_ip_src, next_table, hairpinq);\n+\t\touter_ip_src, next_table, hairpinq,\n+\t\tencap_data, decap_data);\n \n \tfill_items(items, flow_items, outer_ip_src);\n \ndiff --git a/app/test-flow-perf/flow_gen.h b/app/test-flow-perf/flow_gen.h\nindex 53469c659f..3d13737d65 100644\n--- a/app/test-flow-perf/flow_gen.h\n+++ b/app/test-flow-perf/flow_gen.h\n@@ -32,6 +32,8 @@ generate_flow(uint16_t port_id,\n \tuint16_t next_table,\n \tuint32_t outer_ip_src,\n \tuint16_t hairpinq,\n+\tuint64_t encap_data,\n+\tuint64_t decap_data,\n \tstruct rte_flow_error *error);\n \n #endif /* FLOW_PERF_FLOW_GEN */\ndiff --git a/app/test-flow-perf/main.c b/app/test-flow-perf/main.c\nindex ae0d1a3be5..1b456e6922 100644\n--- a/app/test-flow-perf/main.c\n+++ b/app/test-flow-perf/main.c\n@@ -45,6 +45,9 @@\n struct rte_flow *flow;\n static uint8_t flow_group;\n \n+static uint64_t encap_data;\n+static uint64_t decap_data;\n+\n static uint64_t flow_items[MAX_ITEMS_NUM];\n static uint64_t flow_actions[MAX_ACTIONS_NUM];\n static uint64_t flow_attrs[MAX_ATTRS_NUM];\n@@ -171,12 +174,19 @@ usage(char *progname)\n \tprintf(\"  --set-ipv6-dscp: add set ipv6 dscp action to flow actions\\n\"\n \t\t\"ipv6 dscp value to be set is random each flow\\n\");\n \tprintf(\"  --flag: add flag action to flow actions\\n\");\n+\tprintf(\"  --raw-encap=<data>: add raw encap action to flow actions\\n\"\n+\t\t\"Data is the data needed to be encaped\\n\"\n+\t\t\"Example: raw-encap=ether,ipv4,udp,vxlan\\n\");\n+\tprintf(\"  --raw-decap=<data>: add raw decap action to flow actions\\n\"\n+\t\t\"Data is the data needed to be decaped\\n\"\n+\t\t\"Example: raw-decap=ether,ipv4,udp,vxlan\\n\");\n }\n \n static void\n args_parse(int argc, char **argv)\n {\n \tchar **argvopt;\n+\tchar *token;\n \tint n, opt;\n \tint opt_idx;\n \tsize_t i;\n@@ -532,6 +542,8 @@ args_parse(int argc, char **argv)\n \t\t{ \"set-ipv4-dscp\",              0, 0, 0 },\n \t\t{ \"set-ipv6-dscp\",              0, 0, 0 },\n \t\t{ \"flag\",                       0, 0, 0 },\n+\t\t{ \"raw-encap\",                  1, 0, 0 },\n+\t\t{ \"raw-decap\",                  1, 0, 0 },\n \t};\n \n \thairpin_queues_num = 0;\n@@ -593,6 +605,58 @@ args_parse(int argc, char **argv)\n \t\t\t\tprintf(\"hairpin-queue / \");\n \t\t\t}\n \n+\t\t\tif (strcmp(lgopts[opt_idx].name, \"raw-encap\") == 0) {\n+\t\t\t\tprintf(\"raw-encap \");\n+\t\t\t\tflow_actions[actions_idx++] =\n+\t\t\t\t\tFLOW_ITEM_MASK(\n+\t\t\t\t\t\tRTE_FLOW_ACTION_TYPE_RAW_ENCAP\n+\t\t\t\t\t);\n+\n+\t\t\t\ttoken = strtok(optarg, \",\");\n+\t\t\t\twhile (token != NULL) {\n+\t\t\t\t\tfor (i = 0; i < RTE_DIM(flow_options); i++) {\n+\t\t\t\t\t\tif (strcmp(flow_options[i].str, token) == 0) {\n+\t\t\t\t\t\t\tprintf(\"%s,\", token);\n+\t\t\t\t\t\t\tencap_data |= flow_options[i].mask;\n+\t\t\t\t\t\t\tbreak;\n+\t\t\t\t\t\t}\n+\t\t\t\t\t\t/* Reached last item with no match */\n+\t\t\t\t\t\tif (i == (RTE_DIM(flow_options) - 1)) {\n+\t\t\t\t\t\t\tfprintf(stderr, \"Invalid encap item: %s\\n\", token);\n+\t\t\t\t\t\t\tusage(argv[0]);\n+\t\t\t\t\t\t\trte_exit(EXIT_SUCCESS, \"Invalid encap item\\n\");\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t\ttoken = strtok(NULL, \",\");\n+\t\t\t\t}\n+\t\t\t\tprintf(\" / \");\n+\t\t\t}\n+\t\t\tif (strcmp(lgopts[opt_idx].name, \"raw-decap\") == 0) {\n+\t\t\t\tprintf(\"raw-decap \");\n+\t\t\t\tflow_actions[actions_idx++] =\n+\t\t\t\t\tFLOW_ITEM_MASK(\n+\t\t\t\t\t\tRTE_FLOW_ACTION_TYPE_RAW_DECAP\n+\t\t\t\t\t);\n+\n+\t\t\t\ttoken = strtok(optarg, \",\");\n+\t\t\t\twhile (token != NULL) {\n+\t\t\t\t\tfor (i = 0; i < RTE_DIM(flow_options); i++) {\n+\t\t\t\t\t\tif (strcmp(flow_options[i].str, token) == 0) {\n+\t\t\t\t\t\t\tprintf(\"%s,\", token);\n+\t\t\t\t\t\t\tencap_data |= flow_options[i].mask;\n+\t\t\t\t\t\t\tbreak;\n+\t\t\t\t\t\t}\n+\t\t\t\t\t\t/* Reached last item with no match */\n+\t\t\t\t\t\tif (i == (RTE_DIM(flow_options) - 1)) {\n+\t\t\t\t\t\t\tfprintf(stderr, \"Invalid decap item: %s\\n\", token);\n+\t\t\t\t\t\t\tusage(argv[0]);\n+\t\t\t\t\t\t\trte_exit(EXIT_SUCCESS, \"Invalid decap item\\n\");\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t\ttoken = strtok(NULL, \",\");\n+\t\t\t\t}\n+\t\t\t\tprintf(\" / \");\n+\t\t\t}\n \t\t\t/* Control */\n \t\t\tif (strcmp(lgopts[opt_idx].name,\n \t\t\t\t\t\"flows-count\") == 0) {\n@@ -807,7 +871,7 @@ flows_handler(void)\n \t\t\t */\n \t\t\tflow = generate_flow(port_id, 0, flow_attrs,\n \t\t\t\tglobal_items, global_actions,\n-\t\t\t\tflow_group, 0, 0, &error);\n+\t\t\t\tflow_group, 0, 0, 0, 0, &error);\n \n \t\t\tif (flow == NULL) {\n \t\t\t\tprint_flow_error(error);\n@@ -823,7 +887,9 @@ flows_handler(void)\n \t\t\tflow = generate_flow(port_id, flow_group,\n \t\t\t\tflow_attrs, flow_items, flow_actions,\n \t\t\t\tJUMP_ACTION_TABLE, i,\n-\t\t\t\thairpin_queues_num, &error);\n+\t\t\t\thairpin_queues_num,\n+\t\t\t\tencap_data, decap_data,\n+\t\t\t\t&error);\n \n \t\t\tif (force_quit)\n \t\t\t\ti = flows_count;\ndiff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst\nindex eed3900a8c..5a94eacded 100644\n--- a/doc/guides/rel_notes/release_20_08.rst\n+++ b/doc/guides/rel_notes/release_20_08.rst\n@@ -282,6 +282,7 @@ New Features\n \n   * Start supporting header modify actions.\n   * Start supporting flag action.\n+  * Start supporting raw-encap and raw-decap actions.\n \n \n Removed Items\ndiff --git a/doc/guides/tools/flow-perf.rst b/doc/guides/tools/flow-perf.rst\nindex 69cdd1b222..10c0c422e4 100644\n--- a/doc/guides/tools/flow-perf.rst\n+++ b/doc/guides/tools/flow-perf.rst\n@@ -306,3 +306,13 @@ Actions:\n \n *\t``--flag``\n \tAdd flag action to all flows actions.\n+\n+*\t``--raw-encap=<DATA>``\n+\tAdd raw encap action to all flows actions.\n+\tData is the data needed to be encaped, with fixed values.\n+\tExample: raw-encap=ether,ipv4,udp,vxlan\n+\n+*\t``--raw-decap=<DATA>``\n+\tAdd raw decap action to all flows actions.\n+\tData is the data needed to be decaped, with fixed values.\n+\tExample: raw-decap=ether,ipv4,gre\n",
    "prefixes": [
        "07/13"
    ]
}