Настройка управления питанием NetAdapterCx
Все клиентские драйверы NetAdapterCx являются драйверами Windows Driver Framework (WDF) с функциями управления питанием, аналогичными всем драйверам WDF. Для драйверов NetAdapterCx требуются дополнительные конфигурации питания, относящиеся к сети, как описано в этой статье.
Типичное сетевое устройство поддерживает три распространенные функции управления питанием:
Сетевое устройство может перейти в состояние с низким энергопотреблением (Dx) по указанию ОС.
Драйвер клиента регистрирует необязательные обратные вызовы событий WDF для получения уведомлений о переключениях питания, как описано в разделе Поддержка PnP и управления питанием в драйверах функций.
Если сетевое устройство может перейти в состояние Dx, пока система остается в рабочем (S0), то драйвер клиента должен поддерживать выключение бездействия. См. раздел Поддержка выключения бездействия. Помимо стандартного пользовательского управления режимом простоя и пробуждения устройства , доступного для всех устройств WDF, NetAdapterCx позволяет дополнительно управлять бездействуемыми данными для конкретной сети с помощью *IdleRestriction , как определено в разделе Стандартизированные ключевые слова INF для управления питанием.
Когда сетевое устройство находится в состоянии Dx, оно может активировать сигнал пробуждения, если произошло предварительно настроенное состояние пробуждения.
Дополнительные сведения о том, как устройство WDF может выбудить систему из состояния с низким энергопотреблением на уровне всей системы, см. в разделе Поддержка пробуждения системы.
NetAdapterCx предоставляет API для клиентского драйвера, чтобы объявить, какие сетевые события его оборудование поддерживает пробуждение. См . раздел Настройка возможностей питания сетевого адаптера.
Когда сетевое устройство находится в состоянии Dx, оно по-прежнему может отвечать на некоторые часто используемые сетевые запросы для поддержания присутствия хост-системы в сети без пробуждения хост-системы. См . раздел Настройка возможностей питания сетевого адаптера.
Настройка возможностей питания сетевого адаптера
После настройки функций управления питанием WDF следующим шагом является настройка возможностей питания сетевого адаптера. Возможности питания делятся на две категории: возможности разгрузки протокола с низким энергопотреблением и возможности пробуждения.
Возможности разгрузки протокола с низким энергопотреблением
Дополнительные сведения о том, как сетевой стек Windows использует эту возможность, см. в разделе Разгрузки протокола для управления питанием NDIS.
Клиентские драйверы задают возможности разгрузки протокола с низким энергопотреблением, вызывая следующие методы, подходящие для их оборудования:
Возможности пробуждения
Клиентские драйверы вызывают любой из следующих методов, чтобы задать возможности пробуждения, поддерживаемые оборудованием при низком энергопотреблении устройства (Dx):
- NetAdapterWakeSetBitmapCapabilities
- NetAdapterWakeSetMagicPacketCapabilities
- NetAdapterWakeSetMediaChangeCapabilities
- NetAdapterWakeSetPacketFilterCapabilities
Энергопотребление и задержка возобновления
Когда сетевое устройство находится в Dx, оно по-прежнему потребляет энергию для разгрузки и управления для пробуждения. Когда устройство инициирует пробуждение из Dx, возникает задержка, прежде чем устройство сможет снова передавать пакеты. Чем глубже внутреннее состояние питания, тем меньше энергии оно потребляет в Dx, но тем дольше задержка возобновления.
В следующей таблице описаны общие рекомендации по компромиссу между потреблением электроэнергии и задержкой возобновления для каждой возможности пробуждения.
Важно!
Некоторые сведения относятся к предварительно выпущенной продукции, которая может быть существенно изменена перед коммерческим выпуском. Корпорация Майкрософт не дает никаких явных или подразумеваемых гарантий в отношении предоставленной информации. Дополнительные сведения об определенном типе устройства см. в документации по конкретному носителю и в программе совместимости оборудования Windows (WHCP).
Возможность пробуждения | События пробуждения | Энергопотребление | Задержка возобновления |
---|---|---|---|
PacketFilter | Любой пакет соответствует настроенной конфигурации ReceivePacketFilter | Должно быть меньше, чем в D0, и устройство должно быть сохранено в соответствующем состоянии, чтобы задержка возобновления была очень маленькой. | <= 10 мс |
Bitmap | Любой пакет соответствует настроенной схеме растрового рисунка | Значение должно быть ниже, чем при использовании для 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_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++); 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 и EvtDeviceDisarmWakeFromS0 .
Причина пробуждения отчетов
Важно!
Драйверы клиента должны сообщать о причине пробуждения в NetAdapterCx.
Когда оборудование сетевой карты активирует систему, драйвер клиента должен сообщить 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.
Операционная система отвечает за принятие решений о политике управления питанием сетевых устройств. Например, ОС определяет, когда устройство должно переходить в Dx и какие типы сетевых событий должно переходить на устройство. Драйвер устройства отвечает за надежное выполнение последовательности перехода питания по запросу ОС, а затем правильно запрограммировать оборудование для состояния пробуждения, заданного ОПЕРАЦИОННОЙ СИСТЕМОЙ.
ОС принимает решения о политике управления питанием на основе широкого набора факторов, включая общесистемные политики управления питанием и выбор пользователей. Ниже приведены некоторые распространенные политики питания, используемые для сетевых устройств в современной резервной системе.
Важно!
Эти политики управления питанием могут изменяться при обновлении ОС, и в качестве примера приводятся следующие сведения. Следует избегать зависимостей от конкретного сквозного поведения ОС.
Если экран компьютера включен, а сетевое устройство находится в режиме простоя, ОПЕРАЦИОННая система просит устройство перейти в Dx и включить в него пакет PacketFilter и Пробуждение MediaChange.
Когда компьютер переходит в режим "Современный режим ожидания", а сетевое устройство простаивает, ОПЕРАЦИОННая система запрашивает переход сетевого адаптера к Dx и переназначает его для bitmap, MediaChange и magic Packet wake.
Когда компьютер переходит в режим гибернации, ОПЕРАЦИОННая система просит сетевой адаптер перейти в Dx и вооружает его для пробуждения Magic Packet.
Примечание. Драйверы клиента NetAdapterCx управляют видимостью вкладки управления питанием. Дополнительные сведения см. в статье Управление пользователем режимом простоя устройства и режима пробуждения.