【发布时间】:2023-02-17 17:21:14
【问题描述】:
我想将用于 XDP 挂钩的相同 eBPF 程序加载到交换机的不同接口上,并且所有程序应该共享相同的映射。我已经浏览了帖子(正是我的目标)post 1 和 post 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。
【问题讨论】: