C AF-XDP:只加载一次内核程序,但将对XSK映射的访问分配给多个进程

C AF-XDP:只加载一次内核程序,但将对XSK映射的访问分配给多个进程,c,linux,bpf,xdp-bpf,C,Linux,Bpf,Xdp Bpf,据我所知,每个网络接口只能有一个AF-XDP内核程序。我希望将多个多播地址的数据包处理从单个网络接口分发到多个进程。我已经编写了一个“加载器”程序来创建进程(到目前为止运行良好) 我现在的问题是通过加载程序中的load_bpf_和_xdp_attach只加载一次内核程序,但要将对xsks映射的访问分配给多个进程 load\u bpf\u和\u xdp\u attach返回指向struct bpf\u对象的指针*。然后,bpf\u object\u按\u name查找\u map\u需要此指针才能

据我所知,每个网络接口只能有一个AF-XDP内核程序。我希望将多个多播地址的数据包处理从单个网络接口分发到多个进程。我已经编写了一个“加载器”程序来创建进程(到目前为止运行良好)

我现在的问题是通过加载程序中的
load_bpf_和_xdp_attach
只加载一次内核程序,但要将对xsks映射的访问分配给多个进程

load\u bpf\u和\u xdp\u attach
返回指向
struct bpf\u对象的指针*
。然后,
bpf\u object\u按\u name查找\u map\u
需要此指针才能访问
bpf\u map
文件描述符

我的想法是将
bpf_对象的内容写入共享内存,从而将其分配给进程。但不幸的是,struct
bpf\u对象
是在
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\u对象

有什么办法可以实现我最初的想法吗

如果每个进程都加载自己版本的内核程序,我最终会得到
(进程数量)
-xsks映射,我认为这是不明智的


编辑:我知道有一种方法可以重用映射,但是…似乎有点复杂,
struct bpf_object
的内部被有意地隐藏起来,以供调用libbpf的应用程序使用。在这里重用地图听起来是个不错的方法,我给出了一些建议。@Qeole我刚刚注意到是否加载地图并不重要!我只是做
加载bpf和xdp附加(cfg)并在用户程序进程中不加载任何内容。我不明白这是如何工作的,但不知何故,套接字现在在哪里可以找到xsks映射?链接到
struct bpf_object
的内部被有意地隐藏到调用libbpf的应用程序中。在这里重用地图听起来是个不错的方法,我给出了一些建议。@Qeole我刚刚注意到是否加载地图并不重要!我只是做
加载bpf和xdp附加(cfg)并在用户程序进程中不加载任何内容。我不明白这是怎么回事,但不知怎么的,套接字现在在哪里可以找到xsks映射?链接到