Настройка фильтра получения для виртуального порта
После создания виртуального порта (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 одним из следующих способов:
Из предыдущего запроса метода OID OID_NIC_SWITCH_CREATE_VPORT.
Из предыдущего запроса метода OID OID_NIC_SWITCH_ENUM_VPORTS.
Элемент 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 , завершается сбоем, сетевой пакет не соответствует указанному критерию фильтра.
Когда сетевой адаптер проверяет полученный пакет на соответствие этим критериям фильтра, он должен игнорировать все поля в пакете, не имеющие заданных условий тестирования.