From: Author Het Gala <het.g...@nutanix.com>

'migrate-incoming' QAPI design have been modified into a well-defined struct
'MigrateChannel'. Similarly like the source side, modified design was
introduced on destination side mainly to prevent multiple-level encoding of
uri string.

The struct contains various fields for type of migration channel, type of
transport backends and various associated migration parameters with each
backends.

Please note that the 'uri' parameter is kept for backward compatibility.
HMP side changes similar to source interface , on dest interface uses
migrate_channel_from_qdict() to redirect migration parameters from QDict
into 'MigrateChannel' struct.

Suggested-by: Daniel P. Berrange <berra...@redhat.com>
Suggested-by: Manish Mishra <manish.mis...@nutanix.com>
Suggested-by: Aravind Retnakaran <aravind.retnaka...@nutanix.com>
Signed-off-by: Het Gala <het.g...@nutanix.com>
---
 migration/migration.c |  3 ++-
 monitor/hmp-cmds.c    | 10 ++++++++--
 qapi/migration.json   | 22 ++++++++++++++++++++--
 softmmu/vl.c          |  2 +-
 4 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/migration/migration.c b/migration/migration.c
index 36de9f6a6b..838940fd55 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2237,7 +2237,8 @@ void migrate_del_blocker(Error *reason)
     migration_blockers = g_slist_remove(migration_blockers, reason);
 }
 
-void qmp_migrate_incoming(const char *uri, Error **errp)
+void qmp_migrate_incoming(const char *uri, MigrateChannel *channel,
+                          Error **errp)
 {
     Error *local_err = NULL;
     static bool once = true;
diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
index e44d96f5dc..7f45624c41 100644
--- a/monitor/hmp-cmds.c
+++ b/monitor/hmp-cmds.c
@@ -1106,9 +1106,15 @@ void hmp_migrate_incoming(Monitor *mon, const QDict 
*qdict)
 {
     Error *err = NULL;
     const char *uri = qdict_get_str(qdict, "uri");
+    MigrateChannel *channel = g_new0(MigrateChannel, 1);
+    migrate_channel_from_qdict(&channel, qdict, &err);
+    if (err) {
+        error_setg(&err, "error in retrieving channel from qdict");
+        return;
+    }
 
-    qmp_migrate_incoming(uri, &err);
-
+    qmp_migrate_incoming(uri, channel, &err);
+    qapi_free_MigrateChannel(channel);
     hmp_handle_error(mon, err);
 }
 
diff --git a/qapi/migration.json b/qapi/migration.json
index 753e187ce2..201b085715 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -1613,7 +1613,11 @@
 # with -incoming defer
 #
 # @uri: The Uniform Resource Identifier identifying the source or
-#       address to listen on
+#       the address to listen on
+#
+# @channel: Struct containing migration channel type, along with
+#           all the details of the destination interface required
+#           for the address to listen on for migration stream.
 #
 # Returns: nothing on success
 #
@@ -1630,14 +1634,28 @@
 #
 # 3. The uri format is the same as for -incoming
 #
+# 4. The 'uri' and 'channel' arguments are mutually exclusive but, atleast
+#    one of the two arguments should be present.
+#
 # Example:
 #
 # -> { "execute": "migrate-incoming",
 #      "arguments": { "uri": "tcp::4446" } }
 # <- { "return": {} }
 #
+# -> { "execute": "migrate",
+#      "arguments": {
+#          "channels": { 'channeltype': 'main',
+#                        'addr': { 'transport': 'socket',
+#                                  'socket-type': {'type': 'inet',
+#                                  'host': '10.12.34.9',
+#                                  'port': '1050' } } } } }
+# <- { "return": {} }
+#
 ##
-{ 'command': 'migrate-incoming', 'data': {'uri': 'str' } }
+{ 'command': 'migrate-incoming',
+             'data': {'*uri': 'str',
+                      '*channel': 'MigrateChannel'} }
 
 ##
 # @xen-save-devices-state:
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 798e1dc933..7005be978a 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -2614,7 +2614,7 @@ void qmp_x_exit_preconfig(Error **errp)
     if (incoming) {
         Error *local_err = NULL;
         if (strcmp(incoming, "defer") != 0) {
-            qmp_migrate_incoming(incoming, &local_err);
+            qmp_migrate_incoming(incoming, NULL, &local_err);
             if (local_err) {
                 error_reportf_err(local_err, "-incoming %s: ", incoming);
                 exit(1);
-- 
2.22.3


Reply via email to