Condividi tramite


Impostazione di un filtro VMQ

Dopo l'allocazione di una coda di ricezione, i driver superiori possono impostare 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 sovrapposti possono sempre impostare un filtro di ricezione sulla coda predefinita. I driver sovrastanti non possiedono la coda predefinita. Pertanto, tutti i driver di protocollo associati a una scheda di rete possono usare la coda predefinita.

Impostazione di un filtro per una coda di ricezione

Per impostare un filtro su una coda di ricezione con un set iniziale di parametri di configurazione, un driver sovrapposto emette una richiesta del metodo oggetto identificatore (OID) OID_RECEIVE_FILTER_SET_FILTER. Il membro InformationBuffer della struttura NDIS_OID_REQUEST contiene inizialmente un puntatore a una struttura NDIS_RECEIVE_FILTER_PARAMETERS. Una volta restituito correttamente dalla 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 sovrastante inizializza la struttura NDIS_RECEIVE_FILTER_PARAMETERS con i seguenti parametri di configurazione del filtro 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, sono supportati solo tipi di filtro NdisReceiveFilterTypeVMQueue per l'interfaccia VMQ (Virtual Machine Queue).

  • Identificatore della coda.

  • Uno o più parametri di test dei campi formattati in strutture come NDIS_RECEIVE_FILTER_FIELD_PARAMETERS. Per VMQ, vengono definiti i parametri di test di campo 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 FieldParametersArrayOffset, FieldParametersArrayNumElementse FieldParametersArrayElementSize membri 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 Flags membro della struttura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS specifica le azioni da eseguire per il filtro di ricezione. I punti seguenti si applicano al flag 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 segnalare solo i pacchetti ricevuti che corrispondono a tutti i seguenti criteri di test:

    • Pacchetto con un indirizzo MAC corrispondente.

    • Pacchetto senza tag VLAN o con 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 segnalare pacchetti che abbiano un indirizzo MAC corrispondente e un identificatore VLAN diverso da zero.

    Nota Se il commutatore estendibile Hyper-V imposta il filtro di indirizzi MAC e non è configurato alcun filtro identificatore VLAN in OID_RECEIVE_FILTER_SET_FILTER, il commutatore 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 esiste alcun filtro identificatore VLAN configurato da una richiesta di impostazione 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 un tag VLAN è presente nel pacchetto ricevuto, 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 che è 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 nessuno dei campi 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 specifico 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 del 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 del campo 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 logica di AND. 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 nel pacchetto che non dispongono di 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ò segnalare i pacchetti nella coda. Per altre informazioni sugli stati della coda, vedere Stati coda e operazioni.

Se il driver miniport ha ricevuto una richiesta OID OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE per una coda ma non sono impostati filtri sulla coda, il driver miniport non deve indicare nessun 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ò segnalare pacchetti di dati su quella coda. Se il driver miniport indica pacchetti in una coda durante l'elaborazione di una richiesta OID_RECEIVE_FILTER_SET_FILTER, il driver miniport deve completare la richiesta OID_RECEIVE_FILTER_SET_FILTER con un codice di ritorno NDIS_STATUS_SUCCESS.