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

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

В этом разделе содержатся следующие сведения:

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

Использование флага NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO

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

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

Дополнительные сведения о создании VPort см. в статье Создание виртуального порта.

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

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

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

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

  • Элемент FilterType должен иметь значение NDIS_RECEIVE_FILTER_TYPE перечисления.

    Примечание Начиная с NDIS 6.30 для интерфейса SR-IOV поддерживаются только типы фильтров NdisReceiveFilterTypeVMQueue .

  • Для элемента QueueId необходимо задать значение NDIS_DEFAULT_RECEIVE_QUEUE_ID.

  • Для элемента VPortId необходимо задать идентификатор, связанный с VPort. Драйвер overlying получает идентификатор VPort одним из следующих способов:

  • Элемент FilterId должен иметь значение NDIS_DEFAULT_RECEIVE_FILTER_ID.

    Примечание NDIS назначает уникальный идентификатор фильтра в этом элементе перед перенаправлением запроса OID в драйвер мини-порта для обработки.

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

    Для интерфейса SR-IOV определяются следующие параметры теста поля:

    • Mac-адрес назначения в пакете равен указанному MAC-адресу.

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

После успешного возврата из запроса метода OID элемент InformationBuffer структуры NDIS_OID_REQUEST содержит указатель на структуру NDIS_RECEIVE_FILTER_PARAMETERS с новым идентификатором фильтра.

Использование флага NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO

Элемент 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 , сетевой адаптер должен указывать только полученные пакеты, соответствующие всем следующим критериям тестирования:

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

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

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

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

  • Начиная с версии NDIS 6.30, если флаг NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO не задан и в запросе метода OID_RECEIVE_FILTER_SET_FILTER не настроен фильтр идентификаторов виртуальной локальной сети, драйвер мини-порта должен выполнить одно из следующих действий:

    • Драйвер мини-порта должен возвращать состояние сбоя для запроса метода OID_RECEIVE_FILTER_SET_FILTER .

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

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

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

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

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

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

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

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

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

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

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

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

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

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