diff options
author | Maximilian Bosch <maximilian@mbosch.me> | 2023-10-15 16:42:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-15 16:42:01 +0200 |
commit | 083a10949aeedf7ca9a219a268a5d0c7fb1fb7c9 (patch) | |
tree | 82cbdaa87991c5aac97d66be9a67aa9e0e2f1ea9 | |
parent | 10e4eb07ad6e588eb7fdd133683ce255ec121ae5 (diff) | |
parent | c3e90f566715f717dc77a27f667b3372f40b9590 (diff) | |
download | nixpkgs-083a10949aeedf7ca9a219a268a5d0c7fb1fb7c9.tar nixpkgs-083a10949aeedf7ca9a219a268a5d0c7fb1fb7c9.tar.gz nixpkgs-083a10949aeedf7ca9a219a268a5d0c7fb1fb7c9.tar.bz2 nixpkgs-083a10949aeedf7ca9a219a268a5d0c7fb1fb7c9.tar.lz nixpkgs-083a10949aeedf7ca9a219a268a5d0c7fb1fb7c9.tar.xz nixpkgs-083a10949aeedf7ca9a219a268a5d0c7fb1fb7c9.tar.zst nixpkgs-083a10949aeedf7ca9a219a268a5d0c7fb1fb7c9.zip |
Merge pull request #258695 from Majiir/fix-networkd-defaultgateway
nixos/network-interfaces-systemd: support and require defaultGateway.interface
-rw-r--r-- | nixos/modules/tasks/network-interfaces-systemd.nix | 60 | ||||
-rw-r--r-- | nixos/modules/testing/test-instrumentation.nix | 2 | ||||
-rw-r--r-- | nixos/tests/networking.nix | 4 |
3 files changed, 35 insertions, 31 deletions
diff --git a/nixos/modules/tasks/network-interfaces-systemd.nix b/nixos/modules/tasks/network-interfaces-systemd.nix index 6912f671216..cee23eb2440 100644 --- a/nixos/modules/tasks/network-interfaces-systemd.nix +++ b/nixos/modules/tasks/network-interfaces-systemd.nix @@ -28,18 +28,20 @@ let # TODO: warn the user that any address configured on those interfaces will be useless ++ concatMap (i: attrNames (filterAttrs (_: config: config.type != "internal") i.interfaces)) (attrValues cfg.vswitches); - genericNetwork = override: - let gateway = optional (cfg.defaultGateway != null && (cfg.defaultGateway.address or "") != "") cfg.defaultGateway.address - ++ optional (cfg.defaultGateway6 != null && (cfg.defaultGateway6.address or "") != "") cfg.defaultGateway6.address; - makeGateway = gateway: { + defaultGateways = mkMerge (forEach [ cfg.defaultGateway cfg.defaultGateway6 ] (gateway: + optionalAttrs (gateway != null && gateway.interface != null) { + networks."40-${gateway.interface}" = { + matchConfig.Name = gateway.interface; + routes = [{ routeConfig = { - Gateway = gateway; - GatewayOnLink = false; + Gateway = gateway.address; + } // optionalAttrs (gateway.metric != null) { + Metric = gateway.metric; }; - }; - in optionalAttrs (gateway != [ ]) { - routes = override (map makeGateway gateway); - }; + }]; + }; + } + )); genericDhcpNetworks = initrd: mkIf cfg.useDHCP { networks."99-ethernet-default-dhcp" = { @@ -86,7 +88,7 @@ let }; }; }); - networks."40-${i.name}" = mkMerge [ (genericNetwork id) { + networks."40-${i.name}" = { name = mkDefault i.name; DHCP = mkForce (dhcpStr (if i.useDHCP != null then i.useDHCP else (config.networking.useDHCP && i.ipv4.addresses == [ ]))); @@ -158,7 +160,7 @@ let } // optionalAttrs (i.mtu != null) { MTUBytes = toString i.mtu; }; - }]; + }; })); bridgeNetworks = mkMerge (flip mapAttrsToList cfg.bridges (name: bridge: { @@ -169,10 +171,10 @@ let }; }; networks = listToAttrs (forEach bridge.interfaces (bi: - nameValuePair "40-${bi}" (mkMerge [ (genericNetwork (mkOverride 999)) { + nameValuePair "40-${bi}" { DHCP = mkOverride 0 (dhcpStr false); networkConfig.Bridge = name; - } ]))); + })); })); vlanNetworks = mkMerge (flip mapAttrsToList cfg.vlans (name: vlan: { @@ -183,9 +185,9 @@ let }; vlanConfig.Id = vlan.id; }; - networks."40-${vlan.interface}" = (mkMerge [ (genericNetwork (mkOverride 999)) { + networks."40-${vlan.interface}" = { vlan = [ name ]; - } ]); + }; })); in @@ -198,6 +200,7 @@ in # initrd.systemd.network.enable. By setting the latter and not the # former, the user retains full control over the configuration. boot.initrd.systemd.network = mkMerge [ + defaultGateways (genericDhcpNetworks true) interfaceNetworks bridgeNetworks @@ -214,11 +217,11 @@ in assertion = cfg.defaultGatewayWindowSize == null; message = "networking.defaultGatewayWindowSize is not supported by networkd."; } { - assertion = cfg.defaultGateway == null || cfg.defaultGateway.interface == null; - message = "networking.defaultGateway.interface is not supported by networkd."; + assertion = cfg.defaultGateway != null -> cfg.defaultGateway.interface != null; + message = "networking.defaultGateway.interface is not optional when using networkd."; } { - assertion = cfg.defaultGateway6 == null || cfg.defaultGateway6.interface == null; - message = "networking.defaultGateway6.interface is not supported by networkd."; + assertion = cfg.defaultGateway6 != null -> cfg.defaultGateway6.interface != null; + message = "networking.defaultGateway6.interface is not optional when using networkd."; } ] ++ flip mapAttrsToList cfg.bridges (n: { rstp, ... }: { assertion = !rstp; message = "networking.bridges.${n}.rstp is not supported by networkd."; @@ -233,6 +236,7 @@ in mkMerge [ { enable = true; } + defaultGateways (genericDhcpNetworks false) interfaceNetworks bridgeNetworks @@ -302,10 +306,10 @@ in }; networks = listToAttrs (forEach bond.interfaces (bi: - nameValuePair "40-${bi}" (mkMerge [ (genericNetwork (mkOverride 999)) { + nameValuePair "40-${bi}" { DHCP = mkOverride 0 (dhcpStr false); networkConfig.Bond = name; - } ]))); + })); }))) (mkMerge (flip mapAttrsToList cfg.macvlans (name: macvlan: { netdevs."40-${name}" = { @@ -315,9 +319,9 @@ in }; macvlanConfig = optionalAttrs (macvlan.mode != null) { Mode = macvlan.mode; }; }; - networks."40-${macvlan.interface}" = (mkMerge [ (genericNetwork (mkOverride 999)) { + networks."40-${macvlan.interface}" = { macvlan = [ name ]; - } ]); + }; }))) (mkMerge (flip mapAttrsToList cfg.fooOverUDP (name: fou: { netdevs."40-${name}" = { @@ -362,9 +366,9 @@ in }))); }; networks = mkIf (sit.dev != null) { - "40-${sit.dev}" = (mkMerge [ (genericNetwork (mkOverride 999)) { + "40-${sit.dev}" = { tunnel = [ name ]; - } ]); + }; }; }))) (mkMerge (flip mapAttrsToList cfg.greTunnels (name: gre: { @@ -383,9 +387,9 @@ in }); }; networks = mkIf (gre.dev != null) { - "40-${gre.dev}" = (mkMerge [ (genericNetwork (mkOverride 999)) { + "40-${gre.dev}" = { tunnel = [ name ]; - } ]); + }; }; }))) vlanNetworks diff --git a/nixos/modules/testing/test-instrumentation.nix b/nixos/modules/testing/test-instrumentation.nix index 6dc4091bad1..c91e54f5a4d 100644 --- a/nixos/modules/testing/test-instrumentation.nix +++ b/nixos/modules/testing/test-instrumentation.nix @@ -128,7 +128,7 @@ in boot.consoleLogLevel = 7; # Prevent tests from accessing the Internet. - networking.defaultGateway = mkOverride 150 ""; + networking.defaultGateway = mkOverride 150 null; networking.nameservers = mkOverride 150 [ ]; system.requiredKernelConfig = with config.lib.kernelConfig; [ diff --git a/nixos/tests/networking.nix b/nixos/tests/networking.nix index 4d8b4c985c6..768d0cfa223 100644 --- a/nixos/tests/networking.nix +++ b/nixos/tests/networking.nix @@ -113,8 +113,8 @@ let networking = { useNetworkd = networkd; useDHCP = false; - defaultGateway = "192.168.1.1"; - defaultGateway6 = "fd00:1234:5678:1::1"; + defaultGateway = { address = "192.168.1.1"; interface = "enp1s0"; }; + defaultGateway6 = { address = "fd00:1234:5678:1::1"; interface = "enp1s0"; }; interfaces.enp1s0.ipv4.addresses = [ { address = "192.168.1.2"; prefixLength = 24; } { address = "192.168.1.3"; prefixLength = 32; } |