3 # Copyright (C) 2018 TDT AG <development@tdt.de>
5 # This is free software, licensed under the GNU General Public License v2.
6 # See https://www.gnu.org/licenses/gpl-2.0.txt for more information.
16 BONDING_MASTERS
="/sys/class/net/bonding_masters"
21 for varname
in "$@"; do
23 json_get_var value
"$varname"
25 [ -n "$value" ] && echo "$value" > /sys
/class
/net
/"$link"/bonding
/"$varname"
29 proto_bonding_init_config
() {
33 proto_config_add_string
"ifname"
35 proto_config_add_string
"ipaddr"
36 proto_config_add_string
"netmask"
38 proto_config_add_string
"bonding_policy"
39 proto_config_add_string
"link_monitoring"
40 proto_config_add_array
"slaves"
41 proto_config_add_string
"all_slaves_active"
43 proto_config_add_string
"min_links"
44 proto_config_add_string
"ad_actor_sys_prio"
45 proto_config_add_string
"ad_actor_system"
46 proto_config_add_string
"ad_select"
47 proto_config_add_string
"lacp_rate"
48 proto_config_add_string
"packets_per_slave"
49 proto_config_add_string
"xmit_hash_policy"
50 proto_config_add_string
"primary"
51 proto_config_add_string
"primary_reselect"
52 proto_config_add_string
"lp_interval"
53 proto_config_add_string
"tlb_dynamic_lb"
54 proto_config_add_string
"resend_igmp"
55 proto_config_add_string
"fail_over_mac"
56 proto_config_add_string
"num_grat_arp__num_unsol_na"
58 proto_config_add_string
"arp_interval"
59 proto_config_add_string
"arp_ip_target"
60 proto_config_add_string
"arp_all_targets"
61 proto_config_add_string
"arp_validate"
63 proto_config_add_string
"miimon"
64 proto_config_add_string
"downdelay"
65 proto_config_add_string
"updelay"
66 proto_config_add_string
"use_carrier"
69 proto_bonding_add_slave
() {
75 if [ ! -e "/sys/class/net/$slave" ]; then
76 echo "$cfg" "No slave device $slave found"
77 proto_notify_error
"$cfg" NO_DEVICE
78 proto_block_restart
"$cfg"
82 ip link
set dev
"$slave" down
86 echo "+$slave" > /sys
/class
/net
/"$link"/bonding
/slaves
88 ip link
set dev
"$slave" up
91 proto_bonding_setup
() {
93 local link
="bond-$cfg"
95 # Check for loaded kernel bonding driver (/sys/class/net/bonding_masters exists)
96 [ -f "$BONDING_MASTERS" ] ||
{
97 echo "$cfg" "setup: bonding_masters does not exist in sysfs (kernel module not loaded?)"
98 proto_notify_error
"$cfg" BONDING_MASTER_DOES_NOT_EXIST
99 proto_block_restart
"$cfg"
103 # Add bonding interface to system
104 echo "+$link" > "$BONDING_MASTERS"
106 # Set bonding policy (with corresponding parameters)
108 json_get_vars bonding_policy
110 case "$bonding_policy" in
113 echo "$bonding_policy" > /sys
/class
/net
/"$link"/bonding
/mode
114 set_driver_values min_links ad_actor_sys_prio ad_actor_system ad_select lacp_rate xmit_hash_policy
118 echo "$bonding_policy" > /sys
/class
/net
/"$link"/bonding
/mode
119 set_driver_values packets_per_slave xmit_hash_policy
123 echo "$bonding_policy" > /sys
/class
/net
/"$link"/bonding
/mode
124 set_driver_values primary primary_reselect lp_interval tlb_dynamic_lb resend_igmp xmit_hash_policy
128 echo "$bonding_policy" > /sys
/class
/net
/"$link"/bonding
/mode
129 set_driver_values primary primary_reselect lp_interval tlb_dynamic_lb resend_igmp xmit_hash_policy
133 echo "$bonding_policy" > /sys
/class
/net
/"$link"/bonding
/mode
134 set_driver_values xmit_hash_policy
138 echo "$bonding_policy" > /sys
/class
/net
/"$link"/bonding
/mode
142 echo "$bonding_policy" > /sys
/class
/net
/"$link"/bonding
/mode
143 set_driver_values primary primary_reselect fail_over_mac num_grat_arp__num_unsol_na xmit_hash_policy
147 # Set link monitoring (with corresponding parameters)
148 local link_monitoring
149 json_get_vars link_monitoring
151 case "$link_monitoring" in
154 local arp_interval arp_ip_target arp_all_targets arp_validate
155 json_get_vars arp_interval arp_ip_target arp_all_targets arp_validate
157 [ -n "$arp_interval" -a "$arp_interval" != 0 ] && echo "$arp_interval" > /sys
/class
/net
/"$link"/bonding
/arp_interval
160 for target
in $arp_ip_target; do
161 echo "+$target" > /sys
/class
/net
/"$link"/bonding
/arp_ip_target
164 [ -n "$arp_all_targets" ] && echo "$arp_all_targets" > /sys
/class
/net
/"$link"/bonding
/arp_all_targets
165 [ -n "$arp_validate" ] && echo "$arp_validate" > /sys
/class
/net
/"$link"/bonding
/arp_validate
169 local miimon downdelay updelay use_carrier
170 json_get_vars miimon downdelay updelay use_carrier
172 [ -n "$miimon" -a "$miimon" != 0 ] && echo "$miimon" > /sys
/class
/net
/"$link"/bonding
/miimon
173 [ -n "$downdelay" ] && echo "$downdelay" > /sys
/class
/net
/"$link"/bonding
/downdelay
174 [ -n "$updelay" ] && echo "$updelay" > /sys
/class
/net
/"$link"/bonding
/updelay
175 [ -n "$use_carrier" ] && echo "$use_carrier" > /sys
/class
/net
/"$link"/bonding
/use_carrier
179 # Add slaves to bonding interface
182 json_for_each_item proto_bonding_add_slave slaves
"$cfg" "$link"
184 [ -n "$all_slaves_active" ] && echo "$all_slaves_active" > /sys
/class
/net
/"$link"/bonding
/all_slaves_active
187 json_get_vars ipaddr netmask
190 #All json vars have to be read before the line below, as the
191 # json object will be overwritten by proto_init_update
194 proto_init_update
"$link" 1
196 # If ipaddr is configured, configure the ip to the interface
197 [ -n "$ipaddr" ] && proto_add_ipv4_address
"$ipaddr" "$netmask"
199 proto_send_update
"$cfg"
202 proto_bonding_teardown
() {
204 local link
="bond-$cfg"
206 # Check for loaded kernel bonding driver (/sys/class/net/bonding_masters exists)
207 [ -f "$BONDING_MASTERS" ] ||
{
208 echo "$cfg" "teardown: bonding_masters does not exist in sysfs (kernel module not loaded?)"
209 proto_notify_error
"$cfg" BONDING_MASTER_DOES_NOT_EXIST
210 proto_block_restart
"$cfg"
214 echo "-$link" > /sys
/class
/net
/bonding_masters
215 logger
"bonding_teardown($1): $2"