Асинхронная обработка выносок классификации
Драйвер выноски МПП может авторизовать или запретить сетевую операцию, а также разрешить или отменить сетевой пакет, возвращая типы действий FWP_ACTION_PERMIT, FWP_ACTION_CONTINUE или FWP_ACTION_BLOCK из функции выноски classifyFn . Часто драйвер выноски не может вернуть решение о проверке из своей функции classifyFn , пока указанные сведения, такие как классифицируемые поля, метаданные или пакеты, не будут перенаправлены для обработки другому компоненту, например приложению в пользовательском режиме. В таких случаях решение может быть принято асинхронно позже.
Общие правила асинхронной обработки
МПП поддерживает асинхронную обработку функции выноски classifyFn . Однако механизм для этого отличается в зависимости от разных слоев.
Асинхронная классификация ALE
Драйвер выноски должен вызывать функцию FwpsPendOperation0 из classifyFn. Асинхронная операция должна быть завершена вызовом функции FwpsCompleteOperation0 .
Асинхронная классификация пакетов
Драйвер выноски должен возвращать FWP_ACTION_BLOCK из функции classifyFn с установленным флагом FWPS_CLASSIFY_OUT_FLAG_ABSORB . На сетевые пакеты необходимо ссылаться или клонировать. Асинхронная операция завершается либо повторной отправкой клонированного или измененного пакета, либо путем автоматического удаления пакета.
Асинхронная классификация ALE, которая включает пакеты
Используется сочетание двух предыдущих процедур: выполняется операция классификации, а пакет ссылается на пакет или клонируется, а через некоторое время вызов classifyFn завершается, а клонированный пакет повторно отбрасывается или отклоняется.
Особые случаи и рекомендации
ALE Connect и уровни приема и принятия
При вызове FwpsCompleteOperation0 для завершения операции классификации с использованием кода на уровне подключения ALE (FWPS_LAYER_ALE_AUTH_CONNECT_V4 или FWPS_LAYER_ALE_AUTH_CONNECT_V6), на соответствующем уровне подключения ALE активируется операция повторной классификации ALE. Драйвер выноски должен возвращать решение о проверке из этой операции повторной проверки классификации. Вы можете обнаружить операцию повторной проверки подлинности ALE, проверив, установлен ли флаг FWP_CONDITION_FLAG_IS_REAUTHORIZE .
Драйвер выноски должен поддерживать уникальное состояние для каждой выполненной ALE_AUTH_CONNECT классифицировать операцию таким образом, чтобы решение о проверке для каждой операции классификации можно было найти во время повторной проверки подлинности, инициированной FwpsCompleteOperation0. Если пакеты ссылаются или клонируются во время выполнения операции классификации ALE_AUTH_CONNECT (например, для подключений, отличных от TCP), они могут быть повторно отправлены после повторной проверки подлинности.
Если FwpsCompleteOperation0 вызывается во время операции классификации на уровне приема и принятия ALE (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 или FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6), FwpsCompleteOperation0 не запускает повторную авторизацию ALE. Вместо этого новый вызов classifyFn выполняется снова, когда клонированные пакеты повторно вошли, если изменение не было достаточно значительным для обхода фильтра. Разрешение самостоятельного внедрения клона из уровня ALE_RECV_ACCEPT эффективно авторизует входящее подключение. Если входящее подключение не разрешено, отмените входящий пакет после вызова FwpsCompleteOperation0.
Повторная авторизация ALE
Драйвер выноски можно переклассифицировать на уровне подключения ALE или получения и принятия для таких событий, как изменение политики (например, добавление или удаление фильтра на уровне), обнаружение нового интерфейса прибытия и повторное подключение с помощью IPsec. Такая повторная авторизация не может выполняться путем вызова FwpsCompleteOperation0, и это не обязательно. Драйвер выноски должен использовать перечисленные ранее правила для обработки пакетов, указанных во время повторной проверки подлинности.
Имейте в виду, что как входящий, так и исходящий пакет могут быть повторно авторизованы на ALE_AUTH_CONNECT или ALE_RECV_ACCEPT уровнях. Например, входящий пакет может быть повторно авторизован на уровне ALE_AUTH_CONNECT. Драйвер выноски не должен предполагать, что направление пакета совпадает с направлением соединения.
слои ALE_FLOW_ESTABLISHED
Асинхронная обработка не поддерживается на этих уровнях (FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4 или FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6).
слои INBOUND_TRANSPORT
Драйвер выноски не должен выполнять асинхронную обработку пакетов, требующих классификации ALE на уровне входящего (входящего) транспорта (FWPS_LAYER_INBOUND_TRANSPORT_V4 или FWPS_LAYER_INBOUND_TRANSPORT_V6). Это может помешать созданию потока. При вызове функции выноски classifyFn на входящем транспортном уровне программа МПП устанавливает флаг FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED для пакетов, требующих классификации ALE. Драйвер выноски должен разрешать такие пакеты из уровня INBOUND_TRANSPORT и откладывать их обработку до тех пор, пока они не достигнут уровня ALE_RECV_ACCEPT.
Слои STREAM
На уровне потока (FWPS_LAYER_STREAM_V4 или FWPS_LAYER_STREAM_V6) сегменты данных TCP указываются вместо ip-заголовка или заголовка TCP. Потоковый слой также позволяет указать цепочку списков чистого буфера в одном вызове функции выноски classifyFn . МПП предоставляет специализированные функции клонирования и внедрения FwpsCloneStreamData0 и FwpsStreamInjectAsync0 для использования выносок уровня потока.
Из-за упорядоченной природы доставки данных уровня потока драйвер выноски должен продолжать клонировать и поглощать данные до тех пор, пока все потоковые данные все еще находятся в состоянии ожидания. Сочетание асинхронных и синхронных операций для заданного потока потока может привести к неопределенному поведению.