You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在两个网络接口的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.o
    
    替换x86_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:

  1. 加载第一个程序后,用bpftool查询Map ID:
    sudo bpftool map list
    
  2. 将Map固定到文件系统:
    sudo bpftool map pin id <MAP_ID> /sys/fs/bpf/shared_map1
    
  3. 加载第二个程序时指定复用该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:07:09