blob: f785a8c22ceae6e2abac846bff7e444bb21c13c3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
|
#!/bin/sh
#
# Copyright (C) 2018 TDT AG <development@tdt.de>
#
# This is free software, licensed under the GNU General Public License v2.
# See https://www.gnu.org/licenses/gpl-2.0.txt for more information.
#
. /lib/functions.sh
. ../netifd-proto.sh
init_proto "$@"
INCLUDE_ONLY=1
BONDING_MASTERS="/sys/class/net/bonding_masters"
set_driver_values() {
local varname
for varname in "$@"; do
local value
json_get_var value "$varname"
[ -n "$value" ] && echo "$value" > /sys/class/net/"$link"/bonding/"$varname"
done
}
proto_bonding_init_config() {
no_device=1
available=1
proto_config_add_string "ifname"
proto_config_add_string "ipaddr"
proto_config_add_string "netmask"
proto_config_add_string "bonding_policy"
proto_config_add_string "link_monitoring"
proto_config_add_array "slaves"
proto_config_add_string "all_slaves_active"
proto_config_add_string "min_links"
proto_config_add_string "ad_actor_sys_prio"
proto_config_add_string "ad_actor_system"
proto_config_add_string "ad_select"
proto_config_add_string "lacp_rate"
proto_config_add_string "packets_per_slave"
proto_config_add_string "xmit_hash_policy"
proto_config_add_string "primary"
proto_config_add_string "primary_reselect"
proto_config_add_string "lp_interval"
proto_config_add_string "tlb_dynamic_lb"
proto_config_add_string "resend_igmp"
proto_config_add_string "fail_over_mac"
proto_config_add_string "num_grat_arp__num_unsol_na"
proto_config_add_string "arp_interval"
proto_config_add_string "arp_ip_target"
proto_config_add_string "arp_all_targets"
proto_config_add_string "arp_validate"
proto_config_add_string "miimon"
proto_config_add_string "downdelay"
proto_config_add_string "updelay"
proto_config_add_string "use_carrier"
}
proto_bonding_add_slave() {
local slave=$1
local idx=$2
local cfg=$3
local link=$4
if [ ! -e "/sys/class/net/$slave" ]; then
echo "$cfg" "No slave device $slave found"
proto_notify_error "$cfg" NO_DEVICE
proto_block_restart "$cfg"
return
fi
ip link set dev "$slave" down
sleep 1
echo "+$slave" > /sys/class/net/"$link"/bonding/slaves
ip link set dev "$slave" up
}
proto_bonding_setup() {
local cfg="$1"
local link="bond-$cfg"
# Check for loaded kernel bonding driver (/sys/class/net/bonding_masters exists)
[ -f "$BONDING_MASTERS" ] || {
echo "$cfg" "setup: bonding_masters does not exist in sysfs (kernel module not loaded?)"
proto_notify_error "$cfg" BONDING_MASTER_DOES_NOT_EXIST
proto_block_restart "$cfg"
return
}
# Add bonding interface to system
echo "+$link" > "$BONDING_MASTERS"
# Set bonding policy (with corresponding parameters)
local bonding_policy
json_get_vars bonding_policy
case "$bonding_policy" in
802.3ad)
echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
set_driver_values min_links ad_actor_sys_prio ad_actor_system ad_select lacp_rate xmit_hash_policy
;;
balance-rr)
echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
set_driver_values packets_per_slave xmit_hash_policy
;;
balance-tlb)
echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
set_driver_values primary primary_reselect lp_interval tlb_dynamic_lb resend_igmp xmit_hash_policy
;;
balance-alb)
echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
set_driver_values primary primary_reselect lp_interval tlb_dynamic_lb resend_igmp xmit_hash_policy
;;
balance-xor)
echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
set_driver_values xmit_hash_policy
;;
broadcast)
echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
;;
active-backup)
echo "$bonding_policy" > /sys/class/net/"$link"/bonding/mode
set_driver_values primary primary_reselect fail_over_mac num_grat_arp__num_unsol_na xmit_hash_policy
;;
esac
# Set link monitoring (with corresponding parameters)
local link_monitoring
json_get_vars link_monitoring
case "$link_monitoring" in
arp)
local arp_interval arp_ip_target arp_all_targets arp_validate
json_get_vars arp_interval arp_ip_target arp_all_targets arp_validate
[ -n "$arp_interval" -a "$arp_interval" != 0 ] && echo "$arp_interval" > /sys/class/net/"$link"/bonding/arp_interval
IFS=' '
for target in $arp_ip_target; do
echo "+$target" > /sys/class/net/"$link"/bonding/arp_ip_target
done
[ -n "$arp_all_targets" ] && echo "$arp_all_targets" > /sys/class/net/"$link"/bonding/arp_all_targets
[ -n "$arp_validate" ] && echo "$arp_validate" > /sys/class/net/"$link"/bonding/arp_validate
;;
mii)
local miimon downdelay updelay use_carrier
json_get_vars miimon downdelay updelay use_carrier
[ -n "$miimon" -a "$miimon" != 0 ] && echo "$miimon" > /sys/class/net/"$link"/bonding/miimon
[ -n "$downdelay" ] && echo "$downdelay" > /sys/class/net/"$link"/bonding/downdelay
[ -n "$updelay" ] && echo "$updelay" > /sys/class/net/"$link"/bonding/updelay
[ -n "$use_carrier" ] && echo "$use_carrier" > /sys/class/net/"$link"/bonding/use_carrier
;;
esac
# Add slaves to bonding interface
local slaves
json_get_vars slaves
json_for_each_item proto_bonding_add_slave slaves "$cfg" "$link"
[ -n "$all_slaves_active" ] && echo "$all_slaves_active" > /sys/class/net/"$link"/bonding/all_slaves_active
local ipaddr netmask
json_get_vars ipaddr netmask
# ATTENTION
#All json vars have to be read before the line below, as the
# json object will be overwritten by proto_init_update
# ATTENTION
proto_init_update "$link" 1
# If ipaddr is configured, configure the ip to the interface
[ -n "$ipaddr" ] && proto_add_ipv4_address "$ipaddr" "$netmask"
proto_send_update "$cfg"
}
proto_bonding_teardown() {
local cfg="$1"
local link="bond-$cfg"
# Check for loaded kernel bonding driver (/sys/class/net/bonding_masters exists)
[ -f "$BONDING_MASTERS" ] || {
echo "$cfg" "teardown: bonding_masters does not exist in sysfs (kernel module not loaded?)"
proto_notify_error "$cfg" BONDING_MASTER_DOES_NOT_EXIST
proto_block_restart "$cfg"
return
}
echo "-$link" > /sys/class/net/bonding_masters
logger "bonding_teardown($1): $2"
}
add_protocol bonding
|