dpdk Rx TCP 校验和失败

dpdk Rx TCP checksum failed

我正在使用 DPDK 中的校验和卸载功能,但它在虚拟机下无法正常工作。 虚拟端口只支持TCP校验,不支持IP校验。

所以我配置 rxmode.offload txmode.offloads 如下:

rxmode.offloads = DEV_RX_OFFLOAD_TCP_CKSUM 
txmode.offloads = DEV_TX_OFFLOAD_TCP_CKSUM
... ...
rte_eth_dev_configure()

对于TX,我设置了如下参数,效果不错

mbuf->l2_len = sizeof(*ethhdr)
mbuf->l3_len = ip header len
mbuf-ol_flags = RTE_MBUF_F_TX_IPV4 | RTE_MBUF_F_TX_TCP_CKSUM

对于RX,会执行以下代码:

 In drivers/net/virtio/virtio_rxtx.c  virtio_rx_offload function :
 929     if (hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
 930         hdrlen = hdr_lens.l2_len + hdr_lens.l3_len + hdr_lens.l4_len;
 931         if (hdr->csum_start <= hdrlen && l4_supported) {
 932             m->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_NONE;
 933         } else {
                ...  ...
 952         }
 953     } else if (hdr->flags & VIRTIO_NET_HDR_F_DATA_VALID && l4_supported) {
 954         m->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_GOOD;
 955     }

hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM 为真(第 929 行)

hdrlen = 54

hdr->csum_start = 34

所以 m->ol_flags = RTE_MBUF_F_RX_L4_CKSUM_NONE(第 932 行)

这导致 rx 校验和失败。

我认为代码应该输入第 953 行而不是第 929 行,但我不知道 hdr->flags 在哪里设置为 VIRTIO_NET_HDR_F_NEEDS_CSUM。

dpdk 版本为 21.11

根据最初的 commitRX_L4_CKSUM_NONE 有助于涵盖 virtio / vhost 用例并指出“数据包 中的校验和可能 是错误的,但数据完整性有效。

我从这个解释中得出的结论是,由于这个特定用例的性质,确认“数据完整性”是可能的,但是,由于没有进行校验和验证(不重新计算值),因此不能设置 RX_L4_CKSUM_GOODRX_L4_CKSUM_BAD。因此 RX_L4_CKSUM_NONE.

也许向应用程序添加 rte_ipv4_udptcp_cksum_verify() 调用的打印输出(临时)是值得的。如果它报告校验和有效,那么上面的解释应该证明是正确的(没有校验和失败)。