BONDING_ALLOWED_MODES="balance-rr active-backup balance-xor broadcast 802.3ad \
balance-tlb balance-alb"
BONDING_MASTERS="/sys/class/net/bonding_masters"
-
-bonding_init() {
- module_load "bonding"
-}
+BONDING_PORT_PATTERN="bN"
bonding_create() {
local device=${1}
while [ $# -gt 0 ]; do
case "${1}" in
--address=*)
- address=$(cli_get_val ${1})
+ address=$(cli_get_val "${1}")
;;
--mode=*)
- mode=$(cli_get_val ${1})
+ mode=$(cli_get_val "${1}")
;;
*)
error "Unrecognized argument: ${1}"
return ${EXIT_ERROR}
fi
- # Initialize the bonding driver just
- # when we need it.
- bonding_init
-
- # Create the bonding device.
- fappend "${BONDING_MASTERS}" "+${device}"
- local ret=$?
+ # Load the kernel module
+ module_load "bonding"
- if [ ${ret} -eq ${EXIT_OK} ]; then
+ # Create the bonding device
+ if cmd ip link add "${device}" address "${address}" \
+ type bond mode "${mode}"; then
log DEBUG "Successfully created bonding device '${device}'"
else
log ERROR "Could not create bonding device '${device}'"
return ${EXIT_ERROR}
fi
- # Set the mode of the bonding device.
- bonding_set_mode "${device}" "${mode}"
-
- if isset address; then
- device_set_address "${device}" "${address}"
- fi
-
return ${EXIT_OK}
}
local device=${1}
assert isset device
- if ! device_exists ${device}; then
- return ${EXIT_ERROR}
- fi
-
- # Set device down if not already done.
- device_set_down ${device}
-
# Remove the device.
- fappend "${BONDING_MASTERS}" "-${device}"
- local ret=$?
-
- if [ ${ret} -eq ${EXIT_OK} ]; then
+ if device_delete "${device}"; then
log DEBUG "Successfully removed bonding device '${device}'"
else
log ERROR "Could not remove bonding device '${device}'"
shift 2
- # Slave must be down to be enslaved.
- device_set_down ${device}
+ local slaves="$(bonding_get_slaves "${device}")"
+ if list_match "${slave}" ${slaves}; then
+ log DEBUG "${slave} is already enslaved in ${device}"
+ return ${EXIT_OK}
+ fi
- if device_is_up ${device}; then
+ # Slave must be down to be enslaved.
+ if ! device_set_down "${slave}"; then
log ERROR "Cannot enslave '${slave}' because it cannot be set down."
return ${EXIT_ERROR}
fi
- # Add it.
- fappend "${SYS_CLASS_NET}/${device}/bonding/slaves" "+${slave}"
- local ret=$?
-
- if [ ${ret} -eq ${EXIT_OK} ]; then
- log DEBUG "Successfully enslaved '${slave}' to '${device}'"
- else
+ # Add it
+ if ! device_set_master "${slave}" "${device}"; then
log ERROR "Could not enslave '${slave}' to '${device}'"
return ${EXIT_ERROR}
fi
+ log DEBUG "Successfully enslaved '${slave}' to '${device}'"
return ${EXIT_OK}
}