Définition d’un filtre VMQ

Une fois qu’une file d’attente de réception est allouée, les pilotes sur-ment peuvent définir des filtres sur la file d’attente de réception. Seul le pilote qui a alloué une file d’attente de réception peut définir un filtre sur cette file d’attente.

Note Étant donné que la file d’attente de réception par défaut (NDIS_DEFAULT_RECEIVE_QUEUE_ID) existe toujours, les pilotes qui se superposent peuvent toujours définir un filtre de réception sur la file d’attente par défaut. Les pilotes sur-ment ne possèdent pas la file d’attente par défaut. Par conséquent, tous les pilotes de protocole liés à une carte réseau peuvent utiliser la file d’attente par défaut.

Définition d’un filtre sur une file d’attente de réception

Pour définir un filtre sur une file d’attente de réception avec un ensemble initial de paramètres de configuration, un pilote sur-ment émet une demande d’identificateur d’objet de méthode (OID) OID_RECEIVE_FILTER_SET_FILTER . Le membre InformationBuffer de la structure NDIS_OID_REQUEST contient initialement un pointeur vers une structure NDIS_RECEIVE_FILTER_PARAMETERS . Après un retour réussi de la demande de méthode OID, le membre InformationBuffer de la structure NDIS_OID_REQUEST contient un pointeur vers une structure NDIS_RECEIVE_FILTER_PARAMETERS avec un nouvel identificateur de filtre.

Le pilote overlys initialise la structure NDIS_RECEIVE_FILTER_PARAMETERS avec les paramètres de configuration de filtre suivants pour la file d’attente de réception :

  • Type de filtre spécifié par le biais d’une valeur d’énumération NDIS_RECEIVE_FILTER_TYPE .

    Note À compter de NDIS 6.20, seuls les types de filtre NdisReceiveFilterTypeVMQueue sont pris en charge pour l’interface de file d’attente de machines virtuelles (VMQ).

  • Identificateur de file d’attente.

  • Un ou plusieurs paramètres de test de champ mis en forme en tant que structures NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Pour VMQ, les paramètres de test de champ suivants sont définis.

    • L’adresse MAC (Destination Media Access Control) dans le paquet est égale à l’adresse MAC spécifiée.

    • L’identificateur de réseau local virtuel (VLAN) dans le paquet est égal à l’identificateur de réseau local virtuel spécifié.

La structure NDIS_RECEIVE_FILTER_PARAMETERS est utilisée avec l’OID OID_RECEIVE_FILTER_PARAMETERS et l’OID OID_RECEIVE_FILTER_SET_FILTER pour spécifier les paramètres de configuration d’un filtre.

Les membres FieldParametersArrayOffset, FieldParametersArrayNumElements et FieldParametersArrayElementSize de la structure NDIS_RECEIVE_FILTER_PARAMETERS définissent un tableau de structures NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Chaque structure NDIS_RECEIVE_FILTER_FIELD_PARAMETERS dans le tableau définit le critère de test de filtre pour un champ dans un en-tête de réseau.

Le membre Flags de la structure NDIS_RECEIVE_FILTER_FIELD_PARAMETERS spécifie les actions à effectuer pour le filtre de réception. Les points suivants s’appliquent à l’indicateur NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO :

  • Si l’indicateur NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO est défini dans le membre Indicateurs de la structure NDIS_RECEIVE_FILTER_FIELD_PARAMETERS , la carte réseau doit indiquer uniquement les paquets reçus qui correspondent à tous les critères de test suivants :

    • Paquet avec une adresse MAC correspondante.

    • Paquet qui n’a pas de balise de réseau local virtuel ou qui a un identificateur de réseau local virtuel égal à zéro.

    Si l’indicateur NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO est défini, la carte réseau ne doit pas indiquer les paquets qui ont une adresse MAC correspondante et un identificateur VLAN différent de zéro.

    Note Si le commutateur extensible Hyper-V définit le filtre d’adresse MAC et qu’aucun filtre d’identificateur de réseau local virtuel n’est configuré dans OID_RECEIVE_FILTER_SET_FILTER, le commutateur définit également l’indicateur NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO .

  • Si l’indicateur NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO n’est pas défini et qu’aucun filtre d’identificateur de réseau local virtuel n’est configuré par une demande de jeu d’OID de OID_RECEIVE_FILTER_SET_FILTER, le pilote miniport doit effectuer l’une des opérations suivantes :

    • Si le pilote miniport prend en charge NDIS 6.20, il doit retourner un status ayant échoué pour la requête OID de OID_RECEIVE_FILTER_SET_FILTER.

    • Si le pilote miniport prend en charge NDIS 6.30 ou versions ultérieures de NDIS, il doit configurer la carte réseau pour inspecter et filtrer les champs d’adresse MAC spécifiés. Si une balise VLAN est présente dans le paquet reçu, la carte réseau doit la supprimer des données du paquet. Le pilote miniport doit placer la balise VLAN dans une NDIS_NET_BUFFER_LIST_8021Q_INFO associée à la structure NET_BUFFER_LIST du paquet.

  • Si un pilote de protocole définit un filtre d’adresse MAC et un filtre d’identificateur de réseau local virtuel avec l’OID OID_RECEIVE_FILTER_SET_FILTER , il ne définit pas l’indicateur NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO dans l’un des champs de filtre. Dans ce cas, le pilote miniport doit indiquer les paquets qui correspondent à la fois à l’adresse MAC spécifiée et à l’identificateur de réseau local virtuel. Autrement dit, le pilote miniport ne doit pas indiquer les paquets avec une adresse MAC correspondante qui ont un identificateur de VLAN zéro ou qui sont des paquets non étiquetés.

Utilisation de l’identificateur de filtre

NDIS affecte un identificateur de filtre dans le membre FilterId de la structure NDIS_RECEIVE_FILTER_PARAMETERS et transmet la demande de méthode OID de OID_RECEIVE_FILTER_SET_FILTER au pilote miniport sous-jacent. Chaque filtre défini sur une file d’attente de réception a un identificateur de filtre unique pour une carte réseau. Autrement dit, les identificateurs de filtre ne sont pas dupliqués sur différentes files d’attente que la carte réseau gère.

Le pilote overlying doit utiliser l’identificateur de filtre fourni par NDIS dans les requêtes OID ultérieures ; par exemple, pour modifier les paramètres de filtre ou pour libérer un filtre.

Quand NDIS reçoit une demande OID pour définir un filtre dans une file d’attente de réception, il vérifie les paramètres de filtre. Une fois que NDIS alloue les ressources nécessaires et l’identificateur de filtre, il envoie la demande OID à la carte réseau sous-jacente. Si la carte réseau peut allouer correctement les ressources logicielles et matérielles nécessaires pour le filtre, elle termine la requête OID avec NDIS_STATUS_SUCCESS.

Le pilote miniport doit conserver les identificateurs de filtre pour les filtres de réception alloués. NDIS utilise l’identificateur de filtre d’un filtre avec des requêtes OID ultérieures afin de modifier les paramètres de filtre de réception ou d’effacer le filtre de réception. Pour plus d’informations sur la modification des paramètres et l’effacement des filtres, consultez Obtention et mise à jour des paramètres de file d’attente de machines virtuelles et Effacement d’un filtre VMQ.

Gestion du filtre sur une file d’attente de réception

Le pilote miniport programme la carte réseau en fonction des filtres de la manière suivante :

  • Tous les paramètres de test sur le terrain d’un filtre particulier doivent correspondre afin d’affecter un paquet à la file d’attente.

  • Plusieurs filtres peuvent être définis dans une file d’attente.

  • Les paquets doivent être attribués à la file d’attente de réception si l’un des filtres passe.

La carte réseau combine les résultats de tous les tests sur le terrain avec une opération AND logique. Autrement dit, si un test sur le terrain inclus dans le tableau de structures NDIS_RECEIVE_FILTER_FIELD_PARAMETERS échoue, le paquet réseau ne répond pas au critère de filtre spécifié.

Lorsqu’une carte réseau teste un paquet reçu par rapport à ces critères de filtre, elle doit ignorer tous les champs du paquet qui n’ont aucun critère de test spécifié.

Réception de paquets à partir d’une file d’attente de réception

Une fois qu’un pilote miniport reçoit une requête OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE et a des filtres définis dans la file d’attente, la file d’attente est à l’état En cours d’exécution . Lorsque la file d’attente est dans cet état, le pilote miniport peut indiquer des paquets dans la file d’attente. Pour plus d’informations sur les états de file d’attente, consultez États et opérations de file d’attente.

Si le pilote miniport a reçu une requête OID OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE pour une file d’attente, mais qu’aucun filtre n’est défini sur la file d’attente, le pilote miniport ne doit indiquer aucun paquet de réception dans cette file d’attente. Dans ce cas, lorsque le pilote miniport reçoit une requête OID OID_RECEIVE_FILTER_SET_FILTER pour la file d’attente, et éventuellement avant qu’il ne termine la requête OID, il peut indiquer des paquets sur cette file d’attente. Si le pilote miniport indique des paquets sur une file d’attente pendant le traitement d’une requête OID OID_RECEIVE_FILTER_SET_FILTER, le pilote miniport doit terminer la requête OID_RECEIVE_FILTER_SET_FILTER qui a un code de retour NDIS_STATUS_SUCCESS .