Impostazione di un filtro VMQ
Dopo l'allocazione di una coda di ricezione, i driver overlying possono impostare i filtri nella coda di ricezione. Solo il driver che ha allocato una coda di ricezione può impostare un filtro per tale coda.
Nota Poiché la coda di ricezione predefinita (NDIS_DEFAULT_RECEIVE_QUEUE_ID) esiste sempre, i driver overlying possono sempre impostare un filtro di ricezione nella coda predefinita. I driver eccessivamente non sono proprietari della coda predefinita. Pertanto, tutti i driver di protocollo associati a una scheda di rete possono usare la coda predefinita.
Impostazione di un filtro in una coda di ricezione
Per impostare un filtro in base a una coda di ricezione con un set iniziale di parametri di configurazione, un driver che esegue eccessivamente una richiesta OID (Method Object Identifier) di OID_RECEIVE_FILTER_SET_FILTER . Il membro InformationBuffer della struttura NDIS_OID_REQUEST contiene inizialmente un puntatore a una struttura NDIS_RECEIVE_FILTER_PARAMETERS . Dopo aver restituito correttamente la richiesta del metodo OID, il membro InformationBuffer della struttura NDIS_OID_REQUEST contiene un puntatore a una struttura NDIS_RECEIVE_FILTER_PARAMETERS con un nuovo identificatore di filtro.
Il driver eccessivamente inizializza la struttura NDIS_RECEIVE_FILTER_PARAMETERS con i parametri di configurazione del filtro seguenti per la coda di ricezione:
Tipo di filtro specificato tramite un valore di enumerazione NDIS_RECEIVE_FILTER_TYPE .
Nota A partire da NDIS 6.20, solo i tipi di filtro NdisReceiveFilterTypeVMQueue sono supportati per l'interfaccia VMQ (Virtual Machine Queue).
Identificatore della coda.
Uno o più parametri di test dei campi formattati come strutture NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Per VMQ, vengono definiti i parametri di test dei campi seguenti.
L'indirizzo MAC (Media Access Control) di destinazione nel pacchetto è uguale all'indirizzo MAC specificato.
L'identificatore VLAN (Virtual LAN) nel pacchetto è uguale all'identificatore VLAN specificato.
La struttura NDIS_RECEIVE_FILTER_PARAMETERS viene usata con l'OID OID_RECEIVE_FILTER_PARAMETERS e l'OID OID_RECEIVE_FILTER_SET_FILTER per specificare i parametri di configurazione di un filtro.
I membri FieldParametersArrayOffset, FieldParametersArrayNumElements e FieldParametersArrayElementSize della struttura NDIS_RECEIVE_FILTER_PARAMETERS definiscono una matrice di strutture NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Ogni struttura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS nella matrice imposta il criterio di test del filtro per un campo in un'intestazione di rete.
Il membro Flags della struttura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS specifica le azioni da eseguire per il filtro di ricezione. I punti seguenti si applicano al flag di NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO :
Se il flag NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO è impostato nel membro Flags della struttura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS , la scheda di rete deve indicare solo i pacchetti ricevuti che corrispondono a tutti i criteri di test seguenti:
Pacchetto con un indirizzo MAC corrispondente.
Un pacchetto che non ha alcun tag VLAN o ha un identificatore VLAN pari a zero.
Se il flag NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO è impostato, la scheda di rete non deve indicare pacchetti con un indirizzo MAC corrispondente e un identificatore VLAN diverso da zero.
Nota Se l'opzione estendibile Hyper-V imposta il filtro indirizzi MAC e non è configurato alcun filtro identificatore VLAN in OID_RECEIVE_FILTER_SET_FILTER, l'opzione imposta anche il flag NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO .
Se il flag NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO non è impostato e non è presente alcun filtro identificatore VLAN configurato da una richiesta di set OID di OID_RECEIVE_FILTER_SET_FILTER, il driver miniport deve eseguire una delle operazioni seguenti:
Se il driver miniport supporta NDIS 6.20, deve restituire uno stato non riuscito per la richiesta OID di OID_RECEIVE_FILTER_SET_FILTER.
Se il driver miniport supporta NDIS 6.30 o versioni successive di NDIS, deve configurare la scheda di rete per controllare e filtrare i campi di indirizzo MAC specificati. Se nel pacchetto ricevuto è presente un tag VLAN, la scheda di rete deve rimuoverla dai dati del pacchetto. Il driver miniport deve inserire il tag VLAN in un NDIS_NET_BUFFER_LIST_8021Q_INFO associato alla struttura NET_BUFFER_LIST del pacchetto.
Se un driver di protocollo imposta un filtro di indirizzi MAC e un filtro identificatore VLAN con l'OID OID_RECEIVE_FILTER_SET_FILTER , non imposta il flag NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO in uno dei campi del filtro. In questo caso, il driver miniport deve indicare pacchetti che corrispondono sia all'indirizzo MAC specificato che all'identificatore VLAN. Ovvero, il driver miniport non deve indicare pacchetti con un indirizzo MAC corrispondente con un identificatore VLAN zero o pacchetti senza tag.
Uso dell'identificatore di filtro
NDIS assegna un identificatore di filtro nel membro FilterId della struttura NDIS_RECEIVE_FILTER_PARAMETERS e passa la richiesta del metodo OID di OID_RECEIVE_FILTER_SET_FILTER al driver miniport sottostante. Ogni filtro impostato in una coda di ricezione ha un identificatore di filtro univoco per una scheda di rete. Ovvero, gli identificatori di filtro non vengono duplicati in code diverse gestite dalla scheda di rete.
Il driver overlying deve usare l'identificatore di filtro fornito da NDIS nelle richieste OID successive; Ad esempio, per modificare i parametri di filtro o per liberare un filtro.
Quando NDIS riceve una richiesta OID per impostare un filtro in una coda di ricezione, verifica i parametri del filtro. Dopo che NDIS alloca le risorse necessarie e l'identificatore di filtro, invia la richiesta OID alla scheda di rete sottostante. Se la scheda di rete può allocare correttamente le risorse software e hardware necessarie per il filtro, completa la richiesta OID con NDIS_STATUS_SUCCESS.
Il driver miniport deve mantenere gli identificatori di filtro per i filtri di ricezione allocati. NDIS usa l'identificatore di filtro di un filtro con richieste OID successive per modificare i parametri del filtro di ricezione o cancellare il filtro di ricezione. Per altre informazioni su come modificare i parametri e cancellare i filtri, vedere Recupero e aggiornamento dei parametri della coda di macchine virtuali e cancellazione di un filtro VMQ.
Gestione del filtro in una coda di ricezione
Il driver miniport programma la scheda di rete in base ai filtri nel modo seguente:
Tutti i parametri di test dei campi per un determinato filtro devono corrispondere per assegnare un pacchetto alla coda.
È possibile impostare più filtri in una coda.
I pacchetti devono essere assegnati alla coda di ricezione se uno dei filtri passa.
La scheda di rete combina i risultati di tutti i test di campo con un'operazione AND logica. Ovvero, se un test di campo incluso nella matrice di strutture di NDIS_RECEIVE_FILTER_FIELD_PARAMETERS ha esito negativo, il pacchetto di rete non soddisfa il criterio di filtro specificato.
Quando una scheda di rete testa un pacchetto ricevuto in base a questi criteri di filtro, deve ignorare tutti i campi del pacchetto che non hanno criteri di test specificati.
Ricezione di pacchetti da una coda di ricezione
Dopo che un driver miniport riceve una richiesta di OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE e dispone di filtri impostati nella coda, la coda si trova nello stato In esecuzione . Mentre la coda è in questo stato, il driver miniport può indicare i pacchetti nella coda. Per altre informazioni sugli stati della coda, vedere Stati e operazioni della coda.
Se il driver miniport ha ricevuto una richiesta OID OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE per una coda ma non sono impostati filtri nella coda, il driver miniport non deve indicare alcun pacchetto di ricezione in tale coda. In questo caso, quando il driver miniport riceve una richiesta OID OID_RECEIVE_FILTER_SET_FILTER per la coda e possibilmente prima di completare la richiesta OID, può indicare i pacchetti in tale coda. Se il driver miniport indica i pacchetti in una coda durante l'elaborazione di una richiesta OID OID_RECEIVE_FILTER_SET_FILTER, il driver miniport deve completare la richiesta di OID_RECEIVE_FILTER_SET_FILTER con un codice restituito NDIS_STATUS_SUCCESS .