通用分段卸載

一般分割卸載(GSO)包括 大型傳送卸載(LSO) 和 UDP 傳送卸載(USO)。

用戶端驅動程式可以分擔將大於網路媒介最大傳輸單位(MTU)的 TCP/UDP 封包進行分割的工作。 驅動程式必須使用 GSO API 向 NetAdapterCx 指出這項功能。

用於控制 GSO 的 INF 關鍵詞

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

使用登錄值啟用和停用工作卸載 中指定的 LSO 關鍵詞可以用來啟用/停用登錄機碼設定的 LSO 卸載。

UDP 分段卸載 (USO) 中指定的 USO 關鍵詞可用來啟用/停用藉由登錄機碼設定的 USO 卸載。

關鍵字值的類型必須是 REG_SZ。

設定 GSO

用戶端驅動程式會在網路適配器初始化期間,先公告其硬體的 GSO 功能。 這可能會發生在其 EvtDevicePrepareHardware 回呼中,再啟動網路適配器。

若要設定 GSO,用戶端驅動程式:

  1. 配置 NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES 結構。

  2. 呼叫 NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT 來初始化 結構。

  3. 呼叫 NetAdapterOffloadSetGsoCapabilities,向 NetAdapterCx 註冊結構。

在調用 NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT 的過程中,用戶端驅動程式提供了指向 EVT_NET_ADAPTER_OFFLOAD_SET_GSO 回呼的指標。 如果作用中的離載功能變更,系統稍後會叫用此回呼。

指出硬體 GSO 功能的規則

下列規則適用於 NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES 結構:

  1. 驅動程式必須設定 Layer3Flags 和 Layer4Flags。

  2. 如果 NIC 支援 LSO,驅動程式必須使用 TCP 旗標填入 NetAdapterOffloadLayer4FlagTcpWithoutOptions 字段。

  3. 如果 NIC 支援 USO,驅動程式必須使用 UDP 旗標填入 NetAdapterOffloadLayer4FlagUdp 字段。

  4. MaximumOffloadSize 和 MinimumSegmentCount 是必要字段。

  5. Layer4OffsetLimit 字段是選擇性的。 如果 OS 傳送標頭位移大於指定限制的封包,則不會要求執行 GSO。

  6. 如果支援選項/擴充功能,則必須支援不含選項/延伸模組的IP/TCP 封包。

此範例示範客戶端驅動程式如何設定其硬體卸除功能。

VOID
MyAdapterSetOffloadCapabilities(
    NETADAPTER NetAdapter
)
{
    // Configure the hardware's GSO offload capabilities
    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES gsoOffloadCapabilities;

    auto const layer3Flags = NetAdapterOffloadLayer3FlagIPv4NoOptions |
        NetAdapterOffloadLayer3FlagIPv4WithOptions |
        NetAdapterOffloadLayer3FlagIPv6NoExtensions |
        NetAdapterOffloadLayer3FlagIPv6WithExtensions;

    auto const layer4Flags = NetAdapterOffloadLayer4FlagTcpNoOptions |
        NetAdapterOffloadLayer4FlagTcpWithOptions;
        NetAdapterOffloadLayer4FlagUdp;

    NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT(
        &gsoOffloadCapabilities,
        layer3Flags,
        layer4Flags,
        MY_GSO_OFFLOAD_MAX_SIZE,
        MY_GSO_OFFLOAD_MIN_SEGMENT_COUNT,
        EvtAdapterOffloadSetGso);

    gsoOffloadCapabilities.Layer4OffsetLimit = 127;

    // Set the current GSO offload capabilities and register the callback for future changes in active capabilities
    NetAdapterOffloadSetGsoCapabilities(NetAdapter, &gsoOffloadCapabilities);
}

更新硬體卸載

如果 TCP/IP 堆疊或上層通訊協定驅動程式要求變更網路配接器的作用功能,NetAdapterCx 會叫用在配接器初始化期間註冊的用戶端驅動程式的 EVT_NET_ADAPTER_OFFLOAD_SET_GSO 回呼。 在此函式中,系統會在 NETOFFLOAD 物件中提供更新的功能,用戶端驅動程式會查詢以更新其卸載功能。

用戶端驅動程式可以呼叫下列函式,以判斷已啟用哪些卸載功能:

下列範例示範客戶端驅動程式如何更新其 GSO 卸除功能:

VOID
MyEvtAdapterOffloadSetGso(
	NETADAPTER NetAdapter,
	NETOFFLOAD Offload
)
{
	PMY_NET_ADAPTER_CONTEXT adapterContext = MyGetNetAdapterContext(NetAdapter);

	// Store the updated information in the context
	adapterContext->LSOv4 = NetOffloadIsLsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->LSOv6 = NetOffloadIsLsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv4 = NetOffloadIsUsoIPv4Enabled(Offload) ? 
		GsoOffloadEnabled : GsoOffloadDisabled;
	adapterContext->USOv6 = NetOffloadIsUsoIPv6Enabled(Offload) ?
		GsoOffloadEnabled : GsoOffloadDisabled;

	// Enable hardware checksum if LSO/USO is enabled
	MyUpdateHardwareChecksum(adapterContext);
}