xref: /qemu/migration/channel.c (revision 62df066ffffdbd41b42ca91130611e40fbc53f0b)
1dd4339c5SJuan Quintela /*
2dd4339c5SJuan Quintela  * QEMU live migration channel operations
3dd4339c5SJuan Quintela  *
4dd4339c5SJuan Quintela  * Copyright Red Hat, Inc. 2016
5dd4339c5SJuan Quintela  *
6dd4339c5SJuan Quintela  * Authors:
7dd4339c5SJuan Quintela  *  Daniel P. Berrange <berrange@redhat.com>
8dd4339c5SJuan Quintela  *
9dd4339c5SJuan Quintela  * Contributions after 2012-01-13 are licensed under the terms of the
10dd4339c5SJuan Quintela  * GNU GPL, version 2 or (at your option) any later version.
11dd4339c5SJuan Quintela  */
12dd4339c5SJuan Quintela 
13dd4339c5SJuan Quintela #include "qemu/osdep.h"
14dd4339c5SJuan Quintela #include "channel.h"
1541d64227SJuan Quintela #include "tls.h"
166666c96aSJuan Quintela #include "migration.h"
1740014d81SJuan Quintela #include "qemu-file-channel.h"
18dd4339c5SJuan Quintela #include "trace.h"
19dd4339c5SJuan Quintela #include "qapi/error.h"
20dd4339c5SJuan Quintela #include "io/channel-tls.h"
21dd4339c5SJuan Quintela 
228e1a1931SJuan Quintela /**
238e1a1931SJuan Quintela  * @migration_channel_process_incoming - Create new incoming migration channel
248e1a1931SJuan Quintela  *
258e1a1931SJuan Quintela  * Notice that TLS is special.  For it we listen in a listener socket,
268e1a1931SJuan Quintela  * and then create a new client socket from the TLS library.
278e1a1931SJuan Quintela  *
288e1a1931SJuan Quintela  * @ioc: Channel to which we are connecting
298e1a1931SJuan Quintela  */
3054314711SJuan Quintela void migration_channel_process_incoming(QIOChannel *ioc)
31dd4339c5SJuan Quintela {
3254314711SJuan Quintela     MigrationState *s = migrate_get_current();
3354314711SJuan Quintela 
34dd4339c5SJuan Quintela     trace_migration_set_incoming_channel(
35dd4339c5SJuan Quintela         ioc, object_get_typename(OBJECT(ioc)));
36dd4339c5SJuan Quintela 
37dd4339c5SJuan Quintela     if (s->parameters.tls_creds &&
38dd4339c5SJuan Quintela         *s->parameters.tls_creds &&
39dd4339c5SJuan Quintela         !object_dynamic_cast(OBJECT(ioc),
40dd4339c5SJuan Quintela                              TYPE_QIO_CHANNEL_TLS)) {
41dd4339c5SJuan Quintela         Error *local_err = NULL;
42dd4339c5SJuan Quintela         migration_tls_channel_process_incoming(s, ioc, &local_err);
43dd4339c5SJuan Quintela         if (local_err) {
44dd4339c5SJuan Quintela             error_report_err(local_err);
45dd4339c5SJuan Quintela         }
46dd4339c5SJuan Quintela     } else {
474f0fae7fSJuan Quintela         migration_ioc_process_incoming(ioc);
48dd4339c5SJuan Quintela     }
49dd4339c5SJuan Quintela }
50dd4339c5SJuan Quintela 
51dd4339c5SJuan Quintela 
528e1a1931SJuan Quintela /**
538e1a1931SJuan Quintela  * @migration_channel_connect - Create new outgoing migration channel
548e1a1931SJuan Quintela  *
558e1a1931SJuan Quintela  * @s: Current migration state
568e1a1931SJuan Quintela  * @ioc: Channel to which we are connecting
578e1a1931SJuan Quintela  * @hostname: Where we want to connect
58688a3dcbSDr. David Alan Gilbert  * @error: Error indicating failure to connect, free'd here
598e1a1931SJuan Quintela  */
60dd4339c5SJuan Quintela void migration_channel_connect(MigrationState *s,
61dd4339c5SJuan Quintela                                QIOChannel *ioc,
62688a3dcbSDr. David Alan Gilbert                                const char *hostname,
63688a3dcbSDr. David Alan Gilbert                                Error *error)
64dd4339c5SJuan Quintela {
65dd4339c5SJuan Quintela     trace_migration_set_outgoing_channel(
66688a3dcbSDr. David Alan Gilbert         ioc, object_get_typename(OBJECT(ioc)), hostname, error);
67dd4339c5SJuan Quintela 
68688a3dcbSDr. David Alan Gilbert     if (!error) {
69dd4339c5SJuan Quintela         if (s->parameters.tls_creds &&
70dd4339c5SJuan Quintela             *s->parameters.tls_creds &&
71dd4339c5SJuan Quintela             !object_dynamic_cast(OBJECT(ioc),
72dd4339c5SJuan Quintela                                  TYPE_QIO_CHANNEL_TLS)) {
73688a3dcbSDr. David Alan Gilbert             migration_tls_channel_connect(s, ioc, hostname, &error);
74dd4339c5SJuan Quintela         } else {
75dd4339c5SJuan Quintela             QEMUFile *f = qemu_fopen_channel_output(ioc);
76dd4339c5SJuan Quintela 
77*62df066fSPeter Xu             qemu_mutex_lock(&s->qemu_file_lock);
78dd4339c5SJuan Quintela             s->to_dst_file = f;
79*62df066fSPeter Xu             qemu_mutex_unlock(&s->qemu_file_lock);
80dd4339c5SJuan Quintela         }
81dd4339c5SJuan Quintela     }
82688a3dcbSDr. David Alan Gilbert     migrate_fd_connect(s, error);
83688a3dcbSDr. David Alan Gilbert     error_free(error);
84688a3dcbSDr. David Alan Gilbert }
85