}
+#define ENUM_VALUE_MISSING(capsEnum, value) !(capsEnum.values & (1 << value))
+
+#define ENUM_VALUE_ERROR(valueLabel, valueString) \
+ do { \
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \
+ _("domain configuration does not support '%s' value '%s'"), \
+ valueLabel, valueString); \
+ } while (0)
+
+
+static int
+virDomainCapsDeviceRNGDefValidate(virDomainCapsPtr const caps,
+ const virDomainRNGDef *dev)
+{
+ if (ENUM_VALUE_MISSING(caps->rng.model, dev->model)) {
+ ENUM_VALUE_ERROR("rng model",
+ virDomainRNGModelTypeToString(dev->model));
+ return -1;
+ }
+
+ return 0;
+}
+
+
int
-virDomainCapsDeviceDefValidate(virDomainCapsPtr const caps ATTRIBUTE_UNUSED,
+virDomainCapsDeviceDefValidate(virDomainCapsPtr const caps,
const virDomainDeviceDef *dev,
const virDomainDef *def ATTRIBUTE_UNUSED)
{
+ int ret = 0;
+
switch ((virDomainDeviceType) dev->type) {
+ case VIR_DOMAIN_DEVICE_RNG:
+ ret = virDomainCapsDeviceRNGDefValidate(caps, dev->data.rng);
+ break;
+
case VIR_DOMAIN_DEVICE_DISK:
case VIR_DOMAIN_DEVICE_REDIRDEV:
case VIR_DOMAIN_DEVICE_NET:
case VIR_DOMAIN_DEVICE_CONTROLLER:
case VIR_DOMAIN_DEVICE_CHR:
case VIR_DOMAIN_DEVICE_SMARTCARD:
- case VIR_DOMAIN_DEVICE_RNG:
case VIR_DOMAIN_DEVICE_HOSTDEV:
case VIR_DOMAIN_DEVICE_VIDEO:
case VIR_DOMAIN_DEVICE_MEMORY:
break;
}
- return 0;
+ return ret;
}
static int
qemuDomainRNGDefValidate(const virDomainRNGDef *def,
- virQEMUCapsPtr qemuCaps)
+ virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED)
{
- bool modelIsSupported = false;
-
if (def->backend == VIR_DOMAIN_RNG_BACKEND_EGD &&
qemuDomainChrSourceDefValidate(def->source.chardev) < 0)
return -1;
- switch ((virDomainRNGModel) def->model) {
- case VIR_DOMAIN_RNG_MODEL_VIRTIO:
- modelIsSupported = virQEMUCapsGet(qemuCaps,
- QEMU_CAPS_DEVICE_VIRTIO_RNG);
- break;
- case VIR_DOMAIN_RNG_MODEL_VIRTIO_TRANSITIONAL:
- case VIR_DOMAIN_RNG_MODEL_VIRTIO_NON_TRANSITIONAL:
- modelIsSupported = (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_RNG) &&
- (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_TRANSITIONAL) ||
- virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY)));
- break;
- case VIR_DOMAIN_RNG_MODEL_LAST:
- break;
- }
-
- if (!modelIsSupported) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("this qemu doesn't support RNG device type '%s'"),
- virDomainRNGModelTypeToString(def->model));
- return -1;
- }
-
return 0;
}