[libvirt] [PATCH v5.1 10/11] virCaps: get rid of macPrefix field

Peter Krempa pkrempa at redhat.com
Thu Apr 4 12:10:20 UTC 2013


Use the virDomainXMLConf structure to hold this data and tweak the code
to avoid semantic change.

Without configuration the KVM mac prefix is used by default. I chose it
as it's in the privately administered segment so it should be usable for
any purposes.
---
 src/conf/capabilities.c          | 14 --------------
 src/conf/capabilities.h          |  9 ---------
 src/conf/domain_conf.c           | 28 ++++++++++++++++++++++++----
 src/conf/domain_conf.h           |  3 +++
 src/esx/esx_driver.c             |  1 -
 src/libvirt_private.syms         |  3 +--
 src/libxl/libxl_conf.c           |  2 --
 src/libxl/libxl_driver.c         |  6 +++++-
 src/lxc/lxc_conf.c               |  3 ---
 src/openvz/openvz_conf.c         |  2 --
 src/openvz/openvz_driver.c       |  2 +-
 src/parallels/parallels_driver.c | 12 ++++++++----
 src/phyp/phyp_driver.c           |  4 ----
 src/qemu/qemu_capabilities.c     |  3 ---
 src/qemu/qemu_command.c          |  6 +++---
 src/vbox/vbox_tmpl.c             | 10 +++++++---
 src/vmware/vmware_conf.c         |  2 --
 src/vmx/vmx.c                    |  1 +
 src/xen/xen_driver.c             |  7 ++++++-
 src/xen/xen_hypervisor.c         |  2 --
 tests/vmx2xmltest.c              |  1 -
 tests/xml2vmxtest.c              |  1 -
 22 files changed, 59 insertions(+), 63 deletions(-)

diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index 1d29ce6..c7ec92f 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -921,17 +921,3 @@ virCapabilitiesFormatXML(virCapsPtr caps)

     return virBufferContentAndReset(&xml);
 }
-
-extern void
-virCapabilitiesSetMacPrefix(virCapsPtr caps,
-                            const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN])
-{
-    memcpy(caps->macPrefix, prefix, sizeof(caps->macPrefix));
-}
-
-extern void
-virCapabilitiesGenerateMac(virCapsPtr caps,
-                           virMacAddrPtr mac)
-{
-    virMacAddrGenerate(caps->macPrefix, mac);
-}
diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
index bbc0197..9bb22a7 100644
--- a/src/conf/capabilities.h
+++ b/src/conf/capabilities.h
@@ -162,7 +162,6 @@ struct _virCaps {
     virCapsGuestPtr *guests;

     /* Move to virDomainXMLOption later */
-    unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
     int (*defaultConsoleTargetType)(const char *ostype, virArch guestarch);
 };

@@ -175,14 +174,6 @@ virCapabilitiesNew(virArch hostarch,
 extern void
 virCapabilitiesFreeNUMAInfo(virCapsPtr caps);

-extern void
-virCapabilitiesSetMacPrefix(virCapsPtr caps,
-                            const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN]);
-
-extern void
-virCapabilitiesGenerateMac(virCapsPtr caps,
-                           virMacAddrPtr mac);
-
 extern int
 virCapabilitiesAddHostFeature(virCapsPtr caps,
                               const char *name);
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 3513590..f2269c0 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -791,6 +791,18 @@ virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
     if (xmlns)
         xmlopt->ns = *xmlns;

+    /* Technically this forbids to use one of Xerox's MAC address prefixes in
+     * our hypervisor drivers. This shouldn't ever be a problem.
+     *
+     * Use the KVM prefix as default as it's in the privately administered
+     * range */
+    if (xmlopt->config.macPrefix[0] == 0 &&
+        xmlopt->config.macPrefix[1] == 0 &&
+        xmlopt->config.macPrefix[2] == 0) {
+        xmlopt->config.macPrefix[0] = 0x52;
+        xmlopt->config.macPrefix[1] = 0x54;
+    }
+
     return xmlopt;
 }

@@ -5039,6 +5051,14 @@ cleanup:
 }


+void
+virDomainNetGenerateMAC(virDomainXMLOptionPtr xmlopt,
+                        virMacAddrPtr mac)
+{
+    virMacAddrGenerate(xmlopt->config.macPrefix, mac);
+}
+
+
 /* Parse a value located at XPATH within CTXT, and store the
  * result into val.  If REQUIRED, then the value must exist;
  * otherwise, the value is optional.  The value is in bytes.
@@ -5407,7 +5427,7 @@ error:
  * @return 0 on success, -1 on failure
  */
 static virDomainNetDefPtr
-virDomainNetDefParseXML(virCapsPtr caps,
+virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
                         xmlNodePtr node,
                         xmlXPathContextPtr ctxt,
                         virBitmapPtr bootMap,
@@ -5592,7 +5612,7 @@ virDomainNetDefParseXML(virCapsPtr caps,
             goto error;
         }
     } else {
-        virCapabilitiesGenerateMac(caps, &def->mac);
+        virDomainNetGenerateMAC(xmlopt, &def->mac);
     }

     if (devaddr) {
@@ -8515,7 +8535,7 @@ virDomainDeviceDefParse(const char *xmlStr,
             goto error;
     } else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
         dev->type = VIR_DOMAIN_DEVICE_NET;
-        if (!(dev->data.net = virDomainNetDefParseXML(caps, node, ctxt,
+        if (!(dev->data.net = virDomainNetDefParseXML(xmlopt, node, ctxt,
                                                       NULL, flags)))
             goto error;
     } else if (xmlStrEqual(node->name, BAD_CAST "input")) {
@@ -10492,7 +10512,7 @@ virDomainDefParseXML(xmlDocPtr xml,
     if (n && VIR_ALLOC_N(def->nets, n) < 0)
         goto no_memory;
     for (i = 0 ; i < n ; i++) {
-        virDomainNetDefPtr net = virDomainNetDefParseXML(caps,
+        virDomainNetDefPtr net = virDomainNetDefParseXML(xmlopt,
                                                          nodes[i],
                                                          ctxt,
                                                          bootMap,
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index f3647a3..45a79a4 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1959,6 +1959,7 @@ struct _virDomainDefParserConfig {

     /* data */
     bool hasWideScsiBus;
+    unsigned char macPrefix[VIR_MAC_PREFIX_BUFLEN];
 };

 typedef struct _virDomainXMLPrivateDataCallbacks virDomainXMLPrivateDataCallbacks;
@@ -1974,6 +1975,8 @@ virDomainXMLOptionPtr virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
                                             virDomainXMLPrivateDataCallbacksPtr priv,
                                             virDomainXMLNamespacePtr xmlns);

+void virDomainNetGenerateMAC(virDomainXMLOptionPtr xmlopt, virMacAddrPtr mac);
+
 virDomainXMLNamespacePtr
 virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr xmlopt)
     ATTRIBUTE_NONNULL(1);
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index c639199..3a21395 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -598,7 +598,6 @@ esxCapsInit(esxPrivate *priv)
         return NULL;
     }

-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
     virCapabilitiesAddHostMigrateTransport(caps, "vpxmigr");

     caps->defaultConsoleTargetType = esxDefaultConsoleType;
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 36e4ee0..7fc15d3 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -20,10 +20,8 @@ virCapabilitiesDefaultGuestMachine;
 virCapabilitiesFormatXML;
 virCapabilitiesFreeMachines;
 virCapabilitiesFreeNUMAInfo;
-virCapabilitiesGenerateMac;
 virCapabilitiesNew;
 virCapabilitiesSetHostCPU;
-virCapabilitiesSetMacPrefix;


 # conf/cpu_conf.h
@@ -240,6 +238,7 @@ virDomainMemDumpTypeToString;
 virDomainNetDefFree;
 virDomainNetFind;
 virDomainNetFindIdx;
+virDomainNetGenerateMAC;
 virDomainNetGetActualBandwidth;
 virDomainNetGetActualBridgeName;
 virDomainNetGetActualDirectDev;
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index b208dd8..ed3e832 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -85,8 +85,6 @@ libxlBuildCapabilities(virArch hostarch,
     if ((caps = virCapabilitiesNew(hostarch, 1, 1)) == NULL)
         goto no_memory;

-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x16, 0x3e });
-
     if (host_pae &&
         virCapabilitiesAddHostFeature(caps, "pae") < 0)
         goto no_memory;
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index bf682c5..32818ff 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -431,6 +431,10 @@ virDomainXMLPrivateDataCallbacks libxlDomainXMLPrivateDataCallbacks = {
     .free = libxlDomainObjPrivateFree,
 };

+virDomainDefParserConfig libxlDomainDefParserConfig = {
+    .macPrefix = { 0x00, 0x16, 0x3e },
+};
+
 /* driver must be locked before calling */
 static void
 libxlDomainEventQueue(libxlDriverPrivatePtr driver, virDomainEventPtr event)
@@ -1239,7 +1243,7 @@ libxlStartup(bool privileged,
         goto error;
     }

-    if (!(libxl_driver->xmlopt = virDomainXMLOptionNew(NULL,
+    if (!(libxl_driver->xmlopt = virDomainXMLOptionNew(&libxlDomainDefParserConfig,
                                                        &libxlDomainXMLPrivateDataCallbacks,
                                                        NULL)))
         goto error;
diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c
index ce8c2b5..05e0d45 100644
--- a/src/lxc/lxc_conf.c
+++ b/src/lxc/lxc_conf.c
@@ -79,9 +79,6 @@ virCapsPtr lxcCapsInit(virLXCDriverPtr driver)
         goto error;
     }

-    /* XXX shouldn't 'borrow' KVM's prefix */
-    virCapabilitiesSetMacPrefix(caps, (unsigned char []){ 0x52, 0x54, 0x00 });
-
     if ((guest = virCapabilitiesAddGuest(caps,
                                          "exe",
                                          caps->host.arch,
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index 439e457..22dea79 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -187,8 +187,6 @@ virCapsPtr openvzCapsInit(void)
     if (nodeCapsInitNUMA(caps) < 0)
         goto no_memory;

-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x52, 0x54, 0x00 });
-
     if ((guest = virCapabilitiesAddGuest(caps,
                                          "exe",
                                          caps->host.arch,
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index 583a415..180d047 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -832,7 +832,7 @@ openvzDomainSetNetwork(virConnectPtr conn, const char *vpsid,
     }

     virMacAddrFormat(&net->mac, macaddr);
-    virCapabilitiesGenerateMac(driver->caps, &host_mac);
+    virDomainNetGenerateMAC(driver->xmlopt, &host_mac);
     virMacAddrFormat(&host_mac, host_macaddr);

     if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
index 7de9cc0..c6833f7 100644
--- a/src/parallels/parallels_driver.c
+++ b/src/parallels/parallels_driver.c
@@ -129,9 +129,6 @@ parallelsBuildCapabilities(void)
     if (nodeCapsInitNUMA(caps) < 0)
         goto no_memory;

-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]) {
-                                0x42, 0x1C, 0x00});
-
     if ((guest = virCapabilitiesAddGuest(caps, "hvm",
                                          VIR_ARCH_X86_64,
                                          "parallels",
@@ -911,6 +908,12 @@ parallelsLoadDomains(parallelsConnPtr privconn, const char *domain_name)
     return ret;
 }

+
+virDomainDefParserConfig parallelsDomainDefParserConfig = {
+    .macPrefix = {0x42, 0x1C, 0x00},
+};
+
+
 static int
 parallelsOpenDefault(virConnectPtr conn)
 {
@@ -929,7 +932,8 @@ parallelsOpenDefault(virConnectPtr conn)
     if (!(privconn->caps = parallelsBuildCapabilities()))
         goto error;

-    if (!(privconn->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
+    if (!(privconn->xmlopt = virDomainXMLOptionNew(&parallelsDomainDefParserConfig,
+                                                 NULL, NULL)))
         goto error;

     if (!(privconn->domains = virDomainObjListNew()))
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
index 8716d4d..07f230f 100644
--- a/src/phyp/phyp_driver.c
+++ b/src/phyp/phyp_driver.c
@@ -327,10 +327,6 @@ phypCapsInit(void)
             ("Failed to query host NUMA topology, disabling NUMA capabilities");
     }

-    /* XXX shouldn't 'borrow' KVM's prefix */
-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]) {
-                                0x52, 0x54, 0x00});
-
     if ((guest = virCapabilitiesAddGuest(caps,
                                          "linux",
                                          caps->host.arch,
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 748fd40..7760542 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -876,9 +876,6 @@ virCapsPtr virQEMUCapsInit(virQEMUCapsCachePtr cache)
                                    1, 1)) == NULL)
         goto error;

-    /* Using KVM's mac prefix for QEMU too */
-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x52, 0x54, 0x00 });
-
     /* Some machines have problematic NUMA toplogy causing
      * unexpected failures. We don't want to break the QEMU
      * driver in this scenario, so log errors & carry on
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index ae7c96b..493e5f8 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -8337,7 +8337,7 @@ qemuFindNICForVLAN(int nnics,
  * match up against. Horribly complicated stuff
  */
 static virDomainNetDefPtr
-qemuParseCommandLineNet(virCapsPtr qemuCaps,
+qemuParseCommandLineNet(virDomainXMLOptionPtr xmlopt,
                         const char *val,
                         int nnics,
                         const char **nics)
@@ -8471,7 +8471,7 @@ qemuParseCommandLineNet(virCapsPtr qemuCaps,
     }

     if (genmac)
-        virCapabilitiesGenerateMac(qemuCaps, &def->mac);
+        virDomainNetGenerateMAC(xmlopt, &def->mac);

 cleanup:
     for (i = 0 ; i < nkeywords ; i++) {
@@ -9561,7 +9561,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr qemuCaps,
             WANT_VALUE();
             if (!STRPREFIX(val, "nic") && STRNEQ(val, "none")) {
                 virDomainNetDefPtr net;
-                if (!(net = qemuParseCommandLineNet(qemuCaps, val, nnics, nics)))
+                if (!(net = qemuParseCommandLineNet(xmlopt, val, nnics, nics)))
                     goto error;
                 if (VIR_REALLOC_N(def->nets, def->nnets+1) < 0) {
                     virDomainNetDefFree(net);
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index d021105..4490d0c 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -851,10 +851,16 @@ static int vboxDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED,
 }


+static virDomainDefParserConfig vboxDomainDefParserConfig = {
+    .macPrefix = { 0x08, 0x00, 0x27 },
+};
+
+
 static virDomainXMLOptionPtr
 vboxXMLConfInit(void)
 {
-    return virDomainXMLOptionNew(NULL, NULL, NULL);
+    return virDomainXMLOptionNew(&vboxDomainDefParserConfig,
+                                 NULL, NULL);
 }


@@ -870,8 +876,6 @@ static virCapsPtr vboxCapsInit(void)
     if (nodeCapsInitNUMA(caps) < 0)
         goto no_memory;

-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x08, 0x00, 0x27 });
-
     if ((guest = virCapabilitiesAddGuest(caps,
                                          "hvm",
                                          caps->host.arch,
diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c
index ed63f50..d8d2611 100644
--- a/src/vmware/vmware_conf.c
+++ b/src/vmware/vmware_conf.c
@@ -72,8 +72,6 @@ vmwareCapsInit(void)
     if (nodeCapsInitNUMA(caps) < 0)
         goto error;

-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]) {0x52, 0x54, 0x00});
-
     /* i686 guests are always supported */
     if ((guest = virCapabilitiesAddGuest(caps,
                                          "hvm",
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index 67fbe6c..5dc5046 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -522,6 +522,7 @@ VIR_ENUM_IMPL(virVMXControllerModelSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST,

 virDomainDefParserConfig virVMXDomainDefParserConfig = {
     .hasWideScsiBus = true,
+    .macPrefix = {0x00, 0x0c, 0x29},
 };


diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
index fe6252c..6761090 100644
--- a/src/xen/xen_driver.c
+++ b/src/xen/xen_driver.c
@@ -265,6 +265,10 @@ xenUnifiedXendProbe(void)
 #endif


+virDomainDefParserConfig xenDomainDefParserConfig = {
+    .macPrefix = { 0x00, 0x16, 0x3e },
+};
+

 static virDrvOpenStatus
 xenUnifiedOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags)
@@ -401,7 +405,8 @@ xenUnifiedOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags)
         goto fail;
     }

-    if (!(priv->xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL)))
+    if (!(priv->xmlopt = virDomainXMLOptionNew(&xenDomainDefParserConfig,
+                                               NULL, NULL)))
         goto fail;

 #if WITH_XEN_INOTIFY
diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
index d803972..69bc6cd 100644
--- a/src/xen/xen_hypervisor.c
+++ b/src/xen/xen_hypervisor.c
@@ -2303,8 +2303,6 @@ xenHypervisorBuildCapabilities(virConnectPtr conn, virArch hostarch,
     if ((caps = virCapabilitiesNew(hostarch, 1, 1)) == NULL)
         goto no_memory;

-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x16, 0x3e });
-
     if (hvm_type && STRNEQ(hvm_type, "") &&
         virCapabilitiesAddHostFeature(caps, hvm_type) < 0)
         goto no_memory;
diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c
index 429dc81..d63ac52 100644
--- a/tests/vmx2xmltest.c
+++ b/tests/vmx2xmltest.c
@@ -34,7 +34,6 @@ testCapsInit(void)

     caps->defaultConsoleTargetType = testDefaultConsoleType;

-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
     virCapabilitiesAddHostMigrateTransport(caps, "esx");

     /* i686 guest */
diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c
index 7e2d4ca..659b0c8 100644
--- a/tests/xml2vmxtest.c
+++ b/tests/xml2vmxtest.c
@@ -34,7 +34,6 @@ testCapsInit(void)

     caps->defaultConsoleTargetType = testDefaultConsoleType;

-    virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
     virCapabilitiesAddHostMigrateTransport(caps, "esx");


-- 
1.8.1.5




More information about the libvir-list mailing list