#include "libudev-private.h"
#include "util.h"
#include "bus-util.h"
+#include "net-util.h"
int link_new(Manager *manager, struct udev_device *device, Link **ret) {
_cleanup_link_free_ Link *link = NULL;
struct in_addr address;
struct in_addr netmask;
struct in_addr gateway;
- int prefixlen;
+ unsigned prefixlen;
int r;
assert(link);
if (event == DHCP_EVENT_IP_CHANGE || event == DHCP_EVENT_EXPIRED ||
event == DHCP_EVENT_STOP) {
+ if (link->network->dhcp_critical) {
+ log_warning_link(link, "DHCPv4 connection considered system critical, "
+ "ignoring request to reconfigure it down.");
+ return;
+ }
+
if (link->dhcp_address) {
address_drop(link->dhcp_address, link, address_drop_handler);
return;
}
- prefixlen = sd_dhcp_client_prefixlen(&netmask);
- if (prefixlen < 0) {
- log_warning_link(link, "DHCP error: no prefixlen");
- link_enter_failed(link);
- return;
- }
+ prefixlen = net_netmask_to_prefixlen(&netmask);
r = sd_dhcp_client_get_router(client, &gateway);
if (r < 0) {
addr->family = AF_INET;
addr->in_addr.in = address;
addr->prefixlen = prefixlen;
- addr->netmask = netmask;
+ addr->broadcast.s_addr = address.s_addr | ~netmask.s_addr;
r = route_new_dynamic(&rt);
if (r < 0) {