get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 46208,
    "url": "http://patches.dpdk.org/api/patches/46208/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1538917054-68283-3-git-send-email-orika@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": "<1538917054-68283-3-git-send-email-orika@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1538917054-68283-3-git-send-email-orika@mellanox.com",
    "date": "2018-10-07T12:57:33",
    "name": "[v3,2/3] app/testpmd: convert testpmd encap commands to new API",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "958c6a0a9044748120e54c5353d8564fc5012acc",
    "submitter": {
        "id": 795,
        "url": "http://patches.dpdk.org/api/people/795/?format=api",
        "name": "Ori Kam",
        "email": "orika@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/1538917054-68283-3-git-send-email-orika@mellanox.com/mbox/",
    "series": [
        {
            "id": 1735,
            "url": "http://patches.dpdk.org/api/series/1735/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=1735",
            "date": "2018-10-07T12:57:31",
            "name": "ethdev: add generic L2/L3 tunnel encapsulation actions",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/1735/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/46208/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/46208/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 1BB46493D;\n\tSun,  7 Oct 2018 14:58:53 +0200 (CEST)",
            "from EUR01-HE1-obe.outbound.protection.outlook.com\n\t(mail-he1eur01on0082.outbound.protection.outlook.com [104.47.0.82])\n\tby dpdk.org (Postfix) with ESMTP id A29353798\n\tfor <dev@dpdk.org>; Sun,  7 Oct 2018 14:58:51 +0200 (CEST)",
            "from mellanox.com (37.142.13.130) by\n\tHE1PR05MB3436.eurprd05.prod.outlook.com (2603:10a6:7:33::26) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.1207.18; Sun, 7 Oct 2018 12:58:47 +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=joln3aaXsMEqVoAOrF8thAmh7KCoC4RkWTPnqdDvirE=;\n\tb=P3VMjt8dHIKhxn2D93Zo8lnfRcDReDwafURqzWVUG9mmu+Kr5jPt+SM1JyNrgV7I6x6BdRod3LjhrDOUME0Fe8t0hwp5pRxpx1Hz9kRAB08jGlUksXQAuV5P+9XwkEQt5q0CzGGhHj6nwOliWKaIInsw+c73NxPICEp4OWyctTU=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=orika@mellanox.com; ",
        "From": "Ori Kam <orika@mellanox.com>",
        "To": "arybchenko@solarflare.com, ferruh.yigit@intel.com,\n\tstephen@networkplumber.org, adrien.mazarguil@6wind.com",
        "Cc": "dev@dpdk.org, dekelp@mellanox.com, thomas@monjalon.net,\n\tnelio.laranjeiro@6wind.com, yskoh@mellanox.com, orika@mellanox.com,\n\tshahafs@mellanox.com",
        "Date": "Sun,  7 Oct 2018 12:57:33 +0000",
        "Message-Id": "<1538917054-68283-3-git-send-email-orika@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1538917054-68283-1-git-send-email-orika@mellanox.com>",
        "References": "<1537995646-95260-1-git-send-email-orika@mellanox.com>\n\t<1538917054-68283-1-git-send-email-orika@mellanox.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[37.142.13.130]",
        "X-ClientProxiedBy": "LO2P265CA0119.GBRP265.PROD.OUTLOOK.COM\n\t(2603:10a6:600:c::35) To HE1PR05MB3436.eurprd05.prod.outlook.com\n\t(2603:10a6:7:33::26)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "3be96a1f-b60c-4c7d-bbc2-08d62c54a009",
        "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:HE1PR05MB3436; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; HE1PR05MB3436;\n\t3:hxEv7WE6AEKKzUMJD//JOqbtsEyoF46hleMuDRCWRlAjYQxmnjEsmkB0qaWg0wEDC4w0hOgp1CSsecRUMgWv3WoaPhiCo+MFj6hiFOkzT8DiY3AKCAbEqBlz8fYwVzLyXacbIuo2FX2Cw2s4M5RtIZrvkOpY371yDBMZiSsKGHtGYCsE3auuqcezPmeypcUTn6PhfBM6DyKfW+I2rbD7Asg9MCfZfYbT5bdKdB47Gd5LBQEh6eCdwiYQJNlrN73+;\n\t25:cLx6T2svJTYFmcDi7XELg9R6mdDbBg2ssuAZfa9/tHD/f36FwwO/GsTKGMgePLz//y/J5Fq6Y2IIrZGVZmpmfUpbmxksKZAyQy1bvimDu96zVDmVvv1rTKmB1X5B3n0Fc76DKJWlhKhp0Bne0fYOR61ocvEIyDpSrQS/zsJPY2QoZXUm/1jXe+RUOaOsjy7LHU4mzAc0j9oAS1O/0Gw7ojfeEQRSSf8aCiOtR9fRZXPu35WcI0gWAJusy6UFR66WoRnK2ttbjI4vDpOji8A+TstyuWfmTdjBceSEXShNGlpHXYNrxvLwROgJQu/obYSAioHYSRMViKZLoNciIrHY6w==;\n\t31:wDH4xJS3FwCkpVa0OxlDyY4hcY1fHtIESukCdDCycTzdyplF+3tYhTX3lasxDoAserjNAKiG3JhITVoelv8OpBsp8E50p+MQLATNbyVDTBfjEF28Ame4wgQJy9Hn3ZHOsHjEuKyrLJkh678lcuNkpcEHI/7B1iI4gNvzaDDPFCNjSJ9zdFWvwNdRDfvJBuTI8sg5PdKRZ+/VhbwqCVFZhX6s2MbsSMXq1/OX6fsQgtk=",
            "1; HE1PR05MB3436;\n\t20:k121CDj9rO/VsHM1MS+hoUbnDfWR592LsuTMaesQ1Kd+z9V+SH2PecNwPDdBXNtVKVWrPUy3HiprJ9qCrJs2LXV0VGvQs4nspg4+9hN7LUcAjcUGmeb4gqxnnNHaXIy2ud18mLny2MqL7v9OxeDhLno83sZydEuz6KCq2pofyN9XcldQaaflM4it1kRC01kk0KabpRCUqnOXWxPim6xt1qAYNZYacNsdp42YZ7kUk45VrHOhSK5z/mlkTgXkWAXFJR8pf3/hvze+0EBgJCkbThEKCeIGVhJYQo7/e2hglCjLlZBM3cDifloJ64fRp8mBmu7+gKOUTYWmeBWk8cSCJMu0kHvkY8ubQynUAoftlW03jz+Ur7ifoRqi8J4X94uSIRI2ZHoZ96t+0k+wE7ljrAUeRqQ++MXD9pzymbgGzcsIhGppgPoz1ZJ7r0XvnAfqScYEDRcyPKHKapJt3zEagZz9Z/TMSoVleYKQDDA23VFtdbZM0GjSRgI1M9iojmUw;\n\t4:1iXEMnIpZBmJfOLoF+tv4KjFj0IoAhj/Cu/JnCy4Ji02zedOl5Q4NcQr9qJlLVhb2RaULAXzWsdiRowaaYWNA8rWT82ylM5zdv8xefeNuJSD76Nx96yEKddnb1+0KOyjXvbINTPTLKkpB4jn3qcUuJtYfvrNcJGQrkgWFvZFekajh9JYIox8/9ewQghXMcan2gwRboFDArrdKndZ4H7LD0yGuX0DqluSwEjG0K3qhVV3ZQPXhHIdMZSVprDVurF1JA0c/oTOcnY9wH4cDumzOA==",
            "=?us-ascii?Q?1; HE1PR05MB3436;\n\t23:UZ2Nww6I7wzRB4XGd3iRh0wsAS7KQBzic/cwZLeX0?=\n\t5v5bKgfQQ3u8FXPW7LyOeuX9w0jyJGTvWlbh2awHz8sfB+3NYvDSk2/XkUS7R7ZmPleGzEQFtkxR8N6YpV5ZzEEeluRnBZxlSaml2utC1zRBgIGiR/zNbjdvZEQXI29X8Sbx+9jKLTSbTkVVOuP6MePY9tsZ2vr8Yxhm+pvFMyh8SDkqub8hcaazE9++D39AbUfsg6FisIMdfsdKuLkVclcj/RqE3BYmWh3yMrSSDuWAYunxtbCjAQiCRqJuQX4SSLSbwYhQRZYZNJdbLncKI9ob+OFI7LaHjP2+ZC1EPADiLxanKluEs7kgkxqLiAy4hTGdaKsFFfjZuVZhLh1LzCHbLYxz3wJrYZfQNfEkyh18I0zm1thbyEwYEC/gFPXE7nB8PyVY/W2t1vshctAm2jJF/avE9aYbzzTBwaJVxSiDFw0RDqJZ45/rIXYbr3Uywd4CBb+uLljEXAhsDqogbKO2YIrh6qXxy1eMlrTyEWO3HSiB4qtkBH9XeBuYyFfLgzLat3uOeNhYK34h8PvdUeSc0MiFKu6ewaf4gTfQtxqGiO93rbgX7+hP2QiAAhCTbNCW2Xfvq2amrkBugwqa7g5BuKsdLjDXdE5GDT1GijKG06MPG6T4on20qT6cvvmVirzH+uB18HB2UVMljDmTEzGEOvgjm75WlZpQvUvSOIXID1AeG7saO0iqvlhEiUtFEenCKdoEvOweiMyeDBS3lTCnAflZlnpOYIXrNBVv77Xyqc9PByIitF9hf06Nc05uDdT1CgNzE6FXTBG61rkxkdhay0wyDCAJ5pCQ9H2JDrkFmkiSAF5yoQtYUvscoXQ/5H8739h1Vlc/AVnMpN8PxeI7+DrSUfQtppuYM+dSQzCo74MPLRj7E/Qabib8uELMUAKyJ7K612Gh45WszRKcgl7iOcoUmk8rcW5Th3l+m0wMplYvygJ7bAjf2TXW0+cuXoudQYysjOvia+SyjD/tMS+47jFrn8fbpC602J5y9UnL0OT4ATurFH6XkRZbPWgOrjjQdSD4HYakvr1+GqRBLRTsNZ/7wvEPfqedcqZ5DUn/1f9jNQK6hZFfNkZONcN1pyfSU5IMzIy6Sis62HhX2jBvpif5vziibtqPUJyJAgqlr22OGd2LW4n12B3jkwqeHBYng1g93rNcvHLXwB8zs+F1rpgfiyTW54usJgJ1n8iV2o2f3arw2rrBUtRFGog6jZ+Aq2A+aGTuxGzG/4xdIhzXzAvt7ks0gLtUb2sy6sTeg==",
            "1; HE1PR05MB3436;\n\t6:ZJA+B810yoOK2R3rcSw/5jkM7HHu+4dspXFsqwVJeenHJuvxOwvQD3hn1r1WNgJ54iyzhpUMqtUaq/il3+Ly/ev/Rio///9nEZVCYHPnhttYYNv8ZUCxbEKWkGjnMLOsxgDtTD5/h1/zMYg3vHTQeCwp9OSwspg8pU2ahgUi4dRWqiLO5HiglH2HU1NH19UuqUt1cqAQVK97y9v9vwtGISIm38QCw0+Zw2eU02j9dxoe/xbpP51ezdrEshW8K/qBfi6sDzlN+lfUy2lzWJizVM//musHFyotm6VdM6CY4o/vO10qjdS/LUsv4qGh6a6y/KkXmavbigvrkT1+pRkK/ydH61olHn+QeLLSMPIzspt7d4qVnaGsdHu0M93mBLW8GiG07JAHtnHvP/rbqRV+VOBemZepeUawxaSLnbsEiEKUFVP/CvdiAAQVmVE2qw3yOS5AnqvL3dVZvXzz5iWdFQ==;\n\t5:GYN2DzozqMoaXgjG49Ir547wfACcNO99tjDXQ+Iobzn86EAQJeTpmmIkn7Q914YA6IHXXKfqutrKbUdZMVOnSVVhkTgPwa848sTyoYoRGt8oAJrRawgDfUdW0DUbOX54N6pevvzKKy4oknigLL6q8cSYzSYqJfO3JFH+Px51hag=;\n\t7:jLp9PumgmOxeCds+Q2TXa13Wd5yjbMJPv5z0SPXEFQEicOCRv6VtwORddcQFjFaDYX6P/00wPizOReVVALa5Vc5xfM5y+FmQDfLa/ZqrvWg8DdbASiH4sUtAXg+1W/lNgQvas3Dxxw8gLxSFC2IYINeGQ7bg1l+22qYmrKOC7WkZA/aG5zfDxAiu70u90gfoo/UcL7+pjVZOnJFvUD1AC1rrTJN7V6qzJRmRVVkwwDQK3lmJC+OdOUHvcJoj7Ta5"
        ],
        "X-MS-TrafficTypeDiagnostic": "HE1PR05MB3436:",
        "X-LD-Processed": "a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr",
        "X-Microsoft-Antispam-PRVS": "<HE1PR05MB343646BF41F7AC9DE4F8EA72DBE50@HE1PR05MB3436.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)(10201501046)(93006095)(93001095)(3002001)(3231355)(944501410)(52105095)(6055026)(149066)(150057)(6041310)(20161123564045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123560045)(201708071742011)(7699051)(76991055);\n\tSRVR:HE1PR05MB3436; BCL:0; PCL:0; RULEID:; SRVR:HE1PR05MB3436; ",
        "X-Forefront-PRVS": "0818724663",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(376002)(396003)(136003)(346002)(366004)(39860400002)(199004)(189003)(105586002)(76176011)(2616005)(3846002)(51416003)(7696005)(106356001)(52116002)(6116002)(386003)(55016002)(486006)(476003)(11346002)(446003)(956004)(26005)(86362001)(305945005)(21086003)(53936002)(316002)(36756003)(69596002)(16586007)(14444005)(16526019)(186003)(8936002)(81156014)(50226002)(4326008)(478600001)(2906002)(66066001)(8676002)(4720700003)(81166006)(7736002)(6666003)(25786009)(8886007)(50466002)(68736007)(48376002)(4744004)(107886003)(97736004)(47776003)(33026002)(5660300001);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR05MB3436; H:mellanox.com; FPR:;\n\tSPF:None; \n\tLANG:en; PTR: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": "td2rrWD0wla6kE5bMcHTx7XjjdoehUZ89fumLABvH06LexdWoP47unUvpP52AhbVHk3FDFzeEEC5HG3ikkpx+ncHIPrY9Fzg9cB5UnT4dx7aVP6RjF/NRDB39OC2zkE2msBTgmmkW+ogV29xvytemq6Jh2h9y3q8scdCslCotpDT9+DF3e6frFxBbPCkOcLR7kVbkN7VrganvJgerFxaPGekNUh6K4pGDUm2zvgJZDFsvMB33EVnQWvyLOpOZKscuwV8b1joZIu5FsnKBnhTdhrZAa4zg4nCUpEkcLZSwE+uQjb8KaGzI70BmP6NGQ9iUum9K5ylBNRRgRBWNjv86OK7JXrWKCPM3ODC1xXHwaI=",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "07 Oct 2018 12:58:47.9152\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "3be96a1f-b60c-4c7d-bbc2-08d62c54a009",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "a652971c-7d2e-4d9b-a6a4-d149256f461b",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "HE1PR05MB3436",
        "Subject": "[dpdk-dev] [PATCH v3 2/3] app/testpmd: convert testpmd encap\n\tcommands to new API",
        "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": "Currently there are 2 encapsulation commands in testpmd one for VXLAN\nand one for NVGRE, both of those commands are using the old rte encap\ncommand.\n\nThis commit update the commands to work with the new tunnel encap\nactions.\n\nThe reason that we have different encapsulation commands, one for VXLAN\nand one for NVGRE is the ease of use in testpmd, both commands are using\nthe same rte flow action for tunnel encap.\n\nSigned-off-by: Ori Kam <orika@mellanox.com>\n---\n app/test-pmd/cmdline_flow.c | 292 +++++++++++++++++++++-----------------------\n app/test-pmd/config.c       |   2 -\n 2 files changed, 137 insertions(+), 157 deletions(-)",
    "diff": "diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c\nindex f926060..c9dba79 100644\n--- a/app/test-pmd/cmdline_flow.c\n+++ b/app/test-pmd/cmdline_flow.c\n@@ -262,37 +262,13 @@ struct action_rss_data {\n \tuint16_t queue[ACTION_RSS_QUEUE_NUM];\n };\n \n-/** Maximum number of items in struct rte_flow_action_vxlan_encap. */\n-#define ACTION_VXLAN_ENCAP_ITEMS_NUM 6\n-\n-/** Storage for struct rte_flow_action_vxlan_encap including external data. */\n-struct action_vxlan_encap_data {\n-\tstruct rte_flow_action_vxlan_encap conf;\n-\tstruct rte_flow_item items[ACTION_VXLAN_ENCAP_ITEMS_NUM];\n-\tstruct rte_flow_item_eth item_eth;\n-\tstruct rte_flow_item_vlan item_vlan;\n-\tunion {\n-\t\tstruct rte_flow_item_ipv4 item_ipv4;\n-\t\tstruct rte_flow_item_ipv6 item_ipv6;\n-\t};\n-\tstruct rte_flow_item_udp item_udp;\n-\tstruct rte_flow_item_vxlan item_vxlan;\n-};\n+/** Maximum buffer size for the encap data. */\n+#define ACTION_TUNNEL_ENCAP_MAX_BUFFER_SIZE 64\n \n-/** Maximum number of items in struct rte_flow_action_nvgre_encap. */\n-#define ACTION_NVGRE_ENCAP_ITEMS_NUM 5\n-\n-/** Storage for struct rte_flow_action_nvgre_encap including external data. */\n-struct action_nvgre_encap_data {\n-\tstruct rte_flow_action_nvgre_encap conf;\n-\tstruct rte_flow_item items[ACTION_NVGRE_ENCAP_ITEMS_NUM];\n-\tstruct rte_flow_item_eth item_eth;\n-\tstruct rte_flow_item_vlan item_vlan;\n-\tunion {\n-\t\tstruct rte_flow_item_ipv4 item_ipv4;\n-\t\tstruct rte_flow_item_ipv6 item_ipv6;\n-\t};\n-\tstruct rte_flow_item_nvgre item_nvgre;\n+/** Storage for struct rte_flow_action_tunnel_encap including external data. */\n+struct action_tunnel_encap_data {\n+\tstruct rte_flow_action_tunnel_encap conf;\n+\tuint8_t buf[ACTION_TUNNEL_ENCAP_MAX_BUFFER_SIZE];\n };\n \n /** Maximum number of subsequent tokens and arguments on the stack. */\n@@ -2438,8 +2414,8 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n \t\t.name = \"vxlan_encap\",\n \t\t.help = \"VXLAN encapsulation, uses configuration set by \\\"set\"\n \t\t\t\" vxlan\\\"\",\n-\t\t.priv = PRIV_ACTION(VXLAN_ENCAP,\n-\t\t\t\t    sizeof(struct action_vxlan_encap_data)),\n+\t\t.priv = PRIV_ACTION(TUNNEL_ENCAP,\n+\t\t\t\t    sizeof(struct action_tunnel_encap_data)),\n \t\t.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),\n \t\t.call = parse_vc_action_vxlan_encap,\n \t},\n@@ -2448,7 +2424,7 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n \t\t.help = \"Performs a decapsulation action by stripping all\"\n \t\t\t\" headers of the VXLAN tunnel network overlay from the\"\n \t\t\t\" matched flow.\",\n-\t\t.priv = PRIV_ACTION(VXLAN_DECAP, 0),\n+\t\t.priv = PRIV_ACTION(TUNNEL_DECAP, 0),\n \t\t.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),\n \t\t.call = parse_vc,\n \t},\n@@ -2456,8 +2432,8 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n \t\t.name = \"nvgre_encap\",\n \t\t.help = \"NVGRE encapsulation, uses configuration set by \\\"set\"\n \t\t\t\" nvgre\\\"\",\n-\t\t.priv = PRIV_ACTION(NVGRE_ENCAP,\n-\t\t\t\t    sizeof(struct action_nvgre_encap_data)),\n+\t\t.priv = PRIV_ACTION(TUNNEL_ENCAP,\n+\t\t\t\t    sizeof(struct action_tunnel_encap_data)),\n \t\t.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),\n \t\t.call = parse_vc_action_nvgre_encap,\n \t},\n@@ -2466,7 +2442,7 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n \t\t.help = \"Performs a decapsulation action by stripping all\"\n \t\t\t\" headers of the NVGRE tunnel network overlay from the\"\n \t\t\t\" matched flow.\",\n-\t\t.priv = PRIV_ACTION(NVGRE_DECAP, 0),\n+\t\t.priv = PRIV_ACTION(TUNNEL_DECAP, 0),\n \t\t.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),\n \t\t.call = parse_vc,\n \t},\n@@ -3034,6 +3010,9 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n \treturn len;\n }\n \n+/** IP next protocol UDP. */\n+#define IP_PROTO_UDP 0x11\n+\n /** Parse VXLAN encap action. */\n static int\n parse_vc_action_vxlan_encap(struct context *ctx, const struct token *token,\n@@ -3042,7 +3021,32 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n {\n \tstruct buffer *out = buf;\n \tstruct rte_flow_action *action;\n-\tstruct action_vxlan_encap_data *action_vxlan_encap_data;\n+\tstruct action_tunnel_encap_data *action_vxlan_encap_data;\n+\tstruct rte_flow_item_eth eth = { .type = 0, };\n+\tstruct rte_flow_item_vlan vlan = {\n+\t\t.tci = vxlan_encap_conf.vlan_tci,\n+\t\t.inner_type = 0,\n+\t};\n+\tstruct rte_flow_item_ipv4 ipv4 = {\n+\t\t.hdr =  {\n+\t\t\t.src_addr = vxlan_encap_conf.ipv4_src,\n+\t\t\t.dst_addr = vxlan_encap_conf.ipv4_dst,\n+\t\t\t.next_proto_id = IP_PROTO_UDP,\n+\t\t},\n+\t};\n+\tstruct rte_flow_item_ipv6 ipv6 = {\n+\t\t.hdr =  {\n+\t\t\t.proto = IP_PROTO_UDP,\n+\t\t},\n+\t};\n+\tstruct rte_flow_item_udp udp = {\n+\t\t.hdr = {\n+\t\t\t.src_port = vxlan_encap_conf.udp_src,\n+\t\t\t.dst_port = vxlan_encap_conf.udp_dst,\n+\t\t},\n+\t};\n+\tstruct rte_flow_item_vxlan vxlan = { .flags = 0, };\n+\tuint8_t *header;\n \tint ret;\n \n \tret = parse_vc(ctx, token, str, len, buf, size);\n@@ -3057,79 +3061,55 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n \t/* Point to selected object. */\n \tctx->object = out->args.vc.data;\n \tctx->objmask = NULL;\n-\t/* Set up default configuration. */\n+\t/* Copy the headers to the buffer. */\n \taction_vxlan_encap_data = ctx->object;\n-\t*action_vxlan_encap_data = (struct action_vxlan_encap_data){\n-\t\t.conf = (struct rte_flow_action_vxlan_encap){\n-\t\t\t.definition = action_vxlan_encap_data->items,\n-\t\t},\n-\t\t.items = {\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_ETH,\n-\t\t\t\t.spec = &action_vxlan_encap_data->item_eth,\n-\t\t\t\t.mask = &rte_flow_item_eth_mask,\n-\t\t\t},\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_VLAN,\n-\t\t\t\t.spec = &action_vxlan_encap_data->item_vlan,\n-\t\t\t\t.mask = &rte_flow_item_vlan_mask,\n-\t\t\t},\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_IPV4,\n-\t\t\t\t.spec = &action_vxlan_encap_data->item_ipv4,\n-\t\t\t\t.mask = &rte_flow_item_ipv4_mask,\n-\t\t\t},\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_UDP,\n-\t\t\t\t.spec = &action_vxlan_encap_data->item_udp,\n-\t\t\t\t.mask = &rte_flow_item_udp_mask,\n-\t\t\t},\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_VXLAN,\n-\t\t\t\t.spec = &action_vxlan_encap_data->item_vxlan,\n-\t\t\t\t.mask = &rte_flow_item_vxlan_mask,\n-\t\t\t},\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_END,\n-\t\t\t},\n-\t\t},\n-\t\t.item_eth.type = 0,\n-\t\t.item_vlan = {\n-\t\t\t.tci = vxlan_encap_conf.vlan_tci,\n-\t\t\t.inner_type = 0,\n-\t\t},\n-\t\t.item_ipv4.hdr = {\n-\t\t\t.src_addr = vxlan_encap_conf.ipv4_src,\n-\t\t\t.dst_addr = vxlan_encap_conf.ipv4_dst,\n-\t\t},\n-\t\t.item_udp.hdr = {\n-\t\t\t.src_port = vxlan_encap_conf.udp_src,\n-\t\t\t.dst_port = vxlan_encap_conf.udp_dst,\n+\t*action_vxlan_encap_data = (struct action_tunnel_encap_data) {\n+\t\t.conf = (struct rte_flow_action_tunnel_encap){\n+\t\t\t.buf = action_vxlan_encap_data->buf,\n \t\t},\n-\t\t.item_vxlan.flags = 0,\n+\t\t.buf = {},\n \t};\n-\tmemcpy(action_vxlan_encap_data->item_eth.dst.addr_bytes,\n+\theader = action_vxlan_encap_data->buf;\n+\tif (vxlan_encap_conf.select_vlan)\n+\t\teth.type = rte_cpu_to_be_16(ETHER_TYPE_VLAN);\n+\telse if (vxlan_encap_conf.select_ipv4)\n+\t\teth.type = rte_cpu_to_be_16(ETHER_TYPE_IPv4);\n+\telse\n+\t\teth.type = rte_cpu_to_be_16(ETHER_TYPE_IPv6);\n+\tmemcpy(eth.dst.addr_bytes,\n \t       vxlan_encap_conf.eth_dst, ETHER_ADDR_LEN);\n-\tmemcpy(action_vxlan_encap_data->item_eth.src.addr_bytes,\n+\tmemcpy(eth.src.addr_bytes,\n \t       vxlan_encap_conf.eth_src, ETHER_ADDR_LEN);\n-\tif (!vxlan_encap_conf.select_ipv4) {\n-\t\tmemcpy(&action_vxlan_encap_data->item_ipv6.hdr.src_addr,\n+\tmemcpy(header, &eth, sizeof(eth));\n+\theader += sizeof(eth);\n+\tif (vxlan_encap_conf.select_vlan) {\n+\t\tif (vxlan_encap_conf.select_ipv4)\n+\t\t\tvlan.inner_type = rte_cpu_to_be_16(ETHER_TYPE_IPv4);\n+\t\telse\n+\t\t\tvlan.inner_type = rte_cpu_to_be_16(ETHER_TYPE_IPv6);\n+\t\tmemcpy(header, &vlan, sizeof(vlan));\n+\t\theader += sizeof(vlan);\n+\t}\n+\tif (vxlan_encap_conf.select_ipv4) {\n+\t\tmemcpy(header, &ipv4, sizeof(ipv4));\n+\t\theader += sizeof(ipv4);\n+\t} else {\n+\t\tmemcpy(&ipv6.hdr.src_addr,\n \t\t       &vxlan_encap_conf.ipv6_src,\n \t\t       sizeof(vxlan_encap_conf.ipv6_src));\n-\t\tmemcpy(&action_vxlan_encap_data->item_ipv6.hdr.dst_addr,\n+\t\tmemcpy(&ipv6.hdr.dst_addr,\n \t\t       &vxlan_encap_conf.ipv6_dst,\n \t\t       sizeof(vxlan_encap_conf.ipv6_dst));\n-\t\taction_vxlan_encap_data->items[2] = (struct rte_flow_item){\n-\t\t\t.type = RTE_FLOW_ITEM_TYPE_IPV6,\n-\t\t\t.spec = &action_vxlan_encap_data->item_ipv6,\n-\t\t\t.mask = &rte_flow_item_ipv6_mask,\n-\t\t};\n+\t\tmemcpy(header, &ipv6, sizeof(ipv6));\n+\t\theader += sizeof(ipv6);\n \t}\n-\tif (!vxlan_encap_conf.select_vlan)\n-\t\taction_vxlan_encap_data->items[1].type =\n-\t\t\tRTE_FLOW_ITEM_TYPE_VOID;\n-\tmemcpy(action_vxlan_encap_data->item_vxlan.vni, vxlan_encap_conf.vni,\n-\t       RTE_DIM(vxlan_encap_conf.vni));\n+\tmemcpy(header, &udp, sizeof(udp));\n+\theader += sizeof(udp);\n+\tmemcpy(vxlan.vni, vxlan_encap_conf.vni, RTE_DIM(vxlan_encap_conf.vni));\n+\tmemcpy(header, &vxlan, sizeof(vxlan));\n+\theader += sizeof(vxlan);\n+\taction_vxlan_encap_data->conf.size = header -\n+\t\taction_vxlan_encap_data->buf;\n \taction->conf = &action_vxlan_encap_data->conf;\n \treturn ret;\n }\n@@ -3142,7 +3122,26 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n {\n \tstruct buffer *out = buf;\n \tstruct rte_flow_action *action;\n-\tstruct action_nvgre_encap_data *action_nvgre_encap_data;\n+\tstruct action_tunnel_encap_data *action_nvgre_encap_data;\n+\tstruct rte_flow_item_eth eth = { .type = 0, };\n+\tstruct rte_flow_item_vlan vlan = {\n+\t\t.tci = nvgre_encap_conf.vlan_tci,\n+\t\t.inner_type = 0,\n+\t};\n+\tstruct rte_flow_item_ipv4 ipv4 = {\n+\t\t.hdr =  {\n+\t\t\t.src_addr = nvgre_encap_conf.ipv4_src,\n+\t\t\t.dst_addr = nvgre_encap_conf.ipv4_dst,\n+\t\t\t.next_proto_id = IP_PROTO_UDP,\n+\t\t},\n+\t};\n+\tstruct rte_flow_item_ipv6 ipv6 = {\n+\t\t.hdr =  {\n+\t\t\t.proto = IP_PROTO_UDP,\n+\t\t},\n+\t};\n+\tstruct rte_flow_item_nvgre nvgre = { .flow_id = 0, };\n+\tuint8_t *header;\n \tint ret;\n \n \tret = parse_vc(ctx, token, str, len, buf, size);\n@@ -3157,70 +3156,53 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n \t/* Point to selected object. */\n \tctx->object = out->args.vc.data;\n \tctx->objmask = NULL;\n-\t/* Set up default configuration. */\n+\t/* Copy the headers to the buffer. */\n \taction_nvgre_encap_data = ctx->object;\n-\t*action_nvgre_encap_data = (struct action_nvgre_encap_data){\n-\t\t.conf = (struct rte_flow_action_nvgre_encap){\n-\t\t\t.definition = action_nvgre_encap_data->items,\n-\t\t},\n-\t\t.items = {\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_ETH,\n-\t\t\t\t.spec = &action_nvgre_encap_data->item_eth,\n-\t\t\t\t.mask = &rte_flow_item_eth_mask,\n-\t\t\t},\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_VLAN,\n-\t\t\t\t.spec = &action_nvgre_encap_data->item_vlan,\n-\t\t\t\t.mask = &rte_flow_item_vlan_mask,\n-\t\t\t},\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_IPV4,\n-\t\t\t\t.spec = &action_nvgre_encap_data->item_ipv4,\n-\t\t\t\t.mask = &rte_flow_item_ipv4_mask,\n-\t\t\t},\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_NVGRE,\n-\t\t\t\t.spec = &action_nvgre_encap_data->item_nvgre,\n-\t\t\t\t.mask = &rte_flow_item_nvgre_mask,\n-\t\t\t},\n-\t\t\t{\n-\t\t\t\t.type = RTE_FLOW_ITEM_TYPE_END,\n-\t\t\t},\n-\t\t},\n-\t\t.item_eth.type = 0,\n-\t\t.item_vlan = {\n-\t\t\t.tci = nvgre_encap_conf.vlan_tci,\n-\t\t\t.inner_type = 0,\n-\t\t},\n-\t\t.item_ipv4.hdr = {\n-\t\t       .src_addr = nvgre_encap_conf.ipv4_src,\n-\t\t       .dst_addr = nvgre_encap_conf.ipv4_dst,\n+\t*action_nvgre_encap_data = (struct action_tunnel_encap_data) {\n+\t\t.conf = (struct rte_flow_action_tunnel_encap){\n+\t\t\t.buf = action_nvgre_encap_data->buf,\n \t\t},\n-\t\t.item_nvgre.flow_id = 0,\n+\t\t.buf = {},\n \t};\n-\tmemcpy(action_nvgre_encap_data->item_eth.dst.addr_bytes,\n+\theader = action_nvgre_encap_data->buf;\n+\tif (nvgre_encap_conf.select_vlan)\n+\t\teth.type = rte_cpu_to_be_16(ETHER_TYPE_VLAN);\n+\telse if (nvgre_encap_conf.select_ipv4)\n+\t\teth.type = rte_cpu_to_be_16(ETHER_TYPE_IPv4);\n+\telse\n+\t\teth.type = rte_cpu_to_be_16(ETHER_TYPE_IPv6);\n+\tmemcpy(eth.dst.addr_bytes,\n \t       nvgre_encap_conf.eth_dst, ETHER_ADDR_LEN);\n-\tmemcpy(action_nvgre_encap_data->item_eth.src.addr_bytes,\n+\tmemcpy(eth.src.addr_bytes,\n \t       nvgre_encap_conf.eth_src, ETHER_ADDR_LEN);\n-\tif (!nvgre_encap_conf.select_ipv4) {\n-\t\tmemcpy(&action_nvgre_encap_data->item_ipv6.hdr.src_addr,\n+\tmemcpy(header, &eth, sizeof(eth));\n+\theader += sizeof(eth);\n+\tif (nvgre_encap_conf.select_vlan) {\n+\t\tif (nvgre_encap_conf.select_ipv4)\n+\t\t\tvlan.inner_type = rte_cpu_to_be_16(ETHER_TYPE_IPv4);\n+\t\telse\n+\t\t\tvlan.inner_type = rte_cpu_to_be_16(ETHER_TYPE_IPv6);\n+\t\tmemcpy(header, &vlan, sizeof(vlan));\n+\t\theader += sizeof(vlan);\n+\t}\n+\tif (nvgre_encap_conf.select_ipv4) {\n+\t\tmemcpy(header, &ipv4, sizeof(ipv4));\n+\t\theader += sizeof(ipv4);\n+\t} else {\n+\t\tmemcpy(&ipv6.hdr.src_addr,\n \t\t       &nvgre_encap_conf.ipv6_src,\n \t\t       sizeof(nvgre_encap_conf.ipv6_src));\n-\t\tmemcpy(&action_nvgre_encap_data->item_ipv6.hdr.dst_addr,\n+\t\tmemcpy(&ipv6.hdr.dst_addr,\n \t\t       &nvgre_encap_conf.ipv6_dst,\n \t\t       sizeof(nvgre_encap_conf.ipv6_dst));\n-\t\taction_nvgre_encap_data->items[2] = (struct rte_flow_item){\n-\t\t\t.type = RTE_FLOW_ITEM_TYPE_IPV6,\n-\t\t\t.spec = &action_nvgre_encap_data->item_ipv6,\n-\t\t\t.mask = &rte_flow_item_ipv6_mask,\n-\t\t};\n+\t\tmemcpy(header, &ipv6, sizeof(ipv6));\n+\t\theader += sizeof(ipv6);\n \t}\n-\tif (!nvgre_encap_conf.select_vlan)\n-\t\taction_nvgre_encap_data->items[1].type =\n-\t\t\tRTE_FLOW_ITEM_TYPE_VOID;\n-\tmemcpy(action_nvgre_encap_data->item_nvgre.tni, nvgre_encap_conf.tni,\n-\t       RTE_DIM(nvgre_encap_conf.tni));\n+\tmemcpy(nvgre.tni, nvgre_encap_conf.tni, RTE_DIM(nvgre_encap_conf.tni));\n+\tmemcpy(header, &nvgre, sizeof(nvgre));\n+\theader += sizeof(nvgre);\n+\taction_nvgre_encap_data->conf.size = header -\n+\t\taction_nvgre_encap_data->buf;\n \taction->conf = &action_nvgre_encap_data->conf;\n \treturn ret;\n }\ndiff --git a/app/test-pmd/config.c b/app/test-pmd/config.c\nindex 009c92c..ccd9a18 100644\n--- a/app/test-pmd/config.c\n+++ b/app/test-pmd/config.c\n@@ -1009,8 +1009,6 @@ void print_valid_ports(void)\n \tprintf(\"Set MTU failed. diag=%d\\n\", diag);\n }\n \n-/* Generic flow management functions. */\n-\n /** Generate a port_flow entry from attributes/pattern/actions. */\n static struct port_flow *\n port_flow_new(const struct rte_flow_attr *attr,\n",
    "prefixes": [
        "v3",
        "2/3"
    ]
}