Циклирование пакетов NDIS

Если установлен флаг NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET в элементе NblFlags структуры NET_BUFFER_LIST, это означает, что пакет является пакетом обратного цикла. Драйверы протокола и драйверы фильтров могут проверить этот флаг, чтобы определить, является ли пакет пакетом обратной передачи.

NDIS циклирует пакеты обратно, если выполнены все следующие три условия:

  1. Базовый тип носителя адаптера мини-порта — NdisMedium802_3 или NdisMedium802_5.

  2. Выполняется любое из следующих трех условий:

    1. Привязка протокола задает параметр NDIS_PACKET_TYPE_PROMISCUOUS с OID_GEN_CURRENT_PACKET_FILTER OID, чтобы указать свой фильтр пакетов (и для Windows 8 и более поздних версий не устанавливал NDIS_PACKET_TYPE_NO_LOCAL в одном и том же OID), и одно из следующих значений имеет значение true:

      • Существует несколько привязок к мини-адаптеру.
      • Имеется модуль фильтра, подключенный к минипорт-адаптеру, и модуль фильтра зарегистрировал обработчик приема.
    2. Привязка протокола задает параметр NDIS_PACKET_TYPE_ALL_LOCAL с OID_GEN_CURRENT_PACKET_FILTER OID, чтобы указать его фильтр пакетов, и любой из следующих значений имеет значение true.

      • Существует несколько привязок к мини-адаптеру.
      • Имеется модуль фильтра, подключенный к минипорт-адаптеру, и модуль фильтра зарегистрировал обработчик приема.
    3. Вызывающий объект задает флаг NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK в параметре SendFlags функции NdisSendNetBufferLists.

  3. Пакет допустим, как это определено набором фильтров пакетов с 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.

Привязка протокола получает пакеты обратного цикла, если выполняется одно из следующих условий:

  1. Привязка протокола — это исходный отправитель пакета, а NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK задан.

  2. Привязка протокола не задает NDIS_PACKET_TYPE_NO_LOCAL в фильтре пакетов.

Привязка протокола не будет получать пакеты обратной связи, если одно из следующих условий является истинным:

  1. Привязка протокола задает NDIS_PACKET_TYPE_NO_LOCAL в фильтре пакетов и не является исходным отправителем пакета.

  2. Привязка протокола выступает в качестве исходного отправителя, но флаг NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK не установлен в параметре SendFlags при вызове функции NdisSendNetBufferLists.

На следующем рисунке показан поток логики алгоритма обратного цикла.

блок-схему, которая показывает поток логики алгоритма обратного цикла.