Sockets 共享AF_XDP UMEM访问接口/无拷贝用户空间XDP重定向?

Sockets 共享AF_XDP UMEM访问接口/无拷贝用户空间XDP重定向?,sockets,networking,network-interface,xdp-bpf,Sockets,Networking,Network Interface,Xdp Bpf,我试图通过另一个接口重定向在给定接口上接收的数据包,所有数据包都可以从用户空间访问 假设我们在接口1(接收数据)和接口2(传输数据)上有套接字1 我想到的可能解决方案: 将其发送回接口1,并在最后一刻使用出口XDP过滤器将数据包重定向到接口2,但出口XDP目前还不受支持,因此这是不可能的 在另一个接口上使用原始套接字将数据写入,但是我们需要一个副本,并且不使用AF_XDP套接字在传输路径中提供的内核内快速路径 在另一个接口上使用AF_XDP套接字将数据写入其UMEM,并使用其完成环中的描述符将数

我试图通过另一个接口重定向在给定接口上接收的数据包,所有数据包都可以从用户空间访问

假设我们在接口1(接收数据)和接口2(传输数据)上有套接字1

我想到的可能解决方案:

  • 将其发送回接口1,并在最后一刻使用出口XDP过滤器将数据包重定向到接口2,但出口XDP目前还不受支持,因此这是不可能的
  • 在另一个接口上使用原始套接字将数据写入,但是我们需要一个副本,并且不使用AF_XDP套接字在传输路径中提供的内核内快速路径
  • 在另一个接口上使用AF_XDP套接字将数据写入其UMEM,并使用其完成环中的描述符将数据手动复制到其UMEM中(然后将该描述符移动到其TX环中),但显然这需要复制数据
  • 在其中一个接口上使用AF_XDP共享套接字,但是否可以将该套接字绑定到其他接口?从xsk.h函数
    xsk_socket\uu create_shared(…)
    看起来是这样,但我还没有测试过。(顺便问一下,那个API稳定吗?)
  • 作为最终的解决方案,我想我可以在接口1上创建一个仅RX的套接字,在接口2上创建一个仅TX的套接字,然后在套接字1上分配UMEM,只需让套接字2的UMEM_区域指针指向套接字1的UMEM,这样我就可以将描述符从套接字1的RX环传递到套接字2的TX环,从插座2的完成环回到插座1的填充环,但问题是:

    这样行吗?或者,这只会在最初起作用,但一旦我们丢弃其中一个接收数据包或其他东西,就会开始中断?规范是否保证像这样使用典型XDP循环的两部分来实现功能?我在网上找不到与此有关的任何信息。我们是否可以不选择从完成环中读取哪个描述符(如果规范保证这些套接字的描述符将以相同的顺序使用,我没问题)

    另外,还有一个小问题:如果我们将套接字配置为没有TX环,那么它是否也没有完成环?这将在处理一半的套接字时节省一些内存开销,而且这应该是可能的,因为内核是完成环的生产者,而TX环不存在,那么它甚至可以从哪里获得描述符来移动到完成环中呢?(我想,一旦我们共享套接字,这是一个问题,但如果我不这样做,它还会分配完成环吗?)