dpdk - 缺少 DPDK UDP 数据包有效负载
问题描述
我在 VirtualBox 6.1 下的 Ubuntu 20.04.1 LTS 上运行 DPDK 20.08.0-rc4。
我从 DPDK 发行版中的 l3fwd 开始。在 prepare_ptype_parser 函数中,我用以下函数替换了原始 l3fwd_lkp.cb_parse_ptype 回调
#include <rte_ether.h>
uint16_t
dump(uint16_t port_id, uint16_t queue, struct rte_mbuf *pkts[], uint16_t nb_pkts, uint16_t max_pkts, void *user_param) {
for (int i = 0; i < nb_pkts; ++i)
{
struct rte_ether_hdr *eth_hdr;
uint8_t * addr = rte_pktmbuf_mtod(pkts[i], struct rte_ether_hdr *)
->s_addr.addr_bytes;
printf("\n\npacket[%d] source %02X:%02X:%02X:%02X:%02X:%02X\n",
i, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
rte_pktmbuf_dump(stdout, pkts[i], 1500);
fflush(stdout);
}
return 0;
}
我按如下方式运行 l3fwd
sudo ./l3fwd -l 1 -n 1 -- -p 1 --config="(0,0,1)" --no-numa --parse-ptype
在一个单独的 VirtualBox Ubuntu 实例上,我使用 bash 命令生成 UDP 数据包
echo "Hello" > /dev/udp/target_ip/32768
收到的包的源mac地址是正确的,但是rte_pktmbuf_dump不包含UDP包的实际内容:
packet[0] source 08:00:27:CB:6A:0C
dump mbuf at 0x100610340, iova=0x12103c0, buf_len=2176
pkt_len=60, ol_flags=0, nb_segs=1, port=0, ptype=0
segment at 0x100610340, data=0x100610440, len=60, off=128, refcnt=1
Dump data at [0x100610440], len=60
00000000: FF FF FF FF FF FF 08 00 27 CB 6A 0C 08 06 00 01 | ........'.j.....
00000010: 08 00 06 04 00 01 08 00 27 CB 6A 0C C0 A8 64 04 | ........'.j...d.
00000020: 00 00 00 00 00 00 C0 A8 64 08 00 00 00 00 00 00 | ........d.......
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 | ............
我还注意到,对于每个回声,我的回调函数都会被调用三次,并转储相同的内容。
如何获取打包在 DPDK 中的 UDP 的有效负载?
解决方案
基于rte_pktdump_dump
,数据包类型为ARP ethtype 06 08
和IPv4 ethtype 00 08
。因此,您当前接收 IPv4 的假设是不正确的。
如果您需要系统发送 IPv4 数据包,假设您使用 Linux 作为主机,请添加静态 ARP 条目以便发送 IPv4 数据包。你可以交叉检查相同的tcpdump -Q out -nxx -i [interface]
推荐阅读
- c# - 如何在switch语句中使用字符串资源
- sql - SQL Server:连接来自两个不同数据库的两个表时出错
- r - 如何将 matlines 绘图应用于数据框列表
- iis - Blazor 服务器端 IIS 托管问题
- python - 错误:无法为使用 PEP 517 且无法直接安装的 numpy 构建轮子
- flutter - 如何访问从 StatefulWidget 到 State 类颤振的变量
- rtsp - 在 IP 摄像机中使用 RTSP URL 进行流式传输时出现一系列错误
- python - 向嵌套字典的值添加填充?
- javascript - 扩展 div 以适应屏幕
- python - 熊猫替换单元格值以匹配两个数据帧之间的索引