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
根据最初的 commit,RX_L4_CKSUM_NONE
有助于涵盖 virtio / vhost 用例并指出“数据包 中的校验和可能 是错误的,但数据完整性有效。
我从这个解释中得出的结论是,由于这个特定用例的性质,确认“数据完整性”是可能的,但是,由于没有进行校验和验证(不重新计算值),因此不能设置 RX_L4_CKSUM_GOOD
或 RX_L4_CKSUM_BAD
。因此 RX_L4_CKSUM_NONE
.
也许向应用程序添加 rte_ipv4_udptcp_cksum_verify()
调用的打印输出(临时)是值得的。如果它报告校验和有效,那么上面的解释应该证明是正确的(没有校验和失败)。
我正在使用 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
根据最初的 commit,RX_L4_CKSUM_NONE
有助于涵盖 virtio / vhost 用例并指出“数据包 中的校验和可能 是错误的,但数据完整性有效。
我从这个解释中得出的结论是,由于这个特定用例的性质,确认“数据完整性”是可能的,但是,由于没有进行校验和验证(不重新计算值),因此不能设置 RX_L4_CKSUM_GOOD
或 RX_L4_CKSUM_BAD
。因此 RX_L4_CKSUM_NONE
.
也许向应用程序添加 rte_ipv4_udptcp_cksum_verify()
调用的打印输出(临时)是值得的。如果它报告校验和有效,那么上面的解释应该证明是正确的(没有校验和失败)。