Partager via


Chemin d'accès de réception de VMQ

Une carte réseau indique un paquet reçu sur une file d’attente uniquement s’il réussit tous les tests de champ de filtre pour un filtre défini sur cette file d’attente. Pour plus d’informations sur les tests de filtre, consultez Opérations de filtre VMQ.

Si le pilote de protocole overlying définit l’indicateur de NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION dans le membre Indicateurs de la structure NDIS_RECEIVE_QUEUE_PARAMETERS, le pilote miniport ne doit pas mélanger NET_BUFFER_LIST structures pour d’autres files d’attente de réception avec les structures NET_BUFFER_LIST de cette file d’attente dans un seul appel à la fonction NdisMIndicateReceiveNetBufferLists. En outre, le pilote doit définir l’indicateur NDIS_RECEIVE_FLAGS_SINGLE_QUEUE dans le paramètre ReceiveFlags de la fonction NdisMIndicateReceiveNetBufferLists .

Si NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION n’a pas été défini, les pilotes miniports peuvent lier des structures NET_BUFFER_LIST pour les images provenant de différentes files d’attente de machines virtuelles et les indiquer dans un seul appel à NdisMIndicateReceiveNetBufferLists. Dans ce cas, la liste liée indiquée de structures NET_BUFFER_LIST n’est pas nécessaire pour être triée par numéro de file d’attente. NET_BUFFER_LIST structures pour différentes files d’attente ne doivent pas être regroupées.

Lorsqu’un pilote de protocole définit NDIS_RETURN_FLAGS_SINGLE_QUEUE et qu’il retourne des mémoires tampons de réception, toutes les structures NET_BUFFER_LIST dans le paramètre NetBufferLists de la fonction NdisReturnNetBufferLists doivent appartenir à la même file d’attente de machines virtuelles. Toutefois, les pilotes de protocole ne sont pas requis pour renvoyer toutes les structures NET_BUFFER_LIST indiquées dans un seul appel à la fonction ProtocolReceiveNetBufferLists dans un seul appel à NdisReturnNetBufferLists. En outre, la liste retournée peut inclure des structures NET_BUFFER_LIST de plusieurs indications de réception si elles appartiennent à la même file d’attente de machine virtuelle.

Les pilotes de protocole définissent le bit NDIS_RETURN_FLAGS_SINGLE_QUEUE sur le paramètre ReturnFlags de NdisReturnNetBufferLists pour indiquer que toutes les structures de NET_BUFFER_LIST retournées appartiennent à la même file d’attente de machines virtuelles.

Les indications de réception VMQ doivent inclure les informations OOB suivantes dans le membre NetBufferListInfo des structures NET_BUFFER_LIST .

  • Spécifiez l’identificateur de file d’attente dans les informations NetBufferListFilteringInfo .

  • Définissez l’identificateur de filtre dans les informations NetBufferListFilteringInfo sur zéro.

Les informations NetBufferListFilteringInfo sont spécifiées dans une structure NDIS_NET_BUFFER_LIST_FILTERING_INFO . Pour accéder à la structure NDIS_NET_BUFFER_LIST_FILTERING_INFO dans les données OOB NET_BUFFER_LIST, un pilote NDIS appelle la macro NET_BUFFER_LIST_INFO et spécifie le type d’informations NetBufferListFilteringInfo.

Pour accéder directement à l’identificateur de filtre et à l’identificateur de file d’attente, utilisez les macros NET_BUFFER_LIST_RECEIVE_FILTER_ID et NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

Les indications de réception VMQ doivent définir des informations de mémoire partagée sur le membre SharedMemoryInfo de la structure NET_BUFFER.

Notez qu’une machine virtuelleQ est supprimée (par exemple, pendant la migration dynamique de la machine virtuelle), il est possible que le pilote miniport reçoive un NBL qui contient une valeur QueueId non valide. Si cela se produit, le miniport doit ignorer l’ID de file d’attente non valide et utiliser 0 (file d’attente par défaut) à la place. QueueId se trouve dans la partie NetBufferListFilteringInfo des données OOB du NBL et est récupéré à l’aide de la macro NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

Pour indiquer que le pointeur NET_BUFFER_SHARED_MEMORY sur SharedMemoryInfo est valide, le pilote miniport doit définir l’indicateur NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID dans le paramètre ReceiveFlags de la fonction NdisMIndicateReceiveNetBufferLists. Pour plus d’informations sur la disposition des mémoires tampons de mémoire partagée dans les mémoires tampons de réception VMQ, consultez Mémoire partagée dans les mémoires tampons de réception.

L’indication de réception doit inclure les informations suivantes dans la structure NET_BUFFER_SHARED_MEMORY.

NextSharedMemorySegment
Pointeur vers la structure NET_BUFFER_SHARED_MEMORY suivante dans une liste liée terminée par NULL de ces structures.

SharedMemoryHandle
Handle de mémoire partagée NDIS retourné par NdisAllocateSharedMemory.

SharedMemoryOffset
Décalage, en octets, au début des données à partir du début de la mémoire tampon de mémoire partagée.

SharedMemoryLength
Longueur, en octets, du segment de mémoire partagée.

Si le pilote de protocole overlying définit l’indicateur de NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED dans le membre Indicateurs de la structure NDIS_RECEIVE_QUEUE_PARAMETERS, chaque NET_BUFFER inclut :

  • Deux MDL et des structures SharedMemoryInfo correspondantes.

  • Mémoire tampon post-lookahead avec espace de remplissage.

Si nécessaire, le pilote de protocole copie le contenu de la mémoire tampon lookahead dans la zone de remplissage. Toutefois, l’espace de remplissage doit exister même si le paquet se trouve entièrement dans la mémoire tampon lookahead.

Si le pilote overlying ne définit pas l’indicateur de NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED, chaque structure NET_BUFFER inclut un MDL unique et une seule structure SharedMemoryInfo.

Le nombre d’octets et le décalage d’octets dans le MDL et les membres DataLength et DataOffset de la structure NET_BUFFER_DATA sont définis de la même façon que pour les pilotes qui n’utilisent pas VMQ. Les membres SharedMemoryLength et SharedMemoryOffset dans la structure SharedMemoryInfo peuvent être définis une seule fois lors de l’initialisation. Le pilote miniport n’est pas nécessaire pour mettre à jour les membres SharedMemoryLength et SharedMemoryOffset pour chaque paquet reçu, car les pilotes de surlysage et NDIS peuvent utiliser le membre NET_BUFFER DataLength et le nombre d’octets MDL pour déterminer le début et la taille du paquet.

Remarque À compter de NDIS 6.30 et Windows Server 2012, le fractionnement des données de paquets en mémoires tampons de recherche distinctes n’est plus pris en charge. Le pilote de protocole overlying ne définit pas l’indicateur de NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED .