共用方式為


通用分段卸載

一般分割卸載(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. 驅動程式必須設定 Layer3FlagsLayer4Flags

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

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

  4. MaximumOffloadSizeMinimumSegmentCount 是必要字段。

  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);
}