* such resource is the virDomainDeviceInfo.
*/
- /* If there is a parent device object, it will handle freeing
+ /* If there is a parentnet device object, it will handle freeing
* def->info.
*/
- if (def->parent.type == VIR_DOMAIN_DEVICE_NONE)
+ if (!def->parentnet)
virDomainDeviceInfoFree(def->info);
switch (def->mode) {
/* free all subordinate objects */
virDomainHostdevDefClear(def);
- /* If there is a parent device object, it will handle freeing
+ /* If there is a parentnet device object, it will handle freeing
* the memory.
*/
- if (def->parent.type == VIR_DOMAIN_DEVICE_NONE)
+ if (!def->parentnet)
VIR_FREE(def);
}
return 0;
if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
- dev->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE) {
+ dev->data.hostdev->parentnet) {
/* This hostdev is a child of a higher level device
* (e.g. interface), and thus already being counted on the
* list for the other device type.
return 0;
if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
- dev->data.hostdev->parent.type == VIR_DOMAIN_DEVICE_NET) {
+ dev->data.hostdev->parentnet) {
/* This hostdev is a copy of some previous interface.
* Aliases are duplicated. */
return 0;
} else if (actual->type == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
virDomainHostdevDefPtr hostdev = &actual->data.hostdev.def;
- hostdev->parent.type = VIR_DOMAIN_DEVICE_NET;
- hostdev->parent.data.net = parent;
+ hostdev->parentnet = parent;
hostdev->info = &parent->info;
/* The helper function expects type to already be found and
* passed in as a string, since it is in a different place in
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
hostdev = &def->data.hostdev.def;
- hostdev->parent.type = VIR_DOMAIN_DEVICE_NET;
- hostdev->parent.data.net = def;
+ hostdev->parentnet = def;
hostdev->info = &def->info;
/* The helper function expects type to already be found and
* passed in as a string, since it is in a different place in
}
for (n = 0; n < def->nhostdevs; n++) {
- /* If parent.type != NONE, this is just a pointer to the
+ /* If parentnet != NONE, this is just a pointer to the
* hostdev in a higher-level device (e.g. virDomainNetDef),
* and will have already been formatted there.
*/
- if (def->hostdevs[n]->parent.type == VIR_DOMAIN_DEVICE_NONE &&
+ if (!def->hostdevs[n]->parentnet &&
virDomainHostdevDefFormat(buf, def->hostdevs[n], flags) < 0) {
goto error;
}
/* basic device for direct passthrough */
struct _virDomainHostdevDef {
- virDomainDeviceDef parent; /* higher level Def containing this */
+ /* If 'parentnet' is non-NULL it means this host dev was
+ * not originally present in the XML. It was copied from
+ * a network interface for convenience when handling
+ * hostdevs internally. This hostdev should never be
+ * visible to the user except as part of the interface
+ */
+ virDomainNetDefPtr parentnet;
int mode; /* enum virDomainHostdevMode */
int startupPolicy; /* enum virDomainStartupPolicy */
/* If this is a network hostdev, we need to use the higher-level
* detach function so that mac address / virtualport are reset
*/
- if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET)
+ if (hostdev->parentnet)
ret = libxlDomainDetachNetDevice(driver, vm,
- hostdev->parent.data.net);
+ hostdev->parentnet);
else
ret = libxlDomainDetachHostDevice(driver, vm, hostdev);
break;
netdef->name);
goto error;
}
- iface->data.network.actual->data.hostdev.def.parent.type = VIR_DOMAIN_DEVICE_NET;
- iface->data.network.actual->data.hostdev.def.parent.data.net = iface;
+ iface->data.network.actual->data.hostdev.def.parentnet = iface;
iface->data.network.actual->data.hostdev.def.info = &iface->info;
iface->data.network.actual->data.hostdev.def.mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
iface->data.network.actual->data.hostdev.def.managed = netdef->forward.managed ? 1 : 0;
/* bootNet will be non-0 if boot order was set and no other
* net devices were encountered
*/
- if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET &&
- bootIndex == 0) {
+ if (hostdev->parentnet && bootIndex == 0) {
bootIndex = *bootHostdevNet;
*bootHostdevNet = 0;
}
if (!virDeviceInfoPCIAddressIsPresent(info) ||
((device->type == VIR_DOMAIN_DEVICE_HOSTDEV) &&
- (device->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE))) {
+ device->data.hostdev->parentnet)) {
/* If a hostdev has a parent, its info will be a part of the
* parent, and will have its address collected during the scan
* of the parent's device type.
if (!virDeviceInfoPCIAddressExtensionIsPresent(info) ||
((device->type == VIR_DOMAIN_DEVICE_HOSTDEV) &&
- (device->data.hostdev->parent.type != VIR_DOMAIN_DEVICE_NONE))) {
+ device->data.hostdev->parentnet)) {
/* If a hostdev has a parent, its info will be a part of the
* parent, and will have its address collected during the scan
* of the parent's device type.
goto cleanup;
}
- if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET) {
- net = hostdev->parent.data.net;
-
+ if (hostdev->parentnet) {
for (i = 0; i < vm->def->nnets; i++) {
- if (vm->def->nets[i] == net) {
+ if (vm->def->nets[i] == hostdev->parentnet) {
virDomainNetRemove(vm->def, i);
break;
}
{
return hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
- hostdev->parent.type == VIR_DOMAIN_DEVICE_NET &&
- hostdev->parent.data.net;
+ hostdev->parentnet != NULL;
}
int vf = -1;
if (!virHostdevIsPCINetDevice(hostdev) ||
- virDomainNetGetActualVirtPortProfile(hostdev->parent.data.net))
+ virDomainNetGetActualVirtPortProfile(hostdev->parentnet))
return 0;
if (virHostdevIsVirtualFunction(hostdev) != 1) {
if (virHostdevNetDevice(hostdev, -1, &linkdev, &vf) < 0)
return -1;
- vlan = virDomainNetGetActualVlan(hostdev->parent.data.net);
- virtPort = virDomainNetGetActualVirtPortProfile(hostdev->parent.data.net);
+ vlan = virDomainNetGetActualVlan(hostdev->parentnet);
+ virtPort = virDomainNetGetActualVirtPortProfile(hostdev->parentnet);
if (virtPort) {
if (vlan) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
return -1;
}
if (virHostdevNetConfigVirtPortProfile(linkdev, vf, virtPort,
- &hostdev->parent.data.net->mac,
+ &hostdev->parentnet->mac,
uuid, port_profile_associate) < 0)
return -1;
} else {
- if (virNetDevSetNetConfig(linkdev, vf, &hostdev->parent.data.net->mac,
+ if (virNetDevSetNetConfig(linkdev, vf, &hostdev->parentnet->mac,
vlan, NULL, true) < 0)
return -1;
}
if (virHostdevNetDevice(hostdev, 0, &linkdev, &vf) < 0)
return -1;
- virtPort = virDomainNetGetActualVirtPortProfile(hostdev->parent.data.net);
+ virtPort = virDomainNetGetActualVirtPortProfile(hostdev->parentnet);
if (virtPort) {
return virHostdevNetConfigVirtPortProfile(linkdev, vf, virtPort,
- &hostdev->parent.data.net->mac,
+ &hostdev->parentnet->mac,
NULL,
port_profile_associate);
} else {