diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-02-25 12:59:58 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-02-27 09:36:48 +0900 |
commit | 77e9be1ee4692612dc5672c961dc06237c8db7a0 (patch) | |
tree | 57b4f36fa101ae71bb6448a36f141e1515d049a9 | |
parent | 04386f56b56968e7451811fcf387abc8146083e4 (diff) | |
download | systemd-77e9be1ee4692612dc5672c961dc06237c8db7a0.tar.gz |
network: address: introduce manager_get_address()
And make manager_has_address() return true only when the link which has
the address is ready.
-rw-r--r-- | src/network/networkd-address.c | 28 | ||||
-rw-r--r-- | src/network/networkd-address.h | 3 |
2 files changed, 24 insertions, 7 deletions
diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index f9d8e9bb6c..f883c79a9e 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -602,19 +602,35 @@ int link_get_address(Link *link, int family, const union in_addr_union *address, return -ENOENT; } -int manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready) { - Address *a; +int manager_get_address(Manager *manager, int family, const union in_addr_union *address, unsigned char prefixlen, Address **ret) { Link *link; assert(manager); assert(IN_SET(family, AF_INET, AF_INET6)); assert(address); - HASHMAP_FOREACH(link, manager->links_by_index) - if (link_get_address(link, family, address, 0, &a) >= 0) - return check_ready ? address_is_ready(a) : address_exists(a); + HASHMAP_FOREACH(link, manager->links_by_index) { + if (!IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED)) + continue; - return false; + if (link_get_address(link, family, address, prefixlen, ret) >= 0) + return 0; + } + + return -ENOENT; +} + +bool manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready) { + Address *a; + + assert(manager); + assert(IN_SET(family, AF_INET, AF_INET6)); + assert(address); + + if (manager_get_address(manager, family, address, 0, &a) < 0) + return false; + + return check_ready ? address_is_ready(a) : address_exists(a); } const char* format_lifetime(char *buf, size_t l, usec_t lifetime_usec) { diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h index 0b1f3192a2..b116237638 100644 --- a/src/network/networkd-address.h +++ b/src/network/networkd-address.h @@ -88,7 +88,8 @@ static inline int link_get_ipv4_address(Link *link, const struct in_addr *addres assert(address); return link_get_address(link, AF_INET, &(union in_addr_union) { .in = *address }, prefixlen, ret); } -int manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready); +int manager_get_address(Manager *manager, int family, const union in_addr_union *address, unsigned char prefixlen, Address **ret); +bool manager_has_address(Manager *manager, int family, const union in_addr_union *address, bool check_ready); void address_cancel_request(Address *address); int link_request_address( |