mirror of
https://github.com/qemu/qemu.git
synced 2026-02-04 02:24:51 +00:00
migration: Cleanup TLS handshake hostname passing
The TLS hostname is doing a tour around the world just to be cached
into s->hostname. We're already abusing MigrationState by doing that,
so incorporate the s->hostname into migration_tls_hostname() and stop
passing the string around.
The old route was roughly:
-transport code (socket.c, fd.c, etc):
if (SOCKET_ADDRESS_TYPE_INET)
hostname = saddr->u.inet.host
else
hostname = NULL
migration_channel_connect(..., hostname)
s->hostname = hostname;
migration_tls_client_create(..., hostname)
if (migrate_tls_hostname())
qio_channel_tls_new_client(migrate_tls_hostname())
else
qio_channel_tls_new_client(hostname)
-postcopy_preempt_setup:
postcopy_preempt_send_channel_new
migration_tls_client_create(..., s->hostname)
New route is:
-socket.c only:
if SOCKET_ADDRESS_TYPE_INET
s->hostname = saddr->u.inet.host
migration_channel_connect()
migration_tls_client_create()
qio_channel_tls_new_client(migrate_tls_hostname())
-postcopy_preempt_setup:
postcopy_preempt_send_channel_new
migration_tls_client_create()
qio_channel_tls_new_client(migrate_tls_hostname())
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Prasad Pandit <pjp@fedoraproject.org>
Link: https://lore.kernel.org/qemu-devel/20260123141656.6765-5-farosas@suse.de
Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
@@ -60,20 +60,18 @@ void migration_channel_process_incoming(QIOChannel *ioc)
|
||||
*
|
||||
* @s: Current migration state
|
||||
* @ioc: Channel to which we are connecting
|
||||
* @hostname: Where we want to connect
|
||||
* @error: Error indicating failure to connect, free'd here
|
||||
*/
|
||||
void migration_channel_connect(MigrationState *s,
|
||||
QIOChannel *ioc,
|
||||
const char *hostname,
|
||||
Error *error)
|
||||
{
|
||||
trace_migration_set_outgoing_channel(
|
||||
ioc, object_get_typename(OBJECT(ioc)), hostname, error);
|
||||
ioc, object_get_typename(OBJECT(ioc)), error);
|
||||
|
||||
if (!error) {
|
||||
if (migrate_channel_requires_tls_upgrade(ioc)) {
|
||||
migration_tls_channel_connect(s, ioc, hostname, &error);
|
||||
migration_tls_channel_connect(s, ioc, &error);
|
||||
|
||||
if (!error) {
|
||||
/* tls_channel_connect will call back to this
|
||||
|
||||
@@ -22,7 +22,6 @@ void migration_channel_process_incoming(QIOChannel *ioc);
|
||||
|
||||
void migration_channel_connect(MigrationState *s,
|
||||
QIOChannel *ioc,
|
||||
const char *hostname,
|
||||
Error *error_in);
|
||||
|
||||
int migration_channel_read_peek(QIOChannel *ioc,
|
||||
|
||||
@@ -55,7 +55,7 @@ void exec_start_outgoing_migration(MigrationState *s, strList *command,
|
||||
}
|
||||
|
||||
qio_channel_set_name(ioc, "migration-exec-outgoing");
|
||||
migration_channel_connect(s, ioc, NULL, NULL);
|
||||
migration_channel_connect(s, ioc, NULL);
|
||||
object_unref(OBJECT(ioc));
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **
|
||||
}
|
||||
|
||||
qio_channel_set_name(ioc, "migration-fd-outgoing");
|
||||
migration_channel_connect(s, ioc, NULL, NULL);
|
||||
migration_channel_connect(s, ioc, NULL);
|
||||
object_unref(OBJECT(ioc));
|
||||
}
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ void file_start_outgoing_migration(MigrationState *s,
|
||||
return;
|
||||
}
|
||||
qio_channel_set_name(ioc, "migration-file-outgoing");
|
||||
migration_channel_connect(s, ioc, NULL, NULL);
|
||||
migration_channel_connect(s, ioc, NULL);
|
||||
}
|
||||
|
||||
static gboolean file_accept_incoming_migration(QIOChannel *ioc,
|
||||
|
||||
@@ -805,12 +805,10 @@ static bool multifd_tls_channel_connect(MultiFDSendParams *p,
|
||||
QIOChannel *ioc,
|
||||
Error **errp)
|
||||
{
|
||||
MigrationState *s = migrate_get_current();
|
||||
const char *hostname = s->hostname;
|
||||
MultiFDTLSThreadArgs *args;
|
||||
QIOChannelTLS *tioc;
|
||||
|
||||
tioc = migration_tls_client_create(ioc, hostname, errp);
|
||||
tioc = migration_tls_client_create(ioc, errp);
|
||||
if (!tioc) {
|
||||
return false;
|
||||
}
|
||||
@@ -820,7 +818,7 @@ static bool multifd_tls_channel_connect(MultiFDSendParams *p,
|
||||
* created TLS channel, which has already taken a reference.
|
||||
*/
|
||||
object_unref(OBJECT(ioc));
|
||||
trace_multifd_tls_outgoing_handshake_start(ioc, tioc, hostname);
|
||||
trace_multifd_tls_outgoing_handshake_start(ioc, tioc);
|
||||
qio_channel_set_name(QIO_CHANNEL(tioc), "multifd-tls-outgoing");
|
||||
|
||||
args = g_new0(MultiFDTLSThreadArgs, 1);
|
||||
@@ -867,8 +865,7 @@ static void multifd_new_send_channel_async(QIOTask *task, gpointer opaque)
|
||||
goto out;
|
||||
}
|
||||
|
||||
trace_multifd_set_outgoing_channel(ioc, object_get_typename(OBJECT(ioc)),
|
||||
migrate_get_current()->hostname);
|
||||
trace_multifd_set_outgoing_channel(ioc, object_get_typename(OBJECT(ioc)));
|
||||
|
||||
if (migrate_channel_requires_tls_upgrade(ioc)) {
|
||||
ret = multifd_tls_channel_connect(p, ioc, &local_err);
|
||||
|
||||
@@ -951,6 +951,11 @@ const char *migrate_tls_hostname(void)
|
||||
return s->parameters.tls_hostname->u.s;
|
||||
}
|
||||
|
||||
/* hostname saved from a previously connected channel */
|
||||
if (s->hostname) {
|
||||
return s->hostname;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -1966,7 +1966,7 @@ postcopy_preempt_send_channel_new(QIOTask *task, gpointer opaque)
|
||||
}
|
||||
|
||||
if (migrate_channel_requires_tls_upgrade(ioc)) {
|
||||
tioc = migration_tls_client_create(ioc, s->hostname, &local_err);
|
||||
tioc = migration_tls_client_create(ioc, &local_err);
|
||||
if (!tioc) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -44,7 +44,6 @@ void socket_send_channel_create(QIOTaskFunc f, void *data)
|
||||
|
||||
struct SocketConnectData {
|
||||
MigrationState *s;
|
||||
char *hostname;
|
||||
};
|
||||
|
||||
static void socket_connect_data_free(void *opaque)
|
||||
@@ -53,7 +52,6 @@ static void socket_connect_data_free(void *opaque)
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
g_free(data->hostname);
|
||||
g_free(data);
|
||||
}
|
||||
|
||||
@@ -69,7 +67,7 @@ static void socket_outgoing_migration(QIOTask *task,
|
||||
goto out;
|
||||
}
|
||||
|
||||
trace_migration_socket_outgoing_connected(data->hostname);
|
||||
trace_migration_socket_outgoing_connected();
|
||||
|
||||
if (migrate_zero_copy_send() &&
|
||||
!qio_channel_has_feature(sioc, QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY)) {
|
||||
@@ -77,7 +75,7 @@ static void socket_outgoing_migration(QIOTask *task,
|
||||
}
|
||||
|
||||
out:
|
||||
migration_channel_connect(data->s, sioc, data->hostname, err);
|
||||
migration_channel_connect(data->s, sioc, err);
|
||||
object_unref(OBJECT(sioc));
|
||||
}
|
||||
|
||||
@@ -96,7 +94,7 @@ void socket_start_outgoing_migration(MigrationState *s,
|
||||
outgoing_args.saddr = addr;
|
||||
|
||||
if (saddr->type == SOCKET_ADDRESS_TYPE_INET) {
|
||||
data->hostname = g_strdup(saddr->u.inet.host);
|
||||
s->hostname = g_strdup(saddr->u.inet.host);
|
||||
}
|
||||
|
||||
qio_channel_set_name(QIO_CHANNEL(sioc), "migration-socket-outgoing");
|
||||
@@ -180,4 +178,3 @@ void socket_start_incoming_migration(SocketAddress *saddr,
|
||||
qapi_free_SocketAddress(address);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -112,12 +112,11 @@ static void migration_tls_outgoing_handshake(QIOTask *task,
|
||||
} else {
|
||||
trace_migration_tls_outgoing_handshake_complete();
|
||||
}
|
||||
migration_channel_connect(s, ioc, NULL, err);
|
||||
migration_channel_connect(s, ioc, err);
|
||||
object_unref(OBJECT(ioc));
|
||||
}
|
||||
|
||||
QIOChannelTLS *migration_tls_client_create(QIOChannel *ioc,
|
||||
const char *hostname,
|
||||
Error **errp)
|
||||
{
|
||||
QCryptoTLSCreds *creds;
|
||||
@@ -127,29 +126,21 @@ QIOChannelTLS *migration_tls_client_create(QIOChannel *ioc,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *tls_hostname = migrate_tls_hostname();
|
||||
if (tls_hostname) {
|
||||
hostname = tls_hostname;
|
||||
}
|
||||
|
||||
return qio_channel_tls_new_client(ioc, creds, hostname, errp);
|
||||
return qio_channel_tls_new_client(ioc, creds, migrate_tls_hostname(), errp);
|
||||
}
|
||||
|
||||
void migration_tls_channel_connect(MigrationState *s,
|
||||
QIOChannel *ioc,
|
||||
const char *hostname,
|
||||
Error **errp)
|
||||
{
|
||||
QIOChannelTLS *tioc;
|
||||
|
||||
tioc = migration_tls_client_create(ioc, hostname, errp);
|
||||
tioc = migration_tls_client_create(ioc, errp);
|
||||
if (!tioc) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Save hostname into MigrationState for handshake */
|
||||
s->hostname = g_strdup(hostname);
|
||||
trace_migration_tls_outgoing_handshake_start(hostname);
|
||||
trace_migration_tls_outgoing_handshake_start();
|
||||
qio_channel_set_name(QIO_CHANNEL(tioc), "migration-tls-outgoing");
|
||||
|
||||
if (migrate_postcopy_ram() || migrate_return_path()) {
|
||||
|
||||
@@ -27,12 +27,10 @@
|
||||
void migration_tls_channel_process_incoming(QIOChannel *ioc, Error **errp);
|
||||
|
||||
QIOChannelTLS *migration_tls_client_create(QIOChannel *ioc,
|
||||
const char *hostname,
|
||||
Error **errp);
|
||||
|
||||
void migration_tls_channel_connect(MigrationState *s,
|
||||
QIOChannel *ioc,
|
||||
const char *hostname,
|
||||
Error **errp);
|
||||
void migration_tls_channel_end(QIOChannel *ioc, Error **errp);
|
||||
/* Whether the QIO channel requires further TLS handshake? */
|
||||
|
||||
@@ -149,10 +149,10 @@ multifd_send_sync_main_wait(uint8_t id) "channel %u"
|
||||
multifd_send_terminate_threads(void) ""
|
||||
multifd_send_thread_end(uint8_t id, uint64_t packets) "channel %u packets %" PRIu64
|
||||
multifd_send_thread_start(uint8_t id) "%u"
|
||||
multifd_tls_outgoing_handshake_start(void *ioc, void *tioc, const char *hostname) "ioc=%p tioc=%p hostname=%s"
|
||||
multifd_tls_outgoing_handshake_start(void *ioc, void *tioc) "ioc=%p tioc=%p"
|
||||
multifd_tls_outgoing_handshake_error(void *ioc, const char *err) "ioc=%p err=%s"
|
||||
multifd_tls_outgoing_handshake_complete(void *ioc) "ioc=%p"
|
||||
multifd_set_outgoing_channel(void *ioc, const char *ioctype, const char *hostname) "ioc=%p ioctype=%s hostname=%s"
|
||||
multifd_set_outgoing_channel(void *ioc, const char *ioctype) "ioc=%p ioctype=%s"
|
||||
|
||||
# migration.c
|
||||
migrate_set_state(const char *new_state) "new state %s"
|
||||
@@ -204,7 +204,7 @@ migration_transferred_bytes(uint64_t qemu_file, uint64_t multifd, uint64_t rdma)
|
||||
|
||||
# channel.c
|
||||
migration_set_incoming_channel(void *ioc, const char *ioctype) "ioc=%p ioctype=%s"
|
||||
migration_set_outgoing_channel(void *ioc, const char *ioctype, const char *hostname, void *err) "ioc=%p ioctype=%s hostname=%s err=%p"
|
||||
migration_set_outgoing_channel(void *ioc, const char *ioctype, void *err) "ioc=%p ioctype=%s err=%p"
|
||||
|
||||
# global_state.c
|
||||
migrate_state_too_big(void) ""
|
||||
@@ -328,11 +328,11 @@ migration_file_incoming(const char *filename) "filename=%s"
|
||||
|
||||
# socket.c
|
||||
migration_socket_incoming_accepted(void) ""
|
||||
migration_socket_outgoing_connected(const char *hostname) "hostname=%s"
|
||||
migration_socket_outgoing_connected(void) ""
|
||||
migration_socket_outgoing_error(const char *err) "error=%s"
|
||||
|
||||
# tls.c
|
||||
migration_tls_outgoing_handshake_start(const char *hostname) "hostname=%s"
|
||||
migration_tls_outgoing_handshake_start(void) ""
|
||||
migration_tls_outgoing_handshake_error(const char *err) "err=%s"
|
||||
migration_tls_outgoing_handshake_complete(void) ""
|
||||
migration_tls_incoming_handshake_start(void) ""
|
||||
|
||||
Reference in New Issue
Block a user