case VIR_DOMAIN_DEVICE_CONTROLLER:
case VIR_DOMAIN_DEVICE_CHR:
case VIR_DOMAIN_DEVICE_HOSTDEV:
+ case VIR_DOMAIN_DEVICE_RNG:
break;
case VIR_DOMAIN_DEVICE_LEASE:
case VIR_DOMAIN_DEVICE_SMARTCARD:
case VIR_DOMAIN_DEVICE_MEMBALLOON:
case VIR_DOMAIN_DEVICE_NVRAM:
- case VIR_DOMAIN_DEVICE_RNG:
case VIR_DOMAIN_DEVICE_SHMEM:
case VIR_DOMAIN_DEVICE_TPM:
case VIR_DOMAIN_DEVICE_PANIC:
return -1;
}
+ if (def->nrngs > 1) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Only a single RNG device can be configured for this domain"));
+ return -1;
+ }
+
if (def->nserials > 1) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Only a single serial can be configured for this domain"));
return 0;
}
+static int
+virCHMonitorBuildRngJson(virJSONValue *content, virDomainDef *vmdef)
+{
+ g_autoptr(virJSONValue) rng = virJSONValueNewObject();
+
+ if (vmdef->nrngs == 0) {
+ return 0;
+ }
+
+ if (vmdef->rngs[0]->model != VIR_DOMAIN_RNG_MODEL_VIRTIO) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Only virtio model is supported for RNG devices"));
+ return -1;
+ }
+
+ switch (vmdef->rngs[0]->backend) {
+ case VIR_DOMAIN_RNG_BACKEND_RANDOM:
+ if (virJSONValueObjectAppendString(rng, "src", vmdef->rngs[0]->source.file) < 0)
+ return -1;
+
+ if (virJSONValueObjectAppend(content, "rng", &rng) < 0)
+ return -1;
+
+ break;
+
+ case VIR_DOMAIN_RNG_BACKEND_EGD:
+ case VIR_DOMAIN_RNG_BACKEND_BUILTIN:
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Only RANDOM backend is supported for RNG devices"));
+ return -1;
+
+ case VIR_DOMAIN_RNG_BACKEND_LAST:
+ break;
+ }
+
+ return 0;
+}
+
/**
* virCHMonitorBuildNetJson:
* @net: pointer to a guest network definition
if (virCHMonitorBuildDisksJson(content, vmdef) < 0)
return -1;
+ if (virCHMonitorBuildRngJson(content, vmdef) < 0)
+ return -1;
+
if (virCHMonitorBuildDevicesJson(content, vmdef) < 0)
return -1;