Introducción a las directivas de conmutador extensible de Hyper-V

La plataforma Hyper-V y la interfaz de conmutador extensible proporcionan una infraestructura para administrar directivas de conmutador y puerto para un conmutador extensible. Estas directivas se administran a través de cmdlets de PowerShell y programas de aplicaciones basados en WMI. Esta infraestructura también proporciona compatibilidad con el almacenamiento y la migración de directivas.

Los proveedores de software independientes (ISV) pueden usar esta infraestructura para registrar sus propias directivas personalizadas. Una vez registradas, estas directivas se pueden detectar y administrar a través de las interfaces de directiva de Hyper-V integradas. Las propiedades de las directivas se pueden configurar en un nivel por puerto o en un nivel por conmutador.

Además de las propiedades de directiva personalizadas, la interfaz de conmutador extensible de Hyper-V proporciona la infraestructura para obtener información de estado para las propiedades de directiva personalizadas por puerto o por conmutador. Esta información de estado se conoce como información de estado de características .

Los datos de directiva personalizada de conmutador extensible se registran con la capa de administración de WMI mediante definiciones de clase de formato de objeto administrado (MOF). A continuación se muestra un ejemplo de una clase MOF para una propiedad de directiva de puerto 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[] = {};

};

La capa de administración de WMI serializa los datos MOF cuando se transfieren a una extensión de conmutador extensible subyacente. La clase MOF se serializa en una estructura de C correspondiente que la extensión de conmutador extensible de Hyper-V puede procesar. A continuación se muestra un ejemplo de la estructura C que se serializó para la clase MOF del ejemplo 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;

En este ejemplo se resaltan los siguientes puntos que se producen cuando una clase MOF se serializa en una estructura de C correspondiente para una propiedad de directiva de conmutador extensible:

  • La definición de versión de los archivos MOF se convierte en un valor de USHORT, donde los bits de orden superior contienen la versión principal y los bits de orden bajo contienen la versión secundaria. La versión se serializa mediante el código siguiente:

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

    Por ejemplo, Version("1") anterior se serializaría en un valor de 0x0100 a través (((1) << 8) + (0))de . La versión ("1.1") se serializaría en un valor de 0x0101 a través (((1) << 8) + (1))de .

    Cuando se emite una propiedad de directiva personalizada a una extensión subyacente, el miembro PropertyVersion de las estructuras que definen las propiedades de directiva contiene el valor de versión serializado.

    Por ejemplo, cuando la interfaz de conmutador extensible emite una solicitud de identificador de objeto (OID) de OID_SWITCH_PORT_PROPERTY_ADD, el OID está asociado a una estructura de NDIS_SWITCH_PORT_PROPERTY_PARAMETERS . El miembro PropertyVersion de esa estructura contiene el valor de versión serializado.

  • Todas las cadenas de longitud variable se serializan en desplazamientos dentro del búfer que contiene la estructura C serializada. Cada cadena de longitud variable tiene formato como una estructura de VARIABLE_LENGTH_STRING dentro de este desplazamiento del búfer.