Ciclo dei pacchetti NDIS
Se il flag NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET nel membro NblFlags della struttura NET_BUFFER_LIST è impostato, il pacchetto è un pacchetto di loopback. I driver di protocollo e i driver di filtro possono controllare questo flag per determinare se un pacchetto è un pacchetto di loopback.
NDIS esegue un ciclo indietro dei pacchetti se vengono soddisfatte tutte le tre condizioni seguenti:
Il tipo di supporto dell'adattatore miniport sottostante è NdisMedium802_3 o NdisMedium802_5.
Viene soddisfatta una delle tre condizioni seguenti:
Un binding di protocollo imposta il parametro NDIS_PACKET_TYPE_PROMISCUOUS con l'OID OID_GEN_CURRENT_PACKET_FILTER per specificare il filtro di pacchetti e, per Windows 8 e versioni successive, non imposta NDIS_PACKET_TYPE_NO_LOCAL nello stesso OID. Uno dei seguenti è vero:
- È presente più di un'associazione all'adattatore miniport.
- È collegato all'adattatore miniport un modulo di filtro, e il modulo di filtro ha registrato un handler di ricezione.
Un'associazione di protocollo imposta l'impostazione di NDIS_PACKET_TYPE_ALL_LOCAL con l'OID OID_GEN_CURRENT_PACKET_FILTER per specificare il filtro di pacchetti e uno dei seguenti è true.
- È presente più di un'associazione all'adattatore miniport.
- È presente un modulo di filtro collegato all'adattatore miniport e il modulo di filtro ha registrato un gestore di ricezione.
Il chiamante imposta il flag NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK nel parametro SendFlags della funzione NdisSendNetBufferLists.
Il pacchetto è accettabile come determinato dal filtro di pacchetti impostato con l'OID OID_GEN_CURRENT_PACKET_FILTER per l'adattatore miniport. Di seguito sono riportati alcuni esempi:
- Se il pacchetto è un pacchetto diretto, l'indirizzo di destinazione nel pacchetto deve corrispondere all'indirizzo MAC dell'adattatore miniport.
- Se il pacchetto è un pacchetto multicast, il filtro di pacchetti deve avere NDIS_PACKET_TYPE_ALL_MULTICAST impostato oppure l'indirizzo di destinazione corrisponde a uno degli indirizzi multicast nell'elenco di indirizzi multicast dell'adattatore miniport e il filtro di pacchetti ha NDIS_PACKET_TYPE_MULTICAST impostato.
- Se il pacchetto è un pacchetto broadcast, il filtro pacchetti dell'adattatore miniport deve avere NDIS_PACKET_TYPE_BROADCAST impostato.
- Il filtro pacchetti dell'adattatore miniport ha NDIS_PACKET_TYPE_PROMISCUOUS o NDIS_PACKET_TYPE_ALL_LOCAL impostato.
Un'associazione di protocollo riceve pacchetti di loopback se una delle condizioni seguenti è vera:
L'associazione al protocollo è il mittente originale del pacchetto e NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK è impostato.
L'associazione di protocollo non imposta NDIS_PACKET_TYPE_NO_LOCAL nel filtro pacchetti.
Un'associazione di protocollo non riceverà pacchetti di loopback se una delle condizioni seguenti è vera:
L'associazione di protocollo imposta NDIS_PACKET_TYPE_NO_LOCAL nel filtro di pacchetti e non è il mittente originale del pacchetto.
L'associazione di protocollo è il mittente originale, ma NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK non è impostato nel parametro SendFlags in una chiamata alla funzione NdisSendNetBufferLists.
La figura seguente illustra il flusso di logica dell'algoritmo di loopback.