为什么 dpdk 发送的 udp 数据包接收到的负载为零?
Why is udp packet, sent by dpdk, received with zero'd payload?
我在 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)
这是我的代码片段,将 udp 的 space 和 ip headers 添加到发射器中的 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 说校验和是正确的。
如有任何建议,我们将不胜感激。
我相信你的问题至少有一部分是,虽然你修改了数据包中的 pkt_len 字段以反映你添加的有效负载,但 data_len 仍然只有 42 字节.那只是你的 L2-4 headers 的长度。您还想为您的有效负载添加 space。
另外,我注意到你的数据包中的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
您需要按照指示在 eth_dev 配置中启用多段
以下:
.txmode = {
.offloads = DEV_TX_OFFLOAD_MULTI_SEGS, },
[EDIT-1] 也在评论中分享 'Hi @DavidA requesting you to check the dev_configure TX offload flag for multi-segment behaviour. '。
我在 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)
这是我的代码片段,将 udp 的 space 和 ip headers 添加到发射器中的 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 说校验和是正确的。
如有任何建议,我们将不胜感激。
我相信你的问题至少有一部分是,虽然你修改了数据包中的 pkt_len 字段以反映你添加的有效负载,但 data_len 仍然只有 42 字节.那只是你的 L2-4 headers 的长度。您还想为您的有效负载添加 space。
另外,我注意到你的数据包中的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
您需要按照指示在 eth_dev 配置中启用多段 以下:
.txmode = {
.offloads = DEV_TX_OFFLOAD_MULTI_SEGS, },
[EDIT-1] 也在评论中分享 'Hi @DavidA requesting you to check the dev_configure TX offload flag for multi-segment behaviour. '。