Establecimiento de un filtro de VMQ
Una vez asignada una cola de recepción, los controladores que se sobreponen pueden establecer filtros en la cola de recepción. Solo el controlador que asignó una cola de recepción puede establecer un filtro en esa cola.
Nota Dado que la cola de recepción predeterminada (NDIS_DEFAULT_RECEIVE_QUEUE_ID) siempre existe, los controladores de exceso siempre pueden establecer un filtro de recepción en la cola predeterminada. Los controladores demasiado excesivos no poseen la cola predeterminada. Por lo tanto, todos los controladores de protocolo que están enlazados a un adaptador de red pueden usar la cola predeterminada.
Establecer un filtro en una cola de recepción
Para establecer un filtro en una cola de recepción con un conjunto inicial de parámetros de configuración, un controlador demasiado excesivo emite una solicitud de identificador de objeto de método (OID) de OID_RECEIVE_FILTER_SET_FILTER . El miembro InformationBuffer de la estructura NDIS_OID_REQUEST contiene inicialmente un puntero a una estructura NDIS_RECEIVE_FILTER_PARAMETERS . Después de una devolución correcta de la solicitud del método OID, el miembro InformationBuffer de la estructura NDIS_OID_REQUEST contiene un puntero a una estructura de NDIS_RECEIVE_FILTER_PARAMETERS con un nuevo identificador de filtro.
El controlador de sobreaprovisionamiento inicializa la estructura de NDIS_RECEIVE_FILTER_PARAMETERS con los siguientes parámetros de configuración de filtro para la cola de recepción:
Tipo de filtro especificado a través de un valor de enumeración NDIS_RECEIVE_FILTER_TYPE .
Nota A partir de NDIS 6.20, solo se admiten los tipos de filtro NdisReceiveFilterTypeVMQueue para la interfaz de la cola de máquinas virtuales (VMQ).
Identificador de cola.
Uno o varios parámetros de prueba de campo con formato NDIS_RECEIVE_FILTER_FIELD_PARAMETERS estructuras. Para VMQ, se definen los siguientes parámetros de prueba de campo.
La dirección de control de acceso multimedia (MAC) de destino del paquete es igual a la dirección MAC especificada.
El identificador de LAN virtual (VLAN) del paquete es igual al identificador de VLAN especificado.
La estructura NDIS_RECEIVE_FILTER_PARAMETERS se usa con el OID de OID_RECEIVE_FILTER_PARAMETERS y el OID de OID_RECEIVE_FILTER_SET_FILTER para especificar los parámetros de configuración de un filtro.
Los miembros FieldParametersArrayOffset, FieldParametersArrayNumElements y FieldParametersArrayElementSize de la estructura NDIS_RECEIVE_FILTER_PARAMETERS definen una matriz de estructuras NDIS_RECEIVE_FILTER_FIELD_PARAMETERS . Cada NDIS_RECEIVE_FILTER_FIELD_PARAMETERS estructura de la matriz establece el criterio de prueba de filtro para un campo de un encabezado de red.
El miembro Flags de la estructura NDIS_RECEIVE_FILTER_FIELD_PARAMETERS especifica las acciones que se van a realizar para el filtro de recepción. Los siguientes puntos se aplican a la marca NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO :
Si la marca 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 debe indicar solo los paquetes recibidos que coincidan con todos los criterios de prueba siguientes:
Un paquete con una dirección MAC coincidente.
Un paquete que no tiene ninguna etiqueta VLAN o tiene un identificador VLAN de cero.
Si se establece la marca NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO , el adaptador de red no debe indicar paquetes que tengan una dirección MAC coincidente y un identificador VLAN distinto de cero.
Nota Si el conmutador extensible de Hyper-V establece el filtro de direcciones MAC y no se configura ningún filtro de identificador de VLAN en OID_RECEIVE_FILTER_SET_FILTER, el modificador también establece la marca NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO .
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 VLAN configurado por una solicitud de conjunto de OID de OID_RECEIVE_FILTER_SET_FILTER, el controlador de minipuerto debe realizar una de las siguientes acciones:
Si el controlador de minipuerto admite NDIS 6.20, debe devolver un estado de error para la solicitud OID de OID_RECEIVE_FILTER_SET_FILTER.
Si el controlador de minipuerto 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 hay una etiqueta VLAN en el paquete recibido, el adaptador de red debe quitarlo 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 un controlador de protocolo establece un filtro de direcciones MAC y un filtro de identificador de VLAN con el OID de OID_RECEIVE_FILTER_SET_FILTER , no establece la marca 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 coinciden 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 estén sin etiquetar paquetes.
Uso del identificador de filtro
NDIS asigna un identificador de filtro en el miembro FilterId de la estructura NDIS_RECEIVE_FILTER_PARAMETERS y pasa la solicitud de método OID de OID_RECEIVE_FILTER_SET_FILTER al controlador de miniport subyacente. Cada filtro que se establece en una cola de recepción tiene un identificador de filtro único para un adaptador de red. Es decir, los identificadores de filtro no se duplican en diferentes colas que administra el adaptador de red.
El controlador de sobreslización debe usar el identificador de filtro que proporciona NDIS en solicitudes OID posteriores; por ejemplo, para modificar los parámetros de filtro o liberar un filtro.
Cuando NDIS recibe una solicitud de OID para establecer un filtro en una cola de recepción, comprueba los parámetros de filtro. Después de que NDIS asigne los recursos necesarios y el identificador de filtro, envía la solicitud OID al adaptador de red subyacente. Si el adaptador de red puede asignar correctamente los recursos de software y hardware necesarios para el filtro, completa la solicitud OID con NDIS_STATUS_SUCCESS.
El controlador de minipuerto debe conservar los identificadores de filtro para los filtros de recepción asignados. NDIS usa el identificador de filtro de un filtro con solicitudes OID posteriores para cambiar los parámetros de filtro de recepción o borrar el filtro de recepción. Para obtener más información sobre cómo cambiar los parámetros y borrar filtros, consulte Obtención y actualización de parámetros de cola de máquinas virtuales y Borrado de un filtro VMQ.
Control del filtro en una cola de recepción
El controlador de minipuerto programa el adaptador de red en función de los filtros de la siguiente manera:
Todos los parámetros de prueba de campo de un filtro determinado deben coincidir para asignar un paquete a la cola.
Se pueden establecer varios filtros en una cola.
Los paquetes se deben asignar a la cola de recepción si se pasa alguno de los filtros.
El adaptador de red combina los resultados de todas las pruebas de campo con una operación AND lógica. Es decir, si se produce un error en alguna prueba de campo incluida en la matriz de estructuras de NDIS_RECEIVE_FILTER_FIELD_PARAMETERS , el paquete de red no cumple el criterio de filtro especificado.
Cuando un adaptador de red prueba un paquete recibido con estos criterios de filtro, debe omitir todos los campos del paquete que no tienen ningún criterio de prueba especificado.
Recepción de paquetes de una cola de recepción
Después de que un controlador de minipuerto reciba una solicitud de OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE y tenga filtros establecidos en la cola, la cola se encuentra en estado En ejecución . Mientras la cola está en este estado, el controlador de minipuerto puede indicar paquetes en la cola. Para obtener más información sobre los estados de la cola, consulte Estados de cola y operaciones.
Si el controlador de minipuerto ha recibido una solicitud de OID de OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE para una cola, pero no hay ningún filtro establecido en la cola, el controlador de miniporte no debe indicar ningún paquete de recepción en esa cola. En este caso, cuando el controlador de minipuerto recibe una solicitud de OID de OID_RECEIVE_FILTER_SET_FILTER para la cola y, posiblemente, antes de completar la solicitud de OID, puede indicar paquetes en esa cola. Si el controlador de minipuerto indica paquetes en una cola mientras está procesando una solicitud de OID de OID_RECEIVE_FILTER_SET_FILTER, el controlador de minipuerto debe completar la solicitud de OID_RECEIVE_FILTER_SET_FILTER que tiene un código de devolución NDIS_STATUS_SUCCESS .