Delen via


VMQ-ontvangstpad

Een netwerkadapter geeft alleen een ontvangen pakket in een wachtrij aan als alle filterveldtests worden doorgegeven voor een filter dat in die wachtrij is ingesteld. Zie VMQ-filterbewerkingenvoor meer informatie over filtertests.

Als het stuurprogramma voor het overliggende protocol de vlag NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION instelt in het lid Flags van de NDIS_RECEIVE_QUEUE_PARAMETERS-structuur, mag het minipoortstuurprogramma geen NET_BUFFER_LIST structuren mengen voor andere ontvangstwachtrijen met de NET_BUFFER_LIST structuren voor deze wachtrij in één oproep naar de NdisMIndicateReceiveNetBufferLists functie. Ook moet de driver de vlag NDIS_RECEIVE_FLAGS_SINGLE_QUEUE instellen in de parameter ReceiveFlags van de functie NdisMIndicateReceiveNetBufferLists.

Als NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION niet is ingesteld, kunnen minipoortstuurprogramma's NET_BUFFER_LIST structuren voor frames uit verschillende VM-wachtrijen koppelen en deze aangeven in één aanroep naar NdisMIndicateReceiveNetBufferLists. In dit geval hoeft de aangegeven gekoppelde lijst met NET_BUFFER_LIST structuren niet te worden gesorteerd op wachtrijnummer. NET_BUFFER_LIST structuren voor verschillende wachtrijen hoeven niet samen te worden gegroepeerd.

Wanneer een protocolstuurprogramma NDIS_RETURN_FLAGS_SINGLE_QUEUE instelt en deze buffers retourneert, moeten alle NET_BUFFER_LIST structuren in de parameter NetBufferLists van de NdisReturnNetBufferLists functie behoren tot dezelfde VM-wachtrij. Protocolstuurprogramma's hoeven echter niet alle NET_BUFFER_LIST structuren te retourneren die zijn aangegeven in één aanroep naar de ProtocolReceiveNetBufferLists functie in één aanroep naar NdisReturnNetBufferLists. De geretourneerde lijst kan ook NET_BUFFER_LIST structuren van meerdere ontvangstindicaties bevatten als ze deel uitmaken van dezelfde VM-wachtrij.

Protocolstuurprogramma's stellen de NDIS_RETURN_FLAGS_SINGLE_QUEUE bit in op de parameter ReturnFlags van NdisReturnNetBufferLists om aan te geven dat alle geretourneerde NET_BUFFER_LIST structuren deel uitmaken van dezelfde VM-wachtrij.

VMQ-ontvangstindicaties moeten de volgende out-of-band-informatie (OOB) bevatten in de NetBufferListInfo lid van de NET_BUFFER_LIST structuren.

  • Geef de wachtrij-id op in de NetBufferListFilteringInfo informatie.

  • Stel de filteridentificatie in de NetBufferListFilteringInfo informatie in op nul.

De NetBufferListFilteringInfo informatie wordt opgegeven in een NDIS_NET_BUFFER_LIST_FILTERING_INFO structuur. Voor toegang tot de NDIS_NET_BUFFER_LIST_FILTERING_INFO structuur in de NET_BUFFER_LIST OOB-gegevens roept een NDIS-stuurprogramma de NET_BUFFER_LIST_INFO macro aan en geeft het NetBufferListFilteringInfo informatietype.

Als u rechtstreeks toegang wilt krijgen tot de filter-id en wachtrij-id, gebruikt u de NET_BUFFER_LIST_RECEIVE_FILTER_ID en NET_BUFFER_LIST_RECEIVE_QUEUE_ID macro's.

VMQ-ontvangstindicaties moeten informatie over gedeeld geheugen definiëren op de SharedMemoryInfo lid van de NET_BUFFER-structuur.

Opmerking Wanneer een VMQ wordt verwijderd (bijvoorbeeld tijdens livemigratie van de VM), is het mogelijk dat het minipoortstuurprogramma een NBL ontvangt die een ongeldige QueueId waarde bevat. Als dit gebeurt, moet de minipoort de ongeldige wachtrij-id negeren en in plaats daarvan 0 (de standaardwachtrij) gebruiken. De QueueId wordt gevonden in het NetBufferListFilteringInfo gedeelte van de OOB-gegevens van de NBL, en wordt opgehaald met behulp van de NET_BUFFER_LIST_RECEIVE_QUEUE_ID macro.

Om aan te geven dat de NET_BUFFER_SHARED_MEMORY aanwijzer op SharedMemoryInfo geldig is, moet het minipoortstuurprogramma de NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID vlag instellen in de parameter ReceiveFlags parameter van de NdisMIndicateReceiveNetBufferLists functie. Zie Gedeeld geheugen in Ontvangstbuffersvoor meer informatie over de indeling van gedeelde geheugenbuffers in VMQ-buffers.

De ontvangstindicatie moet de volgende informatie bevatten in de NET_BUFFER_SHARED_MEMORY structuur.

NextSharedMemorySegment
Een aanwijzer naar de volgende NET_BUFFER_SHARED_MEMORY structuur in een NULL--beëindigde gekoppelde lijst met dergelijke structuren.

SharedMemoryHandle
Een NDIS-gedeeld geheugenhandvat dat NdisAllocateSharedMemory heeft geretourneerd.

SharedMemoryOffset
Een offset, in bytes, naar het begin van de gegevens vanaf het begin van de gedeelde geheugenbuffer.

SharedMemoryLength
De lengte, in bytes, van het gedeelde geheugensegment.

Als het stuurprogramma voor het overliggende protocol de vlag NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED instelt in de Vlaggen lid van de NDIS_RECEIVE_QUEUE_PARAMETERS-structuur, bevat elk NET_BUFFER:

  • Twee MDLs en bijbehorende SharedMemoryInfo structuren.

  • Een post-lookaheadbuffer met backfillruimte.

Indien nodig kopieert het protocolstuurprogramma de inhoud van de lookaheadbuffer naar het achtervulgebied. Er moet echter ruimte voor backfill bestaan, zelfs als het pakket zich volledig in de lookaheadbuffer bevindt.

Als de overliggende driver de NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED vlag niet instelt, bevat elke NET_BUFFER structuur een enkele MDL en een enkele SharedMemoryInfo structuur.

Het byteaantal en de byte-offset in de MDL en de DataLength- en DataOffset--leden in de NET_BUFFER_DATA-structuur worden op dezelfde manier ingesteld als voor stuurprogramma's die geen VMQ gebruiken. De SharedMemoryLength en SharedMemoryOffset leden in de SharedMemoryInfo structuur kunnen eenmaal worden ingesteld tijdens de initialisatie. Het minipoortstuurprogramma hoeft de SharedMemoryLength- en SharedMemoryOffset leden niet bij te werken voor elk pakket dat wordt ontvangen, omdat de overliggende stuurprogramma's en NDIS het NET_BUFFERDataLength--lid en het aantal MDL-bytes kunnen gebruiken om het begin en de grootte van het pakket te bepalen.

Opmerking Vanaf NDIS 6.30 en Windows Server 2012 wordt het splitsen van pakketgegevens in afzonderlijke lookaheadbuffers niet meer ondersteund. Het stuurprogramma voor het overliggende protocol stelt niet de vlag NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED in.