DOCA 文档 v2.10.0

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 连接条目操作 – 添加、移除或更新连接条目

  • 回调 – 处理异步条目处理结果

  • 管道和条目统计信息

arch-diagram-version-1-modificationdate-1733817839977-api-v2.png

老化

老化时间是以秒为单位的时间,用于设置会话在没有看到数据包的情况下可以保持的最大允许时间。如果该时间过去后仍未检测到数据包,则会话将终止。

为了支持老化,启动了一个专用的老化线程来轮询和检查所有连接的计数器。

自主模式

在此模式下,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 连接已关闭

  • srchairpin – 用于转发管道和工作线程以传递数据包

autonomous-mode-diagram-version-1-modificationdate-1733817840317-api-v2.png

托管模式

应用程序负责在此模式下管理工作线程,解析和处理连接的生命周期。

托管模式使用 DOCA Flow CT 管理 API 来创建或销毁连接。

CT 老化模块通过调用回调来通知老化超时的连接。

用户可以为每个数据包方向创建具有不同模式、元数据或计数器的连接规则。

信息

用户负责定义元数据和掩码以进行 matchmodify

用户可以先创建一个连接规则,然后使用 API doca_flow_ct_entry_add_dir() 创建另一个规则。

managed-mode-diagram-version-1-modificationdate-1733817840513-api-v2.png

DOCA Flow API 可用于使用 CT 专用队列处理 CT 条目。

  • doca_flow_entries_process – 处理队列中的管道条目

  • doca_flow_aging_handle – 处理管道条目老化

信息

不支持其他 DOCA Flow API,如 CT 条目状态查询和管道丢失查询。


DPU

要在 DPU 上启用 DOCA Flow CT,请在 Arm 上执行以下操作:

  1. 在 Linux 启动命令中启用 iommu.passthrough(或从 DPU BIOS 禁用 SMMU)

    1. 运行

      复制
      已复制!
                  

      sudo vim /etc/default/grub

    2. 设置 GRUB_CMDLINE_LINUX="iommu.passthrough=1"

    3. 运行

      复制
      已复制!
                  

      sudo update-grub sudo reboot

  2. 使用 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 命令。

  3. 按如下所示更新 /etc/mellanox/mlnx-bf.conf

    复制
    已复制!
                

    ALLOW_SHARED_RQ="no"

  4. 在主机和 Arm 端执行电源循环。

  5. 如果使用单端口,请将 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

  6. 如果使用两个 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

  7. 定义巨页(请参阅 DOCA Flow 先决条件)。

ConnectX

要在 NVIDIA® ConnectX® 上启用 DOCA Flow CT,请执行以下操作:

  1. 使用 LAG_RESOURCE_ALLOCATION=1 配置固件

    复制
    已复制!
                

    sudo mlxconfig -d <device-id> s LAG_RESOURCE_ALLOCATION=1

    信息

    mst status -v 命令的输出中检索 device-id。如果在 MST 选项卡下,该值为 N/A,请运行 mst start 命令。

  2. 执行电源循环。

  3. 如果使用单端口

    复制
    已复制!
                

    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

  4. 如果使用两个 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 value true cmode runtime

    信息

    mst status -v 命令的输出中检索 pcie-address

  5. 定义巨页(请参阅 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 个不同的转发管道)

  • 支持每个流方向的转发管道(两个方向可以具有相同/不同的转发管道)

  • 必须在每个条目创建时设置转发管道(没有默认转发管道)

开启该功能:

  1. 创建转发类型 = DOCA_FLOW_FWD_PIPEnext_pipe = NULL 的 DOCA Flow CT 管道。

  2. 调用 doca_flow_ct_fwd_register 以注册转发管道并获取返回的 fwd_handles

在托管模式下使用可更改的转发

  1. 初始化 DOCA Flow CT (doca_flow_ct_init)。

  2. 注册转发管道 (doca_flow_ct_fwd_register)。

    • 定义可用于转发的管道

  3. 创建 DOCA Flow CT 管道 (doca_flow_pipe_create),并定义可能的转发管道。

  4. 添加条目 (doca_flow_ct_add_entry)。

    • 设置从 doca_flow_ct_fwd_register 返回的源和/或回复 fwd_handles

  5. 更新条目方向的转发 (doca_flow_ct_update_entry)。

    注意

    更新转发句柄需要使用先前的值设置所有其他参数。

在自主模式下使用可更改的转发

  1. 初始化 DOCA Flow CT (doca_flow_ct_init)。

  2. 注册转发管道 (doca_flow_ct_fwd_register)。

    • 定义可用于转发的管道。

  3. 创建 DOCA Flow CT 管道 (doca_flow_pipe_create),并定义可能的转发管道。

  4. CT 工作线程开始处理流量。

  5. 在第一个流数据包上,调用 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 配置可选标志。

标志

描述

DOCA_FLOW_CT_FLAG_STATS = 1u << 0

启用内部管道计数器以用于数据包跟踪。调用 doca_flow_pipe_dump(<ct_pipe>) 以转储计数器值。每次调用都会转储更改的值。

DOCA_FLOW_CT_FLAG_WORKER_STATS = 1u << 1,

启用工作线程内部调试计数器定期转储。仅限自主模式。

DOCA_FLOW_CT_FLAG_NO_AGING = 1u << 2,

禁用老化

DOCA_FLOW_CT_FLAG_SW_PKT_PARSING = 1u << 3,

启用 CT 工作线程软件数据包解析以支持 VLAN、IPv6 选项或特殊隧道类型

DOCA_FLOW_CT_FLAG_MANAGED = 1u << 4,

启用托管模式,在该模式下,用户应用程序负责管理数据包处理,并调用 CT API 来操作 CT 连接条目

DOCA_FLOW_CT_FLAG_ASYMMETRIC = 1u << 5,

允许为源和回复方向使用不同的 6 元组表定义。默认为对称模式,对回复方向使用相同的元数据和反向 5 元组。仅限托管模式。

DOCA_FLOW_CT_FLAG_ASYMMETRIC_COUNTER = 1u << 6,

为源和回复方向启用不同的计数器。仅限托管模式。

DOCA_FLOW_CT_FLAG_NO_COUNTER = 1u << 7,

禁用计数器和老化以节省老化线程 CPU 周期

DOCA_FLOW_CT_FLAG_DEFAULT_MISS = 1u << 8,

检查 CT 丢失流中的 TCP SYN 标志和 UDP,以识别 ADD 类型数据包。

DOCA_FLOW_CT_FLAG_WIRE_TO_WIRE = 1u << 9,

提示流量来自上行链路线路并转发到上行链路线路。

注意

如果设置此标志,则方向信息必须为 DOCA_FLOW_DIRECTION_NETWORK_TO_HOST

DOCA_FLOW_CT_FLAG_CALC_TUN_IP_CHKSUM = 1u << 10,

启用硬件以计算和设置 L3 标头 (IPv4) 上的校验和

DOCA_FLOW_CT_FLAG_DUP_FILTER_UDP_ONLY= 1u << 11,

仅对 UDP 连接应用连接重复筛选器


enum doca_flow_ct doca_flow_ct_entry_flags

DOCA Flow CT 条目可选标志。

标志

描述

DOCA_FLOW_CT_ENTRY_FLAGS_NO_WAIT = (1 << 0)

条目未缓冲;立即发送到硬件

DOCA_FLOW_CT_ENTRY_FLAGS_DIR_ORIGIN = (1 << 1)

将标志应用于源方向

DOCA_FLOW_CT_ENTRY_FLAGS_DIR_REPLY = (1 << 2)

将标志应用于回复方向

DOCA_FLOW_CT_ENTRY_FLAGS_IPV6_ORIGIN = (1 << 3)

源方向为 IPv6;doca_flow_ct_match 结构中的源匹配联合为 IPv6

DOCA_FLOW_CT_ENTRY_FLAGS_IPV6_REPLY = (1 << 4)

回复方向为 IPv6;doca_flow_ct_match 结构中的回复匹配联合为 IPv6

DOCA_FLOW_CT_ENTRY_FLAGS_COUNTER_ORIGIN = (1 << 5)

将计数器应用于源方向

DOCA_FLOW_CT_ENTRY_FLAGS_COUNTER_REPLY = (1 << 6)

将计数器应用于回复方向

DOCA_FLOW_CT_ENTRY_FLAGS_COUNTER_SHARED = (1 << 7)

计数器在两个方向(源和回复)之间共享

DOCA_FLOW_CT_ENTRY_FLAGS_FLOW_LOG = (1 << 8)

在移除条目时启用流日志

DOCA_FLOW_CT_ENTRY_FLAGS_ALLOC_ON_MISS = (1 << 9)

在调用 doca_flow_ct_entry_prepare() API 时,在找不到条目时分配

DOCA_FLOW_CT_ENTRY_FLAGS_DUP_FILTER_ORIGIN = (1 << 10)

在源方向上启用重复筛选器

DOCA_FLOW_CT_ENTRY_FLAGS_DUP_FILTER_REPLY = (1 << 11)

在回复方向上启用重复筛选器


enum doca_flow_ct_rule_opr

在自主模式下使用共享操作处理流的选项。该决策在第一个流数据包上做出。

操作

描述

DOCA_FLOW_CT_RULE_OK

应使用所需共享操作句柄在 CT 管道中定义流

DOCA_FLOW_CT_RULE_DROP

不应在 CT 管道中定义流。应丢弃数据包。

DOCA_FLOW_CT_RULE_TX_ONLY

不应在 CT 管道中定义流。应传输数据包。


struct direction_cfg

用于源或回复方向的托管模式配置。

字段

描述

bool match_inner

5 元组匹配模式应用于数据包内部层

struct doca_flow_meta *zone_match_mask

掩码,用于指示要匹配的元数据字段和位

struct doca_flow_meta *meta_modify_mask

掩码,用于指示要在连接数据包匹配时修改的元数据字段和位


struct doca_flow_ct_worker_callbacks

用于在自主模式下使用共享操作的回调集。

字段

描述

doca_flow_ct_sync_acquire_cb worker_init

在工作线程启动时调用,以与用户上下文同步

doca_flow_ct_sync_release_cb worker_release

在工作线程结束时调用

doca_flow_ct_rule_pkt_cb rule_pkt

在流的第一个数据包上调用


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;               };       };

位置

字段

描述

uint32_t nb_arm_queues

CT 队列的数量。在自主模式下,也是工作线程的数量。

uint32_t nb_ctrl_queues

用于定义共享操作的 CT 控制队列的数量

uint32_t nb_user_actions

支持的最大用户操作数(共享和非共享)

最小值是 1K * (nb_ctrl_queues + nb_arm_queues )

uint32_t nb_arm_sessions[DOCA_FLOW_CT_SESSION_MAX]

IPv4 和 IPv6 CT 连接的最大数量

uint32_t flags

CT 配置标志

uint16_t aging_core

CT 老化线程要绑定的 CPU 核心 ID。

uint16_t aging_core_delay

CT 老化代码延迟。

doca_flow_ct_flow_log_cb flow_log_cb

流日志回调函数(如果已设置)

struct doca_flow_ct_aging_ops *aging_ops

用户定义的老化逻辑回调函数。回退到默认老化逻辑

uint32_t base_core_id

工作线程的基本核心 ID

uint32_t dup_filter_sz

要在重复筛选器中缓存的连接数

struct direction_cfg direction

用于源或回复方向的托管模式配置

uint16_t tcp_timeout_s

TCP 超时(秒)

uint16_t tcp_session_del_s

在 RST/FIN 后延迟或终止 TCP 会话的时间

enum doca_flow_tun_type tunnel_type

封装隧道类型

uint16_t vxlan_dst_port

VXLAN 外部 UDP 目标端口(大端序)

enum doca_flow_ct_hash_type hash_type

连接哈希表类型:NONESYMMETRIC_HASH

uint32_t meta_user_bits

用户拥有的用户数据包元数据位

uint32_t meta_action_bits

由已识别的连接数据包携带的用户数据包元数据位

struct doca_flow_meta *meta_zone_mask

掩码,用于指示保存区域信息的元数据字段和位

struct doca_flow_meta *connection_id_mask

掩码,用于指示 CT 内部连接 ID 的元数据字段和位

struct doca_flowct_worker_callbacks worker_cb

用于使用共享操作的工作线程回调


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;      };

位置

字段

描述

enum doca_flow_resource_type resource_type

共享/非共享操作

uint32_t action_handle

共享操作句柄

uint32_t action_idx

操作模板索引

struct doca_flow_meta meta

修改元数据值

struct doca_flow_header_l4_port l4_port

UDP 或 TCP 源端口和目标端口

struct doca_flow_ct_ip4 ip4

源 IPv4 地址和目标 IPv4 地址

struct doca_flow_ct_ip6 ip6

源 IPv6 地址和目标 IPv6 地址

信息

metal4_portip4ip6 中的值应从 bit0(最低有效位)开始,无论掩码中设置了哪些位。例如,action_val.meta.u32[0] = DOCA_HTOBE32(0x12)action_mask.meta.u32[0] = DOCA_HTOBE32(0x0000FF00) 将位 15-8 设置为 0x12


© 版权所有 2025 NVIDIA。 上次更新时间:2025 年 2 月 12 日。