Настройка управления питанием NetAdapterCx

Все клиентские драйверы NetAdapterCx являются драйверами Windows Driver Framework (WDF) с функциями управления питанием, аналогичными всем драйверам WDF. Для драйверов NetAdapterCx требуются дополнительные конфигурации питания, относящиеся к сети, как описано в этой статье.

Типичное сетевое устройство поддерживает три распространенные функции управления питанием:

Настройка возможностей питания сетевого адаптера

После настройки функций управления питанием WDF следующим шагом является настройка возможностей питания сетевого адаптера. Возможности питания делятся на две категории: возможности разгрузки протокола с низким энергопотреблением и возможности пробуждения.

Возможности разгрузки протокола с низким энергопотреблением

Дополнительные сведения о том, как сетевой стек Windows использует эту возможность, см. в разделе Разгрузки протокола для управления питанием NDIS.

Клиентские драйверы задают возможности разгрузки протокола с низким энергопотреблением, вызывая следующие методы, подходящие для их оборудования:

Возможности пробуждения

Клиентские драйверы вызывают любой из следующих методов, чтобы задать возможности пробуждения, поддерживаемые оборудованием при низком энергопотреблении устройства (Dx):

Энергопотребление и задержка возобновления

Когда сетевое устройство находится в 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 , чтобы сообщить об этой причине пробуждения.

Сценарии управления питанием для современной резервной системы

Важно!

Для современной резервной платформы драйвер сетевого устройства должен:

Полные требования к современному резервному режиму для вашего типа устройства см. в документации по носителям и WHCP.

Операционная система отвечает за принятие решений о политике управления питанием сетевых устройств. Например, ОС определяет, когда устройство должно переходить в Dx и какие типы сетевых событий должно переходить на устройство. Драйвер устройства отвечает за надежное выполнение последовательности перехода питания по запросу ОС, а затем правильно запрограммировать оборудование для состояния пробуждения, заданного ОПЕРАЦИОННОЙ СИСТЕМОЙ.

ОС принимает решения о политике управления питанием на основе широкого набора факторов, включая общесистемные политики управления питанием и выбор пользователей. Ниже приведены некоторые распространенные политики питания, используемые для сетевых устройств в современной резервной системе.

Важно!

Эти политики управления питанием могут изменяться при обновлении ОС, и в качестве примера приводятся следующие сведения. Следует избегать зависимостей от конкретного сквозного поведения ОС.

  • Если экран компьютера включен, а сетевое устройство находится в режиме простоя, ОПЕРАЦИОННая система просит устройство перейти в Dx и включить в него пакет PacketFilter и Пробуждение MediaChange.

  • Когда компьютер переходит в режим "Современный режим ожидания", а сетевое устройство простаивает, ОПЕРАЦИОННая система запрашивает переход сетевого адаптера к Dx и переназначает его для bitmap, MediaChange и magic Packet wake.

  • Когда компьютер переходит в режим гибернации, ОПЕРАЦИОННая система просит сетевой адаптер перейти в Dx и вооружает его для пробуждения Magic Packet.

Примечание. Драйверы клиента NetAdapterCx управляют видимостью вкладки управления питанием. Дополнительные сведения см. в статье Управление пользователем режимом простоя устройства и режима пробуждения.