DPDK 示例应用程序 ipsec-secgw 因 virtio NIC 失败

问题描述

我尝试使用以下版本运行 DPDK ipsec-secgw 示例应用

  • DPDK 版本 dpdk-stable-19.11.5
  • 操作系统 CentOS Linux 版本 7.7.1908(核心)
  • 内核 3.10.0-1062.el7.x86_64

网卡类型和驱动

  • 0000:00:04.0 'Virtio 网络设备 1000' drv=igb_uio 未使用=virtio_pci,uio_pci_generic

用于运行应用程序的命令和 cmd 行参数

./build/ipsec-secgw -l 6 -w 00:04.0 -w 00:05.0 --vdev "crypto_null" --log-level 8 \
--socket-mem 1024 -- -p 0xf -P -u 0x2 \
--config="(0,6),(1,6)" -f /root/config_file

输出

EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probing VFIO support...
EAL: PCI device 0000:00:04.0 on NUMA socket -1
EAL:   Invalid NUMA socket,default to 0
EAL:   probe driver: 1af4:1000 net_virtio
EAL: PCI device 0000:00:05.0 on NUMA socket -1
EAL:   Invalid NUMA socket,default to 0
EAL:   probe driver: 1af4:1000 net_virtio
CRYPTODEV: Creating cryptodev crypto_null

CRYPTODEV: Initialisation parameters - name: crypto_null,socket id: 0,max queue pairs: 8
Promiscuous mode selected
librte_ipsec usage: disabled
replay window size: 0
ESN: disabled
SA flags: 0
Frag TTL: 10000000000 ns
Allocated mbuf pool on socket 0
CRYPTODEV: elt_size 64 is expanded to 176

Allocated session pool on socket 0
Allocated session priv pool on socket 0
Configuring device port 0:
Address: 52:54:00:A5:82:2D
Creating queues: nb_rx_queue=1 nb_tx_queue=1...
EAL: Error - exiting with code: 1
  Cause: Error: port 0 required RX offloads: 0xe,avaialbe RX offloads: 0xa1d

配置文件内容

#SP IPv4 rules
sp ipv4 out esp protect 1005 pri 1 dst 192.168.105.0/24 sport 0:65535 dport 0:65535

#SA rules
sa out 1005 aead_algo aes-128-gcm aead_key 2b:7e:15:16:28:ae:d2:a6:ab:f7:15:88:09:cf:4f:3d:de:ad:be:ef \
mode ipv4-tunnel src 172.16.1.5 dst 172.16.2.5 \
port_id 1 \
type inline-crypto-offload \

sa in 5 aead_algo aes-128-gcm aead_key 2b:7e:15:16:28:ae:d2:a6:ab:f7:15:88:09:cf:4f:3d:de:ad:be:ef \
mode ipv4-tunnel src 172.16.1.5 dst 172.16.2.5 \
port_id 1 \
type inline-crypto-offload \

#Routing rules
rt ipv4 dst 172.16.2.5/32 port 1
rt ipv4 dst 192.168.105.10/32 port 0

它表示缺少某些卸载功能

我从 Niantic NIC 的 DPDK 测试计划中获得了配置文件详细信息和命令行参数。该应用程序是否仅适用于 Niantic PF/VF。有没有办法让它与 virtio 半虚拟化 NIC 一起工作?

说明链接如下: Instructions

解决方法

DPDK 示例 ipsec-gw 使用 RX 卸载 .offloads = DEV_RX_OFFLOAD_CHECKSUM。对于 DPDK 19.11.5 LTS,以下是支持相同的设备列表

axgbe       
dpaa2       
e1000       
enic        
hinic       
ixgbe       
mlx4        
mlx5        
mvneta      
mvpp2       
netvsc      
octeontx    
octeontx2   
sfc         
tap         
thunderx    
thunderx    
vmxnet3     

DPDK RX 校验和卸载定义为 #define DEV_RX_OFFLOAD_CHECKSUM (DEV_RX_OFFLOAD_IPV4_CKSUM | DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM)。根据错误日志 Cause: Error: port 0 required RX offloads: 0xe,available RX offloads: 0xa1d,看起来 PMD 中不存在 DEV_RX_OFFLOAD_IPV4_CKSUM

对于问题ipsec-gw 仅适用于 Niantic NIC 假设不正确。因为 IPSEC-GW 应用程序可以运行任何具有 RX 卸载校验和可用的 NIC。列表在上面共享。

对于这个问题有没有办法让它与 virtio 半虚拟化 NIC 一起工作?可以总是禁用 RX_CHECKSUM 并在软件中执行 IPv4 的校验和 .但是您需要编辑应用程序并使用 rte_ip_cksum

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...