doc: update i40e Windows support
[dpdk.git] / doc / guides / nics / i40e.rst
1 ..  SPDX-License-Identifier: BSD-3-Clause
2     Copyright(c) 2016 Intel Corporation.
3
4 I40E Poll Mode Driver
5 ======================
6
7 The i40e PMD (**librte_net_i40e**) provides poll mode driver support for
8 10/25/40 Gbps Intel® Ethernet 700 Series Network Adapters based on
9 the Intel Ethernet Controller X710/XL710/XXV710 and Intel Ethernet
10 Connection X722 (only support part of features).
11
12
13 Features
14 --------
15
16 Features of the i40e PMD are:
17
18 - Multiple queues for TX and RX
19 - Receiver Side Scaling (RSS)
20 - MAC/VLAN filtering
21 - Packet type information
22 - Flow director
23 - Cloud filter
24 - Checksum offload
25 - VLAN/QinQ stripping and inserting
26 - TSO offload
27 - Promiscuous mode
28 - Multicast mode
29 - Port hardware statistics
30 - Jumbo frames
31 - Link state information
32 - Link flow control
33 - Mirror on port, VLAN and VSI
34 - Interrupt mode for RX
35 - Scattered and gather for TX and RX
36 - Vector Poll mode driver
37 - DCB
38 - VMDQ
39 - SR-IOV VF
40 - Hot plug
41 - IEEE1588/802.1AS timestamping
42 - VF Daemon (VFD) - EXPERIMENTAL
43 - Dynamic Device Personalization (DDP)
44 - Queue region configuration
45 - Virtual Function Port Representors
46 - Malicious Device Drive event catch and notify
47 - Generic flow API
48
49 Linux Prerequisites
50 -------------------
51
52 - Identifying your adapter using `Intel Support
53   <http://www.intel.com/support>`_ and get the latest NVM/FW images.
54
55 - Follow the DPDK :ref:`Getting Started Guide for Linux <linux_gsg>` to setup the basic DPDK environment.
56
57 - To get better performance on Intel platforms, please follow the "How to get best performance with NICs on Intel platforms"
58   section of the :ref:`Getting Started Guide for Linux <linux_gsg>`.
59
60 - Upgrade the NVM/FW version following the `Intel® Ethernet NVM Update Tool Quick Usage Guide for Linux
61   <https://www-ssl.intel.com/content/www/us/en/embedded/products/networking/nvm-update-tool-quick-linux-usage-guide.html>`_ and `Intel® Ethernet NVM Update Tool: Quick Usage Guide for EFI <https://www.intel.com/content/www/us/en/embedded/products/networking/nvm-update-tool-quick-efi-usage-guide.html>`_ if needed.
62
63 - For information about supported media, please refer to this document: `Intel® Ethernet Controller X710/XXV710/XL710 Feature Support Matrix
64   <http://www.intel.com/content/dam/www/public/us/en/documents/release-notes/xl710-ethernet-controller-feature-matrix.pdf>`_.
65
66    .. Note::
67
68       * Some adapters based on the Intel(R) Ethernet Controller 700 Series only
69         support Intel Ethernet Optics modules. On these adapters, other modules are not
70         supported and will not function.
71
72       * For connections based on Intel(R) Ethernet Controller 700 Series,
73         support is dependent on your system board. Please see your vendor for details.
74
75       * In all cases Intel recommends using Intel Ethernet Optics; other modules
76         may function but are not validated by Intel. Contact Intel for supported media types.
77
78 Windows Prerequisites
79 ---------------------
80
81 - Follow the DPDK `Getting Started Guide for Windows <https://doc.dpdk.org/guides/windows_gsg/index.html>`_ to setup the basic DPDK environment.
82
83 - Identify the Intel® Ethernet adapter and get the latest NVM/FW version.
84
85 - To access any Intel® Ethernet hardware, load the NetUIO driver in place of existing built-in (inbox) driver.
86
87 - To load NetUIO driver, follow the steps mentioned in `dpdk-kmods repository
88   <https://git.dpdk.org/dpdk-kmods/tree/windows/netuio/README.rst>`_.
89
90 Recommended Matching List
91 -------------------------
92
93 It is highly recommended to upgrade the i40e kernel driver and firmware to
94 avoid the compatibility issues with i40e PMD. Here is the suggested matching
95 list which has been tested and verified. The detailed information can refer
96 to chapter Tested Platforms/Tested NICs in release notes.
97
98 For X710/XL710/XXV710,
99
100    +--------------+-----------------------+------------------+
101    | DPDK version | Kernel driver version | Firmware version |
102    +==============+=======================+==================+
103    |    20.11     |         2.13.10       |       8.00       |
104    +--------------+-----------------------+------------------+
105    |    20.08     |         2.12.6        |       7.30       |
106    +--------------+-----------------------+------------------+
107    |    20.05     |         2.11.27       |       7.30       |
108    +--------------+-----------------------+------------------+
109    |    20.02     |         2.10.19       |       7.20       |
110    +--------------+-----------------------+------------------+
111    |    19.11     |         2.9.21        |       7.00       |
112    +--------------+-----------------------+------------------+
113    |    19.08     |         2.8.43        |       7.00       |
114    +--------------+-----------------------+------------------+
115    |    19.05     |         2.7.29        |       6.80       |
116    +--------------+-----------------------+------------------+
117    |    19.02     |         2.7.26        |       6.80       |
118    +--------------+-----------------------+------------------+
119    |    18.11     |         2.4.6         |       6.01       |
120    +--------------+-----------------------+------------------+
121    |    18.08     |         2.4.6         |       6.01       |
122    +--------------+-----------------------+------------------+
123    |    18.05     |         2.4.6         |       6.01       |
124    +--------------+-----------------------+------------------+
125    |    18.02     |         2.4.3         |       6.01       |
126    +--------------+-----------------------+------------------+
127    |    17.11     |         2.1.26        |       6.01       |
128    +--------------+-----------------------+------------------+
129    |    17.08     |         2.0.19        |       6.01       |
130    +--------------+-----------------------+------------------+
131    |    17.05     |         1.5.23        |       5.05       |
132    +--------------+-----------------------+------------------+
133    |    17.02     |         1.5.23        |       5.05       |
134    +--------------+-----------------------+------------------+
135    |    16.11     |         1.5.23        |       5.05       |
136    +--------------+-----------------------+------------------+
137    |    16.07     |         1.4.25        |       5.04       |
138    +--------------+-----------------------+------------------+
139    |    16.04     |         1.4.25        |       5.02       |
140    +--------------+-----------------------+------------------+
141
142
143 For X722,
144
145    +--------------+-----------------------+------------------+
146    | DPDK version | Kernel driver version | Firmware version |
147    +==============+=======================+==================+
148    |    20.11     |         2.13.10       |       5.00       |
149    +--------------+-----------------------+------------------+
150    |    20.08     |         2.12.6        |       4.11       |
151    +--------------+-----------------------+------------------+
152    |    20.05     |         2.11.27       |       4.11       |
153    +--------------+-----------------------+------------------+
154    |    20.02     |         2.10.19       |       4.11       |
155    +--------------+-----------------------+------------------+
156    |    19.11     |         2.9.21        |       4.10       |
157    +--------------+-----------------------+------------------+
158    |    19.08     |         2.9.21        |       4.10       |
159    +--------------+-----------------------+------------------+
160    |    19.05     |         2.7.29        |       3.33       |
161    +--------------+-----------------------+------------------+
162    |    19.02     |         2.7.26        |       3.33       |
163    +--------------+-----------------------+------------------+
164    |    18.11     |         2.4.6         |       3.33       |
165    +--------------+-----------------------+------------------+
166
167
168 Pre-Installation Configuration
169 ------------------------------
170
171 Config File Options
172 ~~~~~~~~~~~~~~~~~~~
173
174 The following options can be modified in the ``config/rte_config.h`` file.
175
176 - ``RTE_LIBRTE_I40E_QUEUE_NUM_PER_PF`` (default ``64``)
177
178   Number of queues reserved for PF.
179
180 - ``RTE_LIBRTE_I40E_QUEUE_NUM_PER_VM`` (default ``4``)
181
182   Number of queues reserved for each VMDQ Pool.
183
184 Runtime Config Options
185 ~~~~~~~~~~~~~~~~~~~~~~
186
187 - ``Reserved number of Queues per VF`` (default ``4``)
188
189   The number of reserved queue per VF is determined by its host PF. If the
190   PCI address of an i40e PF is aaaa:bb.cc, the number of reserved queues per
191   VF can be configured with EAL parameter like -a aaaa:bb.cc,queue-num-per-vf=n.
192   The value n can be 1, 2, 4, 8 or 16. If no such parameter is configured, the
193   number of reserved queues per VF is 4 by default. If VF request more than
194   reserved queues per VF, PF will able to allocate max to 16 queues after a VF
195   reset.
196
197
198 - ``Support multiple driver`` (default ``disable``)
199
200   There was a multiple driver support issue during use of 700 series Ethernet
201   Adapter with both Linux kernel and DPDK PMD. To fix this issue, ``devargs``
202   parameter ``support-multi-driver`` is introduced, for example::
203
204     -a 84:00.0,support-multi-driver=1
205
206   With the above configuration, DPDK PMD will not change global registers, and
207   will switch PF interrupt from IntN to Int0 to avoid interrupt conflict between
208   DPDK and Linux Kernel.
209
210 - ``Support VF Port Representor`` (default ``not enabled``)
211
212   The i40e PF PMD supports the creation of VF port representors for the control
213   and monitoring of i40e virtual function devices. Each port representor
214   corresponds to a single virtual function of that device. Using the ``devargs``
215   option ``representor`` the user can specify which virtual functions to create
216   port representors for on initialization of the PF PMD by passing the VF IDs of
217   the VFs which are required.::
218
219   -a DBDF,representor=[0,1,4]
220
221   Currently hot-plugging of representor ports is not supported so all required
222   representors must be specified on the creation of the PF.
223
224 - ``Enable validation for VF message`` (default ``not enabled``)
225
226   The PF counts messages from each VF. If in any period of seconds the message
227   statistic from a VF exceeds maximal limitation, the PF will ignore any new message
228   from that VF for some seconds.
229   Format -- "maximal-message@period-seconds:ignore-seconds"
230   For example::
231
232   -a 84:00.0,vf_msg_cfg=80@120:180
233
234 Vector RX Pre-conditions
235 ~~~~~~~~~~~~~~~~~~~~~~~~
236 For Vector RX it is assumed that the number of descriptor rings will be a power
237 of 2. With this pre-condition, the ring pointer can easily scroll back to the
238 head after hitting the tail without a conditional check. In addition Vector RX
239 can use this assumption to do a bit mask using ``ring_size - 1``.
240
241 Driver compilation and testing
242 ------------------------------
243
244 Refer to the document :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>`
245 for details.
246
247
248 SR-IOV: Prerequisites and sample Application Notes
249 --------------------------------------------------
250
251 #. Load the kernel module:
252
253    .. code-block:: console
254
255       modprobe i40e
256
257    Check the output in dmesg:
258
259    .. code-block:: console
260
261       i40e 0000:83:00.1 ens802f0: renamed from eth0
262
263 #. Bring up the PF ports:
264
265    .. code-block:: console
266
267       ifconfig ens802f0 up
268
269 #. Create VF device(s):
270
271    Echo the number of VFs to be created into the ``sriov_numvfs`` sysfs entry
272    of the parent PF.
273
274    Example:
275
276    .. code-block:: console
277
278       echo 2 > /sys/devices/pci0000:00/0000:00:03.0/0000:81:00.0/sriov_numvfs
279
280
281 #. Assign VF MAC address:
282
283    Assign MAC address to the VF using iproute2 utility. The syntax is:
284
285    .. code-block:: console
286
287       ip link set <PF netdev id> vf <VF id> mac <macaddr>
288
289    Example:
290
291    .. code-block:: console
292
293       ip link set ens802f0 vf 0 mac a0:b0:c0:d0:e0:f0
294
295 #. Assign VF to VM, and bring up the VM.
296    Please see the documentation for the *I40E/IXGBE/IGB Virtual Function Driver*.
297
298 #. Running testpmd:
299
300    Follow instructions available in the document
301    :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>`
302    to run testpmd.
303
304    Example output:
305
306    .. code-block:: console
307
308       ...
309       EAL: PCI device 0000:83:00.0 on NUMA socket 1
310       EAL: probe driver: 8086:1572 rte_i40e_pmd
311       EAL: PCI memory mapped at 0x7f7f80000000
312       EAL: PCI memory mapped at 0x7f7f80800000
313       PMD: eth_i40e_dev_init(): FW 5.0 API 1.5 NVM 05.00.02 eetrack 8000208a
314       Interactive-mode selected
315       Configuring Port 0 (socket 0)
316       ...
317
318       PMD: i40e_dev_rx_queue_setup(): Rx Burst Bulk Alloc Preconditions are
319       satisfied.Rx Burst Bulk Alloc function will be used on port=0, queue=0.
320
321       ...
322       Port 0: 68:05:CA:26:85:84
323       Checking link statuses...
324       Port 0 Link Up - speed 10000 Mbps - full-duplex
325       Done
326
327       testpmd>
328
329
330 Sample Application Notes
331 ------------------------
332
333 Vlan filter
334 ~~~~~~~~~~~
335
336 Vlan filter only works when Promiscuous mode is off.
337
338 To start ``testpmd``, and add vlan 10 to port 0:
339
340 .. code-block:: console
341
342     ./<build_dir>/app/dpdk-testpmd -l 0-15 -n 4 -- -i --forward-mode=mac
343     ...
344
345     testpmd> set promisc 0 off
346     testpmd> rx_vlan add 10 0
347
348
349 Flow Director
350 ~~~~~~~~~~~~~
351
352 The Flow Director works in receive mode to identify specific flows or sets of flows and route them to specific queues.
353 The Flow Director filters can match the different fields for different type of packet: flow type, specific input set per flow type and the flexible payload.
354
355 The default input set of each flow type is::
356
357    ipv4-other : src_ip_address, dst_ip_address
358    ipv4-frag  : src_ip_address, dst_ip_address
359    ipv4-tcp   : src_ip_address, dst_ip_address, src_port, dst_port
360    ipv4-udp   : src_ip_address, dst_ip_address, src_port, dst_port
361    ipv4-sctp  : src_ip_address, dst_ip_address, src_port, dst_port,
362                 verification_tag
363    ipv6-other : src_ip_address, dst_ip_address
364    ipv6-frag  : src_ip_address, dst_ip_address
365    ipv6-tcp   : src_ip_address, dst_ip_address, src_port, dst_port
366    ipv6-udp   : src_ip_address, dst_ip_address, src_port, dst_port
367    ipv6-sctp  : src_ip_address, dst_ip_address, src_port, dst_port,
368                 verification_tag
369    l2_payload : ether_type
370
371 The flex payload is selected from offset 0 to 15 of packet's payload by default, while it is masked out from matching.
372
373 Start ``testpmd`` with ``--disable-rss`` and ``--pkt-filter-mode=perfect``:
374
375 .. code-block:: console
376
377    ./<build_dir>/app/dpdk-testpmd -l 0-15 -n 4 -- -i --disable-rss \
378                  --pkt-filter-mode=perfect --rxq=8 --txq=8 --nb-cores=8 \
379                  --nb-ports=1
380
381 Add a rule to direct ``ipv4-udp`` packet whose ``dst_ip=2.2.2.5, src_ip=2.2.2.3, src_port=32, dst_port=32`` to queue 1:
382
383 .. code-block:: console
384
385    testpmd> flow create 0 ingress pattern eth / ipv4 src is 2.2.2.3 \
386             dst is 2.2.2.5 / udp src is 32 dst is 32 / end \
387             actions mark id 1 / queue index 1 / end
388
389 Check the flow director status:
390
391 .. code-block:: console
392
393    testpmd> show port fdir 0
394
395    ######################## FDIR infos for port 0      ####################
396      MODE:   PERFECT
397      SUPPORTED FLOW TYPE:  ipv4-frag ipv4-tcp ipv4-udp ipv4-sctp ipv4-other
398                            ipv6-frag ipv6-tcp ipv6-udp ipv6-sctp ipv6-other
399                            l2_payload
400      FLEX PAYLOAD INFO:
401      max_len:       16          payload_limit: 480
402      payload_unit:  2           payload_seg:   3
403      bitmask_unit:  2           bitmask_num:   2
404      MASK:
405        vlan_tci: 0x0000,
406        src_ipv4: 0x00000000,
407        dst_ipv4: 0x00000000,
408        src_port: 0x0000,
409        dst_port: 0x0000
410        src_ipv6: 0x00000000,0x00000000,0x00000000,0x00000000,
411        dst_ipv6: 0x00000000,0x00000000,0x00000000,0x00000000
412      FLEX PAYLOAD SRC OFFSET:
413        L2_PAYLOAD:    0      1      2      3      4      5      6  ...
414        L3_PAYLOAD:    0      1      2      3      4      5      6  ...
415        L4_PAYLOAD:    0      1      2      3      4      5      6  ...
416      FLEX MASK CFG:
417        ipv4-udp:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
418        ipv4-tcp:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
419        ipv4-sctp:   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
420        ipv4-other:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
421        ipv4-frag:   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
422        ipv6-udp:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
423        ipv6-tcp:    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
424        ipv6-sctp:   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
425        ipv6-other:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
426        ipv6-frag:   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
427        l2_payload:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
428      guarant_count: 1           best_count:    0
429      guarant_space: 512         best_space:    7168
430      collision:     0           free:          0
431      maxhash:       0           maxlen:        0
432      add:           0           remove:        0
433      f_add:         0           f_remove:      0
434
435
436 Floating VEB
437 ~~~~~~~~~~~~~
438
439 The Intel® Ethernet 700 Series support a feature called
440 "Floating VEB".
441
442 A Virtual Ethernet Bridge (VEB) is an IEEE Edge Virtual Bridging (EVB) term
443 for functionality that allows local switching between virtual endpoints within
444 a physical endpoint and also with an external bridge/network.
445
446 A "Floating" VEB doesn't have an uplink connection to the outside world so all
447 switching is done internally and remains within the host. As such, this
448 feature provides security benefits.
449
450 In addition, a Floating VEB overcomes a limitation of normal VEBs where they
451 cannot forward packets when the physical link is down. Floating VEBs don't need
452 to connect to the NIC port so they can still forward traffic from VF to VF
453 even when the physical link is down.
454
455 Therefore, with this feature enabled VFs can be limited to communicating with
456 each other but not an outside network, and they can do so even when there is
457 no physical uplink on the associated NIC port.
458
459 To enable this feature, the user should pass a ``devargs`` parameter to the
460 EAL, for example::
461
462     -a 84:00.0,enable_floating_veb=1
463
464 In this configuration the PMD will use the floating VEB feature for all the
465 VFs created by this PF device.
466
467 Alternatively, the user can specify which VFs need to connect to this floating
468 VEB using the ``floating_veb_list`` argument::
469
470     -a 84:00.0,enable_floating_veb=1,floating_veb_list=1;3-4
471
472 In this example ``VF1``, ``VF3`` and ``VF4`` connect to the floating VEB,
473 while other VFs connect to the normal VEB.
474
475 The current implementation only supports one floating VEB and one regular
476 VEB. VFs can connect to a floating VEB or a regular VEB according to the
477 configuration passed on the EAL command line.
478
479 The floating VEB functionality requires a NIC firmware version of 5.0
480 or greater.
481
482 Dynamic Device Personalization (DDP)
483 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
484
485 The Intel® Ethernet 700 Series except for the Intel Ethernet Connection
486 X722 support a feature called "Dynamic Device Personalization (DDP)",
487 which is used to configure hardware by downloading a profile to support
488 protocols/filters which are not supported by default. The DDP
489 functionality requires a NIC firmware version of 6.0 or greater.
490
491 Current implementation supports GTP-C/GTP-U/PPPoE/PPPoL2TP/ESP,
492 steering can be used with rte_flow API.
493
494 GTPv1 package is released, and it can be downloaded from
495 https://downloadcenter.intel.com/download/27587.
496
497 PPPoE package is released, and it can be downloaded from
498 https://downloadcenter.intel.com/download/28040.
499
500 ESP-AH package is released, and it can be downloaded from
501 https://downloadcenter.intel.com/download/29446.
502
503 Load a profile which supports GTP and store backup profile:
504
505 .. code-block:: console
506
507    testpmd> ddp add 0 ./gtp.pkgo,./backup.pkgo
508
509 Delete a GTP profile and restore backup profile:
510
511 .. code-block:: console
512
513    testpmd> ddp del 0 ./backup.pkgo
514
515 Get loaded DDP package info list:
516
517 .. code-block:: console
518
519    testpmd> ddp get list 0
520
521 Display information about a GTP profile:
522
523 .. code-block:: console
524
525    testpmd> ddp get info ./gtp.pkgo
526
527 Input set configuration
528 ~~~~~~~~~~~~~~~~~~~~~~~
529 Input set for any PCTYPE can be configured with user defined configuration,
530 For example, to use only 48bit prefix for IPv6 src address for IPv6 TCP RSS:
531
532 .. code-block:: console
533
534    testpmd> port config 0 pctype 43 hash_inset clear all
535    testpmd> port config 0 pctype 43 hash_inset set field 13
536    testpmd> port config 0 pctype 43 hash_inset set field 14
537    testpmd> port config 0 pctype 43 hash_inset set field 15
538
539 Queue region configuration
540 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
541 The Intel® Ethernet 700 Series supports a feature of queue regions
542 configuration for RSS in the PF, so that different traffic classes or
543 different packet classification types can be separated to different
544 queues in different queue regions. There is an API for configuration
545 of queue regions in RSS with a command line. It can parse the parameters
546 of the region index, queue number, queue start index, user priority, traffic
547 classes and so on. Depending on commands from the command line, it will call
548 i40e private APIs and start the process of setting or flushing the queue
549 region configuration. As this feature is specific for i40e only private
550 APIs are used. These new ``test_pmd`` commands are as shown below. For
551 details please refer to :doc:`../testpmd_app_ug/index`.
552
553 .. code-block:: console
554
555    testpmd> set port (port_id) queue-region region_id (value) \
556                 queue_start_index (value) queue_num (value)
557    testpmd> set port (port_id) queue-region region_id (value) flowtype (value)
558    testpmd> set port (port_id) queue-region UP (value) region_id (value)
559    testpmd> set port (port_id) queue-region flush (on|off)
560    testpmd> show port (port_id) queue-region
561
562 Generic flow API
563 ~~~~~~~~~~~~~~~~~~~
564
565 - ``RSS Flow``
566
567   RSS Flow supports to set hash input set, hash function, enable hash
568   and configure queues.
569   For example:
570   Configure queues as queue 0, 1, 2, 3.
571
572   .. code-block:: console
573
574     testpmd> flow create 0 ingress pattern end actions rss types end \
575       queues 0 1 2 3 end / end
576
577   Enable hash and set input set for ipv4-tcp.
578
579   .. code-block:: console
580
581     testpmd> flow create 0 ingress pattern eth / ipv4 / tcp / end \
582       actions rss types ipv4-tcp l3-src-only end queues end / end
583
584   Set symmetric hash enable for flow type ipv4-tcp.
585
586   .. code-block:: console
587
588     testpmd> flow create 0 ingress pattern eth / ipv4 / tcp / end \
589       actions rss types ipv4-tcp end queues end func symmetric_toeplitz / end
590
591   Set hash function as simple xor.
592
593   .. code-block:: console
594
595     testpmd> flow create 0 ingress pattern end actions rss types end \
596       queues end func simple_xor / end
597
598 Limitations or Known issues
599 ---------------------------
600
601 MPLS packet classification
602 ~~~~~~~~~~~~~~~~~~~~~~~~~~
603
604 For firmware versions prior to 5.0, MPLS packets are not recognized by the NIC.
605 The L2 Payload flow type in flow director can be used to classify MPLS packet
606 by using a command in testpmd like:
607
608    testpmd> flow_director_filter 0 mode IP add flow l2_payload ether \
609             0x8847 flexbytes () fwd pf queue <N> fd_id <M>
610
611 With the NIC firmware version 5.0 or greater, some limited MPLS support
612 is added: Native MPLS (MPLS in Ethernet) skip is implemented, while no
613 new packet type, no classification or offload are possible. With this change,
614 L2 Payload flow type in flow director cannot be used to classify MPLS packet
615 as with previous firmware versions. Meanwhile, the Ethertype filter can be
616 used to classify MPLS packet by using a command in testpmd like:
617
618    testpmd> flow create 0 ingress pattern eth type is 0x8847 / end \
619             actions queue index <M> / end
620
621 16 Byte RX Descriptor setting on DPDK VF
622 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
623
624 Currently the VF's RX descriptor mode is decided by PF. There's no PF-VF
625 interface for VF to request the RX descriptor mode, also no interface to notify
626 VF its own RX descriptor mode.
627 For all available versions of the i40e driver, these drivers don't support 16
628 byte RX descriptor. If the Linux i40e kernel driver is used as host driver,
629 while DPDK i40e PMD is used as the VF driver, DPDK cannot choose 16 byte receive
630 descriptor. The reason is that the RX descriptor is already set to 32 byte by
631 the i40e kernel driver.
632 In the future, if the Linux i40e driver supports 16 byte RX descriptor, user
633 should make sure the DPDK VF uses the same RX descriptor mode, 16 byte or 32
634 byte, as the PF driver.
635
636 The same rule for DPDK PF + DPDK VF. The PF and VF should use the same RX
637 descriptor mode. Or the VF RX will not work.
638
639 Receive packets with Ethertype 0x88A8
640 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
641
642 Due to the FW limitation, PF can receive packets with Ethertype 0x88A8
643 only when floating VEB is disabled.
644
645 Incorrect Rx statistics when packet is oversize
646 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
647
648 When a packet is over maximum frame size, the packet is dropped.
649 However, the Rx statistics, when calling `rte_eth_stats_get` incorrectly
650 shows it as received.
651
652 RX/TX statistics may be incorrect when register overflowed
653 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
654
655 The rx_bytes/tx_bytes statistics register is 48 bit length.
656 Although this limitation is enlarged to 64 bit length on the software side,
657 but there is no way to detect if the overflow occurred more than once.
658 So rx_bytes/tx_bytes statistics data is correct when statistics are
659 updated at least once between two overflows.
660
661 VF & TC max bandwidth setting
662 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
663
664 The per VF max bandwidth and per TC max bandwidth cannot be enabled in parallel.
665 The behavior is different when handling per VF and per TC max bandwidth setting.
666 When enabling per VF max bandwidth, SW will check if per TC max bandwidth is
667 enabled. If so, return failure.
668 When enabling per TC max bandwidth, SW will check if per VF max bandwidth
669 is enabled. If so, disable per VF max bandwidth and continue with per TC max
670 bandwidth setting.
671
672 TC TX scheduling mode setting
673 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
674
675 There are 2 TX scheduling modes for TCs, round robin and strict priority mode.
676 If a TC is set to strict priority mode, it can consume unlimited bandwidth.
677 It means if APP has set the max bandwidth for that TC, it comes to no
678 effect.
679 It's suggested to set the strict priority mode for a TC that is latency
680 sensitive but no consuming much bandwidth.
681
682 VF performance is impacted by PCI extended tag setting
683 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
684
685 To reach maximum NIC performance in the VF the PCI extended tag must be
686 enabled. The DPDK i40e PF driver will set this feature during initialization,
687 but the kernel PF driver does not. So when running traffic on a VF which is
688 managed by the kernel PF driver, a significant NIC performance downgrade has
689 been observed (for 64 byte packets, there is about 25% line-rate downgrade for
690 a 25GbE device and about 35% for a 40GbE device).
691
692 For kernel version >= 4.11, the kernel's PCI driver will enable the extended
693 tag if it detects that the device supports it. So by default, this is not an
694 issue. For kernels <= 4.11 or when the PCI extended tag is disabled it can be
695 enabled using the steps below.
696
697 #. Get the current value of the PCI configure register::
698
699       setpci -s <XX:XX.X> a8.w
700
701 #. Set bit 8::
702
703       value = value | 0x100
704
705 #. Set the PCI configure register with new value::
706
707       setpci -s <XX:XX.X> a8.w=<value>
708
709 Vlan strip of VF
710 ~~~~~~~~~~~~~~~~
711
712 The VF vlan strip function is only supported in the i40e kernel driver >= 2.1.26.
713
714 DCB function
715 ~~~~~~~~~~~~
716
717 DCB works only when RSS is enabled.
718
719 Global configuration warning
720 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
721
722 I40E PMD will set some global registers to enable some function or set some
723 configure. Then when using different ports of the same NIC with Linux kernel
724 and DPDK, the port with Linux kernel will be impacted by the port with DPDK.
725 For example, register I40E_GL_SWT_L2TAGCTRL is used to control L2 tag, i40e
726 PMD uses I40E_GL_SWT_L2TAGCTRL to set vlan TPID. If setting TPID in port A
727 with DPDK, then the configuration will also impact port B in the NIC with
728 kernel driver, which don't want to use the TPID.
729 So PMD reports warning to clarify what is changed by writing global register.
730
731 Cloud Filter
732 ~~~~~~~~~~~~
733
734 When programming cloud filters for IPv4/6_UDP/TCP/SCTP with SRC port only or DST port only,
735 it will make any cloud filter using inner_vlan or tunnel key invalid. Default configuration will be
736 recovered only by NIC core reset.
737
738 Mirror rule limitation for X722
739 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
740
741 Due to firmware restriction of X722, the same VSI cannot have more than one mirror rule.
742
743 High Performance of Small Packets on 40GbE NIC
744 ----------------------------------------------
745
746 As there might be firmware fixes for performance enhancement in latest version
747 of firmware image, the firmware update might be needed for getting high performance.
748 Check the Intel support website for the latest firmware updates.
749 Users should consult the release notes specific to a DPDK release to identify
750 the validated firmware version for a NIC using the i40e driver.
751
752 Use 16 Bytes RX Descriptor Size
753 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
754
755 As i40e PMD supports both 16 and 32 bytes RX descriptor sizes, and 16 bytes size can provide helps to high performance of small packets.
756 In ``config/rte_config.h`` set the following to use 16 bytes size RX descriptors::
757
758    #define RTE_LIBRTE_I40E_16BYTE_RX_DESC 1
759
760 Input set requirement of each pctype for FDIR
761 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
762
763 Each PCTYPE can only have one specific FDIR input set at one time.
764 For example, if creating 2 rte_flow rules with different input set for one PCTYPE,
765 it will fail and return the info "Conflict with the first rule's input set",
766 which means the current rule's input set conflicts with the first rule's.
767 Remove the first rule if want to change the input set of the PCTYPE.
768
769 Example of getting best performance with l3fwd example
770 ------------------------------------------------------
771
772 The following is an example of running the DPDK ``l3fwd`` sample application to get high performance with a
773 server with Intel Xeon processors and Intel Ethernet CNA XL710.
774
775 The example scenario is to get best performance with two Intel Ethernet CNA XL710 40GbE ports.
776 See :numref:`figure_intel_perf_test_setup` for the performance test setup.
777
778 .. _figure_intel_perf_test_setup:
779
780 .. figure:: img/intel_perf_test_setup.*
781
782    Performance Test Setup
783
784
785 1. Add two Intel Ethernet CNA XL710 to the platform, and use one port per card to get best performance.
786    The reason for using two NICs is to overcome a PCIe v3.0 limitation since it cannot provide 80GbE bandwidth
787    for two 40GbE ports, but two different PCIe v3.0 x8 slot can.
788    Refer to the sample NICs output above, then we can select ``82:00.0`` and ``85:00.0`` as test ports::
789
790       82:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
791       85:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
792
793 2. Connect the ports to the traffic generator. For high speed testing, it's best to use a hardware traffic generator.
794
795 3. Check the PCI devices numa node (socket id) and get the cores number on the exact socket id.
796    In this case, ``82:00.0`` and ``85:00.0`` are both in socket 1, and the cores on socket 1 in the referenced platform
797    are 18-35 and 54-71.
798    Note: Don't use 2 logical cores on the same core (e.g core18 has 2 logical cores, core18 and core54), instead, use 2 logical
799    cores from different cores (e.g core18 and core19).
800
801 4. Bind these two ports to igb_uio.
802
803 5. As to Intel Ethernet CNA XL710 40GbE port, we need at least two queue pairs to achieve best performance, then two queues per port
804    will be required, and each queue pair will need a dedicated CPU core for receiving/transmitting packets.
805
806 6. The DPDK sample application ``l3fwd`` will be used for performance testing, with using two ports for bi-directional forwarding.
807    Compile the ``l3fwd sample`` with the default lpm mode.
808
809 7. The command line of running l3fwd would be something like the following::
810
811       ./dpdk-l3fwd -l 18-21 -n 4 -a 82:00.0 -a 85:00.0 \
812               -- -p 0x3 --config '(0,0,18),(0,1,19),(1,0,20),(1,1,21)'
813
814    This means that the application uses core 18 for port 0, queue pair 0 forwarding, core 19 for port 0, queue pair 1 forwarding,
815    core 20 for port 1, queue pair 0 forwarding, and core 21 for port 1, queue pair 1 forwarding.
816
817 8. Configure the traffic at a traffic generator.
818
819    * Start creating a stream on packet generator.
820
821    * Set the Ethernet II type to 0x0800.
822
823 Tx bytes affected by the link status change
824 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
825
826 For firmware versions prior to 6.01 for X710 series and 3.33 for X722 series, the tx_bytes statistics data is affected by
827 the link down event. Each time the link status changes to down, the tx_bytes decreases 110 bytes.