]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Implement support for EGD backend for virtio-rng
authorPeter Krempa <pkrempa@redhat.com>
Wed, 13 Feb 2013 10:22:23 +0000 (11:22 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 25 Feb 2013 09:55:14 +0000 (10:55 +0100)
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)

src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c

index ece7a239f6e8db16172d87b84b3ec669dc25b0e1..40022c1cc919cecfd817634b8fe4ebdb439b2756 100644 (file)
@@ -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 },
 };
 
 
index 0feae29783a6b368eef76ec8ee9584950a198e58..a8958674e4294e1d20e0f37e205ca924ca1c1dc8 100644 (file)
@@ -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 */
 };
index 4a51413609275c4b409906017607cae377810ca1..1c9bfc9d5ec52a8290d3cb0a420c1ff09c8f2825 100644 (file)
@@ -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;
 }