Общие сведения о политиках расширяемого коммутатора Hyper-V

Платформа Hyper-V и расширяемый интерфейс коммутатора предоставляют инфраструктуру для управления политиками коммутаторов и портов для расширяемого коммутатора. Эти политики управляются с помощью командлетов PowerShell и программ приложений на основе инструментария WMI. Эта инфраструктура также обеспечивает поддержку хранения и миграции политик.

Независимые поставщики программного обеспечения (ISV) могут использовать эту инфраструктуру для регистрации собственных пользовательских политик. После регистрации эти политики можно обнаруживать и управлять ими с помощью встроенных интерфейсов политик Hyper-V. Свойства политик можно настроить как на уровне порта, так и на уровне коммутатора.

Помимо настраиваемых свойств политики, интерфейс расширяемого коммутатора Hyper-V предоставляет инфраструктуру для получения сведений о состоянии настраиваемых свойств политики для каждого порта или каждого коммутатора. Эти сведения о состоянии называются сведениями о состоянии компонентов .

Данные настраиваемой политики расширяемого коммутатора регистрируются на уровне управления WMI с помощью определений классов формата управляемых объектов (MOF). Ниже показан пример класса MOF для настраиваемого свойства политики портов.

#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[] = {};

};

Уровень управления WMI сериализует данные MOF при их передаче в базовое расширение расширяемого коммутатора. Класс MOF сериализуется в соответствующую структуру C, которую можно обработать расширением расширяемого коммутатора Hyper-V. Ниже показан пример структуры C, которая была сериализована для класса MOF из предыдущего примера.

#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;

В этом примере выделяются следующие моменты, возникающие при сериализации класса MOF в соответствующую структуру C для свойства политики расширяемого коммутатора:

  • Определение версии в MOF-файлах преобразуется в значение USHORT, где биты высокого порядка содержат основную версию, а биты нижнего порядка содержат дополнительную версию. Версия сериализуется с помощью следующего кода:

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

    Например, версия("1") выше будет сериализована со значением 0x0100 через (((1) << 8) + (0)). Версия ("1.1") будет сериализована со значением 0x0101 через (((1) << 8) + (1)).

    При выдаче настраиваемого свойства политики базовому расширению элемент PropertyVersion структур, определяющих свойства политики, содержит значение сериализованной версии.

    Например, когда интерфейс расширяемого коммутатора отправляет запрос идентификатора объекта (OID) OID_SWITCH_PORT_PROPERTY_ADD, OID связывается со структурой NDIS_SWITCH_PORT_PROPERTY_PARAMETERS . Элемент PropertyVersion этой структуры содержит значение сериализованной версии.

  • Все строки переменной длины сериализуются в смещения в буфере, который содержит сериализованную структуру C. Каждая строка переменной длины форматируется как VARIABLE_LENGTH_STRING структура в пределах этого смещения буфера.