共用方式為


接收區段聯合(RSC)卸載

接收數據時,TCP/IP 堆疊中的大部分層都必須分別查看每個區段的標頭資訊。 當收到大量數據時,這會建立大量的額外負荷。

接收區段聯合處理(RSC) 通過將一系列接收的區段合併為一個單一的聯合區段,並通過 TCP/IP 堆疊進行傳送,以減少此額外負荷。 TCP/IP 堆疊中的上層只需要查看整個序列的一個標頭。

支援硬體中 RSC 的網路適配器 (NIC) 可大幅改善接收路徑效能。 它還可以減少主機 CPU 的使用率,因為它使通訊協定層免於在軟體中執行 RSC。

如需了解有關接收段合併 (RSC) 的更多詳細資訊,請參閱概觀

NetAdapterCX 也支援從 2.5 版開始的 UDP RSC (URO)。 如需詳細資訊,請參閱 UDP RSC 卸載(URO)

用於控制 RSC 卸除的 INF 關鍵詞

NetAdapterCx 會檢查登錄關鍵詞,並在啟用主動卸載功能時遵循它們。 驅動程式不需要採取任何進一步的動作。

RSC 標準化 INF 關鍵詞中指定的 RSC 關鍵詞 可透過登錄機碼設定來啟用/停用 RSC 加速功能。

關鍵字值的類型必須是 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. 用戶端驅動程序必須 NOT 在 NIC 中沒有硬體支援的任何類型的流量上執行 軟體 RSC。

下列規則適用於 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 結構:

  1. NetAdapterOffloadLayer3FlagIPv4NoOptionsNetAdapterOffloadLayer3FlagIPv6NoExtensions 是唯一有效的 Layer3Flags 字段值。 這些旗標分別表示 IPv4 和 IPv6 支援。

  2. NetAdapterOffloadLayer4FlagTcpNoOptionsNetAdapterOffloadLayer4FlagUdp 是唯一有效的 Layer4Flags 字段值。 這些旗標分別表示 TCP 和 UDP 支援。

  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 堆疊或上層協議驅動程式要求變更 net adapter 的活動 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);
}

UDP RSC 卸載(URO)

URO 能夠合併接收到的 UDP 區段。 NIC 可以將符合一組規則的 UDP 數據報從相同資料流合併成邏輯連續緩衝區。 然後,這些合併的數據報會以單一大型封包的形式向 Windows 網路堆疊表示。 如需 URO 規則的資訊,請參閱 UDP 封包合併 的規則。

用於控制 URO INF 關鍵詞中指定的 URO 關鍵詞,可用來透過登錄機碼設定啟用/停用 URO。

NetAdapterCx 用戶端驅動程式可以使用現有的 RSC 結構和 URO 的 RSC API。 若要設定 URO,用戶端驅動程式必須將 NET_ADAPTER_OFFLOAD_RSC_CAPABILITIES 結構中的 Layer4Flags 字段設定為 NetAdapterOffloadLayer4FlagUdp

URO 行為會鏡像 RSC,但有一個例外狀況。 當 EVT_NET_ADAPTER_OFFLOAD_SET_RSC 回呼停用 URO 時,驅動程式必須指示現有的合併區段,並等待所有正在處理的 URO 指示完成。 此方法可確保回呼結束後,沒有任何 URO 指示被激活。