接收段合并 (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 功能,客户端驱动程序:
调用 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 来初始化 结构。
调用 NetAdapterOffloadSetRscCapabilities 将结构注册到 NetAdapterCx。
在调用 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES_INIT 客户端驱动程序提供指向 EVT_NET_ADAPTER_OFFLOAD_SET_RSC回调的 指针。 如果活动卸载功能发生更改,系统稍后会调用此回调。
用于指示硬件 RSC 功能的规则
- 客户端驱动程序 不得 对 NIC 中没有硬件支持的任何类型的流量执行 软件 RSC。
以下规则适用于 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 结构:
NetAdapterOffloadLayer3FlagIPv4NoOptions
和NetAdapterOffloadLayer3FlagIPv6NoExtensions
是 Layer3Flags 字段的唯一有效值。 这些标志分别指示 IPv4 和 IPv6 支持。NetAdapterOffloadLayer4FlagTcpNoOptions
是 Layer4Flags 字段的唯一有效值。如果设置了标志,
NetAdapterOffloadLayer4FlagTcpNoOptions
则必须设置第 3 层标志。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 卸载:
- NetOffloadIsTcpRscIPv4Enabled
- NetOffloadIsTcpRscIPv6Enabled
- NetOffloadIsRscTcpTimestampOptionEnabled
以下示例演示客户端驱动程序如何更新其 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);
}
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈