[libvirt] [PATCH 6/8] domain_conf: Move MAC generation to post parse callback

Michal Privoznik mprivozn at redhat.com
Tue Sep 17 14:46:06 UTC 2013


Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/conf/domain_conf.c     | 33 ++++++++++++++++++++-------------
 src/conf/domain_conf.h     |  4 +++-
 src/openvz/openvz_conf.c   |  1 +
 src/openvz/openvz_driver.c | 10 +++++++---
 src/qemu/qemu_command.c    |  7 +++----
 src/vbox/vbox_tmpl.c       |  1 +
 src/vmx/vmx.c              |  2 ++
 src/xenapi/xenapi_driver.c |  1 +
 src/xenxs/xen_sxpr.c       |  1 +
 src/xenxs/xen_xm.c         |  1 +
 tests/openvzutilstest.c    |  1 -
 11 files changed, 40 insertions(+), 22 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7c92e51..f2a96e9 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2802,7 +2802,8 @@ virDomainDefPostParseInternal(virDomainDefPtr def,
 static int
 virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
                                     virDomainDefPtr def,
-                                    virCapsPtr caps ATTRIBUTE_UNUSED)
+                                    virCapsPtr caps ATTRIBUTE_UNUSED,
+                                    virDomainXMLOptionPtr xmlopt)
 {
     if (dev->type == VIR_DOMAIN_DEVICE_CHR) {
         virDomainChrDefPtr chr = dev->data.chr;
@@ -2845,6 +2846,13 @@ virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
         }
     }
 
+    if (dev->type == VIR_DOMAIN_DEVICE_NET) {
+        virDomainNetDefPtr net = dev->data.net;
+
+        if (!net->macUsable)
+            virDomainNetGenerateMAC(xmlopt, net);
+    }
+
     return 0;
 }
 
@@ -2864,7 +2872,7 @@ virDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
             return ret;
     }
 
-    if ((ret = virDomainDeviceDefPostParseInternal(dev, def, caps)) < 0)
+    if ((ret = virDomainDeviceDefPostParseInternal(dev, def, caps, xmlopt)) < 0)
         return ret;
 
     return 0;
@@ -5892,9 +5900,10 @@ cleanup:
 
 void
 virDomainNetGenerateMAC(virDomainXMLOptionPtr xmlopt,
-                        virMacAddrPtr mac)
+                        virDomainNetDefPtr net)
 {
-    virMacAddrGenerate(xmlopt->config.macPrefix, mac);
+    virMacAddrGenerate(xmlopt->config.macPrefix, &net->mac);
+    net->macUsable = true;
 }
 
 
@@ -6218,8 +6227,7 @@ error:
  * @return 0 on success, -1 on failure
  */
 static virDomainNetDefPtr
-virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
-                        xmlNodePtr node,
+virDomainNetDefParseXML(xmlNodePtr node,
                         xmlXPathContextPtr ctxt,
                         virHashTablePtr bootHash,
                         unsigned int flags)
@@ -6402,8 +6410,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
                            (const char *)macaddr);
             goto error;
         }
-    } else {
-        virDomainNetGenerateMAC(xmlopt, &def->mac);
+        def->macUsable = true;
     }
 
     if (devaddr) {
@@ -9522,7 +9529,7 @@ virDomainDeviceDefParse(const char *xmlStr,
             goto error;
         break;
     case VIR_DOMAIN_DEVICE_NET:
-        if (!(dev->data.net = virDomainNetDefParseXML(xmlopt, node, ctxt,
+        if (!(dev->data.net = virDomainNetDefParseXML(node, ctxt,
                                                       NULL, flags)))
             goto error;
         break;
@@ -11851,8 +11858,7 @@ virDomainDefParseXML(xmlDocPtr xml,
     if (n && VIR_ALLOC_N(def->nets, n) < 0)
         goto error;
     for (i = 0; i < n; i++) {
-        virDomainNetDefPtr net = virDomainNetDefParseXML(xmlopt,
-                                                         nodes[i],
+        virDomainNetDefPtr net = virDomainNetDefParseXML(nodes[i],
                                                          ctxt,
                                                          bootHash,
                                                          flags);
@@ -14945,8 +14951,9 @@ virDomainNetDefFormat(virBufferPtr buf,
     virBufferAddLit(buf, ">\n");
 
     virBufferAdjustIndent(buf, 6);
-    virBufferAsprintf(buf, "<mac address='%s'/>\n",
-                      virMacAddrFormat(&def->mac, macstr));
+    if (def->macUsable)
+        virBufferAsprintf(buf, "<mac address='%s'/>\n",
+                          virMacAddrFormat(&def->mac, macstr));
 
     switch (def->type) {
     case VIR_DOMAIN_NET_TYPE_NETWORK:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index a65ee3e..0ac3478 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -974,6 +974,7 @@ struct _virDomainActualNetDef {
 struct _virDomainNetDef {
     enum virDomainNetType type;
     virMacAddr mac;
+    bool macUsable; /* @mac has been parsed and is set */
     char *model;
     union {
         struct {
@@ -2166,7 +2167,8 @@ virDomainXMLOptionPtr virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
                                             virDomainXMLPrivateDataCallbacksPtr priv,
                                             virDomainXMLNamespacePtr xmlns);
 
-void virDomainNetGenerateMAC(virDomainXMLOptionPtr xmlopt, virMacAddrPtr mac);
+void virDomainNetGenerateMAC(virDomainXMLOptionPtr xmlopt,
+                             virDomainNetDefPtr net);
 
 virDomainXMLNamespacePtr
 virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr xmlopt)
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index 0dbaa4a..a95da19 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -321,6 +321,7 @@ openvzReadNetworkConf(virDomainDefPtr def,
                                        _("Wrong MAC address"));
                         goto error;
                     }
+                    net->macUsable = true;
                 }
                 p = ++next;
             } while (p < token + strlen(token));
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index d268647..993e037 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -809,7 +809,7 @@ openvzDomainSetNetwork(virConnectPtr conn, const char *vpsid,
 {
     int rc = -1;
     char macaddr[VIR_MAC_STRING_BUFLEN];
-    virMacAddr host_mac;
+    virDomainNetDefPtr hostDev = NULL;
     char host_macaddr[VIR_MAC_STRING_BUFLEN];
     struct openvz_driver *driver =  conn->privateData;
     virCommandPtr cmd = NULL;
@@ -827,11 +827,14 @@ openvzDomainSetNetwork(virConnectPtr conn, const char *vpsid,
         net->type != VIR_DOMAIN_NET_TYPE_ETHERNET)
         return 0;
 
+    if (VIR_ALLOC(hostDev) < 0)
+        return rc;
+
     cmd = virCommandNewArgList(VZCTL, "--quiet", "set", vpsid, NULL);
 
     virMacAddrFormat(&net->mac, macaddr);
-    virDomainNetGenerateMAC(driver->xmlopt, &host_mac);
-    virMacAddrFormat(&host_mac, host_macaddr);
+    virDomainNetGenerateMAC(driver->xmlopt, hostDev);
+    virMacAddrFormat(&hostDev->mac, host_macaddr);
 
     if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
         (net->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
@@ -899,6 +902,7 @@ openvzDomainSetNetwork(virConnectPtr conn, const char *vpsid,
  cleanup:
     virCommandFree(cmd);
     VIR_FREE(guest_ifname);
+    virDomainNetDefFree(hostDev);
     return rc;
 }
 
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 4628dac..d83d015 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -10244,7 +10244,6 @@ qemuParseCommandLineNet(virDomainXMLOptionPtr xmlopt,
     const char *nic;
     int wantvlan = 0;
     const char *tmp;
-    bool genmac = true;
     size_t i;
 
     tmp = strchr(val, ',');
@@ -10333,7 +10332,6 @@ qemuParseCommandLineNet(virDomainXMLOptionPtr xmlopt,
 
     for (i = 0; i < nkeywords; i++) {
         if (STREQ(keywords[i], "macaddr")) {
-            genmac = false;
             if (virMacAddrParse(values[i], &def->mac) < 0) {
                 virReportError(VIR_ERR_INTERNAL_ERROR,
                                _("unable to parse mac address '%s'"),
@@ -10342,6 +10340,7 @@ qemuParseCommandLineNet(virDomainXMLOptionPtr xmlopt,
                 def = NULL;
                 goto cleanup;
             }
+            def->macUsable = true;
         } else if (STREQ(keywords[i], "model")) {
             def->model = values[i];
             values[i] = NULL;
@@ -10363,8 +10362,8 @@ qemuParseCommandLineNet(virDomainXMLOptionPtr xmlopt,
         }
     }
 
-    if (genmac)
-        virDomainNetGenerateMAC(xmlopt, &def->mac);
+    if (!def->macUsable)
+        virDomainNetGenerateMAC(xmlopt, def);
 
 cleanup:
     for (i = 0; i < nkeywords; i++) {
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 5e5ea85..66e6cbc 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -3031,6 +3031,7 @@ sharedFoldersCleanup:
                         /* XXX some real error handling here some day ... */
                         if (virMacAddrParse(macaddr, &def->nets[netAdpIncCnt]->mac) < 0)
                         {}
+                        def->nets[netAdpIncCnt]->macUsable = true;
 
                         netAdpIncCnt++;
 
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index 40416a0..8410473 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -2510,6 +2510,7 @@ virVMXParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def)
                                generatedAddress);
                 goto cleanup;
             }
+            (*def)->macUsable = true;
         }
     } else if (STRCASEEQ(addressType, "static")) {
         if (address != NULL) {
@@ -2519,6 +2520,7 @@ virVMXParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def)
                                  "found '%s'"), address_name, address);
                 goto cleanup;
             }
+            (*def)->macUsable = true;
         }
     } else {
         virReportError(VIR_ERR_INTERNAL_ERROR,
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
index bca19af..d13e712 100644
--- a/src/xenapi/xenapi_driver.c
+++ b/src/xenapi/xenapi_driver.c
@@ -1519,6 +1519,7 @@ xenapiDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
                                     &defPtr->nets[i]->mac) < 0)
                     xenapiSessionErrorHandler(dom->conn, VIR_ERR_INTERNAL_ERROR,
                                               _("Unable to parse given mac address"));
+                defPtr->nets[i]->macUsable = true;
                 xen_vif_record_free(vif_rec);
             }
         }
diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c
index 6209c68..9d1d374 100644
--- a/src/xenxs/xen_sxpr.c
+++ b/src/xenxs/xen_sxpr.c
@@ -589,6 +589,7 @@ xenParseSxprNets(virDomainDefPtr def,
                                    _("malformed mac address '%s'"), tmp);
                     goto cleanup;
                 }
+                net->macUsable = true;
             }
 
             if (VIR_STRDUP(net->model, model) < 0)
diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c
index 1ffea84..79bd952 100644
--- a/src/xenxs/xen_xm.c
+++ b/src/xenxs/xen_xm.c
@@ -743,6 +743,7 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
                                    _("malformed mac address '%s'"), mac);
                     goto cleanup;
                 }
+                net->macUsable = true;
             }
 
             if (bridge[0] || STREQ_NULLABLE(script, "vif-bridge") ||
diff --git a/tests/openvzutilstest.c b/tests/openvzutilstest.c
index ee68c06..f418e50 100644
--- a/tests/openvzutilstest.c
+++ b/tests/openvzutilstest.c
@@ -94,7 +94,6 @@ testReadNetworkConf(const void *data ATTRIBUTE_UNUSED)
         "  <on_crash>destroy</on_crash>\n"
         "  <devices>\n"
         "    <interface type='ethernet'>\n"
-        "      <mac address='00:00:00:00:00:00'/>\n"
         "      <ip address='194.44.18.88'/>\n"
         "    </interface>\n"
         "    <interface type='bridge'>\n"
-- 
1.8.1.5




More information about the libvir-list mailing list