Freigeben über


VMQ-Empfangspfad

Ein Netzwerkadapter gibt ein empfangenes Paket in einer Warteschlange nur an, wenn er alle Filterfeldtests für einen Filter übergibt, der in dieser Warteschlange festgelegt ist. Weitere Informationen zu Filtertests finden Sie unter VMQ-Filtervorgänge.

Wenn der Überleitungsprotokolltreiber das NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION Flag im Flags-Element der NDIS_RECEIVE_QUEUE_PARAMETERS-Struktur festgelegt hat, darf der Miniporttreiber keine NET_BUFFER_LIST Strukturen für andere Empfangswarteschlangen mit den NET_BUFFER_LIST Strukturen für diese Warteschlange in einem einzigen Aufruf der NdisMIndicateReceiveNetBufferLists-Funktion kombinieren. Außerdem muss der Treiber das NDIS_RECEIVE_FLAGS_SINGLE_QUEUE Flag im ReceiveFlags-Parameter der Funktion NdisMIndicateReceiveNetBufferLists festlegen.

Wenn NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION nicht festgelegt wurde, können Miniporttreiber NET_BUFFER_LIST Strukturen für Frames aus verschiedenen VM-Warteschlangen verknüpfen und in einem einzigen Aufruf von NdisMIndicateReceiveNetBufferLists angeben. In diesem Fall muss die angegebene verknüpfte Liste der NET_BUFFER_LIST Strukturen nicht nach Warteschlangennummer sortiert werden. NET_BUFFER_LIST Strukturen für unterschiedliche Warteschlangen müssen nicht gruppiert werden.

Wenn ein Protokolltreiber NDIS_RETURN_FLAGS_SINGLE_QUEUE festlegt und Puffer zurückgibt, müssen alle NET_BUFFER_LIST Strukturen im NetBufferLists-Parameter der NdisReturnNetBufferLists-Funktion zur gleichen VM-Warteschlange gehören. Protokolltreiber müssen jedoch nicht alle NET_BUFFER_LIST Strukturen zurückgeben, die in einem einzigen Aufruf der ProtocolReceiveNetBufferLists-Funktion in einem einzigen Aufruf von NdisReturnNetBufferLists angegeben wurden. Außerdem kann die zurückgegebene Liste NET_BUFFER_LIST Strukturen aus mehreren Empfangsanzeigen enthalten, wenn sie zur gleichen VM-Warteschlange gehören.

Protokolltreiber legen das NDIS_RETURN_FLAGS_SINGLE_QUEUE Bit für den ReturnFlags-Parameter von NdisReturnNetBufferLists fest, um anzugeben, dass alle zurückgegebenen NET_BUFFER_LIST Strukturen zur gleichen VM-Warteschlange gehören.

VMQ-Empfangsanzeigen müssen die folgenden Out-of-Band-Informationen (OOB) im NetBufferListInfo-Mitglied der NET_BUFFER_LIST-Strukturen enthalten.

  • Geben Sie den Warteschlangenbezeichner in den NetBufferListFilteringInfo-Informationen an.

  • Legen Sie den Filterbezeichner in den NetBufferListFilteringInfo-Informationen auf Null fest.

Die NetBufferListFilteringInfo-Informationen werden in einer NDIS_NET_BUFFER_LIST_FILTERING_INFO Struktur angegeben. Um auf die NDIS_NET_BUFFER_LIST_FILTERING_INFO Struktur in den NET_BUFFER_LIST OOB-Daten zuzugreifen, ruft ein NDIS-Treiber das NET_BUFFER_LIST_INFO Makro auf und gibt den NetBufferListFilteringInfo-Informationstyp an.

Um direkt auf den Filterbezeichner und den Warteschlangenbezeichner zuzugreifen, verwenden Sie die NET_BUFFER_LIST_RECEIVE_FILTER_ID und NET_BUFFER_LIST_RECEIVE_QUEUE_ID Makros.

VMQ-Empfangsanzeigen müssen freigegebene Speicherinformationen im SharedMemoryInfo-Element der NET_BUFFER-Struktur definieren.

Hinweis : Wenn ein VMQ gelöscht wird (z. B. während der VM-Livemigration), kann der Miniporttreiber eine NBL empfangen, die einen ungültigen QueueId-Wert enthält. In diesem Fall sollte der Miniport die ungültige Warteschlangen-ID ignorieren und stattdessen 0 (die Standardwarteschlange) verwenden. Die QueueId befindet sich im NetBufferListFilteringInfo-Teil der OOB-Daten der NBL und wird mithilfe des NET_BUFFER_LIST_RECEIVE_QUEUE_ID-Makros abgerufen.

Um anzugeben, dass der NET_BUFFER_SHARED_MEMORY Zeiger bei SharedMemoryInfo gültig ist, muss der Miniporttreiber das NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID Flag im Parameter ReceiveFlags der Funktion NdisMIndicateiveNetBufferLists festlegen. Weitere Informationen zum Layout von freigegebenen Speicherpuffern in VMQ empfangen Puffer finden Sie unter "Freigegebener Speicher" in Empfangspuffern.

Die Empfangsanzeige muss die folgenden Informationen in der NET_BUFFER_SHARED_MEMORY Struktur enthalten.

NextSharedMemorySegment
Ein Zeiger auf die nächste NET_BUFFER_SHARED_MEMORY Struktur in einer mit NULL beendeten verknüpften Liste solcher Strukturen.

SharedMemoryHandle
Ein freigegebenes NDIS-Speicherhandle, das von NdisAllocateSharedMemory zurückgegeben wurde.

SharedMemoryOffset
Ein Offset in Byte bis zum Anfang der Daten vom Anfang des freigegebenen Speicherpuffers.

SharedMemoryLength
Die Länge des freigegebenen Speichersegments in Bytes.

Wenn der Überlyingprotokolltreiber das NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED Flag im Flags-Element der NDIS_RECEIVE_QUEUE_PARAMETERS Struktur festgelegt hat, enthält jede NET_BUFFER Folgendes:

  • Zwei MDLs und entsprechende SharedMemoryInfo-Strukturen .

  • Ein Nachschlagekopfpuffer mit Rückfüllbereich.

Bei Bedarf kopiert der Protokolltreiber den Inhalt des Lookaheadpuffers in den Rückfüllbereich. Der Rückfüllbereich muss jedoch auch vorhanden sein, wenn sich das Paket vollständig im Lookaheadpuffer befindet.

Wenn der Überlauftreiber das NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED Flag nicht festgelegt hat, enthält jede NET_BUFFER Struktur eine einzelne MDL und eine einzelne SharedMemoryInfo-Struktur.

Die Byteanzahl und der Byteoffset-Offset in der MDL und die DataLength- und DataOffset-Elemente in der NET_BUFFER_DATA-Struktur werden auf die gleiche Weise festgelegt wie für Treiber, die VMQ nicht verwenden. Die Elemente SharedMemoryLength und SharedMemoryOffset in der SharedMemoryInfo-Struktur können während der Initialisierung einmal festgelegt werden. Der Miniporttreiber ist nicht erforderlich, um die Elemente SharedMemoryLength und SharedMemoryOffset für jedes empfangene Paket zu aktualisieren, da die übermäßigen Treiber und NDIS das NET_BUFFER DataLength-Mitglied und die MDL-Byteanzahl verwenden können, um den Paketstart und die Größe des Pakets zu bestimmen.

Hinweis Ab NDIS 6.30 und Windows Server 2012 wird das Aufteilen von Paketdaten in separate Lookaheadpuffer nicht mehr unterstützt. Der Überlaufprotokolltreiber legt das NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED-Flag nicht fest.