diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0c7d4e4c3e97c75629095c5872d50c27c40d739f..465bf84085e8bfefb8aaa067e7643441c513f783 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13699,6 +13699,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) @@ -14139,6 +14175,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,