[libvirt] [PATCH 6/7] qemu: Do sensible auto allocation of SPICE port numbers

Peter Krempa pkrempa at redhat.com
Tue Apr 23 13:46:13 UTC 2013


With this patch, if the autoport attribute is used, the code will
sensibly auto allocate the ports only if needed.
---
 src/qemu/qemu_process.c | 66 ++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 52 insertions(+), 14 deletions(-)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 20978e0..db80626 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3275,44 +3275,82 @@ qemuProcessSPICEAllocatePorts(virQEMUDriverPtr driver,
                               virQEMUDriverConfigPtr cfg,
                               virDomainGraphicsDefPtr graphics)
 {
-    int ret = -1;
     unsigned short port = 0;
     unsigned short tlsPort;
+    int i;
+    int defaultMode = graphics->data.spice.defaultMode;
+
+    bool needTLSPort = false;
+    bool needPort = false;
+
+    if (graphics->data.spice.autoport) {
+        /* check if tlsPort or port are needed to be alocated */
+        for (i = 0 ; i < VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST ; i++) {
+            int mode = graphics->data.spice.channels[i];
+
+            switch (mode) {
+            case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_SECURE:
+                needTLSPort = true;
+                break;
+
+            case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_INSECURE:
+                needPort = true;
+                break;
+
+            case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY:
+                switch (defaultMode) {
+                case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_SECURE:
+                    needTLSPort = true;
+                    break;
+
+                case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_INSECURE:
+                    needPort = true;
+                    break;
+
+                case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY:
+                    needTLSPort = true;
+                    needPort = true;
+                    break;
+                }
+                break;
+            }
+        }
+    }

-    if (graphics->data.spice.autoport ||
-        graphics->data.spice.port == -1) {
+    if (needPort || graphics->data.spice.port == -1) {
         if (virPortAllocatorAcquire(driver->remotePorts, &port) < 0)
-            goto cleanup;
+            goto error;

         if (port == 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("Unable to find an unused port for SPICE"));
-            goto cleanup;
+            goto error;
         }

         graphics->data.spice.port = port;
     }

     if (cfg->spiceTLS &&
-        (graphics->data.spice.autoport ||
-         graphics->data.spice.tlsPort == -1)) {
+        (needTLSPort || graphics->data.spice.tlsPort == -1)) {
         if (virPortAllocatorAcquire(driver->remotePorts, &tlsPort) < 0)
-            goto cleanup;
+            goto error;

         if (tlsPort == 0) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           "%s", _("Unable to find an unused port for SPICE TLS"));
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("Unable to find an unused port for SPICE TLS"));
             virPortAllocatorRelease(driver->remotePorts, port);
-            goto cleanup;
+            goto error;
         }

         graphics->data.spice.tlsPort = tlsPort;
     }

-    ret = 0;
+    return 0;

-cleanup:
-    return ret;
+error:
+    if (port)
+        virPortAllocatorRelease(driver->remotePorts, port);
+    return -1;
 }


-- 
1.8.2.1




More information about the libvir-list mailing list