共用方式為


一般分割卸載

一般分割卸載 (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,驅動程式必須使用 TCP 旗標填入 Layer4Flags 欄位 NetAdapterOffloadLayer4FlagTcpWithoutOptions

  3. 如果 NIC 支援 USO,驅動程式必須將 UDP 旗標填入 Layer4Flags 欄位 NetAdapterOffloadLayer4FlagUdp

  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 堆疊或過度配置通訊協定驅動程式要求變更 net adapter 的作用中功能,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);
}