summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpennae <82953136+pennae@users.noreply.github.com>2022-06-04 15:41:03 +0000
committerGitHub <noreply@github.com>2022-06-04 15:41:03 +0000
commit18cce1008e8fdae525d4a3211c58a9da56628dcf (patch)
tree96823a969bea17c2c6480cbdf42905d34a9f0d58
parent36baf1559e4618c6f6fea9f2214f1488ed6da890 (diff)
parent3a09010b9d5d7dac68bfca200a9447e1eb77f3eb (diff)
Merge pull request #175743 from scvalex/add-route-type-option
nixos/network-interfaces: add networking.interfaces.<name>.ipv[46].routes.type
-rw-r--r--nixos/modules/tasks/network-interfaces-scripted.nix5
-rw-r--r--nixos/modules/tasks/network-interfaces-systemd.nix3
-rw-r--r--nixos/modules/tasks/network-interfaces.nix16
-rw-r--r--nixos/tests/networking.nix29
4 files changed, 47 insertions, 6 deletions
diff --git a/nixos/modules/tasks/network-interfaces-scripted.nix b/nixos/modules/tasks/network-interfaces-scripted.nix
index b0f160c1dbf9..66fdc61d2835 100644
--- a/nixos/modules/tasks/network-interfaces-scripted.nix
+++ b/nixos/modules/tasks/network-interfaces-scripted.nix
@@ -219,14 +219,15 @@ let
cidr = "${route.address}/${toString route.prefixLength}";
via = optionalString (route.via != null) ''via "${route.via}"'';
options = concatStrings (mapAttrsToList (name: val: "${name} ${val} ") route.options);
+ type = toString route.type;
in
''
echo "${cidr}" >> $state
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"
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
fi
''
diff --git a/nixos/modules/tasks/network-interfaces-systemd.nix b/nixos/modules/tasks/network-interfaces-systemd.nix
index 110e84494a3d..80808e0c08fa 100644
--- a/nixos/modules/tasks/network-interfaces-systemd.nix
+++ b/nixos/modules/tasks/network-interfaces-systemd.nix
@@ -142,6 +142,9 @@ in
optionalAttrs (route.via != null) {
Gateway = route.via;
} //
+ optionalAttrs (route.type != null) {
+ Type = route.type;
+ } //
optionalAttrs (route.options ? onlink) {
GatewayOnLink = true;
} //
diff --git a/nixos/modules/tasks/network-interfaces.nix b/nixos/modules/tasks/network-interfaces.nix
index d56159f15960..07bccf98f407 100644
--- a/nixos/modules/tasks/network-interfaces.nix
+++ b/nixos/modules/tasks/network-interfaces.nix
@@ -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 {
type = types.nullOr types.str;
default = null;
diff --git a/nixos/tests/networking.nix b/nixos/tests/networking.nix
index 2cc1e9b0942c..1fe1229f24a4 100644
--- a/nixos/tests/networking.nix
+++ b/nixos/tests/networking.nix
@@ -77,12 +77,14 @@ let
testCases = {
loopback = {
name = "Loopback";
- machine.networking.useDHCP = false;
- machine.networking.useNetworkd = networkd;
+ nodes.client = { pkgs, ... }: with pkgs.lib; {
+ networking.useDHCP = false;
+ networking.useNetworkd = networkd;
+ };
testScript = ''
start_all()
- machine.wait_for_unit("network.target")
- loopback_addresses = machine.succeed("ip addr show lo")
+ client.wait_for_unit("network.target")
+ loopback_addresses = client.succeed("ip addr show lo")
assert "inet 127.0.0.1/8" 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")
'';
};
+ 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 = {
name = "useDHCP-by-default";
nodes.router = router;