Gestione dei filtri di ricezione del raggruppamento dei pacchetti
Più filtri di ricezione vengono scaricati in un driver miniport tramite richieste di metodo OID di OID_RECEIVE_FILTER_SET_FILTER. Ogni filtro può specificare uno o più test (test di campo intestazione) che la scheda di rete usa per determinare se un pacchetto ricevuto deve essere unito in un buffer di unione hardware nella scheda.
Prima che il driver miniport configura la scheda di rete con i filtri di ricezione, il driver deve ottimizzare i filtri di ricezione in base alle funzionalità hardware della scheda. Ad esempio, tutti i filtri di ricezione richiedono un test di campo intestazione per l'intestazione MAC. Pertanto, il driver potrebbe ottimizzare le regole di filtro in base ai risultati di questo test. In questo modo, l'adattatore consente di determinare quali test del campo di intestazione Open Systems Interconnect (OSI) livello 3 (L3) e livello 4 (L4) per eseguire successivamente.
Non appena la scheda di rete è stata configurata con i filtri di ricezione, deve eseguire le operazioni seguenti:
Tutti i parametri di test del campo dell'intestazione per un determinato filtro devono corrispondere al pacchetto ricevuto per unire il pacchetto nel buffer di unione.
La scheda di rete combina i risultati di tutti i test di campo dell'intestazione di un filtro di ricezione con un'operazione AND logica. Ovvero, se qualsiasi test di campo di intestazione incluso nella matrice di strutture NDIS_RECEIVE_FILTER_FIELD_PARAMETERS per un filtro di ricezione non riesce, il pacchetto ricevuto non soddisfa il criterio di filtro specificato e non deve essere unito.
La scheda di rete controlla solo i dati dei pacchetti in base ai parametri di test del campo dell'intestazione specificati. L'adapter deve ignorare tutti i campi di intestazione nel pacchetto per i quali i test di campo dell'intestazione non vengono specificati.
Se un pacchetto ricevuto corrisponde a tutti i test di campo dell'intestazione per uno dei filtri di ricezione, la scheda di rete deve unire il pacchetto all'interno del buffer di coalescing hardware. Non appena il primo pacchetto viene unito, la scheda di rete deve avviare un timer hardware e deve impostare l'ora di scadenza sul valore del membro MaxCoalescingDelay della struttura NDIS_RECEIVE_FILTER_PARAMETERS per il filtro di ricezione corrispondente.
Man mano che vengono ricevuti più pacchetti che corrispondono a un filtro di ricezione del raggruppamento di pacchetti, la scheda di rete li inserisce nel buffer di coalescing.
Se il timer hardware è già in esecuzione, l'adattatore non deve arrestare o riavviare il timer per il filtro di ricezione corrispondente. Tuttavia, l'adattatore può configurare il timer hardware con il valore di scadenza più piccolo dai filtri di ricezione corrispondenti. Ad esempio, quando il driver riceve un pacchetto che corrisponde al filtro X, l'adattatore avvia il timer con il valore di scadenza specificato per tale filtro di ricezione. Se l'adattatore riceve quindi un pacchetto che corrisponde alla ricezione del filtro Y, l'adapter può riconfigurare il timer hardware con il valore di scadenza specificato per tale filtro di ricezione.
Nota La scheda di rete non deve riconfigurare il timer hardware se il tempo rimanente nel timer è minore dell'ora di scadenza del filtro di ricezione.
Non appena ricevuti vengono raggruppati pacchetti, la scheda di rete genera un interruzione se si verificano uno degli eventi seguenti:
Se lo spazio disponibile all'interno del buffer di coalescing hardware raggiunge un contrassegno di bassa acqua specifico dell'hardware, la scheda di rete deve generare un interruzione di ricezione in modo che il driver miniport possa elaborare i pacchetti di ricezione uniti.
Se il timer hardware usato per il buffer di coalescing hardware scade, la scheda di rete deve generare un interruzione di ricezione in modo che il driver miniport possa elaborare i pacchetti di ricezione uniti.
Se un filtro di ricezione viene cancellato e i pacchetti sono stati uniti che corrispondono a tale filtro, la scheda di rete deve generare un interruzione di ricezione in modo che il driver miniport possa elaborare i pacchetti di ricezione uniti.
Se un pacchetto ricevuto non corrisponde a uno dei filtri di ricezione, la scheda di rete deve generare un interruzione di ricezione in modo che il driver miniport possa elaborare il pacchetto ricevuto. Se sono stati uniti pacchetti, il driver miniport deve anche elaborare tali pacchetti.
Se la scheda di rete genera un interruzione per qualsiasi altro stato di interruzione diverso da un interruzione di ricezione, la scheda di rete deve anche segnalare uno stato di interruzione di ricezione in modo che il driver miniport possa elaborare i pacchetti ricevuti in unione.
Non appena viene generato l'interruzione, la scheda di rete deve arrestare il timer hardware se non è scaduta e deve cancellare il buffer di coalescing hardware.
Il driver miniport deve mantenere un contatore di pacchetti in unione, che contiene un valore per il numero di pacchetti ricevuti corrispondenti a un filtro di unione dei pacchetti. NDIS esegue query su questo contatore tramite una richiesta di query OID di OID_PACKET_COALESCING_FILTER_MATCH_COUNT.
La scheda di rete esegue solo il raggruppamento dei pacchetti mentre l'hardware è operativo in uno stato di alimentazione completa. Sebbene l'hardware si trova in uno stato a bassa potenza, l'adattatore deve filtrare solo i pacchetti ricevuti in base ai modelli di riattivazione caricati nell'adattatore tramite richieste di set OID di OID_PNP_ENABLE_WAKE_UP.
Quando la scheda di rete passa a uno stato di alimentazione completa, il driver miniport deve seguire questa procedura:
Il driver miniport deve configurare la scheda di rete per eliminare tutti i pacchetti coalescenti all'interno del buffer di coalescing hardware. La scheda di rete potrebbe aver unito questi pacchetti quando è stata eseguita la transizione a uno stato a bassa potenza.
Il driver miniport deve configurare la scheda di rete con il set di filtri di unione dei pacchetti scaricati nel driver prima della transizione a bassa potenza.
Il driver miniport deve cancellare il contatore del pacchetto di carbone.