xref: /dpdk/doc/guides/nics/ixgbe.rst (revision daa02b5c)
1..  SPDX-License-Identifier: BSD-3-Clause
2    Copyright(c) 2010-2016 Intel Corporation.
3
4.. include:: <isonum.txt>
5
6IXGBE Driver
7============
8
9Vector PMD for IXGBE
10--------------------
11
12Vector PMD uses Intel® SIMD instructions to optimize packet I/O.
13It improves load/store bandwidth efficiency of L1 data cache by using a wider SSE/AVX register 1 (1).
14The wider register gives space to hold multiple packet buffers so as to save instruction number when processing bulk of packets.
15
16There is no change to PMD API. The RX/TX handler are the only two entries for vPMD packet I/O.
17They are transparently registered at runtime RX/TX execution if all condition checks pass.
18
191.  To date, only an SSE version of IX GBE vPMD is available.
20
21Some constraints apply as pre-conditions for specific optimizations on bulk packet transfers.
22The following sections explain RX and TX constraints in the vPMD.
23
24RX Constraints
25~~~~~~~~~~~~~~
26
27Linux Prerequisites and Pre-conditions
28^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
29
30The following prerequisites apply:
31
32*   To enable vPMD to work for RX, bulk allocation for Rx must be allowed.
33
34Ensure that the following pre-conditions are satisfied:
35
36*   rxq->rx_free_thresh >= RTE_PMD_IXGBE_RX_MAX_BURST
37
38*   rxq->rx_free_thresh < rxq->nb_rx_desc
39
40*   (rxq->nb_rx_desc % rxq->rx_free_thresh) == 0
41
42*   rxq->nb_rx_desc  < (IXGBE_MAX_RING_DESC - RTE_PMD_IXGBE_RX_MAX_BURST)
43
44These conditions are checked in the code.
45
46Scattered packets are not supported in this mode.
47If an incoming packet is greater than the maximum acceptable length of one "mbuf" data size (by default, the size is 2 KB),
48vPMD for RX would be disabled.
49
50By default, IXGBE_MAX_RING_DESC is set to 4096 and RTE_PMD_IXGBE_RX_MAX_BURST is set to 32.
51
52Windows Prerequisites and Pre-conditions
53^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
54
55- Follow the :doc:`guide for Windows <../windows_gsg/run_apps>`
56  to setup the basic DPDK environment.
57
58- Identify the Intel\ |reg| Ethernet adapter and get the latest NVM/FW version.
59
60- To access any Intel\ |reg| Ethernet hardware,
61  load the NetUIO driver in place of existing built-in (inbox) driver.
62
63- To load NetUIO driver, follow the steps mentioned in `dpdk-kmods repository
64  <https://git.dpdk.org/dpdk-kmods/tree/windows/netuio/README.rst>`_.
65
66- Loading of private Dynamic Device Personalization (DDP) package
67  is not supported on Windows.
68
69
70Feature not Supported by RX Vector PMD
71^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
72
73Some features are not supported when trying to increase the throughput in vPMD.
74They are:
75
76*   IEEE1588
77
78*   FDIR
79
80*   Header split
81
82*   RX checksum off load
83
84Other features are supported using optional MACRO configuration. They include:
85
86*   HW VLAN strip
87
88*   HW extend dual VLAN
89
90To guarantee the constraint, capabilities in dev_conf.rxmode.offloads will be checked:
91
92*   RTE_ETH_RX_OFFLOAD_VLAN_STRIP
93
94*   RTE_ETH_RX_OFFLOAD_VLAN_EXTEND
95
96*   RTE_ETH_RX_OFFLOAD_CHECKSUM
97
98*   RTE_ETH_RX_OFFLOAD_HEADER_SPLIT
99
100*   dev_conf
101
102fdir_conf->mode will also be checked.
103
104VF Runtime Options
105^^^^^^^^^^^^^^^^^^
106
107The following ``devargs`` options can be enabled at runtime. They must
108be passed as part of EAL arguments. For example,
109
110.. code-block:: console
111
112   dpdk-testpmd -a af:10.0,pflink_fullchk=1 -- -i
113
114- ``pflink_fullchk`` (default **0**)
115
116  When calling ``rte_eth_link_get_nowait()`` to get VF link status,
117  this option is used to control how VF synchronizes its status with
118  PF's. If set, VF will not only check the PF's physical link status
119  by reading related register, but also check the mailbox status. We
120  call this behavior as fully checking. And checking mailbox will
121  trigger PF's mailbox interrupt generation. If unset, the application
122  can get the VF's link status quickly by just reading the PF's link
123  status register, this will avoid the whole system's mailbox interrupt
124  generation.
125
126  ``rte_eth_link_get()`` will still use the mailbox method regardless
127  of the pflink_fullchk setting.
128
129RX Burst Size
130^^^^^^^^^^^^^
131
132As vPMD is focused on high throughput, it assumes that the RX burst size is equal to or greater than 32 per burst.
133It returns zero if using nb_pkt < 32 as the expected packet number in the receive handler.
134
135TX Constraint
136~~~~~~~~~~~~~
137
138Prerequisite
139^^^^^^^^^^^^
140
141The only prerequisite is related to tx_rs_thresh.
142The tx_rs_thresh value must be greater than or equal to RTE_PMD_IXGBE_TX_MAX_BURST,
143but less or equal to RTE_IXGBE_TX_MAX_FREE_BUF_SZ.
144Consequently, by default the tx_rs_thresh value is in the range 32 to 64.
145
146Feature not Supported by TX Vector PMD
147^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
148
149TX vPMD only works when offloads is set to 0
150
151This means that it does not support any TX offload.
152
153Application Programming Interface
154---------------------------------
155
156In DPDK release v16.11 an API for ixgbe specific functions has been added to the ixgbe PMD.
157The declarations for the API functions are in the header ``rte_pmd_ixgbe.h``.
158
159Sample Application Notes
160------------------------
161
162l3fwd
163~~~~~
164
165When running l3fwd with vPMD, there is one thing to note.
166In the configuration, ensure that RTE_ETH_RX_OFFLOAD_CHECKSUM in port_conf.rxmode.offloads is NOT set.
167Otherwise, by default, RX vPMD is disabled.
168
169load_balancer
170~~~~~~~~~~~~~
171
172As in the case of l3fwd, to enable vPMD, do NOT set RTE_ETH_RX_OFFLOAD_CHECKSUM in port_conf.rxmode.offloads.
173In addition, for improved performance, use -bsz "(32,32),(64,64),(32,32)" in load_balancer to avoid using the default burst size of 144.
174
175
176Limitations or Known issues
177---------------------------
178
179Malicious Driver Detection not Supported
180~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
181
182The Intel x550 series NICs support a feature called MDD (Malicious
183Driver Detection) which checks the behavior of the VF driver.
184If this feature is enabled, the VF must use the advanced context descriptor
185correctly and set the CC (Check Context) bit.
186DPDK PF doesn't support MDD, but kernel PF does. We may hit problem in this
187scenario kernel PF + DPDK VF. If user enables MDD in kernel PF, DPDK VF will
188not work. Because kernel PF thinks the VF is malicious. But actually it's not.
189The only reason is the VF doesn't act as MDD required.
190There's significant performance impact to support MDD. DPDK should check if
191the advanced context descriptor should be set and set it. And DPDK has to ask
192the info about the header length from the upper layer, because parsing the
193packet itself is not acceptable. So, it's too expensive to support MDD.
194When using kernel PF + DPDK VF on x550, please make sure to use a kernel
195PF driver that disables MDD or can disable MDD.
196
197Some kernel drivers already disable MDD by default while some kernels can use
198the command ``insmod ixgbe.ko MDD=0,0`` to disable MDD. Each "0" in the
199command refers to a port. For example, if there are 6 ixgbe ports, the command
200should be changed to ``insmod ixgbe.ko MDD=0,0,0,0,0,0``.
201
202
203Statistics
204~~~~~~~~~~
205
206The statistics of ixgbe hardware must be polled regularly in order for it to
207remain consistent. Running a DPDK application without polling the statistics will
208cause registers on hardware to count to the maximum value, and "stick" at
209that value.
210
211In order to avoid statistic registers every reaching the maximum value,
212read the statistics from the hardware using ``rte_eth_stats_get()`` or
213``rte_eth_xstats_get()``.
214
215The maximum time between statistics polls that ensures consistent results can
216be calculated as follows:
217
218.. code-block:: c
219
220  max_read_interval = UINT_MAX / max_packets_per_second
221  max_read_interval = 4294967295 / 14880952
222  max_read_interval = 288.6218096127183 (seconds)
223  max_read_interval = ~4 mins 48 sec.
224
225In order to ensure valid results, it is recommended to poll every 4 minutes.
226
227MTU setting
228~~~~~~~~~~~
229
230Although the user can set the MTU separately on PF and VF ports, the ixgbe NIC
231only supports one global MTU per physical port.
232So when the user sets different MTUs on PF and VF ports in one physical port,
233the real MTU for all these PF and VF ports is the largest value set.
234This behavior is based on the kernel driver behavior.
235
236VF MAC address setting
237~~~~~~~~~~~~~~~~~~~~~~
238
239On ixgbe, the concept of "pool" can be used for different things depending on
240the mode. In VMDq mode, "pool" means a VMDq pool. In IOV mode, "pool" means a
241VF.
242
243There is no RTE API to add a VF's MAC address from the PF. On ixgbe, the
244``rte_eth_dev_mac_addr_add()`` function can be used to add a VF's MAC address,
245as a workaround.
246
247X550 does not support legacy interrupt mode
248~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
249
250Description
251^^^^^^^^^^^
252X550 cannot get interrupts if using ``uio_pci_generic`` module or using legacy
253interrupt mode of ``igb_uio`` or ``vfio``. Because the errata of X550 states
254that the Interrupt Status bit is not implemented. The errata is the item #22
255from `X550 spec update <https://www.intel.com/content/dam/www/public/us/en/
256documents/specification-updates/ethernet-x550-spec-update.pdf>`_
257
258Implication
259^^^^^^^^^^^
260When using ``uio_pci_generic`` module or using legacy interrupt mode of
261``igb_uio`` or ``vfio``, the Interrupt Status bit would be checked if the
262interrupt is coming. Since the bit is not implemented in X550, the irq cannot
263be handled correctly and cannot report the event fd to DPDK apps. Then apps
264cannot get interrupts and ``dmesg`` will show messages like ``irq #No.: ``
265``nobody cared.``
266
267Workaround
268^^^^^^^^^^
269Do not bind the ``uio_pci_generic`` module in X550 NICs.
270Do not bind ``igb_uio`` with legacy mode in X550 NICs.
271Before binding ``vfio`` with legacy mode in X550 NICs, use ``modprobe vfio ``
272``nointxmask=1`` to load ``vfio`` module if the intx is not shared with other
273devices.
274
275RSS isn't supported when QinQ is enabled
276~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
277
278Due to FW limitation, IXGBE doesn't support RSS when QinQ is enabled currently.
279
280UDP with zero checksum is reported as error
281~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
282
283Intel 82599 10 Gigabit Ethernet Controller Specification Update (Revision 2.87)
284Errata: 44 Integrity Error Reported for IPv4/UDP Packets With Zero Checksum
285
286To support UDP zero checksum, the zero and bad UDP checksum packet is marked as
287RTE_MBUF_F_RX_L4_CKSUM_UNKNOWN, so the application needs to recompute the checksum to
288validate it.
289
290Inline crypto processing support
291--------------------------------
292
293Inline IPsec processing is supported for ``RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO``
294mode for ESP packets only:
295
296- ESP authentication only: AES-128-GMAC (128-bit key)
297- ESP encryption and authentication: AES-128-GCM (128-bit key)
298
299IPsec Security Gateway Sample Application supports inline IPsec processing for
300ixgbe PMD.
301
302For more details see the IPsec Security Gateway Sample Application and Security
303library documentation.
304
305
306Virtual Function Port Representors
307----------------------------------
308The IXGBE PF PMD supports the creation of VF port representors for the control
309and monitoring of IXGBE virtual function devices. Each port representor
310corresponds to a single virtual function of that device. Using the ``devargs``
311option ``representor`` the user can specify which virtual functions to create
312port representors for on initialization of the PF PMD by passing the VF IDs of
313the VFs which are required.::
314
315  -a DBDF,representor=[0,1,4]
316
317Currently hot-plugging of representor ports is not supported so all required
318representors must be specified on the creation of the PF.
319
320Supported Chipsets and NICs
321---------------------------
322
323- Intel 82599EB 10 Gigabit Ethernet Controller
324- Intel 82598EB 10 Gigabit Ethernet Controller
325- Intel 82599ES 10 Gigabit Ethernet Controller
326- Intel 82599EN 10 Gigabit Ethernet Controller
327- Intel Ethernet Controller X540-AT2
328- Intel Ethernet Controller X550-BT2
329- Intel Ethernet Controller X550-AT2
330- Intel Ethernet Controller X550-AT
331- Intel Ethernet Converged Network Adapter X520-SR1
332- Intel Ethernet Converged Network Adapter X520-SR2
333- Intel Ethernet Converged Network Adapter X520-LR1
334- Intel Ethernet Converged Network Adapter X520-DA1
335- Intel Ethernet Converged Network Adapter X520-DA2
336- Intel Ethernet Converged Network Adapter X520-DA4
337- Intel Ethernet Converged Network Adapter X520-QDA1
338- Intel Ethernet Converged Network Adapter X520-T2
339- Intel 10 Gigabit AF DA Dual Port Server Adapter
340- Intel 10 Gigabit AT Server Adapter
341- Intel 10 Gigabit AT2 Server Adapter
342- Intel 10 Gigabit CX4 Dual Port Server Adapter
343- Intel 10 Gigabit XF LR Server Adapter
344- Intel 10 Gigabit XF SR Dual Port Server Adapter
345- Intel 10 Gigabit XF SR Server Adapter
346- Intel Ethernet Converged Network Adapter X540-T1
347- Intel Ethernet Converged Network Adapter X540-T2
348- Intel Ethernet Converged Network Adapter X550-T1
349- Intel Ethernet Converged Network Adapter X550-T2
350