nixos/network-interfaces: add networking.interfaces.<name>.ipv[46].routes.type

This commit is contained in:
Alexandru Scvortov 2022-06-02 19:16:25 +01:00
parent 42cfcd1d78
commit 3a09010b9d
4 changed files with 47 additions and 6 deletions

@ -219,14 +219,15 @@ let
cidr = "${route.address}/${toString route.prefixLength}"; cidr = "${route.address}/${toString route.prefixLength}";
via = optionalString (route.via != null) ''via "${route.via}"''; via = optionalString (route.via != null) ''via "${route.via}"'';
options = concatStrings (mapAttrsToList (name: val: "${name} ${val} ") route.options); options = concatStrings (mapAttrsToList (name: val: "${name} ${val} ") route.options);
type = toString route.type;
in in
'' ''
echo "${cidr}" >> $state echo "${cidr}" >> $state
echo -n "adding route ${cidr}... " echo -n "adding route ${cidr}... "
if out=$(ip route add "${cidr}" ${options} ${via} dev "${i.name}" proto static 2>&1); then if out=$(ip route add ${type} "${cidr}" ${options} ${via} dev "${i.name}" proto static 2>&1); then
echo "done" echo "done"
elif ! echo "$out" | grep "File exists" >/dev/null 2>&1; then elif ! echo "$out" | grep "File exists" >/dev/null 2>&1; then
echo "'ip route add "${cidr}" ${options} ${via} dev "${i.name}"' failed: $out" echo "'ip route add ${type} "${cidr}" ${options} ${via} dev "${i.name}"' failed: $out"
exit 1 exit 1
fi fi
'' ''

@ -142,6 +142,9 @@ in
optionalAttrs (route.via != null) { optionalAttrs (route.via != null) {
Gateway = route.via; Gateway = route.via;
} // } //
optionalAttrs (route.type != null) {
Type = route.type;
} //
optionalAttrs (route.options ? onlink) { optionalAttrs (route.options ? onlink) {
GatewayOnLink = true; GatewayOnLink = true;
} // } //

@ -90,6 +90,22 @@ let
''; '';
}; };
type = mkOption {
type = types.nullOr (types.enum [
"unicast" "local" "broadcast" "multicast"
]);
default = null;
description = ''
Type of the route. See the <literal>Route types</literal> section
in the <literal>ip-route(8)</literal> manual page for the details.
Note that <literal>prohibit</literal>, <literal>blackhole</literal>,
<literal>unreachable</literal>, and <literal>throw</literal> cannot
be configured per device, so they are not available here. Similarly,
<literal>nat</literal> hasn't been supported since kernel 2.6.
'';
};
via = mkOption { via = mkOption {
type = types.nullOr types.str; type = types.nullOr types.str;
default = null; default = null;

@ -77,12 +77,14 @@ let
testCases = { testCases = {
loopback = { loopback = {
name = "Loopback"; name = "Loopback";
machine.networking.useDHCP = false; nodes.client = { pkgs, ... }: with pkgs.lib; {
machine.networking.useNetworkd = networkd; networking.useDHCP = false;
networking.useNetworkd = networkd;
};
testScript = '' testScript = ''
start_all() start_all()
machine.wait_for_unit("network.target") client.wait_for_unit("network.target")
loopback_addresses = machine.succeed("ip addr show lo") loopback_addresses = client.succeed("ip addr show lo")
assert "inet 127.0.0.1/8" in loopback_addresses assert "inet 127.0.0.1/8" in loopback_addresses
assert "inet6 ::1/128" in loopback_addresses assert "inet6 ::1/128" in loopback_addresses
''; '';
@ -139,6 +141,25 @@ let
client.wait_until_succeeds("ping -c 1 192.168.3.1") client.wait_until_succeeds("ping -c 1 192.168.3.1")
''; '';
}; };
routeType = {
name = "RouteType";
nodes.client = { pkgs, ... }: with pkgs.lib; {
networking = {
useDHCP = false;
useNetworkd = networkd;
interfaces.eth1.ipv4.routes = [{
address = "192.168.1.127";
prefixLength = 32;
type = "local";
}];
};
};
testScript = ''
start_all()
client.wait_for_unit("network.target")
client.succeed("ip -4 route list table local | grep 'local 192.168.1.127'")
'';
};
dhcpDefault = { dhcpDefault = {
name = "useDHCP-by-default"; name = "useDHCP-by-default";
nodes.router = router; nodes.router = router;