Поделиться через


Обработка уведомления о выборочной приостановке простоя NDIS

NDIS запускает выборочную операцию приостановки, если происходит одно из следующих событий:

С помощью операции выборочной приостановки сетевой адаптер переходит в состояние с низким энергопотреблением. NDIS начинает эту операцию, вызывая функцию обработчика MiniportIdleNotification для выдачи уведомления о бездействии драйверу мини-порта.

Драйверу мини-порта может потребоваться выполнить действия, зависящие от шины, при обработке уведомления о бездействии. На следующем рисунке показаны действия, связанные с обработкой уведомления о бездействии драйвером мини-порта для сетевого адаптера USB.

Схема, показывающая операцию уведомления о простое.

В этом разделе содержатся следующие сведения об обработке уведомления о выборочной приостановке простоя NDIS.

Рекомендации по обработке вызова MiniportIdleNotification

Рекомендации по вызову NdisMIdleNotificationConfirm

Отмена и завершение уведомления о выборочной приостановке простоя NDIS

Рекомендации по обработке вызова MiniportIdleNotification

NDIS и драйвер мини-порта, когда NDIS вызывает MiniportIdleNotification, выполните следующие действия:

  1. NDIS вызывает функцию обработчика MiniportIdleNotification , чтобы уведомить драйвер о том, что базовый сетевой адаптер неактивен. NDIS задает для параметра ForceIdle функции обработчика MiniportIdleNotification одно из следующих значений:

    • NDIS устанавливает для параметра ForceIdleзначение FALSE , если сетевой адаптер неактивен дольше, чем время ожидания простоя.

    • NDIS устанавливает для параметра ForceIdleзначение TRUE, если система, совместимая с технологией Always On Always Connected (AOAC), переходит в состояние подключенного режима ожидания.

  2. При вызове MiniportIdleNotification драйвер мини-порта может наложить вето на уведомление о простое и выборочную операцию приостановки, возвращая NDIS_STATUS_BUSY. Например, драйвер может наложить вето на уведомление о простое, если драйвер обнаруживает активность сетевого адаптера.

    Если драйвер минипорта налоет вето на уведомление о простое, NDIS перезапускает монитор активности сетевого адаптера. Если адаптер снова становится неактивным в течение периода простоя, NDIS вызывает MiniportIdleNotification.

    Примечание Драйвер мини-порта не должен наносить вето на уведомление о бездействии, если параметр ForceIdle имеет значение TRUE. В этом случае драйвер должен продолжить операцию выборочной приостановки.

  3. Если драйвер минипорта не наложил вето на уведомление о простое, он должен выполнить все операции, относящиеся к шине, чтобы подготовить сетевой адаптер к выборочной операции приостановки. Например, драйвер мини-порта для сетевого адаптера USB выполняет следующие действия, чтобы определить, может ли сетевой адаптер перейти в состояние с низким энергопотреблением:

    1. Драйвер мини-порта вызывает IoCallDriver , чтобы выдать пакет запроса ввода-вывода (IRP) для запроса простоя USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) базовому драйверу шины USB. В этом IRP драйвер мини-порта должен указать подпрограмму обратного вызова и завершения.

      Драйвер шины USB не сразу завершает IRP. IRP остается в состоянии ожидания через переход с низким энергопотреблением. Водитель автобуса завершает IRP позже при возникновении любого из следующих событий:

      • Драйвер минипорта отменяет IRP.

      • Требуется изменение состояния питания системы.

      • Устройство удаляется из USB-концентратора.

    2. После того как драйвер шины USB определит, что он может поместить сетевой адаптер в маломощном состоянии, он вызывает процедуру обратного вызова IRP драйвера мини-порта. Этот вызов подтверждает, что сетевой адаптер может перейти в состояние с низким энергопотреблением.

      Инструкции по написанию подпрограммы обратного вызова для IRP-запроса простоя USB см. в разделе Реализация процедуры обратного вызова IRP бездействующих запросов USB.

  4. После того как драйвер мини-порта завершит подготовку сетевого адаптера к выборочной операции приостановки, он вызывает NdisMIdleNotificationConfirm. В этом вызове драйвер мини-порта указывает наименьшее состояние питания, к которому может перейти сетевой адаптер.

    В зависимости от требований к шине для операций выборочной приостановки драйвер мини-порта вызывает NdisMIdleNotificationConfirm либо синхронно в контексте вызова MiniportIdleNotification , либо асинхронно после возврата MiniportIdleNotification . Например, драйвер минипорта для сетевого адаптера USB вызывает NdisMIdleNotificationConfirm в контексте процедуры обратного вызова для запроса простоя USB. Драйвер шины USB вызывает подпрограмму обратного вызова либо синхронно в контексте вызова IoCallDriver , либо асинхронно после возврата MiniportIdleNotification .

  5. Если сетевой адаптер можно перевести в состояние с низким энергопотреблением, драйвер мини-порта возвращает NDIS_STATUS_PENDING из вызова MiniportIdleNotification.

    Примечание Драйвер мини-порта возвращает NDIS_STATUS_PENDING, так как уведомление о простое не завершено, пока драйвер не вызовет NdisMIdleNotificationComplete. Драйвер мини-порта не должен возвращать NDIS_STATUS_SUCCESS из MiniportIdleNotification.

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

Рекомендации по вызову NdisMIdleNotificationConfirm

NDIS и драйвер минипорта выполните следующие действия, когда драйвер минипорта вызывает NdisMIdleNotificationConfirm:

  1. Проблемы NDIS IRP_MN_WAIT_WAKE базовому водителю шины. Этот IRP позволяет драйверу шины разбудить сетевой адаптер в ответ на внешний сигнал пробуждения.

  2. 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 обходить обработку путем фильтрации драйверов в стеке сетевых драйверов.

  3. После успешного выполнения запроса на набор 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.

  4. NDIS выдает IRP_MN_SET_POWER базовому водителю автобуса. Этот IRP запрашивает переход сетевого адаптера в состояние с низким энергопотреблением.

    Примечание Во время выборочной операции приостановки сетевой адаптер будет переведен в состояние питания устройства, указанное в вызове NdisMIdleNotificationConfirm. Драйвер мини-порта указывает это состояние питания устройства в параметре IdlePowerState этой функции.

После завершения IRP NDIS возвращается из вызова NdisMIdleNotificationConfirm.

Отмена и завершение уведомления о выборочной приостановке простоя NDIS

После выдачи уведомления о бездействии его можно отменить и завершить следующими способами:

  • NDIS может отменить незавершенное уведомление о простое, если выполняются следующие условия:

    • Драйвер чрезмерного протокола или фильтра выдает запрос на отправку пакета или запрос OID к драйверу минипорта.

    • Базовый адаптер сигнализирует о событии пробуждения, например о получении пакета, соответствующего шаблону пробуждения по локальной сети (WOL), или об изменении состояния подключения к мультимедиа.

    NDIS отменяет уведомление о простое, вызывая MiniportCancelIdleNotification. При вызове этой функции обработчика драйвер минипорта отменяет все ранее выданные ему ранее для уведомления о бездействии irp, относящиеся к шине. Наконец, драйвер мини-порта вызывает NdisMIdleNotificationComplete , чтобы завершить уведомление о бездействии.

    Дополнительные сведения о том, как NDIS отменяет уведомление о простое, см. в разделе Отмена уведомления о выборочной приостановке простоя NDIS.

  • После того как сетевой адаптер находится в низком энергопотреблении, драйвер мини-порта может самостоятельно завершить уведомление о бездействии, чтобы возобновить работу адаптера в состояние полного питания. Причины этого зависят от конструкции и требований драйвера и адаптера. Драйвер мини-порта завершает уведомление о бездействии, вызывая NdisMIdleNotificationComplete.

    Дополнительные сведения о том, как драйвер мини-порта завершает уведомление о простое, см. в разделе Завершение уведомления о выборочной приостановке простоя NDIS.