这是一个基于DPDK(Data Plane Development Kit)实现的高性能弹性网络协议栈项目,支持EDRP/TCP/UDP协议,并实现了基本的网络功能。
- 基于DPDK的高性能数据包处理
- TCP/UDP协议支持
- ARP协议实现
- 支持大页内存配置
- 网卡DPDK模式绑定
- Linux操作系统(推荐Ubuntu 20.04或更高版本)
- DPDK 21.11或更高版本
- gcc编译器
- make工具
- 支持DPDK的网卡
sudo apt update
sudo apt install -y build-essential python3 python3-pip ninja-build meson pkg-config libnuma-dev项目提供了自动配置脚本 setup_dpdk.sh,使用方法如下:
# 赋予脚本执行权限
chmod +x setup_dpdk.sh
# 运行配置脚本(需要root权限)
sudo ./setup_dpdk.sh -n <网卡名称>:<PCI地址> -p <大页内存数量>
# 例如:
sudo ./setup_dpdk.sh -n ens32:0000:02:02.0 -p 1024参数说明:
-n, --nic: 指定网卡名称和PCI地址-p, --pages: 设置大页内存数量(默认:1024)-h, --help: 显示帮助信息
# 在项目根目录下执行配置
meson setup builddir
# 编译项目
cd builddir
ninja
# 或者直接使用一条命令
ninja -C builddir编译后的可执行文件将生成在 builddir 目录下。您可以使用以下命令运行示例程序:
# 运行UDP示例
./builddir/examples/basic/udp_example
# 运行TCP示例
./builddir/examples/basic/tcp_example -s # 服务器模式
./builddir/examples/basic/tcp_example -c <IP地址> # 客户端模式.
├── socket/ # 核心协议栈实现
│ ├── dpdk_init/ # DPDK初始化相关代码
│ ├── unit_test/ # 单元测试
│ ├── tcp.c # TCP协议实现
│ ├── udp.c # UDP协议实现
│ └── arp.c # ARP协议实现
├── build/ # 编译输出目录
├── setup_dpdk.sh # DPDK环境配置脚本
└── Makefile # 项目编译配置
项目支持静态ARP表项的持久化存储,配置文件位于 socket/arp_table.txt。您可以手动编辑此文件来添加静态ARP表项。
#VERSION=1
<IP十进制>,<MAC地址>,<状态>,<时间戳>
各字段说明:
- IP地址:使用十进制格式(例如:167772417 表示 10.0.0.1)
- MAC地址:使用冒号分隔的十六进制格式(例如:00:50:56:c0:00:01)
- 状态:1 表示静态表项
- 时间戳:Unix时间戳(可使用
date +%s命令获取)
#VERSION=1
167772417,00:50:56:c0:00:01,1,1708272720 # 10.0.0.1
167772418,00:0c:29:a1:b2:c3,1,1708272720 # 10.0.0.2
167772419,00:1a:a0:11:22:33,1,1708272720 # 10.0.0.3
167772420,00:25:90:44:55:66,1,1708272720 # 10.0.0.4
要将点分十进制IP转换为十进制格式,可以使用以下Python脚本:
ip = "10.0.0.1"
decimal_ip = sum(int(x) * (256 ** (3-i)) for i, x in enumerate(ip.split('.')))
print(decimal_ip) # 输出:167772417或使用以下bash命令:
ip="10.0.0.1"
printf '%d\n' $(echo $ip | awk -F. '{print ($1*256^3)+($2*256^2)+($3*256)+$4}')- 文件权限应设置为644(所有者可读写,其他用户只读)
- 每次修改后需要重启服务使更改生效
- 时间戳可以使用当前时间,不影响静态表项的功能
- MAC地址必须是有效的硬件地址格式
- 运行
setup_dpdk.sh脚本后需要重启系统以使所有更改生效 - 确保网卡支持DPDK并已正确配置
- 运行程序需要root权限
- 如需恢复网卡到正常模式,可使用以下命令:
dpdk-devbind.py --bind=<原始驱动> <PCI地址>
-
检查大页内存配置:
cat /proc/meminfo | grep Huge -
检查网卡绑定状态:
dpdk-devbind.py --status
-
如果遇到编译错误,请确保已安装所有必要的依赖项。
欢迎提交Issue和Pull Request来帮助改进项目。在提交代码前,请确保:
- 代码符合项目的编码规范
- 添加了适当的单元测试
- 所有测试用例都能通过
- 更新了相关文档