前言
本文对XDP卸载到智能网卡做一个记录,XDP和eBPF的概念参考Cilium的BPF和XDP指南
简介
我手头的两块智能网卡型号为Agilio CX 2x25GbE,具有两个25G速率的端口,需要安装对应的光模块,SFP+的光模块能达到10G速率,SFP28的光模块能达到25G速率;
网卡支持DPDK、P4可编程、OVS卸载、XDP卸载等功能,适用于云IaaS/PaaS、NFV、数据中心微分段、网络遥测、零信任安全等多种场景和应用。
本教程主要针对XDP卸载到智能网卡。
XDP卸载优势
- 与内核协同;
- 对传统工具支持更好;
- 无需独占CPU核,节省CPU资源;
- 高性能;
应用
4层负载均衡、DdoS防御、网络性能加速、网络遥测、软件定义路由……
XDP卸载支持的功能(来源于Netronome eBPF卸载的官方文档):
网卡和eBPF卸载的详细资料参考netronome官网的介绍文档:
https://www.netronome.com/products/agilio-cx/
https://www.netronome.com/technology/ebpf/
软硬件准备
网卡安装到标准的PCIe接口,在主机上安装linux系统(可使用双系统),使用官网推荐的Ubuntu18.04 或 Fedora 28(桌面版即可,服务器版未尝试),本教程环境使用的是Ubuntu18.04.5桌面版;网卡不支持windows;
网卡驱动和设置
由于网卡使用的nfp驱动合并在主linux,网卡正确安装并启动系统后,使用ip link命令即可显示出我们所安装的网卡。若不显示,检查驱动模块:
lsmod " grep nfp
若无输出,证明驱动模块未加载,尝试手动加载:
modprobe nfp
将光模块安装后,以光纤跳线连接两主机网卡(或将同网卡两端口相连接,仅用于测试);
速率设置:为网卡设置匹配的速率,否则网卡将显示线缆未连接;
注:更改端口速率必须按顺序进行,即enp4s0np0->enp4s0np1,不同主机和系统可能显示的网卡端口名不同;
down掉对应端口
ip link set dev $ETHNAME down
ethtool设置端口速率
ethtool -s $ETHNAME speed 10000
重载nfp模块以使速率设置生效
rmmod nfp; modprobe nfp
网卡设置完成后应能够正常连通;
更新固件
初始固件为网卡基础固件,不支持XDP卸载,固件类型可通过ethtool -i <网卡端口名称>查看;下图为初始固件:
 )) {
return XDP_DROP;
}
卸载方式
- 通过ip命令卸载
ip link set dev $ETHNAME xdpoffload obj drop.o sec .text
- 通过加载程序卸载,可使用libbpf相关接口,或BCC(同样使用了libbpf库)
此处不赘述
本文以ip link为例:
- 使用Clang编译:
clang -O2 -target bpf -c drop.c -o drop.o
- 使用ip命令加载程序
ip link set dev $ETHNAME xdpoffload obj drop.o sec xdp
- 查看程序是否正确被卸载:
ip link show dev $ETHNAME
此时XDP程序已卸载到网卡,丢弃一切接收到的数据包。
4. netronome还提供了脚本,以表格形式实时显示网卡和XDP程序的实时速率等:
nfp-drv-kmods/tools/stat_watch.py $ETHNAME -c
效果图: