aboutsummaryrefslogtreecommitdiff
path: root/net/bonding.sh
diff options
context:
space:
mode:
Diffstat (limited to 'net/bonding.sh')
-rw-r--r--net/bonding.sh101
1 files changed, 101 insertions, 0 deletions
diff --git a/net/bonding.sh b/net/bonding.sh
new file mode 100644
index 00000000..69de32aa
--- /dev/null
+++ b/net/bonding.sh
@@ -0,0 +1,101 @@
+# Copyright 2007-2008 Roy Marples <roy@marples.name>
+# All rights reserved. Released under the 2-clause BSD license.
+
+bonding_depend()
+{
+ before interface macchanger
+ program /sbin/ifenslave
+}
+
+_config_vars="$_config_vars slaves"
+
+_is_bond()
+{
+ [ -f "/proc/net/bonding/${IFACE}" ]
+}
+
+bonding_pre_start()
+{
+ local s= slaves="$(_get_array "slaves_${IFVAR}")"
+
+ [ -z "${slaves}" ] && return 0
+
+ # Load the kernel module if required
+ if [ ! -d /proc/net/bonding ]; then
+ if ! modprobe bonding; then
+ eerror "Cannot load the bonding module"
+ return 1
+ fi
+ fi
+
+ # We can create the interface name we like now, but this
+ # requires sysfs
+ if ! _exists && [ -d /sys/class/net ]; then
+ echo "+${IFACE}" > /sys/class/net/bonding_masters
+ fi
+ _exists true || return 1
+
+ if ! _is_bond; then
+ eerror "${IFACE} is not capable of bonding"
+ return 1
+ fi
+
+ ebegin "Adding slaves to ${IFACE}"
+ eindent
+ einfo "${slaves}"
+
+ # Check that our slaves exist
+ (
+ for IFACE in ${slaves}; do
+ _exists true || return 1
+ done
+
+ # Must force the slaves to a particular state before adding them
+ for IFACE in ${slaves}; do
+ _delete_addresses
+ _up
+ done
+ )
+
+ # now force the master to up
+ _up
+
+ # finally add in slaves
+ eoutdent
+ /sbin/ifenslave "${IFACE}" ${slaves} >/dev/null
+ eend $?
+
+ return 0 #important
+}
+
+bonding_stop()
+{
+ _is_bond || return 0
+
+ local slaves= s=
+ slaves=$( \
+ sed -n -e 's/^Slave Interface: //p' "/proc/net/bonding/${IFACE}" \
+ | tr '\n' ' ' \
+ )
+ [ -z "${slaves}" ] && return 0
+
+ # remove all slaves
+ ebegin "Removing slaves from ${IFACE}"
+ eindent
+ einfo "${slaves}"
+ eoutdent
+ /sbin/ifenslave -d "${IFACE}" ${slaves}
+
+ # reset all slaves
+ (
+ for IFACE in ${slaves}; do
+ if _exists; then
+ _delete_addresses
+ _down
+ fi
+ done
+ )
+
+ eend 0
+ return 0
+}