Выдача индикаторов состояния причины пробуждения 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 .
События пробуждения для конкретных носителей
Сетевой адаптер создает событие пробуждения по определенной причине мультимедиа, такой как отмена связи с точкой доступа 802.11 (AP) или получение sms-сообщения мобильной широкополосной связи (МБ).
События пробуждения этого типа задаются с помощью элемента MediaSpecificWakeUpEvents структуры NDIS_PM_PARAMETERS .
Независимые от средств массовой информации события пробуждения
Сетевой адаптер создает событие пробуждения по независимой от мультимедиа причине, такой как подключение к мультимедиа или отключение.
События пробуждения этого типа задаются с помощью элемента 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 состояние, он должен выполнить следующие действия:
Драйвер мини-порта должен выделить буфер, достаточно большой для размещения следующих компонентов:
Структура NDIS_PM_WAKE_REASON .
Структура NDIS_PM_WAKE_PACKET вместе с полученным пакетом (пакетом пробуждения), который заставил сетевой адаптер создать событие пробуждения.
Примечание Драйверу мини-порта не нужно выделять это буферное пространство, если он указывает на события пробуждения, зависящие от носителя или мультимедиа.
Драйвер мини-порта инициализирует структуру NDIS_PM_WAKE_REASON в начале буфера. Драйвер задает члену WakeReasonзначение перечисления NDIS_PM_WAKE_REASON_TYPE , определяющее тип события пробуждения.
Например, если драйвер мини-порта указывает на событие пробуждения полученного пакета, он должен задать для члена WakeReasonзначение NdisWakeReasonPacket. В противном случае драйвер задает члену WakeReason значение перечисления, которое лучше всего описывает событие пробуждения, зависящее от мультимедиа или независимо от медиа.
Если miniportdriver выдает NDIS_STATUS_PM_WAKE_REASON индикатор состояния для события пробуждения полученного пакета, ему необходимо выполнить следующие действия:
Драйвер мини-порта задает для элемента InfoBufferOffset смещение структуры NDIS_PM_WAKE_PACKET , следующей за структурой NDIS_PM_WAKE_REASON в буфере.
Примечание Драйвер мини-порта должен выровнять начало структуры NDIS_PM_WAKE_PACKET на 64-разрядной границе.
Драйвер мини-порта устанавливает для элемента InfoBufferSize размер структуры NDIS_PM_WAKE_PACKET плюс размер пакета, вызвавшего событие пробуждения.
Драйвер мини-порта инициализирует структуру 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-разрядной границе буфера.
Мини-порт копирует пакет пробуждения в буфер со смещением, заданным элементом SavedPacketOffset .
Если драйвер мини-порта выдает NDIS_STATUS_PM_WAKE_REASON индикатор состояния для события пробуждения, зависят от носителя или мультимедиа, он устанавливает элементы InfoBufferOffset и InfoBufferSize структуры NDIS_PM_WAKE_REASON равным нулю.
Драйвер мини-порта инициализирует структуру NDIS_STATUS_INDICATION . Драйвер задает для элемента StatusCode значение NDIS_STATUS_PM_WAKE_REASON. Драйвер также задает элемент StatusBuffer , указывающий на буфер, и задает параметру StatusBufferLength длину буфера в байтах.
Драйвер мини-порта вызывает NdisMIndicateStatusEx и передает указатель на структуру NDIS_STATUS_INDICATION в параметре StatusIndication .
Примечание После того как драйвер мини-порта выдает указание состояния NDIS_STATUS_PM_WAKE_REASON для события пробуждения полученного пакета, он должен указать этот полученный пакет путем вызова NdisMIndicateReceiveNetBufferLists.