summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorWilliam A. Kennington III <william@wkennington.com>2015-01-13 16:10:39 -0800
committerWilliam A. Kennington III <william@wkennington.com>2015-01-14 10:34:28 -0800
commit8e5ef7da54e387238e513e4d9f29f86d1a7f0940 (patch)
tree750f24b96e1135aed3b7ef40b4ae1c92cf571c48 /nixos
parent1ec68e0d13cb896525d142ab3d1980ce27fd5368 (diff)
downloadnixlib-8e5ef7da54e387238e513e4d9f29f86d1a7f0940.tar
nixlib-8e5ef7da54e387238e513e4d9f29f86d1a7f0940.tar.gz
nixlib-8e5ef7da54e387238e513e4d9f29f86d1a7f0940.tar.bz2
nixlib-8e5ef7da54e387238e513e4d9f29f86d1a7f0940.tar.lz
nixlib-8e5ef7da54e387238e513e4d9f29f86d1a7f0940.tar.xz
nixlib-8e5ef7da54e387238e513e4d9f29f86d1a7f0940.tar.zst
nixlib-8e5ef7da54e387238e513e4d9f29f86d1a7f0940.zip
nixos/network-interfaces: Fix rstp support
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/tasks/network-interfaces-scripted.nix12
-rw-r--r--nixos/modules/tasks/network-interfaces.nix34
2 files changed, 36 insertions, 10 deletions
diff --git a/nixos/modules/tasks/network-interfaces-scripted.nix b/nixos/modules/tasks/network-interfaces-scripted.nix
index da0d8530241b..fd545a723e76 100644
--- a/nixos/modules/tasks/network-interfaces-scripted.nix
+++ b/nixos/modules/tasks/network-interfaces-scripted.nix
@@ -37,8 +37,6 @@ let
     ip link del "${i}" 2>/dev/null || true
   '';
 
-  needsMstpd = any ({ rstp, ... }: rstp) (attrValues cfg.bridges);
-
 in
 
 {
@@ -194,7 +192,7 @@ in
             before = [ "network-interfaces.target" (subsystemDevice n) ];
             serviceConfig.Type = "oneshot";
             serviceConfig.RemainAfterExit = true;
-            path = [ pkgs.iproute ] ++ optional v.rstp pkgs.mstpd;
+            path = [ pkgs.iproute ];
             script = ''
               # Remove Dead Interfaces
               echo "Removing old bridge ${n}..."
@@ -209,11 +207,9 @@ in
                 ip link set "${i}" up
               '')}
 
-              # Enable rstp on the interface
+              # Enable stp on the interface
               ${optionalString v.rstp ''
-                echo 1 >/sys/class/net/${n}/bridge/stp_state
-                mstpctl addbridge "${n}"
-                mstpctl setforcevers "${n}" rstp
+                echo 2 >/sys/class/net/${n}/bridge/stp_state
               ''}
 
               ip link set "${n}" up
@@ -353,8 +349,6 @@ in
         KERNEL=="tun", TAG+="systemd"
       '';
 
-    services.mstpd = mkIf needsMstpd { enable = true; };
-
   };
 
 }
diff --git a/nixos/modules/tasks/network-interfaces.nix b/nixos/modules/tasks/network-interfaces.nix
index 9f72e0f0d509..71a721abba21 100644
--- a/nixos/modules/tasks/network-interfaces.nix
+++ b/nixos/modules/tasks/network-interfaces.nix
@@ -16,6 +16,35 @@ let
 
   slaveIfs = map (i: cfg.interfaces.${i}) (filter (i: cfg.interfaces ? ${i}) slaves);
 
+  rstpBridges = flip filterAttrs cfg.bridges (_: { rstp, ... }: rstp);
+
+  needsMstpd = rstpBridges != { };
+
+  bridgeStp = optional needsMstpd (pkgs.writeTextFile {
+    name = "bridge-stp";
+    executable = true;
+    destination = "/bin/bridge-stp";
+    text = ''
+      #!${pkgs.stdenv.shell} -e
+      export PATH="${pkgs.mstpd}/bin"
+
+      BRIDGES=(${concatStringsSep " " (attrNames rstpBridges)})
+      for BRIDGE in $BRIDGES; do
+        if [ "$BRIDGE" = "$1" ]; then
+          if [ "$2" = "start" ]; then
+            mstpctl addbridge "$BRIDGE"
+            exit 0
+          elif [ "$2" = "stop" ]; then
+            mstpctl delbridge "$BRIDGE"
+            exit 0
+          fi
+          exit 1
+        fi
+      done
+      exit 1
+    '';
+  });
+
   # We must escape interfaces due to the systemd interpretation
   subsystemDevice = interface:
     "sys-subsystem-net-devices-${escapeSystemdPath interface}.device";
@@ -683,7 +712,7 @@ in
         pkgs.iw
         pkgs.rfkill
         pkgs.openresolv
-      ];
+      ] ++ bridgeStp;
 
     systemd.targets."network-interfaces" =
       { description = "All Network Interfaces";
@@ -731,6 +760,9 @@ in
             ip link set "${i.name}" mtu "${toString i.mtu}"
           '';
       })));
+
+    services.mstpd = mkIf needsMstpd { enable = true; };
+
   };
 
 }