基于dpdk19.11和f-stack构建协议栈

发布于:2022-10-17 ⋅ 阅读:(736) ⋅ 点赞:(0)

环境: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

 


网站公告

今日签到

点亮在社区的每一天
去签到