2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2010 Michael Tremer & Christian Schmidt #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
22 BONDING_ALLOWED_MODES
="balance-rr active-backup balance-xor broadcast 802.3ad \
23 balance-tlb balance-alb"
24 BONDING_MASTERS
="/sys/class/net/bonding_masters"
26 function bonding_init
() {
27 if ! grep -q "^bonding" /proc
/modules
; then
34 function bonding_create
() {
40 local mode
="balance-rr"
42 while [ $# -gt 0 ]; do
45 address
=$
(cli_get_val
${1})
48 mode
=$
(cli_get_val
${1})
51 error
"Unrecognized argument: ${1}"
58 if isset address
; then
59 if ! ismac address
; then
60 log ERROR
"Invalid mac address: ${address}"
65 if ! list_match
"${mode}" ${BONDING_ALLOWED_MODES}; then
66 log ERROR
"Bonding mode is not supported: ${mode}"
67 log ERROR
"Valid modes are: ${BONDING_ALLOWED_MODES}"
71 # Initialize the bonding driver just
75 # Create the bonding device.
76 print
"+${device}" > ${BONDING_MASTERS}
79 if [ ${ret} -eq ${EXIT_OK} ]; then
80 log DEBUG
"Successfully created bonding device '${device}'"
82 log ERROR
"Could not create bonding device '${device}'"
86 # Set the mode of the bonding device.
87 print
"${mode}" > ${SYS_CLASS_NET}/${device}/bonding/mode
90 if [ ${ret} -ne ${EXIT_OK} ]; then
91 log ERROR "Could not
set mode of bonding device
'${device}': ${Mmode}"
95 if isset address; then
96 device_set_address ${device} ${address}
102 function bonding_remove() {
106 if ! device_exists ${device}; then
110 # Set device down if not already done.
111 device_set_down ${device}
114 print "-${device}" > ${BONDING_MASTERS}
117 if [ ${ret} -eq ${EXIT_OK} ]; then
118 log DEBUG "Successfully removed bonding device
'${device}'"
120 log ERROR "Could not remove bonding device
'${device}'"
127 function bonding_get_mode() {
132 read mode mode_num < ${SYS_CLASS_NET}/${device}/bonding/mode
136 function bonding_enslave_device() {
145 # Slave must be down to be enslaved.
146 device_set_down ${device}
148 if device_is_up ${device}; then
149 log ERROR "Cannot enslave
'${slave}' because it cannot be
set down.
"
154 print "+${slave}" > ${SYS_CLASS_NET}/${device}/bonding
/slaves
157 if [ ${ret} -eq ${EXIT_OK} ]; then
158 log DEBUG
"Successfully enslaved '${slave}' to '${device}'."
160 log ERROR
"Could not enslave '${slave}' to '${device}'."
167 function bonding_get_slaves
() {
173 while [ $# -gt 0 ]; do
179 error
"Unrecognized argument: ${1}"
186 fread
${SYS_CLASS_NET}/${device}/bonding/${file}
191 function bonding_get_lacp_rate
() {
196 read -r rate rateno \
197 < ${SYS_CLASS_NET}/${device}/bonding
/lacp_rate
203 function bonding_get_miimon
() {
207 fread
${SYS_CLASS_NET}/${device}/bonding
/miimon
210 function bonding_set_miimon
() {
217 print
"${miimon}" > ${SYS_CLASS_NET}/${device}/bonding/miimon
220 function bonding_slave_get_master() {
224 device_is_bonded ${slave} || return ${EXIT_ERROR}
226 local master=$(fread ${SYS_CLASS_NET}/${slave}/master/ifindex)
227 if isset master; then
228 device_ifindex_to_name ${master}