Обработка уведомления о выборочной приостановке простоя NDIS
NDIS запускает выборочную операцию приостановки, если происходит одно из следующих событий:
Сетевой адаптер неактивен дольше, чем время ожидания простоя. Продолжительность этого периода ожидания определяется значением стандартизованного INF-ключевое слово *SSIdleTimeout. Дополнительные сведения об этом ключевое слово см. в разделе Стандартизированные ключевые слова INF для выборочной приостановки NDIS.
Дополнительные сведения о том, как NDIS определяет, что сетевой адаптер неактивен, см. в разделе Как NDIS обнаруживает бездействующие сетевые адаптеры.
Система, совместимая с технологией Always On 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 драйвера мини-порта. Этот вызов подтверждает, что сетевой адаптер может перейти в состояние с низким энергопотреблением.
Инструкции по написанию подпрограммы обратного вызова для IRP-запроса простоя USB см. в разделе Реализация процедуры обратного вызова IRP бездействующих запросов USB.
После того как драйвер мини-порта завершит подготовку сетевого адаптера к выборочной операции приостановки, он вызывает 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.