設定 NetAdapterCx 電源管理
所有 NetAdapterCx 用戶端驅動程式都是 Windows Driver Framework (WDF) 驅動程式,其電源管理功能類似于所有 WDF 驅動程式。 NetAdapterCx 驅動程式需要額外的網路特定電源設定,如本文所述。
典型的網路裝置支援三個常見的電源管理功能:
當作業系統指示時,網路裝置可以進入較低電源的 (Dx) 狀態。
用戶端驅動程式會註冊選擇性的 WDF 事件回呼,以接收電源轉換的通知,如 支援 PnP 和函式驅動程式中的電源管理中所述。
如果網路裝置可以在系統保持運作 (S0) 狀態時進入其 Dx 狀態,則用戶端驅動程式應支援閒置電源關閉。 請參閱 支援閒置電源關閉。 除了適用于所有 WDF 裝置的標準 使用者控制裝置閒置和喚醒行為 之外,NetAdapterCx 還允許透過 *IdleRestriction 進行額外的網路特定閒置控制,如 電源管理的標準化 INF 關鍵字中所定義。
當網路裝置處於 Dx 狀態時,如果發生預先設定的喚醒條件,它可以觸發喚醒訊號。
如需 WDF 裝置如何從全系統低電源狀態喚醒系統的詳細資訊,請參閱 支援系統喚醒。
NetAdapterCx 提供 API,讓用戶端驅動程式宣告其硬體具有喚醒支援的網路事件。 請參閱 設定網路介面卡的電源功能。
當網路裝置處於 Dx 狀態時,它仍然可以回應一些常用的網路要求,以維護網路上的主機系統存在,而不需喚醒主機系統。 請參閱 設定網路介面卡的電源功能。
設定網路介面卡的電源功能
設定 WDF 電源管理功能之後,下一個步驟是設定網路介面卡的電源功能。 電源功能分為兩種類別:低電源通訊協定卸載功能和喚醒功能。
低電源通訊協定卸載功能
如需 Windows 網路堆疊如何使用這項功能的背景資訊,請參閱 NDIS 電源管理的通訊協定卸載。
用戶端驅動程式會呼叫適用于其硬體的下列方法,以設定其低電源通訊協定卸載功能:
喚醒功能
當裝置處於低電源狀態時,用戶端驅動程式會呼叫下列任一方法來設定其硬體支援的喚醒功能, (Dx) :
- NetAdapterWakeSetBitmapCapabilities
- NetAdapterWakeSetMagicPacketCapabilities
- NetAdapterWakeSetMediaChangeCapabilities
- NetAdapterWakeSetPacketFilterCapabilities
耗電量和繼續延遲
當網路裝置在 Dx 中時,它仍會耗用電源來執行卸載和喚醒。 裝置從 Dx 起始喚醒之後,裝置可以再次傳輸封包之前會有延遲。 裝置在 Dx 中耗用的電源狀態越深,但繼續延遲越長。
下表說明有關每個喚醒功能之耗電量與繼續延遲之間取捨的一般指導方針。
重要
某些資訊與預先發行的產品有關,在商業發行之前可能會大幅修改。 Microsoft 不會針對提供的資訊提出任何明示或隱含擔保。 如需特定裝置類型的詳細資訊,請參閱媒體特定檔和 Windows 硬體相容性計畫 (WHCP) 。
喚醒功能 | 喚醒事件 | 功率耗用量 | 繼續延遲 |
---|---|---|---|
PacketFilter | 任何封包符合已設定的 ReceivePacketFilter | 應該低於 D0 中的時間,且裝置必須保持適當的狀態,讓繼續延遲非常小 | <= 10 毫秒 |
點陣圖 | 任何封包符合設定的點陣圖模式 | 對於 PacketFilter 而言,它應該低於封包篩選的時機,因為它在繼續延遲時具有更多的緯度 | <= 300 毫秒 |
MagicPacket | Magic 封包 | 類似于點陣圖 | <= 300 毫秒 |
MediaChange | 已連線或中斷連線的媒體 | 類似于點陣圖 | <= 300 毫秒 |
下列範例說明用戶端驅動程式如何初始化其電源功能。 它會在啟動 net adapter 時執行這項操作,但在呼叫 NetAdapterStart之前。 在此範例中,用戶端驅動程式會設定其點陣圖、媒體變更和封包篩選喚醒功能。
//
// Set bitmap wake capabilities
//
NET_ADAPTER_WAKE_BITMAP_CAPABILITIES bitmapCapabilities;
NET_ADAPTER_WAKE_BITMAP_CAPABILITIES_INIT(&bitmapCapabilities);
bitmapCapabilities.BitmapPattern = TRUE;
bitmapCapabilities.MaximumPatternCount = deviceContext->PowerFiltersSupported;
bitmapCapabilities.MaximumPatternSize = 256;
NetAdapterWakeSetBitmapCapabilities(Adapter, &bitmapCapabilities);
//
// Set media change wake capabilities
//
NET_ADAPTER_WAKE_MEDIA_CHANGE_CAPABILITIES mediaChangeCapabilities;
NET_ADAPTER_WAKE_MEDIA_CHANGE_CAPABILITIES_INIT(&mediaChangeCapabilities);
mediaChangeCapabilities.MediaConnect = TRUE;
mediaChangeCapabilities.MediaDisconnect = TRUE;
NetAdapterWakeSetMediaChangeCapabilities(Adapter, &mediaChangeCapabilities);
//
// Set packet filter wake capabilities
//
if(deviceContext->SelectiveSuspendSupported)
{
NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES packetFilterCapabilities;
NET_ADAPTER_WAKE_PACKET_FILTER_CAPABILITIES_INIT(&packetFilterCapabilities);
packetFilterCapabilities.PacketFilterMatch = TRUE;
NetAdapterWakeSetPacketFilterCapabilities(Adapter, &packetFilterCapabilities);
}
用戶端可以選擇性地註冊 EVT_NET_DEVICE_PREVIEW_POWER_OFFLOAD 和 EVT_NET_DEVICE_PREVIEW_WAKE_SOURCE 回呼函式,以接受或拒絕連入通訊協定卸載和喚醒模式。
程式設計通訊協定電源卸載和喚醒模式
在裝置 的關閉電源順序期間,驅動程式會逐一查看已啟用的喚醒模式和通訊協定電源卸載,並將其程式化為硬體。 驅動程式會在 其 EvtDeviceArmWakeFromS0 和 EvtDeviceArmWakeFromSx 回呼函式中執行這項操作。
下列範例示範用戶端驅動程式如何逐一查看喚醒模式清單來檢查 magic 封包專案的喚醒,然後逐一查看電源卸載清單來處理 IPv4 ARP 通訊協定卸載:
NTSTATUS
EvtDeviceArmWakeFromSx(
WDFDEVICE Device
)
{
NETADAPTER adapter = GetDeviceContext(Device)->Adapter;
//
// Process wake source list
//
NET_WAKE_SOURCE_LIST wakeSourceList;
NET_WAKE_SOURCE_LIST_INIT(&wakeSourceList);
NetDeviceGetWakeSourceList(Device, &wakeSourceList);
for(UINT32 i = 0; i < NetWakeSourceListGetCount(&wakeSourceList; i++); i++)
{
NETWAKESOURCE wakeSource = NetWakeSourceListGetElement(&wakeSourceList, i);
NET_WAKE_SOURCE_TYPE const wakeSourceType = NetWakeSourceGetType(wakeSource);
if(wakeSourceType == NetWakeSourceTypeMagicPacket)
{
// Enable magic packet wake for the adapter
..
//
}
}
//
// Process power offload list
//
NET_POWER_OFFLOAD_LIST powerOffloadList;
NET_POWER_OFFLOAD_LIST_INIT(&powerOffloadList);
NetDeviceGetPowerOffloadList(Device, &powerOffloadList);
for(UINT32 i = 0; i < NetPowerOffloadListGetCount(&powerOffloadList); i++)
{
NETPOWEROFFLOAD powerOffload = NetPowerOffloadGetElement(&powerOffloadList, i);
NET_POWER_OFFLOAD_TYPE const powerOffloadType = NetPowerOffloadGetType(powerOffload);
if(powerOffloadType == NetPowerOffloadTypeArp)
{
// Enable ARP protocol offload for the adapter
..
//
}
}
return STATUS_SUCCESS;
}
回到 高電源 時,驅動程式通常會在對應的 EvtDeviceDisarmWakeFromSx 和 EvtDeviceDisarmFromS0 回呼中停用先前程式設計通訊協定電源卸載和喚醒模式。
報告喚醒原因
重要
用戶端驅動程式必須向 NetAdapterCx 回報喚醒原因。
當 NIC 硬體喚醒系統時,用戶端驅動程式必須向 NetAdapterCx 回報喚醒來源觸發喚醒。 對於大部分的喚醒來源,驅動程式會使用 NET_ADAPTER_WAKE_REASON_PACKET 結構來描述觸發喚醒的網路封包。
如果 NET_WAKE_SOURCE_TYPE 為:
NetWakeSourceTypeBitmapPattern,呼叫 NET_ADAPTER_WAKE_REASON_PACKET_INIT 以初始化 NET_ADAPTER_WAKE_REASON_PACKET 結構。 呼叫 NetAdapterReportWakeReasonPacket 來報告此喚醒原因。
NetWakeSourceTypeMagicPacket,呼叫 NET_ADAPTER_WAKE_REASON_MAGIC_PACKET_INIT 來初始化 NET_ADAPTER_WAKE_REASON_PACKET 結構。 呼叫 NetAdapterReportWakeReasonPacket 來報告此喚醒原因。
NetWakeSourceTypePacketFilterMatch,呼叫 NET_ADAPTER_WAKE_REASON_FILTER_PACKET_INIT 來初始化 NET_ADAPTER_WAKE_REASON_PACKET 結構。 呼叫 NetAdapterReportWakeReasonPacket 來報告此喚醒原因。
NetWakeSourceTypeMediaChange,呼叫 NetAdapterReportWakeReasonMediaChange 來報告此喚醒原因。
新式待命系統的電源管理案例
重要
針對新式待命平臺,網路設備磁碟機必須:
- 呼叫 WdfDeviceInitSetPnpPowerEventCallbacks 以註冊電源回呼。
- 呼叫 WdfDeviceAssignS0IdleSettings 以支援當系統處於其運作 (S0) 狀態時,裝置閒置。
- 呼叫 WdfDeviceInitSetPowerPolicyEventCallbacks 以註冊喚醒回呼。
- 支援適用于裝置類型的 低電源通訊協定卸載功能 。
- 支援適用于裝置類型的 喚醒功能 。
如需裝置類型的完整新式待命需求,請參閱媒體特定檔和 WHCP。
OS 負責網路裝置的電源原則決策。 例如,OS 會控制裝置何時必須移至 Dx,以及裝置應該喚醒的網路事件種類。 設備磁碟機的責任是在 OS 要求時可靠地執行電源轉換順序,然後針對 OS 所設定的喚醒條件正確程式設計其硬體。
OS 會根據一組廣泛的因素做出電源原則決策,包括全系統電源原則和使用者選擇。 以下是用於新式待命系統上網路裝置的一些常見電源原則:
重要
這些電源原則可能會隨著作業系統更新而變更,並提供下列資訊作為範例。 應避免 OS 的特定端對端行為相依性。
當電腦畫面已開啟且網路裝置已閒置時,OS 會要求裝置移至 Dx,並將它提供給 PacketFilter 和 MediaChange 喚醒。
當電腦進入新式待命且網路裝置已閒置時,OS 會要求 NIC 移至 Dx,並為其提供點陣圖、MediaChange 和 Magic 封包喚醒。
當電腦進入休眠狀態時,OS 會要求 NIC 移至 Dx,並將它用於 Magic Packet 喚醒。
注意:NetAdapterCx 用戶端驅動程式可控制電源管理索引標籤的可見度。如需詳細資訊,請參閱 裝置閒置和喚醒行為的使用者控制。