From patchwork Wed Oct 17 17:07:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ori Kam X-Patchwork-Id: 46998 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 755671B146; Wed, 17 Oct 2018 19:08:53 +0200 (CEST) Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0055.outbound.protection.outlook.com [104.47.1.55]) by dpdk.org (Postfix) with ESMTP id D2F891B125 for ; Wed, 17 Oct 2018 19:08:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hGz096Qta6YUJepAX6J2/KKjo/ZWHcKcentez9nUxDE=; b=co5hZEnaczUhOOUkjGwgvtBGQc7QnFX4TsdSRhI9CW8nuazSrJpLZzHAMX4mYdg7G1PlSjvPwc1Zzvt/sIiNQ3d+LpRY8r3MOcULi/xORho9xTgxRTi7joV1+fkCUbKfehWRK5TKK5+DoxHNRYG4ZrozJu5suL+7N+zuKjHrMkA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=orika@mellanox.com; Received: from mellanox.com (37.142.13.130) by VI1PR05MB3440.eurprd05.prod.outlook.com (2603:10a6:802:1e::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1228.26; Wed, 17 Oct 2018 17:08:44 +0000 From: Ori Kam To: wenzhuo.lu@intel.com, jingjing.wu@intel.com, bernard.iremonger@intel.com, arybchenko@solarflare.com, ferruh.yigit@intel.com, stephen@networkplumber.org, adrien.mazarguil@6wind.com Cc: dev@dpdk.org, dekelp@mellanox.com, thomas@monjalon.net, nelio.laranjeiro@6wind.com, yskoh@mellanox.com, orika@mellanox.com, shahafs@mellanox.com Date: Wed, 17 Oct 2018 17:07:50 +0000 Message-Id: <1539796072-111646-2-git-send-email-orika@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1539796072-111646-1-git-send-email-orika@mellanox.com> References: <1539726023-14402-1-git-send-email-orika@mellanox.com> <1539796072-111646-1-git-send-email-orika@mellanox.com> MIME-Version: 1.0 X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: CWLP265CA0320.GBRP265.PROD.OUTLOOK.COM (2603:10a6:401:57::20) To VI1PR05MB3440.eurprd05.prod.outlook.com (2603:10a6:802:1e::18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1faaadb3-271d-47f2-3aca-08d63453329e X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR05MB3440; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB3440; 3:8YN0uxdm2p2qNoE16ettKafvY6+YB8EA8YjdLSptYhMyixCSBubb/W3Waa+QVeHu7bQa041TUGbwVQDzIAk/XfJwdzxdvoCqxXBAextN2vrTCYR/KWufBO1X4r/x/qf/P4478jhSqV1YmZ7Zszh+XSlDnhYYUGCWuq75tiO18En/ms6Qip1wzsuuJaDGVdB1nRyC+5EC7jZT6uzGueZtX1SiDEu8RXitQynQ1qaenfXe9rAhRTygakMaYbVi12Vt; 25:QYFMZ8iPaC1vtrpnvNexkTf84qIDJLDQIbKpet+NPlCIP8rrg77y2pmwfAyAZzCfi3qmofappeyCOtupYVhyKRphpU9Ad8rTGKu7j6u8/62Ce9ogXQnWWmPk6KH6cO8jdCkup3KIBjeuWAZHnZgj0+/9Y0ERSnPZdOtU4iwYXW4OwSMti5gqwEcNUtC/2Glj3FqWyebTTvSP7YTivQc7WzckmxkBitC4lUc57xgW8EPS1CjDwkmFe4GQ4IXtl4KBB3ZyvbvKoznpwEI8tYDSGmEeJW0vNrJj7kmM+scj6m7K9gDk6M7eGVebt1QEBgjTLdPKeuN2Tw6AxypU1O6uaA==; 31:pnYpj3S6gR1xFaCsiHNY95tzfJ2yix46amGGMiVe9CCkVwQxthMD6k6q3gejJsQ52O0tgjZsMkNXCz+ElVCJMBatsQMrucDeoDMU8K8/8no6Oe4I9XIFa5EP6oDXySZjxTj3NsrYmWdUvu4C073LrJgwLHn5p0bndG44hLHI6hGdT9nhA5GWpxz3fqWTRIBUz+YJ/vXR9XYq9M1n0ZVcx3dazTRFGAO1XJpV7MtST/0= X-MS-TrafficTypeDiagnostic: VI1PR05MB3440: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB3440; 20:HBeg4wg3YulFwZNfEgqboUDAncdvp0n7PLWXOfILH2uu9hGg3tedw5zPhFvfmt3OyksY/J2L5Z1FYXyoNuTD376sMANFz+uU3WHq/pOPOXMb46jrN176ng47tYzdFAK4RQKR3xlUkv9pQ8seux66o3Rrikh/Nhke52u+KwAzWhtpSarU0FFF4OBm+WkW018AAyWc6AizOdSLRz+ujsiouOiyROsJSJSr9xUmV79aNq4RlwMGMZ2dCJaE0PNm6j2WcTpaNd4651GL2NxwZAcEC/yLqQ0EriXyyq4EwCDLw9Pdxve067ZV8CwhqBV8vLOJE7B2L08dKGrHj215yQQyk6tGQ7c5oPSbs21FAIkyVyrN5m+LIP34eDea9BFhrjDwbx90bQLWmgz2+T4DLBKElBoIqi5Yjk7aVmh+5c9EZZ1FimtZnEu3O82lIfxJmFLWZQvcDq9myAWiGbU8NGwuAUOi9egqK6cPh/ZuskjOkpWFU7rUUblmTYMe7E3sVfAi; 4:VwTmIXoQ85ve6hvj6sAtkD1pUSqf/OBqMrdxeqcQWf+hP1aIfRM8NtOdbXh/pObEJSlmIBlOYmnMPL6DeycmjXtVOPBC2DLNm010rWfoDq4eRXZW8biOtLwoKyDVK1nY23w7xHpW2LAdkFK9b4SXHpV+1Fn9Eeu8FOSZCMb2ox7WRRvPaAAatPnVu5HgfiAa55XJTkzBJ6PuOIE54nhJ0WY3bvlB74Tq8ykLd4PIZN28IvkEuNyFjmQxpgvBGgADYNabPrXePoxdEAwaNVg7tg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(3231355)(944501410)(52105095)(10201501046)(93006095)(93001095)(6055026)(149066)(150057)(6041310)(20161123560045)(20161123558120)(20161123562045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:VI1PR05MB3440; BCL:0; PCL:0; RULEID:; SRVR:VI1PR05MB3440; X-Forefront-PRVS: 08286A0BE2 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(39860400002)(136003)(396003)(376002)(366004)(199004)(189003)(48376002)(186003)(25786009)(53936002)(4720700003)(4326008)(16526019)(47776003)(7416002)(66066001)(8936002)(7736002)(305945005)(86362001)(14444005)(26005)(6666004)(55016002)(3846002)(33026002)(6116002)(2906002)(68736007)(386003)(50226002)(446003)(478600001)(51416003)(476003)(2616005)(8886007)(50466002)(81166006)(97736004)(956004)(21086003)(69596002)(52116002)(81156014)(7696005)(316002)(36756003)(8676002)(5660300001)(106356001)(107886003)(486006)(76176011)(11346002)(105586002)(16586007); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB3440; H:mellanox.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB3440; 23:TVdXEGvbGmMBZ+YgfTPWgU4uEBVShfbfOCtLOpGYT?= GQkcE6nZ5A8AaGuDpheffqZe1T+B5Cy7AK/sIi6LVC3oDR9HV8c3DAuQ0EAHn/I9/N5Z9+gJ0EH8W1qJFCwlbAArX2uUrzUPBOH09hzf32HVd3Erly2Pu+pbkNy2EklumgQqtSQkdwoAlWRpEgUYTqk6P1d8akMlt2jXXOJofXr5lGJBdChbpVcA68wv+sX08Ao3WPRpBkBTJ7hvZSg15f3s9iK25MfO7mqimTftntFGIS/2aZ7HShbwp9mtsigZq+Oz6ICDxgKwNEYw4A2W+8wt+00Z4/eTAO8ZOZ+w9F6+ASWCgQKfOZDQfX5TifytmhLooBtcWWdxwB+qwru+ZOByqBauLF/+gRWF/tnmAMUyGlQj3J8xoUPbKTbH/6XAtwh6tDf5xei3qR4PnLtdTKd2AguvHvQRhKiURCKyO9JvSJRaIRsa3E3cAYfUpSLk+bfhsE0MS1vFojSOHbqRKVmLOP3ZLbWAw0gcwe12E1GVWlAbFZhqFfjJCXSZCqf1mv/nuik53dZ+uPVdtAC7dBbCdiGayrKyy7IuuYfWa0TUNQxCqVUsZIOdAwYER+3EO/aW+MktEba24Iy4atVkfaXHISaxUqrPAla9g8+bGmGXkE6a8NVErY4+B+BOns+zTVyI339QhXD45TAKgW4sgLSXlIGiY6l+C0Xfa6DIbcUjXYTFMxijfeBGsUhyLsumnhKgiyiCAMPzcE1c5QNA4dnHmdGPWaJKJA6NM9LfyJaLCFYGQjKXJOA65E5ct2OH22u819og3G4vKvv9X1s3s2R0c6+6z6ZCt0ffofKNXft6PkTr/cEy/6XRR5elaz+fTchCxSgAKOhlwHjDwJHLbX2yU1EjR16v62//AjZ7c+vNaTWIU/tqvtIkZM4XKmH2m9DEF+SJe65z0fLPOCaVCre3nrOT30J/rIf1uzwkjov8V5b9zygEiAQfn5XMAVeULEfRaQVbZUx7e/pzS9gjBtO0oz2GmT3ZlvdTZyRsoDxfFvcBb0CEeZfnftYGoVjDx2u8X0IE4ASY0yBotk1M4rAw6QsQzqhQg3xP4Ai8S1QCkQZ8mNDKFWG59Srh2fic1WDBsIu8JyeP9AHSaNhicAAgbb/L+RQ9nWFrYuf96iFr4UUR2QVp4N/fBzuvBHaLP7z9ALy5YZ/J+yKmHX619vlrdcdXVY4I+o6XQPatQEr2/s0ErSlPFXkM+iFtzm3DoYmqnXD2BCMzOFzdo9ACo/9O+8tdjtV4PSViKo1dPF6ag== X-Microsoft-Antispam-Message-Info: AUAMKdq026TwIFV6WTRuxZXP6DX7H6Yibs6JsZRHQBu5qv+TjcthxtlQmVluWPs8GQkieGODRCnAA5RVYV8iZ3YsUteQK316XmoH+wMwKUv71K728s4SrXMQfjuRb7WVSLrV1y8ksfs0DJDK834K+/q0FEucnxTaqC0dWBGt33LuaGBpl38djzpjIunV6r7QR74lXnHi9MBqHVecNrBZqBf9OpzTsOMcUtniK1nrOFM7ngZHVxJrDG9+StYQ3fHQPefpn6O8xEn4TqdR40Kg2UZU234gdrJhOqdQgMj7JypBdpv+oGiyLQ2lSXex5gcrEJaqCtS6qXjQfF7l3NbTAjA1X7EdxaqoVuPT7T7Kxys= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB3440; 6:MwHiRDKJjPFdwaeJuo9M7aKKGNULWITaHmh/pp4zQslTEwLtTxkoaOQn7BSTHrhYfHOhdcuoQ1HGzv6NfVLr2gU4Tu0C48xdELR2tGEFIuh5fuQNMRMQzm13KmWfIwOgRjcTgqotz4NSMnjnlKm6HPd9jxajaK/QhSILvSsondOnugFDwEaHfEHDkcvbjKlqaUv2XMTGr7OBtGhv2RTf4Clvg8jy1df189F8K2ryl7+mwCIvgcTa0i5JDA2rcr2aBBw6kcHvvhUKGynXJ6PKKaF+u/+yBhBp3lm1/aNcLE0EGcXZzcNrrY15PSdf0MP6VmZuABxJSaxxu9gnetuXgn2f+zRwQ7kAPd3Wo22KFZ/s3lW+nCLozmA+37aD5cEQqHDLJ8dV9nOUGTAWRzoaISMWwC3TczpTAgTYQwoYSywU3WOAL8lp2EbjtvApsXLunJNtqSSCFf5EYA4P7tvzrQ==; 5:kH87p4fJz8ha8QXLrACe8VwXtOSwG4rmDpNCmdTKH+H8hHTkq/TstCoeNVoZLWpgXQvTmibbro6K4yMnCv49BxnJLhdgHA/8genCP9/nT1KH5kLe599+z+iMz+MSYfPAcnMK9iuU27nxY0eMB83GKH5aA6L5uc4xiQVxLnLkg9w=; 7:gkbOZvtE44jmG6BFUo8+hgeirqrc/vlKx/zAAvypOqg5T470oTJ4xcm/8E2ww9g5S+urbsVnV2Wp+TNqbXXYao4QHYWqhDlx139oP4XCuFaftnCWoJvkKFxldnAd0aQhccj5n9vRq5sLom+tPZcl6pVev4YiFI+3ZGYHE+B1sq08WLU6MFJyZXftw++Tl83kZnIaoBvODsXJPI9bECQRcaPEsu9XC1gWF1rtGz/U+I5cpUcBcrT3X/Q5YCU+sE/t SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2018 17:08:44.0103 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1faaadb3-271d-47f2-3aca-08d63453329e X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB3440 Subject: [dpdk-dev] [PATCH v5 1/3] ethdev: add raw encapsulation action X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Currenlty the encap/decap actions only support encapsulation of VXLAN and NVGRE L2 packets (L2 encapsulation is where the inner packet has a valid Ethernet header, while L3 encapsulation is where the inner packet doesn't have the Ethernet header). In addtion the parameter to to the encap action is a list of rte items, this results in 2 extra translation, between the application to the actioni and from the action to the NIC. This results in negative impact on the insertion performance. Looking forward there are going to be a need to support many more tunnel encapsulations. For example MPLSoGRE, MPLSoUDP. Adding the new encapsulation will result in duplication of code. For example the code for handling NVGRE and VXLAN are exactly the same, and each new tunnel will have the same exact structure. This patch introduce a raw encapsulation that can support L2 tunnel types and L3 tunnel types. In addtion the new encapsulations commands are using raw buffer inorder to save the converstion time, both for the application and the PMD. In order to encapsulate L3 tunnel type there is a need to use both actions in the same rule: The decap to remove the L2 of the original packet, and then encap command to encapsulate the packet with the tunnel. For decap L3 there is also a need to use both commands in the same flow first the decap command to remove the outer tunnel header and then encap to add the L2 header. Signed-off-by: Ori Kam Acked-by: Andrew Rybchenko --- v5: * fix typos. --- doc/guides/prog_guide/rte_flow.rst | 51 ++++++++++++++++++++++++++++++++ lib/librte_ethdev/rte_flow.c | 2 ++ lib/librte_ethdev/rte_flow.h | 59 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) diff --git a/doc/guides/prog_guide/rte_flow.rst b/doc/guides/prog_guide/rte_flow.rst index a5ec441..5212b18 100644 --- a/doc/guides/prog_guide/rte_flow.rst +++ b/doc/guides/prog_guide/rte_flow.rst @@ -2076,6 +2076,57 @@ RTE_FLOW_ERROR_TYPE_ACTION error should be returned. This action modifies the payload of matched flows. +Action: ``RAW_ENCAP`` +^^^^^^^^^^^^^^^^^^^^^ + +Adds outer header whose template is provided in it's data buffer, +as defined in the ``rte_flow_action_raw_encap`` definition. + +This action modifies the payload of matched flows. The data supplied must +be a valid header, either holding layer 2 data in case of adding layer 2 after +decap layer 3 tunnel (for example MPLSoGRE) or complete tunnel definition +starting from layer 2 and moving to the tunnel item itself. When applied to +the original packet the resulting packet must be a valid packet. + +.. _table_rte_flow_action_raw_encap: + +.. table:: RAW_ENCAP + + +----------------+----------------------------------------+ + | Field | Value | + +================+========================================+ + | ``data`` | Encapsulation data | + +----------------+----------------------------------------+ + | ``preserve`` | Bit-mask of data to preserve on output | + +----------------+----------------------------------------+ + | ``size`` | Size of data and preserve | + +----------------+----------------------------------------+ + +Action: ``RAW_DECAP`` +^^^^^^^^^^^^^^^^^^^^^^^ + +Remove outer header whose template is provided in its data buffer, +as defined in the ``rte_flow_action_raw_decap`` + +This action modifies the payload of matched flows. The data supplied must +be a valid header, either holding layer 2 data in case of removing layer 2 +before eincapsulation of layer 3 tunnel (for example MPLSoGRE) or complete +tunnel definition starting from layer 2 and moving to the tunnel item itself. +When applied to the original packet the resulting packet must be a +valid packet. + +.. _table_rte_flow_action_raw_decap: + +.. table:: RAW_DECAP + + +----------------+----------------------------------------+ + | Field | Value | + +================+========================================+ + | ``data`` | Decapsulation data | + +----------------+----------------------------------------+ + | ``size`` | Size of data | + +----------------+----------------------------------------+ + Action: ``SET_IPV4_SRC`` ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/lib/librte_ethdev/rte_flow.c b/lib/librte_ethdev/rte_flow.c index bc9e719..1e5cd73 100644 --- a/lib/librte_ethdev/rte_flow.c +++ b/lib/librte_ethdev/rte_flow.c @@ -123,6 +123,8 @@ struct rte_flow_desc_data { MK_FLOW_ACTION(VXLAN_DECAP, 0), MK_FLOW_ACTION(NVGRE_ENCAP, sizeof(struct rte_flow_action_vxlan_encap)), MK_FLOW_ACTION(NVGRE_DECAP, 0), + MK_FLOW_ACTION(RAW_ENCAP, sizeof(struct rte_flow_action_raw_encap)), + MK_FLOW_ACTION(RAW_DECAP, sizeof(struct rte_flow_action_raw_decap)), MK_FLOW_ACTION(SET_IPV4_SRC, sizeof(struct rte_flow_action_set_ipv4)), MK_FLOW_ACTION(SET_IPV4_DST, diff --git a/lib/librte_ethdev/rte_flow.h b/lib/librte_ethdev/rte_flow.h index 68bbf57..4066483 100644 --- a/lib/librte_ethdev/rte_flow.h +++ b/lib/librte_ethdev/rte_flow.h @@ -1508,6 +1508,20 @@ enum rte_flow_action_type { RTE_FLOW_ACTION_TYPE_NVGRE_DECAP, /** + * Add outer header whose template is provided in its data buffer + * + * See struct rte_flow_action_raw_encap. + */ + RTE_FLOW_ACTION_TYPE_RAW_ENCAP, + + /** + * Remove outer header whose template is provided in its data buffer. + * + * See struct rte_flow_action_raw_decap + */ + RTE_FLOW_ACTION_TYPE_RAW_DECAP, + + /** * Modify IPv4 source address in the outermost IPv4 header. * * If flow pattern does not define a valid RTE_FLOW_ITEM_TYPE_IPV4, @@ -1946,6 +1960,51 @@ struct rte_flow_action_nvgre_encap { * @warning * @b EXPERIMENTAL: this structure may change without prior notice * + * RTE_FLOW_ACTION_TYPE_RAW_ENCAP + * + * Raw tunnel end-point encapsulation data definition. + * + * The data holds the headers definitions to be applied on the packet. + * The data must start with ETH header up to the tunnel item header itself. + * When used right after RAW_DECAP (for decapsulating L3 tunnel type for + * example MPLSoGRE) the data will just hold layer 2 header. + * + * The preserve parameter holds which bits in the packet the PMD is not allowed + * to change, this parameter can also be NULL and then the PMD is allowed + * to update any field. + * + * size holds the number of bytes in @p data and @p preserve. + */ +struct rte_flow_action_raw_encap { + uint8_t *data; /**< Encapsulation data. */ + uint8_t *preserve; /**< Bit-mask of @p data to preserve on output. */ + size_t size; /**< Size of @p data and @p preserve. */ +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * + * RTE_FLOW_ACTION_TYPE_RAW_DECAP + * + * Raw tunnel end-point decapsulation data definition. + * + * The data holds the headers definitions to be removed from the packet. + * The data must start with ETH header up to the tunnel item header itself. + * When used right before RAW_DECAP (for encapsulating L3 tunnel type for + * example MPLSoGRE) the data will just hold layer 2 header. + * + * size holds the number of bytes in @p data. + */ +struct rte_flow_action_raw_decap { + uint8_t *data; /**< Encapsulation data. */ + size_t size; /**< Size of @p data and @p preserve. */ +}; + +/** + * @warning + * @b EXPERIMENTAL: this structure may change without prior notice + * * RTE_FLOW_ACTION_TYPE_SET_IPV4_SRC * RTE_FLOW_ACTION_TYPE_SET_IPV4_DST * From patchwork Wed Oct 17 17:07:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ori Kam X-Patchwork-Id: 46999 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2B4951B154; Wed, 17 Oct 2018 19:08:55 +0200 (CEST) Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0051.outbound.protection.outlook.com [104.47.1.51]) by dpdk.org (Postfix) with ESMTP id AD9471B14D for ; Wed, 17 Oct 2018 19:08:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=sheNbReVQwU10yKAjwJzkPLIN1Q8tgn2l+RZpH1h74c=; b=IZhF0YR8h93e+QHt8olBWjGEhEqax3arpimZmIB3v/K4qIMZbmmYa6iTv7wdaDxyMXaevklnXkcmLBOaAjEyqfQDXroWQ7ImFZfRvL9BXtCd7FshD+9AfC7GA8aNvLzOE1lf4wP6QqFIyrBM520+8n9lqJgARTAVqwUhfm9oLN4= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=orika@mellanox.com; Received: from mellanox.com (37.142.13.130) by VI1PR05MB3440.eurprd05.prod.outlook.com (2603:10a6:802:1e::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1228.26; Wed, 17 Oct 2018 17:08:45 +0000 From: Ori Kam To: wenzhuo.lu@intel.com, jingjing.wu@intel.com, bernard.iremonger@intel.com, arybchenko@solarflare.com, ferruh.yigit@intel.com, stephen@networkplumber.org, adrien.mazarguil@6wind.com Cc: dev@dpdk.org, dekelp@mellanox.com, thomas@monjalon.net, nelio.laranjeiro@6wind.com, yskoh@mellanox.com, orika@mellanox.com, shahafs@mellanox.com Date: Wed, 17 Oct 2018 17:07:51 +0000 Message-Id: <1539796072-111646-3-git-send-email-orika@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1539796072-111646-1-git-send-email-orika@mellanox.com> References: <1539726023-14402-1-git-send-email-orika@mellanox.com> <1539796072-111646-1-git-send-email-orika@mellanox.com> MIME-Version: 1.0 X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: CWLP265CA0320.GBRP265.PROD.OUTLOOK.COM (2603:10a6:401:57::20) To VI1PR05MB3440.eurprd05.prod.outlook.com (2603:10a6:802:1e::18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 125e3173-dbe0-48a2-edd8-08d634533402 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:VI1PR05MB3440; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB3440; 3:hHJnnQRW8lU1waEY8Tqwq8YxwokaSRnxs5V4/7ds/oBG43W/cvF09wSSnSKIDOFm3JaQ5RM53k6VIGj+2M4UuN2Sh3CFXxAaZOQghVmcJOZUexNXgyKwaKVskaJ2gFfYCAj6so9HyDouEaDbP5Wvgsx7xF6EtticuqHD4irAcv7oyJkFyixPIJQSlrhJ1Yt0JW6S+fbIkioDUuPqstgMe6w4tBpGqzIabyKam7Ak9uP+xRi1MW22ZV43VFpvBHHf; 25:Ne433u2DprWnB4wzBa5P4fQOigu/Waq5MAa514gsr1bm9vhkdIEWwms+7BfAoyNKSZBIRCU7HgUJDwFMaUQs/lKSdFeAPxQNk1OeTQ96m6DAE433DC2BD3NhxYNtGM0UPF7yYYES3fxm+uTsD35WthQ67uvOtemrf9QOLJhKsGvEICgePgW/4GLdaEfwELNcJNjShRZCFxdsn8589eCEwnsRl0VK/ftwBy1dD4DVIZ6csQR9yR6vs5d800yyV7v3XKJd+xm8+labH3/w9W5ybPKxonwKWN4auWZS2+Kl8Ai2UMFjv6IxFv26HqK9aTzCgwJx8Ynoxqyj3F4SteMSvA==; 31:KC7KK/rrEMWRv8rfnPSrXdzDr2XxBODoklam6DJQoMeaED3xMuolh5QoKBYiCd9zCOR1KjHvxKgtg6v5fb0jsMs5ETNUNchxUoeo0b1n073rO4SEHiDCaZAfab9olsy34P0JxHJFkCIP/2VQnj4l3aJFpXJ3+YYvZN4M5BvztyyEm7d2RsEuNdU7J5jDAGI47taOH2BTiaekBG8dJ0lvQyFn6SqkjpVmKWtUSf6t3os= X-MS-TrafficTypeDiagnostic: VI1PR05MB3440: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB3440; 20:caEulETGCfj12v1QDLsc03Xg+aGxu/x3M12QI1E6bX5er/1lZ0O1/rsQm7asElRGNkRsPFMx4JQIwBZ1dlr5DFkRouTzDLXsA3PxQTfDfk5FYQqZ23GzL0DhUoCGXhKuwwaCkU5hmm3QAidDURe4Zfi1UqQqMGlJUHGTpimjUVlV35oHwY+nwglaH/u1JAoFijSSDKooB3mdq66Et55dM1psxV7vnOX/bNxv8Oy62Kpk6hB44qthjZUmiO6NoSMPrQZvmAIgLd7+Opx0y4HvQI8/LS2KkUQ9alssWTyakORkHEE2h7/TDP+Ypg3ZuiYr3sbQsLYjIMTNZPDqJnsmY3NKimSkeKMiqlGGjaZTfJmWnYxsXI3eallnimF6fmBlVwqvwgpdp+p8qRAVZ95y++DBHGYfw0D5j3/Tao3VoLeqyFdeXLmuYUAp+qDCE+dH7dONAR0uorc7TAAf/dmHFbSo6NHGd5jj3VO76/6Rn0eOjkjrI5Mh+k1UcA1/xATF; 4:3rwWIuv8HwI/aDJSBoXiCqj2HAGkbtOHrgO97K3FgCuRYMIkPFBElqyXU0Fk4IFbk2j2XdS3Nyn3X9F0QPPz1sqWeb8jDw26sl25w4615XrrKoovhcto0GmaNnGzdVuOwMPTmnxstNzrDbMuIjNcEspjP1UGBAehp5MvEWHoXYvymLifwxHV+yjmT44uMn57TavqIT9Y0MhCDQ/uVC4toeaMVmzybAa6OdOBnrvZQ7TcRigHEkb6YjQkHHtLsLxizq+tqUpqYAJGr+tRQqfsGTXpef3D5Xb0++EUp9N4nq0mhHZqMTEWSR0aH8TC+OUr X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(17755550239193); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(3231355)(944501410)(52105095)(10201501046)(93006095)(93001095)(6055026)(149066)(150057)(6041310)(20161123560045)(20161123558120)(20161123562045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699051)(76991095); SRVR:VI1PR05MB3440; BCL:0; PCL:0; RULEID:; SRVR:VI1PR05MB3440; X-Forefront-PRVS: 08286A0BE2 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(39860400002)(136003)(396003)(376002)(366004)(199004)(189003)(48376002)(186003)(25786009)(53936002)(4720700003)(4326008)(53946003)(16526019)(47776003)(7416002)(66066001)(8936002)(7736002)(305945005)(86362001)(14444005)(26005)(6666004)(55016002)(4744004)(3846002)(33026002)(6116002)(2906002)(68736007)(386003)(50226002)(446003)(478600001)(51416003)(476003)(2616005)(8886007)(50466002)(81166006)(97736004)(956004)(21086003)(69596002)(52116002)(81156014)(7696005)(316002)(36756003)(8676002)(5660300001)(106356001)(107886003)(486006)(76176011)(11346002)(105586002)(16586007)(579004); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB3440; H:mellanox.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB3440; 23:R7/apjcAPSRpSU1t4yLkInL7BVcehLQInyx85OCeF?= NHSrksotLnLbLoV5QCJm6EFw0iiJHBuCc4Z04sT7xqdCGk329NK9CIY2lJsq8TRqDqTvGS69+39KE6XLI+W+mmtpJdvFqKmrR4UWoVVbPdFaztxzgJ+Fnw44XAYWLH+8DLjZ5S/21QcAn8bv+c9KrV8tyBUwopny7DNmEKBKonWwfPDgx8VNbI2j73ALl4xZY37aHWdAgBENhNZ1ZIjsY7es0ZGEoWgXnW3E5civUg8C1mdK6NsFxKZx7PHL8tdcN3U37AoqnmQYZDRb/oHgpTSS/5t3eC1ZwPXodm9nT0ekB+HAYlV+wXjeq9L4QsV4X4hnqxl2NUBxY+/3rvGpUd3d1yZbi6jdbQXAT2F/+4aOpoI92knsHAb/CJzRIk3nCDcdYU4bMzJZfQNhe6aHuh0GJHmMvE8PrAyFoxBG9rmgtHfpdyE4x79LS6QaEq3LYHwL1nPXcLpU+0Xpnz426zF+OZJ3pvcF5IQIAGDIjlz5QAAUMZi9kV7dIemLfxLmt85BMEuTZUtw7sKWm2ybXXujMWAmW6EEVPG9pWc8Sh5dx5XSFurhWiZV5EF4NjoAwnYAe5Q9RIqc/Wcs7Z1O9JDwOvXEK63iPbDDhcpTYs5jY871PBeXd7/nV3nZmsyvMFbaR8C4cuy/oepvYwDvUi2sGXxdv8uwLT1gd35s6Qo5XvuKADZNTeq/R50BRPF1fUTEpwXIMAiltW8ZDBP0978Aob//6pGp0WQcOhxrYffritb4aGD+Oi5QtYBLzVdBwsAj+jKcwdFcYAFy3Ita74J/BZx3G3HG//BZdwD8r2zewQj0+uQIj1+1oJaIot+Hf/mjTlLON5ybYO2tBscFJdMaXLGvyIlInKyzmRn/MB18gfSu1ZIbFiMO+LruMQG7L2bcZsacUK4wq/ppVVs/MvRvz+8/paT2mFEMj9ruJYbwNfW6bh9saqaTP1L0spDQB6bsSvq8ZOVUl+ANlGQVXHAx+QmM+BI7LuBTGunLGw+ASEdKB1fuyiKettje3dODwdlDtRX/5T24r/X2sinGxZNfFc5BsEJjAe2HQD/YPl0dXAveQ5ENr8Dt6/3VYkePe0GyjYa9dV44BKMfBETSufh+QjMRHmNbMZscFKFvWLQXk6xKpKCz/6HqromUdHtQG/cRp1T1rCTdvYLVQP4wAw37gBoRYmEgWuWGNRiF0gnrsPcNq/5OPqUARp/VpNCm6ucaa1a2VblM3NF1W7E0lyQD5PnRDr+yfFG0ATYynedp8XQRGEnikwuw6X7xYYcUAzwijIgyk1WZA6IUozmcgTENjMT0T5iLJYd3gpbJBVfKw== X-Microsoft-Antispam-Message-Info: DqRMAxCPn7sXlKeC4uKMZoD2oSXO3Y+knTMhguVI0IS1U6KkMsFxqN2SKzhafC/GbCS0mCbif7/+sbBsW+XFirrclPQrddZEX8LEPDMZUVs9LAAB8/Hoy129+lk3nKFq+jGibX4vpTBOBl3fqLmJK1wJtkWbp7KqKcSOGxxzISHgbhcQmGf+fUQHFCBxRsBXDhOlsSZ8ezsw5SMt67eXxKl6n3kV399UYtoInQrxJeVIx5j8N13oASzDLlOpQocFOlsuz9mKMG7jBQiJHEXxWz11uw8AnJEgnktoGJi+tLtUHfRmRobMziFSdbJHzsTjqCRB7mHl52Yv+U+I2GGXjmh68Mm9xCFucvQok4Rx+bw= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB3440; 6:CDp9LUKNW6XCta2lZQw1aFJUeYDHIyFWgRNMgA4QgQX+kJZ1+OpwpaD9JC3H+qLJB/yKLr2l6z05cfaPfLHe+b/OY1URUkHZiNOU0KHNctvqmg9n1MlDs6+gj/hYAXE7rZLLCQeqOeKN1fFsoDzXOh5KYSJ7AUTBN+5IS895JAZnq+YevyruX+LtfTi1hkdKkhw/+UisXUAXVyOLXn5LRkHz8zgYSOjUhtG++jpxXv7m0wP59cqMgWAQYTkE+tfzw1yYneIzT+qfFA/i8xrtsp6z17LI4eFe7r5Uif+rEyrp++djhMWFzmli2W8Cs2vQONBLDeXL6Cmc7CpMqEvpvubxouB9258cg47n2XGfzjCNSkxsRLMCMybDeXOQKOE1WUtG60ITJwpANLVMX2GyfFWGx+8FxhzPKdQ4zq6R3KC2sr0P6tklm4H8k5LxZ9lMJ7e++yb9AKcph48lGyKD4w==; 5:197rQd2ZkoEe3Q9lE7BfWPz+f+mImk5yecbwSPNTjajIdMXMXpf6GTM8+NKXhj14BQgjH3MOQObIW6az+1c4UHPfd3MGZZUmpdCPsnVHOP3Oo/uvK63f9I8wesFeviGefPHFKtwWh7mdbKJfcskc7VzUHJF2QjhnMg+WOo9qa1U=; 7:wU4mVqHLzVNqxhLZzaIfSSqyqwbljjFaOvO9CE63uLphxPUJ9lR+NnPeQ30MNezjg7s8Re7oVqKfsT55KKefqWPzyzKAnGN1y1QlPm4XA22rf4jhtqQNKWL3qUGGbht93BPnKDZ7szT/jtjbmSoOqvVg16oduMjVaGBObfIB2KH24nLCYGlOtWUUtuNaySxRWQ84P9J0rm7rs0E4+LidHUB8cZnEJ6QR404apqr6vra0pqBXYRJJqX5T72FD8x5F SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2018 17:08:45.9386 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 125e3173-dbe0-48a2-edd8-08d634533402 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB3440 Subject: [dpdk-dev] [PATCH v5 2/3] app/testpmd: add MPLSoUDP encapsulation X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" MPLSoUDP is an example for L3 tunnel encapsulation. L3 tunnel type is a tunnel that is missing the layer 2 header of the inner packet. Example for MPLSoUDP tunnel: ETH / IPV4 / UDP / MPLS / IP / L4..L7 In order to encapsulate such a tunnel there is a need to remove L2 of the inner packet and encap the remaining tunnel, this is done by applying 2 rte flow commands l2_decap followed by mplsoudp_encap. Both commands must appear in the same flow, and from the point of the packet it both actions are applyed at the same time. (There is no part where a packet doesn't have L2 header). Decapsulating such a tunnel works the other way, first we need to decap the outer tunnel header and then apply the new L2. So the commands will be mplsoudp_decap / l2_encap Due to the complex encapsulation of MPLSoUDP and L2 flow actions and based on the fact testpmd does not allocate memory, this patch adds a new command in testpmd to initialise a global structurs containing the necessary information to make the outer layer of the packet. This same global structures will then be used by the flow commands in testpmd when the action mplsoudp_encap, mplsoudp_decap, l2_encap, l2_decap, will be parsed, at this point, the conversion into such action becomes trivial. The l2_encap and l2_decap actions can also be used for other L3 tunnel types. Signed-off-by: Ori Kam --- app/test-pmd/cmdline.c | 410 ++++++++++++++++++++++++++++ app/test-pmd/cmdline_flow.c | 379 +++++++++++++++++++++++++ app/test-pmd/testpmd.h | 40 +++ doc/guides/testpmd_app_ug/testpmd_funcs.rst | 175 ++++++++++++ 4 files changed, 1004 insertions(+) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 3b469ac..e807dbb 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -15282,6 +15282,408 @@ static void cmd_set_nvgre_parsed(void *parsed_result, }, }; +/** Set L2 encapsulation details */ +struct cmd_set_l2_encap_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t l2_encap; + cmdline_fixed_string_t pos_token; + cmdline_fixed_string_t ip_version; + uint32_t vlan_present:1; + uint16_t tci; + struct ether_addr eth_src; + struct ether_addr eth_dst; +}; + +cmdline_parse_token_string_t cmd_set_l2_encap_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, set, "set"); +cmdline_parse_token_string_t cmd_set_l2_encap_l2_encap = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, l2_encap, "l2_encap"); +cmdline_parse_token_string_t cmd_set_l2_encap_l2_encap_with_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, l2_encap, + "l2_encap-with-vlan"); +cmdline_parse_token_string_t cmd_set_l2_encap_ip_version = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token, + "ip-version"); +cmdline_parse_token_string_t cmd_set_l2_encap_ip_version_value = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, ip_version, + "ipv4#ipv6"); +cmdline_parse_token_string_t cmd_set_l2_encap_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token, + "vlan-tci"); +cmdline_parse_token_num_t cmd_set_l2_encap_vlan_value = + TOKEN_NUM_INITIALIZER(struct cmd_set_l2_encap_result, tci, UINT16); +cmdline_parse_token_string_t cmd_set_l2_encap_eth_src = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token, + "eth-src"); +cmdline_parse_token_etheraddr_t cmd_set_l2_encap_eth_src_value = + TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_l2_encap_result, eth_src); +cmdline_parse_token_string_t cmd_set_l2_encap_eth_dst = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_encap_result, pos_token, + "eth-dst"); +cmdline_parse_token_etheraddr_t cmd_set_l2_encap_eth_dst_value = + TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_l2_encap_result, eth_dst); + +static void cmd_set_l2_encap_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_set_l2_encap_result *res = parsed_result; + + if (strcmp(res->l2_encap, "l2_encap") == 0) + l2_encap_conf.select_vlan = 0; + else if (strcmp(res->l2_encap, "l2_encap-with-vlan") == 0) + l2_encap_conf.select_vlan = 1; + if (strcmp(res->ip_version, "ipv4") == 0) + l2_encap_conf.select_ipv4 = 1; + else if (strcmp(res->ip_version, "ipv6") == 0) + l2_encap_conf.select_ipv4 = 0; + else + return; + if (l2_encap_conf.select_vlan) + l2_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci); + rte_memcpy(l2_encap_conf.eth_src, res->eth_src.addr_bytes, + ETHER_ADDR_LEN); + rte_memcpy(l2_encap_conf.eth_dst, res->eth_dst.addr_bytes, + ETHER_ADDR_LEN); +} + +cmdline_parse_inst_t cmd_set_l2_encap = { + .f = cmd_set_l2_encap_parsed, + .data = NULL, + .help_str = "set l2_encap ip-version ipv4|ipv6" + " eth-src eth-dst ", + .tokens = { + (void *)&cmd_set_l2_encap_set, + (void *)&cmd_set_l2_encap_l2_encap, + (void *)&cmd_set_l2_encap_ip_version, + (void *)&cmd_set_l2_encap_ip_version_value, + (void *)&cmd_set_l2_encap_eth_src, + (void *)&cmd_set_l2_encap_eth_src_value, + (void *)&cmd_set_l2_encap_eth_dst, + (void *)&cmd_set_l2_encap_eth_dst_value, + NULL, + }, +}; + +cmdline_parse_inst_t cmd_set_l2_encap_with_vlan = { + .f = cmd_set_l2_encap_parsed, + .data = NULL, + .help_str = "set l2_encap-with-vlan ip-version ipv4|ipv6" + " vlan-tci eth-src eth-dst ", + .tokens = { + (void *)&cmd_set_l2_encap_set, + (void *)&cmd_set_l2_encap_l2_encap_with_vlan, + (void *)&cmd_set_l2_encap_ip_version, + (void *)&cmd_set_l2_encap_ip_version_value, + (void *)&cmd_set_l2_encap_vlan, + (void *)&cmd_set_l2_encap_vlan_value, + (void *)&cmd_set_l2_encap_eth_src, + (void *)&cmd_set_l2_encap_eth_src_value, + (void *)&cmd_set_l2_encap_eth_dst, + (void *)&cmd_set_l2_encap_eth_dst_value, + NULL, + }, +}; + +/** Set L2 decapsulation details */ +struct cmd_set_l2_decap_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t l2_decap; + cmdline_fixed_string_t pos_token; + uint32_t vlan_present:1; +}; + +cmdline_parse_token_string_t cmd_set_l2_decap_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_decap_result, set, "set"); +cmdline_parse_token_string_t cmd_set_l2_decap_l2_decap = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_decap_result, l2_decap, + "l2_decap"); +cmdline_parse_token_string_t cmd_set_l2_decap_l2_decap_with_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_set_l2_decap_result, l2_decap, + "l2_decap-with-vlan"); + +static void cmd_set_l2_decap_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_set_l2_decap_result *res = parsed_result; + + if (strcmp(res->l2_decap, "l2_decap") == 0) + l2_decap_conf.select_vlan = 0; + else if (strcmp(res->l2_decap, "l2_decap-with-vlan") == 0) + l2_decap_conf.select_vlan = 1; +} + +cmdline_parse_inst_t cmd_set_l2_decap = { + .f = cmd_set_l2_decap_parsed, + .data = NULL, + .help_str = "set l2_decap", + .tokens = { + (void *)&cmd_set_l2_decap_set, + (void *)&cmd_set_l2_decap_l2_decap, + NULL, + }, +}; + +cmdline_parse_inst_t cmd_set_l2_decap_with_vlan = { + .f = cmd_set_l2_decap_parsed, + .data = NULL, + .help_str = "set l2_decap-with-vlan", + .tokens = { + (void *)&cmd_set_l2_decap_set, + (void *)&cmd_set_l2_decap_l2_decap_with_vlan, + NULL, + }, +}; + +/** Set MPLSoUDP encapsulation details */ +struct cmd_set_mplsoudp_encap_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t mplsoudp; + cmdline_fixed_string_t pos_token; + cmdline_fixed_string_t ip_version; + uint32_t vlan_present:1; + uint32_t label; + uint16_t udp_src; + uint16_t udp_dst; + cmdline_ipaddr_t ip_src; + cmdline_ipaddr_t ip_dst; + uint16_t tci; + struct ether_addr eth_src; + struct ether_addr eth_dst; +}; + +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, set, + "set"); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_mplsoudp_encap = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, mplsoudp, + "mplsoudp_encap"); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_mplsoudp_encap_with_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + mplsoudp, "mplsoudp_encap-with-vlan"); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_version = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + pos_token, "ip-version"); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_version_value = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + ip_version, "ipv4#ipv6"); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_label = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + pos_token, "label"); +cmdline_parse_token_num_t cmd_set_mplsoudp_encap_label_value = + TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, label, + UINT32); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_udp_src = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + pos_token, "udp-src"); +cmdline_parse_token_num_t cmd_set_mplsoudp_encap_udp_src_value = + TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, udp_src, + UINT16); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_udp_dst = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + pos_token, "udp-dst"); +cmdline_parse_token_num_t cmd_set_mplsoudp_encap_udp_dst_value = + TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, udp_dst, + UINT16); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_src = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + pos_token, "ip-src"); +cmdline_parse_token_ipaddr_t cmd_set_mplsoudp_encap_ip_src_value = + TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, ip_src); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_ip_dst = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + pos_token, "ip-dst"); +cmdline_parse_token_ipaddr_t cmd_set_mplsoudp_encap_ip_dst_value = + TOKEN_IPADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, ip_dst); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_vlan = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + pos_token, "vlan-tci"); +cmdline_parse_token_num_t cmd_set_mplsoudp_encap_vlan_value = + TOKEN_NUM_INITIALIZER(struct cmd_set_mplsoudp_encap_result, tci, + UINT16); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_eth_src = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + pos_token, "eth-src"); +cmdline_parse_token_etheraddr_t cmd_set_mplsoudp_encap_eth_src_value = + TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + eth_src); +cmdline_parse_token_string_t cmd_set_mplsoudp_encap_eth_dst = + TOKEN_STRING_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + pos_token, "eth-dst"); +cmdline_parse_token_etheraddr_t cmd_set_mplsoudp_encap_eth_dst_value = + TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_mplsoudp_encap_result, + eth_dst); + +static void cmd_set_mplsoudp_encap_parsed(void *parsed_result, + __attribute__((unused)) struct cmdline *cl, + __attribute__((unused)) void *data) +{ + struct cmd_set_mplsoudp_encap_result *res = parsed_result; + union { + uint32_t mplsoudp_label; + uint8_t label[3]; + } id = { + .mplsoudp_label = + rte_cpu_to_be_32(res->label) & RTE_BE32(0x00ffffff), + }; + + if (strcmp(res->mplsoudp, "mplsoudp_encap") == 0) + mplsoudp_encap_conf.select_vlan = 0; + else if (strcmp(res->mplsoudp, "mplsoudp_encap-with-vlan") == 0) + mplsoudp_encap_conf.select_vlan = 1; + if (strcmp(res->ip_version, "ipv4") == 0) + mplsoudp_encap_conf.select_ipv4 = 1; + else if (strcmp(res->ip_version, "ipv6") == 0) + mplsoudp_encap_conf.select_ipv4 = 0; + else + return; + rte_memcpy(mplsoudp_encap_conf.label, &id.label[1], 3); + mplsoudp_encap_conf.udp_src = rte_cpu_to_be_16(res->udp_src); + mplsoudp_encap_conf.udp_dst = rte_cpu_to_be_16(res->udp_dst); + if (mplsoudp_encap_conf.select_ipv4) { + IPV4_ADDR_TO_UINT(res->ip_src, mplsoudp_encap_conf.ipv4_src); + IPV4_ADDR_TO_UINT(res->ip_dst, mplsoudp_encap_conf.ipv4_dst); + } else { + IPV6_ADDR_TO_ARRAY(res->ip_src, mplsoudp_encap_conf.ipv6_src); + IPV6_ADDR_TO_ARRAY(res->ip_dst, mplsoudp_encap_conf.ipv6_dst); + } + if (mplsoudp_encap_conf.select_vlan) + mplsoudp_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci); + rte_memcpy(mplsoudp_encap_conf.eth_src, res->eth_src.addr_bytes, + ETHER_ADDR_LEN); + rte_memcpy(mplsoudp_encap_conf.eth_dst, res->eth_dst.addr_bytes, + ETHER_ADDR_LEN); +} + +cmdline_parse_inst_t cmd_set_mplsoudp_encap = { + .f = cmd_set_mplsoudp_encap_parsed, + .data = NULL, + .help_str = "set mplsoudp_encap ip-version ipv4|ipv6 label