summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-02-25 12:59:58 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2022-02-27 09:36:48 +0900
commit77e9be1ee4692612dc5672c961dc06237c8db7a0 (patch)
tree57b4f36fa101ae71bb6448a36f141e1515d049a9
parent04386f56b56968e7451811fcf387abc8146083e4 (diff)
downloadsystemd-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.c28
-rw-r--r--src/network/networkd-address.h3
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(