From 7b4a6304846b020582dd0b978d20a184f3e15a60 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 23 Apr 2013 07:01:38 +0200 Subject: [PATCH] qemu: Do sensible auto allocation of SPICE port numbers With this patch, if the autoport attribute is used, the code will sensibly auto allocate the ports only if needed. --- docs/formatdomain.html.in | 2 +- src/qemu/qemu_process.c | 64 ++++++++++++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 888c005982..bb75943bc4 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -3470,7 +3470,7 @@ qemu-kvm -net nic,model=? /dev/null while tlsPort gives an alternative secure port number. The autoport attribute is the new preferred syntax for indicating autoallocation of - both port numbers. The listen attribute is + needed port numbers. The listen attribute is an IP address for the server to listen on. The passwd attribute provides a SPICE password in clear text. The keymap diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index b17f9b2bec..925939dd9e 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3275,44 +3275,80 @@ 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; - if (graphics->data.spice.autoport || - graphics->data.spice.port == -1) { + bool needTLSPort = false; + bool needPort = false; + + if (graphics->data.spice.autoport) { + /* check if tlsPort or port need allocation */ + for (i = 0 ; i < VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST ; i++) { + switch (graphics->data.spice.channels[i]) { + 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 (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; }