Panoramica dei criteri del commutatore estendibile Hyper-V

La piattaforma Hyper-V e l'interfaccia del commutatore estendibile forniscono un'infrastruttura per gestire i criteri switch e port per un commutatore estendibile. Questi criteri vengono gestiti tramite i cmdlet di PowerShell e i programmi dell'applicazione basati su WMI. Questa infrastruttura fornisce anche il supporto per l'archiviazione e la migrazione dei criteri.

I fornitori di software indipendenti (ISV) possono usare questa infrastruttura per registrare i propri criteri personalizzati. Dopo la registrazione, questi criteri possono essere individuati e gestiti tramite le interfacce dei criteri Hyper-V predefinite. Le proprietà dei criteri possono essere configurate a livello di porta o a livello di commutatore.

Oltre alle proprietà dei criteri personalizzate, l'interfaccia del commutatore estendibile Hyper-V fornisce l'infrastruttura per ottenere informazioni sullo stato per le proprietà dei criteri personalizzate in base a una porta o a un commutatore. Queste informazioni sullo stato sono note come informazioni sullo stato della funzionalità .

I dati dei criteri personalizzati del commutatore estendibile vengono registrati con il livello di gestione WMI usando definizioni di classe MOF (Managed Object Format). Di seguito viene illustrato un esempio di una classe MOF per una proprietà dei criteri di porta personalizzata.

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

};

Il livello di gestione WMI serializza i dati MOF quando vengono trasferiti a un'estensione del commutatore estendibile sottostante. La classe MOF viene serializzata in una struttura C corrispondente che può essere elaborata dall'estensione del commutatore estendibile Hyper-V. Di seguito viene illustrato un esempio della struttura C serializzata per la classe MOF dell'esempio precedente.

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

In questo esempio vengono evidenziati i punti seguenti che si verificano quando una classe MOF viene serializzata in una struttura C corrispondente per una proprietà dei criteri del commutatore estendibile:

  • La definizione della versione nei file MOF viene convertita in un valore USHORT, in cui i bit di ordine elevato contengono la versione principale e i bit di ordine basso contengono la versione secondaria. La versione viene serializzata usando il codice seguente:

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

    Ad esempio, Version("1") precedente viene serializzato in un valore di 0x0100 tramite (((1) << 8) + (0)). La versione ("1.1") viene serializzata in un valore di 0x0101 tramite (((1) << 8) + (1)).

    Quando viene rilasciata una proprietà dei criteri personalizzata a un'estensione sottostante, il membro PropertyVersion delle strutture che definiscono le proprietà dei criteri contiene il valore della versione serializzata.

    Ad esempio, quando l'interfaccia del commutatore estendibile genera una richiesta di identificatore di oggetto (OID) di OID_SWITCH_PORT_PROPERTY_ADD, l'OID è associato a una struttura NDIS_SWITCH_PORT_PROPERTY_PARAMETERS . Il membro PropertyVersion di tale struttura contiene il valore della versione serializzata.

  • Tutte le stringhe a lunghezza variabile vengono serializzate in offset all'interno del buffer che contiene la struttura C serializzata. Ogni stringa a lunghezza variabile viene formattata come struttura VARIABLE_LENGTH_STRING all'interno di questo offset del buffer.