Поделиться через


Циклическое выполнение пакетов 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).

      • Существует несколько привязок к адаптеру мини-порта.
      • К адаптеру мини-порта подключен модуль фильтра, а модуль фильтра зарегистрировал обработчик приема.
    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 .

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

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