DPDK UDP 数据包负载丢失
DPDK UDP packet payload missing
我在 VirtualBox 6.1 下的 Ubuntu 20.04.1 LTS 上 运行ning 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的payload?
基于rte_pktdump_dump
,数据包类型为ARP ethtype 06 08
和IPv4 ethtype 00 08
。因此,您当前接收 IPv4 的假设是不正确的。
如果您需要系统发送 IPv4 数据包,假设您使用 Linux 作为主机,请添加静态 ARP 条目以便 IPv4 数据包发送出去。你可以用 tcpdump -Q out -nxx -i [interface]
交叉检查
我在 VirtualBox 6.1 下的 Ubuntu 20.04.1 LTS 上 运行ning 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的payload?
基于rte_pktdump_dump
,数据包类型为ARP ethtype 06 08
和IPv4 ethtype 00 08
。因此,您当前接收 IPv4 的假设是不正确的。
如果您需要系统发送 IPv4 数据包,假设您使用 Linux 作为主机,请添加静态 ARP 条目以便 IPv4 数据包发送出去。你可以用 tcpdump -Q out -nxx -i [interface]