doc: describe timestamp limitations for mlx5
[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 - Timestamps:
484
485   - CQE timestamp field width is limited by hardware to 63 bits, MSB is zero.
486   - In the free-running mode the timestamp counter is reset on power on
487     and 63-bit value provides over 1800 years of uptime till overflow.
488   - In the real-time mode
489     (configurable with ``REAL_TIME_CLOCK_ENABLE`` firmware settings),
490     the timestamp presents the nanoseconds elapsed since 01-Jan-1970,
491     hardware timestamp overflow will happen on 19-Jan-2038
492     (0x80000000 seconds since 01-Jan-1970).
493   - The send scheduling is based on timestamps
494     from the reference "Clock Queue" completions,
495     the scheduled send timestamps should not be specified with non-zero MSB.
496
497 Statistics
498 ----------
499
500 MLX5 supports various methods to report statistics:
501
502 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.
503
504 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.
505
506 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.
507
508 Configuration
509 -------------
510
511 Compilation options
512 ~~~~~~~~~~~~~~~~~~~
513
514 The ibverbs libraries can be linked with this PMD in a number of ways,
515 configured by the ``ibverbs_link`` build option:
516
517 - ``shared`` (default): the PMD depends on some .so files.
518
519 - ``dlopen``: Split the dependencies glue in a separate library
520   loaded when needed by dlopen.
521   It make dependencies on libibverbs and libmlx4 optional,
522   and has no performance impact.
523
524 - ``static``: Embed static flavor of the dependencies libibverbs and libmlx4
525   in the PMD shared library or the executable static binary.
526
527 Environment variables
528 ~~~~~~~~~~~~~~~~~~~~~
529
530 - ``MLX5_GLUE_PATH``
531
532   A list of directories in which to search for the rdma-core "glue" plug-in,
533   separated by colons or semi-colons.
534
535 - ``MLX5_SHUT_UP_BF``
536
537   Configures HW Tx doorbell register as IO-mapped.
538
539   By default, the HW Tx doorbell is configured as a write-combining register.
540   The register would be flushed to HW usually when the write-combining buffer
541   becomes full, but it depends on CPU design.
542
543   Except for vectorized Tx burst routines, a write memory barrier is enforced
544   after updating the register so that the update can be immediately visible to
545   HW.
546
547   When vectorized Tx burst is called, the barrier is set only if the burst size
548   is not aligned to MLX5_VPMD_TX_MAX_BURST. However, setting this environmental
549   variable will bring better latency even though the maximum throughput can
550   slightly decline.
551
552 Run-time configuration
553 ~~~~~~~~~~~~~~~~~~~~~~
554
555 - librte_net_mlx5 brings kernel network interfaces up during initialization
556   because it is affected by their state. Forcing them down prevents packets
557   reception.
558
559 - **ethtool** operations on related kernel interfaces also affect the PMD.
560
561 Run as non-root
562 ^^^^^^^^^^^^^^^
563
564 In order to run as a non-root user,
565 some capabilities must be granted to the application::
566
567    setcap cap_sys_admin,cap_net_admin,cap_net_raw,cap_ipc_lock+ep <dpdk-app>
568
569 Below are the reasons of the need for each capability:
570
571 ``cap_sys_admin``
572    When using physical addresses (PA mode), with Linux >= 4.0,
573    for access to ``/proc/self/pagemap``.
574
575 ``cap_net_admin``
576    For device configuration.
577
578 ``cap_net_raw``
579    For raw ethernet queue allocation through kernel driver.
580
581 ``cap_ipc_lock``
582    For DMA memory pinning.
583
584 Driver options
585 ^^^^^^^^^^^^^^
586
587 - ``rxq_cqe_comp_en`` parameter [int]
588
589   A nonzero value enables the compression of CQE on RX side. This feature
590   allows to save PCI bandwidth and improve performance. Enabled by default.
591   Different compression formats are supported in order to achieve the best
592   performance for different traffic patterns. Default format depends on
593   Multi-Packet Rx queue configuration: Hash RSS format is used in case
594   MPRQ is disabled, Checksum format is used in case MPRQ is enabled.
595
596   Specifying 2 as a ``rxq_cqe_comp_en`` value selects Flow Tag format for
597   better compression rate in case of RTE Flow Mark traffic.
598   Specifying 3 as a ``rxq_cqe_comp_en`` value selects Checksum format.
599   Specifying 4 as a ``rxq_cqe_comp_en`` value selects L3/L4 Header format for
600   better compression rate in case of mixed TCP/UDP and IPv4/IPv6 traffic.
601   CQE compression format selection requires DevX to be enabled. If there is
602   no DevX enabled/supported the value is reset to 1 by default.
603
604   Supported on:
605
606   - x86_64 with ConnectX-4, ConnectX-4 Lx, ConnectX-5, ConnectX-6, ConnectX-6 Dx,
607     ConnectX-6 Lx, BlueField and BlueField-2.
608   - POWER9 and ARMv8 with ConnectX-4 Lx, ConnectX-5, ConnectX-6, ConnectX-6 Dx,
609     ConnectX-6 Lx, BlueField and BlueField-2.
610
611 - ``rxq_pkt_pad_en`` parameter [int]
612
613   A nonzero value enables padding Rx packet to the size of cacheline on PCI
614   transaction. This feature would waste PCI bandwidth but could improve
615   performance by avoiding partial cacheline write which may cause costly
616   read-modify-copy in memory transaction on some architectures. Disabled by
617   default.
618
619   Supported on:
620
621   - x86_64 with ConnectX-4, ConnectX-4 Lx, ConnectX-5, ConnectX-6, ConnectX-6 Dx,
622     ConnectX-6 Lx, BlueField and BlueField-2.
623   - POWER8 and ARMv8 with ConnectX-4 Lx, ConnectX-5, ConnectX-6, ConnectX-6 Dx,
624     ConnectX-6 Lx, BlueField and BlueField-2.
625
626 - ``delay_drop`` parameter [int]
627
628   Bitmask value for the Rx queue delay drop attribute. Bit 0 is used for the
629   standard Rx queue and bit 1 is used for the hairpin Rx queue. By default, the
630   delay drop is disabled for all Rx queues. It will be ignored if the port does
631   not support the attribute even if it is enabled explicitly.
632
633   The packets being received will not be dropped immediately when the WQEs are
634   exhausted in a Rx queue with delay drop enabled.
635
636   A timeout value is set in the driver to control the waiting time before
637   dropping a packet. Once the timer is expired, the delay drop will be
638   deactivated for all the Rx queues with this feature enable. To re-activeate
639   it, a rearming is needed and it is part of the kernel driver starting from
640   OFED 5.5.
641
642   To enable / disable the delay drop rearming, the private flag ``dropless_rq``
643   can be set and queried via ethtool:
644
645   - ethtool --set-priv-flags <netdev> dropless_rq on (/ off)
646   - ethtool --show-priv-flags <netdev>
647
648   The configuration flag is global per PF and can only be set on the PF, once
649   it is on, all the VFs', SFs' and representors' Rx queues will share the timer
650   and rearming.
651
652 - ``mprq_en`` parameter [int]
653
654   A nonzero value enables configuring Multi-Packet Rx queues. Rx queue is
655   configured as Multi-Packet RQ if the total number of Rx queues is
656   ``rxqs_min_mprq`` or more. Disabled by default.
657
658   Multi-Packet Rx Queue (MPRQ a.k.a Striding RQ) can further save PCIe bandwidth
659   by posting a single large buffer for multiple packets. Instead of posting a
660   buffers per a packet, one large buffer is posted in order to receive multiple
661   packets on the buffer. A MPRQ buffer consists of multiple fixed-size strides
662   and each stride receives one packet. MPRQ can improve throughput for
663   small-packet traffic.
664
665   When MPRQ is enabled, MTU can be larger than the size of
666   user-provided mbuf even if RTE_ETH_RX_OFFLOAD_SCATTER isn't enabled. PMD will
667   configure large stride size enough to accommodate MTU as long as
668   device allows. Note that this can waste system memory compared to enabling Rx
669   scatter and multi-segment packet.
670
671 - ``mprq_log_stride_num`` parameter [int]
672
673   Log 2 of the number of strides for Multi-Packet Rx queue. Configuring more
674   strides can reduce PCIe traffic further. If configured value is not in the
675   range of device capability, the default value will be set with a warning
676   message. The default value is 4 which is 16 strides per a buffer, valid only
677   if ``mprq_en`` is set.
678
679   The size of Rx queue should be bigger than the number of strides.
680
681 - ``mprq_log_stride_size`` parameter [int]
682
683   Log 2 of the size of a stride for Multi-Packet Rx queue. Configuring a smaller
684   stride size can save some memory and reduce probability of a depletion of all
685   available strides due to unreleased packets by an application. If configured
686   value is not in the range of device capability, the default value will be set
687   with a warning message. The default value is 11 which is 2048 bytes per a
688   stride, valid only if ``mprq_en`` is set. With ``mprq_log_stride_size`` set
689   it is possible for a packet to span across multiple strides. This mode allows
690   support of jumbo frames (9K) with MPRQ. The memcopy of some packets (or part
691   of a packet if Rx scatter is configured) may be required in case there is no
692   space left for a head room at the end of a stride which incurs some
693   performance penalty.
694
695 - ``mprq_max_memcpy_len`` parameter [int]
696
697   The maximum length of packet to memcpy in case of Multi-Packet Rx queue. Rx
698   packet is mem-copied to a user-provided mbuf if the size of Rx packet is less
699   than or equal to this parameter. Otherwise, PMD will attach the Rx packet to
700   the mbuf by external buffer attachment - ``rte_pktmbuf_attach_extbuf()``.
701   A mempool for external buffers will be allocated and managed by PMD. If Rx
702   packet is externally attached, ol_flags field of the mbuf will have
703   RTE_MBUF_F_EXTERNAL and this flag must be preserved. ``RTE_MBUF_HAS_EXTBUF()``
704   checks the flag. The default value is 128, valid only if ``mprq_en`` is set.
705
706 - ``rxqs_min_mprq`` parameter [int]
707
708   Configure Rx queues as Multi-Packet RQ if the total number of Rx queues is
709   greater or equal to this value. The default value is 12, valid only if
710   ``mprq_en`` is set.
711
712 - ``txq_inline`` parameter [int]
713
714   Amount of data to be inlined during TX operations. This parameter is
715   deprecated and converted to the new parameter ``txq_inline_max`` providing
716   partial compatibility.
717
718 - ``txqs_min_inline`` parameter [int]
719
720   Enable inline data send only when the number of TX queues is greater or equal
721   to this value.
722
723   This option should be used in combination with ``txq_inline_max`` and
724   ``txq_inline_mpw`` below and does not affect ``txq_inline_min`` settings above.
725
726   If this option is not specified the default value 16 is used for BlueField
727   and 8 for other platforms
728
729   The data inlining consumes the CPU cycles, so this option is intended to
730   auto enable inline data if we have enough Tx queues, which means we have
731   enough CPU cores and PCI bandwidth is getting more critical and CPU
732   is not supposed to be bottleneck anymore.
733
734   The copying data into WQE improves latency and can improve PPS performance
735   when PCI back pressure is detected and may be useful for scenarios involving
736   heavy traffic on many queues.
737
738   Because additional software logic is necessary to handle this mode, this
739   option should be used with care, as it may lower performance when back
740   pressure is not expected.
741
742   If inline data are enabled it may affect the maximal size of Tx queue in
743   descriptors because the inline data increase the descriptor size and
744   queue size limits supported by hardware may be exceeded.
745
746 - ``txq_inline_min`` parameter [int]
747
748   Minimal amount of data to be inlined into WQE during Tx operations. NICs
749   may require this minimal data amount to operate correctly. The exact value
750   may depend on NIC operation mode, requested offloads, etc. It is strongly
751   recommended to omit this parameter and use the default values. Anyway,
752   applications using this parameter should take into consideration that
753   specifying an inconsistent value may prevent the NIC from sending packets.
754
755   If ``txq_inline_min`` key is present the specified value (may be aligned
756   by the driver in order not to exceed the limits and provide better descriptor
757   space utilization) will be used by the driver and it is guaranteed that
758   requested amount of data bytes are inlined into the WQE beside other inline
759   settings. This key also may update ``txq_inline_max`` value (default
760   or specified explicitly in devargs) to reserve the space for inline data.
761
762   If ``txq_inline_min`` key is not present, the value may be queried by the
763   driver from the NIC via DevX if this feature is available. If there is no DevX
764   enabled/supported the value 18 (supposing L2 header including VLAN) is set
765   for ConnectX-4 and ConnectX-4 Lx, and 0 is set by default for ConnectX-5
766   and newer NICs. If packet is shorter the ``txq_inline_min`` value, the entire
767   packet is inlined.
768
769   For ConnectX-4 NIC, driver does not allow specifying value below 18
770   (minimal L2 header, including VLAN), error will be raised.
771
772   For ConnectX-4 Lx NIC, it is allowed to specify values below 18, but
773   it is not recommended and may prevent NIC from sending packets over
774   some configurations.
775
776   For ConnectX-4 and ConnectX-4 Lx NICs, automatically configured value
777   is insufficient for some traffic, because they require at least all L2 headers
778   to be inlined. For example, Q-in-Q adds 4 bytes to default 18 bytes
779   of Ethernet and VLAN, thus ``txq_inline_min`` must be set to 22.
780   MPLS would add 4 bytes per label. Final value must account for all possible
781   L2 encapsulation headers used in particular environment.
782
783   Please, note, this minimal data inlining disengages eMPW feature (Enhanced
784   Multi-Packet Write), because last one does not support partial packet inlining.
785   This is not very critical due to minimal data inlining is mostly required
786   by ConnectX-4 and ConnectX-4 Lx, these NICs do not support eMPW feature.
787
788 - ``txq_inline_max`` parameter [int]
789
790   Specifies the maximal packet length to be completely inlined into WQE
791   Ethernet Segment for ordinary SEND method. If packet is larger than specified
792   value, the packet data won't be copied by the driver at all, data buffer
793   is addressed with a pointer. If packet length is less or equal all packet
794   data will be copied into WQE. This may improve PCI bandwidth utilization for
795   short packets significantly but requires the extra CPU cycles.
796
797   The data inline feature is controlled by number of Tx queues, if number of Tx
798   queues is larger than ``txqs_min_inline`` key parameter, the inline feature
799   is engaged, if there are not enough Tx queues (which means not enough CPU cores
800   and CPU resources are scarce), data inline is not performed by the driver.
801   Assigning ``txqs_min_inline`` with zero always enables the data inline.
802
803   The default ``txq_inline_max`` value is 290. The specified value may be adjusted
804   by the driver in order not to exceed the limit (930 bytes) and to provide better
805   WQE space filling without gaps, the adjustment is reflected in the debug log.
806   Also, the default value (290) may be decreased in run-time if the large transmit
807   queue size is requested and hardware does not support enough descriptor
808   amount, in this case warning is emitted. If ``txq_inline_max`` key is
809   specified and requested inline settings can not be satisfied then error
810   will be raised.
811
812 - ``txq_inline_mpw`` parameter [int]
813
814   Specifies the maximal packet length to be completely inlined into WQE for
815   Enhanced MPW method. If packet is large the specified value, the packet data
816   won't be copied, and data buffer is addressed with pointer. If packet length
817   is less or equal, all packet data will be copied into WQE. This may improve PCI
818   bandwidth utilization for short packets significantly but requires the extra
819   CPU cycles.
820
821   The data inline feature is controlled by number of TX queues, if number of Tx
822   queues is larger than ``txqs_min_inline`` key parameter, the inline feature
823   is engaged, if there are not enough Tx queues (which means not enough CPU cores
824   and CPU resources are scarce), data inline is not performed by the driver.
825   Assigning ``txqs_min_inline`` with zero always enables the data inline.
826
827   The default ``txq_inline_mpw`` value is 268. The specified value may be adjusted
828   by the driver in order not to exceed the limit (930 bytes) and to provide better
829   WQE space filling without gaps, the adjustment is reflected in the debug log.
830   Due to multiple packets may be included to the same WQE with Enhanced Multi
831   Packet Write Method and overall WQE size is limited it is not recommended to
832   specify large values for the ``txq_inline_mpw``. Also, the default value (268)
833   may be decreased in run-time if the large transmit queue size is requested
834   and hardware does not support enough descriptor amount, in this case warning
835   is emitted. If ``txq_inline_mpw`` key is  specified and requested inline
836   settings can not be satisfied then error will be raised.
837
838 - ``txqs_max_vec`` parameter [int]
839
840   Enable vectorized Tx only when the number of TX queues is less than or
841   equal to this value. This parameter is deprecated and ignored, kept
842   for compatibility issue to not prevent driver from probing.
843
844 - ``txq_mpw_hdr_dseg_en`` parameter [int]
845
846   A nonzero value enables including two pointers in the first block of TX
847   descriptor. The parameter is deprecated and ignored, kept for compatibility
848   issue.
849
850 - ``txq_max_inline_len`` parameter [int]
851
852   Maximum size of packet to be inlined. This limits the size of packet to
853   be inlined. If the size of a packet is larger than configured value, the
854   packet isn't inlined even though there's enough space remained in the
855   descriptor. Instead, the packet is included with pointer. This parameter
856   is deprecated and converted directly to ``txq_inline_mpw`` providing full
857   compatibility. Valid only if eMPW feature is engaged.
858
859 - ``txq_mpw_en`` parameter [int]
860
861   A nonzero value enables Enhanced Multi-Packet Write (eMPW) for ConnectX-5,
862   ConnectX-6, ConnectX-6 Dx, ConnectX-6 Lx, BlueField, BlueField-2.
863   eMPW allows the Tx burst function to pack up multiple packets
864   in a single descriptor session in order to save PCI bandwidth
865   and improve performance at the cost of a slightly higher CPU usage.
866   When ``txq_inline_mpw`` is set along with ``txq_mpw_en``,
867   Tx burst function copies entire packet data on to Tx descriptor
868   instead of including pointer of packet.
869
870   The Enhanced Multi-Packet Write feature is enabled by default if NIC supports
871   it, can be disabled by explicit specifying 0 value for ``txq_mpw_en`` option.
872   Also, if minimal data inlining is requested by non-zero ``txq_inline_min``
873   option or reported by the NIC, the eMPW feature is disengaged.
874
875 - ``tx_db_nc`` parameter [int]
876
877   The rdma core library can map doorbell register in two ways, depending on the
878   environment variable "MLX5_SHUT_UP_BF":
879
880   - As regular cached memory (usually with write combining attribute), if the
881     variable is either missing or set to zero.
882   - As non-cached memory, if the variable is present and set to not "0" value.
883
884   The type of mapping may slightly affect the Tx performance, the optimal choice
885   is strongly relied on the host architecture and should be deduced practically.
886
887   If ``tx_db_nc`` is set to zero, the doorbell is forced to be mapped to regular
888   memory (with write combining), the PMD will perform the extra write memory barrier
889   after writing to doorbell, it might increase the needed CPU clocks per packet
890   to send, but latency might be improved.
891
892   If ``tx_db_nc`` is set to one, the doorbell is forced to be mapped to non
893   cached memory, the PMD will not perform the extra write memory barrier
894   after writing to doorbell, on some architectures it might improve the
895   performance.
896
897   If ``tx_db_nc`` is set to two, the doorbell is forced to be mapped to regular
898   memory, the PMD will use heuristics to decide whether write memory barrier
899   should be performed. For bursts with size multiple of recommended one (64 pkts)
900   it is supposed the next burst is coming and no need to issue the extra memory
901   barrier (it is supposed to be issued in the next coming burst, at least after
902   descriptor writing). It might increase latency (on some hosts till next
903   packets transmit) and should be used with care.
904
905   If ``tx_db_nc`` is omitted or set to zero, the preset (if any) environment
906   variable "MLX5_SHUT_UP_BF" value is used. If there is no "MLX5_SHUT_UP_BF",
907   the default ``tx_db_nc`` value is zero for ARM64 hosts and one for others.
908
909 - ``tx_pp`` parameter [int]
910
911   If a nonzero value is specified the driver creates all necessary internal
912   objects to provide accurate packet send scheduling on mbuf timestamps.
913   The positive value specifies the scheduling granularity in nanoseconds,
914   the packet send will be accurate up to specified digits. The allowed range is
915   from 500 to 1 million of nanoseconds. The negative value specifies the module
916   of granularity and engages the special test mode the check the schedule rate.
917   By default (if the ``tx_pp`` is not specified) send scheduling on timestamps
918   feature is disabled.
919
920 - ``tx_skew`` parameter [int]
921
922   The parameter adjusts the send packet scheduling on timestamps and represents
923   the average delay between beginning of the transmitting descriptor processing
924   by the hardware and appearance of actual packet data on the wire. The value
925   should be provided in nanoseconds and is valid only if ``tx_pp`` parameter is
926   specified. The default value is zero.
927
928 - ``tx_vec_en`` parameter [int]
929
930   A nonzero value enables Tx vector on ConnectX-5, ConnectX-6, ConnectX-6 Dx,
931   ConnectX-6 Lx, BlueField and BlueField-2 NICs
932   if the number of global Tx queues on the port is less than ``txqs_max_vec``.
933   The parameter is deprecated and ignored.
934
935 - ``rx_vec_en`` parameter [int]
936
937   A nonzero value enables Rx vector if the port is not configured in
938   multi-segment otherwise this parameter is ignored.
939
940   Enabled by default.
941
942 - ``vf_nl_en`` parameter [int]
943
944   A nonzero value enables Netlink requests from the VF to add/remove MAC
945   addresses or/and enable/disable promiscuous/all multicast on the Netdevice.
946   Otherwise the relevant configuration must be run with Linux iproute2 tools.
947   This is a prerequisite to receive this kind of traffic.
948
949   Enabled by default, valid only on VF devices ignored otherwise.
950
951 - ``l3_vxlan_en`` parameter [int]
952
953   A nonzero value allows L3 VXLAN and VXLAN-GPE flow creation. To enable
954   L3 VXLAN or VXLAN-GPE, users has to configure firmware and enable this
955   parameter. This is a prerequisite to receive this kind of traffic.
956
957   Disabled by default.
958
959 - ``dv_xmeta_en`` parameter [int]
960
961   A nonzero value enables extensive flow metadata support if device is
962   capable and driver supports it. This can enable extensive support of
963   ``MARK`` and ``META`` item of ``rte_flow``. The newly introduced
964   ``SET_TAG`` and ``SET_META`` actions do not depend on ``dv_xmeta_en``.
965
966   There are some possible configurations, depending on parameter value:
967
968   - 0, this is default value, defines the legacy mode, the ``MARK`` and
969     ``META`` related actions and items operate only within NIC Tx and
970     NIC Rx steering domains, no ``MARK`` and ``META`` information crosses
971     the domain boundaries. The ``MARK`` item is 24 bits wide, the ``META``
972     item is 32 bits wide and match supported on egress only.
973
974   - 1, this engages extensive metadata mode, the ``MARK`` and ``META``
975     related actions and items operate within all supported steering domains,
976     including FDB, ``MARK`` and ``META`` information may cross the domain
977     boundaries. The ``MARK`` item is 24 bits wide, the ``META`` item width
978     depends on kernel and firmware configurations and might be 0, 16 or
979     32 bits. Within NIC Tx domain ``META`` data width is 32 bits for
980     compatibility, the actual width of data transferred to the FDB domain
981     depends on kernel configuration and may be vary. The actual supported
982     width can be retrieved in runtime by series of rte_flow_validate()
983     trials.
984
985   - 2, this engages extensive metadata mode, the ``MARK`` and ``META``
986     related actions and items operate within all supported steering domains,
987     including FDB, ``MARK`` and ``META`` information may cross the domain
988     boundaries. The ``META`` item is 32 bits wide, the ``MARK`` item width
989     depends on kernel and firmware configurations and might be 0, 16 or
990     24 bits. The actual supported width can be retrieved in runtime by
991     series of rte_flow_validate() trials.
992
993   - 3, this engages tunnel offload mode. In E-Switch configuration, that
994     mode implicitly activates ``dv_xmeta_en=1``.
995
996   +------+-----------+-----------+-------------+-------------+
997   | Mode | ``MARK``  | ``META``  | ``META`` Tx | FDB/Through |
998   +======+===========+===========+=============+=============+
999   | 0    | 24 bits   | 32 bits   | 32 bits     | no          |
1000   +------+-----------+-----------+-------------+-------------+
1001   | 1    | 24 bits   | vary 0-32 | 32 bits     | yes         |
1002   +------+-----------+-----------+-------------+-------------+
1003   | 2    | vary 0-24 | 32 bits   | 32 bits     | yes         |
1004   +------+-----------+-----------+-------------+-------------+
1005
1006   If there is no E-Switch configuration the ``dv_xmeta_en`` parameter is
1007   ignored and the device is configured to operate in legacy mode (0).
1008
1009   Disabled by default (set to 0).
1010
1011   The Direct Verbs/Rules (engaged with ``dv_flow_en`` = 1) supports all
1012   of the extensive metadata features. The legacy Verbs supports FLAG and
1013   MARK metadata actions over NIC Rx steering domain only.
1014
1015   Setting META value to zero in flow action means there is no item provided
1016   and receiving datapath will not report in mbufs the metadata are present.
1017   Setting MARK value to zero in flow action means the zero FDIR ID value
1018   will be reported on packet receiving.
1019
1020   For the MARK action the last 16 values in the full range are reserved for
1021   internal PMD purposes (to emulate FLAG action). The valid range for the
1022   MARK action values is 0-0xFFEF for the 16-bit mode and 0-xFFFFEF
1023   for the 24-bit mode, the flows with the MARK action value outside
1024   the specified range will be rejected.
1025
1026 - ``dv_flow_en`` parameter [int]
1027
1028   A nonzero value enables the DV flow steering assuming it is supported
1029   by the driver (RDMA Core library version is rdma-core-24.0 or higher).
1030
1031   Enabled by default if supported.
1032
1033 - ``dv_esw_en`` parameter [int]
1034
1035   A nonzero value enables E-Switch using Direct Rules.
1036
1037   Enabled by default if supported.
1038
1039 - ``lacp_by_user`` parameter [int]
1040
1041   A nonzero value enables the control of LACP traffic by the user application.
1042   When a bond exists in the driver, by default it should be managed by the
1043   kernel and therefore LACP traffic should be steered to the kernel.
1044   If this devarg is set to 1 it will allow the user to manage the bond by
1045   itself and not steer LACP traffic to the kernel.
1046
1047   Disabled by default (set to 0).
1048
1049 - ``mr_ext_memseg_en`` parameter [int]
1050
1051   A nonzero value enables extending memseg when registering DMA memory. If
1052   enabled, the number of entries in MR (Memory Region) lookup table on datapath
1053   is minimized and it benefits performance. On the other hand, it worsens memory
1054   utilization because registered memory is pinned by kernel driver. Even if a
1055   page in the extended chunk is freed, that doesn't become reusable until the
1056   entire memory is freed.
1057
1058   Enabled by default.
1059
1060 - ``mr_mempool_reg_en`` parameter [int]
1061
1062   A nonzero value enables implicit registration of DMA memory of all mempools
1063   except those having ``RTE_MEMPOOL_F_NON_IO``. This flag is set automatically
1064   for mempools populated with non-contiguous objects or those without IOVA.
1065   The effect is that when a packet from a mempool is transmitted,
1066   its memory is already registered for DMA in the PMD and no registration
1067   will happen on the data path. The tradeoff is extra work on the creation
1068   of each mempool and increased HW resource use if some mempools
1069   are not used with MLX5 devices.
1070
1071   Enabled by default.
1072
1073 - ``representor`` parameter [list]
1074
1075   This parameter can be used to instantiate DPDK Ethernet devices from
1076   existing port (PF, VF or SF) representors configured on the device.
1077
1078   It is a standard parameter whose format is described in
1079   :ref:`ethernet_device_standard_device_arguments`.
1080
1081   For instance, to probe VF port representors 0 through 2::
1082
1083     <PCI_BDF>,representor=vf[0-2]
1084
1085   To probe SF port representors 0 through 2::
1086
1087     <PCI_BDF>,representor=sf[0-2]
1088
1089   To probe VF port representors 0 through 2 on both PFs of bonding device::
1090
1091     <Primary_PCI_BDF>,representor=pf[0,1]vf[0-2]
1092
1093 - ``max_dump_files_num`` parameter [int]
1094
1095   The maximum number of files per PMD entity that may be created for debug information.
1096   The files will be created in /var/log directory or in current directory.
1097
1098   set to 128 by default.
1099
1100 - ``lro_timeout_usec`` parameter [int]
1101
1102   The maximum allowed duration of an LRO session, in micro-seconds.
1103   PMD will set the nearest value supported by HW, which is not bigger than
1104   the input ``lro_timeout_usec`` value.
1105   If this parameter is not specified, by default PMD will set
1106   the smallest value supported by HW.
1107
1108 - ``hp_buf_log_sz`` parameter [int]
1109
1110   The total data buffer size of a hairpin queue (logarithmic form), in bytes.
1111   PMD will set the data buffer size to 2 ** ``hp_buf_log_sz``, both for RX & TX.
1112   The capacity of the value is specified by the firmware and the initialization
1113   will get a failure if it is out of scope.
1114   The range of the value is from 11 to 19 right now, and the supported frame
1115   size of a single packet for hairpin is from 512B to 128KB. It might change if
1116   different firmware release is being used. By using a small value, it could
1117   reduce memory consumption but not work with a large frame. If the value is
1118   too large, the memory consumption will be high and some potential performance
1119   degradation will be introduced.
1120   By default, the PMD will set this value to 16, which means that 9KB jumbo
1121   frames will be supported.
1122
1123 - ``reclaim_mem_mode`` parameter [int]
1124
1125   Cache some resources in flow destroy will help flow recreation more efficient.
1126   While some systems may require the all the resources can be reclaimed after
1127   flow destroyed.
1128   The parameter ``reclaim_mem_mode`` provides the option for user to configure
1129   if the resource cache is needed or not.
1130
1131   There are three options to choose:
1132
1133   - 0. It means the flow resources will be cached as usual. The resources will
1134     be cached, helpful with flow insertion rate.
1135
1136   - 1. It will only enable the DPDK PMD level resources reclaim.
1137
1138   - 2. Both DPDK PMD level and rdma-core low level will be configured as
1139     reclaimed mode.
1140
1141   By default, the PMD will set this value to 0.
1142
1143 - ``sys_mem_en`` parameter [int]
1144
1145   A non-zero value enables the PMD memory management allocating memory
1146   from system by default, without explicit rte memory flag.
1147
1148   By default, the PMD will set this value to 0.
1149
1150 - ``decap_en`` parameter [int]
1151
1152   Some devices do not support FCS (frame checksum) scattering for
1153   tunnel-decapsulated packets.
1154   If set to 0, this option forces the FCS feature and rejects tunnel
1155   decapsulation in the flow engine for such devices.
1156
1157   By default, the PMD will set this value to 1.
1158
1159 - ``allow_duplicate_pattern`` parameter [int]
1160
1161   There are two options to choose:
1162
1163   - 0. Prevent insertion of rules with the same pattern items on non-root table.
1164     In this case, only the first rule is inserted and the following rules are
1165     rejected and error code EEXIST is returned.
1166
1167   - 1. Allow insertion of rules with the same pattern items.
1168     In this case, all rules are inserted but only the first rule takes effect,
1169     the next rule takes effect only if the previous rules are deleted.
1170
1171   By default, the PMD will set this value to 1.
1172
1173 .. _mlx5_firmware_config:
1174
1175 Firmware configuration
1176 ~~~~~~~~~~~~~~~~~~~~~~
1177
1178 Firmware features can be configured as key/value pairs.
1179
1180 The command to set a value is::
1181
1182   mlxconfig -d <device> set <key>=<value>
1183
1184 The command to query a value is::
1185
1186   mlxconfig -d <device> query | grep <key>
1187
1188 The device name for the command ``mlxconfig`` can be either the PCI address,
1189 or the mst device name found with::
1190
1191   mst status
1192
1193 Below are some firmware configurations listed.
1194
1195 - link type::
1196
1197     LINK_TYPE_P1
1198     LINK_TYPE_P2
1199     value: 1=Infiniband 2=Ethernet 3=VPI(auto-sense)
1200
1201 - enable SR-IOV::
1202
1203     SRIOV_EN=1
1204
1205 - maximum number of SR-IOV virtual functions::
1206
1207     NUM_OF_VFS=<max>
1208
1209 - enable DevX (required by Direct Rules and other features)::
1210
1211     UCTX_EN=1
1212
1213 - aggressive CQE zipping::
1214
1215     CQE_COMPRESSION=1
1216
1217 - L3 VXLAN and VXLAN-GPE destination UDP port::
1218
1219     IP_OVER_VXLAN_EN=1
1220     IP_OVER_VXLAN_PORT=<udp dport>
1221
1222 - enable VXLAN-GPE tunnel flow matching::
1223
1224     FLEX_PARSER_PROFILE_ENABLE=0
1225     or
1226     FLEX_PARSER_PROFILE_ENABLE=2
1227
1228 - enable IP-in-IP tunnel flow matching::
1229
1230     FLEX_PARSER_PROFILE_ENABLE=0
1231
1232 - enable MPLS flow matching::
1233
1234     FLEX_PARSER_PROFILE_ENABLE=1
1235
1236 - enable ICMP(code/type/identifier/sequence number) / ICMP6(code/type) fields matching::
1237
1238     FLEX_PARSER_PROFILE_ENABLE=2
1239
1240 - enable Geneve flow matching::
1241
1242    FLEX_PARSER_PROFILE_ENABLE=0
1243    or
1244    FLEX_PARSER_PROFILE_ENABLE=1
1245
1246 - enable Geneve TLV option flow matching::
1247
1248    FLEX_PARSER_PROFILE_ENABLE=0
1249
1250 - enable GTP flow matching::
1251
1252    FLEX_PARSER_PROFILE_ENABLE=3
1253
1254 - enable eCPRI flow matching::
1255
1256    FLEX_PARSER_PROFILE_ENABLE=4
1257    PROG_PARSE_GRAPH=1
1258
1259 - enable realtime timestamp format::
1260
1261    REAL_TIME_CLOCK_ENABLE=1
1262
1263 Linux Prerequisites
1264 -------------------
1265
1266 This driver relies on external libraries and kernel drivers for resources
1267 allocations and initialization. The following dependencies are not part of
1268 DPDK and must be installed separately:
1269
1270 - **libibverbs**
1271
1272   User space Verbs framework used by librte_net_mlx5. This library provides
1273   a generic interface between the kernel and low-level user space drivers
1274   such as libmlx5.
1275
1276   It allows slow and privileged operations (context initialization, hardware
1277   resources allocations) to be managed by the kernel and fast operations to
1278   never leave user space.
1279
1280 - **libmlx5**
1281
1282   Low-level user space driver library for Mellanox
1283   ConnectX-4/ConnectX-5/ConnectX-6/BlueField devices, it is automatically loaded
1284   by libibverbs.
1285
1286   This library basically implements send/receive calls to the hardware
1287   queues.
1288
1289 - **Kernel modules**
1290
1291   They provide the kernel-side Verbs API and low level device drivers that
1292   manage actual hardware initialization and resources sharing with user
1293   space processes.
1294
1295   Unlike most other PMDs, these modules must remain loaded and bound to
1296   their devices:
1297
1298   - mlx5_core: hardware driver managing Mellanox
1299     ConnectX-4/ConnectX-5/ConnectX-6/BlueField devices and related Ethernet kernel
1300     network devices.
1301   - mlx5_ib: InifiniBand device driver.
1302   - ib_uverbs: user space driver for Verbs (entry point for libibverbs).
1303
1304 - **Firmware update**
1305
1306   Mellanox OFED/EN releases include firmware updates for
1307   ConnectX-4/ConnectX-5/ConnectX-6/BlueField adapters.
1308
1309   Because each release provides new features, these updates must be applied to
1310   match the kernel modules and libraries they come with.
1311
1312 .. note::
1313
1314    Both libraries are BSD and GPL licensed. Linux kernel modules are GPL
1315    licensed.
1316
1317 Installation
1318 ~~~~~~~~~~~~
1319
1320 Either RDMA Core library with a recent enough Linux kernel release
1321 (recommended) or Mellanox OFED/EN, which provides compatibility with older
1322 releases.
1323
1324 RDMA Core with Linux Kernel
1325 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1326
1327 - Minimal kernel version : v4.14 or the most recent 4.14-rc (see `Linux installation documentation`_)
1328 - Minimal rdma-core version: v15+ commit 0c5f5765213a ("Merge pull request #227 from yishaih/tm")
1329   (see `RDMA Core installation documentation`_)
1330 - When building for i686 use:
1331
1332   - rdma-core version 18.0 or above built with 32bit support.
1333   - Kernel version 4.14.41 or above.
1334
1335 - Starting with rdma-core v21, static libraries can be built::
1336
1337     cd build
1338     CFLAGS=-fPIC cmake -DIN_PLACE=1 -DENABLE_STATIC=1 -GNinja ..
1339     ninja
1340
1341 .. _`Linux installation documentation`: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/plain/Documentation/admin-guide/README.rst
1342 .. _`RDMA Core installation documentation`: https://raw.githubusercontent.com/linux-rdma/rdma-core/master/README.md
1343
1344
1345 Mellanox OFED/EN
1346 ^^^^^^^^^^^^^^^^
1347
1348 - Mellanox OFED version: **4.5** and above /
1349   Mellanox EN version: **4.5** and above
1350 - firmware version:
1351
1352   - ConnectX-4: **12.21.1000** and above.
1353   - ConnectX-4 Lx: **14.21.1000** and above.
1354   - ConnectX-5: **16.21.1000** and above.
1355   - ConnectX-5 Ex: **16.21.1000** and above.
1356   - ConnectX-6: **20.27.0090** and above.
1357   - ConnectX-6 Dx: **22.27.0090** and above.
1358   - BlueField: **18.25.1010** and above.
1359
1360 While these libraries and kernel modules are available on OpenFabrics
1361 Alliance's `website <https://www.openfabrics.org/>`__ and provided by package
1362 managers on most distributions, this PMD requires Ethernet extensions that
1363 may not be supported at the moment (this is a work in progress).
1364
1365 `Mellanox OFED
1366 <http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux>`__ and
1367 `Mellanox EN
1368 <http://www.mellanox.com/page/products_dyn?product_family=27&mtag=linux>`__
1369 include the necessary support and should be used in the meantime. For DPDK,
1370 only libibverbs, libmlx5, mlnx-ofed-kernel packages and firmware updates are
1371 required from that distribution.
1372
1373 .. note::
1374
1375    Several versions of Mellanox OFED/EN are available. Installing the version
1376    this DPDK release was developed and tested against is strongly
1377    recommended. Please check the `linux prerequisites`_.
1378
1379 Windows Prerequisites
1380 ---------------------
1381
1382 This driver relies on external libraries and kernel drivers for resources
1383 allocations and initialization. The dependencies in the following sub-sections
1384 are not part of DPDK, and must be installed separately.
1385
1386 Compilation Prerequisites
1387 ~~~~~~~~~~~~~~~~~~~~~~~~~
1388
1389 DevX SDK installation
1390 ^^^^^^^^^^^^^^^^^^^^^
1391
1392 The DevX SDK must be installed on the machine building the Windows PMD.
1393 Additional information can be found at
1394 `How to Integrate Windows DevX in Your Development Environment
1395 <https://docs.mellanox.com/display/winof2v250/RShim+Drivers+and+Usage#RShimDriversandUsage-DevXInterface>`__.
1396
1397 Runtime Prerequisites
1398 ~~~~~~~~~~~~~~~~~~~~~
1399
1400 WinOF2 version 2.60 or higher must be installed on the machine.
1401
1402 WinOF2 installation
1403 ^^^^^^^^^^^^^^^^^^^
1404
1405 The driver can be downloaded from the following site:
1406 `WINOF2
1407 <https://www.mellanox.com/products/adapter-software/ethernet/windows/winof-2>`__
1408
1409 DevX Enablement
1410 ^^^^^^^^^^^^^^^
1411
1412 DevX for Windows must be enabled in the Windows registry.
1413 The keys ``DevxEnabled`` and ``DevxFsRules`` must be set.
1414 Additional information can be found in the WinOF2 user manual.
1415
1416 Supported NICs
1417 --------------
1418
1419 The following Mellanox device families are supported by the same mlx5 driver:
1420
1421   - ConnectX-4
1422   - ConnectX-4 Lx
1423   - ConnectX-5
1424   - ConnectX-5 Ex
1425   - ConnectX-6
1426   - ConnectX-6 Dx
1427   - ConnectX-6 Lx
1428   - BlueField
1429   - BlueField-2
1430
1431 Below are detailed device names:
1432
1433 * Mellanox\ |reg| ConnectX\ |reg|-4 10G MCX4111A-XCAT (1x10G)
1434 * Mellanox\ |reg| ConnectX\ |reg|-4 10G MCX412A-XCAT (2x10G)
1435 * Mellanox\ |reg| ConnectX\ |reg|-4 25G MCX4111A-ACAT (1x25G)
1436 * Mellanox\ |reg| ConnectX\ |reg|-4 25G MCX412A-ACAT (2x25G)
1437 * Mellanox\ |reg| ConnectX\ |reg|-4 40G MCX413A-BCAT (1x40G)
1438 * Mellanox\ |reg| ConnectX\ |reg|-4 40G MCX4131A-BCAT (1x40G)
1439 * Mellanox\ |reg| ConnectX\ |reg|-4 40G MCX415A-BCAT (1x40G)
1440 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX413A-GCAT (1x50G)
1441 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX4131A-GCAT (1x50G)
1442 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX414A-BCAT (2x50G)
1443 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX415A-GCAT (1x50G)
1444 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX416A-BCAT (2x50G)
1445 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX416A-GCAT (2x50G)
1446 * Mellanox\ |reg| ConnectX\ |reg|-4 50G MCX415A-CCAT (1x100G)
1447 * Mellanox\ |reg| ConnectX\ |reg|-4 100G MCX416A-CCAT (2x100G)
1448 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 10G MCX4111A-XCAT (1x10G)
1449 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 10G MCX4121A-XCAT (2x10G)
1450 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 25G MCX4111A-ACAT (1x25G)
1451 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 25G MCX4121A-ACAT (2x25G)
1452 * Mellanox\ |reg| ConnectX\ |reg|-4 Lx 40G MCX4131A-BCAT (1x40G)
1453 * Mellanox\ |reg| ConnectX\ |reg|-5 100G MCX556A-ECAT (2x100G)
1454 * Mellanox\ |reg| ConnectX\ |reg|-5 Ex EN 100G MCX516A-CDAT (2x100G)
1455 * Mellanox\ |reg| ConnectX\ |reg|-6 200G MCX654106A-HCAT (2x200G)
1456 * Mellanox\ |reg| ConnectX\ |reg|-6 Dx EN 100G MCX623106AN-CDAT (2x100G)
1457 * Mellanox\ |reg| ConnectX\ |reg|-6 Dx EN 200G MCX623105AN-VDAT (1x200G)
1458 * Mellanox\ |reg| ConnectX\ |reg|-6 Lx EN 25G MCX631102AN-ADAT (2x25G)
1459
1460 Quick Start Guide on OFED/EN
1461 ----------------------------
1462
1463 1. Download latest Mellanox OFED/EN. For more info check the `linux prerequisites`_.
1464
1465
1466 2. Install the required libraries and kernel modules either by installing
1467    only the required set, or by installing the entire Mellanox OFED/EN::
1468
1469         ./mlnxofedinstall --upstream-libs --dpdk
1470
1471 3. Verify the firmware is the correct one::
1472
1473         ibv_devinfo
1474
1475 4. Verify all ports links are set to Ethernet::
1476
1477         mlxconfig -d <mst device> query | grep LINK_TYPE
1478         LINK_TYPE_P1                        ETH(2)
1479         LINK_TYPE_P2                        ETH(2)
1480
1481    Link types may have to be configured to Ethernet::
1482
1483         mlxconfig -d <mst device> set LINK_TYPE_P1/2=1/2/3
1484
1485         * LINK_TYPE_P1=<1|2|3> , 1=Infiniband 2=Ethernet 3=VPI(auto-sense)
1486
1487    For hypervisors, verify SR-IOV is enabled on the NIC::
1488
1489         mlxconfig -d <mst device> query | grep SRIOV_EN
1490         SRIOV_EN                            True(1)
1491
1492    If needed, configure SR-IOV::
1493
1494         mlxconfig -d <mst device> set SRIOV_EN=1 NUM_OF_VFS=16
1495         mlxfwreset -d <mst device> reset
1496
1497 5. Restart the driver::
1498
1499         /etc/init.d/openibd restart
1500
1501    or::
1502
1503         service openibd restart
1504
1505    If link type was changed, firmware must be reset as well::
1506
1507         mlxfwreset -d <mst device> reset
1508
1509    For hypervisors, after reset write the sysfs number of virtual functions
1510    needed for the PF.
1511
1512    To dynamically instantiate a given number of virtual functions (VFs)::
1513
1514         echo [num_vfs] > /sys/class/infiniband/mlx5_0/device/sriov_numvfs
1515
1516 6. Install DPDK and you are ready to go.
1517    See :doc:`compilation instructions <../linux_gsg/build_dpdk>`.
1518
1519 Enable switchdev mode
1520 ---------------------
1521
1522 Switchdev mode is a mode in E-Switch, that binds between representor and VF or SF.
1523 Representor is a port in DPDK that is connected to a VF or SF in such a way
1524 that assuming there are no offload flows, each packet that is sent from the VF or SF
1525 will be received by the corresponding representor. While each packet that is or SF
1526 sent to a representor will be received by the VF or SF.
1527 This is very useful in case of SRIOV mode, where the first packet that is sent
1528 by the VF or SF will be received by the DPDK application which will decide if this
1529 flow should be offloaded to the E-Switch. After offloading the flow packet
1530 that the VF or SF that are matching the flow will not be received any more by
1531 the DPDK application.
1532
1533 1. Enable SRIOV mode::
1534
1535         mlxconfig -d <mst device> set SRIOV_EN=true
1536
1537 2. Configure the max number of VFs::
1538
1539         mlxconfig -d <mst device> set NUM_OF_VFS=<num of vfs>
1540
1541 3. Reset the FW::
1542
1543         mlxfwreset -d <mst device> reset
1544
1545 3. Configure the actual number of VFs::
1546
1547         echo <num of vfs > /sys/class/net/<net device>/device/sriov_numvfs
1548
1549 4. Unbind the device (can be rebind after the switchdev mode)::
1550
1551         echo -n "<device pci address" > /sys/bus/pci/drivers/mlx5_core/unbind
1552
1553 5. Enable switchdev mode::
1554
1555         echo switchdev > /sys/class/net/<net device>/compat/devlink/mode
1556
1557 Sub-Function support
1558 --------------------
1559
1560 Sub-Function is a portion of the PCI device, a SF netdev has its own
1561 dedicated queues (txq, rxq).
1562 A SF shares PCI level resources with other SFs and/or with its parent PCI function.
1563
1564 0. Requirement::
1565
1566         OFED version >= 5.4-0.3.3.0
1567
1568 1. Configure SF feature::
1569
1570         # Run mlxconfig on both PFs on host and ECPFs on BlueField.
1571         mlxconfig -d <mst device> set PER_PF_NUM_SF=1 PF_TOTAL_SF=252 PF_SF_BAR_SIZE=12
1572
1573 2. Enable switchdev mode::
1574
1575         mlxdevm dev eswitch set pci/<DBDF> mode switchdev
1576
1577 3. Add SF port::
1578
1579         mlxdevm port add pci/<DBDF> flavour pcisf pfnum 0 sfnum <sfnum>
1580
1581         Get SFID from output: pci/<DBDF>/<SFID>
1582
1583 4. Modify MAC address::
1584
1585         mlxdevm port function set pci/<DBDF>/<SFID> hw_addr <MAC>
1586
1587 5. Activate SF port::
1588
1589         mlxdevm port function set pci/<DBDF>/<ID> state active
1590
1591 6. Devargs to probe SF device::
1592
1593         auxiliary:mlx5_core.sf.<num>,dv_flow_en=1
1594
1595 Sub-Function representor support
1596 --------------------------------
1597
1598 A SF netdev supports E-Switch representation offload
1599 similar to PF and VF representors.
1600 Use <sfnum> to probe SF representor::
1601
1602         testpmd> port attach <PCI_BDF>,representor=sf<sfnum>,dv_flow_en=1
1603
1604 Performance tuning
1605 ------------------
1606
1607 1. Configure aggressive CQE Zipping for maximum performance::
1608
1609         mlxconfig -d <mst device> s CQE_COMPRESSION=1
1610
1611   To set it back to the default CQE Zipping mode use::
1612
1613         mlxconfig -d <mst device> s CQE_COMPRESSION=0
1614
1615 2. In case of virtualization:
1616
1617    - Make sure that hypervisor kernel is 3.16 or newer.
1618    - Configure boot with ``iommu=pt``.
1619    - Use 1G huge pages.
1620    - Make sure to allocate a VM on huge pages.
1621    - Make sure to set CPU pinning.
1622
1623 3. Use the CPU near local NUMA node to which the PCIe adapter is connected,
1624    for better performance. For VMs, verify that the right CPU
1625    and NUMA node are pinned according to the above. Run::
1626
1627         lstopo-no-graphics --merge
1628
1629    to identify the NUMA node to which the PCIe adapter is connected.
1630
1631 4. If more than one adapter is used, and root complex capabilities allow
1632    to put both adapters on the same NUMA node without PCI bandwidth degradation,
1633    it is recommended to locate both adapters on the same NUMA node.
1634    This in order to forward packets from one to the other without
1635    NUMA performance penalty.
1636
1637 5. Disable pause frames::
1638
1639         ethtool -A <netdev> rx off tx off
1640
1641 6. Verify IO non-posted prefetch is disabled by default. This can be checked
1642    via the BIOS configuration. Please contact you server provider for more
1643    information about the settings.
1644
1645 .. note::
1646
1647         On some machines, depends on the machine integrator, it is beneficial
1648         to set the PCI max read request parameter to 1K. This can be
1649         done in the following way:
1650
1651         To query the read request size use::
1652
1653                 setpci -s <NIC PCI address> 68.w
1654
1655         If the output is different than 3XXX, set it by::
1656
1657                 setpci -s <NIC PCI address> 68.w=3XXX
1658
1659         The XXX can be different on different systems. Make sure to configure
1660         according to the setpci output.
1661
1662 7. To minimize overhead of searching Memory Regions:
1663
1664    - '--socket-mem' is recommended to pin memory by predictable amount.
1665    - Configure per-lcore cache when creating Mempools for packet buffer.
1666    - Refrain from dynamically allocating/freeing memory in run-time.
1667
1668 Rx burst functions
1669 ------------------
1670
1671 There are multiple Rx burst functions with different advantages and limitations.
1672
1673 .. table:: Rx burst functions
1674
1675    +-------------------+------------------------+---------+-----------------+------+-------+
1676    || Function Name    || Enabler               || Scatter|| Error Recovery || CQE || Large|
1677    |                   |                        |         |                 || comp|| MTU  |
1678    +===================+========================+=========+=================+======+=======+
1679    | rx_burst          | rx_vec_en=0            |   Yes   | Yes             |  Yes |  Yes  |
1680    +-------------------+------------------------+---------+-----------------+------+-------+
1681    | rx_burst_vec      | rx_vec_en=1 (default)  |   No    | if CQE comp off |  Yes |  No   |
1682    +-------------------+------------------------+---------+-----------------+------+-------+
1683    | rx_burst_mprq     || mprq_en=1             |   No    | Yes             |  Yes |  Yes  |
1684    |                   || RxQs >= rxqs_min_mprq |         |                 |      |       |
1685    +-------------------+------------------------+---------+-----------------+------+-------+
1686    | rx_burst_mprq_vec || rx_vec_en=1 (default) |   No    | if CQE comp off |  Yes |  Yes  |
1687    |                   || mprq_en=1             |         |                 |      |       |
1688    |                   || RxQs >= rxqs_min_mprq |         |                 |      |       |
1689    +-------------------+------------------------+---------+-----------------+------+-------+
1690
1691 .. _mlx5_offloads_support:
1692
1693 Supported hardware offloads
1694 ---------------------------
1695
1696 .. table:: Minimal SW/HW versions for queue offloads
1697
1698    ============== ===== ===== ========= ===== ========== =============
1699    Offload        DPDK  Linux rdma-core OFED   firmware   hardware
1700    ============== ===== ===== ========= ===== ========== =============
1701    common base    17.11  4.14    16     4.2-1 12.21.1000 ConnectX-4
1702    checksums      17.11  4.14    16     4.2-1 12.21.1000 ConnectX-4
1703    Rx timestamp   17.11  4.14    16     4.2-1 12.21.1000 ConnectX-4
1704    TSO            17.11  4.14    16     4.2-1 12.21.1000 ConnectX-4
1705    LRO            19.08  N/A     N/A    4.6-4 16.25.6406 ConnectX-5
1706    Tx scheduling  20.08  N/A     N/A    5.1-2 22.28.2006 ConnectX-6 Dx
1707    Buffer Split   20.11  N/A     N/A    5.1-2 16.28.2006 ConnectX-5
1708    ============== ===== ===== ========= ===== ========== =============
1709
1710 .. table:: Minimal SW/HW versions for rte_flow offloads
1711
1712    +-----------------------+-----------------+-----------------+
1713    | Offload               | with E-Switch   | with NIC        |
1714    +=======================+=================+=================+
1715    | Count                 | | DPDK 19.05    | | DPDK 19.02    |
1716    |                       | | OFED 4.6      | | OFED 4.6      |
1717    |                       | | rdma-core 24  | | rdma-core 23  |
1718    |                       | | ConnectX-5    | | ConnectX-5    |
1719    +-----------------------+-----------------+-----------------+
1720    | Drop                  | | DPDK 19.05    | | DPDK 18.11    |
1721    |                       | | OFED 4.6      | | OFED 4.5      |
1722    |                       | | rdma-core 24  | | rdma-core 23  |
1723    |                       | | ConnectX-5    | | ConnectX-4    |
1724    +-----------------------+-----------------+-----------------+
1725    | Queue / RSS           | |               | | DPDK 18.11    |
1726    |                       | |     N/A       | | OFED 4.5      |
1727    |                       | |               | | rdma-core 23  |
1728    |                       | |               | | ConnectX-4    |
1729    +-----------------------+-----------------+-----------------+
1730    | Shared action         | |               | |               |
1731    |                       | | :numref:`sact`| | :numref:`sact`|
1732    |                       | |               | |               |
1733    |                       | |               | |               |
1734    +-----------------------+-----------------+-----------------+
1735    | | VLAN                | | DPDK 19.11    | | DPDK 19.11    |
1736    | | (of_pop_vlan /      | | OFED 4.7-1    | | OFED 4.7-1    |
1737    | | of_push_vlan /      | | ConnectX-5    | | ConnectX-5    |
1738    | | of_set_vlan_pcp /   | |               | |               |
1739    | | of_set_vlan_vid)    | |               | |               |
1740    +-----------------------+-----------------+-----------------+
1741    | | VLAN                | | DPDK 21.05    | |               |
1742    | | ingress and /       | | OFED 5.3      | |    N/A        |
1743    | | of_push_vlan /      | | ConnectX-6 Dx | |               |
1744    +-----------------------+-----------------+-----------------+
1745    | | VLAN                | | DPDK 21.05    | |               |
1746    | | egress and /        | | OFED 5.3      | |    N/A        |
1747    | | of_pop_vlan /       | | ConnectX-6 Dx | |               |
1748    +-----------------------+-----------------+-----------------+
1749    | Encapsulation         | | DPDK 19.05    | | DPDK 19.02    |
1750    | (VXLAN / NVGRE / RAW) | | OFED 4.7-1    | | OFED 4.6      |
1751    |                       | | rdma-core 24  | | rdma-core 23  |
1752    |                       | | ConnectX-5    | | ConnectX-5    |
1753    +-----------------------+-----------------+-----------------+
1754    | Encapsulation         | | DPDK 19.11    | | DPDK 19.11    |
1755    | GENEVE                | | OFED 4.7-3    | | OFED 4.7-3    |
1756    |                       | | rdma-core 27  | | rdma-core 27  |
1757    |                       | | ConnectX-5    | | ConnectX-5    |
1758    +-----------------------+-----------------+-----------------+
1759    | Tunnel Offload        | |  DPDK 20.11   | | DPDK 20.11    |
1760    |                       | |  OFED 5.1-2   | | OFED 5.1-2    |
1761    |                       | |  rdma-core 32 | | N/A           |
1762    |                       | |  ConnectX-5   | | ConnectX-5    |
1763    +-----------------------+-----------------+-----------------+
1764    | | Header rewrite      | | DPDK 19.05    | | DPDK 19.02    |
1765    | | (set_ipv4_src /     | | OFED 4.7-1    | | OFED 4.7-1    |
1766    | | set_ipv4_dst /      | | rdma-core 24  | | rdma-core 24  |
1767    | | set_ipv6_src /      | | ConnectX-5    | | ConnectX-5    |
1768    | | set_ipv6_dst /      | |               | |               |
1769    | | set_tp_src /        | |               | |               |
1770    | | set_tp_dst /        | |               | |               |
1771    | | dec_ttl /           | |               | |               |
1772    | | set_ttl /           | |               | |               |
1773    | | set_mac_src /       | |               | |               |
1774    | | set_mac_dst)        | |               | |               |
1775    +-----------------------+-----------------+-----------------+
1776    | | Header rewrite      | | DPDK 20.02    | | DPDK 20.02    |
1777    | | (set_dscp)          | | OFED 5.0      | | OFED 5.0      |
1778    | |                     | | rdma-core 24  | | rdma-core 24  |
1779    | |                     | | ConnectX-5    | | ConnectX-5    |
1780    +-----------------------+-----------------+-----------------+
1781    | Jump                  | | DPDK 19.05    | | DPDK 19.02    |
1782    |                       | | OFED 4.7-1    | | OFED 4.7-1    |
1783    |                       | | rdma-core 24  | | N/A           |
1784    |                       | | ConnectX-5    | | ConnectX-5    |
1785    +-----------------------+-----------------+-----------------+
1786    | Mark / Flag           | | DPDK 19.05    | | DPDK 18.11    |
1787    |                       | | OFED 4.6      | | OFED 4.5      |
1788    |                       | | rdma-core 24  | | rdma-core 23  |
1789    |                       | | ConnectX-5    | | ConnectX-4    |
1790    +-----------------------+-----------------+-----------------+
1791    | Meta data             | |  DPDK 19.11   | | DPDK 19.11    |
1792    |                       | |  OFED 4.7-3   | | OFED 4.7-3    |
1793    |                       | |  rdma-core 26 | | rdma-core 26  |
1794    |                       | |  ConnectX-5   | | ConnectX-5    |
1795    +-----------------------+-----------------+-----------------+
1796    | Port ID               | | DPDK 19.05    |     | N/A       |
1797    |                       | | OFED 4.7-1    |     | N/A       |
1798    |                       | | rdma-core 24  |     | N/A       |
1799    |                       | | ConnectX-5    |     | N/A       |
1800    +-----------------------+-----------------+-----------------+
1801    | Hairpin               | |               | | DPDK 19.11    |
1802    |                       | |     N/A       | | OFED 4.7-3    |
1803    |                       | |               | | rdma-core 26  |
1804    |                       | |               | | ConnectX-5    |
1805    +-----------------------+-----------------+-----------------+
1806    | 2-port Hairpin        | |               | | DPDK 20.11    |
1807    |                       | |     N/A       | | OFED 5.1-2    |
1808    |                       | |               | | N/A           |
1809    |                       | |               | | ConnectX-5    |
1810    +-----------------------+-----------------+-----------------+
1811    | Metering              | |  DPDK 19.11   | | DPDK 19.11    |
1812    |                       | |  OFED 4.7-3   | | OFED 4.7-3    |
1813    |                       | |  rdma-core 26 | | rdma-core 26  |
1814    |                       | |  ConnectX-5   | | ConnectX-5    |
1815    +-----------------------+-----------------+-----------------+
1816    | ASO Metering          | |  DPDK 21.05   | | DPDK 21.05    |
1817    |                       | |  OFED 5.3     | | OFED 5.3      |
1818    |                       | |  rdma-core 33 | | rdma-core 33  |
1819    |                       | |  ConnectX-6 Dx| | ConnectX-6 Dx |
1820    +-----------------------+-----------------+-----------------+
1821    | Metering Hierarchy    | |  DPDK 21.08   | | DPDK 21.08    |
1822    |                       | |  OFED 5.3     | | OFED 5.3      |
1823    |                       | |  N/A          | | N/A           |
1824    |                       | |  ConnectX-6 Dx| | ConnectX-6 Dx |
1825    +-----------------------+-----------------+-----------------+
1826    | Sampling              | |  DPDK 20.11   | | DPDK 20.11    |
1827    |                       | |  OFED 5.1-2   | | OFED 5.1-2    |
1828    |                       | |  rdma-core 32 | | N/A           |
1829    |                       | |  ConnectX-5   | | ConnectX-5    |
1830    +-----------------------+-----------------+-----------------+
1831    | Encapsulation         | |  DPDK 21.02   | | DPDK 21.02    |
1832    | GTP PSC               | |  OFED 5.2     | | OFED 5.2      |
1833    |                       | |  rdma-core 35 | | rdma-core 35  |
1834    |                       | |  ConnectX-6 Dx| | ConnectX-6 Dx |
1835    +-----------------------+-----------------+-----------------+
1836    | Encapsulation         | | DPDK 21.02    | | DPDK 21.02    |
1837    | GENEVE TLV option     | | OFED 5.2      | | OFED 5.2      |
1838    |                       | | rdma-core 34  | | rdma-core 34  |
1839    |                       | | ConnectX-6 Dx | | ConnectX-6 Dx |
1840    +-----------------------+-----------------+-----------------+
1841    | Modify Field          | | DPDK 21.02    | | DPDK 21.02    |
1842    |                       | | OFED 5.2      | | OFED 5.2      |
1843    |                       | | rdma-core 35  | | rdma-core 35  |
1844    |                       | | ConnectX-5    | | ConnectX-5    |
1845    +-----------------------+-----------------+-----------------+
1846    | Connection tracking   | |               | | DPDK 21.05    |
1847    |                       | |     N/A       | | OFED 5.3      |
1848    |                       | |               | | rdma-core 35  |
1849    |                       | |               | | ConnectX-6 Dx |
1850    +-----------------------+-----------------+-----------------+
1851
1852 .. table:: Minimal SW/HW versions for shared action offload
1853    :name: sact
1854
1855    +-----------------------+-----------------+-----------------+
1856    | Shared Action         | with E-Switch   | with NIC        |
1857    +=======================+=================+=================+
1858    | RSS                   | |               | | DPDK 20.11    |
1859    |                       | |     N/A       | | OFED 5.2      |
1860    |                       | |               | | rdma-core 33  |
1861    |                       | |               | | ConnectX-5    |
1862    +-----------------------+-----------------+-----------------+
1863    | Age                   | | DPDK 20.11    | | DPDK 20.11    |
1864    |                       | | OFED 5.2      | | OFED 5.2      |
1865    |                       | | rdma-core 32  | | rdma-core 32  |
1866    |                       | | ConnectX-6 Dx | | ConnectX-6 Dx |
1867    +-----------------------+-----------------+-----------------+
1868    | Count                 | | DPDK 21.05    | | DPDK 21.05    |
1869    |                       | | OFED 4.6      | | OFED 4.6      |
1870    |                       | | rdma-core 24  | | rdma-core 23  |
1871    |                       | | ConnectX-5    | | ConnectX-5    |
1872    +-----------------------+-----------------+-----------------+
1873
1874 Notes for metadata
1875 ------------------
1876
1877 MARK and META items are interrelated with datapath - they might move from/to
1878 the applications in mbuf fields. Hence, zero value for these items has the
1879 special meaning - it means "no metadata are provided", not zero values are
1880 treated by applications and PMD as valid ones.
1881
1882 Moreover in the flow engine domain the value zero is acceptable to match and
1883 set, and we should allow to specify zero values as rte_flow parameters for the
1884 META and MARK items and actions. In the same time zero mask has no meaning and
1885 should be rejected on validation stage.
1886
1887 Notes for rte_flow
1888 ------------------
1889
1890 Flows are not cached in the driver.
1891 When stopping a device port, all the flows created on this port from the
1892 application will be flushed automatically in the background.
1893 After stopping the device port, all flows on this port become invalid and
1894 not represented in the system.
1895 All references to these flows held by the application should be discarded
1896 directly but neither destroyed nor flushed.
1897
1898 The application should re-create the flows as required after the port restart.
1899
1900 Notes for testpmd
1901 -----------------
1902
1903 Compared to librte_net_mlx4 that implements a single RSS configuration per
1904 port, librte_net_mlx5 supports per-protocol RSS configuration.
1905
1906 Since ``testpmd`` defaults to IP RSS mode and there is currently no
1907 command-line parameter to enable additional protocols (UDP and TCP as well
1908 as IP), the following commands must be entered from its CLI to get the same
1909 behavior as librte_net_mlx4::
1910
1911    > port stop all
1912    > port config all rss all
1913    > port start all
1914
1915 Usage example
1916 -------------
1917
1918 This section demonstrates how to launch **testpmd** with Mellanox
1919 ConnectX-4/ConnectX-5/ConnectX-6/BlueField devices managed by librte_net_mlx5.
1920
1921 #. Load the kernel modules::
1922
1923       modprobe -a ib_uverbs mlx5_core mlx5_ib
1924
1925    Alternatively if MLNX_OFED/MLNX_EN is fully installed, the following script
1926    can be run::
1927
1928       /etc/init.d/openibd restart
1929
1930    .. note::
1931
1932       User space I/O kernel modules (uio and igb_uio) are not used and do
1933       not have to be loaded.
1934
1935 #. Make sure Ethernet interfaces are in working order and linked to kernel
1936    verbs. Related sysfs entries should be present::
1937
1938       ls -d /sys/class/net/*/device/infiniband_verbs/uverbs* | cut -d / -f 5
1939
1940    Example output::
1941
1942       eth30
1943       eth31
1944       eth32
1945       eth33
1946
1947 #. Optionally, retrieve their PCI bus addresses for to be used with the allow list::
1948
1949       {
1950           for intf in eth2 eth3 eth4 eth5;
1951           do
1952               (cd "/sys/class/net/${intf}/device/" && pwd -P);
1953           done;
1954       } |
1955       sed -n 's,.*/\(.*\),-a \1,p'
1956
1957    Example output::
1958
1959       -a 0000:05:00.1
1960       -a 0000:06:00.0
1961       -a 0000:06:00.1
1962       -a 0000:05:00.0
1963
1964 #. Request huge pages::
1965
1966       dpdk-hugepages.py --setup 2G
1967
1968 #. Start testpmd with basic parameters::
1969
1970       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
1971
1972    Example output::
1973
1974       [...]
1975       EAL: PCI device 0000:05:00.0 on NUMA socket 0
1976       EAL:   probe driver: 15b3:1013 librte_net_mlx5
1977       PMD: librte_net_mlx5: PCI information matches, using device "mlx5_0" (VF: false)
1978       PMD: librte_net_mlx5: 1 port(s) detected
1979       PMD: librte_net_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:fe
1980       EAL: PCI device 0000:05:00.1 on NUMA socket 0
1981       EAL:   probe driver: 15b3:1013 librte_net_mlx5
1982       PMD: librte_net_mlx5: PCI information matches, using device "mlx5_1" (VF: false)
1983       PMD: librte_net_mlx5: 1 port(s) detected
1984       PMD: librte_net_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:ff
1985       EAL: PCI device 0000:06:00.0 on NUMA socket 0
1986       EAL:   probe driver: 15b3:1013 librte_net_mlx5
1987       PMD: librte_net_mlx5: PCI information matches, using device "mlx5_2" (VF: false)
1988       PMD: librte_net_mlx5: 1 port(s) detected
1989       PMD: librte_net_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:fa
1990       EAL: PCI device 0000:06:00.1 on NUMA socket 0
1991       EAL:   probe driver: 15b3:1013 librte_net_mlx5
1992       PMD: librte_net_mlx5: PCI information matches, using device "mlx5_3" (VF: false)
1993       PMD: librte_net_mlx5: 1 port(s) detected
1994       PMD: librte_net_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:fb
1995       Interactive-mode selected
1996       Configuring Port 0 (socket 0)
1997       PMD: librte_net_mlx5: 0x8cba80: TX queues number update: 0 -> 2
1998       PMD: librte_net_mlx5: 0x8cba80: RX queues number update: 0 -> 2
1999       Port 0: E4:1D:2D:E7:0C:FE
2000       Configuring Port 1 (socket 0)
2001       PMD: librte_net_mlx5: 0x8ccac8: TX queues number update: 0 -> 2
2002       PMD: librte_net_mlx5: 0x8ccac8: RX queues number update: 0 -> 2
2003       Port 1: E4:1D:2D:E7:0C:FF
2004       Configuring Port 2 (socket 0)
2005       PMD: librte_net_mlx5: 0x8cdb10: TX queues number update: 0 -> 2
2006       PMD: librte_net_mlx5: 0x8cdb10: RX queues number update: 0 -> 2
2007       Port 2: E4:1D:2D:E7:0C:FA
2008       Configuring Port 3 (socket 0)
2009       PMD: librte_net_mlx5: 0x8ceb58: TX queues number update: 0 -> 2
2010       PMD: librte_net_mlx5: 0x8ceb58: RX queues number update: 0 -> 2
2011       Port 3: E4:1D:2D:E7:0C:FB
2012       Checking link statuses...
2013       Port 0 Link Up - speed 40000 Mbps - full-duplex
2014       Port 1 Link Up - speed 40000 Mbps - full-duplex
2015       Port 2 Link Up - speed 10000 Mbps - full-duplex
2016       Port 3 Link Up - speed 10000 Mbps - full-duplex
2017       Done
2018       testpmd>
2019
2020 How to dump flows
2021 -----------------
2022
2023 This section demonstrates how to dump flows. Currently, it's possible to dump
2024 all flows with assistance of external tools.
2025
2026 #. 2 ways to get flow raw file:
2027
2028    - Using testpmd CLI:
2029
2030    .. code-block:: console
2031
2032        To dump all flows:
2033        testpmd> flow dump <port> all <output_file>
2034        and dump one flow:
2035        testpmd> flow dump <port> rule <rule_id> <output_file>
2036
2037    - call rte_flow_dev_dump api:
2038
2039    .. code-block:: console
2040
2041        rte_flow_dev_dump(port, flow, file, NULL);
2042
2043 #. Dump human-readable flows from raw file:
2044
2045    Get flow parsing tool from: https://github.com/Mellanox/mlx_steering_dump
2046
2047    .. code-block:: console
2048
2049        mlx_steering_dump.py -f <output_file> -flowptr <flow_ptr>
2050
2051 How to share a meter between ports in the same switch domain
2052 ------------------------------------------------------------
2053
2054 This section demonstrates how to use the shared meter. A meter M can be created
2055 on port X and to be shared with a port Y on the same switch domain by the next way:
2056
2057 .. code-block:: console
2058
2059    flow create X ingress transfer pattern eth / port_id id is Y / end actions meter mtr_id M / end
2060
2061 How to use meter hierarchy
2062 --------------------------
2063
2064 This section demonstrates how to create and use a meter hierarchy.
2065 A termination meter M can be the policy green action of another termination meter N.
2066 The two meters are chained together as a chain. Using meter N in a flow will apply
2067 both the meters in hierarchy on that flow.
2068
2069 .. code-block:: console
2070
2071    add port meter policy 0 1 g_actions queue index 0 / end y_actions end r_actions drop / end
2072    create port meter 0 M 1 1 yes 0xffff 1 0
2073    add port meter policy 0 2 g_actions meter mtr_id M / end y_actions end r_actions drop / end
2074    create port meter 0 N 2 2 yes 0xffff 1 0
2075    flow create 0 ingress group 1 pattern eth / end actions meter mtr_id N / end