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


Выдача индикаторов состояния причины пробуждения NDIS

Если минипорт-драйвер поддерживает индикаторы состояния причины пробуждения NDIS (NDIS_STATUS_PM_WAKE_REASON), он должен генерировать этот индикатор сразу после того, как сетевой адаптер создает событие пробуждения и адаптер возвращается в состояние полной мощности.

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

Минипорт-драйвер настраивается с параметрами управления питанием (PM) с помощью запроса набора идентификаторов объектов (OID) OID_PM_PARAMETERS. Этот запрос OID задает параметры PM через структуру NDIS_PM_PARAMETERS.

Структура NDIS_PM_PARAMETERS задает параметры для следующих типов событий пробуждения.

события пробуждения полученных пакетов
Сетевой адаптер создает событие пробуждения, если он получает пакет, соответствующий шаблону пробуждения по локальной сети (WOL). Шаблоны WOL включают следующие:

  • Шаблоны WOL, независимые от типа носителя, такие как магические пакеты или шаблоны данных TCP/IP в полезной нагрузке пакета. Например, структура NDIS_PM_PARAMETERS может указать шаблон WOL для кадра TCP SYN.

  • Шаблоны WOL для конкретного носителя, такие как пакет идентификатора запроса EAPOL или сообщение службы коротких сообщений (SMS) мобильной широкополосной связи.

  • Подстановочные знаки, которые соответствуют фильтру получения, указанному в запросе на установку OID OID_GEN_CURRENT_PACKET_FILTER.

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

Шаблоны WOL задаются с помощью EnabledWoLPacketPatterns члена структуры NDIS_PM_PARAMETERS.

Media-Specific события пробуждения
Сетевой адаптер создает событие пробуждения по медиа-специфической причине, такой как отсоединение от точки доступа 802.11 (AP) или получение сообщения службы коротких сообщений (SMS) мобильной широкополосной связи.

События пробуждения этого типа задаются с помощью MediaSpecificWakeUpEvents члена структуры NDIS_PM_PARAMETERS.

Media-Independent события пробуждения
Сетевой адаптер создает событие пробуждения из-за причины, независимой от типа носителя, например, подключения или отключения носителя.

События пробуждения этого типа указываются в члене WakeUpFlags структуры NDIS_PM_PARAMETERS.

Если сетевой адаптер создал сигнал пробуждения, драйвер минипорта должен выдать указание состояния NDIS_STATUS_PM_WAKE_REASON. Драйвер делает это при обработке запроса набора OID OID_PNP_SET_POWER для перехода адаптера в состояние полной мощности.

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

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

  1. Минипорт-драйвер должен выделить буфер, который достаточно велик, чтобы содержать следующее:

    • Структура NDIS_PM_WAKE_REASON.

    • Структура NDIS_PM_WAKE_PACKET вместе с полученным пакетом (пакет пробуждения), что привело к созданию события пробуждения сетевым адаптером.

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

  2. Драйвер минипорта инициализирует структуру NDIS_PM_WAKE_REASON в начале буфера. Драйвер присваивает члену WakeReason значение перечисления NDIS_PM_WAKE_REASON_TYPE, которое определяет тип события пробуждения.

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

  3. Если минипортдрайвер выдает индикацию состояния NDIS_STATUS_PM_WAKE_REASON для события пробуждения пакета, он должен выполнить следующие действия:

    1. Драйвер минипорта устанавливает член InfoBufferOffset в смещение структуры NDIS_PM_WAKE_PACKET, следующей за структурой NDIS_PM_WAKE_REASON в буфере.

      Примечание Драйвер минипорта должен выровнять начало структуры NDIS_PM_WAKE_PACKET на 64-разрядной границе.

    2. Драйвер минипорта задает элемент InfoBufferSize размер структуры NDIS_PM_WAKE_PACKET плюс размер пакета, вызвавшего событие пробуждения.

    3. Драйвер минипорта инициализирует структуру NDIS_PM_WAKE_PACKET в буфере после структуры NDIS_PM_WAKE_REASON.

      Минипорт-драйвер задает элементы структуры NDIS_PM_WAKE_PACKET следующим образом:

      • Элемент PatternId имеет идентификатор шаблона WOL, который соответствует пакету пробуждения. Этот идентификатор задается элементом PatternId структуры NDIS_PM_WOL_PATTERN, передаваемой драйверу во время запроса набора OID OID_PM_ADD_WOL_PATTERN.

      • Элемент PatternFriendlyName имеет описание пользовательского удобочитаемого шаблона пробуждения, указанного элементом PatternId. Это значение указывается элементом FriendlyName структуры NDIS_PM_WOL_PATTERN.

        Примечание Драйвер минипорта не требует инициализации этого элемента. NDIS задает члену PatternFriendlyName корректное значение перед тем, как он передает структуру NDIS_PM_WAKE_PACKET драйверам верхнего уровня.

      • Элемент OriginalPacketSize имеет длину пакета, полученного сетевым адаптером.

      • Элемент SavedPacketSize необходимо задать в длину пакета, который сообщается через указание состояния NDIS_STATUS_PM_WAKE_REASON.

        Примечание Значение этого элемента не должно быть больше значения, заданного драйвером минипорта в MaxWoLPacketSaveBuffer элемента структуры NDIS_PM_CAPABILITIES. Драйвер возвращает эту структуру, когда сообщает о возможностях индикации сигнала пробуждения. Для получения дополнительной информации см. раздел Возможности индикации статуса причины пробуждения.

      • Элемент SavedPacketOffset должен быть установлен на смещение, выраженное в единицах байтов, к пакету пробуждения, который следует за структурой NDIS_PM_WAKE_PACKET.

        Примечание Драйвер минипорта должен выровнять начало пакета пробуждения на 64-разрядной границе в буфере.

    4. Минипорт копирует пакет пробуждения в буфер по смещению, указанному элементом SavedPacketOffset.

  4. Если драйвер минипорта выдает указание состояния NDIS_STATUS_PM_WAKE_REASON для события пробуждения, специфического для носителя или независимого от носителя, он задает для членов структуры InfoBufferOffset и InfoBufferSizeNDIS_PM_WAKE_REASON значения, равные нулю.

  5. Драйвер минипорта инициализирует структуру NDIS_STATUS_INDICATION. Драйвер задает элемент StatusCode NDIS_STATUS_PM_WAKE_REASON. Драйвер также задает элемент StatusBuffer, указывающий на буфер, и задает StatusBufferLength длину буфера в байтах.

  6. Драйвер минипорта вызывает NdisMIndicateStatusEx и передает указатель на структуру NDIS_STATUS_INDICATION в параметре StatusIndication.

Примечание После того, как драйвер минипорта выдает указание состояния NDIS_STATUS_PM_WAKE_REASON для события пробуждения полученного пакета, он должен указать этот полученный пакет путем вызова NdisMIndicateReceiveNetBufferLists.