Creación de un puerto virtual
Un puerto virtual (VPort) es un objeto de datos que representa un puerto interno en el conmutador NIC de un adaptador de red que admite la virtualización de E/S raíz única (SR-IOV). Cada conmutador NIC tiene los siguientes puertos para la conectividad de red:
Un puerto físico externo para la conectividad a la red física externa.
Una o varias VPort internas que están conectadas a la función física PCI Express (PCIe) o a las funciones virtuales (FV).
El PF está conectado a la partición primaria de Hyper-V y se expone como un adaptador de red virtual en el sistema operativo de administración que se ejecuta en esa partición.
Una VF está conectada a la partición secundaria de Hyper-V y se expone como un adaptador de red virtual en el sistema operativo invitado que se ejecuta en esa partición.
Hay dos tipos de VPorts:
VPort predeterminado
El VPort predeterminado proporciona conectividad de red a los componentes de red que se ejecutan en el sistema operativo de administración. El VPort predeterminado tiene un identificador de NDIS_DEFAULT_VPORT_ID.
Cuando el controlador de minipuerto PF crea y configura el conmutador NIC predeterminado, el controlador crea implícitamente el VPort predeterminado y lo asocia al PF. El VPort predeterminado no se puede asociar a un VF.
El valor predeterminado de VPort siempre está en un estado activado y no se puede eliminar explícitamente. El controlador de minipuerto PF elimina implícitamente el VPort predeterminado solo cuando elimina el conmutador NIC predeterminado.
Para obtener más información sobre cómo crear un conmutador NIC y el VPort predeterminado en el conmutador, consulte Creating a NIC Switch.
VPort no predeterminado
Las VPort no predeterminadas no se crean implícitamente cuando se crea el conmutador NIC. Un controlador de sobreslización, como la pila de virtualización, crea explícitamente estos puertos mediante la emisión de solicitudes de método OID de OID_NIC_SWITCH_CREATE_VPORT. Las VPorts no predeterminadas se pueden conectar al PF o a un VF, y solo se pueden crear después de crear el conmutador NIC.
Un VPort no predeterminado que está conectado a un VF proporciona conectividad de red a los componentes de red que se ejecutan en el sistema operativo invitado. Una vez creado y conectado al VF, el VPort no predeterminado se encuentra en un estado activado.
Un VPort no predeterminado que está conectado al PF proporciona funcionalidades adicionales de descarga de red a los componentes de red que se ejecutan en el sistema operativo de administración. Por ejemplo, VPorts no predeterminados en el PF se podría usar para proporcionar funcionalidades de descarga similares a la interfaz de la cola de máquinas virtuales (VMQ).
Nota Las VPorts no predeterminadas solo se pueden crear después de crear el modificador de NIC.
Un controlador excesivo emite una solicitud de método de identificador de objeto (OID) de OID_NIC_SWITCH_CREATE_VPORT para crear un VPort no predeterminado en un conmutador NIC especificado. Esta solicitud de OID también asocia la VPort creada al PF del adaptador de red o a una VF asignada anteriormente.
El miembro InformationBuffer de la estructura NDIS_OID_REQUEST contiene un puntero a la estructuraNDIS_NIC_SWITCH_VPORT_PARAMETERS . Después de una devolución correcta de la solicitud de OID_NIC_SWITCH_CREATE_VPORT , el miembro VPortId de la estructura NDIS_NIC_SWITCH_VPORT_PARAMETERS tiene un identificador VPort que es único en las VPorts en el conmutador NIC.
El controlador de sobreaprovisionamiento inicializa la estructura de NDIS_NIC_SWITCH_VPORT_PARAMETERS con la información de configuración sobre el VPort no predeterminado que se va a crear. La información de configuración incluye la función PCIe a la que se adjunta el VPort no predeterminado y el número de pares de cola para el VPort no predeterminado.
Cuando inicializa la estructura de NDIS_NIC_SWITCH_VPORT_PARAMETERS , el controlador de sobreaprovisionamiento debe hacer lo siguiente:
El miembro SwitchId debe establecerse en el identificador de un conmutador NIC que se creó anteriormente en el adaptador de red a través de una solicitud de método OID de OID_NIC_SWITCH_CREATE_SWITCH.
Nota A partir de Windows Server 2012, la interfaz SR-IOV solo admite un conmutador NIC en el adaptador de red. Este modificador se conoce como el conmutador NIC predeterminado. Al crear un VPort no predeterminado, el controlador sobreaplicado debe establecer el miembro SwitchId en el identificador NDIS_DEFAULT_SWITCH_ID.
El miembro VPortId debe establecerse en NDIS_DEFAULT_VPORT_ID.
El miembro AttachedFunctionId debe establecerse en el identificador del VF o PF en el que se va a adjuntar el VPort no predeterminado.
Un valor de NDIS_PF_FUNCTION_ID especifica el PF. De lo contrario, el valor debe establecerse en el identificador de un VF cuyos recursos se asignaron previamente a través de una solicitud de método OID de OID_NIC_SWITCH_ALLOCATE_VF.
Nota Los datos adjuntos de un VPort no predeterminado a un VF o PF no se pueden cambiar después de crear el VPort no predeterminado.
El controlador sobreasignado también puede especificar el número de pares de cola asignados a VPort. Un par de colas es una cola de transmisión y recepción en el adaptador de red que se asigna a VPort. Si el adaptador de red admite pares de cola asimétricas para VPorts no predeterminados, el controlador sobreaplicado puede especificar un número diferente de pares de cola para cada VPort que cree el controlador. Para obtener más información, vea Asignación simétrica y asimétrica de pares de cola.
El controlador de sobreslización llama a NdisOidRequest para emitir la solicitud de OID_NIC_SWITCH_CREATE_VPORT al controlador de miniporte PF subyacente. Antes de que NDIS reenvíe la solicitud del método OID al controlador de minipuerto, hace lo siguiente:
NDIS valida los parámetros dentro de la estructura NDIS_NIC_SWITCH_VPORT_PARAMETERS . Si los parámetros están en error, NDIS produce un error en la solicitud del método OID y no pasa la solicitud al controlador de miniporte PF.
NDIS asigna un identificador para el VPort no predeterminado dentro del intervalo de uno a (NumVPorts– 1), donde NumVPorts es el número de VPorts que el controlador de minipuerto ha configurado en el adaptador de red. El controlador especifica este número en el miembro NumVPorts de la estructura NDIS_NIC_SWITCH_INFO . El controlador devuelve esta estructura a través de una solicitud de consulta OID de OID_NIC_SWITCH_ENUM_SWITCHES.
Nota Un identificador VPort de NDIS_DEFAULT_VPORT_ID está reservado para el VPort predeterminado que está asociado al PF en el conmutador NIC predeterminado.
El identificador VPort asignado identifica de forma única el VPort no predeterminado en el conmutador NIC del adaptador de red.
- NDIS establece el miembro VPortId de la estructura NDIS_NIC_SWITCH_VPORT_PARAMETERS con el identificador VPort asignado.
Cuando el controlador de minipuerto PF emite la solicitud OID, el controlador asigna los recursos de hardware y software asociados con el VPort no predeterminado especificado. Una vez asignados correctamente todos los recursos, el controlador de miniporte PF completa correctamente el OID devolviendo NDIS_STATUS_SUCCESS de MiniportOidRequest.
Si la solicitud de OID_NIC_SWITCH_CREATE_VPORT se completa correctamente, el controlador de minipuerto PF y el controlador de sobreaprovisionamiento deben conservar el valor VPortId del VPort no predeterminado para las operaciones sucesivas. El valor VPortId se usa durante estas operaciones:
NDIS y los controladores de sobrescalación usan el valor VPortId para identificar el VPort no predeterminado en solicitudes de OID sucesivas relacionadas con este VPort, como OID_NIC_SWITCH_VPORT_PARAMETERS y OID_NIC_SWITCH_DELETE_VPORT.
Durante las operaciones de envío, NDIS especifica el valor VPortId para identificar el VPort desde el que se envió un paquete. Este valor se especifica dentro de los datos fuera de banda (OOB) NDIS_NET_BUFFER_LIST_FILTERING_INFO de la estructura NET_BUFFER_LIST .
Durante las operaciones de recepción, el controlador de minipuerto PF especifica el valor VPortId al que se va a reenviar un paquete. Este valor también se especifica en los datos de OOB NDIS_NET_BUFFER_LIST_FILTERING_INFO de la estructura de NET_BUFFER_LIST .
Los siguientes puntos se aplican a la creación de VPorts no predeterminados:
Los filtros de recepción para el control de acceso multimedia (MAC) y los identificadores de LAN virtual (VLAN) se configuran en VPort una vez creado. Para establecer estos filtros de recepción de forma excesiva, los controladores se establecen dinámicamente mediante la emisión de solicitudes de método de OID de OID_RECEIVE_FILTER_SET_FILTER. Los filtros de recepción también se pueden mover de un VPort a otro mediante solicitudes de conjunto de OID de OID_RECEIVE_FILTER_MOVE_FILTER.
Una VPort no predeterminada conectada al VF se encuentra en un estado activado cuando se crea. No se puede desactivar VPort si está conectado al VF.
Una VPort no predeterminada conectada al PF se encuentra en un estado desactivado cuando se crea. Un controlador de exceso, como el módulo de conmutador extensible de Hyper-V, activa explícitamente el VPort no predeterminado conectado al PF después de que VPort se haya creado correctamente. Para ello, se emite una solicitud de método OID de OID_NIC_SWITCH_VPORT_PARAMETERS al controlador de miniporte PF.
Cuando el controlador sobreajuste esta solicitud de OID, pasa una estructura de NDIS_NIC_SWITCH_VPORT_PARAMETERS con el miembro VPortState establecido en NdisNicSwitchVPortStateActivated.
Después de que un VPort no predeterminado se encuentra en un estado activado, el controlador de miniport pf puede asignar memoria compartida para VPort llamando a NdisAllocateSharedMemory. El controlador debe establecer el miembro VPortId en la estructura NDIS_SHARED_MEMORY_PARAMETERS en el valor de identificador de VPort.
Nota Cuando un VPort no predeterminado está en un estado activado, solo se establece en un estado desactivado cuando se elimina a través de una solicitud de conjunto de OID de OID_NIC_SWITCH_DELETE_VPORT.