【问题标题】:Why is udp packet, sent by dpdk, received with zero'd payload?为什么 dpdk 发送的 udp 数据包接收到的有效载荷为零?
【发布时间】:2020-07-01 10:16:34
【问题描述】:

我在 Centos 7 上运行 dpdk-stable-18.11.8。我的测试代码将带有简单有效负载字符串“Hello from dpdk”的 udp 数据包传输到远程主机。

在传输之前,mbuf 的转储如下所示:

dump mbuf at 0x53e4e92c0, iova=73e4e9340, buf_len=2176
  pkt_len=57, ol_flags=c0000000000000, nb_segs=2, in_port=65535
  segment at 0x53e4e92c0, data=0x53e4e9396, data_len=42
  Dump data at [0x53e4e9396], len=42
00000000: 94 40 C9 1F C4 DB 94 40 C9 1E 13 7D 08 00 45 B8 | .@.....@...}..E.
00000010: 00 2B 00 00 00 00 40 11 F5 E8 C0 A8 01 69 C0 A8 | .+....@......i..
00000020: 01 68 0B B9 0B B8 00 17 64 2D |  |  |  |  |  |  | .h......d-
  segment at 0x53e146e40, data=0x53e4fbbc0, data_len=15
  Dump data at [0x53e4fbbc0], len=15
00000000: 48 65 6C 6C 6F 20 66 72 6F 6D 20 64 70 64 6B |  | Hello from dpdk

使用命令运行 tcpdump:

tcpdump -A -nni eno2 src 192.168.1.105 -vv -X

在远程主机上产生:

10:44:33.022538 IP (tos 0xb8, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 43)
    192.168.1.105.3001 > 192.168.1.104.3000: [udp sum ok] UDP, length 15
        0x0000:  45b8 002b 0000 0000 4011 f5e8 c0a8 0169  E..+....@......i
        0x0010:  c0a8 0168 0bb9 0bb8 0017 642d 0000 0000  ...h......d-....
        0x0020:  0000 0000 0000 0000 0000 0000 0000       ..............

所以 udp 数据包到达但有效载荷全为零。

(发送方为 192.168.1.105,接收方为 192.168.1.104)。

这是我的代码的 sn-p,它将 udp 和 ip 标头添加到发送器中的 mbuf 的空间:

p_udp_hdr = (struct udp_hdr*)rte_pktmbuf_prepend(ptMbuf, (uint16_t)sizeof(struct udp_hdr));
p_ip_hdr  = (struct ipv4_hdr*)rte_pktmbuf_prepend(ptMbuf, (uint16_t)sizeof(struct ipv4_hdr));

我不知道去哪里找,因为代码改编自另一个项目的工作代码。可能相关的是,在另一个项目中,校验和是由 NIC 生成的,但在这个项目中,我已经在软件中计算了它们;但是 tcpdump 说校验和是正确的。

任何建议将不胜感激。

【问题讨论】:

  • 嗨 @DavidA 要求您检查 dev_configure TX 卸载标志以了解多段行为。

标签: dpdk


【解决方案1】:

您需要按照指示在 eth_dev 配置中启用多段 下面:

.txmode = {                                                                                                                                                                                                                                                                  
    .offloads = DEV_TX_OFFLOAD_MULTI_SEGS,                                                                                                                                                                                                                               },           

[EDIT-1] 还在评论中分享了“嗨@DavidA,要求您检查 dev_configure TX 卸载标志以了解多段行为。 '。

【讨论】:

    【解决方案2】:

    我相信您的问题至少有一部分是,虽然您修改了数据包中的 pkt_len 字段以反映您添加的有效负载,但 data_len 仍然只有 42 个字节。这只是 L2-4 标头的长度。您还想在那里为您的有效负载添加空间。

    另外,我注意到你的数据包中的 nb_segs 字段是 2,表明你有一个数据包链。你?我不认为这个错误会导致您看到的问题,但无论如何,这可能是您想要解决的问题。

    [EDIT-2] 问题是因为 PKT_TX_MSEGS 未在应用程序中更新。反映在上面的答案和评论Hi @DavidA requesting you to check the dev_configure TX offload flag for multi-segment behaviour. – Vipin Varghese Jul 2 '20 at 12:13

    【讨论】:

    • 感谢您的帮助。我对 dpdk 了解不多,但我认为我有两个段可能没问题,因为 mbuf 最初只包含有效负载(15 个字符),然后我添加了以太网和 L3 标头(额外的 42 个字节)。所以总长度是 57 个字符,这是正确的。也许第一个(有效负载)段没有被传输?
    • 好的,所以你确实有一个数据包链。鉴于此,我不明白你为什么要假装。您是否在带有有效负载的数据包上调用 rte_pktmbuf_prepend() ?如果是这样,您将数据指针向上移动 sizeof(IP header + UDP header) 在您的内容前面,这就是您的问题。
    • 是的,这就是我正在做的事情:将有效负载放在 mbuf 中,然后添加 udp 标头并添加 ip 标头。在我关注的示例(内部代码)中,这似乎工作正常。你说这是错的吗?您知道一个说明如何正确执行此操作的示例吗?
    • 有两种方法: 1. 只需一个数据包,其中包含标头和有效负载。如果您从仅包含有效负载的 mbuf 开始,则应为标头添加空间,将它们与内容放在相同的 mbuf 中,然后发送。 2. 有一个带有标头的数据包和第二个带有有效负载的数据包。只需在一个 mbuf 中写入标头,在另一个中写入有效负载,将它们链接起来并发送。感觉好像你在这两者之间。因此,您有一个带有标头的数据包和一个带有内容的数据包,但是您已经在内容之前添加了一个,因此您从 mbuf 中较早的 42 个字节的位置读取
    • @SynAckRst 答案共享不正确,您能否跨过传输多段所需的 TX_OFFLOAD 标志?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2012-05-20
    相关资源
    最近更新 更多