+ r = sd_dhcp_client_get_netmask(client, &netmask);
+ if (r < 0) {
+ log_link_warning(link, "DHCP error: no netmask");
+ link_enter_failed(link);
+ return;
+ }
+
+ prefixlen = sd_dhcp_client_prefixlen(&netmask);
+ if (prefixlen < 0) {
+ log_link_warning(link, "DHCP error: no prefixlen");
+ link_enter_failed(link);
+ return;
+ }
+
+ r = sd_dhcp_client_get_router(client, &gateway);
+ if (r < 0) {
+ log_link_warning(link, "DHCP error: no router");
+ link_enter_failed(link);
+ return;
+ }
+
+ if (event == DHCP_EVENT_IP_CHANGE || event == DHCP_EVENT_IP_ACQUIRE) {
+ _cleanup_address_free_ Address *addr = NULL;
+ _cleanup_route_free_ Route *rt = NULL;
+
+ log_link_info(link, "received config over DHCPv4");
+
+ r = address_new_dynamic(&addr);
+ if (r < 0) {
+ log_link_error(link, "Could not allocate address");
+ link_enter_failed(link);
+ return;
+ }
+
+ addr->family = AF_INET;
+ addr->in_addr.in = address;
+ addr->prefixlen = prefixlen;
+ addr->netmask = netmask;
+
+ r = route_new_dynamic(&rt);
+ if (r < 0) {
+ log_link_error(link, "Could not allocate route");
+ link_enter_failed(link);
+ return;
+ }
+
+ rt->family = AF_INET;
+ rt->in_addr.in = gateway;
+
+ link->dhcp_address = addr;
+ link->dhcp_route = rt;
+ addr = NULL;
+ rt = NULL;
+
+ link_enter_set_addresses(link);
+ }
+
+ return;