缺少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,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 08IPv4 ethtype 00 08。因此,您当前对接收IPv4的假设是错误的。

如果您需要系统发送IPv4数据包,假设您使用Linux作为主机,请添加静态ARP条目,以便IPv4数据包发送出去。您可以使用tcpdump -Q out -nxx -i [interface]

进行交叉检查