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


Настройка фильтра VMQ

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

Примечание Так как очередь получения по умолчанию (NDIS_DEFAULT_RECEIVE_QUEUE_ID) существует всегда, для нее всегда можно задать фильтр получения. Избыточные драйверы не принадлежат очереди по умолчанию. Поэтому все драйверы протокола, привязанные к сетевому адаптеру, могут использовать очередь по умолчанию.

Настройка фильтра в очереди получения

Чтобы задать фильтр для очереди получения с начальным набором параметров конфигурации, драйвер overlying отправляет запрос идентификатора объекта метода OID_RECEIVE_FILTER_SET_FILTER (OID). Элемент InformationBuffer структуры NDIS_OID_REQUEST изначально содержит указатель на NDIS_RECEIVE_FILTER_PARAMETERS структуру. После успешного возврата из запроса метода OID элемент InformationBuffer структуры NDIS_OID_REQUEST содержит указатель на NDIS_RECEIVE_FILTER_PARAMETERS структуру с новым идентификатором фильтра.

Драйвер overlying инициализирует структуру NDIS_RECEIVE_FILTER_PARAMETERS со следующими параметрами конфигурации фильтра для очереди получения:

  • Тип фильтра, указанный с помощью значения перечисления NDIS_RECEIVE_FILTER_TYPE .

    Примечание Начиная с версии NDIS 6.20 для интерфейса очереди виртуальных машин (VMQ) поддерживаются только типы фильтров NdisReceiveFilterTypeVMQueue .

  • Идентификатор очереди.

  • Один или несколько параметров проверки полей, отформатированных как NDIS_RECEIVE_FILTER_FIELD_PARAMETERS структуры. Для VMQ определяются следующие параметры теста поля.

    • Целевой MAC-адрес в пакете равен указанному MAC-адресу.

    • Идентификатор виртуальной локальной сети (VLAN) в пакете равен указанному идентификатору виртуальной локальной сети.

Структура NDIS_RECEIVE_FILTER_PARAMETERS используется вместе с OID OID_RECEIVE_FILTER_PARAMETERS и OID OID_RECEIVE_FILTER_SET_FILTER для указания параметров конфигурации фильтра.

Элементы FieldParametersArrayOffset, FieldParametersArrayNumElements и FieldParametersArrayElementSize структуры NDIS_RECEIVE_FILTER_PARAMETERS определяют массив структур NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Каждая структура NDIS_RECEIVE_FILTER_FIELD_PARAMETERS в массиве задает критерий проверки фильтра для одного поля в заголовке сети.

Элемент Flags структуры NDIS_RECEIVE_FILTER_FIELD_PARAMETERS указывает действия, выполняемые для фильтра получения. К флагу NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO относятся следующие моменты:

  • Если флаг NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO задан в элементе Flags структуры NDIS_RECEIVE_FILTER_FIELD_PARAMETERS , сетевой адаптер должен указывать только полученные пакеты, которые соответствуют всем следующим критериям тестирования:

    • Пакет с соответствующим MAC-адресом.

    • Пакет без тега виртуальной локальной сети или идентификатор виртуальной локальной сети, равный нулю.

    Если установлен флаг NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO , сетевой адаптер не должен указывать пакеты с соответствующим MAC-адресом и ненулевым идентификатором виртуальной локальной сети.

    Примечание Если расширяемый коммутатор Hyper-V задает фильтр MAC-адресов и в OID_RECEIVE_FILTER_SET_FILTER не настроен фильтр идентификаторов виртуальной ЛС, параметр также устанавливает флаг NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO .

  • Если флаг NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO не задан и фильтр идентификаторов виртуальной локальной сети не настроен запросом на набор OID OID_RECEIVE_FILTER_SET_FILTER, драйвер мини-порта должен выполнить одно из следующих действий:

    • Если драйвер miniport поддерживает NDIS 6.20, он должен вернуть состояние сбоя для запроса OID OID_RECEIVE_FILTER_SET_FILTER.

    • Если драйвер miniport поддерживает NDIS 6.30 или более поздние версии NDIS, он должен настроить сетевой адаптер для проверки и фильтрации указанных полей MAC-адресов. Если тег виртуальной ЛС присутствует в полученном пакете, сетевой адаптер должен удалить его из данных пакета. Драйвер мини-порта должен поместить тег виртуальной локальной сети в NDIS_NET_BUFFER_LIST_8021Q_INFO , связанный со структурой NET_BUFFER_LIST пакета.

  • Если драйвер протокола задает фильтр MAC-адресов и фильтр идентификатора виртуальной локальной сети с OID_RECEIVE_FILTER_SET_FILTER OID, он не устанавливает флаг NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO в любом из полей фильтра. В этом случае драйвер мини-порта должен указывать пакеты, соответствующие как указанному MAC-адресу, так и идентификатору виртуальной локальной сети. То есть драйвер мини-порта не должен указывать пакеты с соответствующим MAC-адресом, которые имеют нулевой идентификатор виртуальной локальной сети или являются пакетами без меток.

Использование идентификатора фильтра

NDIS назначает идентификатор фильтра в элементе FilterId структуры NDIS_RECEIVE_FILTER_PARAMETERS и передает запрос метода OID OID_RECEIVE_FILTER_SET_FILTER базовому драйверу мини-порта. Каждый фильтр, заданный в очереди получения, имеет уникальный идентификатор фильтра для сетевого адаптера. То есть идентификаторы фильтров не дублируются в разных очередях, которыми управляет сетевой адаптер.

Драйвер overlying должен использовать идентификатор фильтра, который NDIS предоставляет в последующих запросах OID; например, для изменения параметров фильтра или для освобождения фильтра.

Когда NDIS получает запрос OID на настройку фильтра в очереди получения, он проверяет параметры фильтра. После того как NDIS выделяет необходимые ресурсы и идентификатор фильтра, он отправляет запрос OID базовому сетевому адаптеру. Если сетевой адаптер может успешно выделить необходимые программные и аппаратные ресурсы для фильтра, он завершает запрос OID с NDIS_STATUS_SUCCESS.

Драйвер мини-порта должен сохранить идентификаторы фильтров для выделенных фильтров получения. NDIS использует идентификатор фильтра с последующими запросами OID, чтобы изменить параметры фильтра получения или очистить фильтр получения. Дополнительные сведения об изменении параметров и очистке фильтров см. в разделах Получение и обновление параметров очереди виртуальной машины и Очистка фильтра VMQ.

Обработка фильтра в очереди получения

Драйвер мини-порта программирует сетевой адаптер на основе фильтров следующим образом:

  • Все параметры теста поля для конкретного фильтра должны совпадать, чтобы назначить пакет очереди.

  • В очереди можно задать несколько фильтров.

  • Пакеты должны быть назначены очереди получения, если какой-либо из фильтров пройден.

Сетевой адаптер объединяет результаты всех полевых тестов с логической операцией AND . То есть, если какой-либо тест поля, включенный в массив NDIS_RECEIVE_FILTER_FIELD_PARAMETERS структур, завершается сбоем, сетевой пакет не соответствует указанному критерию фильтра.

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

Получение пакетов из очереди получения

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

Если драйвер мини-порта получил OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE запрос OID для очереди, но в очереди не заданы фильтры, драйвер минипорта не должен указывать на получение пакетов в этой очереди. В этом случае, когда драйвер мини-порта получает OID_RECEIVE_FILTER_SET_FILTER запрос OID для очереди и, возможно, до завершения запроса OID, он может указать пакеты в этой очереди. Если драйвер минипорта указывает пакеты в очереди во время обработки запроса OID OID_RECEIVE_FILTER_SET_FILTER, драйвер минипорта должен выполнить OID_RECEIVE_FILTER_SET_FILTER запрос, имеющий код возврата NDIS_STATUS_SUCCESS .