#!/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 # make sure that the link is set to down ip link set dev $IFACE down