From: Yu Watanabe Date: Thu, 6 May 2021 19:03:21 +0000 (+0900) Subject: network: introduce manager_has_address() X-Git-Tag: v249-rc1~240^2~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=591bd5f35d63519d51727cb3914a7b47d3df0db8;p=thirdparty%2Fsystemd.git network: introduce manager_has_address() The function will be used in later commits. --- diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 78b9be2d542..262cfb47130 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -485,6 +485,63 @@ int link_has_ipv6_address(Link *link, const struct in6_addr *address) { return address_get(link, a, NULL) >= 0; } +static int link_get_ipv4_address(Set *addresses, const struct in_addr *address, Address **ret) { + Address *a; + + assert(address); + + SET_FOREACH(a, addresses) { + if (a->family != AF_INET) + continue; + + if (!in4_addr_equal(&a->in_addr.in, address)) + continue; + + if (ret) + *ret = a; + + return 0; + } + + return -ENOENT; +} + +int manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready) { + Link *link; + int r; + + assert(manager); + assert(IN_SET(family, AF_INET, AF_INET6)); + assert(address); + + if (family == AF_INET) + HASHMAP_FOREACH(link, manager->links) { + Address *a; + + if (link_get_ipv4_address(link->addresses, &address->in, &a) >= 0) + return !check_ready || address_is_ready(a); + if (link_get_ipv4_address(link->addresses_foreign, &address->in, &a) >= 0) + return !check_ready || address_is_ready(a); + } + else { + _cleanup_(address_freep) Address *tmp = NULL; + Address *a; + + r = address_new(&tmp); + if (r < 0) + return r; + + tmp->family = family; + tmp->in_addr = *address; + + HASHMAP_FOREACH(link, manager->links) + if (address_get(link, tmp, &a) >= 0) + return !check_ready || address_is_ready(a); + } + + return false; +} + static void log_address_debug(const Address *address, const char *str, const Link *link) { _cleanup_free_ char *addr = NULL, *peer = NULL; char valid_buf[FORMAT_TIMESPAN_MAX], preferred_buf[FORMAT_TIMESPAN_MAX]; diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index b8030c99df2..d05d37da3b2 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -65,6 +65,7 @@ int link_drop_addresses(Link *link); int link_drop_foreign_addresses(Link *link); bool link_address_is_dynamic(const Link *link, const Address *address); int link_has_ipv6_address(Link *link, const struct in6_addr *address); +int manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready); void ipv4_dad_unref(Link *link); int ipv4_dad_stop(Link *link);