diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 1d29ce642a..c7ec92f22a 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 bbc01972f5..9bb22a73aa 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 aac2b41838..9efcb07d43 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 f3647a3eea..45a79a40fa 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 c63919912f..3a213958c8 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 36e4ee06f7..7fc15d3505 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 b208dd8fb1..ed3e832f5d 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 bf682c5d83..32818ffcea 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 ce8c2b5b6e..05e0d45f60 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 439e457cdc..22dea79018 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 583a4157c5..180d047b6c 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 7de9cc07da..c6833f734e 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 8716d4d284..07f230f90b 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 748fd408a0..7760542a27 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 ae7c96be50..493e5f8a3f 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 d02110518b..4490d0c2a1 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 ed63f50100..d8d26116a2 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 67fbe6c6f0..5dc5046187 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 fe6252c627..67610909ba 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 d80397211e..69bc6cdbf4 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 429dc81ddc..d63ac52aac 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 7e2d4caf1d..659b0c8757 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");