Spécification d’un filtre de réception de fusion de paquets
Un pilote qui se superpose peut définir un ou plusieurs filtres de réception sur un pilote miniport qui prennent en charge la fusion de paquets NDIS. Le pilote qui surclasse peut spécifier jusqu’au nombre maximal de filtres de réception que le pilote miniport spécifié dans le membre MaxPacketCoalescingFilters de la structure NDIS_RECEIVE_FILTER_CAPABILITIES .
Note Le pilote de protocole qui se superpose obtient la structure NDIS_RECEIVE_FILTER_CAPABILITIES au sein de la structure NDIS_BIND_PARAMETERS . Le pilote de filtre qui se superpose obtient la structure NDIS_RECEIVE_FILTER_CAPABILITIES au sein de la structure NDIS_FILTER_ATTACH_PARAMETERS .
Les téléchargements de pilotes surcharnement reçoivent des filtres sur le pilote miniport en émettant des demandes de méthode OID de OID_RECEIVE_FILTER_SET_FILTER. Le membre InformationBuffer de la structure NDIS_OID_REQUEST pour cette requête OID contient un pointeur vers une mémoire tampon allouée à l’appelant. Cette mémoire tampon est mise en forme pour contenir les éléments suivants :
Structure NDIS_RECEIVE_FILTER_PARAMETERS qui spécifie les paramètres d’un filtre de réception NDIS.
Pour plus d’informations sur l’initialisation de cette structure, consultez Spécification d’un filtre de réception.
Tableau de structures NDIS_RECEIVE_FILTER_FIELD_PARAMETERS qui spécifie le critère de test de filtre pour un champ dans un en-tête de paquet réseau.
Pour plus d’informations sur l’initialisation de ces structures, consultez Spécification des tests de champ d’en-tête.
Spécification d’un filtre de réception
Un pilote overlying spécifie un filtre de réception de fusion de paquets en initialisant une structure NDIS_RECEIVE_FILTER_PARAMETERS avec les paramètres de configuration du filtre. Lorsqu’il initialise la structure NDIS_RECEIVE_FILTER_PARAMETERS , le pilote en sur-position doit suivre les règles suivantes :
Le membre FilterType doit être défini sur la valeur d’énumération NDIS_RECEIVE_FILTER_TYPE de NdisReceiveFilterTypePacketCoalescing.
Le membre QueueId doit être défini sur NDIS_DEFAULT_RECEIVE_QUEUE_ID.
Note À compter de NDIS 6.30, le filtre de réception de fusion de paquets est uniquement pris en charge sur la file d’attente de réception par défaut de la carte réseau. Cette file d’attente de réception a un identificateur de NDIS_DEFAULT_RECEIVE_QUEUE_ID.
Si le pilote qui se superpose crée un filtre de réception, il doit définir le membre FilterId sur NDIS_DEFAULT_RECEIVE_FILTER_ID.
Note NDIS génère un identificateur de filtre unique (ID) pour le filtre de réception avant de transférer la demande de méthode OID de OID_RECEIVE_FILTER_SET_FILTER au pilote miniport.
Si le pilote en sur-position modifie un filtre de réception existant, il doit définir le membre FilterId sur l’ID de filtre différent de zéro du filtre de réception. Le pilote qui se superpose obtient l’ID de filtre pour le filtre de réception lorsqu’il émet une demande de méthode OID de OID_RECEIVE_FILTER_ENUM_FILTERS. Pour plus d’informations sur la modification d’un filtre de réception, consultez Modification des filtres de réception de fusion de paquets.
Les membres FieldParametersArrayOffset, FieldParametersArrayNumElements et FieldParametersArrayElementSize de la structure NDIS_RECEIVE_FILTER_PARAMETERS doivent être définis pour définir le tableau d’un paramètre de champ. Chaque élément du tableau est une structure NDIS_RECEIVE_FILTER_FIELD_PARAMETERS qui spécifie les paramètres d’un test de champ d’en-tête d’un filtre de réception.
Le membre RequestedFilterIdBitCount doit être défini sur zéro.
MaxCoalescingDelay doit être défini sur la durée maximale, en unités de millisecondes, pendant laquelle le premier paquet correspondant au filtre de réception est enregistré et coalisé sur la carte réseau. Dès que le premier paquet correspondant au filtre est reçu, la carte réseau fusionne le paquet et démarre un minuteur matériel dont l’heure d’expiration est définie sur la valeur du membre MaxCoalescingDelay .
Le pilote de surdimensionnement doit ordonner que les tests de champ d’en-tête dans le tableau de paramètres de champ soient dans le même ordre que les en-têtes MAC et de protocole associés dans un paquet.
Par exemple, avant que le pilote de surlyse ne spécifie les paramètres de filtre d’un champ de protocole IP version 4 (IPv4), il doit d’abord spécifier les paramètres de filtre d’un champ de protocole d’en-tête MAC (NdisMacHeaderFieldProtocol). De cette façon, le pilote spécifie un test de champ d’en-tête qui vérifie que le champ est défini sur la valeur EtherType correcte (0x0800) pour les paquets IPv4. Si le test échoue, l’adaptateur n’a pas besoin d’effectuer le test du champ de protocole IPV4.
Spécification des tests de champ d’en-tête
Chaque filtre de réception peut spécifier un ou plusieurs critères de test (tests de champ d’en-tête). La carte réseau effectue ces tests pour déterminer si un paquet reçu doit être coalescisé dans une mémoire tampon de fusion matérielle sur la carte. En outre, le pilote de sur-superposition peut spécifier des tests de filtre distincts pour différents champs d’en-tête de contrôle d’accès au média (MAC), IP version 4 (IPv4) et IP version 6 (IPv6).
Pour optimiser le filtrage sur la carte réseau, les tests de champ d’en-tête sont basés sur des noms de champs d’en-tête standardisés au lieu des spécifications de décalage/longueur d’octet dans les données de paquet. En utilisant des noms d’en-tête/de champ, le matériel ou le microprogramme de la carte réseau peut optimiser la façon dont plusieurs tests de champ d’en-tête sont effectués sur un paquet reçu.
Chaque filtre de réception peut contenir un ou plusieurs tests de champ d’en-tête spécifiés par une structure NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Chaque structure NDIS_RECEIVE_FILTER_FIELD_PARAMETERS est un élément du tableau de paramètres de champ référencé par les membres FieldParametersArrayOffset, FieldParametersArrayNumElements et FieldParametersArrayElementSize de la structure NDIS_RECEIVE_FILTER_PARAMETERS .
Le pilote miniport doit suivre ces instructions lorsqu’il gère une demande de méthode OID de OID_RECEIVE_FILTER_SET_FILTER :
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 uniquement indiquer les paquets reçus avec une adresse MAC correspondante et des paquets ou paquets non marqués avec un identificateur de réseau local virtuel égal à zéro. Autrement dit, la carte réseau ne doit pas indiquer les paquets avec une adresse MAC correspondante et un identificateur VLAN différent de zéro.
Si l’indicateur NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO n’est pas défini et qu’aucun filtre d’identificateur VLAN n’est configuré par une demande de jeu 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 une 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 le 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 le pilote qui se superpose définit un filtre d’adresse MAC et un filtre d’identificateur VLAN dans la structure NDIS_RECEIVE_FILTER_PARAMETERS , 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 VLAN. Autrement dit, le pilote miniport ne doit pas indiquer les paquets avec une adresse MAC correspondante qui ont un identificateur VLAN zéro ou qui sont des paquets non marqués.