Visão geral das políticas de comutador extensível do Hyper-V

A plataforma Hyper-V e a interface de comutador extensível fornecem uma infraestrutura para gerenciar políticas de comutador e porta para um comutador extensível. Essas políticas são gerenciadas por meio de cmdlets do PowerShell e programas de aplicativos baseados em WMI. Essa infraestrutura também oferece suporte para o armazenamento e a migração de políticas.

Os ISVs (fornecedores independentes de software) podem usar essa infraestrutura para registrar suas próprias políticas personalizadas. Depois de registradas, essas políticas podem ser descobertas e gerenciadas por meio das interfaces de política internas do Hyper-V. As propriedades das políticas podem ser configuradas em um nível por porta ou em um nível por comutador.

Além das propriedades de política personalizadas, a interface de comutador extensível do Hyper-V fornece a infraestrutura para obter informações de status para propriedades de política personalizadas por porta ou por comutador. Essas informações status são conhecidas como informações de status de recursos.

Os dados de política personalizada do comutador extensível são registrados com a camada de gerenciamento WMI usando definições de classe MOF (formato de objeto gerenciado). A seguir, mostra um exemplo de uma classe MOF para uma propriedade de política de porta personalizada.

#pragma namespace("\\\\.\\root\\virtualization\\v2")

[ Dynamic, 
 UUID("F2F73F23-2B8E-457a-96C4-F541201C9150"),
 ExtensionId("5CBF81BE-5055-47CD-9055-A76B2B4E369E"), 
 Provider("VmmsWmiInstanceAndMethodProvider"), 
 Locale(0x409),
 InterfaceVersion("1"),
 InterfaceRevision("0"),
DisplayName("VendorName Port Settings Friendly Name") : Amended,
Description("VendorName Port Settings detailed description.") : Amended]
class Vendor_SampleFeatureSettingData: Msvm_EthernetSwitchPortFeatureSettingDataMsvm
{
  [WmiDataId(1),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint8  IntValue8 = 0;

  [WmiDataId(2),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint16 IntValue16 = 0;

  [WmiDataId(3),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint32 IntValue32 = 0;

  [WmiDataId(4),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint64 IntValue64 = 0;

  [WmiDataId(5),
   InterfaceVersion("1"),
   InterfaceRevision("0"), 
   MaxLen(255)]
  string FixedLengthString = "";

  [WmiDataId(6),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  string VariableLengthString = "";

  [WmiDataId(7),
   InterfaceVersion("1"),
   InterfaceRevision("0"),
   Max(8)]
  uint32 FixedLengthArray[] = {};

  [WmiDataId(8),
   InterfaceVersion("1"),
   InterfaceRevision("0")]
  uint32 VariableLengthArray[] = {};

};

A camada de gerenciamento WMI serializa os dados MOF quando eles são transferidos para uma extensão de comutador extensível subjacente. A classe MOF é serializada para uma estrutura C correspondente que pode ser processada pela extensão de comutador extensível do Hyper-V. O exemplo a seguir mostra um exemplo da estrutura C que foi serializada para a classe MOF do exemplo anterior.

#pragma pack(8)

typedef struct _VARIABLE_LENGTH_ARRAY
{
    UINT32 Buffer[1];
} VARIABLE_LENGTH_ARRAY;

typedef struct _SAMPLE_FEATURE_SETTINGS
{
    UINT8  IntValue8;
    UINT32 IntValue16;
    UINT32 IntValue32;
    UINT64 IntValue64;
    UINT16 FixedLengthStringByteCount;
    WCHAR  FixedLengthString[256]; 
    UINT32 VariableLengthStringOffset;    // offset to VARIABLE_LENGTH_STRING structure
    UINT32 FixedLengthArrayElementCount;
    UINT32 FixedLengthArray[8];
    UINT32 VariableLengthArrayElementCount;
    UINT32 VariableLengthArrayOffset;   // offset to VARIABLE_LENGTH_ARRAY
} SAMPLE_FEATURE_SETTINGS;
 
typedef struct _VARIABLE_LENGTH_STRING
{
    USHORT StringLength;
    WCHAR  StringBuffer[1];
} VARIABLE_LENGTH_STRING;

Este exemplo realça os seguintes pontos que ocorrem quando uma classe MOF é serializada para uma estrutura C correspondente para uma propriedade de política de comutador extensível:

  • A definição de versão em arquivos MOF é convertida em um valor USHORT, em que os bits de alta ordem contêm a versão principal e os bits de baixa ordem contêm a versão secundária. A versão é serializada usando o seguinte código:

    (((MajorVersion) << 8) + (MinorVersion))

    Por exemplo, Version("1") acima seria serializado para um valor de 0x0100 por meio de (((1) << 8) + (0)). A versão ("1.1") seria serializada para um valor de 0x0101 por meio (((1) << 8) + (1))de .

    Quando uma propriedade de política personalizada é emitida para uma extensão subjacente, o membro PropertyVersion das estruturas que definem propriedades de política contém o valor de versão serializada.

    Por exemplo, quando a interface do comutador extensível emite uma solicitação de OID (identificador de objeto) de OID_SWITCH_PORT_PROPERTY_ADD, o OID é associado a uma estrutura de NDIS_SWITCH_PORT_PROPERTY_PARAMETERS . O membro PropertyVersion dessa estrutura contém o valor da versão serializada.

  • Todas as cadeias de caracteres de comprimento variável são serializadas em deslocamentos dentro do buffer que contém a estrutura C serializada. Cada cadeia de caracteres de comprimento variável é formatada como uma estrutura VARIABLE_LENGTH_STRING dentro desse deslocamento de buffer.