network-interfaces service: add defaultGateway{,6}.interface

+10 -6
nixos/modules/tasks/network-interfaces-scripted.nix
···
EOF
# Set the default gateway.
-
${optionalString (cfg.defaultGateway != null && cfg.defaultGateway != "") ''
+
${optionalString (cfg.defaultGateway != null && cfg.defaultGateway.address != "") ''
# FIXME: get rid of "|| true" (necessary to make it idempotent).
-
ip route add default via "${cfg.defaultGateway}" ${
+
ip route add default via "${cfg.defaultGateway.address}" ${
optionalString (cfg.defaultGatewayWindowSize != null)
-
"window ${toString cfg.defaultGatewayWindowSize}"} || true
+
"window ${toString cfg.defaultGatewayWindowSize}"} ${
+
optionalString (cfg.defaultGateway.interface != null)
+
"dev ${cfg.defaultGateway.interface}"}|| true
''}
-
${optionalString (cfg.defaultGateway6 != null && cfg.defaultGateway6 != "") ''
+
${optionalString (cfg.defaultGateway6 != null && cfg.defaultGateway6.address != "") ''
# FIXME: get rid of "|| true" (necessary to make it idempotent).
-
ip -6 route add ::/0 via "${cfg.defaultGateway6}" ${
+
ip -6 route add ::/0 via "${cfg.defaultGateway6.address}" ${
optionalString (cfg.defaultGatewayWindowSize != null)
-
"window ${toString cfg.defaultGatewayWindowSize}"} || true
+
"window ${toString cfg.defaultGatewayWindowSize}"} ${
+
optionalString (cfg.defaultGateway6.interface != null)
+
"dev ${cfg.defaultGateway6.interface}"} || true
''}
'';
};
+6
nixos/modules/tasks/network-interfaces-systemd.nix
···
} {
assertion = cfg.vswitches == {};
message = "networking.vswichtes are not supported by networkd.";
+
} {
+
assertion = cfg.defaultGateway == null || cfg.defaultGateway.interface == null;
+
message = "networking.defaultGateway.interface is not supported by networkd.";
+
} {
+
assertion = cfg.defaultGateway6 == null || cfg.defaultGateway6.interface == null;
+
message = "networking.defaultGateway6.interface is not supported by networkd.";
} ] ++ flip mapAttrsToList cfg.bridges (n: { rstp, ... }: {
assertion = !rstp;
message = "networking.bridges.${n}.rstp is not supported by networkd.";
+36 -6
nixos/modules/tasks/network-interfaces.nix
···
};
};
+
gatewayCoerce = address: { inherit address; };
+
+
gatewayOpts = { ... }: {
+
+
options = {
+
+
address = mkOption {
+
type = types.str;
+
description = "The default gateway address.";
+
};
+
+
interface = mkOption {
+
type = types.nullOr types.str;
+
default = null;
+
example = "enp0s3";
+
description = "The default gateway interface.";
+
};
+
+
};
+
+
};
+
interfaceOpts = { name, ... }: {
options = {
···
networking.defaultGateway = mkOption {
default = null;
-
example = "131.211.84.1";
-
type = types.nullOr types.str;
+
example = {
+
address = "131.211.84.1";
+
device = "enp3s0";
+
};
+
type = types.nullOr (types.coercedTo types.str gatewayCoerce (types.submodule gatewayOpts));
description = ''
-
The default gateway. It can be left empty if it is auto-detected through DHCP.
+
The default gateway. It can be left empty if it is auto-detected through DHCP.
+
It can be specified as a string or an option set along with a network interface.
'';
};
networking.defaultGateway6 = mkOption {
default = null;
-
example = "2001:4d0:1e04:895::1";
-
type = types.nullOr types.str;
+
example = {
+
address = "2001:4d0:1e04:895::1";
+
device = "enp3s0";
+
};
+
type = types.nullOr (types.coercedTo types.str gatewayCoerce (types.submodule gatewayOpts));
description = ''
-
The default ipv6 gateway. It can be left empty if it is auto-detected through DHCP.
+
The default ipv6 gateway. It can be left empty if it is auto-detected through DHCP.
+
It can be specified as a string or an option set along with a network interface.
'';
};