diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fdf5ad19ee..970efbb13c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -11064,6 +11064,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, } } else { virDomainNetGenerateMAC(xmlopt, &def->mac); + def->mac_generated = true; } if (devaddr) { @@ -16338,7 +16339,7 @@ virDomainNetFindIdx(virDomainDefPtr def, virDomainNetDefPtr net) size_t i; int matchidx = -1; char mac[VIR_MAC_STRING_BUFLEN]; - bool MACAddrSpecified = !net->mac.generated; + bool MACAddrSpecified = !net->mac_generated; bool PCIAddrSpecified = virDomainDeviceAddressIsValid(&net->info, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index bf4ff64739..117efb1d1d 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -966,6 +966,7 @@ struct _virDomainActualNetDef { struct _virDomainNetDef { virDomainNetType type; virMacAddr mac; + bool mac_generated; /* true if mac was *just now* auto-generated by libvirt */ char *model; union { struct { diff --git a/src/util/virmacaddr.c b/src/util/virmacaddr.c index 409fdc34d5..7afe032b9c 100644 --- a/src/util/virmacaddr.c +++ b/src/util/virmacaddr.c @@ -107,7 +107,6 @@ void virMacAddrSet(virMacAddrPtr dst, const virMacAddr *src) { memcpy(dst, src, sizeof(*src)); - dst->generated = false; } /** @@ -121,7 +120,6 @@ void virMacAddrSetRaw(virMacAddrPtr dst, const unsigned char src[VIR_MAC_BUFLEN]) { memcpy(dst->addr, src, VIR_MAC_BUFLEN); - dst->generated = false; } /** @@ -151,7 +149,6 @@ virMacAddrParse(const char* str, virMacAddrPtr addr) { size_t i; - addr->generated = false; errno = 0; for (i = 0; i < VIR_MAC_BUFLEN; i++) { char *end_ptr; @@ -220,7 +217,6 @@ virMacAddrParseHex(const char *str, virMacAddrPtr addr) str[VIR_MAC_HEXLEN]) return -1; - addr->generated = false; for (i = 0; i < VIR_MAC_BUFLEN; i++) addr->addr[i] = (virHexToBin(str[2 * i]) << 4 | virHexToBin(str[2 * i + 1])); @@ -236,7 +232,6 @@ void virMacAddrGenerate(const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN], addr->addr[3] = virRandomBits(8); addr->addr[4] = virRandomBits(8); addr->addr[5] = virRandomBits(8); - addr->generated = true; } /* The low order bit of the first byte is the "multicast" bit. */ diff --git a/src/util/virmacaddr.h b/src/util/virmacaddr.h index ef4285d639..d0dd4a45c6 100644 --- a/src/util/virmacaddr.h +++ b/src/util/virmacaddr.h @@ -36,9 +36,14 @@ typedef virMacAddr *virMacAddrPtr; struct _virMacAddr { unsigned char addr[VIR_MAC_BUFLEN]; - bool generated; /* True if MAC address was autogenerated, - false otherwise. */ }; +/* This struct is used as a part of a larger struct that is + * overlaid on an ethernet packet captured with libpcap, so it + * must not have any extra members added - it must remain exactly + * 6 bytes in length. + */ +verify(sizeof(struct _virMacAddr) == 6); + int virMacAddrCompare(const char *mac1, const char *mac2); int virMacAddrCmp(const virMacAddr *mac1, const virMacAddr *mac2); diff --git a/tests/bhyveargv2xmlmock.c b/tests/bhyveargv2xmlmock.c index dd25f4e13a..1f08bebb7b 100644 --- a/tests/bhyveargv2xmlmock.c +++ b/tests/bhyveargv2xmlmock.c @@ -16,7 +16,6 @@ virMacAddrGenerate(const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN], addr->addr[3] = 0; addr->addr[4] = 0; addr->addr[5] = 0; - addr->generated = true; } int