前言
前置阅读要求:
- ebpf教程(3):使用cmake构建ebpf项目-CSDN博客
- [译] [论文] XDP (eXpress Data Path):在操作系统内核中实现快速、可编程包处理(ACM,2018)
- xdp-tools/lib/libxdp/README.org at master · xdp-project/xdp-tools
在阅读完上面的文档后,我们大概知道XDP(eXpress Data Path)允许在数据包进入内核协议栈之前进行处理,这减少了不必要的开销。由于处理发生在内核的早期阶段,XDP 能够显著提高网络处理性能,特别是对于高流量的场景。
本文是XDP的hello world – 加载XDP程序。
环境准备
# 安装依赖
apt install libxdp-dev xdp-tools
# 当前的libxdp版本
pkg-config --modversion libxdp
1.4.2
# 当前的内核版本(ubuntu24的内核)
uname -r
6.8.0-31-generic
我当前的网络拓扑如下图所示。当然本文的示例对网络拓扑没有要求,把程序加载到网卡上即可。
加载XDP程序
源码
下面的示例代码修改自:
- xdp-tutorial/basic01-xdp-pass/README.org at master · xdp-project/xdp-tutorial
- xdp-tutorial/basic02-prog-by-name/README.org at master · xdp-project/xdp-tutorial
bpf程序的生命周期:open–create–attach–detach。
本文的 BPF ELF 文件中有两个XDP程序,可以选择按照名称加载。
首先是XDP程序。两个程序,分别是放行或者阻止数据包。
// xdp_kernel_prog.c
#include <linux/types.h>
#include <bpf/bpf_helpers.h>
#include <linux/bpf.h>
SEC("xdp")
int xdp_pass_func(struct xdp_md *ctx) {
bpf_printk("%s", "Pkt pass...");
return XDP_PASS;
}
SEC("xdp")
int xdp_drop_func(struct xdp_md *ctx) {
bpf_printk("%s", "Pkt drop...");
return XDP_DROP;
}
char _license[] SEC("license") = "GPL";
下面是加载XDP程序的用户层程序。
示例代码中,我使用了argp库,我喜欢用这个库来处理命令行参数。它的使用可见:一步步了解Argp-CSDN博客
#include <argp.h>
#include <net/if.h>
#include <signal.h>
#include <