summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-01-27 20:52:07 +0100
committerTom Gundersen <teg@jklm.no>2014-01-30 14:30:39 +0100
commiteb27aeca247a4cf8816fffc4c0dbcab55ead3864 (patch)
tree4c27a114379b0874f229db32aad3df9138f41164
parente7fb33ffefcdc68ad096eea7444da877b68390e8 (diff)
networkd: dhcpv4 - add notion of 'CriticalConnection'
These connections are never torn down, even when the DHCP specifications say that they should be. This is useful/necessary when the rootfs (or another critical fs) is mounted over this network connection, and dataloss would result if the connection is lost. This option defaults to off, but our initrd generator (TBD) will enable it when applicable.
-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);