DPDK应用中网卡不可用

NIC is unavailable in DPDK application

我正在研究 DPDK 并尝试创建一个简单的应用程序,但是它看不到绑定到 DPDK 的 NIC。

  1. 这是我机器上的网络设备列表
$ 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*
  1. 我禁用我的以太网 NIC(它在活动时不能绑定到 DPDK)并成功绑定到 vfio-pci 驱动程序
$ ip link set enp1s0 down
$ dpdk-devbind.py -b vfio-pci enp1s0
  1. 现在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*
  1. 然而,当我 运行 任何示例 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 来解决问题。请按照您的环境的步骤进行操作

  1. 确保您的以太网端口链接到内核驱动程序r8169
  2. 不适合您的环境 (linux/bsd)libpacp-dev
  3. 使用 PCAP 支持重建 dpdk。
  4. 使用以下参数启动您的应用程序 --no-pci --vdev=net_pcap0,iface=enp1s0

这将使用 libpcap PMD 作为 RX 和 TX 在不受支持的 NIC 上的包装器