summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/systemd-networkd.service.xml8
-rw-r--r--src/network/networkd-gperf.gperf51
-rw-r--r--src/network/networkd-link.c6
-rw-r--r--src/network/networkd.h1
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);