From: Peter Krempa Date: Wed, 13 Feb 2013 10:22:23 +0000 (+0100) Subject: qemu: Implement support for EGD backend for virtio-rng X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=820019fcdff27264bc5ae8fd01095840d3456aa6;p=libvirt.git qemu: Implement support for EGD backend for virtio-rng This patch adds a new capability bit QEMU_CAPS_OBJECT_RNG_EGD and code to support the egd backend for the VirtIO RNG device. The device is added by 3 qemu command line options: -chardev socket,id=charrng0,host=1.2.3.4,port=1234 (communication backend) -object rng-egd,chardev=charrng0,id=rng0 (RNG protocol client) -device virtio-rng-pci,rng=rng0,bus=pci.0,addr=0x4 (the RNG device) --- diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index ece7a239f6..40022c1cc9 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -209,6 +209,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST, "virtio-rng", "rng-random", /* 130 */ + "rng-egd", ); struct _virQEMUCaps { @@ -1334,6 +1335,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "usb-net", QEMU_CAPS_DEVICE_USB_NET}, { "virtio-rng-pci", QEMU_CAPS_DEVICE_VIRTIO_RNG }, { "rng-random", QEMU_CAPS_OBJECT_RNG_RANDOM }, + { "rng-egd", QEMU_CAPS_OBJECT_RNG_EGD }, }; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 0feae29783..a8958674e4 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -170,6 +170,7 @@ enum virQEMUCapsFlags { QEMU_CAPS_DEVICE_VIRTIO_RNG = 129, /* virtio-rng device */ QEMU_CAPS_OBJECT_RNG_RANDOM = 130, /* the rng-random backend for virtio rng */ + QEMU_CAPS_OBJECT_RNG_EGD = 131, /* EGD protocol daemon for rng */ QEMU_CAPS_LAST, /* this must always be the last item */ }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 4a51413609..1c9bfc9d5e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4184,6 +4184,7 @@ qemuBuildRNGBackendArgs(virCommandPtr cmd, virQEMUCapsPtr qemuCaps) { virBuffer buf = VIR_BUFFER_INITIALIZER; + char *backend = NULL; int ret = -1; switch ((enum virDomainRNGBackend) dev->backend) { @@ -4204,9 +4205,23 @@ qemuBuildRNGBackendArgs(virCommandPtr cmd, break; case VIR_DOMAIN_RNG_BACKEND_EGD: - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("egd RNG backend not yet implemented")); - goto cleanup; + + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_RNG_EGD)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("this qemu doesn't support the rng-egd " + "backend")); + goto cleanup; + } + + if (!(backend = qemuBuildChrChardevStr(dev->source.chardev, + dev->info.alias, qemuCaps))) + goto cleanup; + + virCommandAddArgList(cmd, "-chardev", backend, NULL); + + virCommandAddArg(cmd, "-object"); + virCommandAddArgFormat(cmd, "rng-egd,chardev=char%s,id=%s", + dev->info.alias, dev->info.alias); break; case VIR_DOMAIN_RNG_BACKEND_LAST: @@ -4217,6 +4232,7 @@ qemuBuildRNGBackendArgs(virCommandPtr cmd, cleanup: virBufferFreeAndReset(&buf); + VIR_FREE(backend); return ret; }