660798d514854ccebe101c1583f5a91847c5059e
[dpdk.git] / doc / guides / sample_app_ug / ip_pipeline.rst
1 ..  SPDX-License-Identifier: BSD-3-Clause
2     Copyright(c) 2015-2018 Intel Corporation.
3
4 Internet Protocol (IP) Pipeline Application
5 ===========================================
6
7 Application overview
8 --------------------
9
10 The *Internet Protocol (IP) Pipeline* application is intended to be a vehicle for rapid development of packet processing
11 applications on multi-core CPUs.
12
13 Following OpenFlow and P4 design principles, the application can be used to create functional blocks called pipelines out
14 of input/output ports, tables and actions in a modular way. Multiple pipelines can be inter-connected through packet queues
15 to create complete applications (super-pipelines).
16
17 The pipelines are mapped to application threads, with each pipeline executed by a single thread and each thread able to run
18 one or several pipelines. The possibilities of creating pipelines out of ports, tables and actions, connecting multiple
19 pipelines together and mapping the pipelines to execution threads are endless, therefore this application can be seen as
20 a true application generator.
21
22 Pipelines are created and managed through Command Line Interface (CLI):
23
24  * Any standard TCP client (e.g. telnet, netcat, custom script, etc) is typically able to connect to the application, send
25    commands through the network and wait for the response before pushing the next command.
26
27  * All the application objects are created and managed through CLI commands:
28     * 'Primitive' objects used to create pipeline ports: memory pools, links (i.e. network interfaces), SW queues, traffic managers, etc.
29     * Action profiles: used to define the actions to be executed by pipeline input/output ports and tables.
30     * Pipeline components: input/output ports, tables, pipelines, mapping of pipelines to execution threads.
31
32 Running the application
33 -----------------------
34
35 The application startup command line is::
36
37    ip_pipeline [EAL_ARGS] -- [-s SCRIPT_FILE] [-h HOST] [-p PORT]
38
39 The application startup arguments are:
40
41 ``-s SCRIPT_FILE``
42
43  * Optional: Yes
44
45  * Default: Not present
46
47  * Argument: Path to the CLI script file to be run at application startup.
48    No CLI script file will run at startup if this argument is not present.
49
50 ``-h HOST``
51
52  * Optional: Yes
53
54  * Default: ``0.0.0.0``
55
56  * Argument: IP Address of the host running ip pipeline application to be used by
57    remote TCP based client (telnet, netcat, etc.) for connection.
58
59 ``-p PORT``
60
61  * Optional: Yes
62
63  * Default: ``8086``
64
65  * Argument: TCP port number at which the ip pipeline is running.
66    This port number should be used by remote TCP client (such as telnet, netcat, etc.) to connect to host application.
67
68 Refer to *DPDK Getting Started Guide* for general information on running applications and the Environment Abstraction Layer (EAL) options.
69
70 The following is an example command to run ip pipeline application configured for layer 2 forwarding:
71
72 .. code-block:: console
73
74     $ ./build/ip_pipeline -c 0x3 -- -s examples/route_ecmp.cli
75
76 The application should start successfully and display as follows:
77
78 .. code-block:: console
79
80     EAL: Detected 40 lcore(s)
81     EAL: Detected 2 NUMA nodes
82     EAL: Multi-process socket /var/run/.rte_unix
83     EAL: Probing VFIO support...
84     EAL: PCI device 0000:02:00.0 on NUMA socket 0
85     EAL:   probe driver: 8086:10fb net_ixgbe
86     ...
87
88 To run remote client (e.g. telnet) to communicate with the ip pipeline application:
89
90 .. code-block:: console
91
92     $ telnet 127.0.0.1 8086
93
94 When running a telnet client as above, command prompt is displayed:
95
96 .. code-block:: console
97
98     Trying 127.0.0.1...
99     Connected to 127.0.0.1.
100     Escape character is '^]'.
101
102     Welcome to IP Pipeline!
103
104     pipeline>
105
106 Once application and telnet client start running, messages can be sent from client to application.
107 At any stage, telnet client can be terminated using the quit command.
108
109
110 Application stages
111 ------------------
112
113 Initialization
114 ~~~~~~~~~~~~~~
115
116 During this stage, EAL layer is initialised and application specific arguments are parsed. Furthermore, the data strcutures
117 (i.e. linked lists) for application objects are initialized. In case of any initialization error, an error message
118 is displayed and the application is terminated.
119
120 .. _ip_pipeline_runtime:
121
122 Run-time
123 ~~~~~~~~
124
125 The master thread is creating and managing all the application objects based on CLI input.
126
127 Each data plane thread runs one or several pipelines previously assigned to it in round-robin order. Each data plane thread
128 executes two tasks in time-sharing mode:
129
130 1. *Packet processing task*: Process bursts of input packets read from the pipeline input ports.
131
132 2. *Message handling task*: Periodically, the data plane thread pauses the packet processing task and polls for request
133    messages send by the master thread. Examples: add/remove pipeline to/from current data plane thread, add/delete rules
134    to/from given table of a specific pipeline owned by the current data plane thread, read statistics, etc.
135
136 Examples
137 --------
138
139 .. _table_examples:
140
141 .. tabularcolumns:: |p{3cm}|p{5cm}|p{4cm}|p{4cm}|
142
143 .. table:: Pipeline examples provided with the application
144
145    +-----------------------+----------------------+----------------+------------------------------------+
146    | Name                  | Table(s)             | Actions        | Messages                           |
147    +=======================+======================+================+====================================+
148    | L2fwd                 | Stub                 | Forward        | 1. Mempool create                  |
149    |                       |                      |                | 2. Link create                     |
150    | Note: Implemented     |                      |                | 3. Pipeline create                 |
151    | using pipeline with   |                      |                | 4. Pipeline port in/out            |
152    | a simple pass-through |                      |                | 5. Pipeline table                  |
153    | connection between    |                      |                | 6. Pipeline port in table          |
154    | input and output      |                      |                | 7. Pipeline enable                 |
155    | ports.                |                      |                | 8. Pipeline table rule add         |
156    +-----------------------+----------------------+----------------+------------------------------------+
157    | Flow classification   | Exact match          | Forward        | 1. Mempool create                  |
158    |                       |                      |                | 2. Link create                     |
159    |                       | * Key = byte array   |                | 3. Pipeline create                 |
160    |                       |    (16 bytes)        |                | 4. Pipeline port in/out            |
161    |                       | * Offset = 278       |                | 5. Pipeline table                  |
162    |                       | * Table size = 64K   |                | 6. Pipeline port in table          |
163    |                       |                      |                | 7. Pipeline enable                 |
164    |                       |                      |                | 8. Pipeline table rule add default |
165    |                       |                      |                | 9. Pipeline table rule add         |
166    +-----------------------+----------------------+----------------+------------------------------------+
167    | KNI                   | Stub                 | Forward        | 1. Mempool create                  |
168    |                       |                      |                | 2. Link create                     |
169    |                       |                      |                | 3. Pipeline create                 |
170    |                       |                      |                | 4. Pipeline port in/out            |
171    |                       |                      |                | 5. Pipeline table                  |
172    |                       |                      |                | 6. Pipeline port in table          |
173    |                       |                      |                | 7. Pipeline enable                 |
174    |                       |                      |                | 8. Pipeline table rule add         |
175    +-----------------------+----------------------+----------------+------------------------------------+
176    | Firewall              | ACL                  | Allow/Drop     | 1. Mempool create                  |
177    |                       |                      |                | 2. Link create                     |
178    |                       | * Key = n-tuple      |                | 3. Pipeline create                 |
179    |                       | * Offset = 270       |                | 4. Pipeline port in/out            |
180    |                       | * Table size = 4K    |                | 5. Pipeline table                  |
181    |                       |                      |                | 6. Pipeline port in table          |
182    |                       |                      |                | 7. Pipeline enable                 |
183    |                       |                      |                | 8. Pipeline table rule add default |
184    |                       |                      |                | 9. Pipeline table rule add         |
185    +-----------------------+----------------------+----------------+------------------------------------+
186    | IP routing            | LPM (IPv4)           | Forward        | 1. Mempool Create                  |
187    |                       |                      |                | 2. Link create                     |
188    |                       | * Key = IP dest addr |                | 3. Pipeline creat                  |
189    |                       | * Offset = 286       |                | 4. Pipeline port in/out            |
190    |                       | * Table size = 4K    |                | 5. Pipeline table                  |
191    |                       |                      |                | 6. Pipeline port in table          |
192    |                       |                      |                | 7. Pipeline enable                 |
193    |                       |                      |                | 8. Pipeline table rule add default |
194    |                       |                      |                | 9. Pipeline table rule add         |
195    +-----------------------+----------------------+----------------+------------------------------------+
196    | Equal-cost multi-path | LPM (IPv4)           | Forward,       | 1. Mempool Create                  |
197    | routing (ECMP)        |                      | load balance,  | 2. Link create                     |
198    |                       | * Key = IP dest addr | encap ether    | 3. Pipeline create                 |
199    |                       | * Offset = 286       |                | 4. Pipeline port in/out            |
200    |                       | * Table size = 4K    |                | 5. Pipeline table (LPM)            |
201    |                       |                      |                | 6. Pipeline table (Array)          |
202    |                       |                      |                | 7. Pipeline port in table (LPM)    |
203    |                       | Array                |                | 8. Pipeline enable                 |
204    |                       |                      |                | 9. Pipeline table rule add default |
205    |                       | * Key = Array index  |                | 10. Pipeline table rule add(LPM)   |
206    |                       | * Offset = 256       |                | 11. Pipeline table rule add(Array) |
207    |                       | * Size = 64K         |                |                                    |
208    |                       |                      |                |                                    |
209    +-----------------------+----------------------+----------------+------------------------------------+
210
211 Command Line Interface (CLI)
212 ----------------------------
213
214 Link
215 ~~~~
216
217  Link configuration ::
218
219    link <link_name>
220     dev <device_name>|port <port_id>
221     rxq <n_queues> <queue_size> <mempool_name>
222     txq <n_queues> <queue_size> promiscuous on | off
223     [rss <qid_0> ... <qid_n>]
224
225
226 Mempool
227 ~~~~~~~
228
229  Mempool create ::
230
231    mempool <mempool_name> buffer <buffer_size>
232    pool <pool_size> cache <cache_size> cpu <cpu_id>
233
234
235 Software queue
236 ~~~~~~~~~~~~~~
237
238   Create software queue ::
239
240    swq <swq_name> size <size> cpu <cpu_id>
241
242
243 Traffic manager
244 ~~~~~~~~~~~~~~~
245
246  Add traffic manager subport profile ::
247
248   tmgr subport profile
249    <tb_rate> <tb_size>
250    <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate>
251    <tc_period>
252
253
254  Add traffic manager pipe profile ::
255
256   tmgr pipe profile
257    <tb_rate> <tb_size>
258    <tc0_rate> <tc1_rate> <tc2_rate> <tc3_rate>
259    <tc_period>
260    <tc_ov_weight> <wrr_weight0..15>
261
262  Create traffic manager port ::
263
264   tmgr <tmgr_name>
265    rate <rate>
266    spp <n_subports_per_port>
267    pps <n_pipes_per_subport>
268    qsize <qsize_tc0>
269    <qsize_tc1> <qsize_tc2> <qsize_tc3>
270    fo <frame_overhead> mtu <mtu> cpu <cpu_id>
271
272  Configure traffic manager subport ::
273
274   tmgr <tmgr_name>
275    subport <subport_id>
276    profile <subport_profile_id>
277
278  Configure traffic manager pipe ::
279
280   tmgr <tmgr_name>
281    subport <subport_id>
282    pipe from <pipe_id_first> to <pipe_id_last>
283    profile <pipe_profile_id>
284
285
286 Tap
287 ~~~
288
289  Create tap port ::
290
291   tap <name>
292
293
294 Kni
295 ~~~
296
297   Create kni port ::
298
299    kni <kni_name>
300     link <link_name>
301     mempool <mempool_name>
302     [thread <thread_id>]
303
304
305 Action profile
306 ~~~~~~~~~~~~~~
307
308  Create action profile for pipeline input port ::
309
310   port in action profile <profile_name>
311    [filter match | mismatch offset <key_offset> mask <key_mask> key <key_value> port <port_id>]
312    [balance offset <key_offset> mask <key_mask> port <port_id0> ... <port_id15>]
313
314  Create action profile for the pipeline table ::
315
316   table action profile <profile_name>
317    ipv4 | ipv6
318    offset <ip_offset>
319    fwd
320    [balance offset <key_offset> mask <key_mask> outoffset <out_offset>]
321    [meter srtcm | trtcm
322        tc <n_tc>
323        stats none | pkts | bytes | both]
324    [tm spp <n_subports_per_port> pps <n_pipes_per_subport>]
325    [encap ether | vlan | qinq | mpls | pppoe]
326    [nat src | dst
327        proto udp | tcp]
328    [ttl drop | fwd
329        stats none | pkts]
330    [stats pkts | bytes | both]
331    [time]
332
333
334 Pipeline
335 ~~~~~~~~
336
337 Create pipeline ::
338
339   pipeline <pipeline_name>
340    period <timer_period_ms>
341    offset_port_id <offset_port_id>
342    cpu <cpu_id>
343
344 Create pipeline input port ::
345
346   pipeline <pipeline_name> port in
347    bsz <burst_size>
348    link <link_name> rxq <queue_id>
349    | swq <swq_name>
350    | tmgr <tmgr_name>
351    | tap <tap_name> mempool <mempool_name> mtu <mtu>
352    | kni <kni_name>
353    | source mempool <mempool_name> file <file_name> bpp <n_bytes_per_pkt>
354    [action <port_in_action_profile_name>]
355    [disabled]
356
357 Create pipeline output port ::
358
359   pipeline <pipeline_name> port out
360    bsz <burst_size>
361    link <link_name> txq <txq_id>
362    | swq <swq_name>
363    | tmgr <tmgr_name>
364    | tap <tap_name>
365    | kni <kni_name>
366    | sink [file <file_name> pkts <max_n_pkts>]
367
368 Create pipeline table ::
369
370   pipeline <pipeline_name> table
371        match
372        acl
373            ipv4 | ipv6
374            offset <ip_header_offset>
375            size <n_rules>
376        | array
377            offset <key_offset>
378            size <n_keys>
379        | hash
380            ext | lru
381            key <key_size>
382            mask <key_mask>
383            offset <key_offset>
384            buckets <n_buckets>
385            size <n_keys>
386        | lpm
387            ipv4 | ipv6
388            offset <ip_header_offset>
389            size <n_rules>
390        | stub
391    [action <table_action_profile_name>]
392
393 Connect pipeline input port to table ::
394
395   pipeline <pipeline_name> port in <port_id> table <table_id>
396
397 Display statistics for specific pipeline input port, output port
398 or table ::
399
400   pipeline <pipeline_name> port in <port_id> stats read [clear]
401   pipeline <pipeline_name> port out <port_id> stats read [clear]
402   pipeline <pipeline_name> table <table_id> stats read [clear]
403
404 Enable given input port for specific pipeline instance ::
405
406   pipeline <pipeline_name> port out <port_id> disable
407
408 Disable given input port for specific pipeline instance ::
409
410   pipeline <pipeline_name> port out <port_id> disable
411
412 Add default rule to table for specific pipeline instance ::
413
414   pipeline <pipeline_name> table <table_id> rule add
415      match
416         default
417      action
418         fwd
419            drop
420            | port <port_id>
421            | meta
422            | table <table_id>
423
424 Add rule to table for specific pipeline instance ::
425
426   pipeline <pipeline_name> table <table_id> rule add
427
428   match
429      acl
430         priority <priority>
431         ipv4 | ipv6 <sa> <sa_depth> <da> <da_depth>
432         <sp0> <sp1> <dp0> <dp1> <proto>
433      | array <pos>
434      | hash
435         raw <key>
436         | ipv4_5tuple <sa> <da> <sp> <dp> <proto>
437         | ipv6_5tuple <sa> <da> <sp> <dp> <proto>
438         | ipv4_addr <addr>
439         | ipv6_addr <addr>
440         | qinq <svlan> <cvlan>
441      | lpm
442         ipv4 | ipv6 <addr> <depth>
443
444   action
445      fwd
446         drop
447         | port <port_id>
448         | meta
449         | table <table_id>
450      [balance <out0> ... <out7>]
451      [meter
452         tc0 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
453         [tc1 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
454         tc2 meter <meter_profile_id> policer g <pa> y <pa> r <pa>
455         tc3 meter <meter_profile_id> policer g <pa> y <pa> r <pa>]]
456      [tm subport <subport_id> pipe <pipe_id>]
457      [encap
458         ether <da> <sa>
459         | vlan <da> <sa> <pcp> <dei> <vid>
460         | qinq <da> <sa> <pcp> <dei> <vid> <pcp> <dei> <vid>
461         | mpls unicast | multicast
462            <da> <sa>
463            label0 <label> <tc> <ttl>
464            [label1 <label> <tc> <ttl>
465            [label2 <label> <tc> <ttl>
466            [label3 <label> <tc> <ttl>]]]
467         | pppoe <da> <sa> <session_id>]
468      [nat ipv4 | ipv6 <addr> <port>]
469      [ttl dec | keep]
470      [stats]
471      [time]
472
473   where:
474      <pa> ::= g | y | r | drop
475
476 Add bulk rules to table for specific pipeline instance ::
477
478   pipeline <pipeline_name> table <table_id> rule add bulk <file_name> <n_rules>
479
480   Where:
481   - file_name = path to file
482   - File line format = match <match> action <action>
483
484 Delete table rule for specific pipeline instance ::
485
486   pipeline <pipeline_name> table <table_id> rule delete
487      match <match>
488
489 Delete default table rule for specific pipeline instance ::
490
491   pipeline <pipeline_name> table <table_id> rule delete
492      match
493         default
494
495 Add meter profile to the table for specific pipeline instance ::
496
497   pipeline <pipeline_name> table <table_id> meter profile <meter_profile_id>
498    add srtcm cir <cir> cbs <cbs> ebs <ebs>
499    | trtcm cir <cir> pir <pir> cbs <cbs> pbs <pbs>
500
501 Delete meter profile from the table for specific pipeline instance ::
502
503   pipeline <pipeline_name> table <table_id>
504    meter profile <meter_profile_id> delete
505
506
507 Update the dscp table for meter or traffic manager action for specific
508 pipeline instance ::
509
510    pipeline <pipeline_name> table <table_id> dscp <file_name>
511
512    Where:
513       - file_name = path to file
514       - exactly 64 lines
515       - File line format = <tc_id> <tc_queue_id> <color>, with <color> as: g | y | r
516
517
518 Pipeline enable/disable
519 ~~~~~~~~~~~~~~~~~~~~~~~
520
521    Enable given pipeline instance for specific data plane thread ::
522
523     thread <thread_id> pipeline <pipeline_name> enable
524
525
526    Disable given pipeline instance for specific data plane thread ::
527
528     thread <thread_id> pipeline <pipeline_name> disable