Partilhar via


Reencaminhamento de Pacotes NDIS

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

O NDIS reencaminha pacotes de volta se todas as três condições seguintes forem satisfeitas:

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

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

    1. Uma vinculação de protocolo definiu a configuração NDIS_PACKET_TYPE_PROMISCUOUS com o OID OID_GEN_CURRENT_PACKET_FILTER para especificar o respetivo filtro de pacotes (e, para Windows 8 e posterior, não definiu NDIS_PACKET_TYPE_NO_LOCAL no mesmo OID) e pelo menos uma das seguintes condições é verdadeira:

      • Há mais de uma ligação ao adaptador de miniporta.
      • Há um módulo de filtro conectado ao adaptador de miniporta e o módulo de filtro registou um manipulador de recepção.
    2. Uma associação de protocolo define a configuração NDIS_PACKET_TYPE_ALL_LOCAL com o OID_GEN_CURRENT_PACKET_FILTER OID para especificar seu filtro de pacotes e uma das seguintes opções é verdadeira.

      • Há mais de uma ligação ao adaptador de miniporta.
      • Há um módulo de filtro conectado ao adaptador de miniporta e o módulo de filtro registou um manipulador de recepção.
    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 filtro de pacotes definido com o OID OID_GEN_CURRENT_PACKET_FILTER para o miniport adapter. Seguem-se alguns exemplos:

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

Uma associação de protocolo recebe pacotes de loopback se uma das seguintes opções for verdadeira:

  1. A ligação de protocolo é o remetente original do pacote, e o 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 pacotes.

Uma associação de protocolo não receberá pacotes de loopback se uma das seguintes opções for verdadeira:

  1. A associação de protocolo define NDIS_PACKET_TYPE_NO_LOCAL no filtro de pacotes 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 numa 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.