[libvirt] [PATCHv2 3/4] qemu: Implement support for VIR_MIGRATE_PARAM_LISTEN_ADDRESS
Ján Tomko
jtomko at redhat.com
Thu Oct 10 13:52:32 UTC 2013
On 10/09/2013 03:32 PM, Michal Privoznik wrote:
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/qemu/qemu_driver.c | 26 +++++++----
> src/qemu/qemu_migration.c | 113 +++++++++++++++++++++++++++++++---------------
> src/qemu/qemu_migration.h | 13 ++++--
> 3 files changed, 103 insertions(+), 49 deletions(-)
>
> @@ -2260,31 +2254,66 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
> if (VIR_STRDUP(migrateFrom, "stdio") < 0)
> goto cleanup;
> } else {
> + virSocketAddr listenAddressSocket;
> + bool encloseAddress = false;
> + bool hostIPv6Capable = false;
> + bool qemuIPv6Capable = false;
> virQEMUCapsPtr qemuCaps = NULL;
> struct addrinfo *info = NULL;
> struct addrinfo hints = { .ai_flags = AI_ADDRCONFIG,
> .ai_socktype = SOCK_STREAM };
>
> + if (getaddrinfo("::", NULL, &hints, &info) == 0) {
> + freeaddrinfo(info);
> + hostIPv6Capable = true;
> + }
> if (!(qemuCaps = virQEMUCapsCacheLookupCopy(driver->qemuCapsCache,
> (*def)->emulator)))
> goto cleanup;
>
> - /* Listen on :: instead of 0.0.0.0 if QEMU understands it
> - * and there is at least one IPv6 address configured
> - */
> - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_IPV6_MIGRATION) &&
> - getaddrinfo("::", NULL, &hints, &info) == 0) {
> - freeaddrinfo(info);
> - listenAddr = "[::]";
> + qemuIPv6Capable = virQEMUCapsGet(qemuCaps, QEMU_CAPS_IPV6_MIGRATION);
> + virObjectUnref(qemuCaps);
> +
> + if (listenAddress) {
> + if (virSocketAddrIsNumeric(listenAddress)) {
> + /* listenAddress is numeric IPv4 or IPv6 */
> + if (virSocketAddrParse(&listenAddressSocket, listenAddress, AF_UNSPEC) < 0)
> + goto cleanup;
> +
> + /* address parsed successfully */
> + if (VIR_SOCKET_ADDR_IS_FAMILY(&listenAddressSocket, AF_INET6)) {
> + if (!qemuIPv6Capable) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("qemu isn't capable of IPv6"));
> + goto cleanup;
> + }
> + if (!hostIPv6Capable) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("host isn't capable of IPv6"));
> + goto cleanup;
> + }
> + }
> +
> + /* IPv6 address must be enclosed in angle brackets on the cmd line */
> + encloseAddress = true;
This sets it for IPv4 as well. Also s/ angle// (and maybe 'escape' would be
better than 'enclose')
> + } else {
> + /* listenAddress is a hostname */
> + }
> } else {
> - listenAddr = "0.0.0.0";
> + /* Listen on :: instead of 0.0.0.0 if QEMU understands it
> + * and there is at least one IPv6 address configured
> + */
> + listenAddress = qemuIPv6Capable && hostIPv6Capable ?
> + encloseAddress = true, "::" : "0.0.0.0";
> }
> - virObjectUnref(qemuCaps);
>
> - /* QEMU will be started with -incoming [::]:port
> - * or -incoming 0.0.0.0:port
> + /* QEMU will be started with -incoming [<IPv6 addr>]:port,
> + * -incoming <IPv4 addr>:port or -incoming <hostname>:port
> */
> - if (virAsprintf(&migrateFrom, "tcp:%s:%d", listenAddr, port) < 0)
> + if ((encloseAddress &&
> + virAsprintf(&migrateFrom, "tcp:[%s]:%d", listenAddress, port) < 0) ||
> + (!encloseAddress &&
> + virAsprintf(&migrateFrom, "tcp:%s:%d", listenAddress, port) < 0))
> goto cleanup;
> }
>
ACK with that fixed
More information about the libvir-list
mailing list