出现这个问题可能是因为该设备上的所有网口都处于混杂模式下,如果混杂模式下的网卡超过了一个,则会出现段错误。可以通过将某些网卡设置为非混杂模式来解决这个问题。具体方法如下:
1.在初始化EAL(Environment Abstraction Layer,环境抽象层)时,可以使用--no-pci或--pci-whitelist选项来指定与vmxnet3,如下所示:
./your_app --no-pci --vdev=net_vmxnet3_x,iface=ens33 \
--vdev=net_vmxnet3_y,iface=ens32
上面的代码指定了使用两个vmxnet3设备,一个使用ens33的MAC地址,另一个使用ens32的MAC地址。
2.在DPDK应用程序的主要函数中,可以指定将某些网卡设置为非混杂模式。使用rte_eth_promiscuous_disable()函数即可,具体如下:
static void
dpdk_main_loop(void)
{
uint16_t portid;
for (portid = 0; portid < nb_ports; portid++)
{
rte_eth_promiscuous_disable(portid);
...
}
}
上述代码会将所有网口都设置为非混杂模式,防止出现段错误。
3.另外,也可以在DPDK应用程序中添加一些额外的代码来处理混杂模式下的包,比如使用rte_eth_rx_burst()函数接收并处理网卡上的所有包,代码如下:
while (1)
{
uint16_t portid;
for (portid = 0; portid < nb_ports; portid++)
{
struct rte_mbuf *pkts_burst[RTE_PORT_IN_BURST_SIZE_MAX];
const uint16_t nb_rx = rte_eth_rx_burst(portid, 0, pkts_burst, RTE_PORT_IN_BURST_SIZE_MAX);
// Handle the received packets
...
}
}
上述代码会强制接收所有网口上的所有包,并通过另一个函数进行进一步处理。