Agregar datos de puerto de destino de conmutador extensible a un paquete
En este tema se describe cómo las extensiones de reenvío extensible de conmutadores de Hyper-V pueden especificar la entrega de paquetes a uno o varios puertos de destino. Estas extensiones también pueden reenviar paquetes a adaptadores de red físicos individuales que están enlazados al adaptador de red externo del conmutador extensible.
Nota Solo una extensión de reenvío o el propio conmutador puede reenviar paquetes a puertos de conmutador extensibles o adaptadores de red individuales.
En la ilustración siguiente se muestra la ruta de acceso de datos para el tráfico de paquetes a través de la pila extensible del controlador switch para NDIS 6.40 (Windows Server 2012 R2) y versiones posteriores. Ambas cifras también muestran la ruta de acceso de datos para el tráfico de paquetes hacia o desde los adaptadores de red que están conectados a puertos de conmutador extensibles.
En la ilustración siguiente se muestra la ruta de acceso de datos para el tráfico de paquetes a través de la pila extensible del controlador switch para NDIS 6.30 (Windows Server 2012).
Cada puerto de destino de conmutador extensible se especifica mediante un elemento NDIS_SWITCH_PORT_DESTINATION dentro de la estructura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Esta matriz se encuentra en el contexto de reenvío fuera de banda (OOB) de la estructura NET_BUFFER_LIST del paquete. Para obtener más información sobre este contexto, vea Contexto de reenvío de conmutador extensible de Hyper-V.
Si una extensión de reenvío está enlazada y habilitada en la pila de controladores de conmutador extensible, es responsable de determinar los puertos de destino de cada paquete obtenido de la ruta de acceso de datos de entrada extensible del conmutador, a menos que el paquete sea un paquete NVGRE. Para obtener más información sobre esta ruta de acceso de datos, vea Información general sobre la ruta de acceso de datos extensible de conmutador de Hyper-V. Para obtener más información sobre los paquetes NVGRE, consulte Reenvío híbrido.
Nota Si una extensión de reenvío no está enlazada o habilitada en la pila de controladores, el conmutador extensible determina los puertos de destino de los paquetes que obtiene de la ruta de acceso de datos de entrada.
La extensión de reenvío debe seguir estas instrucciones cuando determina los puertos de destino de un paquete obtenido en la ruta de acceso de datos de entrada:
La extensión debe inicializar una estructura de NDIS_SWITCH_PORT_DESTINATION dentro de la estructura de NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY con la información del puerto de destino.
Si el puerto de destino no está conectado al adaptador de red externo, la extensión debe establecer el miembro NicIndex de la estructura de NDIS_SWITCH_PORT_DESTINATIONen NDIS_SWITCH_DEFAULT_NIC_INDEX.
Si el puerto de destino está conectado al adaptador de red externo del conmutador extensible, la extensión puede especificar el índice de un adaptador de red físico subyacente al que reenviar la solicitud de envío. La extensión lo hace estableciendo el miembro NicIndex en el valor distinto de cero NDIS_SWITCH_NIC_INDEX del adaptador de red de destino enlazado al adaptador de red externo.
Para obtener más información, consulte Reenvío de paquetes a adaptadores de red físicos.
La extensión debe agregar puertos de destino a los datos de OOB de un paquete solo para aquellos puertos que tengan conexiones de adaptador de red activas. Si la extensión ha reenviado una solicitud de OID_SWITCH_NIC_DISCONNECT , no debe agregar un puerto de destino asociado al adaptador de red desconectado.
Para mejorar el rendimiento, la extensión solo debe agregar destinos de puerto válidos para la entrega de paquetes. En este caso, la extensión debe establecer el miembro IsExcluded de la estructura NDIS_SWITCH_PORT_DESTINATION del puerto de destino en FALSE.
Para conservar los datos de red de área local virtual (VLAN) 802.1Q en un paquete antes de entregarlos a un puerto, la extensión establece el miembro PreserveVLAN en TRUE.
Para quitar los datos de red de área local virtual (VLAN) 802.1Q en un paquete antes de entregarlos a un puerto, la extensión establece el miembro PreserveVLAN en FALSE.
Para conservar los datos de prioridad 802.1Q en un paquete antes de entregarlos a un puerto, la extensión establece el miembro PreservePriority en TRUE.
Para quitar los datos de prioridad 802.1Q de un paquete antes de entregarlos a un puerto, la extensión establece el miembro PreservePriority en FALSE.
Si la extensión de reenvío agrega varios puertos de destino para un paquete, debe seguir estos pasos:
La extensión accede primero a la estructura de NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO del paquete mediante la macro NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL . A continuación, la extensión lee el miembro NumAvailableDestinations para determinar cuántos elementos de puerto de destino no se usan están disponibles en la matriz de puertos de destino. Si la extensión requiere más puertos de destino de los que están disponibles en la matriz, debe llamar a la función GrowNetBufferListDestinations para asignar espacio para puertos de destino adicionales en la matriz.
Cuando la extensión llama a GrowNetBufferListDestinations, establece el parámetro NumberOfNewDestinations en el número de puertos de destino nuevos que se van a agregar al paquete.
La extensión también establece el parámetro NetBufferLists en un puntero a la estructura NET_BUFFER_LIST del paquete.
Nota Si hay puertos de destino disponibles en la matriz, la extensión no debe llamar a GrowNetBufferListDestinations.
Si la función GrowNetBufferListDestinations se devuelve correctamente, ha agregado los puertos de destino adicionales al final de la matriz de destino en la estructura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Se devuelve un puntero a esta estructura en el parámetro Destinations .
Nota Si la función GrowNetBufferListDestinations no puede asignar el número solicitado de puertos de destino, devuelve NDIS_STATUS_RESOURCES.
La extensión especifica nuevos elementos de puerto de destino en la estructura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . La extensión inicializa cada nuevo puerto de destino como una estructura de NDIS_SWITCH_PORT_DESTINATION .
La extensión inicializa los nuevos puertos de destino en la matriz a partir del desplazamiento de NumDestinations . NumDestinations es un miembro de la estructura NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY .
Una vez que la extensión haya terminado de agregar o modificar los elementos de puerto de destino, debe llamar a UpdateNetBufferListDestinations para confirmar esos cambios.
Si la extensión agrega un único puerto de destino para un paquete, debe seguir estos pasos:
La extensión inicializa la información del puerto de destino para el paquete en una estructura de NDIS_SWITCH_PORT_DESTINATION asignada por la extensión.
La extensión llama a AddNetBufferListDestination para confirmar los cambios en la estructura NET_BUFFER_LIST del paquete. La extensión pasa la dirección de la estructura NDIS_SWITCH_PORT_DESTINATION en el parámetro Destination .
Nota La extensión no debe llamar a la función UpdateNetBufferListDestinations para confirmar los cambios en un paquete con un solo puerto de destino.
Cuando la extensión de reenvío llama a AddNetBufferListDestination o UpdateNetBufferListDestinations para confirmar los cambios en los puertos de destino, la interfaz de conmutador extensible no eliminará los puertos de conmutador extensibles especificados en los elementos de la estructura de NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY . Una vez completada la operación de envío o recepción de paquetes, la interfaz es libre de eliminar el puerto si es necesario.
Nota Una vez que la extensión de reenvío confirma los cambios de los puertos de destino en el contexto de reenvío, no se pueden quitar los puertos de destino y solo se puede cambiar el miembro IsExcluded de la estructura NDIS_SWITCH_PORT_DESTINATION de un puerto de destino. Para obtener más información, vea Excluir la entrega de paquetes a puertos de destino de conmutador extensible.
La extensión de reenvío debe sincronizar su control de las solicitudes de conjunto de identificador de objeto (OID) de OID_SWITCH_NIC_DISCONNECT con su código que agrega puertos de destino para el adaptador de red desconectado.
Si se llama a FilterOidRequest de la extensión de reenvío para una solicitud de OID_SWITCH_NIC_DISCONNECT , la extensión puede realizar una de las siguientes acciones:
Si la extensión llamada NdisFOidRequest reenvía esta solicitud de OID, no debe especificar el puerto con el adaptador de red desconectado como puerto de destino para el paquete.
Nota Si el único puerto de destino del paquete es el que tiene el adaptador de red desconectado, la extensión debe quitar el paquete.
La extensión puede devolver NDIS_STATUS_PENDING para completar la solicitud de forma asincrónica. Esto permite que la extensión agregue el puerto con el adaptador de red desconectado como puerto de destino para el paquete. Esto también permite que la extensión llame a AddNetBufferListDestination o UpdateNetBufferListDestinations y complete la adición de puertos de destino a un paquete.
Es posible que la extensión quiera hacer esto para los paquetes que tiene que reenviar a un puerto antes de que se descomponga.
Nota Si la extensión devuelve NDIS_STATUS_PENDING, también puede llamar a ReferenceSwitchPort para incrementar el contador de referencia del puerto con el adaptador de red desconectado. Sin embargo, la extensión no puede reenviar la solicitud de OID hasta que llame a DereferenceSwitchPort para reducir el contador de referencia del puerto.
Si el número de puertos de destino es cero, la extensión de reenvío debe llamar a NdisMSendNetBufferListsComplete para quitar el paquete. La extensión también debe llamar a ReportFilteredNetBufferLists para notificar a la interfaz de conmutador extensible el paquete descartado.
Nota Si la extensión de reenvío obtuvo una lista vinculada de estructuras de NET_BUFFER_LIST para varios paquetes de la ruta de acceso de datos de entrada, debe crear una lista independiente de paquetes descartados. Al hacerlo, la extensión puede llamar a NdisMSendNetBufferListsComplete y ReportFilteredNetBufferLists una sola vez.
Si el número de puertos de destino es mayor que cero, la extensión de reenvío debe llamar a NdisFSendNetBufferLists para reenviar el paquete a través de la ruta de acceso de datos de entrada al borde de miniporte del conmutador extensible.
Nota Si la extensión de reenvío obtuvo una lista vinculada de estructuras de NET_BUFFER_LIST para varios paquetes de la ruta de acceso de datos de entrada, debe crear una lista independiente de paquetes reenviados. Al hacerlo, la extensión puede llamar a NdisFSendNetBufferLists una vez para reenviar la lista de paquetes. Además, la extensión debe mantener listas independientes para reenviar paquetes que tengan los mismos puertos de destino. Para obtener más información, vea Marcadores de envío y recepción de conmutador extensible de Hyper-V.