chiark / gitweb /
networkd: dhcpv4 - add notion of 'CriticalConnection'
authorTom Gundersen <teg@jklm.no>
Mon, 27 Jan 2014 19:52:07 +0000 (20:52 +0100)
committerTom Gundersen <teg@jklm.no>
Thu, 30 Jan 2014 13:30:39 +0000 (14:30 +0100)
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.

man/systemd-networkd.service.xml
src/network/networkd-gperf.gperf
src/network/networkd-link.c
src/network/networkd.h

index 3403a7a1a709f5ce50709006b34632c301ebfaf7..3e6fddc7165ce70e35cc6dc57b74ad48725bc178 100644 (file)
                                                 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>
index aff23bb55d292d62e179f247a79915bc66fa5264..de7280562556b994c983757be5f438a4541e434b 100644 (file)
@@ -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)
index d9622ac4b71df70a67f50f9fa5db801bb0c44602..9b5ebeda2072c960d125c5a202d864a519b1b716 100644 (file)
@@ -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);
 
index 22dcbd098716beab25fdb156cdd0895a6da1d241..968edf6a70d5b925808e5dfd89329e430105e904 100644 (file)
@@ -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);