如何在两个网络接口的eBPF程序间共享Map?新手求教
多XDP程序共享eBPF Map的实现方法
一、核心问题:正确实现Map Pinning(共享Map的标准方案)
你遇到的编译错误,是因为默认的struct bpf_map_def结构体没有.pinning成员,需要使用libbpf提供的标准宏来定义支持固定的Map。
1. 修改Map定义
替换原有定义为libbpf推荐的BPF_MAP_DEF宏(需包含对应头文件):
#include <bpf/bpf_helpers.h> #include <bpf/bpf_map_defs.h> BPF_MAP_DEF(map1) = { .type = BPF_MAP_TYPE_PERCPU_ARRAY, .key_size = sizeof(__u32), .value_size = sizeof(__u64), .max_entries = 2, .pinning = BPF_F_PIN_BY_NAME, // 开启Map固定功能 }; BPF_MAP_ADD(map1); BPF_MAP_DEF(map2) = { .type = BPF_MAP_TYPE_HASH, .key_size = sizeof(__u32), .value_size = sizeof(__u64) * 2, .max_entries = 10240000, .pinning = BPF_F_PIN_BY_NAME, }; BPF_MAP_ADD(map2); BPF_MAP_DEF(map3) = { .type = BPF_MAP_TYPE_HASH, .key_size = sizeof(__u32), .value_size = sizeof(__u64) * 2, .max_entries = 10240000, .pinning = BPF_F_PIN_BY_NAME, }; BPF_MAP_ADD(map3);
2. 准备BPF文件系统
先挂载BPF文件系统(若未挂载):
sudo mount -t bpf bpf /sys/fs/bpf/
3. 加载第一个程序并固定Map
用xdp-loader加载第一个网卡的XDP程序,指定固定路径:
sudo xdp-loader load --pin-root /sys/fs/bpf/xdp_shared eth0 XDP_prog1.o
此命令会将Map固定到/sys/fs/bpf/xdp_shared/目录下,Map名称与代码中定义的变量名一致(如map1)。
4. 加载第二个程序并复用固定Map
加载第二个网卡的程序时,启用复用Map参数:
sudo xdp-loader load --pin-root /sys/fs/bpf/xdp_shared --reuse-maps eth1 XDP_prog2.o
--reuse-maps会自动匹配程序内的Map名称与已固定的Map,实现跨程序共享。
二、解决XDP-Loader的"Operation not supported"错误
该错误常见原因及解决方法:
- 内核版本过低:XDP需要内核4.15+,部分Map类型(如PERCPU_ARRAY)依赖更高版本,检查内核版本:
uname -r - 编译产物错误:确保用clang正确编译,示例命令:
替换clang -target bpf -D__TARGET_ARCH_x86_64 -I/usr/include/x86_64-linux-gnu -O2 -c XDP_prog.c -o XDP_prog.ox86_64为你的架构(如aarch64),保证头文件路径正确。 - 网卡不支持XDP:检查网卡XDP支持状态:
ethtool -k eth0 | grep xdp,若显示off,可使用通用XDP模式加载:sudo xdp-loader load --mode generic eth0 XDP_prog.o
三、备选方案:复用Map文件描述符(FD)
若不想用Pinning,可手动复用Map的FD:
- 加载第一个程序后,用
bpftool查询Map ID:sudo bpftool map list - 将Map固定到文件系统:
sudo bpftool map pin id <MAP_ID> /sys/fs/bpf/shared_map1 - 加载第二个程序时指定复用该Map:
sudo bpftool prog load XDP_prog2.o /sys/fs/bpf/prog2 type xdp map name map1 pinned /sys/fs/bpf/shared_map1
注意事项
- 两个程序的Map定义必须完全一致(类型、key/value大小、最大条目数),否则无法共享。
- PERCPU_ARRAY类型Map天然支持多CPU并发,无需额外锁;HASH类型Map需注意并发访问,必要时用
bpf_spin_lock保护。 - 所有BPF操作需使用root权限执行。
内容的提问来源于stack exchange,提问作者Fyu Sub
相关产品推荐
相关产品推荐

