net/mlx5: support Rx queue delay drop
[dpdk.git] / doc / guides / nics / mlx5.rst
1 ..  SPDX-License-Identifier: BSD-3-Clause
2     Copyright 2015 6WIND S.A.
3     Copyright 2015 Mellanox Technologies, Ltd
4
5 .. include:: <isonum.txt>
6
7 MLX5 poll mode driver
8 =====================
9
10 The MLX5 poll mode driver library (**librte_net_mlx5**) provides support
11 for **Mellanox ConnectX-4**, **Mellanox ConnectX-4 Lx** , **Mellanox
12 ConnectX-5**, **Mellanox ConnectX-6**, **Mellanox ConnectX-6 Dx**, **Mellanox
13 ConnectX-6 Lx**, **Mellanox BlueField** and **Mellanox BlueField-2** families
14 of 10/25/40/50/100/200 Gb/s adapters as well as their virtual functions (VF)
15 in SR-IOV context.
16
17 Information and documentation about these adapters can be found on the
18 `Mellanox website <http://www.mellanox.com>`__. Help is also provided by the
19 `Mellanox community <http://community.mellanox.com/welcome>`__.
20
21 There is also a `section dedicated to this poll mode driver
22 <http://www.mellanox.com/page/products_dyn?product_family=209&mtag=pmd_for_dpdk>`__.
23
24
25 Design
26 ------
27
28 Besides its dependency on libibverbs (that implies libmlx5 and associated
29 kernel support), librte_net_mlx5 relies heavily on system calls for control
30 operations such as querying/updating the MTU and flow control parameters.
31
32 For security reasons and robustness, this driver only deals with virtual
33 memory addresses. The way resources allocations are handled by the kernel,
34 combined with hardware specifications that allow to handle virtual memory
35 addresses directly, ensure that DPDK applications cannot access random
36 physical memory (or memory that does not belong to the current process).
37
38 This capability allows the PMD to coexist with kernel network interfaces
39 which remain functional, although they stop receiving unicast packets as
40 long as they share the same MAC address.
41 This means legacy linux control tools (for example: ethtool, ifconfig and
42 more) can operate on the same network interfaces that owned by the DPDK
43 application.
44
45 The PMD can use libibverbs and libmlx5 to access the device firmware
46 or directly the hardware components.
47 There are different levels of objects and bypassing abilities
48 to get the best performances:
49
50 - Verbs is a complete high-level generic API
51 - Direct Verbs is a device-specific API
52 - DevX allows to access firmware objects
53 - Direct Rules manages flow steering at low-level hardware layer
54
55 Enabling librte_net_mlx5 causes DPDK applications to be linked against
56 libibverbs.
57
58 Features
59 --------
60
61 - Multi arch support: x86_64, POWER8, ARMv8, i686.
62 - Multiple TX and RX queues.
63 - Shared Rx queue.
64 - Rx queue delay drop.
65 - Support for scattered TX frames.
66 - Advanced support for scattered Rx frames with tunable buffer attributes.
67 - IPv4, IPv6, TCPv4, TCPv6, UDPv4 and UDPv6 RSS on any number of queues.
68 - RSS using different combinations of fields: L3 only, L4 only or both,
69   and source only, destination only or both.
70 - Several RSS hash keys, one for each flow type.
71 - Default RSS operation with no hash key specification.
72 - Configurable RETA table.
73 - Link flow control (pause frame).
74 - Support for multiple MAC addresses.
75 - VLAN filtering.
76 - RX VLAN stripping.
77 - TX VLAN insertion.
78 - RX CRC stripping configuration.
79 - TX mbuf fast free offload.
80 - Promiscuous mode on PF and VF.
81 - Multicast promiscuous mode on PF and VF.
82 - Hardware checksum offloads.
83 - Flow director (RTE_FDIR_MODE_PERFECT, RTE_FDIR_MODE_PERFECT_MAC_VLAN and
84   RTE_ETH_FDIR_REJECT).
85 - Flow API, including :ref:`flow_isolated_mode`.
86 - Multiple process.
87 - KVM and VMware ESX SR-IOV modes are supported.
88 - RSS hash result is supported.
89 - Hardware TSO for generic IP or UDP tunnel, including VXLAN and GRE.
90 - Hardware checksum Tx offload for generic IP or UDP tunnel, including VXLAN and GRE.
91 - RX interrupts.
92 - Statistics query including Basic, Extended and per queue.
93 - Rx HW timestamp.
94 - Tunnel types: VXLAN, L3 VXLAN, VXLAN-GPE, GRE, MPLSoGRE, MPLSoUDP, IP-in-IP, Geneve, GTP.
95 - Tunnel HW offloads: packet type, inner/outer RSS, IP and UDP checksum verification.
96 - NIC HW offloads: encapsulation (vxlan, gre, mplsoudp, mplsogre), NAT, routing, TTL
97   increment/decrement, count, drop, mark. For details please see :ref:`mlx5_offloads_support`.
98 - Flow insertion rate of more then million flows per second, when using Direct Rules.
99 - Support for multiple rte_flow groups.
100 - Per packet no-inline hint flag to disable packet data copying into Tx descriptors.
101 - Hardware LRO.
102 - Hairpin.
103 - Multiple-thread flow insertion.
104 - Matching on IPv4 Internet Header Length (IHL).
105 - Matching on GTP extension header with raw encap/decap action.
106 - Matching on Geneve TLV option header with raw encap/decap action.
107 - RSS support in sample action.
108 - E-Switch mirroring and jump.
109 - E-Switch mirroring and modify.
110 - 21844 flow priorities for ingress or egress flow groups greater than 0 and for any transfer
111   flow group.
112 - Flow metering, including meter policy API.
113 - Flow meter hierarchy.
114 - Flow integrity offload API.
115 - Connection tracking.
116 - Sub-Function representors.
117 - Sub-Function.
118
119
120 Limitations
121 -----------
122
123 - Windows support:
124
125   On Windows, the features are limited:
126
127   - Promiscuous mode is not supported
128   - The following rules are supported:
129
130     - IPv4/UDP with CVLAN filtering
131     - Unicast MAC filtering
132
133   - Additional rules are supported from WinOF2 version 2.70:
134
135     - IPv4/TCP with CVLAN filtering
136     - L4 steering rules for port RSS of UDP, TCP and IP
137
138 - For secondary process:
139
140   - Forked secondary process not supported.
141   - External memory unregistered in EAL memseg list cannot be used for DMA
142     unless such memory has been registered by ``mlx5_mr_update_ext_mp()`` in
143     primary process and remapped to the same virtual address in secondary
144     process. If the external memory is registered by primary process but has
145     different virtual address in secondary process, unexpected error may happen.
146
147 - Shared Rx queue:
148
149   - Counters of received packets and bytes number of devices in same share group are same.
150   - Counters of received packets and bytes number of queues in same group and queue ID are same.
151
152 - When using Verbs flow engine (``dv_flow_en`` = 0), flow pattern without any
153   specific VLAN will match for VLAN packets as well:
154
155   When VLAN spec is not specified in the pattern, the matching rule will be created with VLAN as a wild card.
156   Meaning, the flow rule::
157
158         flow create 0 ingress pattern eth / vlan vid is 3 / ipv4 / end ...
159
160   Will only match vlan packets with vid=3. and the flow rule::
161
162         flow create 0 ingress pattern eth / ipv4 / end ...
163
164   Will match any ipv4 packet (VLAN included).
165
166 - When using Verbs flow engine (``dv_flow_en`` = 0), multi-tagged(QinQ) match is not supported.
167
168 - When using DV flow engine (``dv_flow_en`` = 1), flow pattern with any VLAN specification will match only single-tagged packets unless the ETH item ``type`` field is 0x88A8 or the VLAN item ``has_more_vlan`` field is 1.
169   The flow rule::
170
171         flow create 0 ingress pattern eth / ipv4 / end ...
172
173   Will match any ipv4 packet.
174   The flow rules::
175
176         flow create 0 ingress pattern eth / vlan / end ...
177         flow create 0 ingress pattern eth has_vlan is 1 / end ...
178         flow create 0 ingress pattern eth type is 0x8100 / end ...
179
180   Will match single-tagged packets only, with any VLAN ID value.
181   The flow rules::
182
183         flow create 0 ingress pattern eth type is 0x88A8 / end ...
184         flow create 0 ingress pattern eth / vlan has_more_vlan is 1 / end ...
185
186   Will match multi-tagged packets only, with any VLAN ID value.
187
188 - A flow pattern with 2 sequential VLAN items is not supported.
189
190 - VLAN pop offload command:
191
192   - Flow rules having a VLAN pop offload command as one of their actions and
193     are lacking a match on VLAN as one of their items are not supported.
194   - The command is not supported on egress traffic in NIC mode.
195
196 - VLAN push offload is not supported on ingress traffic in NIC mode.
197
198 - VLAN set PCP offload is not supported on existing headers.
199
200 - A multi segment packet must have not more segments than reported by dev_infos_get()
201   in tx_desc_lim.nb_seg_max field. This value depends on maximal supported Tx descriptor
202   size and ``txq_inline_min`` settings and may be from 2 (worst case forced by maximal
203   inline settings) to 58.
204
205 - Match on VXLAN supports the following fields only:
206
207      - VNI
208      - Last reserved 8-bits
209
210   Last reserved 8-bits matching is only supported When using DV flow
211   engine (``dv_flow_en`` = 1).
212   For ConnectX-5, the UDP destination port must be the standard one (4789).
213   Group zero's behavior may differ which depends on FW.
214   Matching value equals 0 (value & mask) is not supported.
215
216 - L3 VXLAN and VXLAN-GPE tunnels cannot be supported together with MPLSoGRE and MPLSoUDP.
217
218 - Match on Geneve header supports the following fields only:
219
220      - VNI
221      - OAM
222      - protocol type
223      - options length
224
225 - Match on Geneve TLV option is supported on the following fields:
226
227      - Class
228      - Type
229      - Length
230      - Data
231
232   Only one Class/Type/Length Geneve TLV option is supported per shared device.
233   Class/Type/Length fields must be specified as well as masks.
234   Class/Type/Length specified masks must be full.
235   Matching Geneve TLV option without specifying data is not supported.
236   Matching Geneve TLV option with ``data & mask == 0`` is not supported.
237
238 - VF: flow rules created on VF devices can only match traffic targeted at the
239   configured MAC addresses (see ``rte_eth_dev_mac_addr_add()``).
240
241 - Match on GTP tunnel header item supports the following fields only:
242
243      - v_pt_rsv_flags: E flag, S flag, PN flag
244      - msg_type
245      - teid
246
247 - Match on GTP extension header only for GTP PDU session container (next
248   extension header type = 0x85).
249 - Match on GTP extension header is not supported in group 0.
250
251 - No Tx metadata go to the E-Switch steering domain for the Flow group 0.
252   The flows within group 0 and set metadata action are rejected by hardware.
253
254 .. note::
255
256    MAC addresses not already present in the bridge table of the associated
257    kernel network device will be added and cleaned up by the PMD when closing
258    the device. In case of ungraceful program termination, some entries may
259    remain present and should be removed manually by other means.
260
261 - Buffer split offload is supported with regular Rx burst routine only,
262   no MPRQ feature or vectorized code can be engaged.
263
264 - When Multi-Packet Rx queue is configured (``mprq_en``), a Rx packet can be
265   externally attached to a user-provided mbuf with having RTE_MBUF_F_EXTERNAL in
266   ol_flags. As the mempool for the external buffer is managed by PMD, all the
267   Rx mbufs must be freed before the device is closed. Otherwise, the mempool of
268   the external buffers will be freed by PMD and the application which still
269   holds the external buffers may be corrupted.
270
271 - If Multi-Packet Rx queue is configured (``mprq_en``) and Rx CQE compression is
272   enabled (``rxq_cqe_comp_en``) at the same time, RSS hash result is not fully
273   supported. Some Rx packets may not have RTE_MBUF_F_RX_RSS_HASH.
274
275 - IPv6 Multicast messages are not supported on VM, while promiscuous mode
276   and allmulticast mode are both set to off.
277   To receive IPv6 Multicast messages on VM, explicitly set the relevant
278   MAC address using rte_eth_dev_mac_addr_add() API.
279
280 - To support a mixed traffic pattern (some buffers from local host memory, some
281   buffers from other devices) with high bandwidth, a mbuf flag is used.
282
283   An application hints the PMD whether or not it should try to inline the
284   given mbuf data buffer. PMD should do the best effort to act upon this request.
285
286   The hint flag ``RTE_PMD_MLX5_FINE_GRANULARITY_INLINE`` is dynamic,
287   registered by application with rte_mbuf_dynflag_register(). This flag is
288   purely driver-specific and declared in PMD specific header ``rte_pmd_mlx5.h``,
289   which is intended to be used by the application.
290
291   To query the supported specific flags in runtime,
292   the function ``rte_pmd_mlx5_get_dyn_flag_names`` returns the array of
293   currently (over present hardware and configuration) supported specific flags.
294   The "not inline hint" feature operating flow is the following one:
295
296     - application starts
297     - probe the devices, ports are created
298     - query the port capabilities
299     - if port supporting the feature is found
300     - register dynamic flag ``RTE_PMD_MLX5_FINE_GRANULARITY_INLINE``
301     - application starts the ports
302     - on ``dev_start()`` PMD checks whether the feature flag is registered and
303       enables the feature support in datapath
304     - application might set the registered flag bit in ``ol_flags`` field
305       of mbuf being sent and PMD will handle ones appropriately.
306
307 - The amount of descriptors in Tx queue may be limited by data inline settings.
308   Inline data require the more descriptor building blocks and overall block
309   amount may exceed the hardware supported limits. The application should
310   reduce the requested Tx size or adjust data inline settings with
311   ``txq_inline_max`` and ``txq_inline_mpw`` devargs keys.
312
313 - To provide the packet send scheduling on mbuf timestamps the ``tx_pp``
314   parameter should be specified.
315   When PMD sees the RTE_MBUF_DYNFLAG_TX_TIMESTAMP_NAME set on the packet
316   being sent it tries to synchronize the time of packet appearing on
317   the wire with the specified packet timestamp. It the specified one
318   is in the past it should be ignored, if one is in the distant future
319   it should be capped with some reasonable value (in range of seconds).
320   These specific cases ("too late" and "distant future") can be optionally
321   reported via device xstats to assist applications to detect the
322   time-related problems.
323
324   The timestamp upper "too-distant-future" limit
325   at the moment of invoking the Tx burst routine
326   can be estimated as ``tx_pp`` option (in nanoseconds) multiplied by 2^23.
327   Please note, for the testpmd txonly mode,
328   the limit is deduced from the expression::
329
330         (n_tx_descriptors / burst_size + 1) * inter_burst_gap
331
332   There is no any packet reordering according timestamps is supposed,
333   neither within packet burst, nor between packets, it is an entirely
334   application responsibility to generate packets and its timestamps
335   in desired order. The timestamps can be put only in the first packet
336   in the burst providing the entire burst scheduling.
337
338 - E-Switch decapsulation Flow:
339
340   - can be applied to PF port only.
341   - must specify VF port action (packet redirection from PF to VF).
342   - optionally may specify tunnel inner source and destination MAC addresses.
343
344 - E-Switch  encapsulation Flow:
345
346   - can be applied to VF ports only.
347   - must specify PF port action (packet redirection from VF to PF).
348
349 - Raw encapsulation:
350
351   - The input buffer, used as outer header, is not validated.
352
353 - Raw decapsulation:
354
355   - The decapsulation is always done up to the outermost tunnel detected by the HW.
356   - The input buffer, providing the removal size, is not validated.
357   - The buffer size must match the length of the headers to be removed.
358
359 - ICMP(code/type/identifier/sequence number) / ICMP6(code/type) matching, IP-in-IP and MPLS flow matching are all
360   mutually exclusive features which cannot be supported together
361   (see :ref:`mlx5_firmware_config`).
362
363 - LRO:
364
365   - Requires DevX and DV flow to be enabled.
366   - KEEP_CRC offload cannot be supported with LRO.
367   - The first mbuf length, without head-room,  must be big enough to include the
368     TCP header (122B).
369   - Rx queue with LRO offload enabled, receiving a non-LRO packet, can forward
370     it with size limited to max LRO size, not to max RX packet length.
371   - LRO can be used with outer header of TCP packets of the standard format:
372         eth (with or without vlan) / ipv4 or ipv6 / tcp / payload
373
374     Other TCP packets (e.g. with MPLS label) received on Rx queue with LRO enabled, will be received with bad checksum.
375   - LRO packet aggregation is performed by HW only for packet size larger than
376     ``lro_min_mss_size``. This value is reported on device start, when debug
377     mode is enabled.
378
379 - CRC:
380
381   - ``RTE_ETH_RX_OFFLOAD_KEEP_CRC`` cannot be supported with decapsulation
382     for some NICs (such as ConnectX-6 Dx, ConnectX-6 Lx, and BlueField-2).
383     The capability bit ``scatter_fcs_w_decap_disable`` shows NIC support.
384
385 - TX mbuf fast free:
386
387   - fast free offload assumes the all mbufs being sent are originated from the
388     same memory pool and there is no any extra references to the mbufs (the
389     reference counter for each mbuf is equal 1 on tx_burst call). The latter
390     means there should be no any externally attached buffers in mbufs. It is
391     an application responsibility to provide the correct mbufs if the fast
392     free offload is engaged. The mlx5 PMD implicitly produces the mbufs with
393     externally attached buffers if MPRQ option is enabled, hence, the fast
394     free offload is neither supported nor advertised if there is MPRQ enabled.
395
396 - Sample flow:
397
398   - Supports ``RTE_FLOW_ACTION_TYPE_SAMPLE`` action only within NIC Rx and
399     E-Switch steering domain.
400   - For E-Switch Sampling flow with sample ratio > 1, additional actions are not
401     supported in the sample actions list.
402   - For ConnectX-5, the ``RTE_FLOW_ACTION_TYPE_SAMPLE`` is typically used as
403     first action in the E-Switch egress flow if with header modify or
404     encapsulation actions.
405   - For NIC Rx flow, supports ``MARK``, ``COUNT``, ``QUEUE``, ``RSS`` in the
406     sample actions list.
407   - For E-Switch mirroring flow, supports ``RAW ENCAP``, ``Port ID``,
408     ``VXLAN ENCAP``, ``NVGRE ENCAP`` in the sample actions list.
409
410 - Modify Field flow:
411
412   - Supports the 'set' operation only for ``RTE_FLOW_ACTION_TYPE_MODIFY_FIELD`` action.
413   - Modification of an arbitrary place in a packet via the special ``RTE_FLOW_FIELD_START`` Field ID is not supported.
414   - Modification of the 802.1Q Tag, VXLAN Network or GENEVE Network ID's is not supported.
415   - Encapsulation levels are not supported, can modify outermost header fields only.
416   - Offsets must be 32-bits aligned, cannot skip past the boundary of a field.
417
418 - IPv6 header item 'proto' field, indicating the next header protocol, should
419   not be set as extension header.
420   In case the next header is an extension header, it should not be specified in
421   IPv6 header item 'proto' field.
422   The last extension header item 'next header' field can specify the following
423   header protocol type.
424
425 - Hairpin:
426
427   - Hairpin between two ports could only manual binding and explicit Tx flow mode. For single port hairpin, all the combinations of auto/manual binding and explicit/implicit Tx flow mode could be supported.
428   - Hairpin in switchdev SR-IOV mode is not supported till now.
429
430 - Meter:
431
432   - All the meter colors with drop action will be counted only by the global drop statistics.
433   - Yellow detection is only supported with ASO metering.
434   - Red color must be with drop action.
435   - Meter statistics are supported only for drop case.
436   - A meter action created with pre-defined policy must be the last action in the flow except single case where the policy actions are:
437      - green: NULL or END.
438      - yellow: NULL or END.
439      - RED: DROP / END.
440   - The only supported meter policy actions:
441      - green: QUEUE, RSS, PORT_ID, REPRESENTED_PORT, JUMP, DROP, MARK and SET_TAG.
442      - yellow: QUEUE, RSS, PORT_ID, REPRESENTED_PORT, JUMP, DROP, MARK and SET_TAG.
443      - RED: must be DROP.
444   - Policy actions of RSS for green and yellow should have the same configuration except queues.
445   - Policy with RSS/queue action is not supported when ``dv_xmeta_en`` enabled.
446   - meter profile packet mode is supported.
447   - meter profiles of RFC2697, RFC2698 and RFC4115 are supported.
448
449 - Integrity:
450
451   - Integrity offload is enabled for **ConnectX-6** family.
452   - Verification bits provided by the hardware are ``l3_ok``, ``ipv4_csum_ok``, ``l4_ok``, ``l4_csum_ok``.
453   - ``level`` value 0 references outer headers.
454   - Multiple integrity items not supported in a single flow rule.
455   - Flow rule items supplied by application must explicitly specify network headers referred by integrity item.
456     For example, if integrity item mask sets ``l4_ok`` or ``l4_csum_ok`` bits, reference to L4 network header,
457     TCP or UDP, must be in the rule pattern as well::
458
459       flow create 0 ingress pattern integrity level is 0 value mask l3_ok value spec l3_ok / eth / ipv6 / end â€¦
460       or
461       flow create 0 ingress pattern integrity level is 0 value mask l4_ok value spec 0 / eth / ipv4 proto is udp / end â€¦
462
463 - Connection tracking:
464
465   - Cannot co-exist with ASO meter, ASO age action in a single flow rule.
466   - Flow rules insertion rate and memory consumption need more optimization.
467   - 256 ports maximum.
468   - 4M connections maximum.
469
470 - Multi-thread flow insertion:
471
472   - In order to achieve best insertion rate, application should manage the flows per lcore.
473   - Better to disable memory reclaim by setting ``reclaim_mem_mode`` to 0 to accelerate the flow object allocation and release with cache.
474
475 - HW hashed bonding
476
477   - TXQ affinity subjects to HW hash once enabled.
478
479 - Bonding under socket direct mode
480
481   - Needs OFED 5.4+.
482
483 Statistics
484 ----------
485
486 MLX5 supports various methods to report statistics:
487
488 Port statistics can be queried using ``rte_eth_stats_get()``. The received and sent statistics are through SW only and counts the number of packets received or sent successfully by the PMD. The imissed counter is the amount of packets that could not be delivered to SW because a queue was full. Packets not received due to congestion in the bus or on the NIC can be queried via the rx_discards_phy xstats counter.
489
490 Extended statistics can be queried using ``rte_eth_xstats_get()``. The extended statistics expose a wider set of counters counted by the device. The extended port statistics counts the number of packets received or sent successfully by the port. As Mellanox NICs are using the :ref:`Bifurcated Linux Driver <linux_gsg_linux_drivers>` those counters counts also packet received or sent by the Linux kernel. The counters with ``_phy`` suffix counts the total events on the physical port, therefore not valid for VF.
491
492 Finally per-flow statistics can by queried using ``rte_flow_query`` when attaching a count action for specific flow. The flow counter counts the number of packets received successfully by the port and match the specific flow.
493
494 Configuration
495 -------------
496
497 Compilation options
498 ~~~~~~~~~~~~~~~~~~~
499
500 The ibverbs libraries can be linked with this PMD in a number of ways,
501 configured by the ``ibverbs_link`` build option:
502
503 - ``shared`` (default): the PMD depends on some .so files.
504
505 - ``dlopen``: Split the dependencies glue in a separate library
506   loaded when needed by dlopen.
507   It make dependencies on libibverbs and libmlx4 optional,
508   and has no performance impact.
509
510 - ``static``: Embed static flavor of the dependencies libibverbs and libmlx4
511   in the PMD shared library or the executable static binary.
512
513 Environment variables
514 ~~~~~~~~~~~~~~~~~~~~~
515
516 - ``MLX5_GLUE_PATH``
517
518   A list of directories in which to search for the rdma-core "glue" plug-in,
519   separated by colons or semi-colons.
520
521 - ``MLX5_SHUT_UP_BF``
522
523   Configures HW Tx doorbell register as IO-mapped.
524
525   By default, the HW Tx doorbell is configured as a write-combining register.
526   The register would be flushed to HW usually when the write-combining buffer
527   becomes full, but it depends on CPU design.
528
529   Except for vectorized Tx burst routines, a write memory barrier is enforced
530   after updating the register so that the update can be immediately visible to
531   HW.
532
533   When vectorized Tx burst is called, the barrier is set only if the burst size
534   is not aligned to MLX5_VPMD_TX_MAX_BURST. However, setting this environmental
535   variable will bring better latency even though the maximum throughput can
536   slightly decline.
537
538 Run-time configuration
539 ~~~~~~~~~~~~~~~~~~~~~~
540
541 - librte_net_mlx5 brings kernel network interfaces up during initialization
542   because it is affected by their state. Forcing them down prevents packets
543   reception.
544
545 - **ethtool** operations on related kernel interfaces also affect the PMD.
546
547 Run as non-root
548 ^^^^^^^^^^^^^^^
549
550 In order to run as a non-root user,
551 some capabilities must be granted to the application::
552
553    setcap cap_sys_admin,cap_net_admin,cap_net_raw,cap_ipc_lock+ep <dpdk-app>
554
555 Below are the reasons of the need for each capability:
556
557 ``cap_sys_admin``
558    When using physical addresses (PA mode), with Linux >= 4.0,
559    for access to ``/proc/self/pagemap``.
560
561 ``cap_net_admin``
562    For device configuration.
563
564 ``cap_net_raw``
565    For raw ethernet queue allocation through kernel driver.
566
567 ``cap_ipc_lock``
568    For DMA memory pinning.
569
570 Driver options
571 ^^^^^^^^^^^^^^
572
573 - ``rxq_cqe_comp_en`` parameter [int]
574
575   A nonzero value enables the compression of CQE on RX side. This feature
576   allows to save PCI bandwidth and improve performance. Enabled by default.
577   Different compression formats are supported in order to achieve the best
578   performance for different traffic patterns. Default format depends on
579   Multi-Packet Rx queue configuration: Hash RSS format is used in case
580   MPRQ is disabled, Checksum format is used in case MPRQ is enabled.
581
582   Specifying 2 as a ``rxq_cqe_comp_en`` value selects Flow Tag format for
583   better compression rate in case of RTE Flow Mark traffic.
584   Specifying 3 as a ``rxq_cqe_comp_en`` value selects Checksum format.
585   Specifying 4 as a ``rxq_cqe_comp_en`` value selects L3/L4 Header format for
586   better compression rate in case of mixed TCP/UDP and IPv4/IPv6 traffic.
587   CQE compression format selection requires DevX to be enabled. If there is
588   no DevX enabled/supported the value is reset to 1 by default.
589
590   Supported on:
591
592   - x86_64 with ConnectX-4, ConnectX-4 Lx, ConnectX-5, ConnectX-6, ConnectX-6 Dx,
593     ConnectX-6 Lx, BlueField and BlueField-2.
594   - POWER9 and ARMv8 with ConnectX-4 Lx, ConnectX-5, ConnectX-6, ConnectX-6 Dx,
595     ConnectX-6 Lx, BlueField and BlueField-2.
596
597 - ``rxq_pkt_pad_en`` parameter [int]
598
599   A nonzero value enables padding Rx packet to the size of cacheline on PCI
600   transaction. This feature would waste PCI bandwidth but could improve
601   performance by avoiding partial cacheline write which may cause costly
602   read-modify-copy in memory transaction on some architectures. Disabled by
603   default.
604
605   Supported on:
606
607   - x86_64 with ConnectX-4, ConnectX-4 Lx, ConnectX-5, ConnectX-6, ConnectX-6 Dx,
608     ConnectX-6 Lx, BlueField and BlueField-2.
609   - POWER8 and ARMv8 with ConnectX-4 Lx, ConnectX-5, ConnectX-6, ConnectX-6 Dx,
610     ConnectX-6 Lx, BlueField and BlueField-2.
611
612 - ``delay_drop`` parameter [int]
613
614   Bitmask value for the Rx queue delay drop attribute. Bit 0 is used for the
615   standard Rx queue and bit 1 is used for the hairpin Rx queue. By default, the
616   delay drop is disabled for all Rx queues. It will be ignored if the port does
617   not support the attribute even if it is enabled explicitly.
618
619   The packets being received will not be dropped immediately when the WQEs are
620   exhausted in a Rx queue with delay drop enabled.
621
622 - ``mprq_en`` parameter [int]
623
624   A nonzero value enables configuring Multi-Packet Rx queues. Rx queue is
625   configured as Multi-Packet RQ if the total number of Rx queues is
626   ``rxqs_min_mprq`` or more. Disabled by default.
627
628   Multi-Packet Rx Queue (MPRQ a.k.a Striding RQ) can further save PCIe bandwidth
629   by posting a single large buffer for multiple packets. Instead of posting a
630   buffers per a packet, one large buffer is posted in order to receive multiple
631   packets on the buffer. A MPRQ buffer consists of multiple fixed-size strides
632   and each stride receives one packet. MPRQ can improve throughput for
633   small-packet traffic.
634
635   When MPRQ is enabled, MTU can be larger than the size of
636   user-provided mbuf even if RTE_ETH_RX_OFFLOAD_SCATTER isn't enabled. PMD will
637   configure large stride size enough to accommodate MTU as long as
638   device allows. Note that this can waste system memory compared to enabling Rx
639   scatter and multi-segment packet.
640
641 - ``mprq_log_stride_num`` parameter [int]
642
643   Log 2 of the number of strides for Multi-Packet Rx queue. Configuring more
644   strides can reduce PCIe traffic further. If configured value is not in the
645   range of device capability, the default value will be set with a warning
646   message. The default value is 4 which is 16 strides per a buffer, valid only
647   if ``mprq_en`` is set.
648
649   The size of Rx queue should be bigger than the number of strides.
650
651 - ``mprq_log_stride_size`` parameter [int]
652
653   Log 2 of the size of a stride for Multi-Packet Rx queue. Configuring a smaller
654   stride size can save some memory and reduce probability of a depletion of all
655   available strides due to unreleased packets by an application. If configured
656   value is not in the range of device capability, the default value will be set
657   with a warning message. The default value is 11 which is 2048 bytes per a
658   stride, valid only if ``mprq_en`` is set. With ``mprq_log_stride_size`` set
659   it is possible for a packet to span across multiple strides. This mode allows
660   support of jumbo frames (9K) with MPRQ. The memcopy of some packets (or part
661   of a packet if Rx scatter is configured) may be required in case there is no
662   space left for a head room at the end of a stride which incurs some
663   performance penalty.
664
665 - ``mprq_max_memcpy_len`` parameter [int]
666
667   The maximum length of packet to memcpy in case of Multi-Packet Rx queue. Rx
668   packet is mem-copied to a user-provided mbuf if the size of Rx packet is less
669   than or equal to this parameter. Otherwise, PMD will attach the Rx packet to
670   the mbuf by external buffer attachment - ``rte_pktmbuf_attach_extbuf()``.
671   A mempool for external buffers will be allocated and managed by PMD. If Rx
672   packet is externally attached, ol_flags field of the mbuf will have
673   RTE_MBUF_F_EXTERNAL and this flag must be preserved. ``RTE_MBUF_HAS_EXTBUF()``
674   checks the flag. The default value is 128, valid only if ``mprq_en`` is set.
675
676 - ``rxqs_min_mprq`` parameter [int]
677
678   Configure Rx queues as Multi-Packet RQ if the total number of Rx queues is
679   greater or equal to this value. The default value is 12, valid only if
680   ``mprq_en`` is set.
681
682 - ``txq_inline`` parameter [int]
683
684   Amount of data to be inlined during TX operations. This parameter is
685   deprecated and converted to the new parameter ``txq_inline_max`` providing
686   partial compatibility.
687
688 - ``txqs_min_inline`` parameter [int]
689
690   Enable inline data send only when the number of TX queues is greater or equal
691   to this value.
692
693   This option should be used in combination with ``txq_inline_max`` and
694   ``txq_inline_mpw`` below and does not affect ``txq_inline_min`` settings above.
695
696   If this option is not specified the default value 16 is used for BlueField
697   and 8 for other platforms
698
699   The data inlining consumes the CPU cycles, so this option is intended to
700   auto enable inline data if we have enough Tx queues, which means we have
701   enough CPU cores and PCI bandwidth is getting more critical and CPU
702   is not supposed to be bottleneck anymore.
703
704   The copying data into WQE improves latency and can improve PPS performance
705   when PCI back pressure is detected and may be useful for scenarios involving
706   heavy traffic on many queues.
707
708   Because additional software logic is necessary to handle this mode, this
709   option should be used with care, as it may lower performance when back
710   pressure is not expected.
711
712   If inline data are enabled it may affect the maximal size of Tx queue in
713   descriptors because the inline data increase the descriptor size and
714   queue size limits supported by hardware may be exceeded.
715
716 - ``txq_inline_min`` parameter [int]
717
718   Minimal amount of data to be inlined into WQE during Tx operations. NICs
719   may require this minimal data amount to operate correctly. The exact value
720   may depend on NIC operation mode, requested offloads, etc. It is strongly
721   recommended to omit this parameter and use the default values. Anyway,
722   applications using this parameter should take into consideration that
723   specifying an inconsistent value may prevent the NIC from sending packets.
724
725   If ``txq_inline_min`` key is present the specified value (may be aligned
726   by the driver in order not to exceed the limits and provide better descriptor
727   space utilization) will be used by the driver and it is guaranteed that
728   requested amount of data bytes are inlined into the WQE beside other inline
729   settings. This key also may update ``txq_inline_max`` value (default
730   or specified explicitly in devargs) to reserve the space for inline data.
731
732   If ``txq_inline_min`` key is not present, the value may be queried by the
733   driver from the NIC via DevX if this feature is available. If there is no DevX
734   enabled/supported the value 18 (supposing L2 header including VLAN) is set
735   for ConnectX-4 and ConnectX-4 Lx, and 0 is set by default for ConnectX-5
736   and newer NICs. If packet is shorter the ``txq_inline_min`` value, the entire
737   packet is inlined.
738
739   For ConnectX-4 NIC, driver does not allow specifying value below 18
740   (minimal L2 header, including VLAN), error will be raised.
741
742   For ConnectX-4 Lx NIC, it is allowed to specify values below 18, but
743   it is not recommended and may prevent NIC from sending packets over
744   some configurations.
745
746   For ConnectX-4 and ConnectX-4 Lx NICs, automatically configured value
747   is insufficient for some traffic, because they require at least all L2 headers
748   to be inlined. For example, Q-in-Q adds 4 bytes to default 18 bytes
749   of Ethernet and VLAN, thus ``txq_inline_min`` must be set to 22.
750   MPLS would add 4 bytes per label. Final value must account for all possible
751   L2 encapsulation headers used in particular environment.
752
753   Please, note, this minimal data inlining disengages eMPW feature (Enhanced
754   Multi-Packet Write), because last one does not support partial packet inlining.
755   This is not very critical due to minimal data inlining is mostly required
756   by ConnectX-4 and ConnectX-4 Lx, these NICs do not support eMPW feature.
757
758 - ``txq_inline_max`` parameter [int]
759
760   Specifies the maximal packet length to be completely inlined into WQE
761   Ethernet Segment for ordinary SEND method. If packet is larger than specified
762   value, the packet data won't be copied by the driver at all, data buffer
763   is addressed with a pointer. If packet length is less or equal all packet
764   data will be copied into WQE. This may improve PCI bandwidth utilization for
765   short packets significantly but requires the extra CPU cycles.
766
767   The data inline feature is controlled by number of Tx queues, if number of Tx
768   queues is larger than ``txqs_min_inline`` key parameter, the inline feature
769   is engaged, if there are not enough Tx queues (which means not enough CPU cores
770   and CPU resources are scarce), data inline is not performed by the driver.
771   Assigning ``txqs_min_inline`` with zero always enables the data inline.
772
773   The default ``txq_inline_max`` value is 290. The specified value may be adjusted
774   by the driver in order not to exceed the limit (930 bytes) and to provide better
775   WQE space filling without gaps, the adjustment is reflected in the debug log.
776   Also, the default value (290) may be decreased in run-time if the large transmit
777   queue size is requested and hardware does not support enough descriptor
778   amount, in this case warning is emitted. If ``txq_inline_max`` key is
779   specified and requested inline settings can not be satisfied then error
780   will be raised.
781
782 - ``txq_inline_mpw`` parameter [int]
783
784   Specifies the maximal packet length to be completely inlined into WQE for
785   Enhanced MPW method. If packet is large the specified value, the packet data
786   won't be copied, and data buffer is addressed with pointer. If packet length
787   is less or equal, all packet data will be copied into WQE. This may improve PCI
788   bandwidth utilization for short packets significantly but requires the extra
789   CPU cycles.
790
791   The data inline feature is controlled by number of TX queues, if number of Tx
792   queues is larger than ``txqs_min_inline`` key parameter, the inline feature
793   is engaged, if there are not enough Tx queues (which means not enough CPU cores
794   and CPU resources are scarce), data inline is not performed by the driver.
795   Assigning ``txqs_min_inline`` with zero always enables the data inline.
796
797   The default ``txq_inline_mpw`` value is 268. The specified value may be adjusted
798   by the driver in order not to exceed the limit (930 bytes) and to provide better
799   WQE space filling without gaps, the adjustment is reflected in the debug log.
800   Due to multiple packets may be included to the same WQE with Enhanced Multi
801   Packet Write Method and overall WQE size is limited it is not recommended to
802   specify large values for the ``txq_inline_mpw``. Also, the default value (268)
803   may be decreased in run-time if the large transmit queue size is requested
804   and hardware does not support enough descriptor amount, in this case warning
805   is emitted. If ``txq_inline_mpw`` key is  specified and requested inline
806   settings can not be satisfied then error will be raised.
807
808 - ``txqs_max_vec`` parameter [int]
809
810   Enable vectorized Tx only when the number of TX queues is less than or
811   equal to this value. This parameter is deprecated and ignored, kept
812   for compatibility issue to not prevent driver from probing.
813
814 - ``txq_mpw_hdr_dseg_en`` parameter [int]
815
816   A nonzero value enables including two pointers in the first block of TX
817   descriptor. The parameter is deprecated and ignored, kept for compatibility
818   issue.
819
820 - ``txq_max_inline_len`` parameter [int]
821
822   Maximum size of packet to be inlined. This limits the size of packet to
823   be inlined. If the size of a packet is larger than configured value, the
824   packet isn't inlined even though there's enough space remained in the
825   descriptor. Instead, the packet is included with pointer. This parameter
826   is deprecated and converted directly to ``txq_inline_mpw`` providing full
827   compatibility. Valid only if eMPW feature is engaged.
828
829 - ``txq_mpw_en`` parameter [int]
830
831   A nonzero value enables Enhanced Multi-Packet Write (eMPW) for ConnectX-5,
832   ConnectX-6, ConnectX-6 Dx, ConnectX-6 Lx, BlueField, BlueField-2.
833   eMPW allows the Tx burst function to pack up multiple packets
834   in a single descriptor session in order to save PCI bandwidth
835   and improve performance at the cost of a slightly higher CPU usage.
836   When ``txq_inline_mpw`` is set along with ``txq_mpw_en``,
837   Tx burst function copies entire packet data on to Tx descriptor
838   instead of including pointer of packet.
839
840   The Enhanced Multi-Packet Write feature is enabled by default if NIC supports
841   it, can be disabled by explicit specifying 0 value for ``txq_mpw_en`` option.
842   Also, if minimal data inlining is requested by non-zero ``txq_inline_min``
843   option or reported by the NIC, the eMPW feature is disengaged.
844
845 - ``tx_db_nc`` parameter [int]
846
847   The rdma core library can map doorbell register in two ways, depending on the
848   environment variable "MLX5_SHUT_UP_BF":
849
850   - As regular cached memory (usually with write combining attribute), if the
851     variable is either missing or set to zero.
852   - As non-cached memory, if the variable is present and set to not "0" value.
853
854   The type of mapping may slightly affect the Tx performance, the optimal choice
855   is strongly relied on the host architecture and should be deduced practically.
856
857   If ``tx_db_nc`` is set to zero, the doorbell is forced to be mapped to regular
858   memory (with write combining), the PMD will perform the extra write memory barrier
859   after writing to doorbell, it might increase the needed CPU clocks per packet
860   to send, but latency might be improved.
861
862   If ``tx_db_nc`` is set to one, the doorbell is forced to be mapped to non
863   cached memory, the PMD will not perform the extra write memory barrier
864   after writing to doorbell, on some architectures it might improve the
865   performance.
866
867   If ``tx_db_nc`` is set to two, the doorbell is forced to be mapped to regular
868   memory, the PMD will use heuristics to decide whether write memory barrier
869   should be performed. For bursts with size multiple of recommended one (64 pkts)
870   it is supposed the next burst is coming and no need to issue the extra memory
871   barrier (it is supposed to be issued in the next coming burst, at least after
872   descriptor writing). It might increase latency (on some hosts till next
873   packets transmit) and should be used with care.
874
875   If ``tx_db_nc`` is omitted or set to zero, the preset (if any) environment
876   variable "MLX5_SHUT_UP_BF" value is used. If there is no "MLX5_SHUT_UP_BF",
877   the default ``tx_db_nc`` value is zero for ARM64 hosts and one for others.
878
879 - ``tx_pp`` parameter [int]
880
881   If a nonzero value is specified the driver creates all necessary internal
882   objects to provide accurate packet send scheduling on mbuf timestamps.
883   The positive value specifies the scheduling granularity in nanoseconds,
884   the packet send will be accurate up to specified digits. The allowed range is
885   from 500 to 1 million of nanoseconds. The negative value specifies the module
886   of granularity and engages the special test mode the check the schedule rate.
887   By default (if the ``tx_pp`` is not specified) send scheduling on timestamps
888   feature is disabled.
889
890 - ``tx_skew`` parameter [int]
891
892   The parameter adjusts the send packet scheduling on timestamps and represents
893   the average delay between beginning of the transmitting descriptor processing
894   by the hardware and appearance of actual packet data on the wire. The value
895   should be provided in nanoseconds and is valid only if ``tx_pp`` parameter is
896   specified. The default value is zero.
897
898 - ``tx_vec_en`` parameter [int]
899
900   A nonzero value enables Tx vector on ConnectX-5, ConnectX-6, ConnectX-6 Dx,
901   ConnectX-6 Lx, BlueField and BlueField-2 NICs
902   if the number of global Tx queues on the port is less than ``txqs_max_vec``.
903   The parameter is deprecated and ignored.
904
905 - ``rx_vec_en`` parameter [int]
906
907   A nonzero value enables Rx vector if the port is not configured in
908   multi-segment otherwise this parameter is ignored.
909
910   Enabled by default.
911
912 - ``vf_nl_en`` parameter [int]
913
914   A nonzero value enables Netlink requests from the VF to add/remove MAC
915   addresses or/and enable/disable promiscuous/all multicast on the Netdevice.
916   Otherwise the relevant configuration must be run with Linux iproute2 tools.
917   This is a prerequisite to receive this kind of traffic.
918
919   Enabled by default, valid only on VF devices ignored otherwise.
920
921 - ``l3_vxlan_en`` parameter [int]
922
923   A nonzero value allows L3 VXLAN and VXLAN-GPE flow creation. To enable
924   L3 VXLAN or VXLAN-GPE, users has to configure firmware and enable this
925   parameter. This is a prerequisite to receive this kind of traffic.
926
927   Disabled by default.
928
929 - ``dv_xmeta_en`` parameter [int]
930
931   A nonzero value enables extensive flow metadata support if device is
932   capable and driver supports it. This can enable extensive support of
933   ``MARK`` and ``META`` item of ``rte_flow``. The newly introduced
934   ``SET_TAG`` and ``SET_META`` actions do not depend on ``dv_xmeta_en``.
935
936   There are some possible configurations, depending on parameter value:
937
938   - 0, this is default value, defines the legacy mode, the ``MARK`` and
939     ``META`` related actions and items operate only within NIC Tx and
940     NIC Rx steering domains, no ``MARK`` and ``META`` information crosses
941     the domain boundaries. The ``MARK`` item is 24 bits wide, the ``META``
942     item is 32 bits wide and match supported on egress only.
943
944   - 1, this engages extensive metadata mode, the ``MARK`` and ``META``
945     related actions and items operate within all supported steering domains,
946     including FDB, ``MARK`` and ``META`` information may cross the domain
947     boundaries. The ``MARK`` item is 24 bits wide, the ``META`` item width
948     depends on kernel and firmware configurations and might be 0, 16 or
949     32 bits. Within NIC Tx domain ``META`` data width is 32 bits for
950     compatibility, the actual width of data transferred to the FDB domain
951     depends on kernel configuration and may be vary. The actual supported
952     width can be retrieved in runtime by series of rte_flow_validate()
953     trials.
954
955   - 2, this engages extensive metadata mode, the ``MARK`` and ``META``
956     related actions and items operate within all supported steering domains,
957     including FDB, ``MARK`` and ``META`` information may cross the domain
958     boundaries. The ``META`` item is 32 bits wide, the ``MARK`` item width
959     depends on kernel and firmware configurations and might be 0, 16 or
960     24 bits. The actual supported width can be retrieved in runtime by
961     series of rte_flow_validate() trials.
962
963   - 3, this engages tunnel offload mode. In E-Switch configuration, that
964     mode implicitly activates ``dv_xmeta_en=1``.
965
966   +------+-----------+-----------+-------------+-------------+
967   | Mode | ``MARK``  | ``META``  | ``META`` Tx | FDB/Through |
968   +======+===========+===========+=============+=============+
969   | 0    | 24 bits   | 32 bits   | 32 bits     | no          |
970   +------+-----------+-----------+-------------+-------------+
971   | 1    | 24 bits   | vary 0-32 | 32 bits     | yes         |
972   +------+-----------+-----------+-------------+-------------+
973   | 2    | vary 0-24 | 32 bits   | 32 bits     | yes         |
974   +------+-----------+-----------+-------------+-------------+
975
976   If there is no E-Switch configuration the ``dv_xmeta_en`` parameter is
977   ignored and the device is configured to operate in legacy mode (0).
978
979   Disabled by default (set to 0).
980
981   The Direct Verbs/Rules (engaged with ``dv_flow_en`` = 1) supports all
982   of the extensive metadata features. The legacy Verbs supports FLAG and
983   MARK metadata actions over NIC Rx steering domain only.
984
985   Setting META value to zero in flow action means there is no item provided
986   and receiving datapath will not report in mbufs the metadata are present.
987   Setting MARK value to zero in flow action means the zero FDIR ID value
988   will be reported on packet receiving.
989
990   For the MARK action the last 16 values in the full range are reserved for
991   internal PMD purposes (to emulate FLAG action). The valid range for the
992   MARK action values is 0-0xFFEF for the 16-bit mode and 0-xFFFFEF
993   for the 24-bit mode, the flows with the MARK action value outside
994   the specified range will be rejected.
995
996 - ``dv_flow_en`` parameter [int]
997
998   A nonzero value enables the DV flow steering assuming it is supported
999   by the driver (RDMA Core library version is rdma-core-24.0 or higher).
1000
1001   Enabled by default if supported.
1002
1003 - ``dv_esw_en`` parameter [int]
1004
1005   A nonzero value enables E-Switch using Direct Rules.
1006
1007   Enabled by default if supported.
1008
1009 - ``lacp_by_user`` parameter [int]
1010
1011   A nonzero value enables the control of LACP traffic by the user application.
1012   When a bond exists in the driver, by default it should be managed by the
1013   kernel and therefore LACP traffic should be steered to the kernel.
1014   If this devarg is set to 1 it will allow the user to manage the bond by
1015   itself and not steer LACP traffic to the kernel.
1016
1017   Disabled by default (set to 0).
1018
1019 - ``mr_ext_memseg_en`` parameter [int]
1020
1021   A nonzero value enables extending memseg when registering DMA memory. If
1022   enabled, the number of entries in MR (Memory Region) lookup table on datapath
1023   is minimized and it benefits performance. On the other hand, it worsens memory
1024   utilization because registered memory is pinned by kernel driver. Even if a
1025   page in the extended chunk is freed, that doesn't become reusable until the
1026   entire memory is freed.
1027
1028   Enabled by default.
1029
1030 - ``mr_mempool_reg_en`` parameter [int]
1031
1032   A nonzero value enables implicit registration of DMA memory of all mempools
1033   except those having ``RTE_MEMPOOL_F_NON_IO``. This flag is set automatically
1034   for mempools populated with non-contiguous objects or those without IOVA.
1035   The effect is that when a packet from a mempool is transmitted,
1036   its memory is already registered for DMA in the PMD and no registration
1037   will happen on the data path. The tradeoff is extra work on the creation
1038   of each mempool and increased HW resource use if some mempools
1039   are not used with MLX5 devices.
1040
1041   Enabled by default.
1042
1043 - ``representor`` parameter [list]
1044
1045   This parameter can be used to instantiate DPDK Ethernet devices from
1046   existing port (PF, VF or SF) representors configured on the device.
1047
1048   It is a standard parameter whose format is described in
1049   :ref:`ethernet_device_standard_device_arguments`.
1050
1051   For instance, to probe VF port representors 0 through 2::
1052
1053     <PCI_BDF>,representor=vf[0-2]
1054
1055   To probe SF port representors 0 through 2::
1056
1057     <PCI_BDF>,representor=sf[0-2]
1058
1059   To probe VF port representors 0 through 2 on both PFs of bonding device::
1060
1061     <Primary_PCI_BDF>,representor=pf[0,1]vf[0-2]
1062
1063 - ``max_dump_files_num`` parameter [int]
1064
1065   The maximum number of files per PMD entity that may be created for debug information.
1066   The files will be created in /var/log directory or in current directory.
1067
1068   set to 128 by default.
1069
1070 - ``lro_timeout_usec`` parameter [int]
1071
1072   The maximum allowed duration of an LRO session, in micro-seconds.
1073   PMD will set the nearest value supported by HW, which is not bigger than
1074   the input ``lro_timeout_usec`` value.
1075   If this parameter is not specified, by default PMD will set
1076   the smallest value supported by HW.
1077
1078 - ``hp_buf_log_sz`` parameter [int]
1079
1080   The total data buffer size of a hairpin queue (logarithmic form), in bytes.
1081   PMD will set the data buffer size to 2 ** ``hp_buf_log_sz``, both for RX & TX.
1082   The capacity of the value is specified by the firmware and the initialization
1083   will get a failure if it is out of scope.
1084   The range of the value is from 11 to 19 right now, and the supported frame
1085   size of a single packet for hairpin is from 512B to 128KB. It might change if
1086   different firmware release is being used. By using a small value, it could
1087   reduce memory consumption but not work with a large frame. If the value is
1088   too large, the memory consumption will be high and some potential performance
1089   degradation will be introduced.
1090   By default, the PMD will set this value to 16, which means that 9KB jumbo
1091   frames will be supported.
1092
1093 - ``reclaim_mem_mode`` parameter [int]
1094
1095   Cache some resources in flow destroy will help flow recreation more efficient.
1096   While some systems may require the all the resources can be reclaimed after
1097   flow destroyed.
1098   The parameter ``reclaim_mem_mode`` provides the option for user to configure
1099   if the resource cache is needed or not.
1100
1101   There are three options to choose:
1102
1103   - 0. It means the flow resources will be cached as usual. The resources will
1104     be cached, helpful with flow insertion rate.
1105
1106   - 1. It will only enable the DPDK PMD level resources reclaim.
1107
1108   - 2. Both DPDK PMD level and rdma-core low level will be configured as
1109     reclaimed mode.
1110
1111   By default, the PMD will set this value to 0.
1112
1113 - ``sys_mem_en`` parameter [int]
1114
1115   A non-zero value enables the PMD memory management allocating memory
1116   from system by default, without explicit rte memory flag.
1117
1118   By default, the PMD will set this value to 0.
1119
1120 - ``decap_en`` parameter [int]
1121
1122   Some devices do not support FCS (frame checksum) scattering for
1123   tunnel-decapsulated packets.
1124   If set to 0, this option forces the FCS feature and rejects tunnel
1125   decapsulation in the flow engine for such devices.
1126
1127   By default, the PMD will set this value to 1.
1128
1129 - ``allow_duplicate_pattern`` parameter [int]
1130
1131   There are two options to choose:
1132
1133   - 0. Prevent insertion of rules with the same pattern items on non-root table.
1134     In this case, only the first rule is inserted and the following rules are
1135     rejected and error code EEXIST is returned.
1136
1137   - 1. Allow insertion of rules with the same pattern items.
1138     In this case, all rules are inserted but only the first rule takes effect,
1139     the next rule takes effect only if the previous rules are deleted.
1140
1141   By default, the PMD will set this value to 1.
1142
1143 .. _mlx5_firmware_config:
1144
1145 Firmware configuration
1146 ~~~~~~~~~~~~~~~~~~~~~~
1147
1148 Firmware features can be configured as key/value pairs.
1149
1150 The command to set a value is::
1151
1152   mlxconfig -d <device> set <key>=<value>
1153
1154 The command to query a value is::
1155
1156   mlxconfig -d <device> query | grep <key>
1157
1158 The device name for the command ``mlxconfig`` can be either the PCI address,
1159 or the mst device name found with::
1160
1161   mst status
1162
1163 Below are some firmware configurations listed.
1164
1165 - link type::
1166
1167     LINK_TYPE_P1
1168     LINK_TYPE_P2
1169     value: 1=Infiniband 2=Ethernet 3=VPI(auto-sense)
1170
1171 - enable SR-IOV::
1172
1173     SRIOV_EN=1
1174
1175 - maximum number of SR-IOV virtual functions::
1176
1177     NUM_OF_VFS=<max>
1178
1179 - enable DevX (required by Direct Rules and other features)::
1180
1181     UCTX_EN=1
1182
1183 - aggressive CQE zipping::
1184
1185     CQE_COMPRESSION=1
1186
1187 - L3 VXLAN and VXLAN-GPE destination UDP port::
1188
1189     IP_OVER_VXLAN_EN=1
1190     IP_OVER_VXLAN_PORT=<udp dport>
1191
1192 - enable VXLAN-GPE tunnel flow matching::
1193
1194     FLEX_PARSER_PROFILE_ENABLE=0
1195     or
1196     FLEX_PARSER_PROFILE_ENABLE=2
1197
1198 - enable IP-in-IP tunnel flow matching::
1199
1200     FLEX_PARSER_PROFILE_ENABLE=0
1201
1202 - enable MPLS flow matching::
1203
1204     FLEX_PARSER_PROFILE_ENABLE=1
1205
1206 - enable ICMP(code/type/identifier/sequence number) / ICMP6(code/type) fields matching::
1207
1208     FLEX_PARSER_PROFILE_ENABLE=2
1209
1210 - enable Geneve flow matching::
1211
1212    FLEX_PARSER_PROFILE_ENABLE=0
1213    or
1214    FLEX_PARSER_PROFILE_ENABLE=1
1215
1216 - enable Geneve TLV option flow matching::
1217
1218    FLEX_PARSER_PROFILE_ENABLE=0
1219
1220 - enable GTP flow matching::
1221
1222    FLEX_PARSER_PROFILE_ENABLE=3
1223
1224 - enable eCPRI flow matching::
1225
1226    FLEX_PARSER_PROFILE_ENABLE=4
1227    PROG_PARSE_GRAPH=1
1228
1229 Linux Prerequisites
1230 -------------------
1231
1232 This driver relies on external libraries and kernel drivers for resources
1233 allocations and initialization. The following dependencies are not part of
1234 DPDK and must be installed separately:
1235
1236 - **libibverbs**
1237
1238   User space Verbs framework used by librte_net_mlx5. This library provides
1239   a generic interface between the kernel and low-level user space drivers
1240   such as libmlx5.
1241
1242   It allows slow and privileged operations (context initialization, hardware
1243   resources allocations) to be managed by the kernel and fast operations to
1244   never leave user space.
1245
1246 - **libmlx5**
1247
1248   Low-level user space driver library for Mellanox
1249   ConnectX-4/ConnectX-5/ConnectX-6/BlueField devices, it is automatically loaded
1250   by libibverbs.
1251
1252   This library basically implements send/receive calls to the hardware
1253   queues.
1254
1255 - **Kernel modules**
1256
1257   They provide the kernel-side Verbs API and low level device drivers that
1258   manage actual hardware initialization and resources sharing with user
1259   space processes.
1260
1261   Unlike most other PMDs, these modules must remain loaded and bound to
1262   their devices:
1263
1264   - mlx5_core: hardware driver managing Mellanox
1265     ConnectX-4/ConnectX-5/ConnectX-6/BlueField devices and related Ethernet kernel
1266     network devices.
1267   - mlx5_ib: InifiniBand device driver.
1268   - ib_uverbs: user space driver for Verbs (entry point for libibverbs).
1269
1270 - **Firmware update**
1271
1272   Mellanox OFED/EN releases include firmware updates for
1273   ConnectX-4/ConnectX-5/ConnectX-6/BlueField adapters.
1274
1275   Because each release provides new features, these updates must be applied to
1276   match the kernel modules and libraries they come with.
1277
1278 .. note::
1279
1280    Both libraries are BSD and GPL licensed. Linux kernel modules are GPL
1281    licensed.
1282
1283 Installation
1284 ~~~~~~~~~~~~
1285
1286 Either RDMA Core library with a recent enough Linux kernel release
1287 (recommended) or Mellanox OFED/EN, which provides compatibility with older
1288 releases.
1289
1290 RDMA Core with Linux Kernel
1291 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1292
1293 - Minimal kernel version : v4.14 or the most recent 4.14-rc (see `Linux installation documentation`_)
1294 - Minimal rdma-core version: v15+ commit 0c5f5765213a ("Merge pull request #227 from yishaih/tm")
1295   (see `RDMA Core installation documentation`_)
1296 - When building for i686 use:
1297
1298   - rdma-core version 18.0 or above built with 32bit support.
1299   - Kernel version 4.14.41 or above.
1300
1301 - Starting with rdma-core v21, static libraries can be built::
1302
1303     cd build
1304     CFLAGS=-fPIC cmake -DIN_PLACE=1 -DENABLE_STATIC=1 -GNinja ..
1305     ninja
1306
1307 .. _`Linux installation documentation`: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/plain/Documentation/admin-guide/README.rst
1308 .. _`RDMA Core installation documentation`: https://raw.githubusercontent.com/linux-rdma/rdma-core/master/README.md
1309
1310
1311 Mellanox OFED/EN
1312 ^^^^^^^^^^^^^^^^
1313
1314 - Mellanox OFED version: **4.5** and above /
1315   Mellanox EN version: **4.5** and above
1316 - firmware version:
1317
1318   - ConnectX-4: **12.21.1000** and above.
1319   - ConnectX-4 Lx: **14.21.1000** and above.
1320   - ConnectX-5: **16.21.1000** and above.
1321   - ConnectX-5 Ex: **16.21.1000** and above.
1322   - ConnectX-6: **20.27.0090** and above.
1323   - ConnectX-6 Dx: **22.27.0090** and above.
1324   - BlueField: **18.25.1010** and above.
1325
1326 While these libraries and kernel modules are available on OpenFabrics
1327 Alliance's `website <https://www.openfabrics.org/>`__ and provided by package
1328 managers on most distributions, this PMD requires Ethernet extensions that
1329 may not be supported at the moment (this is a work in progress).
1330
1331 `Mellanox OFED
1332 <http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux>`__ and
1333 `Mellanox EN
1334 <http://www.mellanox.com/page/products_dyn?product_family=27&mtag=linux>`__
1335 include the necessary support and should be used in the meantime. For DPDK,
1336 only libibverbs, libmlx5, mlnx-ofed-kernel packages and firmware updates are
1337 required from that distribution.
1338
1339 .. note::
1340
1341    Several versions of Mellanox OFED/EN are available. Installing the version
1342    this DPDK release was developed and tested against is strongly
1343    recommended. Please check the `linux prerequisites`_.
1344
1345 Windows Prerequisites
1346 ---------------------
1347
1348 This driver relies on external libraries and kernel drivers for resources
1349 allocations and initialization. The dependencies in the following sub-sections
1350 are not part of DPDK, and must be installed separately.
1351
1352 Compilation Prerequisites
1353 ~~~~~~~~~~~~~~~~~~~~~~~~~
1354
1355 DevX SDK installation
1356 ^^^^^^^^^^^^^^^^^^^^^
1357
1358 The DevX SDK must be installed on the machine building the Windows PMD.
1359 Additional information can be found at
1360 `How to Integrate Windows DevX in Your Development Environment
1361 <https://docs.mellanox.com/display/winof2v250/RShim+Drivers+and+Usage#RShimDriversandUsage-DevXInterface>`__.
1362
1363 Runtime Prerequisites
1364 ~~~~~~~~~~~~~~~~~~~~~
1365
1366 WinOF2 version 2.60 or higher must be installed on the machine.
1367
1368 WinOF2 installation
1369 ^^^^^^^^^^^^^^^^^^^
1370
1371 The driver can be downloaded from the following site:
1372 `WINOF2
1373 <https://www.mellanox.com/products/adapter-software/ethernet/windows/winof-2>`__
1374
1375 DevX Enablement
1376 ^^^^^^^^^^^^^^^
1377
1378 DevX for Windows must be enabled in the Windows registry.
1379 The keys ``DevxEnabled`` and ``DevxFsRules`` must be set.
1380 Additional information can be found in the WinOF2 user manual.
1381
1382 Supported NICs
1383 --------------
1384
1385 The following Mellanox device families are supported by the same mlx5 driver:
1386
1387   - ConnectX-4
1388   - ConnectX-4 Lx
1389   - ConnectX-5
1390   - ConnectX-5 Ex
1391   - ConnectX-6
1392   - ConnectX-6 Dx
1393   - ConnectX-6 Lx
1394   - BlueField
1395   - BlueField-2
1396
1397 Below are detailed device names:
1398
1399 * Mellanox\ |reg| ConnectX\ |reg|-4 10G MCX4111A-XCAT (1x10G)
1400 * Mellanox\ |reg| ConnectX\ |reg|-4 10G MCX412A-XCAT (2x10G)
1401 * Mellanox\ |reg| ConnectX\ |reg|-4 25G MCX4111A-ACAT (1x25G)
1402 * Mellanox\ |reg| ConnectX\ |reg|-4 25G MCX412A-ACAT (2x25G)
1403 * Mellanox\ |reg| ConnectX\ |reg|-4 40G MCX413A-BCAT (1x40G)
1404 * Mellanox\ |reg| ConnectX\ |reg|-4 40G MCX4131A-BCAT (1x40G)
1405 * Mellanox\ |reg| ConnectX\ |reg|-4 40G MCX415A-BCAT (1x40G)
1406 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX413A-GCAT (1x50G)
1407 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX4131A-GCAT (1x50G)
1408 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX414A-BCAT (2x50G)
1409 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX415A-GCAT (1x50G)
1410 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX416A-BCAT (2x50G)
1411 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX416A-GCAT (2x50G)
1412 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX415A-CCAT (1x100G)
1413 * Mellanox\ |reg| ConnectX\ |reg|-4 100G MCX416A-CCAT (2x100G)
1414 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 10G MCX4111A-XCAT (1x10G)
1415 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 10G MCX4121A-XCAT (2x10G)
1416 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 25G MCX4111A-ACAT (1x25G)
1417 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 25G MCX4121A-ACAT (2x25G)
1418 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 40G MCX4131A-BCAT (1x40G)
1419 * Mellanox\ |reg| ConnectX\ |reg|-5 100G MCX556A-ECAT (2x100G)
1420 * Mellanox\ |reg| ConnectX\ |reg|-5 Ex EN 100G MCX516A-CDAT (2x100G)
1421 * Mellanox\ |reg| ConnectX\ |reg|-6 200G MCX654106A-HCAT (2x200G)
1422 * Mellanox\ |reg| ConnectX\ |reg|-6 Dx EN 100G MCX623106AN-CDAT (2x100G)
1423 * Mellanox\ |reg| ConnectX\ |reg|-6 Dx EN 200G MCX623105AN-VDAT (1x200G)
1424 * Mellanox\ |reg| ConnectX\ |reg|-6 Lx EN 25G MCX631102AN-ADAT (2x25G)
1425
1426 Quick Start Guide on OFED/EN
1427 ----------------------------
1428
1429 1. Download latest Mellanox OFED/EN. For more info check the `linux prerequisites`_.
1430
1431
1432 2. Install the required libraries and kernel modules either by installing
1433    only the required set, or by installing the entire Mellanox OFED/EN::
1434
1435         ./mlnxofedinstall --upstream-libs --dpdk
1436
1437 3. Verify the firmware is the correct one::
1438
1439         ibv_devinfo
1440
1441 4. Verify all ports links are set to Ethernet::
1442
1443         mlxconfig -d <mst device> query | grep LINK_TYPE
1444         LINK_TYPE_P1                        ETH(2)
1445         LINK_TYPE_P2                        ETH(2)
1446
1447    Link types may have to be configured to Ethernet::
1448
1449         mlxconfig -d <mst device> set LINK_TYPE_P1/2=1/2/3
1450
1451         * LINK_TYPE_P1=<1|2|3> , 1=Infiniband 2=Ethernet 3=VPI(auto-sense)
1452
1453    For hypervisors, verify SR-IOV is enabled on the NIC::
1454
1455         mlxconfig -d <mst device> query | grep SRIOV_EN
1456         SRIOV_EN                            True(1)
1457
1458    If needed, configure SR-IOV::
1459
1460         mlxconfig -d <mst device> set SRIOV_EN=1 NUM_OF_VFS=16
1461         mlxfwreset -d <mst device> reset
1462
1463 5. Restart the driver::
1464
1465         /etc/init.d/openibd restart
1466
1467    or::
1468
1469         service openibd restart
1470
1471    If link type was changed, firmware must be reset as well::
1472
1473         mlxfwreset -d <mst device> reset
1474
1475    For hypervisors, after reset write the sysfs number of virtual functions
1476    needed for the PF.
1477
1478    To dynamically instantiate a given number of virtual functions (VFs)::
1479
1480         echo [num_vfs] > /sys/class/infiniband/mlx5_0/device/sriov_numvfs
1481
1482 6. Install DPDK and you are ready to go.
1483    See :doc:`compilation instructions <../linux_gsg/build_dpdk>`.
1484
1485 Enable switchdev mode
1486 ---------------------
1487
1488 Switchdev mode is a mode in E-Switch, that binds between representor and VF or SF.
1489 Representor is a port in DPDK that is connected to a VF or SF in such a way
1490 that assuming there are no offload flows, each packet that is sent from the VF or SF
1491 will be received by the corresponding representor. While each packet that is or SF
1492 sent to a representor will be received by the VF or SF.
1493 This is very useful in case of SRIOV mode, where the first packet that is sent
1494 by the VF or SF will be received by the DPDK application which will decide if this
1495 flow should be offloaded to the E-Switch. After offloading the flow packet
1496 that the VF or SF that are matching the flow will not be received any more by
1497 the DPDK application.
1498
1499 1. Enable SRIOV mode::
1500
1501         mlxconfig -d <mst device> set SRIOV_EN=true
1502
1503 2. Configure the max number of VFs::
1504
1505         mlxconfig -d <mst device> set NUM_OF_VFS=<num of vfs>
1506
1507 3. Reset the FW::
1508
1509         mlxfwreset -d <mst device> reset
1510
1511 3. Configure the actual number of VFs::
1512
1513         echo <num of vfs > /sys/class/net/<net device>/device/sriov_numvfs
1514
1515 4. Unbind the device (can be rebind after the switchdev mode)::
1516
1517         echo -n "<device pci address" > /sys/bus/pci/drivers/mlx5_core/unbind
1518
1519 5. Enable switchdev mode::
1520
1521         echo switchdev > /sys/class/net/<net device>/compat/devlink/mode
1522
1523 Sub-Function support
1524 --------------------
1525
1526 Sub-Function is a portion of the PCI device, a SF netdev has its own
1527 dedicated queues (txq, rxq).
1528 A SF shares PCI level resources with other SFs and/or with its parent PCI function.
1529
1530 0. Requirement::
1531
1532         OFED version >= 5.4-0.3.3.0
1533
1534 1. Configure SF feature::
1535
1536         # Run mlxconfig on both PFs on host and ECPFs on BlueField.
1537         mlxconfig -d <mst device> set PER_PF_NUM_SF=1 PF_TOTAL_SF=252 PF_SF_BAR_SIZE=12
1538
1539 2. Enable switchdev mode::
1540
1541         mlxdevm dev eswitch set pci/<DBDF> mode switchdev
1542
1543 3. Add SF port::
1544
1545         mlxdevm port add pci/<DBDF> flavour pcisf pfnum 0 sfnum <sfnum>
1546
1547         Get SFID from output: pci/<DBDF>/<SFID>
1548
1549 4. Modify MAC address::
1550
1551         mlxdevm port function set pci/<DBDF>/<SFID> hw_addr <MAC>
1552
1553 5. Activate SF port::
1554
1555         mlxdevm port function set pci/<DBDF>/<ID> state active
1556
1557 6. Devargs to probe SF device::
1558
1559         auxiliary:mlx5_core.sf.<num>,dv_flow_en=1
1560
1561 Sub-Function representor support
1562 --------------------------------
1563
1564 A SF netdev supports E-Switch representation offload
1565 similar to PF and VF representors.
1566 Use <sfnum> to probe SF representor::
1567
1568         testpmd> port attach <PCI_BDF>,representor=sf<sfnum>,dv_flow_en=1
1569
1570 Performance tuning
1571 ------------------
1572
1573 1. Configure aggressive CQE Zipping for maximum performance::
1574
1575         mlxconfig -d <mst device> s CQE_COMPRESSION=1
1576
1577   To set it back to the default CQE Zipping mode use::
1578
1579         mlxconfig -d <mst device> s CQE_COMPRESSION=0
1580
1581 2. In case of virtualization:
1582
1583    - Make sure that hypervisor kernel is 3.16 or newer.
1584    - Configure boot with ``iommu=pt``.
1585    - Use 1G huge pages.
1586    - Make sure to allocate a VM on huge pages.
1587    - Make sure to set CPU pinning.
1588
1589 3. Use the CPU near local NUMA node to which the PCIe adapter is connected,
1590    for better performance. For VMs, verify that the right CPU
1591    and NUMA node are pinned according to the above. Run::
1592
1593         lstopo-no-graphics --merge
1594
1595    to identify the NUMA node to which the PCIe adapter is connected.
1596
1597 4. If more than one adapter is used, and root complex capabilities allow
1598    to put both adapters on the same NUMA node without PCI bandwidth degradation,
1599    it is recommended to locate both adapters on the same NUMA node.
1600    This in order to forward packets from one to the other without
1601    NUMA performance penalty.
1602
1603 5. Disable pause frames::
1604
1605         ethtool -A <netdev> rx off tx off
1606
1607 6. Verify IO non-posted prefetch is disabled by default. This can be checked
1608    via the BIOS configuration. Please contact you server provider for more
1609    information about the settings.
1610
1611 .. note::
1612
1613         On some machines, depends on the machine integrator, it is beneficial
1614         to set the PCI max read request parameter to 1K. This can be
1615         done in the following way:
1616
1617         To query the read request size use::
1618
1619                 setpci -s <NIC PCI address> 68.w
1620
1621         If the output is different than 3XXX, set it by::
1622
1623                 setpci -s <NIC PCI address> 68.w=3XXX
1624
1625         The XXX can be different on different systems. Make sure to configure
1626         according to the setpci output.
1627
1628 7. To minimize overhead of searching Memory Regions:
1629
1630    - '--socket-mem' is recommended to pin memory by predictable amount.
1631    - Configure per-lcore cache when creating Mempools for packet buffer.
1632    - Refrain from dynamically allocating/freeing memory in run-time.
1633
1634 Rx burst functions
1635 ------------------
1636
1637 There are multiple Rx burst functions with different advantages and limitations.
1638
1639 .. table:: Rx burst functions
1640
1641    +-------------------+------------------------+---------+-----------------+------+-------+
1642    || Function Name    || Enabler               || Scatter|| Error Recovery || CQE || Large|
1643    |                   |                        |         |                 || comp|| MTU  |
1644    +===================+========================+=========+=================+======+=======+
1645    | rx_burst          | rx_vec_en=0            |   Yes   | Yes             |  Yes |  Yes  |
1646    +-------------------+------------------------+---------+-----------------+------+-------+
1647    | rx_burst_vec      | rx_vec_en=1 (default)  |   No    | if CQE comp off |  Yes |  No   |
1648    +-------------------+------------------------+---------+-----------------+------+-------+
1649    | rx_burst_mprq     || mprq_en=1             |   No    | Yes             |  Yes |  Yes  |
1650    |                   || RxQs >= rxqs_min_mprq |         |                 |      |       |
1651    +-------------------+------------------------+---------+-----------------+------+-------+
1652    | rx_burst_mprq_vec || rx_vec_en=1 (default) |   No    | if CQE comp off |  Yes |  Yes  |
1653    |                   || mprq_en=1             |         |                 |      |       |
1654    |                   || RxQs >= rxqs_min_mprq |         |                 |      |       |
1655    +-------------------+------------------------+---------+-----------------+------+-------+
1656
1657 .. _mlx5_offloads_support:
1658
1659 Supported hardware offloads
1660 ---------------------------
1661
1662 .. table:: Minimal SW/HW versions for queue offloads
1663
1664    ============== ===== ===== ========= ===== ========== =============
1665    Offload        DPDK  Linux rdma-core OFED   firmware   hardware
1666    ============== ===== ===== ========= ===== ========== =============
1667    common base    17.11  4.14    16     4.2-1 12.21.1000 ConnectX-4
1668    checksums      17.11  4.14    16     4.2-1 12.21.1000 ConnectX-4
1669    Rx timestamp   17.11  4.14    16     4.2-1 12.21.1000 ConnectX-4
1670    TSO            17.11  4.14    16     4.2-1 12.21.1000 ConnectX-4
1671    LRO            19.08  N/A     N/A    4.6-4 16.25.6406 ConnectX-5
1672    Tx scheduling  20.08  N/A     N/A    5.1-2 22.28.2006 ConnectX-6 Dx
1673    Buffer Split   20.11  N/A     N/A    5.1-2 16.28.2006 ConnectX-5
1674    ============== ===== ===== ========= ===== ========== =============
1675
1676 .. table:: Minimal SW/HW versions for rte_flow offloads
1677
1678    +-----------------------+-----------------+-----------------+
1679    | Offload               | with E-Switch   | with NIC        |
1680    +=======================+=================+=================+
1681    | Count                 | | DPDK 19.05    | | DPDK 19.02    |
1682    |                       | | OFED 4.6      | | OFED 4.6      |
1683    |                       | | rdma-core 24  | | rdma-core 23  |
1684    |                       | | ConnectX-5    | | ConnectX-5    |
1685    +-----------------------+-----------------+-----------------+
1686    | Drop                  | | DPDK 19.05    | | DPDK 18.11    |
1687    |                       | | OFED 4.6      | | OFED 4.5      |
1688    |                       | | rdma-core 24  | | rdma-core 23  |
1689    |                       | | ConnectX-5    | | ConnectX-4    |
1690    +-----------------------+-----------------+-----------------+
1691    | Queue / RSS           | |               | | DPDK 18.11    |
1692    |                       | |     N/A       | | OFED 4.5      |
1693    |                       | |               | | rdma-core 23  |
1694    |                       | |               | | ConnectX-4    |
1695    +-----------------------+-----------------+-----------------+
1696    | Shared action         | |               | |               |
1697    |                       | | :numref:`sact`| | :numref:`sact`|
1698    |                       | |               | |               |
1699    |                       | |               | |               |
1700    +-----------------------+-----------------+-----------------+
1701    | | VLAN                | | DPDK 19.11    | | DPDK 19.11    |
1702    | | (of_pop_vlan /      | | OFED 4.7-1    | | OFED 4.7-1    |
1703    | | of_push_vlan /      | | ConnectX-5    | | ConnectX-5    |
1704    | | of_set_vlan_pcp /   | |               | |               |
1705    | | of_set_vlan_vid)    | |               | |               |
1706    +-----------------------+-----------------+-----------------+
1707    | | VLAN                | | DPDK 21.05    | |               |
1708    | | ingress and /       | | OFED 5.3      | |    N/A        |
1709    | | of_push_vlan /      | | ConnectX-6 Dx | |               |
1710    +-----------------------+-----------------+-----------------+
1711    | | VLAN                | | DPDK 21.05    | |               |
1712    | | egress and /        | | OFED 5.3      | |    N/A        |
1713    | | of_pop_vlan /       | | ConnectX-6 Dx | |               |
1714    +-----------------------+-----------------+-----------------+
1715    | Encapsulation         | | DPDK 19.05    | | DPDK 19.02    |
1716    | (VXLAN / NVGRE / RAW) | | OFED 4.7-1    | | OFED 4.6      |
1717    |                       | | rdma-core 24  | | rdma-core 23  |
1718    |                       | | ConnectX-5    | | ConnectX-5    |
1719    +-----------------------+-----------------+-----------------+
1720    | Encapsulation         | | DPDK 19.11    | | DPDK 19.11    |
1721    | GENEVE                | | OFED 4.7-3    | | OFED 4.7-3    |
1722    |                       | | rdma-core 27  | | rdma-core 27  |
1723    |                       | | ConnectX-5    | | ConnectX-5    |
1724    +-----------------------+-----------------+-----------------+
1725    | Tunnel Offload        | |  DPDK 20.11   | | DPDK 20.11    |
1726    |                       | |  OFED 5.1-2   | | OFED 5.1-2    |
1727    |                       | |  rdma-core 32 | | N/A           |
1728    |                       | |  ConnectX-5   | | ConnectX-5    |
1729    +-----------------------+-----------------+-----------------+
1730    | | Header rewrite      | | DPDK 19.05    | | DPDK 19.02    |
1731    | | (set_ipv4_src /     | | OFED 4.7-1    | | OFED 4.7-1    |
1732    | | set_ipv4_dst /      | | rdma-core 24  | | rdma-core 24  |
1733    | | set_ipv6_src /      | | ConnectX-5    | | ConnectX-5    |
1734    | | set_ipv6_dst /      | |               | |               |
1735    | | set_tp_src /        | |               | |               |
1736    | | set_tp_dst /        | |               | |               |
1737    | | dec_ttl /           | |               | |               |
1738    | | set_ttl /           | |               | |               |
1739    | | set_mac_src /       | |               | |               |
1740    | | set_mac_dst)        | |               | |               |
1741    +-----------------------+-----------------+-----------------+
1742    | | Header rewrite      | | DPDK 20.02    | | DPDK 20.02    |
1743    | | (set_dscp)          | | OFED 5.0      | | OFED 5.0      |
1744    | |                     | | rdma-core 24  | | rdma-core 24  |
1745    | |                     | | ConnectX-5    | | ConnectX-5    |
1746    +-----------------------+-----------------+-----------------+
1747    | Jump                  | | DPDK 19.05    | | DPDK 19.02    |
1748    |                       | | OFED 4.7-1    | | OFED 4.7-1    |
1749    |                       | | rdma-core 24  | | N/A           |
1750    |                       | | ConnectX-5    | | ConnectX-5    |
1751    +-----------------------+-----------------+-----------------+
1752    | Mark / Flag           | | DPDK 19.05    | | DPDK 18.11    |
1753    |                       | | OFED 4.6      | | OFED 4.5      |
1754    |                       | | rdma-core 24  | | rdma-core 23  |
1755    |                       | | ConnectX-5    | | ConnectX-4    |
1756    +-----------------------+-----------------+-----------------+
1757    | Meta data             | |  DPDK 19.11   | | DPDK 19.11    |
1758    |                       | |  OFED 4.7-3   | | OFED 4.7-3    |
1759    |                       | |  rdma-core 26 | | rdma-core 26  |
1760    |                       | |  ConnectX-5   | | ConnectX-5    |
1761    +-----------------------+-----------------+-----------------+
1762    | Port ID               | | DPDK 19.05    |     | N/A       |
1763    |                       | | OFED 4.7-1    |     | N/A       |
1764    |                       | | rdma-core 24  |     | N/A       |
1765    |                       | | ConnectX-5    |     | N/A       |
1766    +-----------------------+-----------------+-----------------+
1767    | Hairpin               | |               | | DPDK 19.11    |
1768    |                       | |     N/A       | | OFED 4.7-3    |
1769    |                       | |               | | rdma-core 26  |
1770    |                       | |               | | ConnectX-5    |
1771    +-----------------------+-----------------+-----------------+
1772    | 2-port Hairpin        | |               | | DPDK 20.11    |
1773    |                       | |     N/A       | | OFED 5.1-2    |
1774    |                       | |               | | N/A           |
1775    |                       | |               | | ConnectX-5    |
1776    +-----------------------+-----------------+-----------------+
1777    | Metering              | |  DPDK 19.11   | | DPDK 19.11    |
1778    |                       | |  OFED 4.7-3   | | OFED 4.7-3    |
1779    |                       | |  rdma-core 26 | | rdma-core 26  |
1780    |                       | |  ConnectX-5   | | ConnectX-5    |
1781    +-----------------------+-----------------+-----------------+
1782    | ASO Metering          | |  DPDK 21.05   | | DPDK 21.05    |
1783    |                       | |  OFED 5.3     | | OFED 5.3      |
1784    |                       | |  rdma-core 33 | | rdma-core 33  |
1785    |                       | |  ConnectX-6 Dx| | ConnectX-6 Dx |
1786    +-----------------------+-----------------+-----------------+
1787    | Metering Hierarchy    | |  DPDK 21.08   | | DPDK 21.08    |
1788    |                       | |  OFED 5.3     | | OFED 5.3      |
1789    |                       | |  N/A          | | N/A           |
1790    |                       | |  ConnectX-6 Dx| | ConnectX-6 Dx |
1791    +-----------------------+-----------------+-----------------+
1792    | Sampling              | |  DPDK 20.11   | | DPDK 20.11    |
1793    |                       | |  OFED 5.1-2   | | OFED 5.1-2    |
1794    |                       | |  rdma-core 32 | | N/A           |
1795    |                       | |  ConnectX-5   | | ConnectX-5    |
1796    +-----------------------+-----------------+-----------------+
1797    | Encapsulation         | |  DPDK 21.02   | | DPDK 21.02    |
1798    | GTP PSC               | |  OFED 5.2     | | OFED 5.2      |
1799    |                       | |  rdma-core 35 | | rdma-core 35  |
1800    |                       | |  ConnectX-6 Dx| | ConnectX-6 Dx |
1801    +-----------------------+-----------------+-----------------+
1802    | Encapsulation         | | DPDK 21.02    | | DPDK 21.02    |
1803    | GENEVE TLV option     | | OFED 5.2      | | OFED 5.2      |
1804    |                       | | rdma-core 34  | | rdma-core 34  |
1805    |                       | | ConnectX-6 Dx | | ConnectX-6 Dx |
1806    +-----------------------+-----------------+-----------------+
1807    | Modify Field          | | DPDK 21.02    | | DPDK 21.02    |
1808    |                       | | OFED 5.2      | | OFED 5.2      |
1809    |                       | | rdma-core 35  | | rdma-core 35  |
1810    |                       | | ConnectX-5    | | ConnectX-5    |
1811    +-----------------------+-----------------+-----------------+
1812    | Connection tracking   | |               | | DPDK 21.05    |
1813    |                       | |     N/A       | | OFED 5.3      |
1814    |                       | |               | | rdma-core 35  |
1815    |                       | |               | | ConnectX-6 Dx |
1816    +-----------------------+-----------------+-----------------+
1817
1818 .. table:: Minimal SW/HW versions for shared action offload
1819    :name: sact
1820
1821    +-----------------------+-----------------+-----------------+
1822    | Shared Action         | with E-Switch   | with NIC        |
1823    +=======================+=================+=================+
1824    | RSS                   | |               | | DPDK 20.11    |
1825    |                       | |     N/A       | | OFED 5.2      |
1826    |                       | |               | | rdma-core 33  |
1827    |                       | |               | | ConnectX-5    |
1828    +-----------------------+-----------------+-----------------+
1829    | Age                   | | DPDK 20.11    | | DPDK 20.11    |
1830    |                       | | OFED 5.2      | | OFED 5.2      |
1831    |                       | | rdma-core 32  | | rdma-core 32  |
1832    |                       | | ConnectX-6 Dx | | ConnectX-6 Dx |
1833    +-----------------------+-----------------+-----------------+
1834    | Count                 | | DPDK 21.05    | | DPDK 21.05    |
1835    |                       | | OFED 4.6      | | OFED 4.6      |
1836    |                       | | rdma-core 24  | | rdma-core 23  |
1837    |                       | | ConnectX-5    | | ConnectX-5    |
1838    +-----------------------+-----------------+-----------------+
1839
1840 Notes for metadata
1841 ------------------
1842
1843 MARK and META items are interrelated with datapath - they might move from/to
1844 the applications in mbuf fields. Hence, zero value for these items has the
1845 special meaning - it means "no metadata are provided", not zero values are
1846 treated by applications and PMD as valid ones.
1847
1848 Moreover in the flow engine domain the value zero is acceptable to match and
1849 set, and we should allow to specify zero values as rte_flow parameters for the
1850 META and MARK items and actions. In the same time zero mask has no meaning and
1851 should be rejected on validation stage.
1852
1853 Notes for rte_flow
1854 ------------------
1855
1856 Flows are not cached in the driver.
1857 When stopping a device port, all the flows created on this port from the
1858 application will be flushed automatically in the background.
1859 After stopping the device port, all flows on this port become invalid and
1860 not represented in the system.
1861 All references to these flows held by the application should be discarded
1862 directly but neither destroyed nor flushed.
1863
1864 The application should re-create the flows as required after the port restart.
1865
1866 Notes for testpmd
1867 -----------------
1868
1869 Compared to librte_net_mlx4 that implements a single RSS configuration per
1870 port, librte_net_mlx5 supports per-protocol RSS configuration.
1871
1872 Since ``testpmd`` defaults to IP RSS mode and there is currently no
1873 command-line parameter to enable additional protocols (UDP and TCP as well
1874 as IP), the following commands must be entered from its CLI to get the same
1875 behavior as librte_net_mlx4::
1876
1877    > port stop all
1878    > port config all rss all
1879    > port start all
1880
1881 Usage example
1882 -------------
1883
1884 This section demonstrates how to launch **testpmd** with Mellanox
1885 ConnectX-4/ConnectX-5/ConnectX-6/BlueField devices managed by librte_net_mlx5.
1886
1887 #. Load the kernel modules::
1888
1889       modprobe -a ib_uverbs mlx5_core mlx5_ib
1890
1891    Alternatively if MLNX_OFED/MLNX_EN is fully installed, the following script
1892    can be run::
1893
1894       /etc/init.d/openibd restart
1895
1896    .. note::
1897
1898       User space I/O kernel modules (uio and igb_uio) are not used and do
1899       not have to be loaded.
1900
1901 #. Make sure Ethernet interfaces are in working order and linked to kernel
1902    verbs. Related sysfs entries should be present::
1903
1904       ls -d /sys/class/net/*/device/infiniband_verbs/uverbs* | cut -d / -f 5
1905
1906    Example output::
1907
1908       eth30
1909       eth31
1910       eth32
1911       eth33
1912
1913 #. Optionally, retrieve their PCI bus addresses for to be used with the allow list::
1914
1915       {
1916           for intf in eth2 eth3 eth4 eth5;
1917           do
1918               (cd "/sys/class/net/${intf}/device/" && pwd -P);
1919           done;
1920       } |
1921       sed -n 's,.*/\(.*\),-a \1,p'
1922
1923    Example output::
1924
1925       -a 0000:05:00.1
1926       -a 0000:06:00.0
1927       -a 0000:06:00.1
1928       -a 0000:05:00.0
1929
1930 #. Request huge pages::
1931
1932       dpdk-hugepages.py --setup 2G
1933
1934 #. Start testpmd with basic parameters::
1935
1936       dpdk-testpmd -l 8-15 -n 4 -a 05:00.0 -a 05:00.1 -a 06:00.0 -a 06:00.1 -- --rxq=2 --txq=2 -i
1937
1938    Example output::
1939
1940       [...]
1941       EAL: PCI device 0000:05:00.0 on NUMA socket 0
1942       EAL:   probe driver: 15b3:1013 librte_net_mlx5
1943       PMD: librte_net_mlx5: PCI information matches, using device "mlx5_0" (VF: false)
1944       PMD: librte_net_mlx5: 1 port(s) detected
1945       PMD: librte_net_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:fe
1946       EAL: PCI device 0000:05:00.1 on NUMA socket 0
1947       EAL:   probe driver: 15b3:1013 librte_net_mlx5
1948       PMD: librte_net_mlx5: PCI information matches, using device "mlx5_1" (VF: false)
1949       PMD: librte_net_mlx5: 1 port(s) detected
1950       PMD: librte_net_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:ff
1951       EAL: PCI device 0000:06:00.0 on NUMA socket 0
1952       EAL:   probe driver: 15b3:1013 librte_net_mlx5
1953       PMD: librte_net_mlx5: PCI information matches, using device "mlx5_2" (VF: false)
1954       PMD: librte_net_mlx5: 1 port(s) detected
1955       PMD: librte_net_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:fa
1956       EAL: PCI device 0000:06:00.1 on NUMA socket 0
1957       EAL:   probe driver: 15b3:1013 librte_net_mlx5
1958       PMD: librte_net_mlx5: PCI information matches, using device "mlx5_3" (VF: false)
1959       PMD: librte_net_mlx5: 1 port(s) detected
1960       PMD: librte_net_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:fb
1961       Interactive-mode selected
1962       Configuring Port 0 (socket 0)
1963       PMD: librte_net_mlx5: 0x8cba80: TX queues number update: 0 -> 2
1964       PMD: librte_net_mlx5: 0x8cba80: RX queues number update: 0 -> 2
1965       Port 0: E4:1D:2D:E7:0C:FE
1966       Configuring Port 1 (socket 0)
1967       PMD: librte_net_mlx5: 0x8ccac8: TX queues number update: 0 -> 2
1968       PMD: librte_net_mlx5: 0x8ccac8: RX queues number update: 0 -> 2
1969       Port 1: E4:1D:2D:E7:0C:FF
1970       Configuring Port 2 (socket 0)
1971       PMD: librte_net_mlx5: 0x8cdb10: TX queues number update: 0 -> 2
1972       PMD: librte_net_mlx5: 0x8cdb10: RX queues number update: 0 -> 2
1973       Port 2: E4:1D:2D:E7:0C:FA
1974       Configuring Port 3 (socket 0)
1975       PMD: librte_net_mlx5: 0x8ceb58: TX queues number update: 0 -> 2
1976       PMD: librte_net_mlx5: 0x8ceb58: RX queues number update: 0 -> 2
1977       Port 3: E4:1D:2D:E7:0C:FB
1978       Checking link statuses...
1979       Port 0 Link Up - speed 40000 Mbps - full-duplex
1980       Port 1 Link Up - speed 40000 Mbps - full-duplex
1981       Port 2 Link Up - speed 10000 Mbps - full-duplex
1982       Port 3 Link Up - speed 10000 Mbps - full-duplex
1983       Done
1984       testpmd>
1985
1986 How to dump flows
1987 -----------------
1988
1989 This section demonstrates how to dump flows. Currently, it's possible to dump
1990 all flows with assistance of external tools.
1991
1992 #. 2 ways to get flow raw file:
1993
1994    - Using testpmd CLI:
1995
1996    .. code-block:: console
1997
1998        To dump all flows:
1999        testpmd> flow dump <port> all <output_file>
2000        and dump one flow:
2001        testpmd> flow dump <port> rule <rule_id> <output_file>
2002
2003    - call rte_flow_dev_dump api:
2004
2005    .. code-block:: console
2006
2007        rte_flow_dev_dump(port, flow, file, NULL);
2008
2009 #. Dump human-readable flows from raw file:
2010
2011    Get flow parsing tool from: https://github.com/Mellanox/mlx_steering_dump
2012
2013    .. code-block:: console
2014
2015        mlx_steering_dump.py -f <output_file> -flowptr <flow_ptr>
2016
2017 How to share a meter between ports in the same switch domain
2018 ------------------------------------------------------------
2019
2020 This section demonstrates how to use the shared meter. A meter M can be created
2021 on port X and to be shared with a port Y on the same switch domain by the next way:
2022
2023 .. code-block:: console
2024
2025    flow create X ingress transfer pattern eth / port_id id is Y / end actions meter mtr_id M / end
2026
2027 How to use meter hierarchy
2028 --------------------------
2029
2030 This section demonstrates how to create and use a meter hierarchy.
2031 A termination meter M can be the policy green action of another termination meter N.
2032 The two meters are chained together as a chain. Using meter N in a flow will apply
2033 both the meters in hierarchy on that flow.
2034
2035 .. code-block:: console
2036
2037    add port meter policy 0 1 g_actions queue index 0 / end y_actions end r_actions drop / end
2038    create port meter 0 M 1 1 yes 0xffff 1 0
2039    add port meter policy 0 2 g_actions meter mtr_id M / end y_actions end r_actions drop / end
2040    create port meter 0 N 2 2 yes 0xffff 1 0
2041    flow create 0 ingress group 1 pattern eth / end actions meter mtr_id N / end