bonding: accept list of slaves in uci list notation 15379/head
authorJo-Philipp Wich <jo@mein.io>
Fri, 9 Apr 2021 16:52:15 +0000 (18:52 +0200)
committerJo-Philipp Wich <jo@mein.io>
Fri, 9 Apr 2021 16:56:50 +0000 (18:56 +0200)
Rework the bonding.sh protocol handler to accept slave interface names
encoded in uci list notation. Also replace ifconfig up/down with ip
link calls while we're at it.

Fixes: #11455
Fixes: https://github.com/openwrt/luci/issues/4473
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
net/bonding/Makefile
net/bonding/files/lib/netifd/proto/bonding.sh

index 5c74d6b5ced06c9f444efcd10147025e68a92c78..d3c1855f0245a239bdfc3bcb5508e635ec59a996 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=proto-bonding
-PKG_VERSION:=2020-03-30
+PKG_VERSION:=2021-04-09
 PKG_RELEASE:=1
 
 PKG_LICENSE:=GPL-2.0
index 556d7c824efde362bb611fd357905a369d5894fd..ac65516371670f55fdc88c8ad90b4b3a2f7e5144 100755 (executable)
@@ -37,7 +37,7 @@ proto_bonding_init_config() {
 
        proto_config_add_string "bonding_policy"
        proto_config_add_string "link_monitoring"
-       proto_config_add_string "slaves"
+       proto_config_add_array "slaves"
        proto_config_add_string "all_slaves_active"
 
        proto_config_add_string "min_links"
@@ -66,6 +66,28 @@ proto_bonding_init_config() {
        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="bonding-$cfg"
@@ -157,24 +179,7 @@ proto_bonding_setup() {
        # Add slaves to bonding interface
        local slaves
        json_get_vars slaves
-
-       for slave in $slaves; do
-
-               if [ "$(cat /proc/net/dev |grep "$slave")" == "" ]; then
-                       echo "$cfg" "No slave device $slave found"
-                       proto_notify_error "$cfg" NO_DEVICE
-                       proto_block_restart "$cfg"
-                       return
-               fi
-
-               ifconfig "$slave" down
-
-               sleep 1
-
-               echo "+$slave" > /sys/class/net/"$link"/bonding/slaves
-
-               ifconfig "$slave" up
-       done
+       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