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()来获取设备支持的卸载。

如下所示,offloadsstruct 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了。它已经发生了很大的变化,我正在努力应对这些变化。有什么建议来应对这些变化吗?

我建议您应该通过邮件列表([email protected])注册dpdk开发,以了解上游补丁/更新。