設定 NetAdapterCx 電源管理

所有的 NetAdapterCx 用戶端驅動程式都是 Windows 驅動程式架構 (WDF) 驅動程式,與所有的 wdf 驅動程式類似的電源管理功能。 NetAdapterCx 驅動程式需要額外的網路特定電源設定,如本文中所述。

一般網路裝置支援三種常見的電源管理功能:

  • 當作業系統指示時,網路裝置可進入較低電源 (Dx) 狀態。

  • 當網路裝置處於 Dx 狀態時,如果發生預先設定的喚醒狀況,就會觸發喚醒信號。

    • 如需有關 WDF 裝置如何從全系統的低電源狀態喚醒系統的詳細資訊,請參閱 支援系統喚醒

    • NetAdapterCx 提供用戶端驅動程式的 Api,以宣告其硬體具有喚醒支援的網路事件。 請參閱下面的 網路介面卡設定電源功能 一節。

  • 當網路裝置處於 Dx 狀態時,它仍然可以回應一些常用的網路要求,以維護主機系統在網路上的目前狀態,而不需要喚醒主機系統。 請參閱下面的 網路介面卡設定電源功能 一節。

設定網路介面卡的電源功能

設定 WDF 電源管理功能之後,下一步是設定網路介面卡的電源功能。 電源功能分為兩類: 低電源通訊協定卸載功能喚醒功能

低電源通訊協定卸載功能

如需 Windows 網路堆疊如何利用這項功能的背景資訊,請參閱NDIS 電源管理的通訊協定卸載。

用戶端驅動程式會藉由呼叫適用于其硬體的下列方法來設定低功率通訊協定卸載功能:

喚醒功能

用戶端驅動程式會呼叫下列任何一種方法,以設定當裝置處於低電源狀態 (Dx) 時,硬體所支援的喚醒功能:

功率耗用量和恢復延遲

當網路裝置位於 Dx 時,它仍會耗用電源來執行卸載和 arm 以進行喚醒。 裝置從 Dx 啟動喚醒之後,會有延遲,裝置才能再次傳送封包。 裝置的內部電源狀態愈深,在 Dx 的情況下,裝置會耗用較少的電源,但恢復延遲愈久。

下表說明有關電源耗用量與每個喚醒功能之恢復延遲之間取捨的一般方針。

重要

某些資訊與 prereleased 產品相關,可能會在正式發行之前大幅修改。 對於提供的資訊,Microsoft 不做任何明示或默示的擔保。 如需特定裝置類型的詳細資訊,請參閱媒體專用檔和Windows 硬體相容性計畫 (WHCP)

喚醒功能 喚醒事件 功率耗用量 繼續延遲
PacketFilter 任何已設定的封包相符專案 ReceivePacketFilter 應低於 D0 中的時間,而裝置必須保持在適當的狀態,才能讓恢復延遲非常小 <= 10 毫秒
點陣圖 任何封包符合設定的點陣圖模式 應低於 PacketFilter 的時間,因為它在繼續延遲中有更多的緯度 <= 300 毫秒
MagicPacket 魔術封包 類似于點陣圖 <= 300 毫秒
MediaChange 媒體已連線或已中斷連線 類似于點陣圖 <= 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_OFFLOADEVT_NET_DEVICE_PREVIEW_WAKE_SOURCE 回呼函式,以接受或拒絕傳入的通訊協定卸載和喚醒模式。

程式設計通訊協定的電源卸載和喚醒模式

在裝置的關機 順序 期間,驅動程式會逐一查看啟用的喚醒模式和通訊協定的電源,並將它們程式化到硬體中。 驅動程式會在其 EvtDeviceArmWakeFromS0EvtDeviceArmWakeFromSx 回呼函式中執行這項工作。

下列範例顯示用戶端驅動程式如何逐一查看喚醒模式清單來檢查網路喚醒封包專案,然後逐一查看電源卸載清單來處理 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;
}

回到高電源,驅動程式通常會在對應的EvtDeviceDisarmWakeFromSxEvtDeviceDisarmWakeFromS0回呼中停用先前程式設計的通訊協定電源卸載和喚醒模式。

報告喚醒原因

重要

用戶端驅動程式必須將喚醒原因回報給 NetAdapterCx。

當 NIC 硬體喚醒系統時,用戶端驅動程式必須回報以 NetAdapterCx 哪些喚醒來源觸發了喚醒。 針對大部分的喚醒來源,驅動程式會使用 NET_ADAPTER_WAKE_REASON_PACKET 結構來描述觸發喚醒的網路封包。

如果 NET_WAKE_SOURCE_TYPE 為:

新式待命系統的電源管理案例

重要

針對新式待命平臺,網路設備磁碟機必須:

請參閱媒體專屬檔和 WHCP,以取得您裝置類型的完整新式待命需求。

作業系統負責網路裝置的電源原則決策。 例如,作業系統控制裝置必須移至 Dx 的時間,以及裝置應該喚醒的網路事件種類。 設備磁碟機的責任是在作業系統要求時可靠地執行電源轉換順序,然後針對 OS 所設定的喚醒條件正確地程式化硬體。

作業系統根據一組廣泛的因素(包括全系統電源原則和使用者選擇)進行電源原則決策。 以下是新式待命系統上用於網路裝置的一些常見電源原則:

重要

這些電源原則可能會隨著作業系統更新而變更,以下提供的資訊則是範例。 應避免作業系統特定端對端行為的相依性。

  • 當電腦螢幕已開啟且網路裝置已閒置時,作業系統會要求裝置進入 Dx,並將其用於 PacketFilter 和 MediaChange 喚醒。

  • 當電腦進入新式待命且網路裝置已閒置時,作業系統會要求 NIC 進入 Dx,並將其用於點陣圖、MediaChange 和魔術封包喚醒。

  • 當電腦進入休眠時,作業系統會要求 NIC 進入 Dx,並將其用於魔術封包喚醒。