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


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

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

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

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

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

Вышележащий драйвер инициализирует структуру 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_RECEIVE_FILTER_PARAMETERS OID и элементом OID_RECEIVE_FILTER_SET_FILTER OID для указания параметров конфигурации фильтра.

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

Элемент структуры 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-адрес и ненулевой идентификатор VLAN.

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

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

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

    • Если мини-драйвер поддерживает 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 базовому драйверу минипорта. Каждый фильтр, заданный в очереди получения, имеет уникальный идентификатор фильтра для сетевого адаптера. То есть идентификаторы фильтров не дублируются в разных очередях, которыми управляет сетевой адаптер.

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

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

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

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

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

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

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

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

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

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

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

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

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