summaryrefslogtreecommitdiffstats
path: root/main/bonding/bonding.post-down
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2012-03-15 13:35:48 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2012-03-15 13:35:48 +0000
commit86c2c6527c68246b409ecb163074dafc1a222551 (patch)
treed8c126d990c904785bb74cdb8d2f8bb6c5c860cb /main/bonding/bonding.post-down
parent9146859d63fb9bc88018664950a7d70086ec51eb (diff)
downloadaports-86c2c6527c68246b409ecb163074dafc1a222551.tar.bz2
aports-86c2c6527c68246b409ecb163074dafc1a222551.tar.xz
main/bonding: moved from testing
Diffstat (limited to 'main/bonding/bonding.post-down')
-rwxr-xr-xmain/bonding/bonding.post-down64
1 files changed, 64 insertions, 0 deletions
diff --git a/main/bonding/bonding.post-down b/main/bonding/bonding.post-down
new file mode 100755
index 000000000..8dd4c07e9
--- /dev/null
+++ b/main/bonding/bonding.post-down
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+[ "$VERBOSITY" = 1 ] && set -x
+
+sysfs()
+{
+ # Called with :
+ # $1 = value to write. Won't write if $1 is empty.
+ # $2 = basename of the file in bonding/ to write to.
+ if [ "$1" ] ; then
+ echo "$1" > "/sys/class/net/$IFACE/master/bonding/$2"
+ return $?
+ fi
+ return 0
+}
+
+sysfs_remove_all()
+{
+ # Called with:
+ # $1 = target filename
+ read values < "/sys/class/net/$IFACE/bonding/$1"
+ for value in $values ; do
+ echo "-$value" > "/sys/class/net/$IFACE/bonding/$1"
+ done
+}
+
+BOND_PARAMS="/sys/class/net/$IFACE/bonding"
+IFSTATE=/var/run/ifstate
+
+# free $IFACE if it is currently enslaved to a bonding device.
+if [ -f "/sys/class/net/$IFACE/master/bonding/slaves" ] ; then
+ echo "-$IFACE" > "/sys/class/net/$IFACE/master/bonding/slaves"
+
+ # The first slave in bond-primary found in current slaves becomes the primary.
+ # If no slave in bond-primary is found, then primary does not change and might be undefined if just removed.
+ for slave in $IF_BOND_PRIMARY ; do
+ if grep -sq "\\<$slave\\>" "/sys/class/net/$IFACE/master/bonding/slaves" ; then
+ sysfs "$slave" primary
+ break
+ fi
+ done
+fi
+
+# If $IFACE is not a master, exit.
+[ ! -f "$BOND_PARAMS/slaves" ] && exit
+
+# Unset multivalue sysfs entries, so that re-enabling the interface later won't cause error.
+
+sysfs_remove_all arp_ip_target
+
+# Remove any slaves of $IFACE.
+
+[ "$VERBOSITY" = 1 ] && v=-v
+read slaves < "$BOND_PARAMS/slaves"
+for slave in $slaves ; do
+ # If $slave is currently up in $IFSTATE, then bring it down, to keep $IFSTATE consistent.
+ # This is supposed to have the side effect of freeing the interface.
+ grep -q "^$slave=" $IFSTATE && ifdown $v $slave
+
+ # Anyway, ensure $slave is free.
+ if [ -f "/sys/class/net/$slave/master/bonding/slaves" ] ; then
+ echo "-$slave" > "$BOND_PARAMS/slaves" 2> /dev/null
+ fi
+done