proto-bonding: Modify ipaddr as optional
[feed/packages.git] / net / bonding / files / lib / netifd / proto / bonding.sh
1 #!/bin/sh
2 #
3 # Copyright (C) 2018 TDT AG <development@tdt.de>
4 #
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.
7 #
8
9 . /lib/functions.sh
10 . ../netifd-proto.sh
11
12 init_proto "$@"
13
14 INCLUDE_ONLY=1
15
16 BONDING_MASTERS="/sys/class/net/bonding_masters"
17
18 set_driver_values() {
19 local varname
20
21 for varname in "$@"; do
22 local value
23 json_get_var value "$varname"
24
25 [ -n "$value" ] && echo "$value" > /sys/class/net/"$link"/bonding/"$varname"
26 done
27 }
28
29 proto_bonding_init_config() {
30 no_device=1
31 available=1
32
33 proto_config_add_string "ifname"
34
35 proto_config_add_string "ipaddr"
36 proto_config_add_string "netmask"
37
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"
42
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"
57
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"
62
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"
67 }
68
69 proto_bonding_add_slave() {
70 local slave=$1
71 local idx=$2
72 local cfg=$3
73 local link=$4
74
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"
79 return
80 fi
81
82 ip link set dev "$slave" down
83
84 sleep 1
85
86 echo "+$slave" > /sys/class/net/"$link"/bonding/slaves
87
88 ip link set dev "$slave" up
89 }
90
91 proto_bonding_setup() {
92 local cfg="$1"
93 local link="bond-$cfg"
94
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"
100 return
101 }
102
103 # Add bonding interface to system
104 echo "+$link" > "$BONDING_MASTERS"
105
106 # Set bonding policy (with corresponding parameters)
107 local bonding_policy
108 json_get_vars bonding_policy
109
110 case "$bonding_policy" in
111
112 802.3ad)
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
115 ;;
116
117 balance-rr)
118 echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
119 set_driver_values packets_per_slave xmit_hash_policy
120 ;;
121
122 balance-tlb)
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
125 ;;
126
127 balance-alb)
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
130 ;;
131
132 balance-xor)
133 echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
134 set_driver_values xmit_hash_policy
135 ;;
136
137 broadcast)
138 echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
139 ;;
140
141 active-backup)
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
144 ;;
145 esac
146
147 # Set link monitoring (with corresponding parameters)
148 local link_monitoring
149 json_get_vars link_monitoring
150
151 case "$link_monitoring" in
152
153 arp)
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
156
157 [ -n "$arp_interval" -a "$arp_interval" != 0 ] && echo "$arp_interval" > /sys/class/net/"$link"/bonding/arp_interval
158
159 IFS=' '
160 for target in $arp_ip_target; do
161 echo "+$target" > /sys/class/net/"$link"/bonding/arp_ip_target
162 done
163
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
166 ;;
167
168 mii)
169 local miimon downdelay updelay use_carrier
170 json_get_vars miimon downdelay updelay use_carrier
171
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
176 ;;
177 esac
178
179 # Add slaves to bonding interface
180 local slaves
181 json_get_vars slaves
182 json_for_each_item proto_bonding_add_slave slaves "$cfg" "$link"
183
184 [ -n "$all_slaves_active" ] && echo "$all_slaves_active" > /sys/class/net/"$link"/bonding/all_slaves_active
185
186 local ipaddr netmask
187 json_get_vars ipaddr netmask
188
189 # ATTENTION
190 #All json vars have to be read before the line below, as the
191 # json object will be overwritten by proto_init_update
192 # ATTENTION
193
194 proto_init_update "$link" 1
195
196 # If ipaddr is configured, configure the ip to the interface
197 [ -n "$ipaddr" ] && proto_add_ipv4_address "$ipaddr" "$netmask"
198
199 proto_send_update "$cfg"
200 }
201
202 proto_bonding_teardown() {
203 local cfg="$1"
204 local link="bond-$cfg"
205
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"
211 return
212 }
213
214 echo "-$link" > /sys/class/net/bonding_masters
215 logger "bonding_teardown($1): $2"
216 }
217
218 add_protocol bonding