[libvirt] [PATCH v2 1/2] virsocket: Introduce virSocketAddrIsAny

This internal API checks, if passed address is ANYCAST address. --- src/libvirt_private.syms | 1 + src/util/virsocketaddr.c | 20 ++++++++++++++++++++ src/util/virsocketaddr.h | 1 + tests/sockettest.c | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b93629f..1ea7467 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1782,6 +1782,7 @@ virSocketAddrGetPort; virSocketAddrGetRange; virSocketAddrIsNetmask; virSocketAddrIsPrivate; +virSocketAddrIsWildcard; virSocketAddrMask; virSocketAddrMaskByPrefix; virSocketAddrParse; diff --git a/src/util/virsocketaddr.c b/src/util/virsocketaddr.c index 1071b00..e84c58e 100644 --- a/src/util/virsocketaddr.c +++ b/src/util/virsocketaddr.c @@ -227,6 +227,26 @@ virSocketAddrIsPrivate(const virSocketAddrPtr addr) } /* + * virSocketAddrIsWildcard: + * @addr: address to check + * + * Check if passed address is a variant of ANYCAST address. + */ +bool +virSocketAddrIsWildcard(const virSocketAddrPtr addr) +{ + in_addr_t tmp = INADDR_ANY; + switch (addr->data.stor.ss_family) { + case AF_INET: + return memcmp(&addr->data.inet4.sin_addr.s_addr, &tmp, + sizeof(addr->data.inet4.sin_addr.s_addr)) == 0; + case AF_INET6: + return IN6_IS_ADDR_UNSPECIFIED(&addr->data.inet6.sin6_addr.s6_addr); + } + return false; +} + +/* * virSocketAddrFormat: * @addr: an initialized virSocketAddrPtr * diff --git a/src/util/virsocketaddr.h b/src/util/virsocketaddr.h index 1c9e54a..b28fe6c 100644 --- a/src/util/virsocketaddr.h +++ b/src/util/virsocketaddr.h @@ -123,4 +123,5 @@ bool virSocketAddrEqual(const virSocketAddrPtr s1, const virSocketAddrPtr s2); bool virSocketAddrIsPrivate(const virSocketAddrPtr addr); +bool virSocketAddrIsWildcard(const virSocketAddrPtr addr); #endif /* __VIR_SOCKETADDR_H__ */ diff --git a/tests/sockettest.c b/tests/sockettest.c index 5b36a6c..092de88 100644 --- a/tests/sockettest.c +++ b/tests/sockettest.c @@ -157,6 +157,28 @@ static int testNetmaskHelper(const void *opaque) return testNetmask(data->addr1, data->addr2, data->netmask, data->pass); } +static int testWildcard(const char *addrstr, + bool pass) +{ + virSocketAddr addr; + + if (virSocketAddrParse(&addr, addrstr, AF_UNSPEC) < 0) + return -1; + + if (virSocketAddrIsWildcard(&addr)) + return pass ? 0 : -1; + return pass ? -1 : 0; +} + +struct testWildcardData { + const char *addr; + bool pass; +}; +static int testWildcardHelper(const void *opaque) +{ + const struct testWildcardData *data = opaque; + return testWildcard(data->addr, data->pass); +} static int mymain(void) @@ -223,6 +245,14 @@ mymain(void) ret = -1; \ } while (0) +#define DO_TEST_WILDCARD(addr, pass) \ + do { \ + struct testWildcardData data = { addr, pass}; \ + if (virtTestRun("Test wildcard " addr, 1, \ + testWildcardHelper, &data) < 0) \ + ret = -1; \ + } while (0) + DO_TEST_PARSE_AND_FORMAT("127.0.0.1", AF_UNSPEC, true); DO_TEST_PARSE_AND_FORMAT("127.0.0.1", AF_INET, true); @@ -276,6 +306,14 @@ mymain(void) DO_TEST_NETMASK("2000::1:1", "9000::1:1", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:0", false); + DO_TEST_WILDCARD("0.0.0.0", true); + DO_TEST_WILDCARD("::", true); + DO_TEST_WILDCARD("0", true); + DO_TEST_WILDCARD("0.0", true); + DO_TEST_WILDCARD("0.0.0", true); + DO_TEST_WILDCARD("1", false); + DO_TEST_WILDCARD("0.1", false); + return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- 1.8.2.1

Since we have the new internal API to check for wildcard address, we can use it instead of parsing and formatting. --- src/qemu/qemu_migration.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3ca3f32..3f02355 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1740,7 +1740,6 @@ qemuDomainMigrateGraphicsRelocate(virQEMUDriverPtr driver, int ret; char *listenAddress; virSocketAddr addr; - bool reformatted = false; if (!cookie) return 0; @@ -1756,23 +1755,10 @@ qemuDomainMigrateGraphicsRelocate(virQEMUDriverPtr driver, listenAddress = cookie->graphics->listen; - /* Okay, here's the magic: some mgmt applications set bare '0' as listen - * address. On the other hand, it's a valid IPv4 address. This means, we - * need to reformat the address so the if statement below can check just - * for two ANYCAST addresses and not all their variants. */ - if (listenAddress && - virSocketAddrParse(&addr, listenAddress, AF_UNSPEC) > 0) { - listenAddress = virSocketAddrFormat(&addr); - reformatted = true; - } - if (!listenAddress || - STREQ(listenAddress, "0.0.0.0") || - STREQ(listenAddress, "::")) { - if (reformatted) - VIR_FREE(listenAddress); + (virSocketAddrParse(&addr, listenAddress, AF_UNSPEC) > 0 && + virSocketAddrIsWildcard(&addr))) listenAddress = cookie->remoteHostname; - } ret = qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT); -- 1.8.2.1

On Thu, Jun 06, 2013 at 06:11:40PM +0200, Michal Privoznik wrote:
Since we have the new internal API to check for wildcard address, we can use it instead of parsing and formatting. --- src/qemu/qemu_migration.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3ca3f32..3f02355 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1740,7 +1740,6 @@ qemuDomainMigrateGraphicsRelocate(virQEMUDriverPtr driver, int ret; char *listenAddress; virSocketAddr addr; - bool reformatted = false;
if (!cookie) return 0; @@ -1756,23 +1755,10 @@ qemuDomainMigrateGraphicsRelocate(virQEMUDriverPtr driver,
listenAddress = cookie->graphics->listen;
- /* Okay, here's the magic: some mgmt applications set bare '0' as listen - * address. On the other hand, it's a valid IPv4 address. This means, we - * need to reformat the address so the if statement below can check just - * for two ANYCAST addresses and not all their variants. */ - if (listenAddress && - virSocketAddrParse(&addr, listenAddress, AF_UNSPEC) > 0) { - listenAddress = virSocketAddrFormat(&addr); - reformatted = true; - } - if (!listenAddress || - STREQ(listenAddress, "0.0.0.0") || - STREQ(listenAddress, "::")) { - if (reformatted) - VIR_FREE(listenAddress); + (virSocketAddrParse(&addr, listenAddress, AF_UNSPEC) > 0 && + virSocketAddrIsWildcard(&addr))) listenAddress = cookie->remoteHostname; - }
ret = qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT);
ACK 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 :|

On Thu, Jun 06, 2013 at 18:11:39 +0200, Michal Privoznik wrote:
This internal API checks, if passed address is ANYCAST address. --- src/libvirt_private.syms | 1 + src/util/virsocketaddr.c | 20 ++++++++++++++++++++ src/util/virsocketaddr.h | 1 + tests/sockettest.c | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b93629f..1ea7467 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1782,6 +1782,7 @@ virSocketAddrGetPort; virSocketAddrGetRange; virSocketAddrIsNetmask; virSocketAddrIsPrivate; +virSocketAddrIsWildcard;
I think the idea was to replace Anycast with Wildcard in tests but keep virSocketAddrIsAny as the API name. Otherwise, ACK series. Jirka

On Fri, Jun 07, 2013 at 01:42:10PM +0200, Jiri Denemark wrote:
On Thu, Jun 06, 2013 at 18:11:39 +0200, Michal Privoznik wrote:
This internal API checks, if passed address is ANYCAST address. --- src/libvirt_private.syms | 1 + src/util/virsocketaddr.c | 20 ++++++++++++++++++++ src/util/virsocketaddr.h | 1 + tests/sockettest.c | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b93629f..1ea7467 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1782,6 +1782,7 @@ virSocketAddrGetPort; virSocketAddrGetRange; virSocketAddrIsNetmask; virSocketAddrIsPrivate; +virSocketAddrIsWildcard;
I think the idea was to replace Anycast with Wildcard in tests but keep virSocketAddrIsAny as the API name. Otherwise, ACK series.
I'm fine with using Wildcard as the name of the API too. I think it is a little more descriptive than 'Any' too. 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 :|

On Thu, Jun 06, 2013 at 06:11:39PM +0200, Michal Privoznik wrote:
This internal API checks, if passed address is ANYCAST address. --- src/libvirt_private.syms | 1 + src/util/virsocketaddr.c | 20 ++++++++++++++++++++ src/util/virsocketaddr.h | 1 + tests/sockettest.c | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+)
ACK 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 :|
participants (3)
-
Daniel P. Berrange
-
Jiri Denemark
-
Michal Privoznik