Bucle de paquetes NDIS
Si se establece la marca NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET en el miembro NblFlags de la estructura NET_BUFFER_LIST , el paquete es un paquete de bucle invertido. Los controladores de protocolo y los controladores de filtro pueden comprobar esta marca para determinar si un paquete es un paquete de bucle invertido.
NDIS vuelve a recorrer los paquetes si se cumplen las tres condiciones siguientes:
El tipo de medio del adaptador de miniporte subyacente es NdisMedium802_3 o NdisMedium802_5.
Se cumple cualquiera de las tres condiciones siguientes:
Un enlace de protocolo establece la configuración de NDIS_PACKET_TYPE_PROMISCUOUS con el OID de OID_GEN_CURRENT_PACKET_FILTER para especificar su filtro de paquetes (y, para Windows 8 y versiones posteriores, no estableció NDIS_PACKET_TYPE_NO_LOCAL en el mismo OID) y se cumple cualquiera de las siguientes condiciones:
- Hay más de un enlace al adaptador de minipuerto.
- Hay un módulo de filtro conectado al adaptador de minipuerto y el módulo de filtro registró un controlador de recepción.
Un enlace de protocolo establece el valor de NDIS_PACKET_TYPE_ALL_LOCAL con el OID de OID_GEN_CURRENT_PACKET_FILTER para especificar su filtro de paquetes y cualquiera de los siguientes valores es true.
- Hay más de un enlace al adaptador de minipuerto.
- Hay un módulo de filtro conectado al adaptador de minipuerto y el módulo de filtro registró un controlador de recepción.
El llamador establece la marca NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK en el parámetro SendFlags de la función NdisSendNetBufferLists .
El paquete es aceptable según lo determinado por el conjunto de filtros de paquetes con el OID de OID_GEN_CURRENT_PACKET_FILTER para el adaptador de minipuerto. A continuación se muestran algunos ejemplos.
- Si el paquete es un paquete directo, la dirección de destino del paquete debe coincidir con la dirección MAC del adaptador de miniport.
- Si el paquete es un paquete de multidifusión, el filtro de paquetes debe tener establecido NDIS_PACKET_TYPE_ALL_MULTICAST o la dirección de destino coincide con una de las direcciones de multidifusión en la lista de direcciones de multidifusión del adaptador de miniporte y el filtro de paquetes tiene NDIS_PACKET_TYPE_MULTICAST establecido.
- Si el paquete es un paquete de difusión, el filtro de paquetes del adaptador de minipuerto debe tener NDIS_PACKET_TYPE_BROADCAST establecido.
- El filtro de paquetes del adaptador de minipuerto tiene NDIS_PACKET_TYPE_PROMISCUOUS o NDIS_PACKET_TYPE_ALL_LOCAL establecido.
Un enlace de protocolo recibe paquetes de bucle invertido si se cumple alguna de las siguientes condiciones:
El enlace de protocolo es el remitente original del paquete y se establece NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK.
El enlace de protocolo no establece NDIS_PACKET_TYPE_NO_LOCAL en el filtro de paquetes.
Un enlace de protocolo no recibirá paquetes de bucle invertido si se cumple alguna de las siguientes condiciones:
El enlace de protocolo establece NDIS_PACKET_TYPE_NO_LOCAL en el filtro de paquetes y no es el remitente original del paquete.
El enlace de protocolo es el remitente original, pero NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK no se establece en el parámetro SendFlags en una llamada a la función NdisSendNetBufferLists .
En la ilustración siguiente se muestra el flujo de lógica del algoritmo de bucle invertido.