On 1/30/19 6:06 AM, Juan Quintela wrote: > It will be used to store the uri parameters. We want this only for > tcp, so we don't set it for other uris. We need it to know what port > is migration running. > > Signed-off-by: Juan Quintela <quint...@redhat.com> > > -- >
> +++ b/hmp.c > @@ -166,6 +166,26 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict) > qapi_free_MouseInfoList(mice_list); > } > > +static char *SocketAddress_to_str(SocketAddress *addr) > +{ > + switch (addr->type) { > + case SOCKET_ADDRESS_TYPE_INET: > + return g_strdup_printf("tcp:%s:%s", > + addr->u.inet.host, > + addr->u.inet.port); > + break; > + case SOCKET_ADDRESS_TYPE_UNIX: > + return g_strdup_printf("unix:%s", > + addr->u.q_unix.path); > + break; > + case SOCKET_ADDRESS_TYPE_FD: > + return g_strdup_printf("fd:%s", addr->u.fd.str); > + break; > + default: > + abort(); Is abort()ing on SOCKET_ADDRESS_TYPE_VSOCK intentional? > + } > +} > + > void hmp_info_migrate(Monitor *mon, const QDict *qdict) > { > MigrationInfo *info; > @@ -306,6 +326,17 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict) > g_free(str); > visit_free(v); > } > + if (info->has_socket_address) { > + SocketAddressList *addr; > + > + monitor_printf(mon, "socket address: [\n"); > + > + for (addr = info->socket_address; addr; addr = addr->next) { > + char *s = SocketAddress_to_str(addr->value); > + monitor_printf(mon, "\t%s\n", s); > + } > + monitor_printf(mon, "]\n"); > + } Leaks 's'. > qapi_free_MigrationInfo(info); > qapi_free_MigrationCapabilityStatusList(caps); > } > diff --git a/migration/migration.c b/migration/migration.c > index 37e06b76dc..ef1d53cde2 100644 > --- a/migration/migration.c > +++ b/qapi/migration.json > @@ -6,6 +6,7 @@ > ## > > { 'include': 'common.json' } > +{ 'include': 'sockets.json' } > > ## > # @MigrationStats: > @@ -199,6 +200,8 @@ > # @compression: migration compression statistics, only returned if > compression > # feature is on and status is 'active' or 'completed' (Since 3.1) > # > +# @socket-address: Only used for tcp, to know what the real port is (Since > 3.1) > +# s/3.1/4.0/ > # Since: 0.14.0 > ## > { 'struct': 'MigrationInfo', > @@ -213,7 +216,8 @@ > '*error-desc': 'str', > '*postcopy-blocktime' : 'uint32', > '*postcopy-vcpu-blocktime': ['uint32'], > - '*compression': 'CompressionStats'} } > + '*compression': 'CompressionStats', > + '*socket-address': ['SocketAddress'] } } > > ## > # @query-migrate: > diff --git a/qapi/sockets.json b/qapi/sockets.json > index fc81d8d5e8..d7f77984af 100644 > --- a/qapi/sockets.json > +++ b/qapi/sockets.json > @@ -152,3 +152,16 @@ > 'unix': 'UnixSocketAddress', > 'vsock': 'VsockSocketAddress', > 'fd': 'String' } } > + > +## > +# @DummyStruct: > +# > +# Both block-core and migration needs SocketAddressList > +# I am open to comments about how to share it > +# > +# @dummy-list: A dummy list > +# > +# Since: 3.1 s/3.1/4.0/ This matches how we force list types elsewhere for use in C code even when the type is not exposed through QMP. But do you still need to force the generation, given that ['SocketAddress'] used in MigrationInfo is visible through QMP? > +## > +{ 'struct': 'DummyStruct', > + 'data': { 'dummy-list': ['SocketAddress'] } } > -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3226 Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature