如何解决dpdk如何禁用“ CRC剥离”,“标题拆分”,“ IP校验和卸载”和“巨型帧支持”
在旧版dpdk
中,结构rte_eth_rxmode
具有这些成员。
struct rte_eth_rxmode {
header_split = 0,/**< Header Split disabled */
hw_ip_checksum = 0,/**< IP checksum offload disabled */
hw_vlan_filter = 0,/**< VLAN filtering disabled */
jumbo_frame = 0,/**< Jumbo Frame Support disabled */
hw_strip_crc = 0,/**< CRC stripped by hardware */
...
}
但是在更新为dpdk-stable-19.11.3
之后,这些成员将被删除。根据{{3}},testpmd
应用支持命令行选项,例如--disable-crc-strip
,但它们不是EAL
命令行选项。如何禁用dpdk-stable-19.11.3
中上面列出的这五个选项?还是默认情况下禁用这些选项?如果是这样,我如何检查这些状态?
此外,结构txq_flags
的成员变量rte_eth_txconf
也从dpdk-stable-19.11.3
中删除。如何在dpdk-stable-19.11.3
中进行设置?
我很久没有使用dpdk
了。它已经发生了很大的变化,我正在努力应对这些变化。有什么建议来应对这些变化吗?
解决方法
使用DPDK 19.11.3,可以通过任意编辑以编程方式启用所需的功能(crc-keep,jumbo,ipv4-cksum和标头拆分)
default configuration as
static struct rte_eth_conf port_conf = {
.rxmode = {
.max_rx_pkt_len = JUMBO_FRAME_MAX_SIZE,.split_hdr_size = 0,.offloads = DEV_RX_OFFLOAD_JUMBO_FRAME | DEV_RX_OFFLOAD_KEEP_CRC | DEV_RX_OFFLOAD_IPV4_CKSUM | DEV_RX_OFFLOAD_HEADER_SPLIT,},.txmode = {
.mq_mode = ETH_MQ_TX_NONE,}
};
或通过以下方式获取和比较功能来修改port_init
中的卸载功能
port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME | DEV_RX_OFFLOAD_HEADER_SPLIT | DEV_RX_OFFLOAD_KEEP_CRC | DEV_RX_OFFLOAD_IPV4_CKSUM;
注意:少数NIC支持DEV_RX_OFFLOAD_HEADER_SPLIT
的功能,因此很有可能在port_init中失败。使用http://doc.dpdk.org/guides/nics/overview.html作为卸载功能的通用指南。
使用https://doc.dpdk.org/guides/testpmd_app_ug/run_app.html#eal-command-line-options启用testpmd中的功能
-
--max-pkt-len=[size]
-启用巨型 -
--disable-crc-strip
-防止crc剥离 -
--enable-rx-cksum
-启用硬件校验和(即使是IPv4校验和)
注意:关于DEV_RX_OFFLOAD_HEADER_SPLIT似乎没有添加到testpmd中,因为没有多少NIC PMD支持它。
如果NIC PMD不支持某些功能,则可能会出现诸如以下的错误消息
Ethdev port_id=0 requested Rx offloads 0x2000e doesn't match Rx offloads capabilities 0x92e6f in rte_eth_dev_configure()
为了获得更多描述,请运行--log-level=pmd,8
是的,在DPDK版本19.11中,使用unit64_t offloads
中的单个成员字段struct rte_eth_rxmode
启用了硬件卸载,这与旧版DPDK版本中的各个卸载参数不同。
另一方面,根据配置,19.11中的hardware offloads分为每个端口和每个队列卸载。例如,用户可以设置每个端口和每个队列的分流,可以使用rte_eth_dev_info_get()
来获取设备支持的卸载。
如下所示,offloads
和struct rte_eth_rxmode
中的struct rte_eth_rxconf
字段分别用于设置每个端口和每个队列的卸载量。
struct rte_eth_rxmode {
...
/**
* Per-port Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
* Only offloads set on rx_offload_capa field on rte_eth_dev_info
* structure are allowed to be set.
*/
uint64_t offloads;
...
};
struct rte_eth_rxconf {
...
/**
* Per-queue Rx offloads to be set using DEV_RX_OFFLOAD_* flags.
* Only offloads set on rx_queue_offload_capa or rx_offload_capa
* fields on rte_eth_dev_info structure are allowed to be set.
*/
uint64_t offloads;
...
};
注意:可使用此处定义的宏的DEV_RX_OFFLOAD_*
标志-Rx offload capabilities of a device
对于testpmd,您可以通过DEV_RX_OFFLOAD_*
标志将卸载设置为位掩码,如下所示,前提是设备支持该功能,
--rx-offloads=0xXXXXXXXX: hexadecimal bitmask of RX queue offloads
--tx-offloads=0xXXXXXXXX: hexadecimal bitmask of TX queue offloads
我很久没有使用dpdk了。它已经发生了很大的变化,我正在努力应对这些变化。有什么建议来应对这些变化吗?
我建议您应该通过邮件列表(dev@dpdk.org)注册dpdk开发,以了解上游补丁/更新。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。