【问题标题】:Sharing maps between same eBPF programs loaded onto different interfaces with libbpf使用 libbpf 在加载到不同接口的相同 eBPF 程序之间共享映射
【发布时间】:2023-02-17 17:21:14
【问题描述】:

我想将用于 XDP 挂钩的相同 eBPF 程序加载到交换机的不同接口上,并且所有程序应该共享相同的映射。我已经浏览了帖子(正是我的目标)post 1post 2。但是,我无法启动和运行。

我知道我需要使用 bpf_map__reuse_fd(),但如果不先创建地图,我该如何使用它呢?此外,界面中的各个程序将创建自己的地图,不是吗?

post 2的cmets中,按照步骤我们首先为prog1和prog2创建结构,然后加载prog1,获取映射fds以在prog2中使用。但是,在这种情况下,如何在不加载 BPF 程序的情况下创建地图然后共享呢?

我只有两个程序——一个内核空间 BPF 程序和一个加载代码的用户空间程序。这是我的代码 sn-ps。 在文件 xxx_kern.c 中

struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __type(key, __u32);
    __type(value, __u32);
    __uint(max_entries, 10);
} xdp_map_t SEC(".maps");

在文件 xxx_user.c 中

int main()
{
    struct bpf_object *obj = NULL;
    obj = bpf_object__open("xxx_kern.o");
    struct bpf_map *map1 = bpf_object__find_map_by_name(obj, "xdp_map_t ");
    int map1_fd = bpf_object__find_map_fd_by_name(obj, "xdp_map_t ");
    bpf_map__reuse_fd(map1, map1_fd);
    
    // load and attach the program with xdp_program__attach()

    // verifythe fd value of map ```xdp_map_t``` from different interfaces
    printf("\nMap1_fd value: %d\n", map1_fd);
}

有人能说出这种情况下的正确步骤吗? 请注意,我使用的是 libbpf。

【问题讨论】:

    标签: ebpf bpf xdp-bpf libbpf


    【解决方案1】:

    我的建议是遵循这些教程enter link description here。它将地图固定在 bpffs 中,这是一个虚拟文件系统,允许您每次需要访问地图和 bpf 结构。保留您对地图的定义,不要使用 bpf_map_def 因为它已被弃用。

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2018-01-04
      • 2018-02-07
      • 1970-01-01
      相关资源
      最近更新 更多