mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 21:34:54 +03:00
hyperv: XML parsing of Ethernet adapters
Co-authored-by: Sri Ramanujam <sramanujam@datto.com> Signed-off-by: Matt Coleman <matt@datto.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
26e94bcd94
commit
67e2786a0e
@ -1379,6 +1379,105 @@ hypervDomainDefParseSerial(virDomainDefPtr def, Msvm_ResourceAllocationSettingDa
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
hypervDomainDefParseEthernetAdapter(virDomainDefPtr def,
|
||||
Msvm_EthernetPortAllocationSettingData *net,
|
||||
hypervPrivate *priv)
|
||||
{
|
||||
g_autoptr(virDomainNetDef) ndef = g_new0(virDomainNetDef, 1);
|
||||
g_autoptr(Msvm_SyntheticEthernetPortSettingData) sepsd = NULL;
|
||||
g_autoptr(Msvm_VirtualEthernetSwitch) vSwitch = NULL;
|
||||
char **switchConnection = NULL;
|
||||
g_autofree char *switchConnectionEscaped = NULL;
|
||||
char *sepsdPATH = NULL;
|
||||
g_autofree char *sepsdEscaped = NULL;
|
||||
g_auto(virBuffer) query = VIR_BUFFER_INITIALIZER;
|
||||
|
||||
VIR_DEBUG("Parsing ethernet adapter '%s'", net->data->InstanceID);
|
||||
|
||||
ndef->type = VIR_DOMAIN_NET_TYPE_BRIDGE;
|
||||
|
||||
/*
|
||||
* If there's no switch port connection or the EnabledState is disabled,
|
||||
* then the adapter isn't hooked up to anything and we don't have to
|
||||
* do anything more.
|
||||
*/
|
||||
switchConnection = net->data->HostResource.data;
|
||||
if (net->data->HostResource.count < 1 || !*switchConnection ||
|
||||
net->data->EnabledState == MSVM_ETHERNETPORTALLOCATIONSETTINGDATA_ENABLEDSTATE_DISABLED) {
|
||||
VIR_DEBUG("Adapter not connected to switch");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we retrieve the associated Msvm_SyntheticEthernetPortSettingData and
|
||||
* Msvm_VirtualEthernetSwitch objects and use them to build the XML definition.
|
||||
*/
|
||||
|
||||
/* begin by getting the Msvm_SyntheticEthernetPortSettingData object */
|
||||
sepsdPATH = net->data->Parent;
|
||||
sepsdEscaped = virStringReplace(sepsdPATH, "\\", "\\\\");
|
||||
virBufferAsprintf(&query,
|
||||
MSVM_SYNTHETICETHERNETPORTSETTINGDATA_WQL_SELECT "WHERE __PATH = '%s'",
|
||||
sepsdEscaped);
|
||||
|
||||
if (hypervGetWmiClass(Msvm_SyntheticEthernetPortSettingData, &sepsd) < 0)
|
||||
return -1;
|
||||
|
||||
if (!sepsd) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve NIC settings"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* set mac address */
|
||||
if (virMacAddrParseHex(sepsd->data->Address, &ndef->mac) < 0)
|
||||
return -1;
|
||||
|
||||
/* now we get the Msvm_VirtualEthernetSwitch */
|
||||
virBufferFreeAndReset(&query);
|
||||
switchConnectionEscaped = virStringReplace(*switchConnection, "\\", "\\\\");
|
||||
virBufferAsprintf(&query,
|
||||
MSVM_VIRTUALETHERNETSWITCH_WQL_SELECT "WHERE __PATH = '%s'",
|
||||
switchConnectionEscaped);
|
||||
|
||||
if (hypervGetWmiClass(Msvm_VirtualEthernetSwitch, &vSwitch) < 0)
|
||||
return -1;
|
||||
|
||||
if (!vSwitch) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not retrieve virtual switch"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* get bridge name */
|
||||
ndef->data.bridge.brname = g_strdup(vSwitch->data->Name);
|
||||
|
||||
if (VIR_APPEND_ELEMENT(def->nets, def->nnets, ndef) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Could not append definition to domain"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
hypervDomainDefParseEthernet(virDomainPtr domain,
|
||||
virDomainDefPtr def,
|
||||
Msvm_EthernetPortAllocationSettingData *nets)
|
||||
{
|
||||
Msvm_EthernetPortAllocationSettingData *entry = nets;
|
||||
hypervPrivate *priv = domain->conn->privateData;
|
||||
|
||||
while (entry) {
|
||||
if (hypervDomainDefParseEthernetAdapter(def, entry, priv) < 0)
|
||||
return -1;
|
||||
|
||||
entry = entry->next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Driver functions
|
||||
*/
|
||||
@ -2240,6 +2339,7 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
|
||||
g_autoptr(Msvm_StorageAllocationSettingData) sasd = NULL;
|
||||
g_autoptr(Msvm_SerialPortSettingData) spsd = NULL;
|
||||
Msvm_ResourceAllocationSettingData *serialDevices = NULL;
|
||||
g_autoptr(Msvm_EthernetPortAllocationSettingData) nets = NULL;
|
||||
|
||||
virCheckFlags(VIR_DOMAIN_XML_COMMON_FLAGS, NULL);
|
||||
|
||||
@ -2281,6 +2381,10 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
|
||||
if (hypervGetSerialPortSD(priv, virtualSystemSettingData->data->InstanceID, &spsd) < 0)
|
||||
return NULL;
|
||||
|
||||
if (hypervGetEthernetPortAllocationSD(priv,
|
||||
virtualSystemSettingData->data->InstanceID, &nets) < 0)
|
||||
return NULL;
|
||||
|
||||
/* Fill struct */
|
||||
def->virtType = VIR_DOMAIN_VIRT_HYPERV;
|
||||
|
||||
@ -2342,6 +2446,10 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
|
||||
def->controllers = g_new0(virDomainControllerDefPtr, 5);
|
||||
def->ncontrollers = 0;
|
||||
|
||||
/* 8 synthetic + 4 legacy NICs */
|
||||
def->nets = g_new0(virDomainNetDefPtr, 12);
|
||||
def->nnets = 0;
|
||||
|
||||
if (hypervDomainDefParseStorage(priv, def, rasd, sasd) < 0)
|
||||
return NULL;
|
||||
|
||||
@ -2353,6 +2461,9 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
|
||||
if (hypervDomainDefParseSerial(def, serialDevices) < 0)
|
||||
return NULL;
|
||||
|
||||
if (hypervDomainDefParseEthernet(domain, def, nets) < 0)
|
||||
return NULL;
|
||||
|
||||
/* XXX xmlopts must be non-NULL */
|
||||
return virDomainDefFormat(def, NULL, virDomainDefFormatConvertXMLFlags(flags));
|
||||
}
|
||||
|
@ -1498,6 +1498,26 @@ hypervGetSerialPortSD(hypervPrivate *priv,
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
hypervGetSyntheticEthernetPortSD(hypervPrivate *priv,
|
||||
const char *id,
|
||||
Msvm_SyntheticEthernetPortSettingData **data)
|
||||
{
|
||||
hypervGetSettingData(Msvm_SyntheticEthernetPortSettingData, id, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
hypervGetEthernetPortAllocationSD(hypervPrivate *priv,
|
||||
const char *id,
|
||||
Msvm_EthernetPortAllocationSettingData **data)
|
||||
{
|
||||
hypervGetSettingData(Msvm_EthernetPortAllocationSettingData, id, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* Msvm_VirtualSystemManagementService
|
||||
*/
|
||||
|
@ -258,6 +258,14 @@ int hypervGetSerialPortSD(hypervPrivate *priv,
|
||||
const char *id,
|
||||
Msvm_SerialPortSettingData **data);
|
||||
|
||||
int hypervGetSyntheticEthernetPortSD(hypervPrivate *priv,
|
||||
const char *id,
|
||||
Msvm_SyntheticEthernetPortSettingData **data);
|
||||
|
||||
int hypervGetEthernetPortAllocationSD(hypervPrivate *priv,
|
||||
const char *id,
|
||||
Msvm_EthernetPortAllocationSettingData **data);
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* Msvm_VirtualSystemManagementService
|
||||
*/
|
||||
|
@ -119,6 +119,18 @@ enum _Msvm_ResourceAllocationSettingData_ResourceType {
|
||||
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* Msvm_EthernetPortAllocationSettingData
|
||||
*/
|
||||
|
||||
/* https://docs.microsoft.com/en-us/windows/win32/hyperv_v2/msvm-ethernetportallocationsettingdata#enabled */
|
||||
enum _Msvm_EthernetPortAllocationSettingData_EnabledState {
|
||||
MSVM_ETHERNETPORTALLOCATIONSETTINGDATA_ENABLEDSTATE_ENABLED = 2,
|
||||
MSVM_ETHERNETPORTALLOCATIONSETTINGDATA_ENABLEDSTATE_DISABLED = 3,
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* WMI
|
||||
*/
|
||||
|
@ -827,3 +827,112 @@ class Msvm_StorageAllocationSettingData
|
||||
string IOPSAllocationUnits
|
||||
boolean PersistentReservationsSupported
|
||||
end
|
||||
|
||||
|
||||
class Msvm_SyntheticEthernetPortSettingData
|
||||
string InstanceID
|
||||
string Caption
|
||||
string Description
|
||||
string ElementName
|
||||
uint16 ResourceType
|
||||
string OtherResourceType
|
||||
string ResourceSubType
|
||||
string PoolID
|
||||
uint16 ConsumerVisibility
|
||||
string HostResource[]
|
||||
string AllocationUnits
|
||||
uint64 VirtualQuantity
|
||||
uint64 Reservation
|
||||
uint64 Limit
|
||||
uint32 Weight
|
||||
boolean AutomaticAllocation
|
||||
boolean AutomaticDeallocation
|
||||
string Parent
|
||||
string Connection[]
|
||||
string Address
|
||||
uint16 MappingBehavior
|
||||
string AddressOnParent
|
||||
string VirtualQuantityUnits
|
||||
uint16 DesiredVLANEndpointMode
|
||||
string OtherEndpointMode
|
||||
string VirtualSystemIdentifiers[]
|
||||
# DeviceNamingEnabled and AllowPacketDirect are not present in Windows Server 2012R2.
|
||||
# They were added in Windows 10 and Windows Server 2016.
|
||||
# They have been omitted to retain compatibility with Windows Server 2012R2.
|
||||
# boolean DeviceNamingEnabled
|
||||
# boolean AllowPacketDirect
|
||||
boolean StaticMacAddress
|
||||
boolean ClusterMonitored
|
||||
end
|
||||
|
||||
|
||||
class Msvm_EthernetPortAllocationSettingData
|
||||
string InstanceID
|
||||
string Caption
|
||||
string Description
|
||||
string ElementName
|
||||
uint16 ResourceType
|
||||
string OtherResourceType
|
||||
string ResourceSubType
|
||||
string PoolID
|
||||
uint16 ConsumerVisibility
|
||||
string HostResource[]
|
||||
string AllocationUnits
|
||||
uint64 VirtualQuantity
|
||||
uint64 Reservation
|
||||
uint64 Limit
|
||||
uint32 Weight
|
||||
boolean AutomaticAllocation
|
||||
boolean AutomaticDeallocation
|
||||
string Parent
|
||||
string Connection[]
|
||||
string Address
|
||||
uint16 MappingBehavior
|
||||
string AddressOnParent
|
||||
string VirtualQuantityUnits
|
||||
uint16 DesiredVLANEndpointMode
|
||||
string OtherEndpointMode
|
||||
uint16 EnabledState
|
||||
string RequiredFeatures[]
|
||||
string RequiredFeatureHints[]
|
||||
string TestReplicaPoolID
|
||||
string TestReplicaSwitchName
|
||||
end
|
||||
|
||||
|
||||
class Msvm_VirtualEthernetSwitch
|
||||
string InstanceID
|
||||
string Caption
|
||||
string Description
|
||||
string ElementName
|
||||
datetime InstallDate
|
||||
uint16 OperationalStatus[]
|
||||
string StatusDescriptions[]
|
||||
string Status
|
||||
uint16 HealthState
|
||||
uint16 CommunicationStatus
|
||||
uint16 DetailedStatus
|
||||
uint16 OperatingStatus
|
||||
uint16 PrimaryStatus
|
||||
uint16 EnabledState
|
||||
string OtherEnabledState
|
||||
uint16 RequestedState
|
||||
uint16 EnabledDefault
|
||||
datetime TimeOfLastStateChange
|
||||
uint16 AvailableRequestedStates[]
|
||||
uint16 TransitioningToState
|
||||
string CreationClassName
|
||||
string Name
|
||||
string PrimaryOwnerName
|
||||
string PrimaryOwnerContact
|
||||
string Roles[]
|
||||
string NameFormat
|
||||
string OtherIdentifyingInfo[]
|
||||
string IdentifyingDescriptions[]
|
||||
uint16 Dedicated[]
|
||||
string OtherDedicatedDescriptions[]
|
||||
uint16 ResetCapability
|
||||
uint16 PowerManagementCapabilities[]
|
||||
uint32 MaxVMQOffloads
|
||||
uint32 MaxIOVOffloads
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user