static int ipv4ll_address_lost(Link *link) { _cleanup_address_free_ Address *address = NULL; _cleanup_route_free_ Route *route = NULL; struct in_addr addr; int r; assert(link); link->ipv4ll_route = false; link->ipv4ll_address = false; r = sd_ipv4ll_get_address(link->ipv4ll, &addr); if (r < 0) return 0; log_link_debug(link, "IPv4 link-local release %u.%u.%u.%u", ADDRESS_FMT_VAL(addr)); r = address_new_dynamic(&address); if (r < 0) { log_link_error(link, "Could not allocate address: %s", strerror(-r)); return r; } address->family = AF_INET; address->in_addr.in = addr; address->prefixlen = 16; address->scope = RT_SCOPE_LINK; address_drop(address, link, &link_address_drop_handler); r = route_new_dynamic(&route, RTPROT_UNSPEC); if (r < 0) { log_link_error(link, "Could not allocate route: %s", strerror(-r)); return r; } route->family = AF_INET; route->scope = RT_SCOPE_LINK; route->metrics = IPV4LL_ROUTE_METRIC; route_drop(route, link, &link_route_drop_handler); link_client_handler(link); return 0; }
static int ipv4ll_route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) { _cleanup_link_unref_ Link *link = userdata; int r; assert(link); assert(!link->ipv4ll_route); r = sd_rtnl_message_get_errno(m); if (r < 0 && r != -EEXIST) { log_link_error(link, "could not set ipv4ll route: %s", strerror(-r)); link_enter_failed(link); } link->ipv4ll_route = true; if (link->ipv4ll_address == true) link_client_handler(link); return 1; }
static int ipv4ll_address_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) { _cleanup_link_unref_ Link *link = userdata; int r; assert(link); assert(!link->ipv4ll_address); r = sd_netlink_message_get_errno(m); if (r < 0 && r != -EEXIST) { log_link_error(link, "could not set ipv4ll address: %s", strerror(-r)); link_enter_failed(link); } else if (r >= 0) link_rtnl_process_address(rtnl, m, link->manager); link->ipv4ll_address = true; if (link->ipv4ll_route == true) link_client_handler(link); return 1; }
static int dhcp4_route_handler(sd_netlink *rtnl, sd_netlink_message *m, void *userdata) { _cleanup_link_unref_ Link *link = userdata; int r; assert(link); assert(link->dhcp4_messages); link->dhcp4_messages --; r = sd_netlink_message_get_errno(m); if (r < 0 && r != -EEXIST) { log_link_error_errno(link, r, "Could not set DHCPv4 route: %m"); link_enter_failed(link); } if (!link->dhcp4_messages) { link->dhcp4_configured = true; link_client_handler(link); } return 1; }