Unverified Commit 083a1094 authored by Maximilian Bosch's avatar Maximilian Bosch Committed by GitHub
Browse files

Merge pull request #258695 from Majiir/fix-networkd-defaultgateway

nixos/network-interfaces-systemd: support and require defaultGateway.interface
parents 10e4eb07 c3e90f56
Loading
Loading
Loading
Loading
+32 −28
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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; [
+2 −2
Original line number Diff line number Diff line
@@ -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; }