Указание фильтра получения объединения пакетов
Драйвер overlying может задать один или несколько фильтров приема для драйвера минипорта, поддерживающего объединение пакетов NDIS. Драйвер overlying может указать максимальное количество фильтров приема, указанное драйвером miniport в элементе MaxPacketCoalescingFiltersструктуры NDIS_RECEIVE_FILTER_CAPABILITIES .
Примечание Драйвер протокола overlying получает структуру NDIS_RECEIVE_FILTER_CAPABILITIES в структуре NDIS_BIND_PARAMETERS . Драйвер фильтра overlying получает структуру NDIS_RECEIVE_FILTER_CAPABILITIES в структуре NDIS_FILTER_ATTACH_PARAMETERS .
Избыточный драйвер загружает фильтры в драйвер минипорта, выдавая запросы метода OID OID_RECEIVE_FILTER_SET_FILTER. Элемент InformationBuffer структуры NDIS_OID_REQUEST для этого запроса OID содержит указатель на буфер, выделенный вызывающим объектом. Этот буфер имеет следующий формат:
Структура NDIS_RECEIVE_FILTER_PARAMETERS , указывающая параметры для фильтра получения NDIS.
Дополнительные сведения об инициализации этой структуры см. в разделе Указание фильтра получения.
Массив NDIS_RECEIVE_FILTER_FIELD_PARAMETERS структур, указывающий критерий проверки фильтра для поля в заголовке сетевого пакета.
Дополнительные сведения об инициализации этих структур см. в разделе Указание тестов поля заголовка.
Указание фильтра получения
Драйвер overlying указывает фильтр получения объединения пакетов путем инициализации структуры NDIS_RECEIVE_FILTER_PARAMETERS с параметрами конфигурации для фильтра. При инициализации структуры NDIS_RECEIVE_FILTER_PARAMETERS драйвер должен следовать следующим правилам:
Элемент FilterType должен иметь значение NDIS_RECEIVE_FILTER_TYPE перечисления NdisReceiveFilterTypePacketCoalescing.
Для элемента QueueId необходимо задать значение NDIS_DEFAULT_RECEIVE_QUEUE_ID.
Примечание Начиная с версии NDIS 6.30 фильтр получения объединения пакетов поддерживается только в очереди получения по умолчанию сетевого адаптера. Эта очередь получения имеет идентификатор NDIS_DEFAULT_RECEIVE_QUEUE_ID.
Если драйвер overlying создает новый фильтр получения, он должен задать для элемента FilterId значение NDIS_DEFAULT_RECEIVE_FILTER_ID.
Примечание NDIS создаст уникальный идентификатор фильтра (ID) для фильтра получения, прежде чем перенаправит запрос метода OID OID_RECEIVE_FILTER_SET_FILTER драйверу мини-порта.
Если драйвер overlying изменяет существующий фильтр получения, он должен задать для элемента FilterId ненулевой идентификатор фильтра получения. Драйвер overlying получает идентификатор фильтра для фильтра получения, когда он отправляет запрос метода OID для OID_RECEIVE_FILTER_ENUM_FILTERS. Дополнительные сведения об изменении фильтра получения см. в разделе Изменение фильтров получения объединения пакетов.
Для определения массива параметра поля необходимо задать элементы FieldParametersArrayOffset, FieldParametersArrayElementSizeструктуры NDIS_RECEIVE_FILTER_PARAMETERS. Каждый элемент в массиве представляет собой NDIS_RECEIVE_FILTER_FIELD_PARAMETERS структуру, которая задает параметры для проверки поля заголовка фильтра получения.
Элемент RequestedFilterIdBitCount должен иметь нулевое значение.
Параметру MaxCoalescingDelay необходимо задать максимальное время (в миллисекундах), когда первый пакет, соответствующий фильтру приема, сохраняется и объединяется в сетевом адаптере. Как только будет получен первый пакет, соответствующий фильтру, сетевой адаптер объединяет пакет и запускает аппаратный таймер, для которого задано значение элемента MaxCoalescingDelay .
Драйвер overlying должен указать, что тесты поля заголовка в массиве параметров полей должны находиться в том же порядке, что и связанные заголовки MAC и протоколов в пакете.
Например, прежде чем драйвер overlying указывает параметры фильтра для поля протокола IP версии 4 (IPv4), он должен сначала указать параметры фильтра для поля протокола заголовка MAC (NdisMacHeaderFieldProtocol). Таким образом, драйвер задает тест поля заголовка, который проверяет правильное значение EtherType (0x0800) для IPv4-пакетов. Если тест завершается неудачно, адаптеру не нужно выполнять проверку поля протокола IPV4.
Указание тестов поля заголовка
Каждый фильтр получения может указывать один или несколько критериев теста (тесты полей заголовка). Сетевой адаптер выполняет эти тесты, чтобы определить, следует ли объединить полученный пакет в аппаратный буфер объединения адаптера. Кроме того, драйвер overlying может указывать отдельные тесты фильтра для различных полей управления доступом к мультимедиа (MAC), IP версии 4 (IPv4) и ip версии 6 (IPv6).
Для оптимизации фильтрации сетевого адаптера тесты полей заголовков основаны на стандартизированных именах полей заголовков, а не на спецификациях смещения и длины байтов в данных пакета. Используя имена заголовков или полей, оборудование или встроенное ПО сетевого адаптера может оптимизировать выполнение нескольких тестов полей заголовков для полученного пакета.
Каждый фильтр получения может содержать один или несколько тестов поля заголовка, заданных структурой NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Каждая NDIS_RECEIVE_FILTER_FIELD_PARAMETERS структура является элементом массива параметров поля, на который ссылаются элементы FieldParametersArrayOffset, FieldParametersArrayNumElements и FieldParametersArrayElementSizeструктуры NDIS_RECEIVE_FILTER_PARAMETERS .
Драйвер мини-порта должен следовать этим рекомендациям при обработке запроса метода OID OID_RECEIVE_FILTER_SET_FILTER:
Если флаг NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO задан в элементе Flags структуры NDIS_RECEIVE_FILTER_FIELD_PARAMETERS , сетевой адаптер должен указывать только полученные пакеты с соответствующим MAC-адресом и пакеты без меток или пакеты с нулевым идентификатором виртуальной локальной сети. То есть сетевой адаптер не должен указывать пакеты с соответствующим MAC-адресом и ненулевым идентификатором виртуальной локальной сети.
Если флаг NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO не задан и фильтр идентификаторов виртуальной локальной сети не настроен запросом на набор OID OID_RECEIVE_FILTER_SET_FILTER, драйвер мини-порта должен выполнить одно из следующих действий:
Если драйвер miniport поддерживает NDIS 6.20, он должен вернуть состояние сбоя для запроса OID OID_RECEIVE_FILTER_SET_FILTER.
Если драйвер miniport поддерживает NDIS 6.30 или более поздние версии NDIS, он должен настроить сетевой адаптер для проверки и фильтрации указанных полей MAC-адресов. Если тег виртуальной ЛС присутствует в полученном пакете, сетевой адаптер должен удалить его из данных пакета. Драйвер мини-порта должен поместить тег виртуальной локальной сети в NDIS_NET_BUFFER_LIST_8021Q_INFO , связанный со структурой NET_BUFFER_LIST пакета.
Если драйвер overlying задает фильтр MAC-адресов и фильтр идентификатора виртуальной локальной сети в структуре NDIS_RECEIVE_FILTER_PARAMETERS , он не устанавливает флаг NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO в любом из полей фильтра. В этом случае драйвер мини-порта должен указывать пакеты, соответствующие как указанному MAC-адресу, так и идентификатору виртуальной локальной сети. То есть драйвер мини-порта не должен указывать пакеты с соответствующим MAC-адресом, которые имеют нулевой идентификатор виртуальной локальной сети или являются пакетами без меток.