diff options
-rw-r--r-- | man/systemd-networkd.service.xml | 8 | ||||
-rw-r--r-- | src/network/networkd-gperf.gperf | 51 | ||||
-rw-r--r-- | src/network/networkd-link.c | 6 | ||||
-rw-r--r-- | src/network/networkd.h | 1 |
4 files changed, 41 insertions, 25 deletions
diff --git a/man/systemd-networkd.service.xml b/man/systemd-networkd.service.xml index 3403a7a1a7..3e6fddc716 100644 --- a/man/systemd-networkd.service.xml +++ b/man/systemd-networkd.service.xml @@ -293,6 +293,14 @@ will be used as the transient hostname.</para> </listitem> </varlistentry> + <varlistentry> + <term><varname>CriticalConnection</varname></term> + <listitem> + <para>When true the connection will never be torn down even if the DHCP lease + expires. This is contrary to the DHCP specification, but may be the best choice + if, say, the root filesystem relies on this connection. Defaults to false.</para> + </listitem> + </varlistentry> </variablelist> </refsect2> diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index aff23bb55d..de72805625 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -15,28 +15,29 @@ struct ConfigPerfItem; %struct-type %includes %% -Match.MACAddress, config_parse_hwaddr, 0, offsetof(Network, match_mac) -Match.Path, config_parse_string, 0, offsetof(Network, match_path) -Match.Driver, config_parse_string, 0, offsetof(Network, match_driver) -Match.Type, config_parse_string, 0, offsetof(Network, match_type) -Match.Name, config_parse_ifname, 0, offsetof(Network, match_name) -Network.Description, config_parse_string, 0, offsetof(Network, description) -Network.Bridge, config_parse_bridge, 0, offsetof(Network, bridge) -Network.Bond, config_parse_bond, 0, offsetof(Network, bond) -Network.VLAN, config_parse_vlan, 0, offsetof(Network, vlan) -Network.DHCP, config_parse_bool, 0, offsetof(Network, dhcp) -Network.Address, config_parse_address, 0, 0 -Network.Gateway, config_parse_gateway, 0, 0 -Network.DNS, config_parse_dns, 0, offsetof(Network, dns) -Address.Address, config_parse_address, 0, 0 -Address.Label, config_parse_label, 0, 0 -Route.Gateway, config_parse_gateway, 0, 0 -Route.Destination, config_parse_destination, 0, 0 -DHCPv4.UseDNS, config_parse_bool, 0, offsetof(Network, dhcp_dns) -DHCPv4.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_mtu) -DHCPv4.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_hostname) -DHCPv4.UseDomainName, config_parse_bool, 0, offsetof(Network, dhcp_domainname) -Netdev.Description, config_parse_string, 0, offsetof(Netdev, description) -Netdev.Name, config_parse_ifname, 0, offsetof(Netdev, name) -Netdev.Kind, config_parse_netdev_kind, 0, offsetof(Netdev, kind) -VLAN.Id, config_parse_int, 0, offsetof(Netdev, vlanid) +Match.MACAddress, config_parse_hwaddr, 0, offsetof(Network, match_mac) +Match.Path, config_parse_string, 0, offsetof(Network, match_path) +Match.Driver, config_parse_string, 0, offsetof(Network, match_driver) +Match.Type, config_parse_string, 0, offsetof(Network, match_type) +Match.Name, config_parse_ifname, 0, offsetof(Network, match_name) +Network.Description, config_parse_string, 0, offsetof(Network, description) +Network.Bridge, config_parse_bridge, 0, offsetof(Network, bridge) +Network.Bond, config_parse_bond, 0, offsetof(Network, bond) +Network.VLAN, config_parse_vlan, 0, offsetof(Network, vlan) +Network.DHCP, config_parse_bool, 0, offsetof(Network, dhcp) +Network.Address, config_parse_address, 0, 0 +Network.Gateway, config_parse_gateway, 0, 0 +Network.DNS, config_parse_dns, 0, offsetof(Network, dns) +Address.Address, config_parse_address, 0, 0 +Address.Label, config_parse_label, 0, 0 +Route.Gateway, config_parse_gateway, 0, 0 +Route.Destination, config_parse_destination, 0, 0 +DHCPv4.UseDNS, config_parse_bool, 0, offsetof(Network, dhcp_dns) +DHCPv4.UseMTU, config_parse_bool, 0, offsetof(Network, dhcp_mtu) +DHCPv4.UseHostname, config_parse_bool, 0, offsetof(Network, dhcp_hostname) +DHCPv4.UseDomainName, config_parse_bool, 0, offsetof(Network, dhcp_domainname) +DHCPv4.CriticalConnection, config_parse_bool, 0, offsetof(Network, dhcp_critical) +Netdev.Description, config_parse_string, 0, offsetof(Netdev, description) +Netdev.Name, config_parse_ifname, 0, offsetof(Netdev, name) +Netdev.Kind, config_parse_netdev_kind, 0, offsetof(Netdev, kind) +VLAN.Id, config_parse_int, 0, offsetof(Netdev, vlanid) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index d9622ac4b7..9b5ebeda20 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -443,6 +443,12 @@ static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) { 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); diff --git a/src/network/networkd.h b/src/network/networkd.h index 22dcbd0987..968edf6a70 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -103,6 +103,7 @@ struct Network { bool dhcp_mtu; bool dhcp_hostname; bool dhcp_domainname; + bool dhcp_critical; LIST_HEAD(Address, static_addresses); LIST_HEAD(Route, static_routes); |