From c5a0aeb33ab2fbf52568dc0f69f49f3ac368d085 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 4 Dec 2020 17:29:16 +0900 Subject: [PATCH] network: use address_get() in address_exists() And rename address_exists() to link_has_ipv6_address(). --- src/network/networkd-address.c | 34 ++++++++++++++-------------------- src/network/networkd-address.h | 2 +- src/network/networkd-ndisc.c | 2 +- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index bc7e0a5b59..18eecf6c8a 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -447,29 +447,23 @@ int address_get(Link *link, const Address *in, Address **ret) { return -ENOENT; } -static bool address_exists_internal(Set *addresses, int family, const union in_addr_union *in_addr) { - Address *address; +int link_has_ipv6_address(Link *link, const struct in6_addr *address) { + _cleanup_(address_freep) Address *a = NULL; + int r; - SET_FOREACH(address, addresses) { - if (address->family != family) - continue; - if (in_addr_equal(address->family, &address->in_addr, in_addr)) - return true; - } - - return false; -} - -bool address_exists(Link *link, int family, const union in_addr_union *in_addr) { assert(link); - assert(IN_SET(family, AF_INET, AF_INET6)); - assert(in_addr); + assert(address); - if (address_exists_internal(link->addresses, family, in_addr)) - return true; - if (address_exists_internal(link->addresses_foreign, family, in_addr)) - return true; - return false; + r = address_new(&a); + if (r < 0) + return r; + + /* address_compare_func() only compares the local address for IPv6 case. So, it is enough to + * set only family and the address. */ + a->family = AF_INET6; + a->in_addr.in6 = *address; + + return address_get(link, a, NULL) >= 0; } static int address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index 036ac7a564..4764766996 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -49,7 +49,6 @@ typedef struct Address { int address_new(Address **ret); Address *address_free(Address *address); int address_get(Link *link, const Address *in, Address **ret); -bool address_exists(Link *link, int family, const union in_addr_union *in_addr); int address_configure(const Address *address, Link *link, link_netlink_message_handler_t callback, bool update, Address **ret); int address_remove(const Address *address, Link *link, link_netlink_message_handler_t callback); bool address_equal(const Address *a1, const Address *a2); @@ -63,6 +62,7 @@ int link_set_addresses(Link *link); 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); void ipv4_dad_unref(Link *link); int ipv4_dad_stop(Link *link); diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index d2aa3db175..903c995e74 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -483,7 +483,7 @@ static int ndisc_router_process_default(Link *link, sd_ndisc_router *rt) { if (r < 0) return log_link_error_errno(link, r, "Failed to get gateway address from RA: %m"); - if (address_exists(link, AF_INET6, &gateway)) { + if (link_has_ipv6_address(link, &gateway.in6) > 0) { if (DEBUG_LOGGING) { _cleanup_free_ char *buffer = NULL;