问题
参考 DPDK 例子程序 ip_fragment.c 来实现分片。
无论 I350 电口 还是 82599ES 光口,小包都是可以通过的。
但是在大包的时候,82599ES 光口就有问题。
场景 | I350 电口 | 82599ES 光口 |
---|---|---|
启用 tx checksum offload | 小包可以通过 | 小包可以通过 |
启用 tx checksum offload | 小包可以通过 | 小包可以通过 |
启用 tx checksum offload | 大包可以通过 | 大包不可以通过 |
不用 tx checksum offload,CPU 填充 checksum | 大包可以通过 | 大包不可以通过 |
分析
由于使用了 CPU 填充 checksum 也有问题。所以排除 tx checksum offload 的问题。
因为 DPDK 后的报文,会由多个 segment 组成,所以怀疑 82599ES 光口 的发包函数不支持 多 segment 的 报文发送。
所以要查看发包函数。
查看驱动类型
# get 82599ES pci address
lspci | grep Eth
> 08:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
# get 82599ES device id
cat /sys/bus/pci/devices/0000:08:00.0/device
> 0x10fb
从 0x10fb 得出 82599ES 的 设置类型为 IXGBE_DEV_ID_82599_SFP
,所以 82599ES 使用的是 ixgbe 的驱动。
查看发包函数
ixgbe 的驱动的 发包函数有三个。
发包函数 | 描述 |
---|---|
ixgbe_xmit_pkts_vec | 万兆 Rx Vector enabled |
ixgbe_xmit_pkts_simple | 万兆 Tx simple |
ixgbe_xmit_pkts | 万兆 默认发包函数 |
使用 gdb 对以上函数来打断点。确认当前的是 ixgbe_xmit_pkts_vec 发包函数。
发包函数的设置
查看驱动的 ixgbe_set_tx_function 函数的代码。发现不同发包函数原来是有区别的:
ixgbe_set_tx_function(struct rte_eth_dev *dev, struct ixgbe_tx_queue *txq)
{
/* Use a simple Tx queue (no offloads, no multi segs) if possib