Partager via


Allocation d’une file d’attente de machines virtuelles

Pour allouer une file d’attente avec un ensemble initial de paramètres de configuration, un pilote qui se superpose émet une requête OID de méthode OID_RECEIVE_FILTER_ALLOCATE_QUEUE . Le membre InformationBuffer de la structure NDIS_OID_REQUEST contient initialement un pointeur vers une structure NDIS_RECEIVE_QUEUE_PARAMETERS . Après un retour réussi à partir de la demande de méthode OID, le membre InformationBuffer de la structure NDIS_OID_REQUEST contient un pointeur vers une structure de NDIS_RECEIVE_QUEUE_PARAMETERS qui a un nouvel identificateur de file d’attente et une entrée de table MSI-X.

La structure NDIS_RECEIVE_QUEUE_PARAMETERS est utilisée dans l’OID OID_RECEIVE_FILTER_ALLOCATE_QUEUE et l’OID OID_RECEIVE_FILTER_QUEUE_PARAMETERS . Pour plus d’informations sur les paramètres de file d’attente de machine virtuelle, consultez Obtention et mise à jour des paramètres de file d’attente de machine virtuelle.

Le pilote overlying initialise la structure NDIS_RECEIVE_QUEUE_PARAMETERS avec les paramètres de configuration de file d’attente suivants :

  • Type de file d’attente (NdisReceiveQueueTypeVMQueue à partir de l’énumération NDIS_RECEIVE_QUEUE_TYPE .)

  • Affinité processeur pour la file d’attente.

  • Nom de la file d’attente et nom de la machine virtuelle.

  • Paramètres de fractionnement du lookahead.

    Note À compter de NDIS 6.30, le fractionnement des données de paquets en mémoire tampons de recherche distinctes n’est plus pris en charge.

Note Le pilote qui se superpose peut définir les indicateurs NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION et NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED dans le membre Indicateurs de la structure NDIS_RECEIVE_QUEUE_PARAMETERS . Les autres indicateurs ne sont pas utilisés pour l’allocation de file d’attente.

Quand NDIS reçoit une demande OID pour allouer une file d’attente de réception, il vérifie les paramètres de la file d’attente. Une fois que NDIS alloue les ressources nécessaires et l’identificateur de file d’attente, il envoie la demande OID au pilote miniport sous-jacent. L’identificateur de file d’attente est unique à la carte réseau associée.

Si le pilote miniport peut correctement allouer les ressources logicielles et matérielles nécessaires pour la file d’attente de réception, il termine la requête OID avec une status réussie.

Avant que NDIS envoie la demande OID au pilote miniport, NDIS affecte un identificateur de file d’attente dans le membre QueueId de la structure NDIS_RECEIVE_QUEUE_PARAMETERS et transmet la demande de méthode au pilote miniport. Le pilote miniport fournit l’entrée de table MSI-X dans le membre MSIXTableEntry .

Le pilote miniport doit conserver les identificateurs de file d’attente pour les files d’attente de réception allouées. NDIS utilise l’identificateur de file d’attente d’une file d’attente de réception pour les appels suivants au pilote miniport pour définir un filtre de réception sur la file d’attente de réception, modifier les paramètres de la file d’attente de réception ou libérer la file d’attente de réception.

Note La file d’attente par défaut (identificateur de file d’attente zéro) est toujours allouée et ne peut pas être libérée.

Le pilote qui se superpose doit utiliser l’identificateur de file d’attente fourni par NDIS dans les requêtes OID suivantes, par exemple, pour modifier les paramètres de file d’attente ou libérer la file d’attente. L’identificateur de file d’attente est également inclus dans les données OOB sur toutes les structures NET_BUFFER_LIST associées à la file d’attente. Les pilotes utilisent la macro NET_BUFFER_LIST_RECEIVE_QUEUE_ID pour récupérer l’identificateur de file d’attente dans une structure de NET_BUFFER_LIST.

Note Un pilote de protocole peut définir des filtres VMQ à tout moment après avoir correctement alloué une file d’attente et avant la suppression de la file d’attente.

Le pilote de protocole émet une requête OID de méthode OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE pour terminer l’allocation de file d’attente. Le pilote miniport peut allouer de la mémoire partagée et d’autres ressources une fois l’allocation terminée. Pour plus d’informations sur l’allocation de ressources de mémoire partagée, consultez Allocation de ressources de mémoire partagée.

Une fois qu’un pilote miniport reçoit une requête OID OID_RECEIVE_FILTER_QUEUE_ALLOCATION et la gère correctement, la file d’attente est à l’état Alloué . Pour plus d’informations sur les états de file d’attente, consultez États et opérations de file d’attente.

Une fois qu’un pilote trop chargé alloue une ou plusieurs files d’attente de réception (et définit éventuellement les filtres initiaux), il doit émettre OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE définir des demandes OID pour informer le pilote miniport que l’allocation est terminée pour le lot actuel de files d’attente de réception.

Le pilote miniport ne doit pas conserver de paquets dans une file d’attente de réception si aucun filtre n’est défini sur cette file d’attente. Si une file d’attente n’a jamais défini de filtres ou si tous les filtres ont été effacés, la file d’attente doit être vide et tous les paquets doivent être ignorés. Autrement dit, ils ne sont pas indiqués dans la pile des pilotes ou conservés dans la file d’attente.

Les pilotes trop utilisent l’OID OID_RECEIVE_FILTER_FREE_QUEUE pour libérer les files d’attente qu’ils allouent. Pour plus d’informations sur la libération des files d’attente, consultez Libérer une file d’attente de machine virtuelle.