Обработка фильтров приема объединения пакетов
Несколько фильтров получения загружаются в драйвер мини-порта с помощью запросов метода OID OID_RECEIVE_FILTER_SET_FILTER. Каждый фильтр может указывать один или несколько тестов (тестов полей заголовков), которые сетевой адаптер использует для определения того, следует ли объединить полученный пакет в аппаратный буфер объединения адаптера.
Прежде чем драйвер минипорта настроит сетевой адаптер с фильтрами приема, драйвер должен оптимизировать фильтры приема на основе аппаратных возможностей адаптера. Например, для всех фильтров получения требуется проверка поля заголовка для mac-заголовка. Таким образом, драйвер может оптимизировать правила фильтрации на основе результатов этого теста. Это позволяет адаптеру определить, какие тесты полей полей заголовков уровня 3 (L3) и уровня 4 (L4) будут выполняться в osI.
Как только сетевой адаптер будет настроен с фильтрами получения, он должен сделать следующее:
Все тестовые параметры поля заголовка для определенного фильтра должны совпадать в полученном пакете, чтобы объединить пакет в буфер объединения.
Сетевой адаптер объединяет результаты всех тестов поля заголовка фильтра приема с логической операцией AND. То есть, если какой-либо тест поля заголовка, включенный в массив структур NDIS_RECEIVE_FILTER_FIELD_PARAMETERS для фильтра получения, завершается сбоем, полученный пакет не соответствует указанному критерию фильтра и не должен быть объединен.
Сетевой адаптер проверяет только данные пакетов на основе указанных параметров теста поля заголовка. Адаптер должен игнорировать все поля заголовков в пакете, для которых не указаны тесты полей заголовка.
Если полученный пакет соответствует всем тестам поля заголовка для любого из фильтров приема, сетевой адаптер должен объединить пакет в буфер аппаратного объединения. Как только первый пакет будет объединен, сетевой адаптер должен запустить аппаратный таймер и задать для срока действия значение члена MaxCoalescingDelay структуры NDIS_RECEIVE_FILTER_PARAMETERS для соответствующего фильтра получения.
По мере получения большего количества пакетов, соответствующих фильтру приема объединения пакетов, сетевой адаптер помещает их в буфер объединения.
Если аппаратный таймер уже запущен, адаптер не должен останавливать или перезапускать таймер для соответствующего фильтра приема. Однако адаптер может настроить аппаратный таймер с наименьшим значением срока действия из соответствующих фильтров получения. Например, когда драйвер получает пакет, соответствующий фильтру получения X, адаптер запускает таймер с указанным значением срока действия для этого фильтра получения. Если адаптер получает пакет, соответствующий фильтру получения Y, адаптер может перенастроить аппаратный таймер с указанным значением срока действия для этого фильтра получения.
Примечание Сетевой адаптер не должен перенастраивание аппаратного таймера, если оставшееся время таймера меньше времени окончания срока действия фильтра приема.
Как только полученные пакеты объединяются, сетевой адаптер создает прерывание, если происходит какое-либо из следующих событий:
Если доступное пространство в буфере объединения оборудования достигает аппаратной низкой отметки, сетевой адаптер должен создать прерывание приема, чтобы драйвер минипорта смог обработать объединяемые пакеты приема.
Если срок действия таймера оборудования, используемого для буфера объединения оборудования, истекает, сетевой адаптер должен создать прерывание приема, чтобы драйвер минипорта смог обработать объединяемые пакеты приема.
Если фильтр приема очищен и пакеты были объединены, соответствующие фильтру, сетевой адаптер должен создать прерывание приема, чтобы драйвер мини-порта смог обработать объединяемые пакеты приема.
Если полученный пакет не соответствует ни одному из фильтров приема, сетевой адаптер должен создать прерывание приема, чтобы драйвер мини-порта смог обработать полученный пакет. Если какие-либо пакеты были объединены, драйвер минипорта также должен обработать эти пакеты.
Если сетевой адаптер создает прерывание для любого другого состояния прерывания, отличного от прерывания приема, сетевой адаптер должен также сообщить о состоянии прерывания приема, чтобы драйвер мини-порта смог обработать объединяемые полученные пакеты.
После создания прерывания сетевой адаптер должен остановить аппаратный таймер, если срок его действия еще не истек, и очистить буфер объединения оборудования.
Драйвер мини-порта должен поддерживать счетчик объединенного пакета, который содержит значение количества полученных пакетов, соответствующих фильтру объединения пакетов. NDIS запрашивает этот счетчик с помощью запроса OID OID_PACKET_COALESCING_FILTER_MATCH_COUNT.
Сетевой адаптер выполняет объединение пакетов только в то время, когда оборудование работает в состоянии полной мощности. В то время как оборудование находится в маломощном состоянии, адаптер должен фильтровать только полученные пакеты на основе шаблонов пробуждения, которые были загружены на адаптер через запросы на набор OID OID_PNP_ENABLE_WAKE_UP.
При переходе сетевого адаптера в состояние полного питания драйвер мини-порта должен выполнить следующие действия.
Драйвер мини-порта должен настроить сетевой адаптер для отмены всех объединяемых пакетов в буфере объединения оборудования. Сетевой адаптер мог объединить эти пакеты при переходе в состояние с низким энергопотреблением.
Драйвер мини-порта должен настроить сетевой адаптер с набором фильтров приема объединения пакетов, которые были загружены в драйвер перед переходом с низким энергопотреблением.
Драйвер мини-порта должен очистить счетчик объединенного пакета.