Clonación del tráfico de paquetes
En este tema se describe cómo las extensiones de conmutador extensible de Hyper-V clonan, o duplican, paquetes e inyecten en la ruta de acceso de datos de conmutador extensible. Para obtener más información sobre la clonación de paquetes, vea Cloned NET_BUFFER_LIST Structures.
Nota En esta página se da por supuesto que está familiarizado con la información y los diagramas de Información general del conmutador extensible de Hyper-V y el reenvío híbrido.
Nota En la interfaz de conmutador extensible, los controladores de filtro NDIS se conocen como extensiones de conmutador extensible y la pila de controladores se conoce como pila de controladores de conmutador extensible. Para obtener más información sobre las extensiones, consulte Extensiones de conmutador extensible de Hyper-V.
Las extensiones de filtrado y reenvío de conmutador extensible pueden insertar paquetes clonados en la ruta de acceso de datos de entrada o salida del conmutador extensible siguiendo estas directrices:
La extensión debe asignar primero una estructura de NET_BUFFER_LIST para el paquete clonado. A continuación, la extensión debe copiar los datos del paquete original en el paquete clonado. Para obtener más información sobre cómo clonar paquetes, vea Estructuras de NET_BUFFER_LIST derivadas.
Una vez que la extensión asigna una estructura de NET_BUFFER_LIST , debe llamar a la función de controlador AllocateNetBufferListForwardingContext para asignar el contexto de reenvío de conmutador extensible para el paquete.
El contexto de reenvío reside en los datos fuera de banda (OOB) del paquete. Contiene información de reenvío para el paquete, como su puerto de origen y una matriz de uno o varios puertos de destino.
Para obtener más información sobre el contexto de reenvío, consulte Contexto de reenvío extensible de conmutador de Hyper-V.
La extensión debe copiar los datos de OOB, incluido el puerto de origen existente, del paquete original al paquete clonado llamando a CopyNetBufferListInfo. Si la extensión planea insertar el paquete en la ruta de acceso de datos de entrada, también debe copiar los puertos de destino de los datos OOB del paquete original.
Cuando copia los datos de OOB, la extensión debe seguir estas directrices:
Si la extensión de filtrado planea insertar el paquete en la ruta de acceso de datos de entrada, debe llamar a CopyNetBufferListInfo con la marca NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS no especificada. Esto hace que los puertos de destino del paquete original no se copien en los paquetes clonados. Cuando la extensión de filtrado inserta este paquete en la ruta de acceso de datos de entrada, los puertos de destino se agregarán al paquete mediante una extensión de reenvío subyacente (si está habilitada en la pila de controladores) o el borde de minipuerto del conmutador extensible.
Si la extensión de filtrado planea insertar el paquete en la ruta de acceso de datos de salida, debe llamar a CopyNetBufferListInfo con la marca NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS especificada. Esto hace que los puertos de destino del paquete original se copien en los paquetes clonados.
Si la extensión de filtrado está clonando o duplicando un paquete obtenido de la ruta de acceso de datos de salida, puede cambiar los puertos de destino del paquete después de llamar a CopyNetBufferListInfo con la marca NDIS_SWITCH_COPY_NBL_INFO_FLAGS_PRESERVE_DESTINATIONS especificada. Para obtener más información sobre este procedimiento, vea Modificar los datos de puerto de origen del conmutador extensible de un paquete.
Si la extensión de reenvío está clonando o duplicando un paquete que se obtuvo de la ruta de acceso de datos de entrada, debe agregar nuevos puertos de destino para el paquete antes de insertar el paquete en la ruta de acceso de datos de entrada. Para obtener más información sobre este procedimiento, vea Agregar datos de puerto de destino de conmutador extensible a un paquete.
Después de que la extensión llame a CopyNetBufferListInfo, al paquete se le asignará la misma información de puerto de origen que se contenía en el paquete original.
La extensión puede llamar a SetNetBufferListSource para cambiar la información del puerto de origen en los datos fuera de banda (OOB) del paquete.
Es posible que la extensión quiera que el paquete se trate como si se origina en un puerto determinado. Esto permite aplicar las directivas para ese puerto al paquete. La extensión llama a SetNetBufferListSource para cambiar el puerto de origen del paquete.
Sin embargo, puede haber situaciones en las que la extensión quiera asignar el identificador de puerto de origen del paquete a NDIS_SWITCH_DEFAULT_PORT_ID. Por ejemplo, la extensión puede querer establecer el identificador de puerto de origen en NDIS_SWITCH_DEFAULT_PORT_ID para paquetes de control propietarios que se envían a un dispositivo en la red externa.
En la ruta de acceso de datos NDIS estándar, los datos de OOB de conmutador no extensible suelen tener valores diferentes en función de si el paquete se indica como envío o recepción. Por ejemplo, los datos de NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO OOB son una unión de estructuras específicas de envío y recepción.
En la ruta de acceso de datos de conmutador extensible, todos los paquetes se mueven a través de la pila del controlador de extensión a medida que los envía y recibe. Por este motivo, los datos de OOB de conmutador no extensible dentro de la estructura de NET_BUFFER_LIST del paquete estarán en un formato de envío o recepción a través de la duración del flujo a través de la pila del controlador.
El formato de estos datos OOB depende del puerto de conmutador extensible de origen desde el que el paquete llegó al conmutador extensible. Si el puerto de origen está conectado al adaptador de red externo, los datos de OOB de conmutador no extensible estarán en un formato de recepción. En el caso de otros puertos, estos datos de OOB estarán en un formato de envío.
La información del puerto de origen se almacena en la unión NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO en los datos OOB de la estructura NET_BUFFER_LIST del paquete. La extensión obtiene los datos mediante la macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL .
Nota Si la extensión clona la estructura de NET_BUFFER_LIST de un paquete, debe tener en cuenta los datos de OOB de conmutador no extensible si agrega o modifica los datos de OOB. La extensión puede llamar a CopyNetBufferListInfo para copiar todos los datos de OOB de un paquete de origen a un paquete clonado. Esta función mantendrá el formato de envío o recepción de OOB cuando se copien los datos en el paquete.
Cuando la extensión clona un paquete, los datos del paquete clonado se encuentran en la memoria local, o de confianza, en el sistema operativo primario de la partición primaria de Hyper-V. No se puede acceder a esta memoria mediante la partición secundaria. Por lo tanto, se considera "seguro" de las actualizaciones no sincronizadas por el sistema operativo invitado que se ejecuta en esa partición.
Una vez clonado el paquete original, la extensión debe obtener la unión NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO en el paquete clonado mediante la macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . La extensión debe establecer el miembro IsPacketDataSafe en TRUE. Esto especifica que todos los datos del paquete se encuentran en memoria de confianza.
Las extensiones de filtrado y reenvío deben seguir estas directrices para insertar paquetes clonados en la ruta de acceso de datos de entrada o salida:
La extensión debe llamar a NdisFSendNetBufferLists para insertar el paquete clonado en la ruta de acceso de datos de entrada. La extensión debe establecer el parámetro SendFlags con la configuración de marca de conmutador extensible adecuada. Para obtener más información sobre esta configuración de marca, consulte Marcas de envío y recepción de conmutador extensible de Hyper-V.
Cuando NDIS llama a la función FilterSendNetBufferListsComplete de la extensión para completar la solicitud de envío del paquete clonado, la extensión debe llamar a FreeNetBufferListForwardingContext para liberar el contexto de reenvío asignado. La extensión debe hacerlo antes de liberar o reutilizar la estructura de NET_BUFFER_LIST para el paquete.
Nota La extensión debe insertar el paquete clonado en la ruta de acceso de datos de entrada si modifica los datos de paquete o el puerto de origen de un paquete que obtuvo de la ruta de acceso de datos de salida. También debe insertar el paquete clonado en la ruta de acceso de datos de entrada si no se conservan los puertos de destino del paquete.
La extensión debe llamar a NdisFIndicateReceiveNetBufferLists para insertar el paquete clonado en la ruta de acceso de datos de salida. La extensión debe establecer el parámetro ReceiveFlags con la configuración de marca de conmutador extensible adecuada.
Cuando NDIS llama a la función FilterReturnNetBufferLists de la extensión para completar la solicitud de recepción del paquete clonado, la extensión debe llamar a FreeNetBufferListForwardingContext antes de liberar o reutilizar la estructura de NET_BUFFER_LIST para el paquete.
Nota Antes de que la extensión de reenvío llame a NdisFIndicateReceiveNetBufferLists, debe haber determinado los puertos de destino del paquete clonado y agregar estos datos a los datos OOB del paquete.
Si la extensión clona la estructura NET_BUFFER_LIST de un paquete, debe conservar la propiedad de la estructura de NET_BUFFER_LIST del paquete original hasta que se haya completado la solicitud de envío o recepción del paquete clonado. La extensión debe usar el miembro ParentNetBufferList de la estructura NET_BUFFER_LIST del paquete clonado para vincular a la estructura de NET_BUFFER_LIST del paquete original.
Nota En NDIS 6.30 (Windows Server 2012), la extensión puede usar el miembro ParentNetBufferList para vincular al paquete original, pero no es necesario hacerlo. En NDIS 6.40 (Windows Server 2012 R2) y versiones posteriores, la extensión es necesaria para usar el miembro ParentNetBufferList para vincular al paquete original.
Una vez completada la solicitud de envío o recepción del paquete clonado, la extensión debe completar la solicitud de envío o recepción del paquete original.
Nota Si la extensión ha clonado la estructura de NET_BUFFER_LIST de un paquete, puede completar la solicitud de envío o recepción del paquete original después de clonarse.
Si la extensión clona un paquete, puede completar la solicitud de envío o recepción del paquete original en cuanto se clone.
Si la extensión de reenvío o filtrado obtiene un paquete en la ruta de acceso de datos de salida, no puede insertar una versión clonada del paquete en esta ruta de acceso de datos si la extensión modificó los datos del paquete o cambió el puerto de origen. Sin embargo, la extensión puede insertar estos paquetes en la ruta de acceso de datos de entrada. Esto permite que el paquete se reenvíe y filtre correctamente a través de la ruta de acceso de datos del conmutador extensible.
Nota Las extensiones de filtrado solo pueden insertar paquetes clonados en la ruta de acceso de datos de entrada si no se conservan los puertos de destino del paquete.
Por ejemplo, supongamos que se obtuvo un paquete con varios puertos de destino en la ruta de acceso de datos de salida del conmutador extensible. Si un puerto de destino requiere un control especial, como la encapsulación de datos, la extensión de reenvío o filtrado lo controla siguiendo estos pasos:
Excluya la entrega de paquetes al puerto que requiere un control especial. La extensión lo hace estableciendo el miembro IsExcluded de la estructura NDIS_SWITCH_PORT_DESTINATION del puerto de destino en un valor de uno. Para obtener más información sobre este procedimiento, vea Exclusión de la entrega de paquetes a puertos de destino de conmutador extensible.
Clone el paquete original y realice el control necesario de los datos del paquete.
Nota La extensión de filtrado no debe agregar un puerto de destino para el paquete clonado. Esta información se agregará más adelante mediante la extensión de reenvío o el minipuerto del conmutador extensible.
Reenvíe el paquete original en la ruta de acceso de datos de salida llamando a NdisMIndicateReceiveNetBufferLists.
Inserte el paquete clonado en la ruta de acceso de datos de entrada llamando a NdisFSendNetBufferLists.
Para obtener más información sobre las rutas de acceso de datos de entrada y salida extensibles del conmutador, consulte Ruta de acceso de datos de conmutador extensible de Hyper-V.
Nota La captura de extensiones no puede clonar el tráfico de paquetes. Sin embargo, pueden originar el tráfico de paquetes. Para obtener más información, consulte Tráfico de paquetes de origen.