Gerenciar dados de runtime do Comutador Extensível Hyper-V

Este tópico descreve as operações de salvamento e restauração para extensões do Comutador Extensível Hyper-V. Essas operações permitem que uma extensão salve e restaure dados de runtime para adaptadores de rede de Comutadores Extensíveis (NICs) individuais. Essas operações são executadas quando uma partição filho do Hyper-V que tem uma conexão de adaptador de rede com uma porta de comutador extensível está sendo interrompida ou iniciada.

Salvar dados de runtime do Comutador Extensível Hyper-V

Esta seção descreve a operação pela qual uma extensão do Comutador Extensível Hyper-V pode salvar dados em runtime para adaptadores de rede (NICs) individuais. Essa operação é executada quando uma partição filho do Hyper-V com uma conexão de adaptador de rede com uma porta de comutador extensível está sendo interrompida ou seu estado está sendo salvo.

Tratar a solicitação de OID_SWITCH_NIC_SAVE

Quando uma partição filho do Hyper-V com uma conexão de adaptador de rede com uma porta de comutador extensível é interrompida ou seu estado é salvo, a interface de comutador extensível do Hyper-V é notificada. Isso faz com que a borda do protocolo do comutador extensível emita uma solicitação de método de identificador de objeto (OID) de OID_SWITCH_NIC_SAVE na pilha do driver do comutador extensível. Quando uma extensão de comutador extensível recebe essa solicitação OID, ela pode salvar seus dados de runtime para a conexão de adaptador de rede especificada que está conectada à partição filho.

O membro InformationBuffer da estrutura NDIS_OID_REQUEST da solicitação OID_SWITCH_NIC_SAVE contém um ponteiro para uma estrutura NDIS_SWITCH_NIC_SAVE_STATE. Essa estrutura é alocada pela borda do protocolo do comutador extensível e inicializada assim:

  • O membro Header é inicializado para conter o tipo atual, a revisão da estrutura NDIS_SWITCH_NIC_SAVE_STATE. O tamanho é definido como o tamanho total do buffer.

  • O membro PortId contém o identificador exclusivo da porta do comutador extensível para a qual a operação de salvamento está sendo executada.

Quando recebe a solicitação de método OID_SWITCH_NIC_SAVE, a extensão faz o seguinte:

  1. A extensão lê o membro PortId da estrutura NDIS_SWITCH_NIC_SAVE_STATE.

  2. Se a extensão tiver dados de runtime para salvar para a NIC especificada, ela salvará seus dados dentro da estrutura NDIS_SWITCH_NIC_SAVE_STATE começando com bytes de SaveDataOffset desde o início da estrutura. Em seguida, a extensão conclui a solicitação do método OID com NDIS_STATUS_SUCCESS.

  3. Se a estrutura NDIS_SWITCH_NIC_SAVE_STATE não fornecer um buffer suficiente para manter o estado de runtime, a extensão definirá o campo BytesNeeded da estrutura do método como NDIS_SIZEOF_NDIS_SWITCH_NIC_SAVE_STATE_REVISION_1 mais a quantidade de buffer necessária para manter os dados salvos e conclui o OID com NDIS_STATUS_BUFFER_TOO_SHORT. O OID será reemitido com o tamanho necessário.

  4. Se a extensão não tiver dados de runtime para salvar para a NIC especificada, ela deverá chamar NdisFOidRequest. Isso encaminha a solicitação do método OID para drivers subjacentes na pilha do driver de comutador extensível. Para obter mais informações sobre esse procedimento, consulte Filtrar solicitações OID em um driver de filtro NDIS.

Se a extensão tiver dados de porta de runtime para salvar, ela deverá seguir estas diretrizes ao salvar dados de porta de runtime dentro da estrutura NDIS_SWITCH_NIC_SAVE_STATE structure:

  1. A extensão define o membro ExtensionId para o valor de GUID que identifica exclusivamente o driver.

  2. A extensão define o membro ExtensionFriendlyName para o nome do driver.

    Observação O tipo de dado NDIS_SWITCH_EXTENSION_FRIENDLYNAME é definido pelo tipo pela estrutura IF_COUNTED_STRING. Uma cadeia de caracteres definida por essa estrutura não precisa ter terminação nula. No entanto, o comprimento da cadeia de caracteres deve ser definido no membro Length dessa estrutura. Se a cadeia de caracteres for terminada em NULL, o membro Length não deverá incluir o caractere NULL de encerramento.

  3. Se uma classe de recurso estiver associada aos dados de tempo de execução salvos, a extensão definirá o FeatureClassId com o GUID que identifica exclusivamente a classe.

    Observação Se uma classe de recurso não estiver associada aos dados de runtime salvos, a extensão definirá o FeatureClassId como zero.

  4. A extensão copia os dados de runtime para o membro SaveData e define o membro SaveDataSize para o tamanho, em bytes, dos dados de runtime.

Observação A extensão não deve alterar os membros Header ou PortId da estrutura NDIS_SWITCH_NIC_SAVE_STATE.

As solicitações do método OID de OID_SWITCH_NIC_SAVE são tratadas pela borda de miniporta subjacente do comutador extensível. Depois que essa solicitação de método OID tiver sido encaminhada para o driver de miniporta por meio da pilha de driver do comutador extensível, o driver de miniporta concluirá a solicitação OID com NDIS_STATUS_SUCCESS. Isso notifica a borda de protocolo do comutador extensível de que todas as extensões na pilha do driver do comutador extensível foram consultadas para obter dados de porta em runtime. A borda do protocolo do comutador extensível emite uma solicitação de conjunto OID de OID_SWITCH_NIC_SAVE_COMPLETE para concluir a operação de salvamento.

Tratar a solicitação de OID_SWITCH_NIC_SAVE_COMPLETE

Quando uma partição filho do Hyper-V que tem uma conexão de adaptador de rede com uma porta de comutador extensível é pausada ou seu estado está sendo salvo, a interface de comutador extensível do Hyper-V é notificada. Isso faz com que a borda do protocolo do comutador extensível emita uma solicitação de método de identificador de objeto (OID) de OID_SWITCH_NIC_SAVE na pilha do driver do comutador extensível.

Quando cada extensão do Comutador Extensível Hyper-V tiver salvo seus dados de runtime, a borda de protocolo do comutador extensível notificará as extensões subjacentes de que a operação de salvamento foi concluída. A borda do protocolo faz isso emitindo uma solicitação de conjunto OID do OID_SWITCH_NIC_SAVE_COMPLETE na pilha do driver do comutador extensível.

Observação Quando uma operação de salvamento em runtime é iniciada para uma conexão de adaptador de rede do comutador extensível, outra operação de salvamento para a mesma conexão de adaptador de rede não será executada até que a solicitação OID_SWITCH_NIC_SAVE_COMPLETE seja emitida. No entanto, operações de salvamento de outras conexões de adaptador de rede podem ocorrer durante esse tempo.

O membro InformationBuffer da estrutura NDIS_OID_REQUEST da solicitação OID_SWITCH_NIC_SAVE_COMPLETE contém um ponteiro para uma estrutura NDIS_SWITCH_NIC_SAVE_STATE. Essa estrutura é alocada pela borda do protocolo do comutador extensível.

Quando ela recebe a solicitação de conjunto OID de OID_SWITCH_NIC_SAVE_COMPLETE, a extensão deve seguir estas diretrizes:

  • A extensão não deve modificar a estrutura de NDIS_SWITCH_NIC_SAVE_STATE associada à solicitação OID.

  • A extensão deve chamar NdisFOidRequest para encaminhar essa solicitação OID pela pilha de extensão do comutador extensível. A extensão não deve fazer com que a solicitação OID falhe.

    Observação A extensão deve monitorar o status de conclusão desta solicitação OID. A extensão faz isso para detectar se a operação de salvamento foi concluída com êxito.

As solicitações do método OID de OID_SWITCH_NIC_SAVE_COMPLETE são tratadas pela borda de miniporta subjacente do comutador extensível. Depois que essa solicitação do método OID for recebida pela borda da miniporta, ela concluirá a solicitação OID com NDIS_STATUS_SUCCESS. Isso notifica a borda do protocolo do comutador extensível que todas as extensões na pilha do driver do comutador extensível concluíram a operação de salvamento.

Restaurar dados de runtime do Comutador Extensível Hyper-V

Quando uma partição filho do Hyper-V que tem uma conexão de adaptador de rede com uma porta de comutador extensível é retomada de uma pausa, a interface de comutador extensível do Hyper-V é notificada. Isso faz com que a borda do protocolo do comutador extensível emita uma solicitação de conjunto de identificador de objeto (OID) de OID_SWITCH_NIC_RESTORE na pilha do driver do comutador extensível. Quando uma extensão recebe essa solicitação OID, ela pode restaurar seus dados de runtime para a porta do comutador extensível usada pela partição filho.

O membro InformationBuffer da estrutura NDIS_OID_REQUEST da solicitação OID_SWITCH_NIC_RESTORE contém um ponteiro para uma estrutura NDIS_SWITCH_NIC_SAVE_STATE. Essa estrutura é alocada pela borda do protocolo do comutador extensível.

Quando recebe a solicitação de conjunto OID do OID_SWITCH_NIC_RESTORE, a extensão do comutador extensível deve primeiro determinar se ele possui os dados de runtime. A extensão faz isso comparando o valor do membro ExtensionId da estrutura NDIS_SWITCH_NIC_SAVE_STATE do valor do GUID que a extensão usa para se identificar.

Se a extensão possuir os dados de runtime de uma NIC de comutador extensível, ela irá restaurar esses dados assim:

  1. A extensão copia os dados de runtime no membro SaveData para o armazenamento alocado pelo driver.

    Observação O valor do membro PortId da estrutura NDIS_SWITCH_NIC_SAVE_STATE pode ser diferente do valor PortId no momento em que os dados de runtime foram salvos. Isso pode ocorrer se os dados de runtime foram salvos durante uma migração dinâmica de um host para outro. No entanto, a configuração da NIC do comutador extensível é mantida durante a migração dinâmica. Isso permite que a extensão restaure os dados de runtime da NIC do comutador extensível usando o novo valor PortId.

  2. A extensão conclui a solicitação de conjunto OID com NDIS_STATUS_SUCCESS.

Se a extensão não possuir os dados de runtime especificados para serem salvos, a extensão chamará NdisFOidRequest. Isso encaminha a solicitação do conjunto OID para drivers subjacentes na pilha do driver de comutador extensível. Nesse caso, a extensão não deve modificar a estrutura de NDIS_SWITCH_NIC_SAVE_STATE associada à solicitação OID. Para obter mais informações sobre como encaminhar solicitações OID, consulte Filtrar solicitações OID em um driver de filtro NDIS.

Se a solicitação de conjunto OID do OID_SWITCH_NIC_RESTORE for concluída com NDIS_STATUS_SUCCESS, a borda do protocolo do comutador extensível emitirá outra solicitação de conjunto OID. Quando ele recebe essa nova solicitação de conjunto OID, a extensão pode fazer o seguinte:

  • Se ele possuir os dados de runtime na nova solicitação OID, a extensão irá restaurar os dados de runtime adicionais dentro da estrutura NDIS_SWITCH_NIC_SAVE_STATE. Então, a extensão conclui a solicitação OID com NDIS_STATUS_SUCCESS.

  • Se ela não tem os dados de runtime na nova solicitação OID, a extensão chama NdisFOidRequest para encaminhar essa solicitação de conjunto OID aos drivers subjacentes.

OID_SWITCH_NIC_RESTORE_COMPLETE
A interface do comutador extensível sinaliza a borda do protocolo do comutador extensível para emitir esse OID na conclusão da operação de restauração dos dados de runtime para um adaptador de rede do comutador extensível.

Essa solicitação OID notifica a extensão que a operação de restauração foi concluída somente para uma NIC do comutador extensível especificada.

Para obter mais informações sobre essa solicitação OID, consulte OID_SWITCH_NIC_RESTORE_COMPLETE.

Observação Se a solicitação de conjunto do OID_SWITCH_NIC_RESTORE for recebida pela borda de miniporta do comutador extensível, ela concluirá a solicitação OID com NDIS_STATUS_SUCCESS. Isso notifica a borda do protocolo do comutador extensível que nenhuma extensão possui os dados de runtime. Se isso acontecer, a interface do comutador extensível registrará um evento que documenta os valores de membro ExtensionId e PortId para a extensão que salvou originalmente os dados da porta de runtime.