mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
conf: move 'generated' member from virMacAddr to virDomainNetDef
Commit7e62c4cd26
(first appearing in libvirt-3.9.0 as a resolution to rhbz #1343919) added a "generated" attribute to virMacAddr that was set whenever a mac address was auto-generated by libvirt. This knowledge was used in a single place - when trying to match a NetDef from the Domain to Delete with user-provided XML. Since the XML parser always auto-generates a MAC address for NetDefs when none is provided, it was previously impossible to make a search where the MAC address isn't significant, but the addition of the "generated" attribute made it possible for the search function to ignore auto-generated MACs. This implementation had a problem though - it was adding a field to a "low level" struct - virMacAddr - which is used in other places with the assumption that it contains exactly a 6 byte MAC address and nothing else. In particular, virNWFilterSnoopEthHdr uses virMacAddr as part of the definition of an ethernet packet header, whose layout must of course match an actual ethernet packet. Adding the extra bools into virNWFilterSnoopEthHdr caused the nwfilter driver's "IP discovery via DHCP packet snooping" functionality to mysteriously stop working. In order to fix that behavior, and prevent potential future similar odd behavior, this patch moves the "generated" member out of virMacAddr (so that it is again really is just a MAC address) into virDomainNetDef, and sets it only when virDomainNetGenerateMAC() is called from virDomainNetDefParseXML() (which is the only time we care about it). Resolves: https://bugzilla.redhat.com/1529338 (It should also be applied to any maintenance branch that applies commit7e62c4cd26
and friends to resolve https://bugzilla.redhat.com/1343919) Signed-off-by: Laine Stump <laine@laine.org>
This commit is contained in:
parent
2f06f433ad
commit
e62cb4a9b7
@ -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);
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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. */
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user