diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 651f2ad279..84ffd93b7f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -19854,6 +19854,20 @@ virDomainFsDefCheckABIStability(virDomainFSDef *src, } +bool +virDomainNetBackendIsEqual(virDomainNetBackend *src, + virDomainNetBackend *dst) +{ + if (src->type != dst->type || + STRNEQ_NULLABLE(src->tap, dst->tap) || + STRNEQ_NULLABLE(src->vhost, dst->vhost) || + STRNEQ_NULLABLE(src->logFile, dst->logFile)) { + return false; + } + return true; +} + + static bool virDomainNetDefCheckABIStability(virDomainNetDef *src, virDomainNetDef *dst) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 31839c96e5..2a8ad17f44 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3863,6 +3863,8 @@ virDomainNetDef *virDomainNetFindByName(virDomainDef *def, const char *ifname); bool virDomainHasNet(virDomainDef *def, virDomainNetDef *net); int virDomainNetInsert(virDomainDef *def, virDomainNetDef *net); int virDomainNetUpdate(virDomainDef *def, size_t netidx, virDomainNetDef *newnet); +bool virDomainNetBackendIsEqual(virDomainNetBackend *src, + virDomainNetBackend *dst); int virDomainNetDHCPInterfaces(virDomainDef *def, virDomainInterfacePtr **ifaces); int virDomainNetARPInterfaces(virDomainDef *def, virDomainInterfacePtr **ifaces); virDomainNetDef *virDomainNetRemove(virDomainDef *def, size_t i); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 97c3d86217..c6c47dbfac 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -528,6 +528,7 @@ virDomainMouseModeTypeToString; virDomainNetAllocateActualDevice; virDomainNetAppendIPAddress; virDomainNetARPInterfaces; +virDomainNetBackendIsEqual; virDomainNetBandwidthUpdate; virDomainNetDefActualFromNetworkPort; virDomainNetDefActualToNetworkPort; diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index c490e2b97a..b4cddef9f5 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3675,6 +3675,15 @@ qemuDomainChangeNet(virQEMUDriver *driver, goto cleanup; } + /* nothing in can be modified in an existing interface - + * the entire device will need to be removed and re-added. + */ + if (!virDomainNetBackendIsEqual(&olddev->backend, &newdev->backend)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("cannot modify network device backend settings")); + goto cleanup; + } + /* allocate new actual device to compare to old - we will need to * free it if we fail for any reason */