1d0dff9baSBernard Iremonger.. BSD LICENSE 2d0dff9baSBernard Iremonger Copyright(c) 2010-2014 Intel Corporation. All rights reserved. 3d0dff9baSBernard Iremonger All rights reserved. 4d0dff9baSBernard Iremonger 5d0dff9baSBernard Iremonger Redistribution and use in source and binary forms, with or without 6d0dff9baSBernard Iremonger modification, are permitted provided that the following conditions 7d0dff9baSBernard Iremonger are met: 8d0dff9baSBernard Iremonger 9d0dff9baSBernard Iremonger * Redistributions of source code must retain the above copyright 10d0dff9baSBernard Iremonger notice, this list of conditions and the following disclaimer. 11d0dff9baSBernard Iremonger * Redistributions in binary form must reproduce the above copyright 12d0dff9baSBernard Iremonger notice, this list of conditions and the following disclaimer in 13d0dff9baSBernard Iremonger the documentation and/or other materials provided with the 14d0dff9baSBernard Iremonger distribution. 15d0dff9baSBernard Iremonger * Neither the name of Intel Corporation nor the names of its 16d0dff9baSBernard Iremonger contributors may be used to endorse or promote products derived 17d0dff9baSBernard Iremonger from this software without specific prior written permission. 18d0dff9baSBernard Iremonger 19d0dff9baSBernard Iremonger THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20d0dff9baSBernard Iremonger "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21d0dff9baSBernard Iremonger LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22d0dff9baSBernard Iremonger A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23d0dff9baSBernard Iremonger OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24d0dff9baSBernard Iremonger SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25d0dff9baSBernard Iremonger LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26d0dff9baSBernard Iremonger DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27d0dff9baSBernard Iremonger THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28d0dff9baSBernard Iremonger (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29d0dff9baSBernard Iremonger OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30d0dff9baSBernard Iremonger 31d0dff9baSBernard IremongerTest Pipeline Application 32d0dff9baSBernard Iremonger========================= 33d0dff9baSBernard Iremonger 34*e0c7c473SSiobhan ButlerThe Test Pipeline application illustrates the use of the DPDK Packet Framework tool suite. 35*e0c7c473SSiobhan ButlerIts purpose is to demonstrate the performance of single-table DPDK pipelines. 36d0dff9baSBernard Iremonger 37d0dff9baSBernard IremongerOverview 38d0dff9baSBernard Iremonger-------- 39d0dff9baSBernard Iremonger 40d0dff9baSBernard IremongerThe application uses three CPU cores: 41d0dff9baSBernard Iremonger 42d0dff9baSBernard Iremonger* Core A ("RX core") receives traffic from the NIC ports and feeds core B with traffic through SW queues. 43d0dff9baSBernard Iremonger 44*e0c7c473SSiobhan Butler* Core B ("Pipeline core") implements a single-table DPDK pipeline 45d0dff9baSBernard Iremonger whose type is selectable through specific command line parameter. 46d0dff9baSBernard Iremonger Core B receives traffic from core A through software queues, 47d0dff9baSBernard Iremonger processes it according to the actions configured in the table entries that 48d0dff9baSBernard Iremonger are hit by the input packets and feeds it to core C through another set of software queues. 49d0dff9baSBernard Iremonger 50d0dff9baSBernard Iremonger* Core C ("TX core") receives traffic from core B through software queues and sends it to the NIC ports for transmission. 51d0dff9baSBernard Iremonger 52d0dff9baSBernard Iremonger.. _figure_21: 53d0dff9baSBernard Iremonger 54d0dff9baSBernard Iremonger**Figure 21.Test Pipeline Application** 55d0dff9baSBernard Iremonger 56d0dff9baSBernard Iremonger.. image24_png has been renamed 57d0dff9baSBernard Iremonger 58d0dff9baSBernard Iremonger|test_pipeline_app| 59d0dff9baSBernard Iremonger 60d0dff9baSBernard IremongerCompiling the Application 61d0dff9baSBernard Iremonger------------------------- 62d0dff9baSBernard Iremonger 63d0dff9baSBernard Iremonger#. Go to the app/test directory: 64d0dff9baSBernard Iremonger 65d0dff9baSBernard Iremonger .. code-block:: console 66d0dff9baSBernard Iremonger 67d0dff9baSBernard Iremonger export RTE_SDK=/path/to/rte_sdk 68d0dff9baSBernard Iremonger cd ${RTE_SDK}/app/test/test-pipeline 69d0dff9baSBernard Iremonger 70d0dff9baSBernard Iremonger#. Set the target (a default target is used if not specified): 71d0dff9baSBernard Iremonger 72d0dff9baSBernard Iremonger .. code-block:: console 73d0dff9baSBernard Iremonger 74d0dff9baSBernard Iremonger export RTE_TARGET=x86_64-native-linuxapp-gcc 75d0dff9baSBernard Iremonger 76d0dff9baSBernard Iremonger#. Build the application: 77d0dff9baSBernard Iremonger 78d0dff9baSBernard Iremonger .. code-block:: console 79d0dff9baSBernard Iremonger 80d0dff9baSBernard Iremonger make 81d0dff9baSBernard Iremonger 82d0dff9baSBernard IremongerRunning the Application 83d0dff9baSBernard Iremonger----------------------- 84d0dff9baSBernard Iremonger 85d0dff9baSBernard IremongerApplication Command Line 86d0dff9baSBernard Iremonger~~~~~~~~~~~~~~~~~~~~~~~~ 87d0dff9baSBernard Iremonger 88d0dff9baSBernard IremongerThe application execution command line is: 89d0dff9baSBernard Iremonger 90d0dff9baSBernard Iremonger.. code-block:: console 91d0dff9baSBernard Iremonger 92d0dff9baSBernard Iremonger ./test-pipeline [EAL options] -- -p PORTMASK --TABLE_TYPE 93d0dff9baSBernard Iremonger 94d0dff9baSBernard IremongerThe -c EAL CPU core mask option has to contain exactly 3 CPU cores. 95d0dff9baSBernard IremongerThe first CPU core in the core mask is assigned for core A, the second for core B and the third for core C. 96d0dff9baSBernard Iremonger 97d0dff9baSBernard IremongerThe PORTMASK parameter must contain 2 or 4 ports. 98d0dff9baSBernard Iremonger 99d0dff9baSBernard IremongerTable Types and Behavior 100d0dff9baSBernard Iremonger~~~~~~~~~~~~~~~~~~~~~~~~ 101d0dff9baSBernard Iremonger 102d0dff9baSBernard IremongerTable 3 describes the table types used and how they are populated. 103d0dff9baSBernard Iremonger 104d0dff9baSBernard IremongerThe hash tables are pre-populated with 16 million keys. 105d0dff9baSBernard IremongerFor hash tables, the following parameters can be selected: 106d0dff9baSBernard Iremonger 107d0dff9baSBernard Iremonger* **Configurable key size implementation or fixed (specialized) key size implementation (e.g. hash-8-ext or hash-spec-8-ext).** 108d0dff9baSBernard Iremonger The key size specialized implementations are expected to provide better performance for 8-byte and 16-byte key sizes, 109d0dff9baSBernard Iremonger while the key-size-non-specialized implementation is expected to provide better performance for larger key sizes; 110d0dff9baSBernard Iremonger 111d0dff9baSBernard Iremonger* **Key size (e.g. hash-spec-8-ext or hash-spec-16-ext).** 112d0dff9baSBernard Iremonger The available options are 8, 16 and 32 bytes; 113d0dff9baSBernard Iremonger 114d0dff9baSBernard Iremonger* **Table type (e.g. hash-spec-16-ext or hash-spec-16-lru).** 115d0dff9baSBernard Iremonger The available options are ext (extendible bucket) or lru (least recently used). 116d0dff9baSBernard Iremonger 117d0dff9baSBernard Iremonger.. _table_3: 118d0dff9baSBernard Iremonger 119d0dff9baSBernard Iremonger**Table 3. Table Types** 120d0dff9baSBernard Iremonger 121d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+-------------------------------------------------------+ 122d0dff9baSBernard Iremonger| **#** | **TABLE_TYPE** | **Description of Core B Table** | **Pre-added Table Entries** | 123d0dff9baSBernard Iremonger| | | | | 124d0dff9baSBernard Iremonger+=======+========================+==========================================================+=======================================================+ 125*e0c7c473SSiobhan Butler| 1 | none | Core B is not implementing a DPDK pipeline. | N/A | 126d0dff9baSBernard Iremonger| | | Core B is implementing a pass-through from its input set | | 127d0dff9baSBernard Iremonger| | | of software queues to its output set of software queues. | | 128d0dff9baSBernard Iremonger| | | | | 129d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+-------------------------------------------------------+ 130d0dff9baSBernard Iremonger| 2 | stub | Stub table. Core B is implementing the same pass-through | N/A | 131d0dff9baSBernard Iremonger| | | functionality as described for the "none" option by | | 132*e0c7c473SSiobhan Butler| | | using the DPDK Packet Framework by using one | | 133d0dff9baSBernard Iremonger| | | stub table for each input NIC port. | | 134d0dff9baSBernard Iremonger| | | | | 135d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+-------------------------------------------------------+ 136d0dff9baSBernard Iremonger| 3 | hash-[spec]-8-lru | LRU hash table with 8-byte key size and 16 million | 16 million entries are successfully added to the | 137d0dff9baSBernard Iremonger| | | entries. | hash table with the following key format: | 138d0dff9baSBernard Iremonger| | | | | 139d0dff9baSBernard Iremonger| | | | [4-byte index, 4 bytes of 0] | 140d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+ | 141d0dff9baSBernard Iremonger| 4 | hash-[spec]-8-ext | Extendible bucket hash table with 8-byte key size | The action configured for all table entries is | 142d0dff9baSBernard Iremonger| | | and 16 million entries. | "Sendto output port", with the output port index | 143d0dff9baSBernard Iremonger| | | | uniformly distributed for the range of output ports. | 144d0dff9baSBernard Iremonger| | | | | 145d0dff9baSBernard Iremonger| | | | The default table rule (used in the case of a lookup | 146d0dff9baSBernard Iremonger| | | | miss) is to drop the packet. | 147d0dff9baSBernard Iremonger| | | | | 148d0dff9baSBernard Iremonger| | | | At run time, core A is creating the following lookup | 149d0dff9baSBernard Iremonger| | | | key and storing it into the packet meta data for | 150d0dff9baSBernard Iremonger| | | | core B to use for table lookup: | 151d0dff9baSBernard Iremonger| | | | | 152d0dff9baSBernard Iremonger| | | | [destination IPv4 address, 4 bytes of 0] | 153d0dff9baSBernard Iremonger| | | | | 154d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+-------------------------------------------------------+ 155d0dff9baSBernard Iremonger| 5 | hash-[spec]-16-lru | LRU hash table with 16-byte key size and 16 million | 16 million entries are successfully added to the hash | 156d0dff9baSBernard Iremonger| | | entries. | table with the following key format: | 157d0dff9baSBernard Iremonger| | | | | 158d0dff9baSBernard Iremonger| | | | [4-byte index, 12 bytes of 0] | 159d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+ | 160d0dff9baSBernard Iremonger| 6 | hash-[spec]-ash-16-ext | Extendible bucket hash table with 16-byte key size | The action configured for all table entries is | 161d0dff9baSBernard Iremonger| | | and 16 million entries. | "Send to output port", with the output port index | 162d0dff9baSBernard Iremonger| | | | uniformly distributed for the range of output ports. | 163d0dff9baSBernard Iremonger| | | | | 164d0dff9baSBernard Iremonger| | | | The default table rule (used in the case of a lookup | 165d0dff9baSBernard Iremonger| | | | miss) is to drop the packet. | 166d0dff9baSBernard Iremonger| | | | | 167d0dff9baSBernard Iremonger| | | | At run time, core A is creating the following lookup | 168d0dff9baSBernard Iremonger| | | | key and storing it into the packet meta data for core | 169d0dff9baSBernard Iremonger| | | | B to use for table lookup: | 170d0dff9baSBernard Iremonger| | | | | 171d0dff9baSBernard Iremonger| | | | [destination IPv4 address, 12 bytes of 0] | 172d0dff9baSBernard Iremonger| | | | | 173d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+-------------------------------------------------------+ 174d0dff9baSBernard Iremonger| 7 | hash-[spec]-32-lru | LRU hash table with 32-byte key size and 16 million | 16 million entries are successfully added to the hash | 175d0dff9baSBernard Iremonger| | | entries. | table with the following key format: | 176d0dff9baSBernard Iremonger| | | | | 177d0dff9baSBernard Iremonger| | | | [4-byte index, 28 bytes of 0]. | 178d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+ | 179d0dff9baSBernard Iremonger| 8 | hash-[spec]-32-ext | Extendible bucket hash table with 32-byte key size | The action configured for all table entries is | 180d0dff9baSBernard Iremonger| | | and 16 million entries. | "Send to output port", with the output port index | 181d0dff9baSBernard Iremonger| | | | uniformly distributed for the range of output ports. | 182d0dff9baSBernard Iremonger| | | | | 183d0dff9baSBernard Iremonger| | | | The default table rule (used in the case of a lookup | 184d0dff9baSBernard Iremonger| | | | miss) is to drop the packet. | 185d0dff9baSBernard Iremonger| | | | | 186d0dff9baSBernard Iremonger| | | | At run time, core A is creating the following lookup | 187d0dff9baSBernard Iremonger| | | | key and storing it into the packet meta data for | 188d0dff9baSBernard Iremonger| | | | Lpmcore B to use for table lookup: | 189d0dff9baSBernard Iremonger| | | | | 190d0dff9baSBernard Iremonger| | | | [destination IPv4 address, 28 bytes of 0] | 191d0dff9baSBernard Iremonger| | | | | 192d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+-------------------------------------------------------+ 193d0dff9baSBernard Iremonger| 9 | lpm | Longest Prefix Match (LPM) IPv4 table. | In the case of two ports, two routes | 194d0dff9baSBernard Iremonger| | | | are added to the table: | 195d0dff9baSBernard Iremonger| | | | | 196d0dff9baSBernard Iremonger| | | | [0.0.0.0/9 => send to output port 0] | 197d0dff9baSBernard Iremonger| | | | | 198d0dff9baSBernard Iremonger| | | | [0.128.0.0/9 => send to output port 1] | 199d0dff9baSBernard Iremonger| | | | | 200d0dff9baSBernard Iremonger| | | | In case of four ports, four entries are added to the | 201d0dff9baSBernard Iremonger| | | | table: | 202d0dff9baSBernard Iremonger| | | | | 203d0dff9baSBernard Iremonger| | | | [0.0.0.0/10 => send to output port 0] | 204d0dff9baSBernard Iremonger| | | | | 205d0dff9baSBernard Iremonger| | | | [0.64.0.0/10 => send to output port 1] | 206d0dff9baSBernard Iremonger| | | | | 207d0dff9baSBernard Iremonger| | | | [0.128.0.0/10 => send to output port 2] | 208d0dff9baSBernard Iremonger| | | | | 209d0dff9baSBernard Iremonger| | | | [0.192.0.0/10 => send to output port 3] | 210d0dff9baSBernard Iremonger| | | | | 211d0dff9baSBernard Iremonger| | | | The default table rule (used in the case of a lookup | 212d0dff9baSBernard Iremonger| | | | miss) is to drop the packet. | 213d0dff9baSBernard Iremonger| | | | | 214d0dff9baSBernard Iremonger| | | | At run time, core A is storing the IPv4 destination | 215d0dff9baSBernard Iremonger| | | | within the packet meta data to be later used by core | 216d0dff9baSBernard Iremonger| | | | B as the lookup key. | 217d0dff9baSBernard Iremonger| | | | | 218d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+-------------------------------------------------------+ 219d0dff9baSBernard Iremonger| 10 | acl | Access Control List (ACL) table | In the case of two ports, two ACL rules are added to | 220d0dff9baSBernard Iremonger| | | | the table: | 221d0dff9baSBernard Iremonger| | | | | 222d0dff9baSBernard Iremonger| | | | [priority = 0 (highest), | 223d0dff9baSBernard Iremonger| | | | | 224d0dff9baSBernard Iremonger| | | | IPv4 source = ANY, | 225d0dff9baSBernard Iremonger| | | | | 226d0dff9baSBernard Iremonger| | | | IPv4 destination = 0.0.0.0/9, | 227d0dff9baSBernard Iremonger| | | | | 228d0dff9baSBernard Iremonger| | | | L4 protocol = ANY, | 229d0dff9baSBernard Iremonger| | | | | 230d0dff9baSBernard Iremonger| | | | TCP source port = ANY, | 231d0dff9baSBernard Iremonger| | | | | 232d0dff9baSBernard Iremonger| | | | TCP destination port = ANY | 233d0dff9baSBernard Iremonger| | | | | 234d0dff9baSBernard Iremonger| | | | => send to output port 0] | 235d0dff9baSBernard Iremonger| | | | | 236d0dff9baSBernard Iremonger| | | | | 237d0dff9baSBernard Iremonger| | | | [priority = 0 (highest), | 238d0dff9baSBernard Iremonger| | | | | 239d0dff9baSBernard Iremonger| | | | IPv4 source = ANY, | 240d0dff9baSBernard Iremonger| | | | | 241d0dff9baSBernard Iremonger| | | | IPv4 destination = 0.128.0.0/9, | 242d0dff9baSBernard Iremonger| | | | | 243d0dff9baSBernard Iremonger| | | | L4 protocol = ANY, | 244d0dff9baSBernard Iremonger| | | | | 245d0dff9baSBernard Iremonger| | | | TCP source port = ANY, | 246d0dff9baSBernard Iremonger| | | | | 247d0dff9baSBernard Iremonger| | | | TCP destination port = ANY | 248d0dff9baSBernard Iremonger| | | | | 249d0dff9baSBernard Iremonger| | | | => send to output port 0]. | 250d0dff9baSBernard Iremonger| | | | | 251d0dff9baSBernard Iremonger| | | | | 252d0dff9baSBernard Iremonger| | | | The default table rule (used in the case of a lookup | 253d0dff9baSBernard Iremonger| | | | miss) is to drop the packet. | 254d0dff9baSBernard Iremonger| | | | | 255d0dff9baSBernard Iremonger+-------+------------------------+----------------------------------------------------------+-------------------------------------------------------+ 256d0dff9baSBernard Iremonger 257d0dff9baSBernard IremongerInput Traffic 258d0dff9baSBernard Iremonger~~~~~~~~~~~~~ 259d0dff9baSBernard Iremonger 260d0dff9baSBernard IremongerRegardless of the table type used for the core B pipeline, 261d0dff9baSBernard Iremongerthe same input traffic can be used to hit all table entries with uniform distribution, 262d0dff9baSBernard Iremongerwhich results in uniform distribution of packets sent out on the set of output NIC ports. 263d0dff9baSBernard IremongerThe profile for input traffic is TCP/IPv4 packets with: 264d0dff9baSBernard Iremonger 265d0dff9baSBernard Iremonger* destination IP address as A.B.C.D with A fixed to 0 and B, C,D random 266d0dff9baSBernard Iremonger 267d0dff9baSBernard Iremonger* source IP address fixed to 0.0.0.0 268d0dff9baSBernard Iremonger 269d0dff9baSBernard Iremonger* destination TCP port fixed to 0 270d0dff9baSBernard Iremonger 271d0dff9baSBernard Iremonger* source TCP port fixed to 0 272d0dff9baSBernard Iremonger 273d0dff9baSBernard Iremonger.. |test_pipeline_app| image:: img/test_pipeline_app.png 274