From 46becc18ba125d0fbe2b39c054a105fe9c97c5ab Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 15 Mar 2013 15:44:12 +0100 Subject: [PATCH] virCaps: get rid of macPrefix field 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 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");