Criando uma porta virtual

Uma VPort (porta virtual) é um objeto de dados que representa uma porta interna no comutador NIC de um adaptador de rede que dá suporte à SR-IOV (virtualização de E/S de raiz única). Cada comutador NIC tem as seguintes portas para conectividade de rede:

  • Uma porta física externa para conectividade com a rede física externa.

  • Uma ou mais VPorts internas que estão conectadas à PF (Função Física) PCI Express (PCIe) ou VFs (Funções Virtuais).

    O PF é anexado à partição pai do Hyper-V e é exposto como um adaptador de rede virtual no sistema operacional de gerenciamento executado nessa partição.

    Uma VF é anexada à partição filho do Hyper-V e é exposta como um adaptador de rede virtual no sistema operacional convidado que é executado nessa partição.

Há dois tipos de VPorts:

VPort padrão
O VPort padrão fornece conectividade de rede para os componentes de rede executados no sistema operacional de gerenciamento. O VPort padrão tem um identificador de NDIS_DEFAULT_VPORT_ID.

Quando o driver de miniporto PF cria e configura o comutador NIC padrão, o driver cria implicitamente o VPort padrão e o anexa ao PF. O VPort padrão não pode ser anexado a uma VF.

O VPort padrão está sempre em um estado ativado e não pode ser excluído explicitamente. O driver de miniporto PF exclui implicitamente o VPort padrão somente quando exclui o comutador NIC padrão.

Para obter mais informações sobre como criar um comutador NIC e o VPort padrão na opção , consulte Criando um comutador NIC.

VPort não padrão
VPorts não padrão não são criados implicitamente quando a opção NIC é criada. Um driver sobreposto, como a pilha de virtualização, cria explicitamente essas portas emitindo solicitações de método OID de OID_NIC_SWITCH_CREATE_VPORT. VPorts não padrão podem ser anexados ao PF ou a um VF e só podem ser criados após a criação da opção NIC.

Um VPort não padrão anexado a uma VF fornece conectividade de rede com os componentes de rede executados no sistema operacional convidado. Depois que ele é criado e anexado ao VF, o VPort não padrão está em um estado ativado.

Um VPort não padrão anexado ao PF fornece recursos adicionais de descarregamento de rede para os componentes de rede executados no sistema operacional de gerenciamento. Por exemplo, VPorts não padrão no PF podem ser usados para fornecer recursos de descarregamento semelhantes à interface VMQ (fila de máquina virtual).

Nota VPorts não padrão só podem ser criados após a criação da opção NIC.

Um driver sobreposto emite uma solicitação de método OID (identificador de objeto) de OID_NIC_SWITCH_CREATE_VPORT para criar um VPort não padrão em um comutador NIC especificado. Essa solicitação OID também anexa o VPort criado ao PF do adaptador de rede ou a um VF alocado anteriormente.

O membro InformationBuffer da estrutura NDIS_OID_REQUEST contém um ponteiro para a estruturaNDIS_NIC_SWITCH_VPORT_PARAMETERS . Após um retorno bem-sucedido da solicitação OID_NIC_SWITCH_CREATE_VPORT , o membro VPortId da estrutura NDIS_NIC_SWITCH_VPORT_PARAMETERS tem um identificador VPort exclusivo entre as VPorts na opção NIC.

O driver de sobreposição inicializa a estrutura NDIS_NIC_SWITCH_VPORT_PARAMETERS com as informações de configuração sobre o VPort não padrão a ser criado. As informações de configuração incluem a função PCIe à qual o VPort não padrão está anexado e o número de pares de fila para o VPort não padrão.

Quando inicializa a estrutura de NDIS_NIC_SWITCH_VPORT_PARAMETERS , o driver sobresso excesso deve fazer o seguinte:

  • O membro SwitchId deve ser definido como o identificador de um comutador NIC que foi criado anteriormente no adaptador de rede por meio de uma solicitação de método OID de OID_NIC_SWITCH_CREATE_SWITCH.

    Nota Começando com Windows Server 2012, a interface SR-IOV dá suporte a apenas uma opção NIC no adaptador de rede. Essa opção é conhecida como a opção NIC padrão. Ao criar um VPort não padrão, o driver sobreposto deve definir o membro SwitchId como o identificador NDIS_DEFAULT_SWITCH_ID.

  • O membro VPortId deve ser definido como NDIS_DEFAULT_VPORT_ID.

  • O membro AttachedFunctionId deve ser definido como o identificador do VF ou PF no qual o VPort não padrão deve ser anexado.

    Um valor de NDIS_PF_FUNCTION_ID especifica o PF. Caso contrário, o valor deve ser definido como o identificador de uma VF cujos recursos foram alocados anteriormente por meio de uma solicitação de método OID de OID_NIC_SWITCH_ALLOCATE_VF.

    Nota O anexo de um VPort não padrão para uma VF ou PF não pode ser alterado após a criação do VPort não padrão.

O driver de sobreposição também pode especificar o número de pares de fila atribuídos ao VPort. Um par de filas é uma fila de transmissão e recebimento no adaptador de rede atribuído ao VPort. Se o adaptador de rede der suporte a pares de filas assimétricas para VPorts não padrão, o driver sobressalente poderá especificar um número diferente de pares de fila para cada VPort que o driver cria. Para obter mais informações, consulte Atribuição simétrica e assimétrica de pares de fila.

O driver subjacente chama NdisOidRequest para emitir a solicitação de OID_NIC_SWITCH_CREATE_VPORT para o driver de miniporto PF subjacente. Antes que o NDIS encaminhe a solicitação do método OID para o driver de miniporta, ele faz o seguinte:

  1. O NDIS valida os parâmetros dentro da estrutura NDIS_NIC_SWITCH_VPORT_PARAMETERS . Se os parâmetros estiverem com erro, o NDIS falhará na solicitação do método OID e não passará a solicitação para o driver de miniporto PF.

  2. O NDIS atribui um identificador para o VPort não padrão dentro do intervalo de um a (NumVPorts – 1), em que NumVPorts é o número de VPorts que o driver de miniporto configurou no adaptador de rede. O driver especifica esse número no membro NumVPorts da estrutura NDIS_NIC_SWITCH_INFO . O driver retorna essa estrutura por meio de uma solicitação de consulta OID de OID_NIC_SWITCH_ENUM_SWITCHES.

    Nota Um identificador VPort de NDIS_DEFAULT_VPORT_ID é reservado para o VPort padrão anexado ao PF na opção NIC padrão.

O identificador VPort atribuído identifica exclusivamente o VPort não padrão na opção NIC do adaptador de rede.

  1. O NDIS define o membro VPortId da estrutura NDIS_NIC_SWITCH_VPORT_PARAMETERS com o identificador VPort atribuído.

Quando o driver de miniporto PF é emitido a solicitação OID, o driver aloca os recursos de hardware e software associados ao VPort não padrão especificado. Depois que todos os recursos são alocados com êxito, o driver de miniporto PF conclui o OID com êxito retornando NDIS_STATUS_SUCCESS de MiniportOidRequest.

Se a solicitação de OID_NIC_SWITCH_CREATE_VPORT for concluída com êxito, o driver de miniporto PF e o driver sobreposto deverão manter o valor VPortId do VPort não padrão para operações sucessivas. O valor VPortId é usado durante estas operações:

Os seguintes pontos se aplicam à criação de VPorts não padrão:

  • Os filtros de recebimento para mac (controle de acesso à mídia) e identificadores de VLAN (LAN virtual) são configurados no VPort depois que ele foi criado. Os drivers em excesso definem dinamicamente esses filtros de recebimento emitindo solicitações de método OID de OID_RECEIVE_FILTER_SET_FILTER. Os filtros de recebimento também podem ser movidos de um VPort para outro por meio de solicitações de conjunto OID de OID_RECEIVE_FILTER_MOVE_FILTER.

  • Um VPort não padrão anexado ao VF está em um estado ativado quando é criado. O VPort não poderá ser desativado se estiver anexado ao VF.

    Um VPort não padrão anexado ao PF está em um estado desativado quando é criado. Um driver de sobreposição, como o módulo de comutador extensível do Hyper-V, ativa explicitamente o VPort não padrão anexado ao PF depois que o VPort foi criado com êxito. Isso é feito emitindo uma solicitação de método OID de OID_NIC_SWITCH_VPORT_PARAMETERS para o driver de miniporto PF.

    Quando o driver sobreposto emite essa solicitação OID, ele passa uma estrutura NDIS_NIC_SWITCH_VPORT_PARAMETERS com o membro VPortState definido como NdisNicSwitchVPortStateActivated.

    Depois que um VPort não padrão estiver em um estado ativado, o driver de miniporto PF poderá alocar memória compartilhada para o VPort chamando NdisAllocateSharedMemory. O driver deve definir o membro VPortId na estrutura NDIS_SHARED_MEMORY_PARAMETERS para o valor do identificador do VPort.

Nota Quando um VPort não padrão está em um estado ativado, ele só é definido como um estado desativado quando é excluído por meio de uma solicitação de conjunto OID de OID_NIC_SWITCH_DELETE_VPORT.