配置 NetAdapterCx 电源管理

所有 NetAdapterCx 客户端驱动程序都是 Windows 驱动程序框架(WDF)驱动程序,其电源管理功能类似于所有 WDF 驱动程序。 如本文所述,NetAdapterCx 驱动程序需要其他特定于网络的电源配置。

典型的网络设备支持三种常见的电源管理功能:

设置网络适配器的电源功能

配置 WDF 电源管理功能后,下一步是设置网络适配器的电源功能。 电源功能分为两类:低功率协议卸载功能和唤醒功能

低功率协议卸载功能

有关 Windows 网络堆栈如何使用此功能的背景信息,请参阅 NDIS 电源管理的协议卸载

客户端驱动程序通过调用适用于其硬件的以下方法来设置其低功率协议卸载功能:

唤醒功能

客户端驱动程序调用以下任一方法,以设置设备处于低功率状态时其硬件支持的唤醒功能(Dx):

能耗和恢复延迟

当网络设备位于 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_OFFLOADEVT_NET_DEVICE_PREVIEW_WAKE_SOURCE 回调函数以接受或拒绝传入协议卸载和唤醒模式。

编程协议电源卸载和唤醒模式

在设备的 停电顺序期间,驱动程序循环访问已启用的唤醒模式和协议电源卸载,并将其编程到硬件中。 驱动程序在 EvtDeviceArmWakeFromS0EvtDeviceArmWakeFromSx 回调函数中执行此作。

以下示例演示客户端驱动程序如何循环访问唤醒模式列表以检查 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++)
    {
        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;
}

在回到高功率的路上,驱动程序通常会在相应的 EvtDeviceDisarmWakeFromSxEvtDeviceDisarmWakeDisarmFromS0 回调中禁用以前编程的协议电源卸载和唤醒模式。 NetDeviceGetPowerOffloadListNetDeviceGetWakeSourceList 可用于检索回调中的协议电源卸载和唤醒模式。

报告唤醒原因

重要

客户端驱动程序必须向 NetAdapterCx 报告唤醒原因。

当 NIC 硬件唤醒系统时,客户端驱动程序必须向 NetAdapterCx 报告触发唤醒的唤醒源。 对于大多数唤醒源,驱动程序使用 NET_ADAPTER_WAKE_REASON_PACKET 结构来描述触发唤醒的网络数据包。

如果 NET_WAKE_SOURCE_TYPE 为:

新式待机系统的电源管理方案

重要

对于新式待机平台,网络设备驱动程序必须:

有关设备类型的完整新式待机要求,请参阅特定于媒体的文档和 WHCP。

OS 负责网络设备的电源策略决策。 例如,OS 控制设备何时必须转到 Dx,以及设备应唤醒的网络事件类型。 设备驱动程序负责在 OS 请求时可靠地执行电源转换序列,然后正确为 OS 设置的唤醒条件对硬件进行编程。

OS 基于一组广泛的因素(包括系统范围的电源策略和用户选择)做出电源策略决策。 以下是用于新式待机系统上网络设备的一些常见电源策略:

重要

这些电源策略可能会随 OS 更新而更改,并提供以下信息作为示例。 应避免对 OS 的特定端到端行为的依赖关系。

  • 当电脑屏幕处于打开状态并且网络设备一直在闲转时,OS 会要求设备转到 Dx 并将其用于 PacketFilter 和 MediaChange 唤醒。

  • 当电脑进入新式待机状态并且网络设备一直在闲置时,OS 会要求 NIC 转到 Dx 并将其用于位图、MediaChange 和 Magic Packet 唤醒。

  • 当电脑进入休眠状态时,OS 会要求 NIC 转到 Dx,并为神奇数据包唤醒提供武器。

注意:NetAdapterCx 客户端驱动程序控制电源管理选项卡的可见性。有关详细信息,请参阅 用户控制设备空闲和唤醒行为