无状态功能卸载
cx4支持多种类型的无状态卸载,如下面列表所示。
- Checksum Offload
- Large Send Offloads
- Receive Side Scaling
- Transmit Side Scaling
- Interrupt Moderation
- Large Receive Offloads
- VLAN insertion and stripping
- Flow Steering at layers 2, 3 and 4
- Packet padding (TX)
- 在以下情境下支持RX的头部和尾部添加负载数据。
IPv4 and IPv6 packets
Layer 2: Ethernet
checksum Offload
支持计算收方向RX和发方向TX的数据包checksum,可以卸载基于ipv4/ipv6的L3 checksum和上层tcp/udp的checksum。
通过查看csum_cap bit获取功能是否使能,发送报文的时候在WQE中设置支持checksum offload,不需要软件再来计算ip层和tcp/udp的checksum,如果软件已经填写了,将会被忽略,网卡重新计算。
(note: 发送tcp/udp报文时候,如果ipv6 有路由扩展头,或者ipv4有lSRR SSRR选项,checksum计算将不支持)
收包的checksum通过CQE来表达,l4_ok, l3_ok - indicate whether checksum calculation of the packet was okay
Large Send Offload (LSO)
在发包阶段,可以添加预先设置的模板的大包数据,通过CQE中字段反馈是否添加成功。
Receive Side Scaling (RSS)
适配器的 RSS 与 NDIS RSS 规范兼容。RSS通过将接受的报文分配到不同的ring中,以便重定向到不通的cpu core接收,达到负载均衡的效果。
RSS 通过两种机制实现:流表和 TIR。流表规则对数据包进行分类并将特定的流量类别(例如 TCP/UDP、仅 IP)传送到专用的 TIR。 Indirect 类型的 TIR 负责传播它们从流表接收到的属于特定流量类别的流量。通过打开与默认 RQ 关联的 Direct 类型的专用 TIR 并配置流表以向该“默认”TIR 传送所有应传送到默认 RQ 而不是传输到其他RQ.
这允许为不同的流量类别支持不同的 RSS 传播模式。例如,流表规则可以将所有 TCP IPv4 数据包传送到使用 <Source IP, Destination IP, Source TCP Port, Destination TCP port> 传播的 TIR,将 TCP IPv6 数据包传送到使用 <Source IP, Destination IP> 传播的 TIR 和将 UDP 数据包传送到“默认”TIR。
通过查看HCA_CAP.rss_ind_tbl_cap. 判断是否使能。
(transport interface receive (TIR) 对象负责在接收端执行所有与传输相关的操作。 TIR 执行数据包处理和重组,还负责将数据包解复用到不同的 RQ。多路分解支持将数据包传送到列出的一个或多个 RQ,或从列表中基于hash选择单个 RQ)
TIR Spreading Traffic Mechanism
TIR 上下文,调度程序类型为 Indirect,根据选定的数据包字段选择目标 RQ。 TIR 使用可配置的散列函数并根据选定的数据包字段计算散列值。 TIR 上下文根据 rx_hash_fields_selector_outer 和 rx_hash_fields_selector_inner 字段选择一个数据包字段,这些字段设置了哪个字段必须参与 RQ 选择。请注意,只有包含由 TIR 的 rx_hash_fields_selector_outer/rx_hash_fields_selector_inner 选择的字段的数据包必须传送到此指定的 TIR。例如,如果选择了 TCP 目标/源端口,则只应将具有 TCP 目标/源端口 (UDP/TCP) 的数据包传送到该 TIR。这可以通过适当的流表规则配置来实现,例如,这将确保只有 TCP/UDP 数据包被传送到使用 TCP 端口进行 RQ 选择的 TIR。计算出的哈希值指向一个间接表(用 RQs Tables 实现)。间接表条目指向 RQ,以进一步处理传入的数据包。 RX哈希值、选择字段和数据包类型上报给CQE。
Transmit Side Scaling
传输端缩放支持从多个 CPU 内核在多个描述符环上同时传输数据包。为此,应创建多个 SQ。多个 SQ 可以附加到同一个 TIS。
(TIS transport interface send (TIS) 对象负责执行传输端的所有传输相关操作。来自发送队列的消息被 TIS 分段和传输,包括所有传输所需的影响,例如在大量发送卸载的情况下,TIS 负责分段)
Interrupt Moderation
Completion Event Moderation (CEM) 延迟 CQ 发布 Completion Event,直到在该队列上报告多个完成。这使得能够在多个工作完成之间分摊完成事件处理程序调用的开销,提升效率。
可以为每个 CQ 单独启用 CEM。
当满足以下任一条件时,设定的 CQ 将生成事件:
- cq_period 计时器已过期,并且此 CQ 有一个未决事件(如果不受节制,则会生成一个事件)。cq_period 计时器在事件生成或完成生成时重新启动,具体取决于 CQ .cq_period_mode
- 达到cq_max_count个数
Large Receive Offload (LRO)
该设备支持 TCP 流的大型接收卸载 (LRO)。该实现与 NDIS 接收段合并Receive Segment Coalescing (RSC) 完全兼容。
VLAN Insertion/Stripping
该设备卸载原始以太网帧的 VLAN 插入和剥离。
VLAN 插入由驱动程序执行,将 VLAN 标记内联到 WQE Eth 段中的以太网帧标头中.
通过 VLAN Stripping Disable (vsd) 位在 RQ 中配置 VLAN 剥离。当配置为执行 VLAN 剥离时,设备会从传入帧中删除 VLAN 标记并在 CQE 字段中报告它。
对于隧道数据包,外部和内部 VLAN 都可以通过 VLAN 插入卸载来操作,通过内联外部和内部帧头,但只有外部 VLAN 可以此机制来删除。
通过 QUERY_HCA_CAP vlan_cap 字段报告对 VLAN 插入和剥离的支持
Packet Padding (TX)
小于 64 字节的以太网数据包在传输时通过附加尾随零(在 FCS 之前)自动填充到 64 字节。此外,如果 LSO 数据包的最后一段短于 64B,也会自动填充为 64B。
对于以太网上的封装帧,外部以太网数据包由设备自动填充为 64 字节。内部框架保持不变。