Обработка уведомления о выборочной приостановке NDIS
NDIS запускает выборочную операцию приостановки, если происходит одно из следующих событий:
Сетевой адаптер неактивен дольше, чем тайм-аут из-за простоя. Длительность этого периода ожидания задается значением стандартизованного ключевого слова INF *SSIdleTimeout. Дополнительные сведения об этом ключевом слове см. в разделе Стандартные ключевые слова INF для NDIS Выборочная приостановка.
Дополнительные сведения о том, как NDIS определяет, что сетевой адаптер неактивен, см. в статье Как NDIS обнаруживает неактивные сетевые адаптеры.
Система, совместимая с технологией AlwaysOn Always Connected (AOAC), перемещается в подключенное резервное состояние.
Через выборочную операцию приостановки сетевой адаптер переходит в состояние низкой мощности. NDIS начинает эту операцию, вызывая функцию обработчика miniportIdleNotification для выдачи уведомления об простое драйверу мини-порта.
Драйверу минипорта может понадобиться выполнить действия, зависящие от шины, при обработке уведомления о простое. На следующем рисунке показаны шаги, связанные с обработкой уведомления об простое с помощью мини-драйвера сетевого адаптера USB.
В этом разделе содержатся следующие сведения о том, как обрабатывать уведомление о выборочной приостановке NDIS в режиме простоя.
рекомендации по обработке вызова MiniportIdleNotification
рекомендации по вызову NdisMIdleNotificationConfirm
отмена и завершение выборочного уведомления приостановки NDIS
Рекомендации по обработке вызова MiniportIdleNotification
NDIS и драйвер минипорта выполняют следующие действия, когда NDIS вызывает MiniportIdleNotification:
NDIS вызывает функцию обработчика MiniportIdleNotification, чтобы уведомить драйвер о том, что базовый сетевой адаптер, как представляется, неактивен. NDIS задает параметр ForceIdle функции обработчика MiniportIdleNotification одним из следующих значений:
NDIS задает параметр ForceIdle значением FALSE, если сетевой адаптер неактивен дольше, чем время ожидания при простое.
NDIS задает параметру ForceIdle значение TRUE, когда система, соответствующая технологии Always On Always Connected (AOAC), переходит в состояние подключенной готовности.
При вызове MiniportIdleNotification драйвер минипорта может наложить вето на уведомление о простое и выборочную приостановку, возвращая NDIS_STATUS_BUSY. Например, драйвер может наложить вето на уведомление о простое, если обнаруживает активность сетевого адаптера.
Если мини-драйвер накладывает вето на уведомление о простое, NDIS перезапускает монитор активности сетевого адаптера. Если адаптер снова становится неактивным в течение периода ожидания простоя, NDIS вызывает MiniportIdleNotification.
Примечание Драйвер минипорта не должен ветоировать уведомление об простое, если параметр ForceIdle имеет значение TRUE. В этом случае драйвер должен продолжать выборочную операцию приостановки.
Если мини-драйвер не налагает вето на уведомление о простое, он должен выполнить все операции, связанные с шиной, чтобы подготовить сетевой адаптер для выборочного приостановления. Например, мини-драйвер сетевого адаптера USB выполняет следующие действия, чтобы определить, может ли сетевой адаптер перейти в состояние низкой мощности:
Драйвер минипорта вызывает IoCallDriver для выдачи пакета запросов ввода-вывода (IRP) для запроса простоя USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) базовому драйверу USB-шины. В этом IRP драйвер минипорта должен указать процедуру обратного вызова и завершения.
Драйвер USB шины не сразу завершает IRP. IRP остается в состоянии ожидания в процессе перехода на низкое энергопотребление. Водитель автобуса завершает IRP позже, когда происходит любое из следующих событий:
Минипорт-драйвер отменяет IRP.
Требуется изменение состояния питания системы.
Устройство удаляется из USB-концентратора.
После того как драйвер USB-шины определяет, что он может поместить сетевой адаптер в состояние пониженного энергопотребления, он вызывает подпрограмму обратного вызова IRP минипортового драйвера. Этот вызов подтверждает, что сетевой адаптер может перейти в состояние низкой мощности.
Для получения инструкций по написанию процедуры обратного вызова для USB Idle Request IRP см. статью Реализацияпроцедуры обратного вызова для USB Idle Request IRP.
После завершения подготовки сетевого адаптера к выборочной операции приостановки драйвер минипорта вызывает NdisMIdleNotificationConfirm. В этом вызове минипорт-драйвер указывает наименьшее состояние питания, к которому может перейти сетевой адаптер.
В зависимости от требований шины для операций избирательной приостановки драйвер минипорта вызывает NdisMIdleNotificationConfirm синхронно в контексте вызова MiniportIdleNotification или асинхронно после MiniportIdleNotification. Например, минипорт-драйвер сетевого адаптера USB вызывает NdisMIdleNotificationConfirm в контексте подпрограммы обратного вызова для запроса простоя USB. Драйвер USB-шины вызывает обратный вызов либо синхронно в контексте вызова IoCallDriver, либо асинхронно после возврата MiniportIdleNotification.
Если сетевой адаптер может быть переведен в состояние низкого энергопотребления, минипорт-драйвер возвращает NDIS_STATUS_PENDING из вызова MiniportIdleNotification.
Примечание Драйвер минипорта возвращает NDIS_STATUS_PENDING, так как уведомление об простое не завершено, пока драйвер не вызывает NdisMIdleNotificationComplete. Драйвер минипорта не должен возвращать NDIS_STATUS_SUCCESS из MiniportIdleNotification.
Минипорт-драйвер должен выполнять следующие операции, пока сетевой адаптер не будет приостановлен и переключен в состояние низкой мощности:
Минипорт-драйвер должен обрабатывать полученные пакеты и указывать их на NDIS путем вызова NdisMIndicateReceiveNetBufferLists.
Минипорт-драйвер должен обрабатывать завершенные пакеты отправки и указывать их на NDIS путем вызова NdisMSendNetBufferListsComplete.
Примечание NDIS не вызовет функцию MiniportSendNetBufferLists для отправки пакетов, если MiniportIdleNotification возвращает NDIS_STATUS_PENDING.
Рекомендации по вызову NdisMIdleNotificationConfirm
NDIS и драйвер минипорта выполняют следующие действия при вызове драйвером минипорта NdisMIdleNotificationConfirm:
NDIS отправляет IRP_MN_WAIT_WAKE нижестоящему драйверу шины. Этот IRP позволяет водителю шины проснуть сетевой адаптер в ответ на внешний сигнал пробуждения.
NDIS отправляет запрос на установку идентификатора объекта (OID) OID_PM_PARAMETERS мини-драйверу. Этот запрос OID связан со структурой NDIS_PM_PARAMETERS, которая указывает параметры, в которых сетевой адаптер создает событие пробуждения.
При обработке элементов структуры NDIS_PM_PARAMETERS драйвер минипорта должен следовать этим рекомендациям:
Если для параметра ForceIdle функции обработчика MiniportIdleNotification задано значение FALSE, NDIS задает только флаг NDIS_PM_SELECTIVE_SUSPEND_ENABLED в элементе WakeUpFlags структуры NDIS_PM_PARAMETERS. В этом случае сетевой адаптер может сигнализировать о событии пробуждения при возникновении одного из следующих событий:
Сетевой адаптер получает пакет, соответствующий фильтру получения пакетов. Адаптер настроен для использования этих фильтров с помощью запросов набора OID OID_GEN_CURRENT_PACKET_FILTER.
Сетевой адаптер обнаруживает другие внешние события, требующие обработки стеком сетевых драйверов, например, когда состояние связи изменяется на отключение мультимедиа или подключение носителя.
Если для параметра ForceIdle функции обработчика MiniportIdleNotification установлено значение TRUE, NDIS не устанавливает флаг NDIS_PM_SELECTIVE_SUSPEND_ENABLED в члене WakeUpFlags структуры NDIS_PM_PARAMETERS. В этом случае NDIS устанавливает другие элементы в структуре NDIS_PM_PARAMETERS для событий пробуждения, не связанных с выборочной приостановкой NDIS.
Примечание NDIS задает параметру ForceIdle значение TRUE только в том случае, если система, поддерживающая технологию Always On Always Connected (AOAC), переходит в состояние подключенного ожидания.
Драйвер завершает запрос OID при помощи NDIS_STATUS_SUCCESS.
Примечание Если NDIS задает флаг NDIS_PM_SELECTIVE_SUSPEND_ENABLED в WakeUpFlags элемент структуры NDIS_PM_PARAMETERS, он выдает команду установки OID OID_PM_PARAMETERS непосредственно минипорт-драйверу. Это позволяет NDIS обходить обработку драйверами фильтров в стеке сетевых драйверов.
После успешного завершения запроса на установку OID OID_PM_PARAMETERS NDIS выдает запрос на установку OID OID_PNP_SET_POWER драйверу минипорта.
При обработке этого запроса набора OID драйвер подготавливает сетевой адаптер к переходу к состоянию низкой мощности, указанному в запросе OID. Драйвер должен выполнить все ожидающие операции следующим образом:
Драйвер минипорта ожидает, пока все ранее указанные пакеты не будут возвращены через вызовы MiniportReturnNetBufferLists.
Минипорт-драйвер ожидает завершения обработки запросов, выполненной оборудованием. После завершения запросов драйвер минипорта должен вызвать NdisMSendNetBufferListsComplete.
Драйвер минипорта завершает все запросы на отправку, находящиеся в ожидании, путем вызова NdisMSendNetBufferListsComplete.
Минипорт-драйвер должен отменить все ожидающие NDIS таймеры и задачи. После их отмены драйвер должен дождаться завершения этих таймеров и рабочих элементов.
Минипорт-драйвер должен перевести сетевой адаптер в состояние покоя. Например, драйвер должен отменить все аппаратные таймеры.
Драйвер минипорта настраивает базовый сетевой адаптер, чтобы включить указанные события пробуждения, которые ранее были указаны в запросе набора OID OID_PM_PARAMETERS. После подготовки сетевого адаптера к переходу в режим низкого энергопотребления, драйвер минипорта завершает запрос набора OID OID_PNP_SET_POWER статусом NDIS_STATUS_SUCCESS.
NDIS выдает IRP_MN_SET_POWER базовому водителю автобуса. Этот IRP запрашивает переход сетевого адаптера в состояние низкой мощности.
Примечание Во время выборочной операции приостановки сетевой адаптер будет переведен в состояние питания устройства, указанное в вызове NdisMIdleNotificationConfirm. Минипорт-драйвер указывает это состояние питания устройства в параметре IdlePowerState этой функции.
После завершения IRP, NDIS возвращается после вызова NdisMIdleNotificationConfirm.
Отмена и завершение выборочного уведомления приостановки NDIS
После выдачи уведомления об простое его можно отменить и завершить следующим образом:
NDIS может отменить необработанное уведомление о простое, если выполняются следующие условия:
Вышележащий протокол или драйвер фильтра выдает запрос на отправку пакета или запрос OID на минипорт-драйвер.
Базовый адаптер сигнализирует о событии пробуждения, например получении пакета, соответствующего шаблону пробуждения по локальной сети (WOL) или обнаружению изменения состояния подключения мультимедиа.
NDIS отменяет уведомление об простое путем вызова MiniportCancelIdleNotification. При вызове этой функции обработчика драйвер минипорта отменяет любые специфичные для шины IRP, которые могли быть выданы ранее для уведомления о простое. Наконец, драйвер мини-порта вызывает NdisMIdleNotificationComplete для завершения уведомления об простое.
Дополнительные сведения о том, как NDIS отменяет уведомление о простое, см. в разделе Отмена уведомления о выборочной приостановке NDIS.
После того как сетевой адаптер находится в режиме низкого энергопотребления, минипорт драйвер может самостоятельно завершить процесс уведомления об бездействии, чтобы перевести адаптер в режим полного энергопотребления. Причины этого зависят от проектирования и требований драйвера и адаптера. Драйвер минипорта завершает уведомление о простое путем вызова NdisMIdleNotificationComplete.
Дополнительные сведения о завершении уведомления о простое драйвера минипорта можно найти в разделе Завершение уведомления о простое в NDIS.