mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-10 23:07:44 +00:00
hyperv: add support for creating network 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
67e2786a0e
commit
fa66bd8cad
@ -978,6 +978,132 @@ hypervDomainAttachSerial(virDomainPtr domain, virDomainChrDefPtr serial)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
hypervDomainAttachSyntheticEthernetAdapter(virDomainPtr domain,
|
||||||
|
virDomainNetDefPtr net,
|
||||||
|
char *hostname)
|
||||||
|
{
|
||||||
|
hypervPrivate *priv = domain->conn->privateData;
|
||||||
|
g_autofree char *portResourceType = NULL;
|
||||||
|
unsigned char vsiGuid[VIR_UUID_BUFLEN];
|
||||||
|
char guidString[VIR_UUID_STRING_BUFLEN];
|
||||||
|
g_autofree char *virtualSystemIdentifiers = NULL;
|
||||||
|
char macString[VIR_MAC_STRING_BUFLEN];
|
||||||
|
g_autofree char *macAddressNoColons = NULL;
|
||||||
|
g_autoptr(GHashTable) portResource = NULL;
|
||||||
|
g_auto(WsXmlDocH) sepsdResponse = NULL;
|
||||||
|
g_auto(virBuffer) query = VIR_BUFFER_INITIALIZER;
|
||||||
|
g_autoptr(Msvm_VirtualEthernetSwitch) vSwitch = NULL;
|
||||||
|
g_autofree char *enabledState = NULL;
|
||||||
|
g_autofree char *switch__PATH = NULL;
|
||||||
|
g_autofree char *sepsd__PATH = NULL;
|
||||||
|
g_autofree char *sepsdInstanceID = NULL;
|
||||||
|
g_autofree char *sepsdInstanceEscaped = NULL;
|
||||||
|
g_autofree char *connectionResourceType = NULL;
|
||||||
|
g_autoptr(GHashTable) connectionResource = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 1: Create the Msvm_SyntheticEthernetPortSettingData object
|
||||||
|
* that holds half the settings for the new adapter we are creating
|
||||||
|
*/
|
||||||
|
portResourceType = g_strdup_printf("%d", MSVM_RASD_RESOURCETYPE_ETHERNET_ADAPTER);
|
||||||
|
|
||||||
|
virUUIDGenerate(vsiGuid);
|
||||||
|
virUUIDFormat(vsiGuid, guidString);
|
||||||
|
virtualSystemIdentifiers = g_strdup_printf("{%s}", guidString);
|
||||||
|
|
||||||
|
virMacAddrFormat(&net->mac, macString);
|
||||||
|
macAddressNoColons = virStringReplace(macString, ":", "");
|
||||||
|
|
||||||
|
/* prepare embedded param */
|
||||||
|
portResource = hypervCreateEmbeddedParam(Msvm_SyntheticEthernetPortSettingData_WmiInfo);
|
||||||
|
if (!portResource)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(portResource, "ResourceType", portResourceType) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(portResource, "ResourceSubType",
|
||||||
|
"Microsoft:Hyper-V:Synthetic Ethernet Port") < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(portResource,
|
||||||
|
"VirtualSystemIdentifiers", virtualSystemIdentifiers) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(portResource, "Address", macAddressNoColons) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(portResource, "StaticMacAddress", "true") < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervMsvmVSMSAddResourceSettings(domain, &portResource,
|
||||||
|
Msvm_SyntheticEthernetPortSettingData_WmiInfo,
|
||||||
|
&sepsdResponse) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 2: Get the Msvm_VirtualEthernetSwitch object
|
||||||
|
*/
|
||||||
|
virBufferAsprintf(&query,
|
||||||
|
MSVM_VIRTUALETHERNETSWITCH_WQL_SELECT "WHERE Name='%s'",
|
||||||
|
net->data.bridge.brname);
|
||||||
|
|
||||||
|
if (hypervGetWmiClass(Msvm_VirtualEthernetSwitch, &vSwitch) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (!vSwitch)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Step 3: Create the Msvm_EthernetPortAllocationSettingData object that
|
||||||
|
* holds the other half of the network configuration
|
||||||
|
*/
|
||||||
|
enabledState = g_strdup_printf("%d", MSVM_ETHERNETPORTALLOCATIONSETTINGDATA_ENABLEDSTATE_ENABLED);
|
||||||
|
|
||||||
|
/* build the two __PATH variables */
|
||||||
|
switch__PATH = g_strdup_printf("\\\\%s\\Root\\Virtualization\\V2:"
|
||||||
|
"Msvm_VirtualEthernetSwitch.CreationClassName=\"Msvm_VirtualEthernetSwitch\","
|
||||||
|
"Name=\"%s\"",
|
||||||
|
hostname, vSwitch->data->Name);
|
||||||
|
|
||||||
|
/* Get the sepsd instance ID out of the XML response */
|
||||||
|
sepsdInstanceID = hypervGetInstanceIDFromXMLResponse(sepsdResponse);
|
||||||
|
sepsdInstanceEscaped = virStringReplace(sepsdInstanceID, "\\", "\\\\");
|
||||||
|
sepsd__PATH = g_strdup_printf("\\\\%s\\root\\virtualization\\v2:"
|
||||||
|
"Msvm_SyntheticEthernetPortSettingData.InstanceID=\"%s\"",
|
||||||
|
hostname, sepsdInstanceEscaped);
|
||||||
|
|
||||||
|
connectionResourceType = g_strdup_printf("%d", MSVM_RASD_RESOURCETYPE_ETHERNET_CONNECTION);
|
||||||
|
|
||||||
|
connectionResource = hypervCreateEmbeddedParam(Msvm_EthernetPortAllocationSettingData_WmiInfo);
|
||||||
|
if (!connectionResource)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(connectionResource, "EnabledState", enabledState) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(connectionResource, "HostResource", switch__PATH) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(connectionResource, "Parent", sepsd__PATH) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(connectionResource, "ResourceType", connectionResourceType) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervSetEmbeddedProperty(connectionResource,
|
||||||
|
"ResourceSubType", "Microsoft:Hyper-V:Ethernet Connection") < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (hypervMsvmVSMSAddResourceSettings(domain, &connectionResource,
|
||||||
|
Msvm_EthernetPortAllocationSettingData_WmiInfo, NULL) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Functions for deserializing device entries
|
* Functions for deserializing device entries
|
||||||
*/
|
*/
|
||||||
@ -2674,6 +2800,14 @@ hypervDomainDefineXML(virConnectPtr conn, const char *xml)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Attach networks */
|
||||||
|
for (i = 0; i < def->nnets; i++) {
|
||||||
|
if (hypervDomainAttachSyntheticEthernetAdapter(domain, def->nets[i], hostname) < 0) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not attach network %lu"), i);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return domain;
|
return domain;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
@ -2777,6 +2911,10 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, const char *xml, unsigned int
|
|||||||
if (hypervDomainAttachSerial(domain, dev->data.chr) < 0)
|
if (hypervDomainAttachSerial(domain, dev->data.chr) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
case VIR_DOMAIN_DEVICE_NET:
|
||||||
|
if (hypervDomainAttachSyntheticEthernetAdapter(domain, dev->data.net, hostname) < 0)
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/* unsupported device type */
|
/* unsupported device type */
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
@ -108,6 +108,7 @@ enum _Msvm_ResourceAllocationSettingData_ResourceType {
|
|||||||
MSVM_RASD_RESOURCETYPE_OTHER = 1,
|
MSVM_RASD_RESOURCETYPE_OTHER = 1,
|
||||||
MSVM_RASD_RESOURCETYPE_IDE_CONTROLLER = 5,
|
MSVM_RASD_RESOURCETYPE_IDE_CONTROLLER = 5,
|
||||||
MSVM_RASD_RESOURCETYPE_PARALLEL_SCSI_HBA = 6,
|
MSVM_RASD_RESOURCETYPE_PARALLEL_SCSI_HBA = 6,
|
||||||
|
MSVM_RASD_RESOURCETYPE_ETHERNET_ADAPTER = 10,
|
||||||
MSVM_RASD_RESOURCETYPE_DISKETTE_DRIVE = 14,
|
MSVM_RASD_RESOURCETYPE_DISKETTE_DRIVE = 14,
|
||||||
MSVM_RASD_RESOURCETYPE_CD_DRIVE = 15,
|
MSVM_RASD_RESOURCETYPE_CD_DRIVE = 15,
|
||||||
MSVM_RASD_RESOURCETYPE_DVD_DRIVE = 16,
|
MSVM_RASD_RESOURCETYPE_DVD_DRIVE = 16,
|
||||||
@ -115,6 +116,7 @@ enum _Msvm_ResourceAllocationSettingData_ResourceType {
|
|||||||
MSVM_RASD_RESOURCETYPE_STORAGE_EXTENT = 19,
|
MSVM_RASD_RESOURCETYPE_STORAGE_EXTENT = 19,
|
||||||
MSVM_RASD_RESOURCETYPE_SERIAL_PORT = 21,
|
MSVM_RASD_RESOURCETYPE_SERIAL_PORT = 21,
|
||||||
MSVM_RASD_RESOURCETYPE_LOGICAL_DISK = 31,
|
MSVM_RASD_RESOURCETYPE_LOGICAL_DISK = 31,
|
||||||
|
MSVM_RASD_RESOURCETYPE_ETHERNET_CONNECTION = 33,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -936,3 +936,35 @@ class Msvm_VirtualEthernetSwitch
|
|||||||
uint32 MaxVMQOffloads
|
uint32 MaxVMQOffloads
|
||||||
uint32 MaxIOVOffloads
|
uint32 MaxIOVOffloads
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
class Msvm_VirtualEthernetSwitchManagementService
|
||||||
|
string InstanceID
|
||||||
|
string Caption
|
||||||
|
string Description
|
||||||
|
string ElementName
|
||||||
|
datetime InstallDate
|
||||||
|
string Name
|
||||||
|
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 SystemCreationClassName
|
||||||
|
string SystemName
|
||||||
|
string CreationClassName
|
||||||
|
string PrimaryOwnerName
|
||||||
|
string PrimaryOwnerContact
|
||||||
|
string StartMode
|
||||||
|
boolean Started
|
||||||
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user