Настройка фильтра 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.