diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index a810f569c6..8cbbd7e6e9 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3187,6 +3187,11 @@ + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8d328819af..386b04b5b8 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -11925,6 +11925,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, int rv, val; g_autofree char *macaddr = NULL; g_autofree char *macaddr_type = NULL; + g_autofree char *macaddr_check = NULL; g_autofree char *type = NULL; g_autofree char *network = NULL; g_autofree char *portgroup = NULL; @@ -12006,6 +12007,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, if (!macaddr && virXMLNodeNameEqual(cur, "mac")) { macaddr = virXMLPropString(cur, "address"); macaddr_type = virXMLPropString(cur, "type"); + macaddr_check = virXMLPropString(cur, "check"); } else if (!network && def->type == VIR_DOMAIN_NET_TYPE_NETWORK && virXMLNodeNameEqual(cur, "source")) { @@ -12206,6 +12208,16 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, } def->mac_type = tmp; } + if (macaddr_check) { + int tmpCheck; + if ((tmpCheck = virTristateBoolTypeFromString(macaddr_check)) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("invalid mac address check value: '%s'"), + macaddr_check); + goto error; + } + def->mac_check = tmpCheck; + } if (virDomainDeviceInfoParseXML(xmlopt, node, &def->info, flags | VIR_DOMAIN_DEF_PARSE_ALLOW_BOOT @@ -26555,6 +26567,8 @@ virDomainNetDefFormat(virBufferPtr buf, virMacAddrFormat(&def->mac, macstr)); if (def->mac_type) virBufferAsprintf(buf, " type='%s'", virDomainNetMacTypeTypeToString(def->mac_type)); + if (def->mac_check != VIR_TRISTATE_BOOL_ABSENT) + virBufferAsprintf(buf, " check='%s'", virTristateBoolTypeToString(def->mac_check)); virBufferAddLit(buf, "/>\n"); if (publicActual) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 241149af24..6e9da298b4 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -982,6 +982,7 @@ struct _virDomainNetDef { virMacAddr mac; bool mac_generated; /* true if mac was *just now* auto-generated by libvirt */ virDomainNetMacType mac_type; + virTristateBool mac_check; int model; /* virDomainNetModelType */ char *modelstr; union { diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 72f6a7d8dd..a123a8807c 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2638,6 +2638,14 @@ virVMXParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def) goto cleanup; } + if (checkMACAddress) { + if (STREQ(checkMACAddress, "true")) { + (*def)->mac_check = VIR_TRISTATE_BOOL_YES; + } else { + (*def)->mac_check = VIR_TRISTATE_BOOL_NO; + } + } + /* vmx:virtualDev, vmx:features -> def:model */ if (virVMXGetConfigString(conf, virtualDev_name, &virtualDev, true) < 0 || virVMXGetConfigLong(conf, features_name, &features, 0, true) < 0) { @@ -3865,6 +3873,9 @@ virVMXFormatEthernet(virDomainNetDefPtr def, int controller, mac_check = VIR_TRISTATE_BOOL_ABSENT; } + if (def->mac_check != VIR_TRISTATE_BOOL_ABSENT) + mac_check = def->mac_check; + if (mac_type == VIR_DOMAIN_NET_MAC_TYPE_GENERATED) { virBufferAsprintf(buffer, "ethernet%d.addressType = \"%s\"\n", controller, mac_vpx ? "vpx" : "generated"); diff --git a/tests/genericxml2xmlindata/network-interface-mac-check.xml b/tests/genericxml2xmlindata/network-interface-mac-check.xml new file mode 100644 index 0000000000..a84452fbaf --- /dev/null +++ b/tests/genericxml2xmlindata/network-interface-mac-check.xml @@ -0,0 +1,29 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + + + + + + + + + + + + + + diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c index 8b9b0bafb6..102abfdec2 100644 --- a/tests/genericxml2xmltest.c +++ b/tests/genericxml2xmltest.c @@ -183,6 +183,8 @@ mymain(void) DO_TEST("cpu-cache-passthrough"); DO_TEST("cpu-cache-disable"); + DO_TEST("network-interface-mac-check"); + DO_TEST_DIFFERENT("chardev-tcp"); DO_TEST_FULL("chardev-tcp-missing-host", 0, false, TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE); diff --git a/tests/vmx2xmldata/vmx2xml-ethernet-other.xml b/tests/vmx2xmldata/vmx2xml-ethernet-other.xml index b90dfe5d9b..ef324405d7 100644 --- a/tests/vmx2xmldata/vmx2xml-ethernet-other.xml +++ b/tests/vmx2xmldata/vmx2xml-ethernet-other.xml @@ -12,7 +12,7 @@ destroy - +