相关文章推荐
八块腹肌的盒饭  ·  中文信息·  6 月前    · 
豪气的枕头  ·  vscode 删除匹配行-掘金·  1 年前    · 
阳刚的橙子  ·  深度掌握java stream ...·  2 年前    · 

DPDK技术系统学习一(接收,发送,arp,icmp功能测试)

如何技术不去手动做练习实践,就总有一种无从下手的感觉

文末附上小编总结的 DPDK 学习路线图 以及我的学习资料。

0:准备环境并启动,使用dpdk接管其中一个网卡。

ubuntu虚拟机环境配置多队列网卡,安装dpdk。

在环境已经配置ok的前提下,每次重启环境后需要重新配置环境变量,并且绑定网卡。

export RTE_SDK=/home/hlp/dpdk/dpdk-stable-19.08.2
export RTE_TARGET=x86_64-native-linux-gcc
ifconfig    #注意保存要绑定的网卡的ip和mac地址,理解是mac地址比较重要
#这里我dpdk要绑定eth0网卡,其对应的ip和mac为  192.168.50.59和00-0c-29-4d-f0-d3
sudo ifconfig eth0 down  #关闭要绑定的网卡
./usertools/dpdk-setup.sh #通过脚本绑定网卡,使dpdk接管网卡数据。 这里用49

1:测试dpdk接管网卡数据,测试对udp数据的接收。

1:描述预计准备

通过第0步,dpdk已经接管了网卡,个人理解是这里与mac地址。==》dpdk接管网卡

获取老师提供的已有的基于dpdk实现的测试接收功能的demo代码。==》准备demo

demo实现原理 ==》通过dpdk提供的接口获取到网卡数据,对数据进行过滤,观察udp数据

参考dpdk examples目录,用makefile进行编译。 ===》编译测试代码,使用make命令

查看生成的可执行文件,目录如下:

root@ubuntu:/home/hlp/dpdk/dpdk-stable-19.08.2/examples/01_recv# tree
├── build					#这个目录都是编译生成的相关文件
│   ├── app
│   │   ├── dpdk_recv
│   │   └── dpdk_recv.map
│   ├── dpdk_recv			#生成的可执行文件
│   ├── dpdk_recv.map
│   ├── _install
│   ├── _postbuild
│   ├── _postinstall
│   ├── _preinstall
│   └── recv.o
├── Makefile				#编译makefile配置文件
└── recv.c					#我们的demo代码
2 directories, 12 files

运行测试进行查看,

===》网卡接收到的数据过多

===》使用测试代码对接收到数据进行过滤,解析udp的相关数据,通过打印观察现象,

===》运行测试demo,使用串口调试工具模拟udp的发送,观察demo打印信息。

2:正确测试结果如下:

1:测试demo运行如下:

root@ubuntu:/home/hlp/dpdk/dpdk-stable-19.08.2/examples/01_recv# ./build/dpdk_recv 
EAL: Detected 8 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:03:00.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 15ad:7b0 net_vmxnet3

2:启动网络调试助手进行数据发送测试:==》中间可能有发送不成功,下文分析

描述:

====》从图中可以看到,测试发送后,基于dpdk实现的测试demo运行ok

====》demo可以正常接收到我们的数据,并正常分析出我们的报文中的原ip,目的ip,以及发送内容

遗留问题:

====》 这里的端口打印可能有问题,后期通过自己实现解决

====》这里除了接收我们的消息外,还会接收到相关其他的udp数据,为什么?

3:测试中流程分析:

我的测试场景是:使用物理机+虚拟机(linux环境进行测试)

在物理机上用串口模拟工具下发,目标ip填写的是上文保存的dpdk 绑定网卡前的ip,端口随机。

使用串口工具进行测试时,会发现必然无法发送成功的场景,这是因为这里的发送ip没有找到对应的arp表。

分析:

===》要想在物理机发送给虚拟机的链路ok,需要arp表的支持。

===》ip其实是可变的,mac地址(唯一)是寻址的关键,需要配置arp表。

===》配置arp表需要关注,arp -a查出的arp表是多个接口有对应关系,需要配置arp表在对应的接口上。

配置arp表的相关命令如下:

#注意  这里一定要保存对dpdk绑定的网卡的mac地址
# 查看arp 表 
arp -a
#使用arp命令进行添加 ==》还是不生效,没添加在对应接口中
arp -s 192.168.50.59 00-0c-29-4d-f0-d3
arp -d 192.168.50.59 
#使用netsh进行arp的绑定
#1:找到 网线或者网卡对应的idx 
netsh i i show in
#2: 绑定网卡和解绑命令(这里使用有线网或者以太网) 16是查找到的网卡对应的idx值