Partilhar via


Looping Back NDIS Packets

Se o sinalizador NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET no membro NblFlags da estrutura NET_BUFFER_LIST estiver definido, o pacote será um pacote de loopback. Drivers de protocolo e drivers de filtro podem marcar esse sinalizador para determinar se um pacote é um pacote de loopback.

O NDIS retornará os pacotes se todas as três condições a seguir forem atendidas:

  1. O tipo de mídia do adaptador de miniporte subjacente é NdisMedium802_3 ou NdisMedium802_5.

  2. Qualquer uma das três seguintes condições é atendida:

    1. Uma associação de protocolo definiu a configuração de NDIS_PACKET_TYPE_PROMISCUOUS com o OID OID_GEN_CURRENT_PACKET_FILTER para especificar seu filtro de pacote (e, para Windows 8 e posterior, não definiu NDIS_PACKET_TYPE_NO_LOCAL na mesma OID) e qualquer um dos seguintes é verdadeiro:

      • Há mais de uma associação ao adaptador de miniport.
      • Há um módulo de filtro anexado ao adaptador de miniporte e o módulo de filtro registrou um manipulador de recebimento.
    2. Uma associação de protocolo define a configuração de NDIS_PACKET_TYPE_ALL_LOCAL com o OID_GEN_CURRENT_PACKET_FILTER OID para especificar seu filtro de pacote e um dos seguintes é verdadeiro.

      • Há mais de uma associação ao adaptador de miniport.
      • Há um módulo de filtro anexado ao adaptador de miniporte e o módulo de filtro registrou um manipulador de recebimento.
    3. O chamador define o sinalizador NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK no parâmetro SendFlags da função NdisSendNetBufferLists .

  3. O pacote é aceitável conforme determinado pelo conjunto de filtros de pacotes com o OID OID_GEN_CURRENT_PACKET_FILTER para o adaptador de miniporte. Estes são alguns exemplos:

    • Se o pacote for um pacote direto, o endereço de destino no pacote deverá corresponder ao endereço MAC do adaptador de miniporte.
    • Se o pacote for um pacote multicast, o filtro de pacote deverá ter NDIS_PACKET_TYPE_ALL_MULTICAST definido ou o endereço de destino corresponder a um dos endereços multicast na lista de endereços multicast do adaptador de miniporte e o filtro de pacotes NDIS_PACKET_TYPE_MULTICAST definido.
    • Se o pacote for um pacote de transmissão, o filtro de pacote do adaptador de miniporte deverá ter NDIS_PACKET_TYPE_BROADCAST definido.
    • O filtro de pacote do adaptador de miniporto tem NDIS_PACKET_TYPE_PROMISCUOUS ou NDIS_PACKET_TYPE_ALL_LOCAL definido.

Uma associação de protocolo receberá pacotes de loopback se um dos seguintes itens for verdadeiro:

  1. A associação de protocolo é o remetente original do pacote e NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK está definido.

  2. A associação de protocolo não define NDIS_PACKET_TYPE_NO_LOCAL no filtro de pacote.

Uma associação de protocolo não receberá pacotes de loopback se um dos seguintes itens for verdadeiro:

  1. A associação de protocolo define NDIS_PACKET_TYPE_NO_LOCAL no filtro de pacote e não é o remetente original do pacote.

  2. A associação de protocolo é o remetente original, mas NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK não está definido no parâmetro SendFlags em uma chamada para a função NdisSendNetBufferLists .

A figura a seguir mostra o fluxo lógico do algoritmo de loopback.

Fluxograma que mostra o fluxo lógico do algoritmo de loopback.