]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Prepare support for arbitrary migration protocol
authorJiri Denemark <jdenemar@redhat.com>
Mon, 15 Sep 2014 16:15:42 +0000 (18:15 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 23 Sep 2014 06:11:49 +0000 (08:11 +0200)
Currently we only support TCP protocol for native QEMU migration but
this is going to be changed. Let's make the code more general and remove
hardcoded TCP protocol from several places.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_migration.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h

index a07a084e99817c1ebafb4f71acee91f23f9b8cf4..b4981be45a4ae009be5d43e55cdb2e9637db545d 100644 (file)
@@ -2457,6 +2457,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
                         virDomainDefPtr *def,
                         const char *origname,
                         virStreamPtr st,
+                        const char *protocol,
                         unsigned short port,
                         bool autoPort,
                         const char *listenAddress,
@@ -2569,6 +2570,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
         struct addrinfo *info = NULL;
         struct addrinfo hints = { .ai_flags = AI_ADDRCONFIG,
                                   .ai_socktype = SOCK_STREAM };
+        const char *incFormat;
 
         if (getaddrinfo("::", NULL, &hints, &info) == 0) {
             freeaddrinfo(info);
@@ -2605,21 +2607,27 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
             } else {
                 /* listenAddress is a hostname */
             }
-        } else {
+        } else if (qemuIPv6Capable && hostIPv6Capable) {
             /* 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";
+            listenAddress = "::";
+            encloseAddress = true;
+        } else {
+            listenAddress = "0.0.0.0";
         }
 
-        /* QEMU will be started with -incoming [<IPv6 addr>]:port,
-         * -incoming <IPv4 addr>:port or -incoming <hostname>:port
+        /* QEMU will be started with
+         *   -incoming protocol:[<IPv6 addr>]:port,
+         *   -incoming protocol:<IPv4 addr>:port, or
+         *   -incoming protocol:<hostname>:port
          */
-        if ((encloseAddress &&
-             virAsprintf(&migrateFrom, "tcp:[%s]:%d", listenAddress, port) < 0) ||
-            (!encloseAddress &&
-             virAsprintf(&migrateFrom, "tcp:%s:%d", listenAddress, port) < 0))
+        if (encloseAddress)
+            incFormat = "%s:[%s]:%d";
+        else
+            incFormat = "%s:%s:%d";
+        if (virAsprintf(&migrateFrom, incFormat,
+                        protocol, listenAddress, port) < 0)
             goto cleanup;
     }
 
@@ -2812,7 +2820,7 @@ qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
 
     ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen,
                                   cookieout, cookieoutlen, def, origname,
-                                  st, 0, false, NULL, flags);
+                                  st, NULL, 0, false, NULL, flags);
     return ret;
 }
 
@@ -2955,7 +2963,8 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
 
     ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen,
                                   cookieout, cookieoutlen, def, origname,
-                                  NULL, port, autoPort, listenAddress, flags);
+                                  NULL, uri ? uri->scheme : "tcp",
+                                  port, autoPort, listenAddress, flags);
  cleanup:
     virURIFree(uri);
     VIR_FREE(hostname);
@@ -3171,6 +3180,7 @@ struct _qemuMigrationSpec {
     enum qemuMigrationDestinationType destType;
     union {
         struct {
+            const char *protocol;
             const char *name;
             int port;
         } host;
@@ -3538,6 +3548,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
     switch (spec->destType) {
     case MIGRATION_DEST_HOST:
         ret = qemuMonitorMigrateToHost(priv->mon, migrate_flags,
+                                       spec->dest.host.protocol,
                                        spec->dest.host.name,
                                        spec->dest.host.port);
         break;
@@ -3678,7 +3689,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
     goto cleanup;
 }
 
-/* Perform migration using QEMU's native TCP migrate support,
+/* Perform migration using QEMU's native migrate support,
  * not encrypted obviously
  */
 static int doNativeMigrate(virQEMUDriverPtr driver,
@@ -3712,6 +3723,7 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
         spec.destType = MIGRATION_DEST_CONNECT_HOST;
     else
         spec.destType = MIGRATION_DEST_HOST;
+    spec.dest.host.protocol = uribits->scheme;
     spec.dest.host.name = uribits->server;
     spec.dest.host.port = uribits->port;
     spec.fwdType = MIGRATION_FWD_DIRECT;
index 10f51c5c3aceb1880183b28b4f8fd9eed684f7eb..371475030e4f5b400806eb925f487bfef47528ac 100644 (file)
@@ -2231,6 +2231,7 @@ int qemuMonitorMigrateToFd(qemuMonitorPtr mon,
 
 int qemuMonitorMigrateToHost(qemuMonitorPtr mon,
                              unsigned int flags,
+                             const char *protocol,
                              const char *hostname,
                              int port)
 {
@@ -2246,7 +2247,7 @@ int qemuMonitorMigrateToHost(qemuMonitorPtr mon,
     }
 
 
-    if (virAsprintf(&uri, "tcp:%s:%d", hostname, port) < 0)
+    if (virAsprintf(&uri, "%s:%s:%d", protocol, hostname, port) < 0)
         return -1;
 
     if (mon->json)
index 0a2059ab478dfc243c8851c742d86af5786e02cc..a23a97477f81f2e910ccd22e8d152ee1ac507723 100644 (file)
@@ -505,6 +505,7 @@ int qemuMonitorMigrateToFd(qemuMonitorPtr mon,
 
 int qemuMonitorMigrateToHost(qemuMonitorPtr mon,
                              unsigned int flags,
+                             const char *protocol,
                              const char *hostname,
                              int port);