【发布时间】:2020-03-10 09:59:43
【问题描述】:
我要实现 XDP_SHARED_UMEM:https://www.kernel.org/doc/html/latest/networking/af_xdp.html#xdp-shared-umem-bind-flag
libbpf 库函数 xsk_socket__create (https://github.com/libbpf/libbpf/blob/master/src/xsk.c) 检查 xsk_umem->refcount 值。如果它大于 1,则设置 struct sockaddr_xdp 的 XDP_SHARED_UMEM 选项。
据我正确理解,我“只”需要传递我想与之共享 umem 的套接字的原始 umem 结构,其余的由 libbpf 完成。
我尝试这样做的方法是让第一个进程将其umem-struct 复制到第二个进程可以从中加载它的共享内存区域。但是因为struct xsk_umem 是在xsk.c 中定义的,所以它对用户是隐藏的,我不能这样做:
memcpy(shdm_ptr, umem, sizeof(struct xsk_umem))
我不知道他们希望别人如何使用共享 umem 功能?
【问题讨论】:
-
kernel samples 中的示例在这里有用吗?
-
据我了解,
umem->buffer只是指向内存区域的指针,但我没有得到struct xsk_umem的其他变量,例如fd或refcount这是必要的对于xsk_socket__create相应地设置XDP_SHARED_UMEM。我可能错了,但我看不出这个功能对我有什么帮助 -
对,对不起。那时我不知道:/。可能是 libbpf 还没有这些助手。
-
我看到libbpf中有
xsk_umem__fd(),你能用它来获取文件描述符并将其传递给其他进程吗? (我没试过,不知道这是否应该工作) -
我可以这样做,但
xsk_socket__create再次期待struct xsk_umem *umem。为了能够将fd直接传递给xsk_socket__create我必须更改库(我认为)