return -ENOENT;
}
+int address_get_harder(Link *link, const Address *in, Address **ret) {
+ Request *req;
+ int r;
+
+ assert(link);
+ assert(in);
+
+ if (address_get(link, in, ret) >= 0)
+ return 0;
+
+ r = address_get_request(link, in, &req);
+ if (r < 0)
+ return r;
+
+ if (ret)
+ *ret = ASSERT_PTR(req->userdata);
+
+ return 0;
+}
+
int link_get_address(Link *link, int family, const union in_addr_union *address, unsigned char prefixlen, Address **ret) {
Address *a;
int r;
int address_new(Address **ret);
Address* address_free(Address *address);
int address_get(Link *link, const Address *in, Address **ret);
+int address_get_harder(Link *link, const Address *in, Address **ret);
int address_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg);
int address_remove(Address *address);
int address_remove_and_drop(Address *address);
assert(address);
assert(address->family == AF_INET6);
- int log_level = address_get(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO;
+ int log_level = address_get_harder(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO;
if (log_level < log_get_max_level())
return;
address->prefixlen = link->network->dhcp_server_address_prefixlen;
address_set_broadcast(address, link);
- if (address_get(link, address, &existing) >= 0 &&
- address_exists(existing) &&
+ if (address_get_harder(link, address, &existing) >= 0 &&
+ (address_exists(existing) || address_is_requesting(existing)) &&
existing->source == NETWORK_CONFIG_SOURCE_STATIC)
/* The same address seems explicitly configured in [Address] or [Network] section.
* Configure the DHCP server address only when it is not. */
const char *pretty = IN6_ADDR_TO_STRING(&address->in_addr.in6);
- if (address_get(link, address, &existing) < 0) {
+ if (address_get_harder(link, address, &existing) < 0) {
/* New address. */
log_level = LOG_INFO;
goto simple_log;