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