summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2020-12-04 17:29:16 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-12-08 12:41:07 +0900
commitc5a0aeb33ab2fbf52568dc0f69f49f3ac368d085 (patch)
treed9cecc6bf0abcef7514435950077fddcd8e99f71
parent1d30fc5cb64ecba2f03fe42aa0d8c65c3decad82 (diff)
downloadsystemd-c5a0aeb33ab2fbf52568dc0f69f49f3ac368d085.tar.gz
network: use address_get() in address_exists()
And rename address_exists() to link_has_ipv6_address().
-rw-r--r--src/network/networkd-address.c32
-rw-r--r--src/network/networkd-address.h2
-rw-r--r--src/network/networkd-ndisc.c2
3 files changed, 15 insertions, 21 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;
- }
+ assert(link);
+ assert(address);
- return false;
-}
+ r = address_new(&a);
+ if (r < 0)
+ return r;
-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);
+ /* 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;
- 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;
+ 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;