Condividi tramite


Specifica di un filtro di ricezione del raggruppamento di pacchetti

Un driver overlying può impostare uno o più filtri di ricezione su un driver miniport che supporta l'unione dei pacchetti NDIS. Il driver overlying può specificare fino al numero massimo di filtri di ricezione specificati dal driver miniport specificato nel membro MaxPacketCoalescingFilters della struttura NDIS_RECEIVE_FILTER_CAPABILITIES .

Nota Il driver del protocollo overlying ottiene la struttura NDIS_RECEIVE_FILTER_CAPABILITIES all'interno della struttura NDIS_BIND_PARAMETERS . Il driver di filtro overlying ottiene la struttura di NDIS_RECEIVE_FILTER_CAPABILITIES all'interno della struttura NDIS_FILTER_ATTACH_PARAMETERS .

I download del driver overlying ricevono filtri al driver miniport emettendo richieste di metodo OID di OID_RECEIVE_FILTER_SET_FILTER. Il membro InformationBuffer della struttura NDIS_OID_REQUEST per questa richiesta OID contiene un puntatore a un buffer allocato dal chiamante. Questo buffer è formattato per contenere quanto segue:

Specifica di un filtro di ricezione

Un driver overlying specifica un filtro di unione dei pacchetti inizializzando una struttura NDIS_RECEIVE_FILTER_PARAMETERS con i parametri di configurazione per il filtro. Quando inizializza la struttura NDIS_RECEIVE_FILTER_PARAMETERS , il driver overlying deve seguire queste regole:

  • Il membro FilterType deve essere impostato sul valore di enumerazione NDIS_RECEIVE_FILTER_TYPE di NdisReceiveFilterTypePacketCoalescing.

  • Il membro QueueId deve essere impostato su NDIS_DEFAULT_RECEIVE_QUEUE_ID.

    Nota A partire da NDIS 6.30, il filtro di ricezione del pacchetto è supportato solo nella coda di ricezione predefinita della scheda di rete. Questa coda di ricezione ha un identificatore di NDIS_DEFAULT_RECEIVE_QUEUE_ID.

  • Se il driver overlying sta creando un nuovo filtro di ricezione, deve impostare il membro FilterId su NDIS_DEFAULT_RECEIVE_FILTER_ID.

    Nota NDIS genererà un identificatore di filtro univoco (ID) per il filtro di ricezione prima di inoltrare la richiesta del metodo OID di OID_RECEIVE_FILTER_SET_FILTER al driver miniport.  

  • Se il driver overlying sta modificando un filtro di ricezione esistente, deve impostare il membro FilterId sull'ID filtro diverso da zero del filtro di ricezione. Il driver overlying ottiene l'ID filtro per il filtro di ricezione quando genera una richiesta di metodo OID di OID_RECEIVE_FILTER_ENUM_FILTERS. Per altre informazioni su come modificare un filtro di ricezione, vedere Modifica dei filtri di ricezione del raggruppamento dei pacchetti.

  • I membri FieldParametersArrayOffset, FieldParametersArrayNumElements e FieldParametersArrayElementSize della struttura NDIS_RECEIVE_FILTER_PARAMETERS devono essere impostati per definire la matrice di un parametro di campo. Ogni elemento della matrice è una struttura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS che specifica i parametri per un test di campo intestazione di un filtro di ricezione.

  • Il membro RequestedFilterIdBitCount deve essere impostato su zero.

  • MaxCoalescingDelay deve essere impostato sul tempo massimo, in unità di millisecondi, che il primo pacchetto corrispondente al filtro di ricezione viene salvato e unito nella scheda di rete. Non appena viene ricevuto il primo pacchetto che corrisponde al filtro, la scheda di rete associa il pacchetto e avvia un timer hardware il cui tempo di scadenza è impostato sul valore del membro MaxCoalescingDelay .

Il driver overlying deve ordinare i test dei campi di intestazione nella matrice di parametri di campo allo stesso ordine in cui le intestazioni mac e protocollo associate sarebbero presenti in un pacchetto.

Ad esempio, prima del driver di overlying specifica i parametri di filtro per un campo protocollo IP versione 4 (IPv4), deve prima specificare i parametri di filtro per un campo del protocollo di intestazione MAC (NdisMacHeaderFieldProtocol). In questo modo, il driver specifica un test di campo di intestazione che verifica che il campo sia impostato sul valore EtherType corretto (0x0800) per i pacchetti IPv4. Se il test ha esito negativo, l'adapter non deve eseguire il test del campo del protocollo IPV4.

Specifica dei test di campo intestazione

Ogni filtro di ricezione può specificare uno o più criteri di test (test di campo intestazione). La scheda di rete esegue questi test per determinare se un pacchetto ricevuto deve essere unito in un buffer di coalescing hardware nella scheda. Inoltre, il driver overlying può specificare test di filtro separati per vari controlli di accesso multimediale (MAC), IP versione 4 (IPv4) e campi di intestazione IP versione 6 (IPv6).

Per ottimizzare il filtro nella scheda di rete, i test dei campi dell'intestazione sono basati sui nomi dei campi di intestazione standardizzati anziché sulle specifiche di offset/lunghezza di byte all'interno dei dati del pacchetto. Usando nomi di intestazione/campo, l'hardware o il firmware della scheda di rete possono ottimizzare la modalità di esecuzione di più test dei campi di intestazione in un pacchetto ricevuto.

Ogni filtro di ricezione può contenere uno o più test di campo di intestazione specificati da una struttura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Ogni struttura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS è un elemento della matrice di parametri di campo a cui fa riferimento i membri FieldParametersArrayOffset, FieldParametersArrayNumElements e FieldParametersArrayElementSize della struttura NDIS_RECEIVE_FILTER_PARAMETERS.

Il driver miniport deve seguire queste linee guida quando gestisce una richiesta di metodo OID di OID_RECEIVE_FILTER_SET_FILTER:

  • Se il flag NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO è impostato nel membro Flag della struttura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS , la scheda di rete deve indicare solo pacchetti ricevuti con un indirizzo MAC corrispondente e pacchetti non contrassegnati con un identificatore VLAN pari a zero. Ovvero, la scheda di rete non deve indicare pacchetti con un indirizzo MAC corrispondente e un identificatore VLAN diverso da zero.

  • Se il flag di NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO non è impostato e non esiste alcun filtro identificatore VLAN configurato da una richiesta del 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 degli indirizzi 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 di NET_BUFFER_LIST del pacchetto.

  • Se il driver overlying imposta un filtro di indirizzi MAC e un filtro di identificatore VLAN nella struttura NDIS_RECEIVE_FILTER_PARAMETERS , non imposta il flag di 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. Vale a dire, il driver miniport non deve indicare pacchetti con un indirizzo MAC corrispondente con un identificatore VLAN zero o pacchetti non contrassegnati.