首页 > 解决方案 > 缺少 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 的有效负载?

标签: dpdk

解决方案


基于rte_pktdump_dump,数据包类型为ARP ethtype 06 08IPv4 ethtype 00 08。因此,您当前接收 IPv4 的假设是不正确的。

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


推荐阅读