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(¶llelsDomainDefParserConfig,
+ 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