]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: virDomainNetDef points to (rather than contains) virtPortProfile
authorLaine Stump <laine@laine.org>
Mon, 18 Jul 2011 22:44:38 +0000 (18:44 -0400)
committerLaine Stump <laine@laine.org>
Thu, 21 Jul 2011 18:46:39 +0000 (14:46 -0400)
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
src/conf/domain_conf.h
src/qemu/qemu_command.c
src/qemu/qemu_hotplug.c
src/qemu/qemu_migration.c
src/qemu/qemu_process.c
src/util/network.c
src/util/network.h

index 2373e97f1cf367dd65266d32a65dff44d0e519c6..039b47897c60fd3c44671107661ba35344019a64 100644 (file)
@@ -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 (virVirtualPortProfileParseXML(cur, &virtPort))
+                if (virVirtualPortProfileParseXML(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);
@@ -8609,7 +8608,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;
 
index fc7668dd1a50e3166c1bb2a331510dbe76f27898..0e6354bfced1dfc1f470ac87ae578bec12f44a6c 100644 (file)
@@ -381,7 +381,7 @@ struct _virDomainNetDef {
         struct {
             char *linkdev;
             int mode; /* enum virMacvtapMode from util/macvtap.h */
-            virVirtualPortProfileParams virtPortProfile;
+            virVirtualPortProfileParamsPtr virtPortProfile;
         } direct;
     } data;
     struct {
index 938f113998f392852bbe1bf81d7312e0ddfaa5b6..5badf75c4c019e8febd0b6d6eb5ec19cda4e4c6e 100644 (file)
@@ -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);
             }
index 20f0dafa027d9c7a782a1a85e2450ef821a2b660..43914db33cb2126efa9d4f2c47bdcb6f6f70a3b2 100644 (file)
@@ -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);
     }
index 32822718161093024784995be568296f9215133a..5bfcaba8126d80e86066df2ce5b5dac8341f98b7 100644 (file)
@@ -2347,7 +2347,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;
@@ -2364,7 +2364,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);
         }
     }
index 4c6081bb764e17bb74e8459262595b6c19a849ff..98455c5f73ce6f57d4835469482f3d7a520f9808 100644 (file)
@@ -3021,7 +3021,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);
         }
     }
index c7b8fb3c3660705dff29221eff1aff2bd4bff92a..64f5645a913abbf317ac305ae93b2a9ae88c3fd2 100644 (file)
@@ -685,7 +685,7 @@ VIR_ENUM_IMPL(virVirtualPort, VIR_VIRTUALPORT_TYPE_LAST,
 
 int
 virVirtualPortProfileParseXML(xmlNodePtr node,
-                              virVirtualPortProfileParamsPtr virtPort)
+                              virVirtualPortProfileParamsPtr *def)
 {
     int ret = -1;
     char *virtPortType;
@@ -694,8 +694,14 @@ virVirtualPortProfileParseXML(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 @@ virVirtualPortProfileParseXML(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 @@ virVirtualPortProfileParseXML(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 @@ virVirtualPortProfileParseXML(xmlNodePtr node,
     break;
     }
 
+    ret = 0;
+    *def = virtPort;
+    virtPort = NULL;
 error:
+    VIR_FREE(virtPort);
     VIR_FREE(virtPortManagerID);
     VIR_FREE(virtPortTypeID);
     VIR_FREE(virtPortTypeIDVersion);
index 0fda3c1fa17357a368afebef46c9d3d60d440d2d..27347f8e69e36ec4a152d19f8e079aa99fba0831 100644 (file)
@@ -130,7 +130,7 @@ struct _virVirtualPortProfileParams {
 
 int
 virVirtualPortProfileParseXML(xmlNodePtr node,
-                              virVirtualPortProfileParamsPtr virtPort);
+                              virVirtualPortProfileParamsPtr *virtPort);
 void
 virVirtualPortProfileFormat(virBufferPtr buf,
                             virVirtualPortProfileParamsPtr virtPort,