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; }; + }; }