Compartir a través de


Especificar un filtro de recepción de fusión de paquetes

Un controlador de exceso puede establecer uno o varios filtros de recepción en un controlador de minipuerto que admita la fusión de paquetes NDIS. El controlador de sobresalto puede especificar hasta el número máximo de filtros de recepción que el controlador de miniporte especificado en el miembro MaxPacketCoalescingFilters de la estructura NDIS_RECEIVE_FILTER_CAPABILITIES .

Nota El controlador de protocolo sobrestituyendo obtiene la estructura de NDIS_RECEIVE_FILTER_CAPABILITIES dentro de la estructura NDIS_BIND_PARAMETERS . El controlador de filtro excesiva obtiene la estructura de NDIS_RECEIVE_FILTER_CAPABILITIES dentro de la estructura NDIS_FILTER_ATTACH_PARAMETERS .

Las descargas del controlador que se sobreponen reciben filtros para el controlador de minipuerto mediante la emisión de solicitudes de método OID de OID_RECEIVE_FILTER_SET_FILTER. El miembro InformationBuffer de la estructura de NDIS_OID_REQUEST para esta solicitud de OID contiene un puntero a un búfer asignado por el autor de la llamada. Este búfer tiene el formato siguiente:

Especificar un filtro de recepción

Un controlador de sobresuso especifica un filtro de recepción de fusión de paquetes mediante la inicialización de una estructura de NDIS_RECEIVE_FILTER_PARAMETERS con los parámetros de configuración para el filtro. Cuando inicializa la estructura de NDIS_RECEIVE_FILTER_PARAMETERS , el controlador de sobrestitución debe seguir estas reglas:

  • El miembro FilterType debe establecerse en el valor de enumeración NDIS_RECEIVE_FILTER_TYPE de NdisReceiveFilterTypePacketCoalescing.

  • El miembro QueueId debe establecerse en NDIS_DEFAULT_RECEIVE_QUEUE_ID.

    Nota A partir de NDIS 6.30, el filtro de recepción de fusión de paquetes solo se admite en la cola de recepción predeterminada del adaptador de red. Esta cola de recepción tiene un identificador de NDIS_DEFAULT_RECEIVE_QUEUE_ID.

  • Si el controlador que está sobreponiendo está creando un nuevo filtro de recepción, debe establecer el miembro FilterId en NDIS_DEFAULT_RECEIVE_FILTER_ID.

    Nota NDIS generará un identificador de filtro único (ID) para el filtro de recepción antes de reenviar la solicitud de método OID de OID_RECEIVE_FILTER_SET_FILTER al controlador de minipuerto.  

  • Si el controlador que está sobreabrindo está modificando un filtro de recepción existente, debe establecer el miembro FilterId en el identificador de filtro distinto de cero del filtro de recepción. El controlador de sobreslización obtiene el identificador de filtro del filtro de recepción cuando emite una solicitud de método OID de OID_RECEIVE_FILTER_ENUM_FILTERS. Para obtener más información sobre cómo modificar un filtro de recepción, vea Modificar filtros de recepción de fusión de paquetes.

  • Los miembros FieldParametersArrayOffset, FieldParametersArrayNumElements y FieldParametersArrayElementSize de la estructura NDIS_RECEIVE_FILTER_PARAMETERS deben establecerse para definir la matriz de un parámetro de campo. Cada elemento de la matriz es una estructura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS que especifica los parámetros de una prueba de campo de encabezado de un filtro de recepción.

  • El miembro RequestedFilterIdBitCount debe establecerse en cero.

  • MaxCoalescingDelay debe establecerse en el tiempo máximo, en unidades de milisegundos, que el primer paquete que coincida con el filtro de recepción se guarda y se combina en el adaptador de red. En cuanto se recibe el primer paquete que coincide con el filtro, el adaptador de red combina el paquete e inicia un temporizador de hardware cuya hora de expiración se establece en el valor del miembro MaxCoalescingDelay .

El controlador de sobresalto debe ordenar que las pruebas de campo de encabezado en la matriz de parámetros de campo estén en el mismo orden en el que existirían los encabezados MAC y protocolo asociados en un paquete.

Por ejemplo, antes de que el controlador de sobreslización especifique los parámetros de filtro para un campo de protocolo ip versión 4 (IPv4), primero debe especificar los parámetros de filtro para un campo de protocolo de encabezado MAC (NdisMacHeaderFieldProtocol). De esta manera, el controlador especifica una prueba de campo de encabezado que comprueba que el campo se establece en el valor EtherType correcto (0x0800) para los paquetes IPv4. Si se produce un error en la prueba, el adaptador no tiene que realizar la prueba del campo del protocolo IPV4.

Especificar pruebas de campo de encabezado

Cada filtro de recepción puede especificar uno o varios criterios de prueba (pruebas de campo de encabezado). El adaptador de red realiza estas pruebas para determinar si se debe fusionar un paquete recibido en un búfer de fusión de hardware en el adaptador. Además, el controlador de sobreslización puede especificar pruebas de filtro independientes para varios campos de encabezado de control de acceso multimedia (MAC), IP versión 4 (IPv4) e IP versión 6 (IPv6).

Para optimizar el filtrado en el adaptador de red, las pruebas de campo de encabezado se basan en nombres de campo de encabezado estandarizados en lugar de especificaciones de desplazamiento y longitud de bytes dentro de los datos del paquete. Mediante el uso de nombres de encabezado o campo, el hardware o firmware del adaptador de red puede optimizar la forma en que se realizan varias pruebas de campo de encabezado en un paquete recibido.

Cada filtro de recepción puede contener una o varias pruebas de campo de encabezado especificadas por una estructura de NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Cada estructura de NDIS_RECEIVE_FILTER_FIELD_PARAMETERS es un elemento de la matriz de parámetros de campo a la que hace referencia los miembros FieldParametersArrayOffset, FieldParametersArrayNumElements y FieldParametersArrayElementSize de la estructura NDIS_RECEIVE_FILTER_PARAMETERS .

El controlador de minipuerto debe seguir estas directrices cuando controla una solicitud de método OID de OID_RECEIVE_FILTER_SET_FILTER:

  • Si la marca de NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO se establece en el miembro Flags de la estructura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS , el adaptador de red solo debe indicar paquetes recibidos con una dirección MAC coincidente y paquetes o paquetes sin etiquetar con un identificador VLAN de cero. Es decir, el adaptador de red no debe indicar paquetes con una dirección MAC coincidente y un identificador VLAN distinto de cero.

  • Si no se establece la marca de NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO y no hay ningún filtro de identificador de VLAN configurado por una solicitud de conjunto de OID de OID_RECEIVE_FILTER_SET_FILTER, el controlador de miniporte debe realizar una de las siguientes acciones:

    • Si el controlador de miniporte admite NDIS 6.20, debe devolver un estado erróneo para la solicitud OID de OID_RECEIVE_FILTER_SET_FILTER.

    • Si el controlador de miniporte admite NDIS 6.30 o versiones posteriores de NDIS, debe configurar el adaptador de red para inspeccionar y filtrar los campos de dirección MAC especificados. Si una etiqueta VLAN está presente en el paquete recibido, el adaptador de red debe quitarla de los datos del paquete. El controlador de minipuerto debe colocar la etiqueta VLAN en un NDIS_NET_BUFFER_LIST_8021Q_INFO asociado a la estructura NET_BUFFER_LIST del paquete.

  • Si el controlador de sobreslización establece un filtro de direcciones MAC y un filtro de identificador VLAN en la estructura de NDIS_RECEIVE_FILTER_PARAMETERS , no establece la marca de NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO en ninguno de los campos de filtro. En este caso, el controlador de minipuerto debe indicar paquetes que coincidan con la dirección MAC especificada y el identificador VLAN. Es decir, el controlador de minipuerto no debe indicar paquetes con una dirección MAC coincidente que tenga un identificador VLAN cero o que no estén marcados como paquetes.