DPDK ACL 库如何处理超过 16(RTE_ACL_MAX_CATEGORIES) 个类别?

How can DPDK ACL library handle more than 16(RTE_ACL_MAX_CATEGORIES) categories?

我使用的是DPDK 20.08,需要向多个目标复制分发数据包,这涉及到DPDK ACL上的多类并行分类功能。但是根据文档和源码,一个人最多只能设置RTE_ACL_MAX_CATEGORIES个类别,也就是16个。如果我要设置超过16个,是不是至少要用2个ACL上下文,逐一查找?

问题>I need to copy and distribute packets to many targets

注意> 如果以太网帧的原始内容根本没有被修改,那么可以使用 mbuf->ref_cnt 来规避 mbuf 复制的开销。但是如果每个接口上的数据包内容不同(例如 dstmac 或 valn 或 ip headers),则必须复制数据包。如果使用 mbuf->ref_cnt 也不能使用 NIC 卸载 RX_MBUF_FAST_FREE

方案一: 根据硬件对 SIMD 的支持 (CPU),可以使用 RTE_ACL_CLASSIFY_AVX512X32。这允许在 CPU 这样的 skylake、cascadelake 和 icelake 上处理 32 流并行查找。参考 Section 53.1.3 了解更多详情。

方案二(如果不支持SIMD AVX512): 是否值得 运行 所有 16 或 32 流查找然后将 mbuf 复制到多个目标,然后修改每个接口的内容?

我的建议是使用 HW(NIC 或 ASIC)或使用 SW(rx 桥 driver)在入口流量上创建镜像并发送到单独的 RX queue。通过使用单独的 CPU 线程,可以使用更小的 ACL 表。

方案三(如果不支持SIMD AVX512): 可以开始将 #define RTE_ACL_MAX_CATEGORIES 16lib/acl/rte_acl.h 修改为 #define RTE_ACL_MAX_CATEGORIES 32 作为参考点。还有许多其他领域 mask 也需要修改和支持。我个人不推荐这个选项,因为它会产生更多的树依赖性,并且需要花更多的时间调试其他问题。