From nobody Sun Feb 8 03:57:58 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) client-ip=216.205.24.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1585258431; cv=none; d=zohomail.com; s=zohoarc; b=kOgNcQHC7PGAXuRkC7rcvFPacdm+eV8WbvtEPNHhn6hyafTmdBuhFre9MKcFKmplorm3l9PZZQNCKW/IwYDMDuyFEK40Y323qn8rZaBPDnWH6XYrEYXJMbmF6ueowTdRoZQ+bEErnL3NRNOG8w9yjg3QSNYK5wEY/AoJSwVEgGM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585258431; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=eAsWGrPE9XS6VJc4IbVL90GK183thZKWsgRSDzpaiP8=; b=TNCKEvK7eWcgyDRgKA68K2vug8zvydd+F/RvLvGKIloD7RkraV7r+YLh7ULi+uYSMwuZfVW+RHkmK7wwTG/35dKwJ+II8gHDvHJym1PszTLArGjBA1QuJND2B5Le1HAUWw/I0xFoOkZU+JLcX+FnJjYcpVHSVBq7KoEntMaSjDw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.zohomail.com with SMTPS id 1585258431574224.76469660511998; Thu, 26 Mar 2020 14:33:51 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-381-jW6w-zNgPQyvjI9LfE2A2g-1; Thu, 26 Mar 2020 17:33:47 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CB73518C35A8; Thu, 26 Mar 2020 21:33:40 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9B81410027AF; Thu, 26 Mar 2020 21:33:40 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 4CEE78A04B; Thu, 26 Mar 2020 21:33:40 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02QLVukr010272 for ; Thu, 26 Mar 2020 17:31:56 -0400 Received: by smtp.corp.redhat.com (Postfix) id 09F4411F4C2; Thu, 26 Mar 2020 21:31:56 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast06.extmail.prod.ext.rdu2.redhat.com [10.11.55.22]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 058046C330 for ; Thu, 26 Mar 2020 21:31:56 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [207.211.31.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id BF474185A78E for ; Thu, 26 Mar 2020 21:31:55 +0000 (UTC) Received: from mail-qv1-f45.google.com (mail-qv1-f45.google.com [209.85.219.45]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-291-RFgCW1bdPzq5sap_dp9GAw-1; Thu, 26 Mar 2020 17:31:50 -0400 Received: by mail-qv1-f45.google.com with SMTP id p60so3914033qva.5; Thu, 26 Mar 2020 14:31:50 -0700 (PDT) Received: from rekt.redhat.com ([2804:431:c7c6:e1ce:90c:c960:468:c347]) by smtp.gmail.com with ESMTPSA id x37sm2357719qtc.90.2020.03.26.14.31.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2020 14:31:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585258430; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=eAsWGrPE9XS6VJc4IbVL90GK183thZKWsgRSDzpaiP8=; b=A0VsF9PkNQ12Sph3migrICg+ufuKsr1P0Dn1QgigeKRNqBIqyQrVM0HGm0zr1OASsIpJAt 07jGp03Atop34TQUj9rzrY4KGPR2y6Y2Bx6l+o8ygJkX4IFmy2oSCsVnC2t4lxpC8omnK9 PfNwKVEp8oIOq4nOy7m0fTVB70knn3Q= X-MC-Unique: jW6w-zNgPQyvjI9LfE2A2g-1 X-MC-Unique: RFgCW1bdPzq5sap_dp9GAw-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7vg4Sb/JuZ8EtURkhSbyMxpjcc7AsBkyREItaiI97Pk=; b=p4kD8+eEQqKfcKyioP4YILJkr+B+1RXAYSlWaxf3OVs0R1kSwuRtcT6u4ea9zzhoq2 L4Pm4XsKtybiUJQaZbkU6Wx6R8wMicYL7DQNxczskMOPET2dlopqMEqgInQZdYUUgqUZ YfHxdecSWvm2Smw3AGs6j2/BQn1DaqlCIXcwj1EIF4xLgNkVAJSnUB1xpUCKzxWABn/0 LEnnoOVzDPcN8rf/r7jjZRVcU7bw54gGsjPMDYUrSqJBbP1rQX70vOsWFkZpQvX2Bx+X Ewe9Gzjfbqad5YIUtbraS1Mep+dS7Mmk4ccZtMgLuoykUAu6YGhzH07TwW27XWkxIsUR 8tgg== X-Gm-Message-State: ANhLgQ3Q9ilyv8FkO3mDYqMR+g1ydRJ1dnPO75jV+Tgrwp/N6UVwRB5w LnFOWmdPO/9dlm12eqPqqJE/DWAd X-Google-Smtp-Source: ADFU+vvR+wXqMMnJHyXGWH75v1wzXFrXE6ChZfFUhe4Spnqj5PkxZyTW77y3Mf+fS7XcIYmcHqho7A== X-Received: by 2002:a0c:90aa:: with SMTP id p39mr10664969qvp.38.1585258309446; Thu, 26 Mar 2020 14:31:49 -0700 (PDT) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 06/15] qemu: move qemuDomainChrDefValidate() to qemu_validate.c Date: Thu, 26 Mar 2020 18:31:16 -0300 Message-Id: <20200326213125.2306013-7-danielhb413@gmail.com> In-Reply-To: <20200326213125.2306013-1-danielhb413@gmail.com> References: <20200326213125.2306013-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 02QLVukr010272 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza , pkrempa@redhat.com, crobinso@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" qemuDomainChrDefValidate() has a lot of static helpers functions that needed to be moved as well. Other functions from qemuDomainDeviceDefValidate() that were also moved: - qemuValidateDomainSmartcardDef - qemuValidateDomainRNGDef - qemuValidateDomainRedirdevDef - qemuValidateDomainWatchdogDef Signed-off-by: Daniel Henrique Barboza Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_domain.c | 383 +-------------------------------------- src/qemu/qemu_validate.c | 373 ++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_validate.h | 11 ++ 3 files changed, 389 insertions(+), 378 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index caf5c5b73d..4726fa015d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5150,379 +5150,6 @@ qemuDomainDeviceDefValidateMemory(virDomainMemoryDe= fPtr mem, } =20 =20 -static int -qemuDomainChrSourceReconnectDefValidate(const virDomainChrSourceReconnectD= ef *def) -{ - if (def->enabled =3D=3D VIR_TRISTATE_BOOL_YES && - def->timeout =3D=3D 0) { - virReportError(VIR_ERR_INVALID_ARG, "%s", - _("chardev reconnect source timeout cannot be '0'")= ); - return -1; - } - - return 0; -} - - -static int -qemuDomainChrSourceDefValidate(const virDomainChrSourceDef *def, - virQEMUCapsPtr qemuCaps) -{ - switch ((virDomainChrType)def->type) { - case VIR_DOMAIN_CHR_TYPE_TCP: - if (qemuDomainChrSourceReconnectDefValidate(&def->data.tcp.reconne= ct) < 0) - return -1; - break; - - case VIR_DOMAIN_CHR_TYPE_UNIX: - if (qemuDomainChrSourceReconnectDefValidate(&def->data.nix.reconne= ct) < 0) - return -1; - break; - - case VIR_DOMAIN_CHR_TYPE_FILE: - if (def->data.file.append !=3D VIR_TRISTATE_SWITCH_ABSENT && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FILE_APPEND)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("append not supported in this QEMU binary")); - return -1; - } - break; - - case VIR_DOMAIN_CHR_TYPE_NULL: - case VIR_DOMAIN_CHR_TYPE_VC: - case VIR_DOMAIN_CHR_TYPE_PTY: - case VIR_DOMAIN_CHR_TYPE_DEV: - case VIR_DOMAIN_CHR_TYPE_PIPE: - case VIR_DOMAIN_CHR_TYPE_STDIO: - case VIR_DOMAIN_CHR_TYPE_UDP: - case VIR_DOMAIN_CHR_TYPE_SPICEVMC: - case VIR_DOMAIN_CHR_TYPE_SPICEPORT: - case VIR_DOMAIN_CHR_TYPE_NMDM: - case VIR_DOMAIN_CHR_TYPE_LAST: - break; - } - - if (def->logfile) { - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_LOGFILE)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("logfile not supported in this QEMU binary")); - return -1; - } - } - - return 0; -} - - -static int -qemuDomainChrSerialTargetTypeToAddressType(int targetType) -{ - switch ((virDomainChrSerialTargetType)targetType) { - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA; - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB; - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO: - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO; - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: - break; - } - - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE; -} - - -static int -qemuDomainChrSerialTargetModelToTargetType(int targetModel) -{ - switch ((virDomainChrSerialTargetModel) targetModel) { - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_16550A: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE: - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP; - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: - break; - } - - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE; -} - - -static int -qemuDomainChrTargetDefValidate(const virDomainChrDef *chr) -{ - int expected; - - switch ((virDomainChrDeviceType)chr->deviceType) { - case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL: - - /* Validate target type */ - switch ((virDomainChrSerialTargetType)chr->targetType) { - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO: - - expected =3D qemuDomainChrSerialTargetTypeToAddressType(chr->t= argetType); - - if (chr->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && - chr->info.type !=3D expected) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target type '%s' requires address type '= %s'"), - virDomainChrSerialTargetTypeToString(chr->t= argetType), - virDomainDeviceAddressTypeToString(expected= )); - return -1; - } - break; - - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: - if (chr->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target type '%s' cannot have an " - "associated address"), - virDomainChrSerialTargetTypeToString(chr->t= argetType)); - return -1; - } - break; - - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: - break; - } - - /* Validate target model */ - switch ((virDomainChrSerialTargetModel) chr->targetModel) { - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_16550A: - - expected =3D qemuDomainChrSerialTargetModelToTargetType(chr->t= argetModel); - - if (chr->targetType !=3D expected) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target model '%s' requires target type '= %s'"), - virDomainChrSerialTargetModelTypeToString(c= hr->targetModel), - virDomainChrSerialTargetTypeToString(expect= ed)); - return -1; - } - break; - - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: - break; - } - break; - - case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE: - case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: - case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL: - case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: - /* Nothing to do */ - break; - } - - return 0; -} - - -static int -qemuDomainChrDefValidate(const virDomainChrDef *dev, - const virDomainDef *def, - virQEMUCapsPtr qemuCaps) -{ - if (qemuDomainChrSourceDefValidate(dev->source, qemuCaps) < 0) - return -1; - - if (qemuDomainChrTargetDefValidate(dev) < 0) - return -1; - - if (dev->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL && - (ARCH_IS_S390(def->os.arch) || qemuDomainIsPSeries(def))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("parallel ports are not supported")); - return -1; - } - - if (dev->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL) { - bool isCompatible =3D true; - - if (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTE= M) { - if (dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL= _PL011 && - !qemuDomainIsARMVirt(def)) { - isCompatible =3D false; - } - if (dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL= _16550A && - !qemuDomainIsRISCVVirt(def)) { - isCompatible =3D false; - } - } - - if (!qemuDomainIsPSeries(def) && - (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAP= R_VIO || - dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SP= APR_VTY)) { - isCompatible =3D false; - } - - if (!ARCH_IS_S390(def->os.arch) && - (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP= || - dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SC= LPCONSOLE || - dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SC= LPLMCONSOLE)) { - isCompatible =3D false; - } - - if (!isCompatible) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Serial device with target type '%s' and " - "target model '%s' not compatible with guest " - "architecture or machine type"), - virDomainChrSerialTargetTypeToString(dev->targe= tType), - virDomainChrSerialTargetModelTypeToString(dev->= targetModel)); - return -1; - } - } - - return 0; -} - - -static int -qemuDomainSmartcardDefValidate(const virDomainSmartcardDef *def, - virQEMUCapsPtr qemuCaps) -{ - switch (def->type) { - case VIR_DOMAIN_SMARTCARD_TYPE_HOST: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("this QEMU binary lacks smartcard host " - "mode support")); - return -1; - } - break; - - case VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("this QEMU binary lacks smartcard host " - "mode support")); - return -1; - } - break; - - case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_PASSTHRU)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("this QEMU binary lacks smartcard " - "passthrough mode support")); - return -1; - } - break; - - default: - virReportEnumRangeError(virDomainSmartcardType, def->type); - return -1; - } - - if (def->type =3D=3D VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH && - qemuDomainChrSourceDefValidate(def->data.passthru, qemuCaps) < 0) - return -1; - - return 0; -} - - -static int -qemuDomainRNGDefValidate(const virDomainRNGDef *def, - virQEMUCapsPtr qemuCaps G_GNUC_UNUSED) -{ - if (def->backend =3D=3D VIR_DOMAIN_RNG_BACKEND_EGD && - qemuDomainChrSourceDefValidate(def->source.chardev, qemuCaps) < 0) - return -1; - - return 0; -} - - -static int -qemuDomainRedirdevDefValidate(const virDomainRedirdevDef *def, - virQEMUCapsPtr qemuCaps) -{ - if (qemuDomainChrSourceDefValidate(def->source, qemuCaps) < 0) - return -1; - - return 0; -} - - -static int -qemuDomainWatchdogDefValidate(const virDomainWatchdogDef *dev, - const virDomainDef *def) -{ - switch ((virDomainWatchdogModel) dev->model) { - case VIR_DOMAIN_WATCHDOG_MODEL_I6300ESB: - if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && - dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s model of watchdog can go only on PCI bus"= ), - virDomainWatchdogModelTypeToString(dev->model)); - return -1; - } - break; - - case VIR_DOMAIN_WATCHDOG_MODEL_IB700: - if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && - dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s model of watchdog can go only on ISA bus"= ), - virDomainWatchdogModelTypeToString(dev->model)); - return -1; - } - break; - - case VIR_DOMAIN_WATCHDOG_MODEL_DIAG288: - if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s model of watchdog is virtual and cannot g= o on any bus."), - virDomainWatchdogModelTypeToString(dev->model)); - return -1; - } - if (!(ARCH_IS_S390(def->os.arch))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("%s model of watchdog is allowed for s390 and= s390x only"), - virDomainWatchdogModelTypeToString(dev->model)); - return -1; - } - break; - - case VIR_DOMAIN_WATCHDOG_MODEL_LAST: - break; - } - - return 0; -} - - int qemuDomainValidateActualNetDef(const virDomainNetDef *net, virQEMUCapsPtr qemuCaps) @@ -7609,23 +7236,23 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDe= f *dev, break; =20 case VIR_DOMAIN_DEVICE_CHR: - ret =3D qemuDomainChrDefValidate(dev->data.chr, def, qemuCaps); + ret =3D qemuValidateDomainChrDef(dev->data.chr, def, qemuCaps); break; =20 case VIR_DOMAIN_DEVICE_SMARTCARD: - ret =3D qemuDomainSmartcardDefValidate(dev->data.smartcard, qemuCa= ps); + ret =3D qemuValidateDomainSmartcardDef(dev->data.smartcard, qemuCa= ps); break; =20 case VIR_DOMAIN_DEVICE_RNG: - ret =3D qemuDomainRNGDefValidate(dev->data.rng, qemuCaps); + ret =3D qemuValidateDomainRNGDef(dev->data.rng, qemuCaps); break; =20 case VIR_DOMAIN_DEVICE_REDIRDEV: - ret =3D qemuDomainRedirdevDefValidate(dev->data.redirdev, qemuCaps= ); + ret =3D qemuValidateDomainRedirdevDef(dev->data.redirdev, qemuCaps= ); break; =20 case VIR_DOMAIN_DEVICE_WATCHDOG: - ret =3D qemuDomainWatchdogDefValidate(dev->data.watchdog, def); + ret =3D qemuValidateDomainWatchdogDef(dev->data.watchdog, def); break; =20 case VIR_DOMAIN_DEVICE_HOSTDEV: diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 528170ac94..9b67c753c2 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -1158,3 +1158,376 @@ qemuValidateDomainDeviceDefNetwork(const virDomainN= etDef *net, =20 return 0; } + + +static int +qemuValidateDomainChrSourceReconnectDef(const virDomainChrSourceReconnectD= ef *def) +{ + if (def->enabled =3D=3D VIR_TRISTATE_BOOL_YES && + def->timeout =3D=3D 0) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("chardev reconnect source timeout cannot be '0'")= ); + return -1; + } + + return 0; +} + + +static int +qemuValidateChrSerialTargetTypeToAddressType(int targetType) +{ + switch ((virDomainChrSerialTargetType)targetType) { + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO: + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: + break; + } + + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE; +} + + +static int +qemuValidateChrSerialTargetModelToTargetType(int targetModel) +{ + switch ((virDomainChrSerialTargetModel) targetModel) { + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_16550A: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: + break; + } + + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE; +} + + +static int +qemuValidateDomainChrTargetDef(const virDomainChrDef *chr) +{ + int expected; + + switch ((virDomainChrDeviceType)chr->deviceType) { + case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL: + + /* Validate target type */ + switch ((virDomainChrSerialTargetType)chr->targetType) { + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO: + + expected =3D qemuValidateChrSerialTargetTypeToAddressType(chr-= >targetType); + + if (chr->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + chr->info.type !=3D expected) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target type '%s' requires address type '= %s'"), + virDomainChrSerialTargetTypeToString(chr->t= argetType), + virDomainDeviceAddressTypeToString(expected= )); + return -1; + } + break; + + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: + if (chr->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target type '%s' cannot have an " + "associated address"), + virDomainChrSerialTargetTypeToString(chr->t= argetType)); + return -1; + } + break; + + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: + break; + } + + /* Validate target model */ + switch ((virDomainChrSerialTargetModel) chr->targetModel) { + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_ISA_SERIAL: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_USB_SERIAL: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PCI_SERIAL: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPLMCONSOLE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_16550A: + + expected =3D qemuValidateChrSerialTargetModelToTargetType(chr-= >targetModel); + + if (chr->targetType !=3D expected) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Target model '%s' requires target type '= %s'"), + virDomainChrSerialTargetModelTypeToString(c= hr->targetModel), + virDomainChrSerialTargetTypeToString(expect= ed)); + return -1; + } + break; + + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: + break; + } + break; + + case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE: + case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: + case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL: + case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + /* Nothing to do */ + break; + } + + return 0; +} + + +static int +qemuValidateDomainChrSourceDef(const virDomainChrSourceDef *def, + virQEMUCapsPtr qemuCaps) +{ + switch ((virDomainChrType)def->type) { + case VIR_DOMAIN_CHR_TYPE_TCP: + if (qemuValidateDomainChrSourceReconnectDef(&def->data.tcp.reconne= ct) < 0) + return -1; + break; + + case VIR_DOMAIN_CHR_TYPE_UNIX: + if (qemuValidateDomainChrSourceReconnectDef(&def->data.nix.reconne= ct) < 0) + return -1; + break; + + case VIR_DOMAIN_CHR_TYPE_FILE: + if (def->data.file.append !=3D VIR_TRISTATE_SWITCH_ABSENT && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_FILE_APPEND)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("append not supported in this QEMU binary")); + return -1; + } + break; + + case VIR_DOMAIN_CHR_TYPE_NULL: + case VIR_DOMAIN_CHR_TYPE_VC: + case VIR_DOMAIN_CHR_TYPE_PTY: + case VIR_DOMAIN_CHR_TYPE_DEV: + case VIR_DOMAIN_CHR_TYPE_PIPE: + case VIR_DOMAIN_CHR_TYPE_STDIO: + case VIR_DOMAIN_CHR_TYPE_UDP: + case VIR_DOMAIN_CHR_TYPE_SPICEVMC: + case VIR_DOMAIN_CHR_TYPE_SPICEPORT: + case VIR_DOMAIN_CHR_TYPE_NMDM: + case VIR_DOMAIN_CHR_TYPE_LAST: + break; + } + + if (def->logfile) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_LOGFILE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("logfile not supported in this QEMU binary")); + return -1; + } + } + + return 0; +} + + +int +qemuValidateDomainChrDef(const virDomainChrDef *dev, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps) +{ + if (qemuValidateDomainChrSourceDef(dev->source, qemuCaps) < 0) + return -1; + + if (qemuValidateDomainChrTargetDef(dev) < 0) + return -1; + + if (dev->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL && + (ARCH_IS_S390(def->os.arch) || qemuDomainIsPSeries(def))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("parallel ports are not supported")); + return -1; + } + + if (dev->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL) { + bool isCompatible =3D true; + + if (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTE= M) { + if (dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL= _PL011 && + !qemuDomainIsARMVirt(def)) { + isCompatible =3D false; + } + if (dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL= _16550A && + !qemuDomainIsRISCVVirt(def)) { + isCompatible =3D false; + } + } + + if (!qemuDomainIsPSeries(def) && + (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAP= R_VIO || + dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SP= APR_VTY)) { + isCompatible =3D false; + } + + if (!ARCH_IS_S390(def->os.arch) && + (dev->targetType =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP= || + dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SC= LPCONSOLE || + dev->targetModel =3D=3D VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SC= LPLMCONSOLE)) { + isCompatible =3D false; + } + + if (!isCompatible) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Serial device with target type '%s' and " + "target model '%s' not compatible with guest " + "architecture or machine type"), + virDomainChrSerialTargetTypeToString(dev->targe= tType), + virDomainChrSerialTargetModelTypeToString(dev->= targetModel)); + return -1; + } + } + + return 0; +} + + +int +qemuValidateDomainSmartcardDef(const virDomainSmartcardDef *def, + virQEMUCapsPtr qemuCaps) +{ + switch (def->type) { + case VIR_DOMAIN_SMARTCARD_TYPE_HOST: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this QEMU binary lacks smartcard host " + "mode support")); + return -1; + } + break; + + case VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this QEMU binary lacks smartcard host " + "mode support")); + return -1; + } + break; + + case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CCID_PASSTHRU)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this QEMU binary lacks smartcard " + "passthrough mode support")); + return -1; + } + break; + + default: + virReportEnumRangeError(virDomainSmartcardType, def->type); + return -1; + } + + if (def->type =3D=3D VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH && + qemuValidateDomainChrSourceDef(def->data.passthru, qemuCaps) < 0) + return -1; + + return 0; +} + + +int +qemuValidateDomainRNGDef(const virDomainRNGDef *def, + virQEMUCapsPtr qemuCaps G_GNUC_UNUSED) +{ + if (def->backend =3D=3D VIR_DOMAIN_RNG_BACKEND_EGD && + qemuValidateDomainChrSourceDef(def->source.chardev, qemuCaps) < 0) + return -1; + + return 0; +} + + +int +qemuValidateDomainRedirdevDef(const virDomainRedirdevDef *def, + virQEMUCapsPtr qemuCaps) +{ + if (qemuValidateDomainChrSourceDef(def->source, qemuCaps) < 0) + return -1; + + return 0; +} + + +int +qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev, + const virDomainDef *def) +{ + switch ((virDomainWatchdogModel) dev->model) { + case VIR_DOMAIN_WATCHDOG_MODEL_I6300ESB: + if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog can go only on PCI bus"= ), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + break; + + case VIR_DOMAIN_WATCHDOG_MODEL_IB700: + if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog can go only on ISA bus"= ), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + break; + + case VIR_DOMAIN_WATCHDOG_MODEL_DIAG288: + if (dev->info.type !=3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog is virtual and cannot g= o on any bus."), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + if (!(ARCH_IS_S390(def->os.arch))) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("%s model of watchdog is allowed for s390 and= s390x only"), + virDomainWatchdogModelTypeToString(dev->model)); + return -1; + } + break; + + case VIR_DOMAIN_WATCHDOG_MODEL_LAST: + break; + } + + return 0; +} diff --git a/src/qemu/qemu_validate.h b/src/qemu/qemu_validate.h index 437daebecd..d2238445be 100644 --- a/src/qemu/qemu_validate.h +++ b/src/qemu/qemu_validate.h @@ -30,3 +30,14 @@ int qemuValidateDomainDeviceDefAddress(const virDomainDe= viceDef *dev, virQEMUCapsPtr qemuCaps); int qemuValidateDomainDeviceDefNetwork(const virDomainNetDef *net, virQEMUCapsPtr qemuCaps); +int qemuValidateDomainChrDef(const virDomainChrDef *dev, + const virDomainDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainSmartcardDef(const virDomainSmartcardDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainRNGDef(const virDomainRNGDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainRedirdevDef(const virDomainRedirdevDef *def, + virQEMUCapsPtr qemuCaps); +int qemuValidateDomainWatchdogDef(const virDomainWatchdogDef *dev, + const virDomainDef *def); --=20 2.25.1