所有 NetAdapterCx 客户端驱动程序都是 Windows 驱动程序框架(WDF)驱动程序,其电源管理功能类似于所有 WDF 驱动程序。 如本文所述,NetAdapterCx 驱动程序需要其他特定于网络的电源配置。
典型的网络设备支持三种常见的电源管理功能:
当 OS 指示时,网络设备可以进入较低功率(Dx)状态。
客户端驱动程序注册可选的 WDF 事件回调,以接收电源转换通知,如 功能驱动程序中的支持 PnP 和电源管理中所述。
如果网络设备可以在系统保持工作状态(S0)状态时进入其 Dx 状态,则客户端驱动程序应支持空闲关闭电源。 请参阅 支持空闲电源关闭。 除了所有 WDF 设备可用的 设备空闲和唤醒行为的标准用户控制 之外,NetAdapterCx 还允许通过 *IdleRestriction 进行其他特定于网络的空闲控制,如 Power Management 的标准化 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++)
{
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 和 EvtDeviceDisarmWakeDisarmFromS0 回调中禁用以前编程的协议电源卸载和唤醒模式。 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 的特定端到端行为的依赖关系。
当电脑屏幕处于打开状态并且网络设备一直在闲转时,OS 会要求设备转到 Dx 并将其用于 PacketFilter 和 MediaChange 唤醒。
当电脑进入新式待机状态并且网络设备一直在闲置时,OS 会要求 NIC 转到 Dx 并将其用于位图、MediaChange 和 Magic Packet 唤醒。
当电脑进入休眠状态时,OS 会要求 NIC 转到 Dx,并为神奇数据包唤醒提供武器。
注意:NetAdapterCx 客户端驱动程序控制电源管理选项卡的可见性。有关详细信息,请参阅 用户控制设备空闲和唤醒行为。