The virtPortProfile in the domain interface struct is now a separately allocated object *pointed to by* (rather than contained in) the main virDomainNetDef object. This is done to make it easier to figure out when a virtualPortProfile has/hasn't been specified in a particular config. --- src/conf/domain_conf.c | 17 ++++++++--------- src/conf/domain_conf.h | 2 +- src/qemu/qemu_command.c | 4 ++-- src/qemu/qemu_hotplug.c | 2 +- src/qemu/qemu_migration.c | 4 ++-- src/qemu/qemu_process.c | 2 +- src/util/network.c | 15 ++++++++++++--- src/util/network.h | 2 +- 8 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0af8860..24f9b00 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -770,6 +770,7 @@ void virDomainNetDefFree(virDomainNetDefPtr def) case VIR_DOMAIN_NET_TYPE_DIRECT: VIR_FREE(def->data.direct.linkdev); + VIR_FREE(def->data.direct.virtPortProfile); break; case VIR_DOMAIN_NET_TYPE_USER: @@ -2617,8 +2618,7 @@ virDomainNetDefParseXML(virCapsPtr caps, char *devaddr = NULL; char *mode = NULL; virNWFilterHashTablePtr filterparams = NULL; - virVirtualPortProfileParams virtPort; - bool virtPortParsed = false; + virVirtualPortProfileParamsPtr virtPort = NULL; xmlNodePtr oldnode = ctxt->node; int ret; @@ -2664,12 +2664,11 @@ virDomainNetDefParseXML(virCapsPtr caps, xmlStrEqual(cur->name, BAD_CAST "source")) { dev = virXMLPropString(cur, "dev"); mode = virXMLPropString(cur, "mode"); - } else if (!virtPortParsed && + } else if ((virtPort == NULL) && (def->type == VIR_DOMAIN_NET_TYPE_DIRECT) && xmlStrEqual(cur->name, BAD_CAST "virtualport")) { - if (virVirtualPortProfileParamsParseXML(cur, &virtPort)) + if (virVirtualPortProfileParamsParseXML(cur, &virtPort) < 0) goto error; - virtPortParsed = true; } else if ((network == NULL) && ((def->type == VIR_DOMAIN_NET_TYPE_SERVER) || (def->type == VIR_DOMAIN_NET_TYPE_CLIENT) || @@ -2853,9 +2852,8 @@ virDomainNetDefParseXML(virCapsPtr caps, } else def->data.direct.mode = VIR_MACVTAP_MODE_VEPA; - if (virtPortParsed) - def->data.direct.virtPortProfile = virtPort; - + def->data.direct.virtPortProfile = virtPort; + virtPort = NULL; def->data.direct.linkdev = dev; dev = NULL; @@ -2962,6 +2960,7 @@ cleanup: VIR_FREE(port); VIR_FREE(ifname); VIR_FREE(dev); + VIR_FREE(virtPort); VIR_FREE(script); VIR_FREE(bridge); VIR_FREE(model); @@ -8601,7 +8600,7 @@ virDomainNetDefFormat(virBufferPtr buf, virBufferAsprintf(buf, " mode='%s'", virMacvtapModeTypeToString(def->data.direct.mode)); virBufferAddLit(buf, "/>\n"); - virVirtualPortProfileFormat(buf, &def->data.direct.virtPortProfile, + virVirtualPortProfileFormat(buf, def->data.direct.virtPortProfile, " "); break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 7a3d72b..69e74dc 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -381,7 +381,7 @@ struct _virDomainNetDef { struct { char *linkdev; int mode; /* enum virMacvtapMode from util/macvtap.h */ - virVirtualPortProfileParams virtPortProfile; + virVirtualPortProfileParamsPtr virtPortProfile; } direct; } data; struct { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index a3bce4a..f456e25 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -127,7 +127,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def, rc = openMacvtapTap(net->ifname, net->mac, net->data.direct.linkdev, net->data.direct.mode, vnet_hdr, def->uuid, - &net->data.direct.virtPortProfile, &res_ifname, + net->data.direct.virtPortProfile, &res_ifname, vmop, driver->stateDir); if (rc >= 0) { virDomainAuditNetDevice(def, net, res_ifname, true); @@ -150,7 +150,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def, VIR_FORCE_CLOSE(rc); delMacvtap(net->ifname, net->mac, net->data.direct.linkdev, net->data.direct.mode, - &net->data.direct.virtPortProfile, + net->data.direct.virtPortProfile, driver->stateDir); VIR_FREE(net->ifname); } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 0eae661..6c22f4c 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1616,7 +1616,7 @@ int qemuDomainDetachNetDevice(struct qemud_driver *driver, if (detach->type == VIR_DOMAIN_NET_TYPE_DIRECT) { delMacvtap(detach->ifname, detach->mac, detach->data.direct.linkdev, detach->data.direct.mode, - &detach->data.direct.virtPortProfile, + detach->data.direct.virtPortProfile, driver->stateDir); VIR_FREE(detach->ifname); } diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index dfa80e3..84fe05a 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2341,7 +2341,7 @@ qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) { if (vpAssociatePortProfileId(net->ifname, net->mac, net->data.direct.linkdev, - &net->data.direct.virtPortProfile, + net->data.direct.virtPortProfile, def->uuid, VIR_VM_OP_MIGRATE_IN_FINISH) != 0) goto err_exit; @@ -2358,7 +2358,7 @@ err_exit: vpDisassociatePortProfileId(net->ifname, net->mac, net->data.direct.linkdev, - &net->data.direct.virtPortProfile, + net->data.direct.virtPortProfile, VIR_VM_OP_MIGRATE_IN_FINISH); } } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 448b06e..5121241 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3017,7 +3017,7 @@ void qemuProcessStop(struct qemud_driver *driver, if (net->type == VIR_DOMAIN_NET_TYPE_DIRECT) { delMacvtap(net->ifname, net->mac, net->data.direct.linkdev, net->data.direct.mode, - &net->data.direct.virtPortProfile, driver->stateDir); + net->data.direct.virtPortProfile, driver->stateDir); VIR_FREE(net->ifname); } } diff --git a/src/util/network.c b/src/util/network.c index a323b26..c35668d 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -685,7 +685,7 @@ VIR_ENUM_IMPL(virVirtualPort, VIR_VIRTUALPORT_TYPE_LAST, int virVirtualPortProfileParamsParseXML(xmlNodePtr node, - virVirtualPortProfileParamsPtr virtPort) + virVirtualPortProfileParamsPtr *def) { int ret = -1; char *virtPortType; @@ -694,8 +694,14 @@ virVirtualPortProfileParamsParseXML(xmlNodePtr node, char *virtPortTypeIDVersion = NULL; char *virtPortInstanceID = NULL; char *virtPortProfileID = NULL; + virVirtualPortProfileParamsPtr virtPort = NULL; xmlNodePtr cur = node->children; + if (VIR_ALLOC(virtPort) < 0) { + virReportOOMError(); + return -1; + } + virtPortType = virXMLPropString(node, "type"); if (!virtPortType) { virSocketError(VIR_ERR_XML_ERROR, "%s", @@ -785,7 +791,7 @@ virVirtualPortProfileParamsParseXML(xmlNodePtr node, } virtPort->virtPortType = VIR_VIRTUALPORT_8021QBG; - ret = 0; + } else { virSocketError(VIR_ERR_XML_ERROR, "%s", _("a parameter is missing for 802.1Qbg description")); @@ -798,7 +804,6 @@ virVirtualPortProfileParamsParseXML(xmlNodePtr node, if (virStrcpyStatic(virtPort->u.virtPort8021Qbh.profileID, virtPortProfileID) != NULL) { virtPort->virtPortType = VIR_VIRTUALPORT_8021QBH; - ret = 0; } else { virSocketError(VIR_ERR_XML_ERROR, "%s", _("profileid parameter too long")); @@ -821,7 +826,11 @@ virVirtualPortProfileParamsParseXML(xmlNodePtr node, break; } + ret = 0; + *def = virtPort; + virtPort = NULL; error: + VIR_FREE(virtPort); VIR_FREE(virtPortManagerID); VIR_FREE(virtPortTypeID); VIR_FREE(virtPortTypeIDVersion); diff --git a/src/util/network.h b/src/util/network.h index 0a8fc03..b69ee3d 100644 --- a/src/util/network.h +++ b/src/util/network.h @@ -130,7 +130,7 @@ struct _virVirtualPortProfileParams { int virVirtualPortProfileParamsParseXML(xmlNodePtr node, - virVirtualPortProfileParamsPtr virtPort); + virVirtualPortProfileParamsPtr *virtPort); void virVirtualPortProfileFormat(virBufferPtr buf, virVirtualPortProfileParamsPtr virtPort, -- 1.7.3.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list