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