Check the bus, type of the source device (tcp vs. spicevmc)
and the device address visible in the guest.
https://bugzilla.redhat.com/show_bug.cgi?id=1035128
---
src/conf/domain_conf.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0af5be7..9f1c020 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13693,6 +13693,42 @@ virDomainHubDefCheckABIStability(virDomainHubDefPtr src,
return true;
}
+
+static bool
+virDomainRedirdevDefCheckABIStability(virDomainRedirdevDefPtr src,
+ virDomainRedirdevDefPtr dst)
+{
+ if (src->bus != dst->bus) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target redirected device bus %s does not match "
+ "source %s"),
+ virDomainRedirdevBusTypeToString(dst->bus),
+ virDomainRedirdevBusTypeToString(src->bus));
+ return false;
+ }
+
+ switch ((enum virDomainRedirdevBus) src->bus) {
+ case VIR_DOMAIN_REDIRDEV_BUS_USB:
+ if (src->source.chr.type != dst->source.chr.type) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target redirected device source type %s does "
+ "not match source device source type %s"),
+ virDomainChrTypeToString(dst->source.chr.type),
+ virDomainChrTypeToString(src->source.chr.type));
+ return false;
+ }
+ break;
+ case VIR_DOMAIN_REDIRDEV_BUS_LAST:
+ break;
+ }
+
+ if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info))
+ return false;
+
+ return true;
+}
+
+
static bool
virDomainRedirFilterDefCheckABIStability(virDomainRedirFilterDefPtr src,
virDomainRedirFilterDefPtr dst)
@@ -14133,6 +14169,20 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
if (!virDomainHubDefCheckABIStability(src->hubs[i], dst->hubs[i]))
goto error;
+ if (src->nredirdevs != dst->nredirdevs) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target domain redirected devices count %zu "
+ "does not match source %zu"),
+ dst->nconsoles, src->nconsoles);
+ goto error;
+ }
+
+ for (i = 0; i < src->nredirdevs; i++) {
+ if (!virDomainRedirdevDefCheckABIStability(src->redirdevs[i],
+ dst->redirdevs[i]))
+ goto error;
+ }
+
if ((!src->redirfilter && dst->redirfilter) ||
(src->redirfilter && !dst->redirfilter)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,