Vue d’ensemble des stratégies de commutateur extensible Hyper-V

La plateforme Hyper-V et l’interface de commutateur extensible fournissent une infrastructure permettant de gérer les stratégies de commutateur et de port pour un commutateur extensible. Ces stratégies sont gérées via des applets de commande PowerShell et des programmes d’application WMI. Cette infrastructure prend également en charge le stockage et la migration des stratégies.

Les éditeurs de logiciels indépendants peuvent utiliser cette infrastructure pour inscrire leurs propres stratégies personnalisées. Une fois inscrites, ces stratégies peuvent être découvertes et gérées via les interfaces de stratégie Hyper-V intégrées. Les propriétés des stratégies peuvent être configurées à un niveau par port ou par commutateur.

En plus des propriétés de stratégie personnalisées, l’interface de commutateur extensible Hyper-V fournit l’infrastructure permettant d’obtenir des informations status pour les propriétés de stratégie personnalisées par port ou par commutateur. Ces informations status sont appelées informations sur les fonctionnalités status.

Les données de stratégie personnalisées de commutateur extensible sont inscrites auprès de la couche de gestion WMI à l’aide de définitions de classes MOF (Managed Object Format). Voici un exemple de classe MOF pour une propriété de stratégie de port personnalisée.

#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 couche de gestion WMI sérialise les données MOF lorsqu’elles sont transférées vers une extension de commutateur extensible sous-jacente. La classe MOF est sérialisée dans une structure C correspondante qui peut être traitée par l’extension de commutateur extensible Hyper-V. Voici un exemple de structure C sérialisée pour la classe MOF de l’exemple précédent.

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

Cet exemple met en évidence les points suivants qui se produisent lorsqu’une classe MOF est sérialisée dans une structure C correspondante pour une propriété de stratégie de commutateur extensible :

  • La définition de version dans les fichiers MOF est convertie en une valeur USHORT, où les bits d’ordre supérieur contiennent la version principale et les bits d’ordre inférieur contiennent la version mineure. La version est sérialisée à l’aide du code suivant :

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

    Par exemple, Version(« 1 ») ci-dessus serait sérialisée à une valeur de 0x0100 à .(((1) << 8) + (0)) La version (« 1.1 ») serait sérialisée à une valeur de 0x0101 à (((1) << 8) + (1)).

    Lorsqu’une propriété de stratégie personnalisée est émise pour une extension sous-jacente, le membre PropertyVersion des structures qui définissent les propriétés de stratégie contient la valeur de version sérialisée.

    Par exemple, lorsque l’interface de commutateur extensible émet une requête d’identificateur d’objet (OID) de OID_SWITCH_PORT_PROPERTY_ADD, l’OID est associé à une structure de NDIS_SWITCH_PORT_PROPERTY_PARAMETERS . Le membre PropertyVersion de cette structure contient la valeur de version sérialisée.

  • Toutes les chaînes de longueur variable sont sérialisées en décalages dans la mémoire tampon qui contient la structure C sérialisée. Chaque chaîne de longueur variable est mise en forme en tant que structure VARIABLE_LENGTH_STRING dans ce décalage de mémoire tampon.