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:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user