第26周:XDP 程序开发入门
目标:理解 XDP(eXpress Data Path)的挂载点和处理模型,能够编写 XDP 程序实现包过滤和转发。
1. XDP 概述
1.1 什么是 XDP?
1 | XDP(eXpress Data Path): |
1.2 XDP 性能优势
1 | 性能对比(典型 10GbE 小包): |
2. XDP 挂载点
2.1 三种挂载模式
1 | ┌────────────────────────────────────────────────────────┐ |
2.2 挂载方法
1 | # === iproute2 加载 XDP === |
3. XDP 动作
3.1 五种动作
1 | // <linux/bpf.h> |
3.2 动作详细说明
1 | XDP_DROP(最快): |
4. XDP 程序基础
4.1 第一个 XDP 程序
1 | // drop_all.bpf.c |
4.2 XDP 上下文
1 | // <linux/bpf.h> |
4.3 包数据访问辅助
1 | // 直接访问包头(必须先检查边界) |
4.4 内置 XDP 头(vmlinux.h)
1 | // <linux/if_ether.h> — 但 BPF 程序要用 bpf helper |
5. 实践:丢弃所有 UDP 8080 端口包
1 | // drop_udp_8080.bpf.c |
5.1 编译
1 | # 编译为 BPF 字节码 |
5.2 测试
1 | # 1. 启动服务 |
6. 数据包检查模式(重要)
6.1 严格边界检查
1 | SEC("xdp") |
6.2 辅助:使用 helper 进行解析
1 | // BPF 提供了一些便利函数解析常见头 |
7. 调整数据包(修改包内容)
7.1 调整头部(剥离/添加包头)
1 | SEC("xdp") |
7.2 修改包内容
1 | // 直接修改(可写) |
7.3 XDP_TX 实现(反射器)
1 | SEC("xdp") |
8. 调试与验证
8.1 trace_pipe
1 | // BPF 程序中使用 |
8.2 bpftool 检查
1 | # 列出所有 BPF 程序 |
8.3 内核日志
1 | # 在 BPF 程序中 |
9. 高级 XDP 特性
9.1 多程序链(tail call)
1 | // 跳转到另一个 BPF 程序 |
9.2 CPU 重定向(CPUMAP)
1 | // 重定向到其他 CPU 处理 |
9.3 设备重定向(DEVMAP)
1 | // 重定向到其他网卡 |
10. XDP 与 AF_XDP 配合
1 | AF_XDP(用户态网络): |
1 | # 启用 AF_XDP 零拷贝 |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/06/16/第26周:XDP 程序开发入门/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!