Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После создания виртуального порта (VPort) на коммутаторе сетевого адаптера, драйверы могут задавать фильтры приема на VPort. Только драйвер, создавший VPort, может задать фильтр получения в этом VPort.
В этом разделе содержатся следующие сведения:
Настройка фильтра получения на VPort
Использование флага NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO
Использование идентификатора фильтра
Обработка фильтров получения на 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, поддерживаются только типы фильтров NdisReceiveFilterTypeVMQueue для единого корневого интерфейса виртуализации ввода-вывода (SR-IOV) .
Элемент QueueId должен быть установлен в NDIS_DEFAULT_RECEIVE_QUEUE_ID.
Элемент VPortId должен иметь идентификатор, связанный с VPort. Верхний драйвер получает идентификатор 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»
Флаги член структуры 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 задан в элементе Флаги, сетевой адаптер должен указывать только полученные пакеты, соответствующие всем следующим критериям теста:
Пакет с соответствующим 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-адресов. Если тег виртуальной локальной сети присутствует в полученном пакете, сетевой адаптер должен удалить его из данных пакета. Минипорт-драйвер должен поместить VLAN-тег в 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-адресом, имеющие нулевой идентификатор VLAN или немаркированные пакеты.
Использование идентификатора фильтра
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, если какой-либо из фильтров прошёл.
Сетевой адаптер объединяет результаты всех полевых тестов с помощью логической операции И. То есть, если какой-либо тест поля, включенный в массив структур NDIS_RECEIVE_FILTER_FIELD_PARAMETERS, завершается сбоем, сетевой пакет не соответствует указанному критерию фильтра.
Когда сетевой адаптер проверяет полученный пакет с этими критериями фильтра, он должен игнорировать все поля в пакете, не имеющие заданных критериев тестирования.