问题描述
我正在尝试通过另一个接口重定向在给定接口上接收到的数据包,所有这些数据包都可以从用户空间访问。
假设我们在接口1(用于接收数据)和接口2(用于传输数据)上具有套接字1。
我想过的可能解决方案:
- 将其传出接口1并在最后一刻使用出口XDP过滤器将数据包重定向到接口2,但目前尚不支持出口XDP,因此不可能。
- 在另一个接口上使用原始套接字将数据写入其中,但是随后我们需要一个副本,并且我们不使用AF_XDP套接字在传输路径中提供的内核内快速路径。
- 在另一个接口上使用AF_XDP套接字将数据写入UMEM,并使用其完成环中的描述符将数据手动复制到其UMEM中(然后将该描述符移入其TX环中),但是显然这需要复制数据。
- 在其中一个接口上使用AF_XDP共享套接字,但是可以将该套接字绑定到其他接口吗?从xsk.h函数
xsk_socket__create_shared(...)
看来是这样,但是我尚未对此进行测试。 (顺便说一下,API稳定吗?)
作为最终解决方案,我想我可以在接口1上创建仅RX套接字,在接口2上创建仅TX套接字,然后在套接字1上分配UMEM,然后简单地让套接字2的umem_area指针指向套接字1的UMEM,这样我可以将描述符从套接字1的RX环传递到套接字2的TX环,然后从套接字2的COMPLETION环传递回套接字1的FILL环,但这就是问题所在:
那行得通吗?还是仅在开始时起作用,然后在我们丢弃其中一个RX数据包之类的东西之后便开始中断?规范是否通过这样的两个典型XDP循环一起保证功能?我在网上找不到与此有关的内容。我们能否以某种方式不选择从COMPLETION环读取的描述符(如果规范保证这些套接字的描述符将以相同的顺序使用,那对我来说很好)
还有一个小的附加问题:如果我们将套接字配置为不具有TX环,那么它也将不具有COMPLETION环吗?这样处理一半的套接字时,可以节省一些内存开销,并且应该是可行的,因为内核是COMPLETION环的生产者,而TX环不存在,所以它甚至可以将描述符移到哪里?那枚COMPLETION戒指? (一旦共享套接字,我想这是一个问题,但如果我不这样做,它是否仍分配COMPLETION环?)当然,FILL环和RX环反之亦然。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)