- "Could not send rtnetlink message: %s", strerror(-r));
- return r;
- }
-
- link_unref(link);
-
- return 0;
-}
-
-static int dhcp_lease_lost(Link *link) {
- _cleanup_address_free_ Address *address = NULL;
- _cleanup_route_free_ Route *route_gw = NULL;
- _cleanup_route_free_ Route *route = NULL;
- struct in_addr addr;
- struct in_addr netmask;
- struct in_addr gateway;
- unsigned prefixlen;
- int r;
-
- assert(link);
- assert(link->dhcp_lease);
-
- log_warning_link(link, "DHCP lease lost");
-
- r = address_new_dynamic(&address);
- if (r >= 0) {
- r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
- if (r >= 0) {
- r = route_new_dynamic(&route_gw);
- if (r >= 0) {
- route_gw->family = AF_INET;
- route_gw->dst_addr.in = gateway;
- route_gw->dst_prefixlen = 32;
- route_gw->scope = RT_SCOPE_LINK;
-
- route_drop(route_gw, link, &route_drop_handler);
- link_ref(link);
- }
-
- r = route_new_dynamic(&route);
- if (r >= 0) {
- route->family = AF_INET;
- route->in_addr.in = gateway;
-
- route_drop(route, link, &route_drop_handler);
- link_ref(link);
- }
- }
-
- sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
- sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
- prefixlen = net_netmask_to_prefixlen(&netmask);
-
- address->family = AF_INET;
- address->in_addr.in = addr;
- address->prefixlen = prefixlen;
-
- address_drop(address, link, &address_drop_handler);
- link_ref(link);
- }
-
- if (link->network->dhcp_mtu) {
- uint16_t mtu;
-
- r = sd_dhcp_lease_get_mtu(link->dhcp_lease, &mtu);
- if (r >= 0 && link->original_mtu != mtu) {
- r = link_set_mtu(link, link->original_mtu);
- if (r < 0) {
- log_warning_link(link, "DHCP error: could not reset MTU");
- link_enter_failed(link);
- return r;
- }
- }
- }
-
- if (link->network->dhcp_hostname) {
- const char *hostname = NULL;
-
- r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
- if (r >= 0 && hostname) {
- r = link_set_hostname(link, "");
- if (r < 0)
- log_error_link(link, "Failed to reset transient hostname");
- }
- }
-
- link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
-
- return 0;
-}
-
-static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {
- sd_dhcp_lease *lease;
- struct in_addr address;
- struct in_addr netmask;
- struct in_addr gateway;
- unsigned prefixlen;
- int r;
-
- assert(client);
- assert(link);
-
- r = sd_dhcp_client_get_lease(client, &lease);
- if (r < 0) {
- log_warning_link(link, "DHCP error: no lease: %s",
- strerror(-r));
- return r;
- }
-
- r = sd_dhcp_lease_get_address(lease, &address);
- if (r < 0) {
- log_warning_link(link, "DHCP error: no address: %s",
- strerror(-r));