通过轻量级隧道基础设施,Linux内核的最新补丁系列实现了从目标路由条目直接调用BPF程序的功能。这些BPF程序可以挂载到 lwtunnel_input()、lwtunnel_output() 或 lwtunnel_xmit() 函数上,并以三层(L3)的套接字缓冲区(skb)作为上下文参数。其中,input 钩子为只读模式,output 允许写入操作,而 xmit 则进一步支持头部信息添加和报文重定向。
该功能的开发主要基于以下动机:
- 对出站路由实施比传统路由元组更精细的限制。
- 实现跨网络域的逐路由流量统计。
- 在无需解析二层地址的前提下,快速添加二层(L2)头部信息。
- 适用于类似 ILA(Identifier-Locator Addressing)的用例,即先解析三层地址(如 IP 地址),再进行异步路由。
- 实现快速封装与重定向,当前适用于无需设置内外层偏移量或协议的场景。
在补丁 04 中,提供了多个使用示例,帮助开发者快速上手。以下为相关代码文件的变更摘要:
include/linux/filter.h | 2 +-
include/uapi/linux/bpf.h | 31 +++-
include/uapi/linux/lwtunnel.h | 21 +++
kernel/bpf/verifier.c | 16 +-
net/core/Makefile | 2 +-
net/core/filter.c | 148 ++++++++++++++++-
net/core/lwt_bpf.c | 365 ++++++++++++++++++++++++++++++++++++++++++
net/core/lwtunnel.c | 1 +
net/ipv4/route.c | 37 +++--
samples/bpf/bpf_helpers.h | 4 +
samples/bpf/lwt_bpf.c | 210 ++++++++++++++++++++++++
samples/bpf/test_lwt_bpf.sh | 337 ++++++++++++++++++++++++++++++++++++++
12 files changed, 1156 insertions(+), 18 deletions(-)
create mode 100644 net/core/lwt_bpf.c
create mode 100644 samples/bpf/lwt_bpf.c
create mode 100755 samples/bpf/test_lwt_bpf.sh
此项技术显著提升了轻量级隧道封装的灵活性和性能,为网络路由优化提供了新的解决方案。
|