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 :|