DOCA 流连接跟踪
此功能在此 DOCA 版本中不受支持。它将在 DOCA 3.0 版本中重新启用。
本指南概述了 DOCA Flow CT API 及其配置说明。
DOCA 流连接跟踪 (CT) 是一个 5 元组表,它支持以下功能:
跟踪 5 元组会话(或在区域可用时跟踪 6 元组会话)
基于区域 – 虚拟表
老化(即,移除空闲连接)
为连接设置元数据
双向数据包处理
高连接速率(CPS)
CT 模块通过利用硬件资源,简化并高效地跟踪连接。该模块支持自主模式和托管模式。
DOCA Flow CT 管道处理非封装的 TCP 和 UDP 数据包。CT 管道仅支持转发到下一个管道或丢失到下一个管道操作
所有匹配已知连接 6 元组的数据包都将转发到 CT 的转发管道
不匹配的数据包将转发到丢失管道
用户应用程序必须相应地处理数据包。
DOCA Flow CT API 围绕四个主要部分构建:
CT 模块操作 – 配置 CT 模块资源
CT 连接条目操作 – 添加、移除或更新连接条目
回调 – 处理异步条目处理结果
管道和条目统计信息

老化
老化时间是以秒为单位的时间,用于设置会话在没有看到数据包的情况下可以保持的最大允许时间。如果该时间过去后仍未检测到数据包,则会话将终止。
为了支持老化,启动了一个专用的老化线程来轮询和检查所有连接的计数器。
自主模式
在此模式下,DOCA 在内部运行多个 CT 工作线程,以并行处理连接。
连接的生命周期由封装在数据包中的连接状态和基于时间的老化控制。
CT 工作线程根据存储在数据包元数据中的连接状态自动建立和关闭连接。
数据包元数据定义如下:
uint32_t src : 1
; /**< Source port in multi-port E-Switch mode */
uint32_t hairpin : 1
; /**< Subject to forward using hairpin. */
uint32_t type : 2
; /**< CT packet type: New, End or Update */
uint32_t data : 28
; /**< Zone set by user or reserved after CT pipe. */
data
– CT 表匹配数据包元数据(区域)和 5 元组type
– 可以具有以下值:NONE
– (已知)如果数据包命中任何连接规则NEW
– 如果是新的 TCP 或 UDP 连接END
– 如果 TCP 连接已关闭
src
和hairpin
– 用于转发管道和工作线程以传递数据包

托管模式
应用程序负责在此模式下管理工作线程,解析和处理连接的生命周期。
托管模式使用 DOCA Flow CT 管理 API 来创建或销毁连接。
CT 老化模块通过调用回调来通知老化超时的连接。
用户可以为每个数据包方向创建具有不同模式、元数据或计数器的连接规则。
用户负责定义元数据和掩码以进行 match
和 modify
。
用户可以先创建一个连接规则,然后使用 API doca_flow_ct_entry_add_dir()
创建另一个规则。

DOCA Flow API 可用于使用 CT 专用队列处理 CT 条目。
doca_flow_entries_process
– 处理队列中的管道条目doca_flow_aging_handle
– 处理管道条目老化
不支持其他 DOCA Flow API,如 CT 条目状态查询和管道丢失查询。
DPU
要在 DPU 上启用 DOCA Flow CT,请在 Arm 上执行以下操作:
在 Linux 启动命令中启用
iommu.passthrough
(或从 DPU BIOS 禁用 SMMU)运行
sudo vim /etc/
default
/grub设置
GRUB_CMDLINE_LINUX="iommu.passthrough=1"
。运行
sudo update-grub sudo reboot
使用
LAG_RESOURCE_ALLOCATION=1
配置 DPU 固件sudo mlxconfig -d <device-id> s LAG_RESOURCE_ALLOCATION=
1
信息从
mst status -v
命令的输出中检索device-id
。如果在 MST 选项卡下,该值为 N/A,请运行mst start
命令。按如下所示更新
/etc/mellanox/mlnx-bf.conf
ALLOW_SHARED_RQ=
"no"
在主机和 Arm 端执行电源循环。
如果使用单端口,请将 DPU 设置为 e-switch 模式
sudo devlink dev eswitch set pci/<pcie-address> mode switchdev sudo devlink dev param set pci/<pcie-address> name esw_multiport value
false
cmode runtime信息从
mst status -v
命令的输出中检索pcie-address
。如果使用两个 PF 端口,请将 DPU 设置为多端口 e-switch 模式(对于 2 个 PCIe 设备)
sudo devlink dev param set pci/<pcie-address> name esw_multiport value
true
cmode runtime信息从
mst status -v
命令的输出中检索pcie-address
。定义巨页(请参阅 DOCA Flow 先决条件)。
ConnectX
要在 NVIDIA® ConnectX® 上启用 DOCA Flow CT,请执行以下操作:
使用
LAG_RESOURCE_ALLOCATION=1
配置固件sudo mlxconfig -d <device-id> s LAG_RESOURCE_ALLOCATION=
1
信息从
mst status -v
命令的输出中检索device-id
。如果在 MST 选项卡下,该值为 N/A,请运行mst start
命令。执行电源循环。
如果使用单端口
sudo devlink dev eswitch set pci/<pcie-address> mode switchdev sudo devlink dev param set pci/<pcie-address> name esw_multiport value
false
cmode runtime信息从
mst status -v
命令的输出中检索pcie-address
。如果使用两个 PF 端口
sudo devlink dev eswitch set pci/<pcie-address0> mode switchdev sudo devlink dev eswitch set pci/<pcie-address1> mode switchdev sudo devlink dev param set pci/<pcie-address0> name esw_multiport value
true
cmode runtime sudo devlink dev param set pci/<pcie-address1> name esw_multiport valuetrue
cmode runtime信息从
mst status -v
命令的输出中检索pcie-address
。定义巨页(请参阅 DOCA Flow 先决条件)。
DOCA Flow CT 支持基于元数据和 NAT 操作的操作。每个操作都可以定义为共享或非共享。
不支持操作描述符。
共享操作
可以在条目之间共享的操作。共享操作是预定义的,并在多个条目中重复使用。
用户获取每个创建的共享操作的句柄,并在需要时使用此句柄作为对操作的引用。
用户有责任跟踪共享操作,并在它们变得无关紧要时将其移除。
共享操作使用控制队列定义(请参阅 struct doca_flow_ct_cfg)。
非共享操作
在条目创建/更新期间提供数据的操作。
这些操作完全由 DOCA Flow CT 管理,不能在多个流中重复使用(即,NAT 操作)。
管道创建中的操作集
创建 DOCA Flow CT 管道时,用户必须定义操作集,就像他们对任何其他管道一样。
CT 管道中的字段必须在管道创建期间标记为 CHANGEABLE
。这允许在稍后的条目创建期间指定这些字段的实际标准。
仅支持与元数据和 NAT 相关的操作,如 struct doca_flow_ct_actions 中定义的那样。
在条目创建或更新期间,可以为每个方向指定不同的操作,从而允许操作内容和/或操作类型的变化。
功能启用
要启用用户操作,请配置以下参数:
DOCA Flow CT 管道创建期间的用户操作模板
用户操作的最大数量(DOCA Flow CT 初始化时的
nb_user_actions
)
在自主模式下使用操作
初始化
在 doca_flow_ct_init()
上配置以下参数:
nb_ctrl_queues
– 用于定义共享操作的控制队列数量nb_user_actions
– 支持的最大用户操作数(共享和非共享)worker_cb
– 与用户通信所需的回调
创建 DOCA 流 CT 管道
在 doca_flow_pipe_create()
上配置操作集。
创建共享操作
将 doca_flow_ct_actions_add_shared()
与其中一个控制队列一起使用。
共享操作可以在使用前的任何时间添加。
实现工作线程回调
从每个工作线程调用回调,以获取与用户代码和流的第一个数据包的同步。
关于 doca_flow_ct_rule_pkt_cb
:
确定应如何处理数据包
如果需要规则,则返回要使用的操作句柄
在托管模式下使用操作
初始化
在 doca_flow_ct_init()
上配置以下参数:
nb_ctrl_queues
– 用于定义共享操作的控制队列数量nb_user_actions
– 用户操作的最大数量。必须与 64 对齐。共享控制队列和非共享控制队列都缓存操作 ID 以加速 ID 分配。每个队列最多可以缓存 1024 个 ID。用户必须配置预期的操作数 + 总队列数 * 1024。此数字不能超过硬件支持的操作数。
创建 DOCA 流 CT 管道
在 doca_flow_pipe_create()
上配置操作集。
创建共享操作
将 doca_flow_ct_actions_add_shared()
与其中一个控制队列一起使用。
共享操作可以在使用前的任何时间添加。
添加条目
可以通过以下方式之一创建条目:
使用预定义的共享操作的操作句柄
使用特定于流且不可共享的操作数据(例如,用于 NAT 操作)
每个方向的条目可以具有不同的操作和/或不同的操作类型。
移除条目
与条目关联的非共享操作由 DOCA Flow CT 隐式销毁。
共享操作不会被销毁。用户可以一直使用它们,直到他们决定移除它们。
更新条目
可以按方向更新条目操作。共享/非共享操作的所有组合都适用(例如,从共享更新为非共享)。
DOCA Flow CT 允许每个流方向使用不同的转发管道。
DOCA Flow CT 支持两级转发管道:
管道级别 – 在 DOCA Flow CT 管道创建期间定义的单个转发管道,用于所有条目
条目级别 – 在条目创建期间定义的转发管道
DOCA Flow CT 在两个级别之一运行:
DOCA CT 条目级别转发具有以下特征:
仅支持
DOCA_FLOW_FWD_PIPE
(最多 4 个不同的转发管道)支持每个流方向的转发管道(两个方向可以具有相同/不同的转发管道)
必须在每个条目创建时设置转发管道(没有默认转发管道)
开启该功能:
创建转发类型 =
DOCA_FLOW_FWD_PIPE
和next_pipe
=NULL
的 DOCA Flow CT 管道。调用
doca_flow_ct_fwd_register
以注册转发管道并获取返回的fwd_handles
。
在托管模式下使用可更改的转发
初始化 DOCA Flow CT (
doca_flow_ct_init
)。注册转发管道 (
doca_flow_ct_fwd_register
)。定义可用于转发的管道
创建 DOCA Flow CT 管道 (
doca_flow_pipe_create
),并定义可能的转发管道。添加条目 (
doca_flow_ct_add_entry
)。设置从
doca_flow_ct_fwd_register
返回的源和/或回复fwd_handles
。
更新条目方向的转发 (
doca_flow_ct_update_entry
)。注意更新转发句柄需要使用先前的值设置所有其他参数。
在自主模式下使用可更改的转发
初始化 DOCA Flow CT (
doca_flow_ct_init
)。注册转发管道 (
doca_flow_ct_fwd_register
)。定义可用于转发的管道。
创建 DOCA Flow CT 管道 (
doca_flow_pipe_create
),并定义可能的转发管道。CT 工作线程开始处理流量。
在第一个流数据包上,调用
doca_flow_ct_rule_pkt
回调。在此回调中,确定是否应创建条目,以及应为此条目使用哪些操作和/或转发句柄。
不支持更新条目方向的转发。
有关库 API 参考,请参阅 DOCA 库 API 中的 DOCA Flow 和 CT API 文档。
Flow CT 库的 pkg-config (*.pc
文件) 包含在 DOCA 的常规定义中:doca
。
以下部分提供有关库 API 的更多详细信息。
enum doca_flow_ct_flags
DOCA Flow CT 配置可选标志。
标志 | 描述 |
| 启用内部管道计数器以用于数据包跟踪。调用 |
| 启用工作线程内部调试计数器定期转储。仅限自主模式。 |
| 禁用老化 |
| 启用 CT 工作线程软件数据包解析以支持 VLAN、IPv6 选项或特殊隧道类型 |
| 启用托管模式,在该模式下,用户应用程序负责管理数据包处理,并调用 CT API 来操作 CT 连接条目 |
| 允许为源和回复方向使用不同的 6 元组表定义。默认为对称模式,对回复方向使用相同的元数据和反向 5 元组。仅限托管模式。 |
| 为源和回复方向启用不同的计数器。仅限托管模式。 |
| 禁用计数器和老化以节省老化线程 CPU 周期 |
| 检查 CT 丢失流中的 TCP SYN 标志和 UDP,以识别 ADD 类型数据包。 |
| 提示流量来自上行链路线路并转发到上行链路线路。 注意
如果设置此标志,则方向信息必须为 |
| 启用硬件以计算和设置 L3 标头 (IPv4) 上的校验和 |
| 仅对 UDP 连接应用连接重复筛选器 |
enum doca_flow_ct doca_flow_ct_entry_flags
DOCA Flow CT 条目可选标志。
标志 | 描述 |
| 条目未缓冲;立即发送到硬件 |
| 将标志应用于源方向 |
| 将标志应用于回复方向 |
| 源方向为 IPv6; |
| 回复方向为 IPv6; |
| 将计数器应用于源方向 |
| 将计数器应用于回复方向 |
| 计数器在两个方向(源和回复)之间共享 |
| 在移除条目时启用流日志 |
| 在调用 |
| 在源方向上启用重复筛选器 |
| 在回复方向上启用重复筛选器 |
enum doca_flow_ct_rule_opr
在自主模式下使用共享操作处理流的选项。该决策在第一个流数据包上做出。
操作 | 描述 |
| 应使用所需共享操作句柄在 CT 管道中定义流 |
| 不应在 CT 管道中定义流。应丢弃数据包。 |
| 不应在 CT 管道中定义流。应传输数据包。 |
struct direction_cfg
用于源或回复方向的托管模式配置。
字段 | 描述 |
| 5 元组匹配模式应用于数据包内部层 |
| 掩码,用于指示要匹配的元数据字段和位 |
| 掩码,用于指示要在连接数据包匹配时修改的元数据字段和位 |
struct doca_flow_ct_worker_callbacks
用于在自主模式下使用共享操作的回调集。
字段 | 描述 |
| 在工作线程启动时调用,以与用户上下文同步 |
| 在工作线程结束时调用 |
| 在流的第一个数据包上调用 |
struct doca_flow_ct_cfg
DOCA Flow CT 配置。
uint32_t nb_arm_queues;
uint32_t nb_ctrl_queues;
uint32_t nb_user_actions;
uint32_t nb_arm_sessions[DOCA_FLOW_CT_SESSION_MAX];
uint32_t flags;
uint16_t aging_core;
uint16_t aging_query_delay_s;
doca_flow_ct_flow_log_cb flow_log_cb;
struct doca_flow_ct_aging_ops *aging_ops;
uint32_t base_core_id;
uint32_t dup_filter_sz;
union {
/* Managed mode configuration for origin and reply direction. */
struct direction_cfg direction[2
];
/* Below fields are dedicate for autonomous mode */
struct {
uint16_t tcp_timeout_s;
uint16_t tcp_session_del_s;
uint16_t udp_timeout_s;
enum
doca_flow_tun_type tunnel_type;
uint16_t vxlan_dst_port;
enum
doca_flow_ct_hash_type hash_type;
uint32_t meta_user_bits;
uint32_t meta_action_bits;
struct doca_flow_meta *meta_zone_mask;
struct doca_flow_meta *connection_id_mask;
struct doca_flow_ct_worker_callbacks worker_cb;
};
};
位置
字段 | 描述 |
| CT 队列的数量。在自主模式下,也是工作线程的数量。 |
| 用于定义共享操作的 CT 控制队列的数量 |
| 支持的最大用户操作数(共享和非共享) 最小值是 1K * ( |
| IPv4 和 IPv6 CT 连接的最大数量 |
| CT 配置标志 |
| CT 老化线程要绑定的 CPU 核心 ID。 |
| CT 老化代码延迟。 |
| 流日志回调函数(如果已设置) |
| 用户定义的老化逻辑回调函数。回退到默认老化逻辑 |
| 工作线程的基本核心 ID |
| 要在重复筛选器中缓存的连接数 |
| 用于源或回复方向的托管模式配置 |
| TCP 超时(秒) |
| 在 RST/FIN 后延迟或终止 TCP 会话的时间 |
| 封装隧道类型 |
| VXLAN 外部 UDP 目标端口(大端序) |
| 连接哈希表类型: |
| 用户拥有的用户数据包元数据位 |
| 由已识别的连接数据包携带的用户数据包元数据位 |
| 掩码,用于指示保存区域信息的元数据字段和位 |
| 掩码,用于指示 CT 内部连接 ID 的元数据字段和位 |
| 用于使用共享操作的工作线程回调 |
struct doca_flow_ct_actions
以下情况使用此结构:
用于定义共享操作。在这种情况下,操作数据由用户提供。操作句柄由 DOCA Flow CT 返回。
用于定义具有操作的条目。可以使用以下两个选项之一填充该结构:
使用先前创建的共享操作的操作句柄
使用非共享操作数据
DOCA Flow CT 操作结构。
enum
doca_flow_resource_type resource_type;
union {
/* Used when creating an entry with a shared action. */
uint32_t action_handle;
/* Used when creating an entry with non-shared action or when creating a shared action. */
struct {
uint32_t action_idx;
struct doca_flow_meta meta;
struct doca_flow_header_l4_port l4_port;
union {
struct doca_flow_ct_ip4 ip4;
struct doca_flow_ct_ip6 ip6;
};
} data;
};
位置
字段 | 描述 |
| 共享/非共享操作 |
| 共享操作句柄 |
| 操作模板索引 |
| 修改元数据值 |
| UDP 或 TCP 源端口和目标端口 |
| 源 IPv4 地址和目标 IPv4 地址 |
| 源 IPv6 地址和目标 IPv6 地址 |
meta
、l4_port
、ip4
和 ip6
中的值应从 bit0
(最低有效位)开始,无论掩码中设置了哪些位。例如,action_val.meta.u32[0] = DOCA_HTOBE32(0x12)
,action_mask.meta.u32[0] = DOCA_HTOBE32(0x0000FF00)
将位 15-8 设置为 0x12
。