conf: virDomainNetDef points to (rather than contains) virtPortProfile

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.
This commit is contained in:
Laine Stump 2011-07-18 18:44:38 -04:00
parent a3d95b550b
commit 524655eea2
8 changed files with 28 additions and 20 deletions

View File

@ -770,6 +770,7 @@ void virDomainNetDefFree(virDomainNetDefPtr def)
case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_DIRECT:
VIR_FREE(def->data.direct.linkdev); VIR_FREE(def->data.direct.linkdev);
VIR_FREE(def->data.direct.virtPortProfile);
break; break;
case VIR_DOMAIN_NET_TYPE_USER: case VIR_DOMAIN_NET_TYPE_USER:
@ -2617,8 +2618,7 @@ virDomainNetDefParseXML(virCapsPtr caps,
char *devaddr = NULL; char *devaddr = NULL;
char *mode = NULL; char *mode = NULL;
virNWFilterHashTablePtr filterparams = NULL; virNWFilterHashTablePtr filterparams = NULL;
virVirtualPortProfileParams virtPort; virVirtualPortProfileParamsPtr virtPort = NULL;
bool virtPortParsed = false;
xmlNodePtr oldnode = ctxt->node; xmlNodePtr oldnode = ctxt->node;
int ret; int ret;
@ -2664,12 +2664,11 @@ virDomainNetDefParseXML(virCapsPtr caps,
xmlStrEqual(cur->name, BAD_CAST "source")) { xmlStrEqual(cur->name, BAD_CAST "source")) {
dev = virXMLPropString(cur, "dev"); dev = virXMLPropString(cur, "dev");
mode = virXMLPropString(cur, "mode"); mode = virXMLPropString(cur, "mode");
} else if (!virtPortParsed && } else if ((virtPort == NULL) &&
(def->type == VIR_DOMAIN_NET_TYPE_DIRECT) && (def->type == VIR_DOMAIN_NET_TYPE_DIRECT) &&
xmlStrEqual(cur->name, BAD_CAST "virtualport")) { xmlStrEqual(cur->name, BAD_CAST "virtualport")) {
if (virVirtualPortProfileParseXML(cur, &virtPort)) if (virVirtualPortProfileParseXML(cur, &virtPort) < 0)
goto error; goto error;
virtPortParsed = true;
} else if ((network == NULL) && } else if ((network == NULL) &&
((def->type == VIR_DOMAIN_NET_TYPE_SERVER) || ((def->type == VIR_DOMAIN_NET_TYPE_SERVER) ||
(def->type == VIR_DOMAIN_NET_TYPE_CLIENT) || (def->type == VIR_DOMAIN_NET_TYPE_CLIENT) ||
@ -2853,9 +2852,8 @@ virDomainNetDefParseXML(virCapsPtr caps,
} else } else
def->data.direct.mode = VIR_MACVTAP_MODE_VEPA; 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; def->data.direct.linkdev = dev;
dev = NULL; dev = NULL;
@ -2962,6 +2960,7 @@ cleanup:
VIR_FREE(port); VIR_FREE(port);
VIR_FREE(ifname); VIR_FREE(ifname);
VIR_FREE(dev); VIR_FREE(dev);
VIR_FREE(virtPort);
VIR_FREE(script); VIR_FREE(script);
VIR_FREE(bridge); VIR_FREE(bridge);
VIR_FREE(model); VIR_FREE(model);
@ -8609,7 +8608,7 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferAsprintf(buf, " mode='%s'", virBufferAsprintf(buf, " mode='%s'",
virMacvtapModeTypeToString(def->data.direct.mode)); virMacvtapModeTypeToString(def->data.direct.mode));
virBufferAddLit(buf, "/>\n"); virBufferAddLit(buf, "/>\n");
virVirtualPortProfileFormat(buf, &def->data.direct.virtPortProfile, virVirtualPortProfileFormat(buf, def->data.direct.virtPortProfile,
" "); " ");
break; break;

View File

@ -381,7 +381,7 @@ struct _virDomainNetDef {
struct { struct {
char *linkdev; char *linkdev;
int mode; /* enum virMacvtapMode from util/macvtap.h */ int mode; /* enum virMacvtapMode from util/macvtap.h */
virVirtualPortProfileParams virtPortProfile; virVirtualPortProfileParamsPtr virtPortProfile;
} direct; } direct;
} data; } data;
struct { struct {

View File

@ -127,7 +127,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def,
rc = openMacvtapTap(net->ifname, net->mac, net->data.direct.linkdev, rc = openMacvtapTap(net->ifname, net->mac, net->data.direct.linkdev,
net->data.direct.mode, vnet_hdr, def->uuid, net->data.direct.mode, vnet_hdr, def->uuid,
&net->data.direct.virtPortProfile, &res_ifname, net->data.direct.virtPortProfile, &res_ifname,
vmop, driver->stateDir); vmop, driver->stateDir);
if (rc >= 0) { if (rc >= 0) {
virDomainAuditNetDevice(def, net, res_ifname, true); virDomainAuditNetDevice(def, net, res_ifname, true);
@ -150,7 +150,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def,
VIR_FORCE_CLOSE(rc); VIR_FORCE_CLOSE(rc);
delMacvtap(net->ifname, net->mac, net->data.direct.linkdev, delMacvtap(net->ifname, net->mac, net->data.direct.linkdev,
net->data.direct.mode, net->data.direct.mode,
&net->data.direct.virtPortProfile, net->data.direct.virtPortProfile,
driver->stateDir); driver->stateDir);
VIR_FREE(net->ifname); VIR_FREE(net->ifname);
} }

View File

@ -1616,7 +1616,7 @@ int qemuDomainDetachNetDevice(struct qemud_driver *driver,
if (detach->type == VIR_DOMAIN_NET_TYPE_DIRECT) { if (detach->type == VIR_DOMAIN_NET_TYPE_DIRECT) {
delMacvtap(detach->ifname, detach->mac, detach->data.direct.linkdev, delMacvtap(detach->ifname, detach->mac, detach->data.direct.linkdev,
detach->data.direct.mode, detach->data.direct.mode,
&detach->data.direct.virtPortProfile, detach->data.direct.virtPortProfile,
driver->stateDir); driver->stateDir);
VIR_FREE(detach->ifname); VIR_FREE(detach->ifname);
} }

View File

@ -2347,7 +2347,7 @@ qemuMigrationVPAssociatePortProfiles(virDomainDefPtr def) {
if (vpAssociatePortProfileId(net->ifname, if (vpAssociatePortProfileId(net->ifname,
net->mac, net->mac,
net->data.direct.linkdev, net->data.direct.linkdev,
&net->data.direct.virtPortProfile, net->data.direct.virtPortProfile,
def->uuid, def->uuid,
VIR_VM_OP_MIGRATE_IN_FINISH) != 0) VIR_VM_OP_MIGRATE_IN_FINISH) != 0)
goto err_exit; goto err_exit;
@ -2364,7 +2364,7 @@ err_exit:
vpDisassociatePortProfileId(net->ifname, vpDisassociatePortProfileId(net->ifname,
net->mac, net->mac,
net->data.direct.linkdev, net->data.direct.linkdev,
&net->data.direct.virtPortProfile, net->data.direct.virtPortProfile,
VIR_VM_OP_MIGRATE_IN_FINISH); VIR_VM_OP_MIGRATE_IN_FINISH);
} }
} }

View File

@ -3021,7 +3021,7 @@ void qemuProcessStop(struct qemud_driver *driver,
if (net->type == VIR_DOMAIN_NET_TYPE_DIRECT) { if (net->type == VIR_DOMAIN_NET_TYPE_DIRECT) {
delMacvtap(net->ifname, net->mac, net->data.direct.linkdev, delMacvtap(net->ifname, net->mac, net->data.direct.linkdev,
net->data.direct.mode, net->data.direct.mode,
&net->data.direct.virtPortProfile, driver->stateDir); net->data.direct.virtPortProfile, driver->stateDir);
VIR_FREE(net->ifname); VIR_FREE(net->ifname);
} }
} }

View File

@ -685,7 +685,7 @@ VIR_ENUM_IMPL(virVirtualPort, VIR_VIRTUALPORT_TYPE_LAST,
int int
virVirtualPortProfileParseXML(xmlNodePtr node, virVirtualPortProfileParseXML(xmlNodePtr node,
virVirtualPortProfileParamsPtr virtPort) virVirtualPortProfileParamsPtr *def)
{ {
int ret = -1; int ret = -1;
char *virtPortType; char *virtPortType;
@ -694,8 +694,14 @@ virVirtualPortProfileParseXML(xmlNodePtr node,
char *virtPortTypeIDVersion = NULL; char *virtPortTypeIDVersion = NULL;
char *virtPortInstanceID = NULL; char *virtPortInstanceID = NULL;
char *virtPortProfileID = NULL; char *virtPortProfileID = NULL;
virVirtualPortProfileParamsPtr virtPort = NULL;
xmlNodePtr cur = node->children; xmlNodePtr cur = node->children;
if (VIR_ALLOC(virtPort) < 0) {
virReportOOMError();
return -1;
}
virtPortType = virXMLPropString(node, "type"); virtPortType = virXMLPropString(node, "type");
if (!virtPortType) { if (!virtPortType) {
virSocketError(VIR_ERR_XML_ERROR, "%s", virSocketError(VIR_ERR_XML_ERROR, "%s",
@ -785,7 +791,7 @@ virVirtualPortProfileParseXML(xmlNodePtr node,
} }
virtPort->virtPortType = VIR_VIRTUALPORT_8021QBG; virtPort->virtPortType = VIR_VIRTUALPORT_8021QBG;
ret = 0;
} else { } else {
virSocketError(VIR_ERR_XML_ERROR, "%s", virSocketError(VIR_ERR_XML_ERROR, "%s",
_("a parameter is missing for 802.1Qbg description")); _("a parameter is missing for 802.1Qbg description"));
@ -798,7 +804,6 @@ virVirtualPortProfileParseXML(xmlNodePtr node,
if (virStrcpyStatic(virtPort->u.virtPort8021Qbh.profileID, if (virStrcpyStatic(virtPort->u.virtPort8021Qbh.profileID,
virtPortProfileID) != NULL) { virtPortProfileID) != NULL) {
virtPort->virtPortType = VIR_VIRTUALPORT_8021QBH; virtPort->virtPortType = VIR_VIRTUALPORT_8021QBH;
ret = 0;
} else { } else {
virSocketError(VIR_ERR_XML_ERROR, "%s", virSocketError(VIR_ERR_XML_ERROR, "%s",
_("profileid parameter too long")); _("profileid parameter too long"));
@ -821,7 +826,11 @@ virVirtualPortProfileParseXML(xmlNodePtr node,
break; break;
} }
ret = 0;
*def = virtPort;
virtPort = NULL;
error: error:
VIR_FREE(virtPort);
VIR_FREE(virtPortManagerID); VIR_FREE(virtPortManagerID);
VIR_FREE(virtPortTypeID); VIR_FREE(virtPortTypeID);
VIR_FREE(virtPortTypeIDVersion); VIR_FREE(virtPortTypeIDVersion);

View File

@ -130,7 +130,7 @@ struct _virVirtualPortProfileParams {
int int
virVirtualPortProfileParseXML(xmlNodePtr node, virVirtualPortProfileParseXML(xmlNodePtr node,
virVirtualPortProfileParamsPtr virtPort); virVirtualPortProfileParamsPtr *virtPort);
void void
virVirtualPortProfileFormat(virBufferPtr buf, virVirtualPortProfileFormat(virBufferPtr buf,
virVirtualPortProfileParamsPtr virtPort, virVirtualPortProfileParamsPtr virtPort,