}
int address_drop(Address *address) {
+ Link *link;
+ bool ready;
+
assert(address);
+ ready = address_is_ready(address);
+ link = address->link;
+
address_release(address, address->link);
address_free(address);
+ if (link && !ready)
+ link_check_ready(link);
+
return 0;
}
if (!link->dhcp4_messages) {
link->dhcp4_configured = true;
- link_client_handler(link);
+ link_check_ready(link);
}
return 1;
return;
}
- link_client_handler(link);
+ link_check_ready(link);
}
static int dhcp6_configure(Link *link, int event) {
route_remove(route, link, &link_route_remove_handler);
- link_client_handler(link);
+ link_check_ready(link);
return 0;
}
link->ipv4ll_route = true;
if (link->ipv4ll_address == true)
- link_client_handler(link);
+ link_check_ready(link);
return 1;
}
link->ipv4ll_address = true;
if (link->ipv4ll_route == true)
- link_client_handler(link);
+ link_check_ready(link);
return 1;
}
return 0;
}
-void link_client_handler(Link *link) {
+void link_check_ready(Link *link) {
+ Address *a;
+ Iterator i;
+
assert(link);
assert(link->network);
!link->dhcp4_configured && !link->dhcp6_configured))
return;
+ SET_FOREACH(a, link->addresses, i)
+ if (!address_is_ready(a))
+ return;
+
if (link->state != LINK_STATE_CONFIGURED)
link_enter_configured(link);
if (link->link_messages == 0) {
log_link_debug(link, "Routes set");
link->static_configured = true;
- link_client_handler(link);
+ link_check_ready(link);
}
return 1;
if (link->link_messages == 0) {
link->static_configured = true;
- link_client_handler(link);
+ link_check_ready(link);
} else
log_link_debug(link, "Setting routes");
void link_enter_failed(Link *link);
int link_initialized(Link *link, struct udev_device *device);
-void link_client_handler(Link *link);
+void link_check_ready(Link *link);
int link_update(Link *link, sd_netlink_message *message);
address->flags = flags;
address->cinfo = cinfo;
+ link_check_ready(link);
} else {
r = address_add(link, family, &in_addr, prefixlen, &address);
if (r < 0) {
address->flags = flags;
address->cinfo = cinfo;
- link_save(link);
+ link_check_ready(link);
}
break;