Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C AF-XDP:实现共享的Umem套接字_C_Linux_Xdp Bpf - Fatal编程技术网

C AF-XDP:实现共享的Umem套接字

C AF-XDP:实现共享的Umem套接字,c,linux,xdp-bpf,C,Linux,Xdp Bpf,我想实现XDP_SHARED_UMEM: libbpf库函数xsk\u socket\u create()检查xsk\u umem->refcount值。如果大于1,则设置struct sockaddr\u XDP的XDP\u SHARED\u UMEM选项 因此,就我的理解而言,我“只是”需要传递我想要与之共享umem的套接字的原始umem结构,其余的由libbpf完成 我尝试的方法是让第一个进程将其umem-struct复制到一个共享内存区域,第二个进程可以从该区域加载它。但是因为struc

我想实现XDP_SHARED_UMEM:

libbpf
库函数
xsk\u socket\u create
()检查
xsk\u umem->refcount
值。如果大于1,则设置
struct sockaddr\u XDP
XDP\u SHARED\u UMEM
选项

因此,就我的理解而言,我“只是”需要传递我想要与之共享umem的套接字的原始umem结构,其余的由
libbpf
完成

我尝试的方法是让第一个进程将其
umem
-struct复制到一个共享内存区域,第二个进程可以从该区域加载它。但是因为
struct xsk_umem
是在
xsk.c
中定义的,所以它对用户是隐藏的,我不能这样做:

memcpy(shdm_ptr、umem、sizeof(struct xsk_umem))

我不知道他们怎么期望有人使用共享的umem功能?

所以在邮件列表中讨论了这一点。在这里作记录

不建议您尝试进行多进程设置。比约恩说:

请注意,如果您愿意 使用共享umem执行多进程设置,您:需要 管理填充/完成环的控制流程,以及 在进程之间同步,或重新映射填充/完成 来自在多个进程中拥有umem的套接字的环 同步对它们的访问。两者都不令人愉快

老实说,我不推荐这种设置

他补充道:

只是为了完整;要设置共享umem,请执行以下操作:

  • 创建套接字0并将umem注册到此
  • 使用套接字0映射fr/cr
  • 创建套接字1、2、n,并参考用于umem的套接字0
  • 因此,在多进程解决方案中,步骤3将在单独的 流程,以及步骤2,具体取决于您的应用程序。你需要 将套接字0传递给其他进程从共享umem内存 创建套接字0的进程。这几乎是一个线程 解决方案,给定所有共享状态

    我建议不要走这条路


    (感谢比约恩)

    这里的例子有用吗?据我所知,
    umem->buffer
    只是指向内存区域的指针,但我没有得到
    struct xsk_umem
    的其他变量,例如
    fd
    refcount
    ,它们是
    xsk_socket\u创建
    相应地设置
    XDP_共享
    所必需的。我可能错了,但我不知道这个函数如何帮助meRight,对不起。那我就不知道了:/。可能是libbpf还没有这些帮助程序。我看到libbpf中有
    xsk\u umem\u fd()
    ,您能用它来获取文件描述符并将其传递给其他进程吗?(我没有尝试过,不知道这是否可行)我可以这样做,但同样
    xsk\u socket\u create
    需要一个
    struct xsk\u umem*umem
    。为了能够将
    fd
    直接传递到
    xsk\u socket\u create
    我必须更改库(我想)