diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index cac00c7f17..2c8727de54 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9665,7 +9665,7 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
return NULL;
}
- if (!macaddr) {
+ if (!macaddr || virMacAddrIsAllClear(&def->mac)) {
virDomainNetGenerateMAC(xmlopt, &def->mac);
def->mac_generated = true;
}
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 1e3e407097..f8cda2f773 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2743,6 +2743,7 @@ virMacAddrCompare;
virMacAddrFormat;
virMacAddrGenerate;
virMacAddrGetRaw;
+virMacAddrIsAllClear;
virMacAddrIsBroadcastRaw;
virMacAddrIsMulticast;
virMacAddrIsUnicast;
diff --git a/src/util/virmacaddr.c b/src/util/virmacaddr.c
index 073f298b5b..e06bb200fc 100644
--- a/src/util/virmacaddr.c
+++ b/src/util/virmacaddr.c
@@ -246,6 +246,11 @@ virMacAddrIsBroadcastRaw(const unsigned char s[VIR_MAC_BUFLEN])
return memcmp(virMacAddrBroadcastAddrRaw, s, sizeof(*s)) == 0;
}
+bool virMacAddrIsAllClear(const virMacAddr *addr)
+{
+ return !virMacAddrCmpRaw(addr, (const unsigned char[VIR_MAC_BUFLEN]){0});
+}
+
void
virMacAddrFree(virMacAddr *addr)
{
diff --git a/src/util/virmacaddr.h b/src/util/virmacaddr.h
index f32b58805a..7b9eb7443b 100644
--- a/src/util/virmacaddr.h
+++ b/src/util/virmacaddr.h
@@ -58,6 +58,7 @@ int virMacAddrParseHex(const char* str,
bool virMacAddrIsUnicast(const virMacAddr *addr);
bool virMacAddrIsMulticast(const virMacAddr *addr);
bool virMacAddrIsBroadcastRaw(const unsigned char s[VIR_MAC_BUFLEN]);
+bool virMacAddrIsAllClear(const virMacAddr *addr);
void virMacAddrFree(virMacAddr *addr);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(virMacAddr, virMacAddrFree);
diff --git a/tests/genericxml2xmlindata/network-interface-mac-clear.xml b/tests/genericxml2xmlindata/network-interface-mac-clear.xml
new file mode 100644
index 0000000000..41beda8a79
--- /dev/null
+++ b/tests/genericxml2xmlindata/network-interface-mac-clear.xml
@@ -0,0 +1,21 @@
+
+ QEMUGuest1
+ c7a5fdbd-edaf-9455-926a-d65c16db1809
+ 219136
+ 219136
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+
+
+
+
+
+
diff --git a/tests/genericxml2xmloutdata/network-interface-mac-clear.xml b/tests/genericxml2xmloutdata/network-interface-mac-clear.xml
new file mode 100644
index 0000000000..a7935fa9f4
--- /dev/null
+++ b/tests/genericxml2xmloutdata/network-interface-mac-clear.xml
@@ -0,0 +1,21 @@
+
+ QEMUGuest1
+ c7a5fdbd-edaf-9455-926a-d65c16db1809
+ 219136
+ 219136
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+
+
+
+
+
+
diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c
index ce8073e85a..3cf9bd8159 100644
--- a/tests/genericxml2xmltest.c
+++ b/tests/genericxml2xmltest.c
@@ -187,6 +187,7 @@ mymain(void)
DO_TEST("cpu-cache-disable");
DO_TEST("network-interface-mac-check");
+ DO_TEST_DIFFERENT("network-interface-mac-clear");
DO_TEST_DIFFERENT("chardev-tcp");
DO_TEST_FAIL_ACTIVE("chardev-tcp-missing-host");
@@ -257,4 +258,5 @@ mymain(void)
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
-VIR_TEST_MAIN(mymain)
+VIR_TEST_MAIN_PRELOAD(mymain,
+ VIR_TEST_MOCK("virrandom"))