DPDK应用中网卡不可用
NIC is unavailable in DPDK application
我正在研究 DPDK 并尝试创建一个简单的应用程序,但是它看不到绑定到 DPDK 的 NIC。
- 这是我机器上的网络设备列表
$ dpdk-devbind.py --status-dev net
Network devices using kernel driver
===================================
0000:01:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' if=enp1s0 drv=r8169 unused=vfio-pci *Active*
0000:02:00.0 'RTL8822BE 802.11a/b/g/n/ac WiFi adapter b822' if=wlp2s0 drv=rtw_8822be unused=rtw88_8822be,vfio-pci *Active*
- 我禁用我的以太网 NIC(它在活动时不能绑定到 DPDK)并成功绑定到 vfio-pci 驱动程序
$ ip link set enp1s0 down
$ dpdk-devbind.py -b vfio-pci enp1s0
- 现在dpdk-devbind.py显示网卡使用的是DPDK兼容驱动
$ dpdk-devbind.py --status-dev net
Network devices using DPDK-compatible driver
============================================
0000:01:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' drv=vfio-pci unused=r8169
Network devices using kernel driver
===================================
0000:02:00.0 'RTL8822BE 802.11a/b/g/n/ac WiFi adapter b822' if=wlp2s0 drv=rtw_8822be unused=rtw88_8822be,vfio-pci *Active*
- 然而,当我 运行 任何示例 DPDK 应用程序时,它说没有可用的 NIC 端口。例如我写了一个简单的应用程序
int main(int argc, char *argv[])
{
int ret;
int total_ports, avail_ports;
ret = rte_eal_init(argc, argv);
if( ret < 0 )
rte_exit(EXIT_FAILURE, "EAL initialization failed\n");
total_ports = rte_eth_dev_count_total();
avail_ports = rte_eth_dev_count_avail();
printf("ETH PORTS %d %d\n", total_ports, avail_ports);
rte_eal_cleanup();
return 0;
}
以及 rte_eth_dev_count_total() 和 rte_eth_dev_count_avail() return 0.
我做错了什么?
在您的环境中未识别 DPDK 端口的主要原因是使用中的 NIC 没有受支持的供应商轮询模式驱动程序。请 refer 列出各个供应商支持的 NIC Realtek 不在其中。
解决方法:您可以使用 PCAP PMD 来解决问题。请按照您的环境的步骤进行操作
- 确保您的以太网端口链接到内核驱动程序
r8169
- 不适合您的环境 (linux/bsd)libpacp-dev
- 使用 PCAP 支持重建 dpdk。
- 使用以下参数启动您的应用程序
--no-pci --vdev=net_pcap0,iface=enp1s0
这将使用 libpcap PMD 作为 RX 和 TX 在不受支持的 NIC 上的包装器
我正在研究 DPDK 并尝试创建一个简单的应用程序,但是它看不到绑定到 DPDK 的 NIC。
- 这是我机器上的网络设备列表
$ dpdk-devbind.py --status-dev net
Network devices using kernel driver
===================================
0000:01:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' if=enp1s0 drv=r8169 unused=vfio-pci *Active*
0000:02:00.0 'RTL8822BE 802.11a/b/g/n/ac WiFi adapter b822' if=wlp2s0 drv=rtw_8822be unused=rtw88_8822be,vfio-pci *Active*
- 我禁用我的以太网 NIC(它在活动时不能绑定到 DPDK)并成功绑定到 vfio-pci 驱动程序
$ ip link set enp1s0 down
$ dpdk-devbind.py -b vfio-pci enp1s0
- 现在dpdk-devbind.py显示网卡使用的是DPDK兼容驱动
$ dpdk-devbind.py --status-dev net
Network devices using DPDK-compatible driver
============================================
0000:01:00.0 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller 8168' drv=vfio-pci unused=r8169
Network devices using kernel driver
===================================
0000:02:00.0 'RTL8822BE 802.11a/b/g/n/ac WiFi adapter b822' if=wlp2s0 drv=rtw_8822be unused=rtw88_8822be,vfio-pci *Active*
- 然而,当我 运行 任何示例 DPDK 应用程序时,它说没有可用的 NIC 端口。例如我写了一个简单的应用程序
int main(int argc, char *argv[])
{
int ret;
int total_ports, avail_ports;
ret = rte_eal_init(argc, argv);
if( ret < 0 )
rte_exit(EXIT_FAILURE, "EAL initialization failed\n");
total_ports = rte_eth_dev_count_total();
avail_ports = rte_eth_dev_count_avail();
printf("ETH PORTS %d %d\n", total_ports, avail_ports);
rte_eal_cleanup();
return 0;
}
以及 rte_eth_dev_count_total() 和 rte_eth_dev_count_avail() return 0.
我做错了什么?
在您的环境中未识别 DPDK 端口的主要原因是使用中的 NIC 没有受支持的供应商轮询模式驱动程序。请 refer 列出各个供应商支持的 NIC Realtek 不在其中。
解决方法:您可以使用 PCAP PMD 来解决问题。请按照您的环境的步骤进行操作
- 确保您的以太网端口链接到内核驱动程序
r8169
- 不适合您的环境 (linux/bsd)libpacp-dev
- 使用 PCAP 支持重建 dpdk。
- 使用以下参数启动您的应用程序
--no-pci --vdev=net_pcap0,iface=enp1s0
这将使用 libpcap PMD 作为 RX 和 TX 在不受支持的 NIC 上的包装器