DOCA Flow 支持在硬件上匹配自定义的 IP 扩展字段(例如 CRC)吗?

我目前在使用 DOCA Flow 项目,在 NVIDIA BlueField DPU 上定义多个具有不同匹配规则的 flow pipe。

根据官方文档,创建pipe的时候,用户必须定义管道上应匹配的字段。而struct doca_flow_match 支持匹配标准的 以太网头、VLAN、IP 以及 L4 头字段等,但并没有直接提供对 扩展或自定义 IP 字段 的支持。

我的问题是:

  1. DOCA Flow 或硬件解析器是否支持对这种自定义/扩展 IP 字段进行匹配?
  2. 如果不直接支持,有没有可行的替代方案?

从 doca_flow_header_format 结构和协议支持清单上来看,DOCA Flow 的硬件激素啊匹配引擎原生支持 IP 的标准字段,无“自定义扩展字段”。但是可以通过 Arm 软件解析 + 元数据注入 + 硬件 Pipe 二次匹配的方式实现自定义扩展字段,理论上可以处理任意格式的定义扩展字段,只要字段在数据包中的偏移量、长度都有明确定义。

您好,我在理解“Arm 软件解析 + 元数据注入 + 硬件 pipe 二次匹配”的机制时遇到一点分歧,想进一步确认一下,目前对这个机制有两种可能的理解,我想知道哪一种才是正确的。

  1. 每个包都解析
    每个数据包到达时,都需要由 Arm 软件解析一次自定义扩展字段;
    Arm 软件将解析结果写入 metadata;
    DOCA Flow pipeline 在硬件内根据 metadata 字段进行匹配和执行动作。
  2. 只在创建 flow entry 时处理一次
    只需要在创建规则(flow entry)时执行一次解析或配置;
    之后所有数据包的这个自定义字段由硬件自动进行匹配;
    后续的数据包不需要再走 Arm 软件解析,不需要每包重新写 metadata。

DOCA Flow 实现自定义扩展字段时,无需每次都通过 Arm 软件解析 ,仅需首次通过 Arm 完成解析并创建规则后,后续自定义字段的匹配便由硬件 Pipe 全权负责,仅异常流量才需 Arm 介入处理

您好,我想进一步确认您提到的“ARM 解析”具体指的是什么,能否展开一下?

您好,非常感谢您的进一步解释。
我已经理解您所描述的“首次由 ARM 软件解析并创建规则 → 后续由硬件 Pipe 匹配”的流程。
但我仍然卡在一个关键点:ARM 在代码层面如何识别并读取自定义扩展字段?
我查了 SDK 文档中 5.5 doca_flow_meta 的描述,里面写到“The user can set a value to metadata, copy from a packet field, then match in later pipes. ”,也符合您所说的方式。
但我在官方 SDK 示例中没有找到任何关于 如何由 ARM 解析自定义扩展字段并写入 metadata的具体示例。
我查看了github上的 flow_set_meta / flow_copy_to_meta / flow_add_to_meta 等sample,但它们都只展示了 使用标准协议字段来执行 metadata 的注入操作。
我目前缺乏一个能参考的“Arm 软件解析自定义扩展字段 → 写 metadata”流程。
如果您有任何官方示例、可实践文档、或内部推荐的代码路径,能否麻烦指一下方向?
为了正确落地“ARM 解析 + 元数据注入 + 硬件 Pipe 二次匹配”的方案,我希望能获得更明确的实现指导。
非常感谢!

经过和内部工程师沟通,目前 DOCA Flow 还未能支持扩展字段,相关软件功能还在开发中,故没有 DOCA Flow 的 API 能够实现,待后续更新

1 个赞