XDP的使用与eBPF程序分不开,因此要了解学习XDP,须知道什么是eBPF、什么是XDP。
概念
eBPF
BPF(Berkeley Packet Filter)是一种灵活且高效的数据包过滤技术,最初由 BSD Unix 中的网络子系统引入;BPF 允许用户编写简单的程序来过滤和处理网络数据包,以实现网络监控、安全策略、流量分析等功能
eBPF是Berkeley Packet Filter(BPF)的扩展版本(传统的BPF即cBPF)。它是在Linux内核中运行的抽象虚拟机 (VM),就像Java虚拟机(JVM)可以在受控环境中运行应用程序一样。eBPF可以在内核的沙箱内执行用户自定义的程序,它通常用在Linux中编写低级监控、跟踪或网络程序
XDP
eXpress Data Path(XDP)是一个框架,可以在BPF应用程序中执行高速数据包处理。为了更快地响应网络操作,XDP会尽快运行BPF程序,通常是在网络接口接收到数据包后立即运行。
XDP是一种允许开发人员将eBPF程序附加到低级钩子的技术,是Linux内核中的网络设备驱动程序以及在设备驱动程序之后运行的通用钩子实现。
XDP可用于在eBPF架构中实现高性能数据包处理,主要使用内核旁路技术。这大大减少了内核所需的开销,因为它不需要处理上下文切换、网络层处理、中断等。网络接口卡(NIC)的控制被转移到eBPF程序。如果你需要更高的网络速度(10 Gbps及以上)工作,这一点尤其重要。
XDP工作原理
XDP程序可以直接连接到网络接口,每当在网络接口上收到一个新的数据包时,XDP程序都会收到一个回调,并且可以快速地对数据包执行操作。
AF_XDP 和 AF_INET 一样,也是 address family 的一种,AF_XDP 就相当于 socket 底层通讯方式的不同实现,AF_INET 可以用于 IPv4 类型地址的通讯,AF_XDP 则是一套基于 XDP 的通讯的实现。
XDP工作模式
XDP有三种工作模式:
1)Native XDP,即运行在网络驱动实现的poll()函数中,需要网卡驱动的支持;
2)Generic XDP,如果网卡驱动不支持XDP,则可以运行在receive_skb()函数中
3)Offload XDP,这种模式是指将XDP程序offload到网卡中,这需要网卡硬件的支持,编译器将BPF代码翻译成网络原生指令并在网卡上运行。
XDP程序案例
编写一个XDP程序的主要分为几个步骤:
1) 安装必要的工具和软件包
sudo apt-get install clang llvm libelf-dev linux-headers-$(uname -r) gcc-multilib
2) 编写 XDP 代码并保存为 .c
文件,例如 xdp_xx.c;在编写xdp程序通常需要明确指定函数在哪个section,如:SEC("xx");
3)使用 Clang 编译 XDP 代码并生成 ELF 文件
4) 在需要应用 XDP 的网络接口上启用 XDP 程序
XDP程序返回码
XDP程序结束后会返回一个结果,告诉调用者接下来如何处理这个包:
1) XDP_DROP, 丢弃这个包,主要用于报文过滤的安全场景。
2)XDP_PASS,将这个包“交给/还给内核”,继续走正常的内核处理流程。
3)XDP_TX,从收到包的网卡上再将这个包发送出去(即hairpin模式),主要用于负载均衡模式;
4)XDP_REDIRECT,和XDP_TX类似,但是通过另外一个网卡发送出去,除此之外,还可以实现将报文重定向到其他CPU处理,类似与XDP_PASS继续内核处理,当前CPU继续处理后续报文的接收。
5)XDP_ABORTED,表示程序产生异常,行为类似XDP_DROP,但是会通过一个tracepoint打印日志追踪。