接收段合并 (RSC) 卸载

接收数据时,TCP/IP 堆栈中的大多数层必须单独查看每个段的标头信息。 在接收大量数据时,这会产生大量开销。

接收段合并 (RSC) 通过合并一系列接收的段并在单个合并段中指示其 TCP/IP 堆栈来减少此开销。 TCP/IP 堆栈中的上层只需查看整个序列的一个标头。 在硬件中支持 RSC 的网络接口卡 (NIC) 可以大大提高接收路径性能。 它还可以减少主机 CPU 使用率,因为它使协议层在软件中无法执行 RSC。

有关 RSC 的更多详细信息,请参阅 接收段合并概述

用于控制 RSC 卸载的 INF 关键字

NetAdapterCx 检查注册表关键字,并在启用主动卸载功能时遵循它们。 驱动程序不需要执行任何进一步的操作。

RSC 的标准化 INF 关键字中指定的 RSC 关键字 可用于通过注册表项设置启用/禁用 RSC 卸载。

关键字 (keyword) 值的类型必须为 REG_SZ

配置 RSC 卸载

客户端驱动程序首先在网络适配器初始化期间播发其硬件的 RSC 功能。 在启动网络适配器之前,这可能在其 EvtDevicePrepareHardware 回调中发生。

若要配置 RSC 功能,客户端驱动程序:

  1. 分配 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 结构。

  2. 调用 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 来初始化 结构。

  3. 调用 NetAdapterOffloadSetRscCapabilities 将结构注册到 NetAdapterCx。

在调用 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 客户端驱动程序提供指向 EVT_NET_ADAPTER_OFFLOAD_SET_RSC回调的 指针。 如果活动卸载功能发生更改,系统稍后会调用此回调。

用于指示硬件 RSC 功能的规则

  1. 客户端驱动程序 不得 对 NIC 中没有硬件支持的任何类型的流量执行 软件 RSC。

以下规则适用于 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 结构:

  1. NetAdapterOffloadLayer3FlagIPv4NoOptionsNetAdapterOffloadLayer3FlagIPv6NoExtensionsLayer3Flags 字段的唯一有效值。 这些标志分别指示 IPv4 和 IPv6 支持。

  2. NetAdapterOffloadLayer4FlagTcpNoOptionsLayer4Flags 字段的唯一有效值。

  3. 如果设置了标志, NetAdapterOffloadLayer4FlagTcpNoOptions 则必须设置第 3 层标志。

  4. TcpTimestampOption 字段是可选的。 客户端驱动程序在调用 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 之后和调用 NetAdapterOffloadSetRscCapabilities 之前设置此字段,以指示 NIC 是否支持 TCP 时间戳选项。

以下示例演示客户端驱动程序如何设置其 RSC 硬件卸载功能。

VOID
MyAdapterSetRscOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's RSC offload capabilities
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES rscOffloadCapabilities;
    NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT(
        &rscOffloadCapabilities,
        NetAdapterOffloadLayer3FlagIPv4NoOptions | NetAdapterOffloadLayer3FlagIPv6NoExtensions,
        NetAdapterOffloadLayer4FlagTcpNoOptions,
        MyEvtAdapterOffloadSetRsc);
    rscOffloadCapabilities.TcpTimestampOption = FALSE;

    // Set the current RSC offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetRscCapabilities(NetAdapter, &rscOffloadCapabilities);
}

更新 RSC 硬件卸载

如果 TCP/IP 堆栈或覆盖协议驱动程序请求更改网络适配器的活动 RSC 功能,NetAdapterCx 会调用在 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 中注册的客户端驱动程序EVT_NET_ADAPTER_OFFLOAD_SET_RSC回调。 在此回调中,系统在 NETOFFLOAD 对象中提供更新的功能,客户端驱动程序可以查询这些功能以更新其卸载功能。

客户端驱动程序可以调用以下函数来确定启用了哪些 RSC 卸载:

以下示例演示客户端驱动程序如何更新其 RSC 卸载功能:

VOID
MyEvtAdapterOffloadSetRsc(
    NETADAPTER NetAdapter,
    NETOFFLOAD Offload
)
{
    PMY_NET_ADAPTER_CONTEXT adapterContext = NetvAdapterGetContext(NetAdapter);

    // Store the updated information in the context
    adapterContext->IsRscIPv4Enabled = NetOffloadIsTcpRscIPv4Enabled(Offload);
    adapterContext->IsRscIPv6Enabled = NetOffloadIsTcpRscIPv6Enabled(Offload);
    adapterContext->IsRscTcpTimestampOptionEnabled = NetOffloadIsRscTcpTimestampOptionEnabled(Offload);
}