82599ES 光口无法通过大包的问题记录

在使用DPDK的ip_fragment.c示例程序时,遇到82599ES光口无法发送大包的问题。经过分析,怀疑是驱动的发包函数不支持多segment报文。通过查看驱动类型和发包函数,确定问题在于ixgbe_xmit_pkts_vec。通过修改设置,使用ixgbe_xmit_pkts函数,解决了offload和多segment报文发送的问题。
摘要由CSDN通过智能技术生成

问题

参考 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值