nixos/network-interfaces: Fix rstp support

This commit is contained in:
William A. Kennington III 2015-01-13 16:10:39 -08:00
parent 1ec68e0d13
commit 8e5ef7da54
2 changed files with 36 additions and 10 deletions

View file

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

View file

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