diff --git a/nixos/modules/services/networking/dhcpcd.nix b/nixos/modules/services/networking/dhcpcd.nix index 65b4319b50a..7e0b00a3d7b 100644 --- a/nixos/modules/services/networking/dhcpcd.nix +++ b/nixos/modules/services/networking/dhcpcd.nix @@ -11,7 +11,7 @@ let # Don't start dhcpcd on explicitly configured interfaces or on # interfaces that are part of a bridge, bond or sit device. ignoredInterfaces = - map (i: i.name) (filter (i: i.ip4 != [ ]) (attrValues config.networking.interfaces)) + map (i: i.name) (filter (i: i.ip4 != [ ] || i.ipAddress != null) (attrValues config.networking.interfaces)) ++ mapAttrsToList (i: _: i) config.networking.sits ++ concatLists (attrValues (mapAttrs (n: v: v.interfaces) config.networking.bridges)) ++ concatLists (attrValues (mapAttrs (n: v: v.interfaces) config.networking.bonds)) diff --git a/nixos/modules/tasks/network-interfaces.nix b/nixos/modules/tasks/network-interfaces.nix index 054784502eb..ac3a55332e4 100644 --- a/nixos/modules/tasks/network-interfaces.nix +++ b/nixos/modules/tasks/network-interfaces.nix @@ -68,36 +68,48 @@ let ipAddress = mkOption { default = null; + example = "10.0.0.1"; + type = types.nullOr types.str; description = '' - Defunct, create an address in the ip4 list instead. + IP address of the interface. Leave empty to configure the + interface using DHCP. ''; }; prefixLength = mkOption { default = null; + example = 24; + type = types.nullOr types.int; description = '' - Defunct, supply the prefix length in the ip4 list instead. + Subnet mask of the interface, specified as the number of + bits in the prefix (24). ''; }; subnetMask = mkOption { default = null; description = '' - Defunct, supply the prefix length in the ip4 list instead. + Defunct, supply the prefix length instead. ''; }; ipv6Address = mkOption { default = null; + example = "2001:1470:fffd:2098::e006"; + type = types.nullOr types.str; description = '' - Defunct, create an address in the ip6 list instead. + IPv6 address of the interface. Leave empty to configure the + interface using NDP. ''; }; ipv6prefixLength = mkOption { - default = null; + default = 64; + example = 64; + type = types.int; description = '' - Defunct, supply the prefix length in the ip6 list instead. + Subnet mask of the interface, specified as the number of + bits in the prefix (64). ''; }; @@ -470,12 +482,8 @@ in assertions = flip map interfaces (i: { - assertion = i.ipAddress == null && i.prefixLength == null && i.subnetMask == null; - message = "The networking.interfaces.${i.name}.ipAddress option is defunct. Use networking.ip4 instead."; - }) - ++ flip map interfaces (i: { - assertion = i.ipv6Address == null && i.ipv6prefixLength == null; - message = "The networking.interfaces.${i.name}.ipv6Address option is defunct. Use networking.ip6 instead."; + assertion = i.subnetMask == null; + message = "The networking.interfaces.${i.name}.subnetMask option is defunct. Use prefixLength instead."; }); boot.kernelModules = [ ] @@ -574,7 +582,18 @@ in # network device, so it only gets started after the interface # has appeared, and it's stopped when the interface # disappears. - configureInterface = i: nameValuePair "${i.name}-cfg" + configureInterface = i: + let + ips = i.ip4 ++ optionals cfg.enableIPv6 i.ip6 + ++ optional (i.ipAddress != null) { + ipAddress = i.ipAddress; + prefixLength = i.prefixLength; + } ++ optional (cfg.enableIPv6 && i.ipv6Address != null) { + ipAddress = i.ipv6Address; + prefixLength = i.ipv6PrefixLength; + }; + in + nameValuePair "${i.name}-cfg" { description = "Configuration of ${i.name}"; wantedBy = [ "network-interfaces.target" ]; bindsTo = [ "sys-subsystem-net-devices-${i.name}.device" ]; @@ -606,7 +625,7 @@ in # useful when the Nix store is accessed via this # interface (e.g. in a QEMU VM test). '' - + flip concatMapStrings (i.ip4 ++ optionals cfg.enableIPv6 i.ip6) (ip: + + flip concatMapStrings (ips) (ip: let address = "${ip.address}/${toString ip.prefixLength}"; in @@ -622,7 +641,7 @@ in fi fi '') - + optionalString (i.ip4 != [ ] || (cfg.enableIPv6 && i.ip6 != [ ])) + + optionalString (ips != [ ]) '' if [ restart_network_setup = true ]; then # Ensure that the default gateway remains set. @@ -643,7 +662,7 @@ in '' echo "releasing configured ip's..." '' - + flip concatMapStrings (i.ip4 ++ optionals cfg.enableIPv6 i.ip6) (ip: + + flip concatMapStrings (ips) (ip: let address = "${ip.address}/${toString ip.prefixLength}"; in