Использование фильтрации уровня 2
Фильтрация уровня 2 поддерживается в Windows 8 и более поздних версиях Windows.
Эта функция ВПП позволяет фильтровать поля mac-заголовка уровня 2. Эти уровни вызываются для каждого пакета для всех пакетов, отправляемых или полученных хост-компьютером. Уровни вызываются перед повторной сборкой пакета по входящему пути и после фрагментации пакетов по исходящему пути. Доступ к этим слоям выполняется из драйвера упрощенного фильтра NDIS (LWF).
Примечание
Выноска не должна внедрять пакеты на слой, если у нее еще нет соответствующего фильтра на этом уровне. Внедрение NET_BUFFER_LIST структур должно быть согласовано с добавлением и удалением фильтра, чтобы внедрение выполнялось только в том случае, если фильтр существует в соответствующем слое. Кроме того, поставщики не должны удалять фильтры, принадлежащие другим поставщикам.
Этот раздел содержит следующие подразделы:
Внедрение кадров MAC
Драйвер обратного вызова вызывает функцию FwpsInjectMacReceiveAsync0 для повторного внедрения ранее поглощенного кадра MAC (или клона кадра) обратно в путь входящих данных уровня 2, из который он был перехвачен, или для внедрения созданного кадра MAC во путь входящих данных.
Драйвер обратного вызова вызывает функцию FwpsInjectMacSendAsync0 для повторного переключения ранее поглощенного кадра MAC (или клона кадра) обратно в путь к исходящим данным уровня 2, из который он был перехвачен, или для внедрения созданного кадра MAC в путь исходящих данных.
Параметр netBufferLists может быть цепочкой NET_BUFFER_LIST . Однако функцию завершения можно вызывать несколько раз каждый, завершая сегмент (или один NET_BUFFER_LIST) цепочки.
Внедренные кадры могут снова классифицироваться, если пакеты соответствуют тому же фильтру, что и первоначально классифицированные. Поэтому, как и в случае с выносками на уровнях IP, выноски уровня 2 также должны защищаться от бесконечной проверки пакетов путем вызова FwpsQueryPacketInjectionState0.
Кроме того, необходимо иметь выноски на уровне, где выполняется внедрение. В противном случае внедренные NET_BUFFER_LIST не будут завершены в функции завершения, и NET_BUFFER_LIST будет идти дальше по стеку. В этом случае поведение не определено, так как NDIS попытается передать внедренные NET_BUFFER_LIST следующему компоненту в стеке.
Элемент NET_BUFFER_LISTStatus содержит результат состояния внедрения стека. Результатом состояния внедрения стека является состояние, которое стек помещает в NET_BUFFER_LIST после того, как функция внедрения ВПП возвращает STATUS_SUCCESS. Используйте макрос NT_SUCCESS, чтобы проверка состояние внедрения стека в элементе Status. Если значение Status равно STATUS_SUCCESS, внедрение прошло успешно без дополнительных сведений. Значения элементов состояния , превышающие STATUS_SUCCESS означают, что внедрение выполнено успешно, но могут быть дополнительные сведения о внедрении, которые следует учитывать. Значения элементов состояния, которые меньше STATUS_SUCCESS означают, что внедрение не удалось выполнить по причине, указанной в элементе Status.
Классификация списков цепочек сетевых буферов
По умолчанию драйвер выноски может классифицировать списки сетевых буферов только по отдельности. Однако драйвер выноски может классифицировать NET_BUFFER_LIST цепочки для повышения производительности, если он выполняет оба следующих действия:
- Задает флаг FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY в элементе Flags структуры FWPS_CALLOUT2 .
- Регистрирует функцию classifyFn2 , которая может классифицировать NET_BUFFER_LIST цепочки.
Предупреждение
Однако если драйвер выноски устанавливает флаг FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY , он не может использовать следующие функции для изменения NET_BUFFER_LISTs.
- FwpsReferenceNetBufferList0
- FwpsDereferenceNetBufferList0
- FwpsAllocateCloneNetBufferList0
- FwpsFreeCloneNetBufferList0
Если этот флаг установлен, FwpsAllocateCloneNetBufferList0 всегда будет возвращать ошибку INVALID_PARAMETER . Это может неожиданно привести к тому, что сторонний драйвер выноски не сможет управлять количеством ссылок NET_BUFFER_LISTs, что приведет к остановке операций отправки и получения.
Слои и поля ВПП 2-го уровня
Идентификаторы уровня фильтрации во время выполнения для фильтрации виртуальных коммутаторов включают:
FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE
FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE
Идентификаторы полей данных для фильтрации виртуальных коммутаторов:
FWPS_FIELDS_INBOUND_MAC_FRAME_ETHERNET
FWPS_FIELDS_OUTBOUND_MAC_FRAME_ETHERNET