一般分割卸載
一般分割卸載 (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,用戶端驅動程式:
呼叫 NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT 來初始化 結構。
呼叫 NetAdapterOffloadSetGsoCapabilities 以向 NetAdapterCx 註冊結構。
在呼叫 期間,NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES_INIT 用戶端驅動程式會提供 EVT_NET_ADAPTER_OFFLOAD_SET_GSO 回呼的指標。 如果作用中卸載功能變更,系統稍後會叫用此回呼。
指出硬體 GSO 功能的規則
下列規則適用于 NET_ADAPTER_OFFLOAD_GSO_CAPABILITIES 結構:
驅動程式必須設定 Layer3Flags 和 Layer4Flags。
如果 NIC 支援 LSO,驅動程式必須使用 TCP 旗標填入 Layer4Flags 欄位
NetAdapterOffloadLayer4FlagTcpWithoutOptions
。如果 NIC 支援 USO,驅動程式必須將 UDP 旗標填入 Layer4Flags 欄位
NetAdapterOffloadLayer4FlagUdp
。MaximumOffloadSize 和 MinimumSegmentCount 是必要欄位。
Layer4OffsetLimit欄位是選擇性的。 如果 OS 傳送標頭位移大於指定限制的封包,則不會要求執行 GSO。
如果支援選項/延伸模組,則必須支援不含選項/延伸模組的 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 物件中提供更新的功能,讓用戶端驅動程式查詢以更新其卸載功能。
用戶端驅動程式可以呼叫下列函式,以判斷已啟用哪些卸載:
- NetOffloadIsLsoIPv4Enabled
- NetOffloadIsLsoIPv6Enabled
- NetOffloadIsUsoIPv4Enabled
- NetOffloadIsUsoIPv6Enabled
下列範例範例示範用戶端驅動程式如何更新其 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);
}