Циклическое выполнение пакетов NDIS
Если установлен флаг NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET в элементе NblFlagsструктуры NET_BUFFER_LIST , пакет является пакетом замыкания на себя. Драйверы протоколов и драйверы фильтров могут проверка этот флаг, чтобы определить, является ли пакет пакетом замыкания на себя.
NDIS выполняет обратный цикл пакетов при выполнении всех следующих трех условий:
Базовый тип мультимедиа адаптера мини-порта — NdisMedium802_3 или NdisMedium802_5.
Выполняется любое из следующих трех условий:
Привязка протокола задает параметр NDIS_PACKET_TYPE_PROMISCUOUS с OID_GEN_CURRENT_PACKET_FILTER OID, чтобы указать фильтр пакетов (и для Windows 8 и более поздних версий не задал NDIS_PACKET_TYPE_NO_LOCAL в том же OID).
- Существует несколько привязок к адаптеру мини-порта.
- К адаптеру мини-порта подключен модуль фильтра, а модуль фильтра зарегистрировал обработчик приема.
Привязка протокола задает параметр NDIS_PACKET_TYPE_ALL_LOCAL с OID_GEN_CURRENT_PACKET_FILTER OID, чтобы указать фильтр пакетов, и любое из следующих значений имеет значение true.
- Существует несколько привязок к адаптеру мини-порта.
- К адаптеру мини-порта подключен модуль фильтра, а модуль фильтра зарегистрировал обработчик приема.
Вызывающий объект задает флаг NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK в параметре SendFlags функции NdisSendNetBufferLists .
Пакет является допустимым в соответствии с фильтром пакетов, заданным с идентификатором OID_GEN_CURRENT_PACKET_FILTER OID для адаптера мини-порта. Ниже приводятся некоторые примеры:
- Если пакет является прямым, адрес назначения в пакете должен соответствовать MAC-адресу адаптера мини-порта.
- Если пакет является пакетом многоадресной рассылки, фильтр пакетов должен иметь NDIS_PACKET_TYPE_ALL_MULTICAST задан или адрес назначения соответствует одному из адресов многоадресной рассылки в списке адресов многоадресной рассылки адаптера мини-порта, а фильтр пакетов NDIS_PACKET_TYPE_MULTICAST задан.
- Если пакет является широковещательным, фильтр пакетов адаптера мини-порта должен иметь NDIS_PACKET_TYPE_BROADCAST задан.
- Фильтр пакетов адаптера мини-порта NDIS_PACKET_TYPE_PROMISCUOUS или NDIS_PACKET_TYPE_ALL_LOCAL задан.
Привязка протокола получает пакеты замыкания на себя, если выполняется одно из следующих действий:
Привязка протокола является исходным отправителем пакета и NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK задано.
Привязка протокола не задает NDIS_PACKET_TYPE_NO_LOCAL в фильтре пакетов.
Привязка протокола не будет получать пакеты замыкания на себя, если выполняется одно из следующих действий:
Привязка протокола задает NDIS_PACKET_TYPE_NO_LOCAL в фильтре пакетов и не является исходным отправителем пакета.
Привязка протокола является исходным отправителем, но NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK не задана в параметре SendFlags при вызове функции NdisSendNetBufferLists .
На следующем рисунке показан поток логики алгоритма замыкания на себя.