get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 45695,
    "url": "http://patches.dpdk.org/api/patches/45695/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1538251641-91511-4-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": "<1538251641-91511-4-git-send-email-orika@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1538251641-91511-4-git-send-email-orika@mellanox.com",
    "date": "2018-09-29T20:07:21",
    "name": "[3/3] app/testpmd: add decap l3 command",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "2fed4025536c5d6e1ded862ee65f1c7225867e7e",
    "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/1538251641-91511-4-git-send-email-orika@mellanox.com/mbox/",
    "series": [
        {
            "id": 1600,
            "url": "http://patches.dpdk.org/api/series/1600/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=1600",
            "date": "2018-09-29T20:07:18",
            "name": "app/testpmd: add l3 encap/decap cmd",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/1600/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/45695/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/45695/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 DE2051B160;\n\tSat, 29 Sep 2018 22:08:12 +0200 (CEST)",
            "from EUR02-VE1-obe.outbound.protection.outlook.com\n\t(mail-eopbgr20041.outbound.protection.outlook.com [40.107.2.41])\n\tby dpdk.org (Postfix) with ESMTP id BACA27CEB\n\tfor <dev@dpdk.org>; Sat, 29 Sep 2018 22:08:08 +0200 (CEST)",
            "from mellanox.com (37.142.13.130) by\n\tAM4PR05MB3427.eurprd05.prod.outlook.com (2603:10a6:205:6::16) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.1185.23; Sat, 29 Sep 2018 20:08:05 +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=aRNs7gNQr8UFpn1TC6S1SzlugmENOdLSa+ElvglzJUo=;\n\tb=osfQ/3f2Y7I2fWO9jBB9h/PhCf6z5HbuLFg/qxm8MCRX7MaUzKd5phe0AN+YCC/qs+MJWKN+bfbxJbDyctKwHYcovpxMW6bC7wo+7nlKO9pwVSZtLKNNazaNNNYkkb8i1jf0fyrrUOWrilTO2OEJoeJ5RPd1wJnncYMTB4qbEvs=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=orika@mellanox.com; ",
        "From": "Ori Kam <orika@mellanox.com>",
        "To": "wenzhuo.lu@intel.com, jingjing.wu@intel.com, bernard.iremonger@intel.com,\n\tarybchenko@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": "Sat, 29 Sep 2018 20:07:21 +0000",
        "Message-Id": "<1538251641-91511-4-git-send-email-orika@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1538251641-91511-1-git-send-email-orika@mellanox.com>",
        "References": "<1538251641-91511-1-git-send-email-orika@mellanox.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[37.142.13.130]",
        "X-ClientProxiedBy": "HE1PR05CA0381.eurprd05.prod.outlook.com\n\t(2603:10a6:7:94::40) To AM4PR05MB3427.eurprd05.prod.outlook.com\n\t(2603:10a6:205:6::16)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "67fc5514-6862-4953-29b1-08d6264745fd",
        "X-MS-Office365-Filtering-HT": "Tenant",
        "X-Microsoft-Antispam": "BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020);\n\tSRVR:AM4PR05MB3427; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; AM4PR05MB3427;\n\t3:mYKK1bSahB7ExS+GZz1VjvOuvMOyDFS9rtDgTtAbkpabDnnGEt5ZuhDb0uBexz3EHogyqQz2p1FEErI6/M82Hk705Tq7TkZ8/t3gJop1WRg0y8cPdcbfzQfFaMx3PfAqKylviS/ehRwsRtsTyUD4rG6ZuEwTZh04c8Ea+DFMkEnM1qTnIBcctTX8O//bOlFwprjo2t/q4zRg2lLXO8mVbFpyv8kt5XhrOLQJtwLS7+8OdmUFClrOUgbbYR1g7A4R;\n\t25:Pr+SR/17Guzg7aEQwWNUvPwMPSANNcINeAVSvKzZ24r3eEXqMTC46aL9V4WexbPtZGZw08AYaqss/4w20f3BdTygQ0MIapEOVhbsZuOx8qL82JUnowj1udC131bb3cKv5r4E5YwdicUtx1R2iw7S7DGhMhrqJMpG0qoAyO+X5KhCA6oYCvn+1zrwRmZiTu6fhDK/CsKRLUZZa+nH2XCpZeqnvki0uk5MRWdjZ9nF5JQxxpYqbwk0xWtmadir5pJAX3c/TBqoFRrnzZMuecL/mabBXMmmUDgysYiZAZ/SOXLLit+UWwLV569DfCA9Pvr4O+O+fNdWGkCS7RitD6oE5A==;\n\t31:bySwlmRWiO3fV51pOImb6eWcYXQs3iZoEWCMBY9wRlUDTUc13SzDSLXiIidfEUL28B2GKR53Ust25Q78RjUoiplB5ULPO80xF2WyEMQNxQaeRFEHPKKjAe9MChWXUFnkLKuYdKy1LbWzG1V6JGf4hg2ddhfezXVkcUJ0myN4NixJExIMtojkisZSL9RsRAHQ0XAUWiyee+ZuTrmcgkW9Dg7vS8QElFEVYtpm0nZg1F0=",
            "1; AM4PR05MB3427;\n\t20:ixWN5Y6JhA/Ft3CUgFJxvLX4y+mHZeaniIlD/XLq9/HLk2O+ip7cC+nenuSarxyyvOqMh2BdbnOnUUxpscEa2xyNYwMH6HCNPB/wvPjQxY4+/QruRKY49rc+yepTpj9hwnVdu/wFB/FUx9LSo+q1uSliaO6xYSRvCdLylvBi02YgD52GVPkXsMvbcPbahPeTZCFiVjiYcRP0eIiDl7Wz51wy68oNjfp7tdtRi/eg9CJ/oKfVcJfSmLV6ukVCaTslIBPDup3iuIOr5+UCloIrh7DgbJg0JCyZ/gnnY/MdGNRcukTOelBFGjEjMVkUp7rvPX3ayNJbzqqMPia6jpoCO9kjsxiEfaQG5ozX8mmjrNTlcufTGeeYkFQLOj+L6X808x3mfZJvPmuopnnKpsJxgnw5/Kk+l4jJPFfCbKA6amL1zjvjpK+xU3OBl97ENo19ylhsMvcf5angDpkKN8PnkO7hENFdjcIfr9Ze1PUUE5PwVxJQOsUzNwGNU/eIJlqt;\n\t4:xIyvDYvWrRbcXhBIEBDjDLW+Z002hc8AmLoMjFWAfKpSdHcq7GM+hPlHKD/2pgbTTQ6enJAiw5nTxl1J0sRpL2Lq27mdyT6Cw/x3eSDuDlZE2gDqo/Iv1zVlaeAvSJAyb5H3sh+mwmWr7VkN22aXCjJdMXtC6fhzQEqyT/3aB3Ju2jyHXnE++sGUPBR8H7suDv9zMdGeO9xtmvPAvEFJ3itjvQYfTJd3spljp0BsVU6bA45t7LQ0BQpyBTK73JPP6UzDYFPxD/UASrWDVYsjqNA49Cr+VmATAStKt+MCmVFnnh5U4tqs9/YR8GXiFFoA",
            "=?us-ascii?Q?1; AM4PR05MB3427;\n\t23:UPXCuF/RpIKCTdPi3o3VygvcwxGdvRie7t5N9XfFv?=\n\th4rpuq+lw3pqXnOBvsXi4IEDtKE1LXFQ7He6Evrbi8TEaBgfkH/eKuHzJy4EoO1Vvm+Q0i0sBjik+VKZ2xdZ1awTqurx4UW3AJ7JdiHrkMXneR15MUrHlBVM/4prW61wjB4++FR7ka7c5fJLqCE75Sq7pAHZj07QswrJ0LTg6rSPZ3emdbplJn6buRZ5vcFzv28YBQ5VMvLuh2y7F11x/MoewL6j4UawTsmzJE0cnJSu3/wUQoq5nYvt7M2D63Iacz61aeAHP/7nr0u495unZFscYRVKO+QmvBXE2GH6O1N8489YO4I6DDsdke3Parpqxx0hCTcK8p1IbmnELjz4TJ7FD6ocRZjMmduRBF7rqWOyHQO41+LNlIE/pzPECY5zNq+4j8VZhxcHpsw9NIO6qSYobfTMNmXbRVAajn4jJZF9ogc+PYtnDbC1o9sl/lQrq3P2Yk9z6h0pFWoJUIINXFz7FRhSbyCQ7VNHndRpK0x3A2oQ/vYT9LtglLn5wGZNnbArh7NMR2EyKtLq5ZsENkF5cknT7QlCV3GmdlvkRBwuupiNK/oOE5U9eQiqtC4CuiGQljz+RSNcdEpMCDTQ6pkOOFddylNyi3rNcG0WMXXAkqFJqXCH5mNnFD4ah/ojuhmLo3ASADb2ZyAmnFSpaS5y4Binb9WWId30W+Me6jM0OrTE9OVTXRCTOKdKVj9gIRwU7vwNbhBpcZGWO1sB6rXFaUS9XmUgA+fKkJ4evxpQBrqtPUImxbK3L8U4Wm2mCk+vDpXh/cO3HOCCfJXHJPoCgdLOZVuZ+fnk4Dea8+RzqN6LgH9d3Oe1t0l2pVw19sQhCYCs85EzdGPW6J4+RwM5cZD6R9tKohQVTnY9WE6LuTwQQBpIxo7SsFGRWu8lt+uAhrgrsigRvUnCL/+ny4XW3r8Vr0AM262+dIO1Y7S2lUXwxPeTXdTUOdGRyyEooJFAIhApfnzIaME/WfL/t4TEEoyZc3cvAlZN9aPSGku9N0yFusY+L0ujkrRzVc/Pclgrw21LTzKk5JEMk6xSmPi8l8LRlRPHVaYD1rY17d/k3VpCFJe/0STNwWdFHynSX1t+V4PwTM+XOowb978usrZ/LilJzjmTgMyicJDRbjhTEusml+Xc2Pp3O7KBiLeYXIjDsunqdKzauMGuCHlC8BFC3m2nAU5BNisRCLxwG1+tUSoAtapvklM/XOii/f8n7txo96de+rPj3p/IB05EyJe6rdb7ByrkjnWWpd+3I6riGkLIXSzgReSOBEgyqrkV6prSo2ouhnOtUviYAN+/ILVyJT2ISE7IVcaED9iHbwCyQ==",
            "1; AM4PR05MB3427;\n\t6:SajdKJ4HXfjrWwCdRay6mi1HD/N9ud5DrjOwJ7xHHltGzS2c1PFCNHV3R/qiUJZ+fV3D4AU2Pf7scf+hrdsd14owZzJDFK5o+dZYrcdRPpJSMYK2LphC/PnjPFyIcuW15bC5D4eTPs9s/TELtix+sGHWSrO5mt9JcW1O1i5M9QZM4ut5ys7RTWz84Vp0bdyngLtgESJEICG5cqFFVb0Tyoy7hc7gRk/IHCwve457voj4MgnjVwPG6zBfcZ4+whNXtA/NHLDkgAD/xHXPYF2YnPAT3u/NPgT7NwzhlFc4xRrOclqGQdh+yQJkqCv0TaGTB0wbYnYQ0VcNf40bcIYj4n8dYTDaKaoHSIzWOCs6qhIiIA2GSAHsBCDwkFLtq9L36z7Z48y0/Uh4Zb6QroyEHlN9CR7BAj8HLrFYkMksWi/KntN+nde47F2vMn098D2VNiWT/VEJs9rd/comY/iWnw==;\n\t5:mzFk5ChZASiEKDOj4oRYyjj4X6hP4/UertZUyfixsSJCwKp907U90/JCSEd7dXD8WR02Q/DSutMqdghxIEuCndfbZDwk2FINO2drWceCQhAEzBOgIQaiZt7CQNknka74CE4TIqc1S4tTa2PA2k7vAoWl2JgiWnqqKTGWk4WiRZs=;\n\t7:u8GYEX1Pu8WUHQ9cvBW7sTmMxDcE9vD+rxEefUpmHEky5wPrpUtSQVuB3RTK3Mjw1Xa9spnUGtv68IwlGMKzHsk1X2PDGxwnCPmDSl9Tzh0E7IlhbyNeeU+WyCCYLsjMZbvPRRtEb2Wvx3/2H02bSnvftJOJmWHQG1WzfJ5U+1ggNj1FMIZIvY7759f5xqEJ84EWazdN910v8eG4jswzq+AUJP6K7C2HFlbyQO9ZtULIykRFYZ+q/Y/XUwRXi8BI"
        ],
        "X-MS-TrafficTypeDiagnostic": "AM4PR05MB3427:",
        "X-LD-Processed": "a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr",
        "X-Microsoft-Antispam-PRVS": "<AM4PR05MB342781A0A3BF74517D11189EDBED0@AM4PR05MB3427.eurprd05.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:(17755550239193);",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3231355)(944501410)(52105095)(10201501046)(3002001)(93006095)(93001095)(6055026)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123564045)(20161123558120)(20161123560045)(201708071742011)(7699051);\n\tSRVR:AM4PR05MB3427; BCL:0; PCL:0; RULEID:; SRVR:AM4PR05MB3427; ",
        "X-Forefront-PRVS": "0810818DA0",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(366004)(346002)(396003)(376002)(39860400002)(136003)(199004)(189003)(53936002)(7696005)(105586002)(106356001)(4326008)(107886003)(2906002)(68736007)(478600001)(66066001)(47776003)(21086003)(7416002)(36756003)(48376002)(50466002)(8886007)(33026002)(316002)(4720700003)(6666003)(6116002)(3846002)(97736004)(5660300001)(7736002)(305945005)(55016002)(25786009)(69596002)(16586007)(476003)(2616005)(956004)(16526019)(446003)(186003)(14444005)(81156014)(51416003)(11346002)(81166006)(386003)(52116002)(486006)(4006002)(76176011)(8676002)(86362001)(34290500001)(26005)(8936002)(50226002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:AM4PR05MB3427; 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": "T+kAB+R2gd1sS8uo1uqRl2ZKVxCsnoVqUzbF+fNn+ZLkMOHim6XgSGT2uYMF2wWa+KSRzn0xM/DWq9QfiIPAyQyTcHw7TWxxGJj1F+oESDPJxhJt5c99HYAAZSk1x+XzIfIp646KYO+Ue8ivGTsNehaPGGkL9cpYjgFF615J8XuyntrRyuuQtkxptnqO/51njmaHmznQ3DWyu1mRl+1h8fGqa4CsqcohEUdpbiYWRFBFcxt5rXKPp/aTf7pWHHtWUi2VV4J4CWvLKwo/bxF/tSqruNsmpSafMZ2q5NAS+04QkcBZXyRRP4Pvs+iK3jSAKj9lyjjPu+qnFHA08fNKNW+XD+K4L64kpwZJn3oL0Y4=",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "29 Sep 2018 20:08:05.8212\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "67fc5514-6862-4953-29b1-08d6264745fd",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "a652971c-7d2e-4d9b-a6a4-d149256f461b",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "AM4PR05MB3427",
        "Subject": "[dpdk-dev] [PATCH 3/3] app/testpmd: add decap l3 command",
        "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 commit introduce the decapsulation of L3 tunnels.\nL3 tunnels are tunnels that the inner packet is missing the L3 layer.\nThis command uses the generic L3 decap command and decapsulate any\ntunnel by replacing the outer layers with the supplied L2.\n\nSigned-off-by: Ori Kam <orika@mellanox.com>\n---\n app/test-pmd/cmdline.c                      | 106 ++++++++++++++++++++++++++++\n app/test-pmd/cmdline_flow.c                 |  81 +++++++++++++++++++++\n app/test-pmd/testpmd.h                      |  10 +++\n doc/guides/testpmd_app_ug/testpmd_funcs.rst |  35 +++++++++\n 4 files changed, 232 insertions(+)",
    "diff": "diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c\nindex 2428b04..8fa241f 100644\n--- a/app/test-pmd/cmdline.c\n+++ b/app/test-pmd/cmdline.c\n@@ -15510,6 +15510,110 @@ static void cmd_set_mplsogre_parsed(void *parsed_result,\n \t},\n };\n \n+/** Set decapsulation L3 details */\n+struct cmd_set_decap_l3_result {\n+\tcmdline_fixed_string_t set;\n+\tcmdline_fixed_string_t decap_l3;\n+\tcmdline_fixed_string_t pos_token;\n+\tcmdline_fixed_string_t ip_version;\n+\tuint32_t vlan_present:1;\n+\tuint16_t tci;\n+\tstruct ether_addr eth_src;\n+\tstruct ether_addr eth_dst;\n+};\n+\n+cmdline_parse_token_string_t cmd_set_decap_l3_set =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_set_decap_l3_result, set, \"set\");\n+cmdline_parse_token_string_t cmd_set_decap_l3_decap_l3 =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_set_decap_l3_result, decap_l3,\n+\t\t\t\t \"decap_l3\");\n+cmdline_parse_token_string_t cmd_set_decap_l3_decap_l3_with_vlan =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_set_decap_l3_result, decap_l3,\n+\t\t\t\t \"decap_l3-with-vlan\");\n+cmdline_parse_token_string_t cmd_set_decap_l3_ip_version =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_set_decap_l3_result, pos_token,\n+\t\t\t\t \"ip-version\");\n+cmdline_parse_token_string_t cmd_set_decap_l3_ip_version_value =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_set_decap_l3_result, ip_version,\n+\t\t\t\t \"ipv4#ipv6\");\n+cmdline_parse_token_string_t cmd_set_decap_l3_vlan =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_set_decap_l3_result, pos_token,\n+\t\t\t\t \"vlan-tci\");\n+cmdline_parse_token_num_t cmd_set_decap_l3_vlan_value =\n+\tTOKEN_NUM_INITIALIZER(struct cmd_set_decap_l3_result, tci, UINT16);\n+cmdline_parse_token_string_t cmd_set_decap_l3_eth_src =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_set_decap_l3_result, pos_token,\n+\t\t\t\t \"eth-src\");\n+cmdline_parse_token_etheraddr_t cmd_set_decap_l3_eth_src_value =\n+\tTOKEN_ETHERADDR_INITIALIZER(struct cmd_set_decap_l3_result, eth_src);\n+cmdline_parse_token_string_t cmd_set_decap_l3_eth_dst =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_set_decap_l3_result, pos_token,\n+\t\t\t\t \"eth-dst\");\n+cmdline_parse_token_etheraddr_t cmd_set_decap_l3_eth_dst_value =\n+\tTOKEN_ETHERADDR_INITIALIZER(struct cmd_set_decap_l3_result, eth_dst);\n+\n+static void cmd_set_decap_l3_parsed(void *parsed_result,\n+\t__attribute__((unused)) struct cmdline *cl,\n+\t__attribute__((unused)) void *data)\n+{\n+\tstruct cmd_set_decap_l3_result *res = parsed_result;\n+\n+\tif (strcmp(res->decap_l3, \"decap_l3\") == 0)\n+\t\tdecap_l3_conf.select_vlan = 0;\n+\telse if (strcmp(res->decap_l3, \"decap_l3-with-vlan\") == 0)\n+\t\tdecap_l3_conf.select_vlan = 1;\n+\tif (strcmp(res->ip_version, \"ipv4\") == 0)\n+\t\tdecap_l3_conf.select_ipv4 = 1;\n+\telse if (strcmp(res->ip_version, \"ipv6\") == 0)\n+\t\tdecap_l3_conf.select_ipv4 = 0;\n+\telse\n+\t\treturn;\n+\tif (decap_l3_conf.select_vlan)\n+\t\tdecap_l3_conf.vlan_tci = rte_cpu_to_be_16(res->tci);\n+\trte_memcpy(decap_l3_conf.eth_src, res->eth_src.addr_bytes,\n+\t\t   ETHER_ADDR_LEN);\n+\trte_memcpy(decap_l3_conf.eth_dst, res->eth_dst.addr_bytes,\n+\t\t   ETHER_ADDR_LEN);\n+}\n+\n+cmdline_parse_inst_t cmd_set_decap_l3 = {\n+\t.f = cmd_set_decap_l3_parsed,\n+\t.data = NULL,\n+\t.help_str = \"set decap_l3 ip-version ipv4|ipv6 eth-src <eth-src>\"\n+\t\t\" eth-dst <eth-dst>\",\n+\t.tokens = {\n+\t\t(void *)&cmd_set_decap_l3_set,\n+\t\t(void *)&cmd_set_decap_l3_decap_l3,\n+\t\t(void *)&cmd_set_decap_l3_ip_version,\n+\t\t(void *)&cmd_set_decap_l3_ip_version_value,\n+\t\t(void *)&cmd_set_decap_l3_eth_src,\n+\t\t(void *)&cmd_set_decap_l3_eth_src_value,\n+\t\t(void *)&cmd_set_decap_l3_eth_dst,\n+\t\t(void *)&cmd_set_decap_l3_eth_dst_value,\n+\t\tNULL,\n+\t},\n+};\n+\n+cmdline_parse_inst_t cmd_set_decap_l3_with_vlan = {\n+\t.f = cmd_set_decap_l3_parsed,\n+\t.data = NULL,\n+\t.help_str = \"set decap_l3-with-vlan ip-version ipv4|ipv6\"\n+\t\t\" vlan-tci <vlan-tci> eth-src <eth-src> eth-dst <eth-dst>\",\n+\t.tokens = {\n+\t\t(void *)&cmd_set_decap_l3_set,\n+\t\t(void *)&cmd_set_decap_l3_decap_l3_with_vlan,\n+\t\t(void *)&cmd_set_decap_l3_ip_version,\n+\t\t(void *)&cmd_set_decap_l3_ip_version_value,\n+\t\t(void *)&cmd_set_decap_l3_vlan,\n+\t\t(void *)&cmd_set_decap_l3_vlan_value,\n+\t\t(void *)&cmd_set_decap_l3_eth_src,\n+\t\t(void *)&cmd_set_decap_l3_eth_src_value,\n+\t\t(void *)&cmd_set_decap_l3_eth_dst,\n+\t\t(void *)&cmd_set_decap_l3_eth_dst_value,\n+\t\tNULL,\n+\t},\n+};\n+\n /* Strict link priority scheduling mode setting */\n static void\n cmd_strict_link_prio_parsed(\n@@ -18142,6 +18246,8 @@ struct cmd_config_per_queue_tx_offload_result {\n \t(cmdline_parse_inst_t *)&cmd_set_mplsoudp_with_vlan,\n \t(cmdline_parse_inst_t *)&cmd_set_mplsogre,\n \t(cmdline_parse_inst_t *)&cmd_set_mplsogre_with_vlan,\n+\t(cmdline_parse_inst_t *)&cmd_set_decap_l3,\n+\t(cmdline_parse_inst_t *)&cmd_set_decap_l3_with_vlan,\n \t(cmdline_parse_inst_t *)&cmd_ddp_add,\n \t(cmdline_parse_inst_t *)&cmd_ddp_del,\n \t(cmdline_parse_inst_t *)&cmd_ddp_get_list,\ndiff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c\nindex bedd152..a4f1398 100644\n--- a/app/test-pmd/cmdline_flow.c\n+++ b/app/test-pmd/cmdline_flow.c\n@@ -245,6 +245,7 @@ enum index {\n \tACTION_NVGRE_DECAP,\n \tACTION_MPLSOUDP_ENCAP,\n \tACTION_MPLSOGRE_ENCAP,\n+\tACTION_DECAP_L3,\n };\n \n /** Maximum size for pattern in struct rte_flow_item_raw. */\n@@ -279,6 +280,16 @@ struct action_tunnel_encap_l3_data {\n \tuint8_t buf[ACTION_TUNNEL_ENCAP_MAX_BUFFER_SIZE];\n };\n \n+/** Maximum buffer size for the decap L3 data. */\n+#define ACTION_TUNNEL_DECAP_L3_MAX_BUFFER_SIZE \\\n+\t(sizeof(struct rte_flow_item_eth) + sizeof(struct rte_flow_item_vlan))\n+\n+/** Storage for struct rte_flow_action_tunnel_decap_l3 with external data. */\n+struct action_tunnel_decap_l3_data {\n+\tstruct rte_flow_action_tunnel_decap_l3 conf;\n+\tuint8_t buf[ACTION_TUNNEL_DECAP_L3_MAX_BUFFER_SIZE];\n+};\n+\n /** Maximum number of subsequent tokens and arguments on the stack. */\n #define CTX_STACK_SIZE 16\n \n@@ -802,6 +813,7 @@ struct parse_action_priv {\n \tACTION_NVGRE_DECAP,\n \tACTION_MPLSOUDP_ENCAP,\n \tACTION_MPLSOGRE_ENCAP,\n+\tACTION_DECAP_L3,\n \tZERO,\n };\n \n@@ -944,6 +956,9 @@ static int parse_vc_action_mplsoudp_encap(struct context *,\n static int parse_vc_action_mplsogre_encap(struct context *,\n \t\t\t\t\t  const struct token *, const char *,\n \t\t\t\t\t  unsigned int, void *, unsigned int);\n+static int parse_vc_action_decap_l3(struct context *, const struct token *,\n+\t\t\t\t    const char *, unsigned int, void *,\n+\t\t\t\t    unsigned int);\n static int parse_destroy(struct context *, const struct token *,\n \t\t\t const char *, unsigned int,\n \t\t\t void *, unsigned int);\n@@ -2480,6 +2495,15 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n \t\t.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),\n \t\t.call = parse_vc_action_mplsogre_encap,\n \t},\n+\t[ACTION_DECAP_L3] = {\n+\t\t.name = \"decap_l3\",\n+\t\t.help = \"decap l3 packet, uses configuration set by\"\n+\t\t\t\" \\\"set decap_l3\\\"\",\n+\t\t.priv = PRIV_ACTION(TUNNEL_DECAP_L3,\n+\t\t\t\t    sizeof(struct action_tunnel_decap_l3_data)),\n+\t\t.next = NEXT(NEXT_ENTRY(ACTION_NEXT)),\n+\t\t.call = parse_vc_action_decap_l3,\n+\t},\n };\n \n /** Remove and return last entry from argument stack. */\n@@ -3441,6 +3465,63 @@ static int comp_vc_action_rss_queue(struct context *, const struct token *,\n \treturn ret;\n }\n \n+/** Parse decap_l3 action. */\n+static int\n+parse_vc_action_decap_l3(struct context *ctx, const struct token *token,\n+\t\t\t const char *str, unsigned int len,\n+\t\t\t void *buf, unsigned int size)\n+{\n+\tstruct buffer *out = buf;\n+\tstruct rte_flow_action *action;\n+\tstruct action_tunnel_decap_l3_data *action_decap_data;\n+\tstruct rte_flow_item_eth eth = { .type = 0, };\n+\tstruct rte_flow_item_vlan vlan = {\n+\t\t.tci = mplsogre_encap_conf.vlan_tci,\n+\t\t.inner_type = 0,\n+\t};\n+\tuint8_t *header;\n+\tint ret;\n+\n+\tret = parse_vc(ctx, token, str, len, buf, size);\n+\tif (ret < 0)\n+\t\treturn ret;\n+\t/* Nothing else to do if there is no buffer. */\n+\tif (!out)\n+\t\treturn ret;\n+\tif (!out->args.vc.actions_n)\n+\t\treturn -1;\n+\taction = &out->args.vc.actions[out->args.vc.actions_n - 1];\n+\t/* Point to selected object. */\n+\tctx->object = out->args.vc.data;\n+\tctx->objmask = NULL;\n+\t/* Copy the headers to the buffer. */\n+\taction_decap_data = ctx->object;\n+\t*action_decap_data = (struct action_tunnel_decap_l3_data) {\n+\t\t.conf = (struct rte_flow_action_tunnel_decap_l3){\n+\t\t\t.buf = action_decap_data->buf,\n+\t\t},\n+\t\t.buf = {},\n+\t};\n+\theader = action_decap_data->buf;\n+\tif (decap_l3_conf.select_vlan)\n+\t\teth.type = rte_cpu_to_be_16(ETHER_TYPE_VLAN);\n+\tmemcpy(eth.dst.addr_bytes, decap_l3_conf.eth_dst, ETHER_ADDR_LEN);\n+\tmemcpy(eth.src.addr_bytes, decap_l3_conf.eth_src, ETHER_ADDR_LEN);\n+\tmemcpy(header, &eth, sizeof(eth));\n+\theader += sizeof(eth);\n+\tif (decap_l3_conf.select_vlan) {\n+\t\tif (decap_l3_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+\taction_decap_data->conf.size = header - action_decap_data->buf;\n+\taction->conf = &action_decap_data->conf;\n+\treturn ret;\n+}\n+\n /** Parse tokens for destroy command. */\n static int\n parse_destroy(struct context *ctx, const struct token *token,\ndiff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h\nindex fea7418..e43529f 100644\n--- a/app/test-pmd/testpmd.h\n+++ b/app/test-pmd/testpmd.h\n@@ -519,6 +519,16 @@ struct mplsogre_encap_conf {\n };\n struct mplsogre_encap_conf mplsogre_encap_conf;\n \n+/* decap l3 parameters. */\n+struct decap_l3_conf {\n+\tuint32_t select_ipv4:1;\n+\tuint32_t select_vlan:1;\n+\trte_be16_t vlan_tci;\n+\tuint8_t eth_src[ETHER_ADDR_LEN];\n+\tuint8_t eth_dst[ETHER_ADDR_LEN];\n+};\n+struct decap_l3_conf decap_l3_conf;\n+\n static inline unsigned int\n lcore_num(void)\n {\ndiff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst\nindex 4308109..46a764c 100644\n--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst\n+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst\n@@ -1602,6 +1602,20 @@ flow rule using the action mplsogre_encap will use the last configuration set.\n To have a different encapsulation header, one of those commands must be called\n before the flow rule creation.\n \n+Config decapsulation L3\n+~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Configure the layer 2 header value of the inner packet::\n+\n+ set decap_l3 ip-version (ipv4|ipv6) eth-src (eth-src) eth-dst (eth-dst)\n+ set mplsoudp-with-vlan ip-version (ipv4|ipv6) vlan-tci (vlan-tci) \\\n+ eth-src (eth-src) eth-dst (eth-dst)\n+\n+Those command will set an internal configuration inside testpmd, any following\n+flow rule using the action decap_l3 will use the last configuration set.\n+To have a different decapsulation header, one of those commands must be called\n+before the flow rule creation.\n+\n Port Functions\n --------------\n \n@@ -3735,6 +3749,9 @@ This section lists supported actions and their attributes, if any.\n - ``mplsogre_encap``: Performs a MPLSoGRE encapsulation, outer layer\n   configuration is done through `Config MPLSoGRE Encap outer layers`_.\n \n+- ``decap_l3``: Performs a decapsulation of l3 tunnel, L2 configuratin\n+  is done through `Config decapsulation L3`_.\n+\n Destroying flow rules\n ~~~~~~~~~~~~~~~~~~~~~\n \n@@ -4121,6 +4138,24 @@ IPv6 MPLSoUDP outer header::\n         eth-dst 22:22:22:22:22:22\n  testpmd> flow create 0 egress pattern end actions mplsoudp_encap / end\n \n+Sample decapsulation l3 rule\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+Decapsulation of L3 tunnel has default L2 value pre-configured in testpmd\n+source code, those can be changed by using the following commands\n+\n+IPv4 L2 header::\n+\n+ testpmd> set decap_l3 ip-version ipv4 eth-src 11:11:11:11:11:11\n+        eth-dst 22:22:22:22:22:22\n+ testpmd> flow create 0 ingress pattern eth / ipv4 / udp / mpls / end actions\n+        decap_l3 / end\n+\n+ testpmd> set decap_l3-with-vlan ip-version ipv4 vlan-tci 34\n+        eth-src 11:11:11:11:11:11 eth-dst 22:22:22:22:22:22\n+ testpmd> flow create 0 ingress pattern eth / ipv4 / udp / mpls / end actions\n+        decap_l3 / end\n+\n BPF Functions\n --------------\n \n",
    "prefixes": [
        "3/3"
    ]
}