1

我们犯了一个愚蠢的错误,编写了几个 bpf 程序(每组编写一个),后来发现我们不能同时附加多个。现在我们要重新设计并让每个组都有自己的 AF_XDP 套接字,并且 eBPF 程序将根据目标 ip&port 将数据发送到正确的组(我们只讨论 UDP RX)。

所以我的问题是你会怎么做?我们认为使用 BPF_MAP_TYPE_HASH 将 (ip,port) 保留为键,该值将是 BPF_MAP_TYPE_XSKMAP 映射的键。还有其他更好的方法吗?您会坚持使用一个 AF_XDP 套接字并让用户空间区分端口还是让每个用户定义自己的套接字并具有自己的 umem 限制?

感谢并为这个奇怪的问题感到抱歉。整个 XDP 和 AF_XDP 有点……压倒性的……所以要确保我们没有犯另一个可能更难找到的愚蠢错误。

4

1 回答 1

1

我想我会回复,因为我们已经决定并实施了一切 - 自从我问这个问题以来,我好像学到了很多东西。

每个接口和 rxqueue 只能有一个 UMEM,因此多个插槽的“好处”会有所减少,因为无论如何您都必须以同步方式管理填充/完成环中的项目,因此最好有一个带有专用 RX 的插槽/TX 线程和专用 RX/TX UMEM 区域(因此 RX/TX 线程之间不需要同步)。

因此,我们在 BPF 中使用了从 ip,port 到用户空间连接数组中的索引的 HASH,并将其放入元数据中,这样用户空间就可以轻松区分哪些内容去了哪里——这也使得处理碎片化 ip 变得更容易一些数据包。

于 2021-02-20T18:27:44.843 回答