mirror of https://gitee.com/openkylin/libvirt.git
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.
This commit is contained in:
parent
8960d65674
commit
46becc18ba
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -598,7 +598,6 @@ esxCapsInit(esxPrivate *priv)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
|
||||
virCapabilitiesAddHostMigrateTransport(caps, "vpxmigr");
|
||||
|
||||
caps->defaultConsoleTargetType = esxDefaultConsoleType;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 ||
|
||||
|
|
|
@ -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()))
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -522,6 +522,7 @@ VIR_ENUM_IMPL(virVMXControllerModelSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST,
|
|||
|
||||
virDomainDefParserConfig virVMXDomainDefParserConfig = {
|
||||
.hasWideScsiBus = true,
|
||||
.macPrefix = {0x00, 0x0c, 0x29},
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -34,7 +34,6 @@ testCapsInit(void)
|
|||
|
||||
caps->defaultConsoleTargetType = testDefaultConsoleType;
|
||||
|
||||
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
|
||||
virCapabilitiesAddHostMigrateTransport(caps, "esx");
|
||||
|
||||
/* i686 guest */
|
||||
|
|
|
@ -34,7 +34,6 @@ testCapsInit(void)
|
|||
|
||||
caps->defaultConsoleTargetType = testDefaultConsoleType;
|
||||
|
||||
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
|
||||
virCapabilitiesAddHostMigrateTransport(caps, "esx");
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue