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.
This commit is contained in:
Tom Gundersen 2014-01-27 20:52:07 +01:00
parent e7fb33ffef
commit eb27aeca24
4 changed files with 41 additions and 25 deletions

View file

@ -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>

View 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)

View 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);

View 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);