[libvirt] [PATCH v5] qemu: Allow migration over IPv6

Daniel P. Berrange berrange at redhat.com
Tue Apr 2 11:29:41 UTC 2013


On Fri, Mar 22, 2013 at 08:06:00PM +0100, Ján Tomko wrote:
> Allow migration over IPv6 by listening on [::] instead of 0.0.0.0
> when QEMU supports it (QEMU_CAPS_IPV6_MIGRATION) and there is
> at least one v6 address configured on the system.
> 
> Use virURIParse in qemuMigrationPrepareDirect to allow parsing
> IPv6 addresses, which would cause an 'incorrect :port' error
> message before.
> 
> Move setting of migrateFrom from qemuMigrationPrepare{Direct,Tunnel}
> after domain XML parsing, since we need the QEMU binary path from it
> to get its capabilities.
> 
> Bug: https://bugzilla.redhat.com/show_bug.cgi?id=846013
> ---
> 
> diff to v4:
> Always listen on IPv6 if it's available.
> Don't add a migration flag.
> 
> v4:
> https://www.redhat.com/archives/libvir-list/2013-March/msg01213.html
> 
> discussion:
> https://www.redhat.com/archives/libvir-list/2013-March/msg00515.html
> 
>  src/qemu/qemu_capabilities.c |   6 +++
>  src/qemu/qemu_capabilities.h |   1 +
>  src/qemu/qemu_migration.c    | 104 +++++++++++++++++++++++++++++++++----------
>  tests/qemuhelptest.c         |   9 ++--
>  4 files changed, 93 insertions(+), 27 deletions(-)

ACK


> @@ -2084,6 +2088,45 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
>          }
>      }
>  
> +    if (tunnel) {
> +        /* QEMU will be started with -incoming stdio
> +         * (which qemu_command might convert to exec:cat or fd:n)
> +         */
> +        if (!(migrateFrom = strdup("stdio"))) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +    } else {
> +        virQEMUCapsPtr qemuCaps = NULL;
> +        struct addrinfo *info = NULL;
> +        struct addrinfo hints = { .ai_flags = AI_ADDRCONFIG,
> +                                  .ai_socktype = SOCK_STREAM };
> +
> +        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 = "[::]";
> +        } else {
> +            listenAddr = "0.0.0.0";
> +        }
> +        virObjectUnref(qemuCaps);
> +
> +        /* QEMU will be started with -incoming [::]:port
> +         * or -incoming 0.0.0.0:port
> +         */
> +        if (virAsprintf(&migrateFrom, "tcp:%s:%d", listenAddr, port) < 0) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +    }

It is a little gross that we're doing this command line
construction code in here and not in qemu_command.c
qemuBuildCommandLine() method, but we can live with that
for now


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list