网络转发
转发的含义是找到报文下一跳,根据路由表查询L3 目的IP的下一跳。
引用这张图片目的是为了说明当需要进行IP转发时,依然涉及分配SKB,解析IP报文。SKB是一个复杂的数据结构,是转发性能的重要影响因素。
引用这张图片的目的是为了说明转发就是为了获取下一跳,即该IP的源MAC和目的MAC。
eBPF/XDP 网络转发
若采用eBPF程序挂载XDP位置来处理转发报文, 即上图 Forward 部分,理论上将会有大幅提高,因为该位置无SKB分配,没有进入内核栈。
eBPF/XDP 转发思路
通过以上介绍,为了达到转发目的,需要知道转发报文中目的IP源MAC和目的MAC,并将其储存。
eBPF存储功能map:
- bpf_map_update_elem 更新map内容
- bpf_map_lookup_elem 查询map内容
查询转发IP的源MAC和目的MAC, 可参考官方示例
- bpf_fib_lookup 可查询内核中路由表和邻居表,路由表可查出口MAC, 邻居表可查目的MAC
bpf_fib_lookup
--> bpf_ipv4_fib_lookup
...
---> nl_fib_lookup
--> bpf_ipv6_fib_lookup
bpf_fib_lookup 返回值需要关注一下
返回值 | 含义 |
---|---|
BPF_FIB_LKUP_RET_SUCCESS | success |
BPF_FIB_LKUP_RET_BLACKHOLE | dest is blackholed; can be dropped |
BPF_FIB_LKUP_RET_UNREACHABLE | dest is unreachable; can be dropped |
BPF_FIB_LKUP_RET_PROHIBIT | dest not allowed; can be dropped |
BPF_FIB_LKUP_RET_NOT_FWDED | packet is not forwarded 非转发报文 |
BPF_FIB_LKUP_RET_FWD_DISABLED | fwding is not enabled on ingress. Do sysctl net.ipv{4,6}.conf.all.forwarding = 1 |
BPF_FIB_LKUP_RET_UNSUPP_LWT | fwd requires encapsulation |
BPF_FIB_LKUP_RET_NO_NEIGH | no neighbor entry for nh |
BPF_FIB_LKUP_RET_FRAG_NEEDED | fragmentation required to fwd |
eBPF/XDP 转发实现
设计文档和代码实现, 免费答疑,免费送源码