diff options
author | John Klug <john.klug@multitech.com> | 2017-02-13 14:25:26 -0600 |
---|---|---|
committer | John Klug <john.klug@multitech.com> | 2017-02-13 14:25:26 -0600 |
commit | a6ce3e3dc0def6ca7ea46b07cf28b1cf292b108b (patch) | |
tree | 94a70c972dfcd9aee17aa8e9bd7980b69b02707c /recipes-core/init-ifupdown/files/bonding.post-down | |
parent | d5ec24692d94485163799cf42018012b86571054 (diff) | |
download | meta-mlinux-a6ce3e3dc0def6ca7ea46b07cf28b1cf292b108b.tar.gz meta-mlinux-a6ce3e3dc0def6ca7ea46b07cf28b1cf292b108b.tar.bz2 meta-mlinux-a6ce3e3dc0def6ca7ea46b07cf28b1cf292b108b.zip |
Add bonding ifup ifdown
Diffstat (limited to 'recipes-core/init-ifupdown/files/bonding.post-down')
-rw-r--r-- | recipes-core/init-ifupdown/files/bonding.post-down | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/recipes-core/init-ifupdown/files/bonding.post-down b/recipes-core/init-ifupdown/files/bonding.post-down new file mode 100644 index 0000000..13ed4fd --- /dev/null +++ b/recipes-core/init-ifupdown/files/bonding.post-down @@ -0,0 +1,67 @@ +#!/bin/sh + +[ "$IF_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. + +[ "$IF_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 |