Uso del filtrado de capa 2
El filtrado de nivel 2 se admite en Windows 8 y versiones posteriores de Windows.
Esta característica DE PMA permite filtrar por campos del encabezado MAC de capa 2. Estas capas se invocan por paquete para todos los paquetes enviados o recibidos por el equipo host. Las capas se invocan antes de volver a ensamblar paquetes en la ruta de acceso de entrada y después de la fragmentación de paquetes en la ruta de acceso de salida. Se accede a estas capas desde un controlador de filtro ligero (LWF) NDIS.
Nota
Una llamada no debe insertar paquetes en una capa si aún no tiene un filtro correspondiente en esa capa. La inyección de las estructuras de NET_BUFFER_LIST debe coordinarse con la adición y eliminación del filtro para que la inyección solo se realice cuando el filtro exista en la capa correspondiente. Además, los proveedores no deben quitar filtros que pertenecen a otros proveedores.
Esta sección contiene los siguientes temas:
- Inyección de marcos MAC
- Clasificación de listas de búferes de red encadenados
- Capas y campos de la capa 2 de PMA
Inyección de marcos MAC
Un controlador de devolución de llamada llama a la función FwpsInjectMacReceiveAsync0 para volver a expulsar un marco MAC previamente absorbido (o un clon del marco) de vuelta a la ruta de acceso de datos de entrada de capa 2 desde la que se interceptó o para insertar un marco MAC inventado en la ruta de acceso de datos de entrada.
Un controlador de devolución de llamada llama a la función FwpsInjectMacSendAsync0 para volver a expulsar un marco MAC previamente absorbido (o un clon del marco) de vuelta a la ruta de acceso de datos salientes de la capa 2 desde la que se interceptó o para insertar un marco MAC inventado en la ruta de acceso de datos de salida.
El parámetro netBufferLists puede ser una cadena de NET_BUFFER_LIST . Sin embargo, la función de finalización se puede invocar varias veces cada una, completando un segmento (o un solo NET_BUFFER_LIST) de la cadena.
Los fotogramas insertados podrían volver a clasificarse si los paquetes coinciden con el mismo filtro que el clasificado originalmente. Por lo tanto, al igual que con las llamadas en capas IP, las llamadas de nivel 2 también deben protegerse contra la inspección infinita de paquetes mediante una llamada a FwpsQueryPacketInjectionState0.
Además, debe tener llamadas en la capa donde se inserta. De lo contrario, la NET_BUFFER_LIST insertada no se completará en la función de finalización y el NET_BUFFER_LIST irá más allá de la pila. En este caso, el comportamiento no está definido, ya que NDIS intentará pasar el NET_BUFFER_LIST insertado al siguiente componente de la pila.
El miembro NET_BUFFER_LISTEstado contiene el resultado de estado de la inyección de pila. El resultado del estado de la inyección de pila es el estado que la pila coloca en el NET_BUFFER_LIST después de que una función de inyección de PMA devuelva STATUS_SUCCESS. Debe usar la macro NT_SUCCESS para comprobar el estado de la inyección de pila en el miembro Status . Si el valor status es STATUS_SUCCESS, la inyección se realizó correctamente sin más información. Los valores de miembro de estado mayores que STATUS_SUCCESS significan que la inyección se realizó correctamente, pero puede haber más información sobre la inyección que se debe tener en cuenta. Los valores de miembro de estado menores que STATUS_SUCCESS significan que se produjo un error en la inyección por el motivo especificado en el miembro Status.
Clasificación de listas de búferes de red encadenados
De forma predeterminada, un controlador de llamada solo puede clasificar las listas de búferes de red individualmente. Sin embargo, un controlador de llamada puede clasificar NET_BUFFER_LIST cadenas para mejorar el rendimiento, si hace lo siguiente:
- Especifica la marca FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY en el miembro Flags de la estructura FWPS_CALLOUT2 .
- Registra una función classifyFn2 que puede clasificar NET_BUFFER_LIST cadenas.
Advertencia
Sin embargo, si un controlador de llamada establece la marca FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY , no puede usar las siguientes funciones para modificar NET_BUFFER_LISTs.
- FwpsReferenceNetBufferList0
- FwpsDereferenceNetBufferList0
- FwpsAllocateCloneNetBufferList0
- FwpsFreeCloneNetBufferList0
Con este conjunto de marcas, FwpsAllocateCloneNetBufferList0 siempre devolverá un error INVALID_PARAMETER . Esto puede provocar inesperadamente que un controlador de llamada de terceros no pueda administrar el recuento de referencias de NET_BUFFER_LISTs, lo que hace que las operaciones de envío y recepción se detengan.
Capas y campos de la capa 2 de PMA
Los identificadores de capa de filtrado en tiempo de ejecución para el filtrado de conmutadores virtuales incluyen:
FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET
FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE
FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE
Los identificadores de campo de datos para el filtrado de conmutadores virtuales incluyen:
FWPS_FIELDS_INBOUND_MAC_FRAME_ETHERNET
FWPS_FIELDS_OUTBOUND_MAC_FRAME_ETHERNET