[libvirt] [PATCH 2/3] qemu: Implement support for VIR_MIGRATE_PARAM_LISTEN_ADDRESS
Daniel P. Berrange
berrange at redhat.com
Wed Oct 9 11:12:47 UTC 2013
On Wed, Oct 09, 2013 at 01:02:14PM +0200, Michal Privoznik wrote:
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/qemu/qemu_driver.c | 26 +++++++++----
> src/qemu/qemu_migration.c | 98 +++++++++++++++++++++++++++++++++--------------
> src/qemu/qemu_migration.h | 13 ++++---
> 3 files changed, 96 insertions(+), 41 deletions(-)
> @@ -2260,31 +2260,61 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
> if (VIR_STRDUP(migrateFrom, "stdio") < 0)
> goto cleanup;
> } else {
> + virSocketAddr listenAddressSocket;
> + bool hostIPv6Capable = false;
> + bool qemuIPv6Capable = false;
> virQEMUCapsPtr qemuCaps = NULL;
> struct addrinfo *info = NULL;
> struct addrinfo hints = { .ai_flags = AI_ADDRCONFIG,
> - .ai_socktype = SOCK_STREAM };
> + .ai_socktype = SOCK_STREAM };
>
> + if (getaddrinfo("::", NULL, &hints, &info) == 0) {
> + freeaddrinfo(info);
> + hostIPv6Capable = true;
> + }
> if (!(qemuCaps = virQEMUCapsCacheLookupCopy(driver->qemuCapsCache,
> (*def)->emulator)))
> goto cleanup;
>
> - /* Listen on :: instead of 0.0.0.0 if QEMU understands it
> - * and there is at least one IPv6 address configured
> - */
> - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_IPV6_MIGRATION) &&
> - getaddrinfo("::", NULL, &hints, &info) == 0) {
> - freeaddrinfo(info);
> - listenAddr = "[::]";
> + qemuIPv6Capable = virQEMUCapsGet(qemuCaps, QEMU_CAPS_IPV6_MIGRATION);
> + virObjectUnref(qemuCaps);
> +
> + if (listenAddress &&
> + virSocketAddrParse(&listenAddressSocket, listenAddress, AF_UNSPEC) > 0) {
> + /* address parsed successfully */
> +
> + if (virSocketAddrIsWildcard(&listenAddressSocket)) {
> + /* user wants us to listen on 0.0.0.0 or :: */
> +
> + if (VIR_SOCKET_ADDR_IS_FAMILY(&listenAddressSocket, AF_INET6)) {
> + if (!qemuIPv6Capable) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("qemu isn't capable of IPv6"));
> + goto cleanup;
> + }
> + if (!hostIPv6Capable) {
> + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> + _("host isn't capable of IPv6"));
> + goto cleanup;
> + }
> + listenAddress = "[::]";
> + }
> + }
> } else {
> - listenAddr = "0.0.0.0";
> + /* Don't error out, the @listenAddress may be a hostname */
> + if (!listenAddress) {
> + /* Listen on :: instead of 0.0.0.0 if QEMU understands it
> + * and there is at least one IPv6 address configured
> + */
> + listenAddress = qemuIPv6Capable && hostIPv6Capable ?
> + "[::]" : "0.0.0.0";
> + }
> }
I think this if/else would be clearer as
if (listenAddress) {
if (virSocketAddrParse(&listenAddressSocket, listenAddress, AF_UNSPEC) < 0) {
virResetLastError();
...
} else {
....
}
} else {
listenAddress = qemuIPv6Capable && hostIPv6Capable ?
"[::]" : "0.0.0.0";
}
Though this still means we'll be polluting the logs with the errors if this is
a hostname. So perhaps we need a method virSocketAddrIsNumeric(const char *addR)
so we can skip the parse stage entirely without errors, if it is a hostname.
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list