Compartir a través de


Ruta de recepción de VMQ

Un adaptador de red indica un paquete recibido en una cola solo si pasa todas las pruebas de campo de filtro para un filtro establecido en esa cola. Para más información sobre las pruebas de filtro, consulte Operaciones de filtro de VMQ.

Si el controlador de protocolo sobrecalado establece la marca de NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION en el miembro Flags de la estructura NDIS_RECEIVE_QUEUE_PARAMETERS, el controlador de miniporte no debe mezclar NET_BUFFER_LIST estructuras para otras colas de recepción con las estructuras de NET_BUFFER_LIST para esta cola en una sola llamada a la función NdisMIndicateReceiveNetBufferLists. Además, el controlador debe establecer la marca NDIS_RECEIVE_FLAGS_SINGLE_QUEUE en el parámetro ReceiveFlags de la función NdisMIndicateReceiveNetBufferLists .

Si no se estableció NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION, los controladores de miniport pueden vincular NET_BUFFER_LIST estructuras para fotogramas de diferentes colas de máquinas virtuales e indicarlos en una sola llamada a NdisMIndicateReceiveNetBufferLists. En este caso, no es necesario ordenar por número de cola la lista vinculada indicada de estructuras de NET_BUFFER_LIST . no es necesario agrupar las estructuras de NET_BUFFER_LIST para las distintas colas.

Cuando un controlador de protocolo establece NDIS_RETURN_FLAGS_SINGLE_QUEUE y devuelve búferes de recepción, todas las estructuras NET_BUFFER_LIST del parámetro NetBufferLists de la función NdisReturnNetBufferLists deben pertenecer a la misma cola de máquinas virtuales. Sin embargo, no es necesario que los controladores de protocolo devuelvan todas las estructuras de NET_BUFFER_LIST que se indicaron en una sola llamada a la función ProtocolReceiveNetBufferLists en una sola llamada a NdisReturnNetBufferLists. Además, la lista devuelta puede incluir estructuras NET_BUFFER_LIST de varias indicaciones de recepción si pertenecen a la misma cola de máquinas virtuales.

Los controladores de protocolo establecen el NDIS_RETURN_FLAGS_SINGLE_QUEUE bit en el parámetro ReturnFlags de NdisReturnNetBufferLists para indicar que todas las estructuras de NET_BUFFER_LIST devueltas pertenecen a la misma cola de máquinas virtuales.

Las indicaciones de recepción de VMQ deben incluir la siguiente información fuera de banda (OOB) en el miembro NetBufferListInfo de las estructuras de NET_BUFFER_LIST.

  • Especifique el identificador de cola en la información netBufferListFilteringInfo .

  • Establezca el identificador de filtro en la información de NetBufferListFilteringInfo en cero.

La información de NetBufferListFilteringInfo se especifica en una estructura NDIS_NET_BUFFER_LIST_FILTERING_INFO . Para acceder a la estructura de NDIS_NET_BUFFER_LIST_FILTERING_INFO en los datos de NET_BUFFER_LIST OOB, un controlador NDIS llama a la macro NET_BUFFER_LIST_INFO y especifica el tipo de información NetBufferListFilteringInfo.

Para acceder directamente al identificador de filtro y al identificador de cola, use las macros NET_BUFFER_LIST_RECEIVE_FILTER_ID y NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

Las indicaciones de recepción de VMQ deben definir información de memoria compartida en el miembro SharedMemoryInfo de la estructura NET_BUFFER.

Nota Cuando se elimina una VMQ (por ejemplo, durante la migración en vivo de la máquina virtual), es posible que el controlador de miniporte reciba un NBL que contenga un valor QueueId no válido. Si esto sucede, el miniport debe omitir el identificador de cola no válido y usar 0 (la cola predeterminada) en su lugar. QueueId se encuentra en la parte NetBufferListFilteringInfo de los datos OOB de NBL y se recupera mediante la macro NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

Para indicar que el puntero NET_BUFFER_SHARED_MEMORY en SharedMemoryInfo es válido, el controlador de miniport debe establecer la marca NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID en el parámetro ReceiveFlags de la función NdisMIndicateReceiveNetBufferLists. Para obtener más información sobre el diseño de los búferes de memoria compartida en los búferes de recepción de VMQ, consulte Memoria compartida en búferes de recepción.

La indicación de recepción debe incluir la siguiente información en la estructura NET_BUFFER_SHARED_MEMORY.

NextSharedMemorySegment
Puntero a la siguiente estructura NET_BUFFER_SHARED_MEMORY en una lista vinculada terminada en NULL de dichas estructuras.

SharedMemoryHandle
Identificador de memoria compartida NDIS que devolvió NdisAllocateSharedMemory.

SharedMemoryOffset
Desplazamiento, en bytes, al inicio de los datos desde el principio del búfer de memoria compartida.

SharedMemoryLength
Longitud, en bytes, del segmento de memoria compartida.

Si el controlador de protocolo sobreslizado establece la marca NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED en el miembro Flags de la estructura NDIS_RECEIVE_QUEUE_PARAMETERS, cada NET_BUFFER incluye:

  • Dos MDL y las estructuras SharedMemoryInfo correspondientes.

  • Un búfer post-lookahead con espacio de reposición.

Si es necesario, el controlador de protocolo copia el contenido del búfer de lookahead en el área de reposición. Sin embargo, el espacio de reposición debe existir incluso si el paquete está completamente en el búfer de lookahead.

Si el controlador de sobresalto no establece la marca NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED, cada estructura de NET_BUFFER incluye una sola MDL y una sola estructura SharedMemoryInfo.

El recuento de bytes y el desplazamiento de bytes en mdL y los miembros DataLength y DataOffset de la estructura de NET_BUFFER_DATA se establecen de la misma manera que se establecen para los controladores que no usan VMQ. Los miembros SharedMemoryLength y SharedMemoryOffset de la estructura SharedMemoryInfo se pueden establecer una vez durante la inicialización. No es necesario que el controlador de miniporte actualice los miembros SharedMemoryLength y SharedMemoryOffset para cada paquete que se recibe porque los controladores y NDIS excesivos pueden usar el miembro NET_BUFFER DataLength y el recuento de bytes MDL para determinar el inicio y el tamaño del paquete.

Nota A partir de NDIS 6.30 y Windows Server 2012, ya no se admite la división de datos de paquetes en búferes de lookahead independientes. El controlador de protocolo excesivo no establecerá la marca de NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED .