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:
O tipo de mídia do adaptador de miniporte subjacente é NdisMedium802_3 ou NdisMedium802_5.
Qualquer uma das três seguintes condições é atendida:
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.
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.
O chamador define o sinalizador NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK no parâmetro SendFlags da função NdisSendNetBufferLists .
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:
A associação de protocolo é o remetente original do pacote e NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK está definido.
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:
A associação de protocolo define NDIS_PACKET_TYPE_NO_LOCAL no filtro de pacote e não é o remetente original do pacote.
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.