Condividi tramite


Percorso di ricezione VMQ

Una scheda di rete indica un pacchetto ricevuto in una coda solo se supera tutti i test di campo filtro per un filtro impostato su tale coda. Per altre informazioni sui test di filtro, vedere Operazioni di filtro VMQ.

Se il driver del protocollo overlying imposta il flag NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION nel membro Flags della struttura NDIS_RECEIVE_QUEUE_PARAMETERS, il driver miniport non deve combinare NET_BUFFER_LIST strutture per altre code di ricezione con le strutture di NET_BUFFER_LIST per questa coda in una singola chiamata alla funzione NdisMIndicateReceiveNetBufferLists. Inoltre, il driver deve impostare il flag NDIS_RECEIVE_FLAGS_SINGLE_QUEUE nel parametro ReceiveFlags della funzione NdisMIndicateReceiveNetBufferLists .

Se NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION non è stato impostato, i driver miniport possono collegare NET_BUFFER_LIST strutture per i fotogrammi da code di macchine virtuali diverse e indicare loro in una singola chiamata a NdisMIndicateReceiveNetBufferLists. In questo caso, l'elenco collegato indicato di NET_BUFFER_LIST strutture non deve essere ordinato in base al numero di coda. NET_BUFFER_LIST strutture per code diverse non devono essere raggruppate.

Quando un driver di protocollo imposta NDIS_RETURN_FLAGS_SINGLE_QUEUE e restituisce buffer di ricezione, tutte le strutture NET_BUFFER_LIST nel parametro NetBufferLists della funzione NdisReturnNetBufferLists devono appartenere alla stessa coda di macchine virtuali. Tuttavia, i driver di protocollo non devono restituire tutte le strutture NET_BUFFER_LIST indicate in una singola chiamata alla funzione ProtocolReceiveNetBufferLists in una singola chiamata a NdisReturnNetBufferLists. Inoltre, l'elenco restituito può includere NET_BUFFER_LIST strutture da più indicazioni di ricezione se appartengono alla stessa coda di macchine virtuali.

I driver di protocollo impostano il bit NDIS_RETURN_FLAGS_SINGLE_QUEUE nel parametro ReturnFlags di NdisReturnNetBufferLists per indicare che tutte le strutture NET_BUFFER_LIST restituite appartengono alla stessa coda di macchine virtuali.

Le indicazioni di ricezione VMQ devono includere le seguenti informazioni fuori banda (OOB) nel membro NetBufferListInfo delle strutture NET_BUFFER_LIST .

  • Specificare l'identificatore della coda nelle informazioni NetBufferListFilteringInfo .

  • Impostare l'identificatore del filtro nelle informazioni NetBufferListFilteringInfo su zero.

Le informazioni NetBufferListFilteringInfo sono specificate in una struttura NDIS_NET_BUFFER_LIST_FILTERING_INFO . Per accedere alla struttura NDIS_NET_BUFFER_LIST_FILTERING_INFO nei dati OOB NET_BUFFER_LIST, un driver NDIS chiama la macro NET_BUFFER_LIST_INFO e specifica il tipo di informazioni NetBufferListFilteringInfo.

Per accedere direttamente all'identificatore di filtro e all'identificatore della coda, usare le macro NET_BUFFER_LIST_RECEIVE_FILTER_ID e NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

Le indicazioni di ricezione VMQ devono definire informazioni sulla memoria condivisa nel membro SharedMemoryInfo della struttura NET_BUFFER .

Nota Quando un VMQ viene eliminato (ad esempio, durante la migrazione in tempo reale della macchina virtuale), è possibile che il driver miniport riceva un NBL che contiene un valore QueueId non valido. In questo caso, il miniport deve ignorare l'ID coda non valido e usare 0 (coda predefinita). QueueId si trova nella parte NetBufferListFilteringInfo dei dati OOB di NBL e viene recuperata usando la macro NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

Per indicare che il puntatore NET_BUFFER_SHARED_MEMORY in SharedMemoryInfo è valido, il driver miniport deve impostare il flag NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID nel parametro ReceiveFlags della funzione NdisMIndicateReceiveNetBufferLists. Per altre informazioni sul layout dei buffer di memoria condivisa nei buffer di ricezione VMQ, vedere Memoria condivisa in Buffer di ricezione.

L'indicazione di ricezione deve includere le informazioni seguenti nella struttura NET_BUFFER_SHARED_MEMORY.

NextSharedMemorySegment
Puntatore alla struttura NET_BUFFER_SHARED_MEMORY successiva in un elenco collegato con terminazione NULL di tali strutture.

SharedMemoryHandle
Handle di memoria condivisa NDIS restituito da NdisAllocateSharedMemory.

SharedMemoryOffset
Offset, in byte, all'inizio dei dati dall'inizio del buffer di memoria condivisa.

SharedMemoryLength
Lunghezza, in byte, del segmento di memoria condivisa.

Se il driver del protocollo overlying imposta il flag NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED nel membro Flags della struttura NDIS_RECEIVE_QUEUE_PARAMETERS, ogni NET_BUFFER include:

  • Due mdls e le strutture SharedMemoryInfo corrispondenti.

  • Buffer post-lookahead con spazio di riempimento.

Se necessario, il driver del protocollo copia il contenuto del buffer lookahead nell'area backfill. Tuttavia, lo spazio di backfill deve esistere anche se il pacchetto si trova interamente nel buffer lookahead.

Se il driver di overlying non imposta il flag NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED, ogni struttura NET_BUFFER include un singolo MDL e una singola struttura SharedMemoryInfo.

Il numero di byte e l'offset di byte nei membri MDL e DataLength e DataOffset nella struttura NET_BUFFER_DATA vengono impostati nello stesso modo in cui vengono impostati per i driver che non usano VMQ. I membri SharedMemoryLength e SharedMemoryOffset nella struttura SharedMemoryInfo possono essere impostati una sola volta durante l'inizializzazione. Il driver miniport non è necessario per aggiornare i membri SharedMemoryLength e SharedMemoryOffset per ogni pacchetto ricevuto perché i driver di overlying e NDIS possono usare il membro DataLength NET_BUFFER e il conteggio dei byte MDL per determinare l'inizio e le dimensioni del pacchetto.

Nota A partire da NDIS 6.30 e Windows Server 2012, la suddivisione dei dati dei pacchetti in buffer lookahead separati non è più supportata. Il driver del protocollo overlying non imposta il flag NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED .