环境:dpdk19.11 f-stack1.21 centos7
目的:两台服务器,一台基于dpdk进行L4处理(tcp/udp)、Icmp,另一台作为对端正常使用。
使用igb_uio或者vfio驱动,程序能够收发tcp/udp包、可自定义建立tcp/udp的套接字。
能够与未绑定dpdk驱动的对端电脑,互相进行tcp/udp连接、ping。
前言:目前dpdk只提供了l3及l3以下例程,要想构建完整的协议栈,如果自己手写协议栈,难度相当大,比较成熟的方案vpp+dpdk较复杂,最终决定使用腾讯的f-stack + dpdk来构建协议栈平台。f-stack就是 dpdk提供底层处理结合用户态FreeBSD协议栈,类似胶水的作用。 这方面资料比较少,一开始搜到的资料都有点复杂,差点选择其他方案。但实际使用发现,f-stack整个工程非常小巧且易于操作,故此记录一下,以供参考。
关于版本:因为工作项目的限制,不能使用meson编译。所以选择了dpdk19.11,以及f-stack1.21。
f-stack地址 https://github.com/F-Stack/f-stack/tree/1.21
使用过程:
dpdk需要提前编译,可以参考前面的帖子。后面的安装也可以参考下面的帖子。
参考: dpdk个人学习使用全过程_地上一个猴的博客-CSDN博客_dpdk教程
1.f-stack下载解压编译安装
mkdir /home/f-stack
cd /home/f-stack
#f-stack最新版本是dev,这里选择1.21版本,手动下载到本地后进行解压安装
unzip f-stack-1.21.zip
cd f-stack-1.21
export FF_PATH=`pwd`
#dpdk的编译路径
export FF_DPDK=/home/dpdk-19.11/x86_64-native-linuxapp-gcc
make
#安装f-stack(这步不是必要的,如果只编译例程可不安装)
# libfstack.a will be installed to /usr/local/lib
# ff_*.h will be installed to /usr/local/include
# start.sh will be installed to /usr/local/bin/ff_start
# config.ini will be installed to /etc/f-stack.conf
make install
2. 切换到dpdk下,绑定端口
加载驱动 分配大页 绑定端口
参考: dpdk个人学习使用全过程_地上一个猴的博客-CSDN博客_dpdk教程
3. 运行f-stack的example
使用example编译的helloworld,运行后可以在对端进行ping包等,会在收到tcp包后回复一个html。
cd /home/f-stack/f-stack-1.21/example
cp /home/f-stack/f-stack-1.21/config.ini
修改config。config.ini很重要,ff_init的时候是根据这个文件去初始化的。
主要配置ipv4 addr、broadcast、gateway,如果要测试tcp/udp,还需要设置tcp_port、udp_port。
make
./helloworld
top查看
4. 对端可直接进行ping包测试(要确保down掉本端网卡前,对端能ping通本端地址)
5. 对端进行tcp测试
vi testtcp.py
import socket
s= socket.socket()
host = '10.10.103.133'
port = 80
s.connect((host,port))
#send_data = input('please input data:')
send_data='love&peace'
s.send(send_data.encode())
recvData = s.recv(1024).decode()
print('recv:',recvData)
s.close()
python testtcp.py
测试结果:
6.进行udp测试
vim testtcp.py
import socket
user_data="hello world"
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sk.sendto(user_data,('10.10.103.133', 8000))
sk.sendto("peace&love",('10.10.103.133', 8000))
python testtcp.py