Hyper-V 可扩展交换机策略概述

Hyper-V 平台和可扩展交换机接口提供基础结构来管理可扩展交换机的交换机和端口策略。 这些策略通过 PowerShell cmdlet 和基于 WMI 的应用程序程序进行管理。 此基础结构还为策略的存储和迁移提供支持。

独立软件供应商 (ISV) 可以使用此基础结构来注册自己的自定义策略。 注册后,可以通过内置的 Hyper-V 策略接口发现和管理这些策略。 可以在每个端口级别或按交换机级别配置策略的属性。

除了自定义策略属性之外,Hyper-V 可扩展交换机接口还提供基础结构,用于基于每个端口或每个交换机获取自定义策略属性的状态信息。 此状态信息称为 功能状态 信息。

可扩展交换机自定义策略数据通过使用托管对象格式 (MOF) 类定义注册到 WMI 管理层。 下面显示了自定义端口策略属性的 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[] = {};

};

当 MOF 数据传输到基础可扩展交换机扩展时,WMI 管理层会对其进行序列化。 MOF 类序列化为相应的 C 结构,该结构可由 Hyper-V 可扩展交换机扩展处理。 下面显示了为上一示例中的 MOF 类序列化的 C 结构示例。

#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 结构。