From: Peter Krempa Date: Tue, 23 Apr 2013 05:01:38 +0000 (+0200) Subject: qemu: Do sensible auto allocation of SPICE port numbers X-Git-Tag: v1.0.5-rc1~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7b4a6304846b020582dd0b978d20a184f3e15a60;p=thirdparty%2Flibvirt.git 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. --- 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; + + 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; - if (graphics->data.spice.autoport || - graphics->data.spice.port == -1) { + 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; }