所有 NetAdapterCx 用戶端驅動程式都是 Windows 驅動程式架構 (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 中時,它仍會耗用電源來執行卸載和 AR 以喚醒。 裝置從 Dx 起始喚醒之後,裝置會再次傳輸封包之前會有延遲。 裝置進入的內部電源狀態越深,它在 Dx 中消耗的電量就越少,但恢復延遲就越長。
下表說明每個喚醒功能的耗電量與繼續延遲之間取捨的一般指導方針。
這很重要
一些資訊與預先發行的產品有關,這些產品在商業發行之前可能會進行重大修改。 Microsoft 對所提供的資訊不作任何明示或暗示的保證。 如需特定裝置類型的詳細資訊,請參閱媒體特定檔和 Windows 硬體相容性計劃 (WHCP) 。
| 喚醒功能 | 喚醒事件 | 耗電量 | 恢復延遲 |
|---|---|---|---|
| 封包過濾器 | 任何封包都符合已設定的 ReceivePacketFilter | 應該低於 D0 時,而且裝置需要保持在適當的狀態,才能讓繼續延遲非常小 | <= 10 毫秒 |
| 點陣圖 | 任何封包都符合配置的點陣圖模式 | 應該低於為 PacketFilter 武裝時,因為它在恢復延遲方面具有更大的自由度 | <= 300 毫秒 |
| 魔術包 | 魔術包 | 與Bitmap相似 | <= 300 毫秒 |
| 媒體變革 | 媒體已連線或中斷連線 | 與Bitmap相似 | <= 300 毫秒 |
下列範例說明用戶端驅動程式如何初始化其電源功能。 它會在啟動網路介面卡時執行此動作,但在呼叫 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 回呼函式中執行此動作。
下列範例顯示用戶端驅動程式如何逐一查看喚醒模式清單,以檢查魔術封包專案時的喚醒,然後逐一查看電源卸載清單以處理 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++)
{
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 = NetPowerOffloadListGetElement(&powerOffloadList, i);
NET_POWER_OFFLOAD_TYPE const powerOffloadType = NetPowerOffloadGetType(powerOffload);
if(powerOffloadType == NetPowerOffloadTypeArp)
{
// Enable ARP protocol offload for the adapter
..
//
}
}
return STATUS_SUCCESS;
}
在 返回高功率 的途中,驅動程式通常會停用對應 EvtDeviceDisarmWakeFromSx 和 EvtDeviceDisarmWakeFromS0 回呼中先前程式設計的通訊協定電源卸載和喚醒模式。 NetDeviceGetPowerOffloadList 和 NetDeviceGetWakeSourceList 可用來擷取回呼中的通訊協定電源卸載和喚醒模式。
報告喚醒原因
這很重要
用戶端驅動程式必須向 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 和魔術封包喚醒進行武裝。
當 PC 進入休眠狀態時,操作系統會要求 NIC 轉到 Dx 並武裝它以進行 Magic Packet 喚醒。
附註: NetAdapterCx 用戶端驅動程式會控制電源管理索引標籤的可見度。如需詳細資訊,請參閱 裝置閒置和喚醒行為的使用者控制。