据我了解,每个网络接口只能有一个 AF-XDP 内核程序。我想将来自单个网络接口的多个多播地址的数据包处理分配给多个进程。我编写了一个“加载器”程序来创建进程(到目前为止工作正常)。
我现在的问题是在加载程序中仅加载一次内核程序load_bpf_and_xdp_attach
,但是将对 xsks-map 的访问分配给多个进程。
load_bpf_and_xdp_attach
返回指向 a 的指针struct bpf_object*
。然后需要这个指针bpf_object__find_map_by_name
来访问bpf_map
文件描述符。
我的想法是将 的内容bpf_object
写入共享内存,从而将其分配给进程。但不幸的是,该结构bpf_object
是在libbpf.c
. 因此,我无法做到这一点:
void insert_bpf_obj_into_shrd_mem(int shmid, struct bpf_object *bpf_obj) {
uint8_t *shm_data = shmat(shmid, NULL, 0);
if(shm_data == -1) {
fprintf(stderr, "Failed to obtain `shared memory` with id %d: %s\n", shmid, strerror(errno));
exit(1);
}
memcpy(shm_data, bpf_obj, sizeof(struct bpf_object));
shmdt(shm_data);
}
这在我看来,libbpf
不想让任何人知道bpf_object
。
有什么想法可以实现我最初的想法吗?
如果每个进程都加载自己的内核程序版本,我最终会得到(amount of processes)
-xsks 映射,我认为这不明智。
编辑:我知道有一种方法可以重用地图,但是......似乎有点复杂