Use the qemuDomainDeviceBackendChardevForeach helper to iterate all
eligible structs and convert the setup of the TLS defaults from the
config.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_domain.c | 103 +++++++++++++++++++---------------------
src/qemu/qemu_domain.h | 13 ++---
src/qemu/qemu_driver.c | 7 +++
src/qemu/qemu_hotplug.c | 3 --
src/qemu/qemu_process.c | 23 ++++++++-
5 files changed, 85 insertions(+), 64 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index cbaa39b618..550afca36e 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -9720,66 +9720,63 @@ qemuDomainPrepareChannel(virDomainChrDef *channel,
}
-/* qemuDomainPrepareChardevSourceTLS:
- * @source: pointer to host interface data for char devices
- * @cfg: driver configuration
- *
- * Updates host interface TLS encryption setting based on qemu.conf
- * for char devices. This will be presented as "tls='yes|no'" in
- * live XML of a guest.
- */
-void
-qemuDomainPrepareChardevSourceTLS(virDomainChrSourceDef *source,
- virQEMUDriverConfig *cfg)
-{
- if (source->type == VIR_DOMAIN_CHR_TYPE_TCP) {
- if (source->data.tcp.haveTLS == VIR_TRISTATE_BOOL_ABSENT) {
- if (cfg->chardevTLS)
- source->data.tcp.haveTLS = VIR_TRISTATE_BOOL_YES;
- else
- source->data.tcp.haveTLS = VIR_TRISTATE_BOOL_NO;
- source->data.tcp.tlsFromConfig = true;
- }
- }
-}
-
-
-/* qemuDomainPrepareChardevSource:
- * @def: live domain definition
- * @cfg: driver configuration
+/* qemuDomainPrepareChardevSourceOne:
+ * @dev: device definition
+ * @charsrc: chardev source definition
+ * @opaque: pointer to struct qemuDomainPrepareChardevSourceData
*
- * Iterate through all devices that use virDomainChrSourceDef *as host
- * interface part.
+ * Updates the config of a chardev source based on the qemu driver configuration.
+ * Note that this is meant to be called via
+ * qemuDomainDeviceBackendChardevForeach(One).
*/
-void
-qemuDomainPrepareChardevSource(virDomainDef *def,
- virQEMUDriverConfig *cfg)
+int
+qemuDomainPrepareChardevSourceOne(virDomainDeviceDef *dev,
+ virDomainChrSourceDef *charsrc,
+ void *opaque)
{
- size_t i;
-
- for (i = 0; i < def->nserials; i++)
- qemuDomainPrepareChardevSourceTLS(def->serials[i]->source, cfg);
-
- for (i = 0; i < def->nparallels; i++)
- qemuDomainPrepareChardevSourceTLS(def->parallels[i]->source, cfg);
+ struct qemuDomainPrepareChardevSourceData *data = opaque;
- for (i = 0; i < def->nchannels; i++)
- qemuDomainPrepareChardevSourceTLS(def->channels[i]->source, cfg);
-
- for (i = 0; i < def->nconsoles; i++)
- qemuDomainPrepareChardevSourceTLS(def->consoles[i]->source, cfg);
+ switch ((virDomainDeviceType) dev->type) {
- for (i = 0; i < def->nrngs; i++)
- if (def->rngs[i]->backend == VIR_DOMAIN_RNG_BACKEND_EGD)
- qemuDomainPrepareChardevSourceTLS(def->rngs[i]->source.chardev, cfg);
+ case VIR_DOMAIN_DEVICE_CHR:
+ case VIR_DOMAIN_DEVICE_RNG:
+ case VIR_DOMAIN_DEVICE_SMARTCARD:
+ case VIR_DOMAIN_DEVICE_REDIRDEV:
+ if (charsrc->type == VIR_DOMAIN_CHR_TYPE_TCP) {
+ if (charsrc->data.tcp.haveTLS == VIR_TRISTATE_BOOL_ABSENT) {
+ charsrc->data.tcp.haveTLS =
virTristateBoolFromBool(data->cfg->chardevTLS);
+ charsrc->data.tcp.tlsFromConfig = true;
+ }
+ }
+ break;
- for (i = 0; i < def->nsmartcards; i++)
- if (def->smartcards[i]->type == VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH)
- qemuDomainPrepareChardevSourceTLS(def->smartcards[i]->data.passthru,
- cfg);
+ case VIR_DOMAIN_DEVICE_DISK:
+ case VIR_DOMAIN_DEVICE_NET:
+ case VIR_DOMAIN_DEVICE_SHMEM:
+ case VIR_DOMAIN_DEVICE_LEASE:
+ case VIR_DOMAIN_DEVICE_FS:
+ case VIR_DOMAIN_DEVICE_INPUT:
+ case VIR_DOMAIN_DEVICE_SOUND:
+ case VIR_DOMAIN_DEVICE_VIDEO:
+ case VIR_DOMAIN_DEVICE_HOSTDEV:
+ case VIR_DOMAIN_DEVICE_WATCHDOG:
+ case VIR_DOMAIN_DEVICE_CONTROLLER:
+ case VIR_DOMAIN_DEVICE_GRAPHICS:
+ case VIR_DOMAIN_DEVICE_HUB:
+ case VIR_DOMAIN_DEVICE_NONE:
+ case VIR_DOMAIN_DEVICE_MEMBALLOON:
+ case VIR_DOMAIN_DEVICE_NVRAM:
+ case VIR_DOMAIN_DEVICE_TPM:
+ case VIR_DOMAIN_DEVICE_PANIC:
+ case VIR_DOMAIN_DEVICE_LAST:
+ case VIR_DOMAIN_DEVICE_MEMORY:
+ case VIR_DOMAIN_DEVICE_IOMMU:
+ case VIR_DOMAIN_DEVICE_VSOCK:
+ case VIR_DOMAIN_DEVICE_AUDIO:
+ break;
+ }
- for (i = 0; i < def->nredirdevs; i++)
- qemuDomainPrepareChardevSourceTLS(def->redirdevs[i]->source, cfg);
+ return 0;
}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 61704fdae7..f84acf408b 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -864,13 +864,14 @@ int qemuDomainPrepareChannel(virDomainChrDef *chr,
const char *domainChannelTargetDir)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-void qemuDomainPrepareChardevSourceTLS(virDomainChrSourceDef *source,
- virQEMUDriverConfig *cfg)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+struct qemuDomainPrepareChardevSourceData {
+ virQEMUDriverConfig *cfg;
+};
-void qemuDomainPrepareChardevSource(virDomainDef *def,
- virQEMUDriverConfig *cfg)
- ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+int
+qemuDomainPrepareChardevSourceOne(virDomainDeviceDef *dev,
+ virDomainChrSourceDef *charsrc,
+ void *opaque);
void qemuDomainPrepareShmemChardev(virDomainShmemDef *shmem)
ATTRIBUTE_NONNULL(1);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 8093b8f69b..10feb606ad 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6793,6 +6793,13 @@ qemuDomainAttachDeviceLive(virDomainObj *vm,
{
int ret = -1;
const char *alias = NULL;
+ g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+ struct qemuDomainPrepareChardevSourceData chardevBackendData = { .cfg = cfg };
+
+ if (qemuDomainDeviceBackendChardevForeachOne(dev,
+ qemuDomainPrepareChardevSourceOne,
+ &chardevBackendData) < 0)
+ return -1;
switch ((virDomainDeviceType)dev->type) {
case VIR_DOMAIN_DEVICE_DISK:
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 2e1d18c633..66961eba70 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1852,9 +1852,6 @@ qemuDomainAddChardevTLSObjects(virQEMUDriver *driver,
g_autoptr(virJSONValue) tlsProps = NULL;
g_autoptr(virJSONValue) secProps = NULL;
- /* NB: This may alter haveTLS based on cfg */
- qemuDomainPrepareChardevSourceTLS(dev, cfg);
-
if (dev->type != VIR_DOMAIN_CHR_TYPE_TCP ||
dev->data.tcp.haveTLS != VIR_TRISTATE_BOOL_YES)
return 0;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 866b6b9ed6..be49cc9360 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6498,6 +6498,24 @@ qemuProcessUpdateSEVInfo(virDomainObj *vm)
}
+/* qemuProcessPrepareChardevSource:
+ * @def: live domain definition
+ * @cfg: driver configuration
+ *
+ * Iterate through all devices that use virDomainChrSourceDef as backend.
+ */
+static int
+qemuProcessPrepareChardevSource(virDomainDef *def,
+ virQEMUDriverConfig *cfg)
+{
+ struct qemuDomainPrepareChardevSourceData data = { .cfg = cfg };
+
+ return qemuDomainDeviceBackendChardevForeach(def,
+ qemuDomainPrepareChardevSourceOne,
+ &data);
+}
+
+
/**
* qemuProcessPrepareDomain:
* @driver: qemu driver
@@ -6586,8 +6604,9 @@ qemuProcessPrepareDomain(virQEMUDriver *driver,
if (qemuProcessPrepareDomainHostdevs(vm, priv) < 0)
return -1;
- VIR_DEBUG("Prepare chardev source backends for TLS");
- qemuDomainPrepareChardevSource(vm->def, cfg);
+ VIR_DEBUG("Prepare chardev source backends");
+ if (qemuProcessPrepareChardevSource(vm->def, cfg) < 0)
+ return -1;
VIR_DEBUG("Prepare device secrets");
if (qemuDomainSecretPrepare(driver, vm) < 0)
--
2.31.1