问题描述
我在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,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 | ............
我还注意到,对于每个回显,我的回调函数都会被调用三次,并转储相同的内容。
解决方法
基于rte_pktdump_dump
,数据包类型为ARP ethtype 06 08
和IPv4 ethtype 00 08
。因此,您当前对接收IPv4的假设是错误的。
如果您需要系统发送IPv4数据包,假设您使用Linux作为主机,请添加静态ARP条目,以便IPv4数据包发送出去。您可以使用tcpdump -Q out -nxx -i [interface]