Allocazione di una coda di macchine virtuali
Per allocare una coda con un set iniziale di parametri di configurazione, un driver overlying invia una richiesta OID del metodo OID_RECEIVE_FILTER_ALLOCATE_QUEUE . Il membro InformationBuffer della struttura NDIS_OID_REQUEST contiene inizialmente un puntatore a una struttura NDIS_RECEIVE_QUEUE_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_QUEUE_PARAMETERS con un nuovo identificatore di coda e una voce di tabella MSI-X.
La struttura NDIS_RECEIVE_QUEUE_PARAMETERS viene usata nell'OID OID_RECEIVE_FILTER_ALLOCATE_QUEUE e nell'OID OID_RECEIVE_FILTER_QUEUE_PARAMETERS . Per altre informazioni sui parametri della coda di macchine virtuali, vedere Recupero e aggiornamento dei parametri della coda di macchine virtuali.
Il driver eccessivamente inizializza la struttura NDIS_RECEIVE_QUEUE_PARAMETERS con i parametri di configurazione della coda seguenti:
Tipo di coda (NdisReceiveQueueTypeVMQueuedall'enumerazione NDIS_RECEIVE_QUEUE_TYPE ).
Affinità del processore per la coda.
Nome della coda e nome della macchina virtuale.
Parametri lookahead-split.
Nota A partire da NDIS 6.30, la suddivisione dei dati dei pacchetti in buffer lookahead separati non è più supportata.
Nota Il driver overlying può impostare i flag NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION e NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED nel membro Flags della struttura NDIS_RECEIVE_QUEUE_PARAMETERS . Gli altri flag non vengono usati per l'allocazione della coda.
Quando NDIS riceve una richiesta OID per allocare una coda di ricezione, verifica i parametri della coda. Dopo che NDIS alloca le risorse necessarie e l'identificatore della coda, invia la richiesta OID al driver miniport sottostante. L'identificatore della coda è univoco per la scheda di rete associata.
Se il driver miniport può allocare correttamente le risorse hardware e software necessarie per la coda di ricezione, completa la richiesta OID con lo stato di esito positivo.
Prima che NDIS invii la richiesta OID al driver miniport, NDIS assegna un identificatore di coda nel membro QueueId della struttura NDIS_RECEIVE_QUEUE_PARAMETERS e passa la richiesta di metodo al driver miniport. Il driver miniport fornisce la voce della tabella MSI-X nel membro MSIXTableEntry .
Il driver miniport deve mantenere gli identificatori della coda per le code di ricezione allocate. NDIS usa l'identificatore della coda di ricezione per le chiamate successive al driver miniport per impostare un filtro di ricezione nella coda di ricezione, modificare i parametri della coda di ricezione o liberare la coda di ricezione.
Nota La coda predefinita (identificatore coda zero) viene sempre allocata e non può essere liberata.
Il driver overlying deve usare l'identificatore della coda fornito da NDIS nelle richieste OID successive, ad esempio, per modificare i parametri della coda o liberare la coda. L'identificatore della coda è incluso anche nei dati OOB in tutte le strutture NET_BUFFER_LIST associate alla coda. I driver usano la macro NET_BUFFER_LIST_RECEIVE_QUEUE_ID per recuperare l'identificatore della coda in una struttura NET_BUFFER_LIST.
Nota Un driver di protocollo può impostare filtri VMQ in qualsiasi momento dopo che alloca correttamente una coda e prima che la coda venga eliminata.
Il driver del protocollo invia una richiesta OID del metodo OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE per completare l'allocazione della coda. Il driver miniport può allocare memoria condivisa e altre risorse al termine dell'allocazione. Per altre informazioni sull'allocazione di risorse di memoria condivisa, vedere Allocazione di risorse di memoria condivisa.
Dopo che un driver miniport riceve una richiesta OID OID_RECEIVE_FILTER_QUEUE_ALLOCATION e la gestisce correttamente, la coda è nello stato Allocato . Per altre informazioni sugli stati della coda, vedere Stati e operazioni della coda.
Dopo che un driver eccessivamente alloca una o più code di ricezione (e, facoltativamente, imposta i filtri iniziali), deve inviare OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE impostare richieste OID per notificare al driver miniport che l'allocazione è stata completata per il batch corrente di code di ricezione.
Il driver miniport non deve conservare alcun pacchetto in una coda di ricezione se non sono presenti filtri impostati su tale coda. Se una coda non ha mai impostato alcun filtro o tutti i filtri sono stati cancellati, la coda deve essere vuota e tutti i pacchetti devono essere eliminati. Ovvero, non vengono indicati lo stack di driver o conservati nella coda.
I driver overlying usano l'OID OID_RECEIVE_FILTER_FREE_QUEUE per liberare le code allocate. Per altre informazioni sulla liberazione delle code, vedere Freeing a VM Queue.For more information about freeing queues, see Freeing a VM Queue.