【问题标题】:No DPDK packet fragmentation supported in Mellanox ConnectX-3?Mellanox ConnectX-3 不支持 DPDK 数据包分段?
【发布时间】:2018-09-20 20:05:50
【问题描述】:

您好 Stackoverflow 专家,

我在 Mellanox NIC 上使用 DPDK,但在应用数据包时遇到了困难 DPDK 应用程序中的碎片。

sungho@c3n24:~$ lspci | grep Mellanox
81:00.0 Ethernet controller: Mellanox Technologies MT27500 Family
[ConnectX-3]

dpdk 应用程序(l3fwd,ip-fragmentation,ip-assemble)没有 将接收到的数据包识别为 ipv4 标头。

起初,我在发送 ipv4 标头时制作了自己的数据包,所以我 假设我以错误的方式制作数据包。

所以我使用了 DPDK-pktgen 但 dpdk-application (l3fwd, ip-fragmentation, ip-assemble) 无法识别 ipv4 标头。 作为最后的手段,我测试了 dpdk-testpmd,并在 状态信息。

********************* Infos for port 1 *********************
MAC address: E4:1D:2D:D9:CB:81
Driver name: net_mlx4
Connect to socket: 1
memory allocation on the socket: 1
Link status: up
Link speed: 10000 Mbps
Link duplex: full-duplex
MTU: 1500
Promiscuous mode: enabled
Allmulticast mode: disabled
Maximum number of MAC addresses: 127
Maximum number of MAC addresses of hash filtering: 0
VLAN offload:
strip on
filter on
qinq(extend) off
No flow type is supported.
Max possible RX queues: 65408
Max possible number of RXDs per queue: 65535
Min possible number of RXDs per queue: 0
RXDs number alignment: 1
Max possible TX queues: 65408
Max possible number of TXDs per queue: 65535
Min possible number of TXDs per queue: 0
TXDs number alignment: 1
testpmd> show port

根据 DPDK 文档。 在端口 1 的信息状态的流类型中应该显示,但我的显示 不支持流类型。 下面的例子应该是需要在流类型中显示的:

Supported flow types:
ipv4-frag
ipv4-tcp
ipv4-udp
ipv4-sctp
ipv4-other
ipv6-frag
ipv6-tcp
ipv6-udp
ipv6-sctp
ipv6-other
l2_payload
port
vxlan
geneve
nvgre

那么是我的网卡,Mellanox Connect X-3 不支持 DPDK IP 分片吗?或者是 在尝试数据包分片之前需要进行其他配置吗?

-- [编辑] 所以我检查了来自 DPDK-PKTGEN 的数据包和 DPDK 应用程序接收到的数据包。 我收到的数据包正是我从应用程序发送的数据包。 (我得到正确的数据)

问题从代码开始

struct rte_mbuf *pkt
RTE_ETH_IS_IPV4_HDR(pkt->packet_type) 

这决定了数据包是否是 ipv4。 并且 pkt->packet_type 的值在 DPDK-PKTGEN 和 DPDK 应用程序中都为零。如果 pkt-packet_type 为零,则 DPDK 应用程序将此数据包视为 NOT IPV4 标头。

这个基本类型检查器从一开始就是错误的。 所以我认为要么是 DPDK 样本是错误的,要么是 NIC 由于某种原因不能支持 ipv4。

我收到的数据在开始时有一些模式,我收到了正确的消息,但在那之后的数据包序列在 MAC 地址和数据偏移量之间有不同的数据

所以我假设他们对数据的解释不同,并得到了错误的结果。

【问题讨论】:

    标签: dpdk


    【解决方案1】:

    我很确定任何 NIC,包括 Mellanox ConnectX-3 都必须支持 ip 片段。

    您所指的流类型适用于 Flow Director,即将特定流映射到特定 RX 队列。即使您的 NIC 不支持 flow director,IP 分片也没关系。

    我猜设置或应用程序中存在错误。你写道:

    dpdk 应用程序没有将接收到的数据包识别为 ipv4 标头。

    我会更仔细地研究一下。尝试使用dpdk-pdump 转储这些数据包,甚至只需使用rte_pktmbuf_dump() 在控制台上转储接收数据包

    如果您仍然怀疑 NIC,最好的选择是暂时用其他品牌或虚拟设备替换它。只是为了确认它确实是 NIC。

    编辑:

    查看mlx4_ptype_table 的分段IPv4 数据包,它应该返回packet_type 设置为RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN | RTE_PTYPE_L4_FRAG

    请注意,该功能是在 DPDK 17.11 中添加的。

    我建议您在控制台上转储pkt->packet_type 以确保它确实为零。还要确保您安装了最新的libmlx4

    【讨论】:

    • 感谢您的回复,但问题是我尝试了 rte_pktmbuf_dump() 但我不知道正确的数据包是什么,因为我没有任何有效的示例。我尝试使用 testpmd 进行测试,但根本没有 ipv4 数据包发送选项(只有 mac 地址),所以我不知道应该如何正确制作 ipv4 标头。
    • 是的,我认为 testpmd 无法生成 ipv4 数据包,只有 DPDK-pktgen 可以。所以正如你所说,我唯一的选择是查看数据包,但最大的问题是我不知道正确的格式是什么。我将再次检查 pktgen 并找出 ipv4 数据包的完整版本,然后尝试制作类似的东西。
    • 那么你怎么知道“dpdk 应用程序没有将接收到的数据包识别为 ipv4 标头”?也许它是无效的 MAC,您只需要修复它或将 NIC 置于混杂模式?
    • 不,我肯定有正确的 MAC 地址。对于那部分,我非常确定,我可以发送和接收消息,我正在比较从 PKTGEN 和 DPDK 应用程序发送的数据包。正如您所预测的那样,l2 标头和数据偏移量之间有些不同。 (我认为它是 l3 标头)
    • @SunghoHong 仍然不清楚您认为pkt->packet_type 是零还是您检查过?转储上的数据包肯定是 IPv4 数据包。所以看起来数据包类型信息在某处丢失了。请查看我的更新答案。
    猜你喜欢
    • 2020-04-09
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多