Обработка набора Power Request
Промежуточный драйвер должен обрабатывать запросы для установки питания в рабочее состояние (состояние питания сетевого устройства D0) и спящих состояний (состояние питания сетевого устройства D1, D2 или D3). Промежуточный драйвер также должен поддерживать переменные состояния питания и флаг standBy. Эти вопросы рассматриваются далее в этом разделе.
Примеры управления питанием промежуточного драйвера см . в примере драйвера NDIS MUX Промежуточного драйвера и драйвера объектов уведомления в репозитории примеров драйверов Windows на GitHub.
Обработка набора power Request в спящем состоянии
Существует два случая, когда промежуточный драйвер должен обрабатывать заданный запрос питания в спящее состояние:
NDIS запрашивает, что верхний край виртуального минипорта промежуточного драйвера переходит в спящее состояние.
Промежуточный протокол драйвера нижнего края обрабатывает базовый драйвер минипорта, переходя в спящее состояние при получении уведомления о событии самонастраивающийся (PnP).
Эти события могут происходить в любом порядке, и одно событие не обязательно сопровождает другое.
Когда верхний край виртуального минипорта промежуточного драйвера получает запрос на настройку питания в спящее состояние, последовательность событий для обработки запроса выглядит следующим образом:
NDIS вызывает функцию ProtocolNetPnPEvent каждого драйвера протокола, привязанного к виртуальному минипорту. Вызов ProtocolNetPnPEvent указывает событие NetEventSetPower для спящего состояния. Драйверы протокола, привязанные к промежуточному драйверу, останавливают отправку сетевых данных и отправляют запросы OID к виртуальному мини-порту промежуточного драйвера. Протокол нижнего края промежуточного драйвера может продолжать отправлять сетевые данные и запросы вниз, пока NDIS не указывает, что базовый драйвер мини-порта делает переход в спящее состояние.
NDIS приостанавливает избыточные драйверы, а затем виртуальный минипорт после выдачи события NetEventSetPower . Указанная причина приостановки — переход к состоянию низкой мощности. Дополнительные сведения о приостановке виртуального минипорта см. в разделе "Приостановка адаптера".
Примечание. Запросы OID можно отправлять в виртуальный минипорт, если он находится в состоянии низкой мощности, за исключением OID_PNP_SET_POWER.
NDIS выдает запрос OID_PNP_SET_POWER на виртуальный минипорт промежуточного драйвера. Промежуточный драйвер принимает запрос, возвращая NDIS_STATUS_SUCCESS. Промежуточный драйвер не должен распространять запрос OID_PNP_SET_POWER на базовый минипорт-драйвер. После завершения этого запроса промежуточный драйвер не должен указывать больше полученных сетевых данных или указывать состояние, даже если он продолжает получать сетевые данные и сведения о состоянии от базового мини-драйвера.
Когда нижний край промежуточного драйвера перенаправит базовый минипорт-драйвер в спящее состояние, последовательность событий для обработки перехода выглядит следующим образом:
NDIS вызывает функцию ProtocolNetPnPEvent для нижнего края протокола промежуточного драйвера. Вызов ProtocolNetPnPEvent указывает событие NetEventSetPower для спящего состояния. Промежуточный драйвер должен прекратить отправку сетевых данных и отправлять запросы OID к базовому драйверу минипорта. Если есть невыполненные запросы или отправки, промежуточный драйвер должен вернуть NDIS_STATUS_PENDING из вызова ProtocolNetPnPEvent. Промежуточный драйвер вызывает NdisCompleteNetPnPEvent, чтобы завершить вызов ProtocolNetPnPEvent. Пограничный протокол промежуточного драйвера по-прежнему может получить полученные сведения о пакете и состоянии от базового драйвера минипорта. Полученные сетевые данные можно игнорировать. Если реализация промежуточного драйвера зависит от мониторинга состояния базового минипорта драйвера, необходимо отслеживать индикаторы состояния.
NDIS приостанавливает пограничный протокол промежуточного драйвера, а затем приостанавливает базовый мини-адаптер после выдачи события NetEventSetPower . Указанная причина приостановки — переход к состоянию низкой мощности. Дополнительные сведения о приостановке привязки протокола см. в разделе "Приостановка привязки".
Примечание. Запросы OID можно отправлять в базовый мини-адаптер, если он находится в состоянии низкой мощности, за исключением OID_PNP_SET_POWER.
NDIS выдает запрос OID_PNP_SET_POWER на базовый минипорт-драйвер. Однако если базовый драйвер минипорта не поддерживает управление питанием, он будет остановлен. В этом случае, несмотря на то, что NDIS останавливает базовый драйвер минипорта, он не запрашивает протокол промежуточного драйвера для отмены привязки от базового минипорта драйвера и сетевого адаптера. После успешного завершения обработки OID (или драйвера минипорта) базовый минипорт-драйвер не будет указывать больше сетевых данных или состояния.
Обработка набора power Request в рабочем состоянии
Существует два случая, когда промежуточный драйвер обрабатывает заданный запрос питания в рабочее состояние:
NDIS запрашивает, что верхний край виртуального минипорта промежуточного драйвера переходит в рабочее состояние.
Промежуточный протокол драйвера нижнего края обрабатывает базовый драйвер минипорта, переходя к рабочему состоянию, когда он получает уведомление о событии самонастраивающийся (PnP).
Эти события могут происходить в любом порядке, и одно событие не обязательно сопровождает другое.
Когда верхний край виртуального минипорта промежуточного драйвера получает запрос на настройку питания в рабочее состояние, последовательность событий для обработки запроса выглядит следующим образом:
NDIS выдает OID_PNP_SET_POWER виртуальному минипорту промежуточного драйвера. Промежуточный драйвер возвращает NDIS_STATUS_SUCCESS в заданный запрос питания. Промежуточный драйвер не должен распространять запрос OID_PNP_SET_POWER на базовый минипорт-драйвер.
NDIS перезапускает виртуальный минипорт, а затем перезапускает переопределяющие драйверы после выдачи набора OID. Дополнительные сведения о перезапуске виртуального мини-порта см. в разделе "Запуск адаптера".
NDIS вызывает функцию ProtocolNetPnPEvent драйверов протоколов, переопределяющихся. Вызов ProtocolNetPnPEvent указывает событие NetEventSetPower для задания рабочего состояния (D0). Связанные драйверы протокола могут начать отправку сетевых данных в виртуальный минипорт промежуточного драйвера.
Когда нижний край промежуточного драйвера перенаправит базовый минипорт-драйвер в рабочее состояние, последовательность событий для обработки перехода выглядит следующим образом:
NDIS выдает OID_PNP_SET_POWER базовому драйверу минипорта или вызывает обработчик MiniportInitializeEx, если базовый драйвер минипорта был остановлен.
NDIS перезапускает базовый драйвер минипорта, а затем пограничный протокол промежуточной NDIS и базовый минипорт-адаптер после выдачи OID. Дополнительные сведения о приостановке привязки протокола см. в разделе "Перезапуск привязки".
NDIS вызывает функцию ProtocolNetPnPEvent промежуточного драйвера. Вызов ProtocolNetPnPEvent указывает событие NetEventSetPower для задания рабочего состояния (D0). Промежуточный драйвер может начать отправку сетевых данных базовому драйверу минипорта.
Состояния питания и резервный флаг
Промежуточный драйвер должен поддерживать отдельную переменную состояния питания для каждого экземпляра виртуального минипорта и для каждого базового драйвера минипорта, к которому привязан драйвер. Промежуточный драйвер также должен поддерживать флаг StandingBy для каждого виртуального мини-порта, который состоит из следующих:
Установите значение TRUE , если состояние питания виртуального минипорта или базового драйвера минипорта покидает D0.
Установите значение FALSE, если состояние питания виртуального минипорта или базового драйвера мини-порта возвращается в D0.
Примечание. Для промежуточных драйверов MUX может быть несколько виртуальных мини-портов, связанных с базовым драйвером минипорта или несколькими базовыми мини-портами, связанными с каждым виртуальным минипортом. При изменении состояния питания любого мини-адаптера поведение всех связанных мини-портов также влияет. Влияние на поведение зависит от реализации. Например, драйвер, реализующий решение отработки отказа балансировки нагрузки (LBFO), может не деактивировать виртуальные мини-порты при деактивации одного базового драйвера минипорта. Однако реализация драйвера, которая зависит от всех базовых драйверов минипорта, потребует деактивации виртуальных минипортов при деактивации любого базового драйвера минипорта.
Промежуточный драйвер должен использовать флаг StandingBy и переменные состояния питания при обработке запросов следующим образом:
Функция MiniportSendNetBufferLists драйвера должна завершиться ошибкой, если виртуальный минипорт и его базовый минипорт не находятся в D0.
Функция MiniportOidRequest драйвера всегда должна выполняться успешно OID_PNP_QUERY_POWER, чтобы убедиться, что драйвер получает последующие запросы OID_PNP_SET_POWER.
Функция MiniportOidRequest драйвера должна завершиться ошибкой, если виртуальный минипорт не находится в D0 или имеет значение TRUE. В противном случае он должен в очереди один запрос, если базовый драйвер минипорта не находится в D0. Запрос в очередь должен обрабатываться, когда базовое состояние драйвера мини-порта становится D0.
Виртуальный мини-порт промежуточного драйвера должен сообщать о состоянии только в том случае, если базовый драйвер минипорта и виртуальный минипорт находятся в D0.