From patchwork Thu Jun 27 17:48:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [v2,1/2] fff-babeld: Move common babeld procedures into functions From: Fabian Blaese X-Patchwork-Id: 1154 Message-Id: <20190627174826.22653-1-fabian@blaese.de> To: franken-dev@freifunk.net Date: Thu, 27 Jun 2019 19:48:25 +0200 Various things have to be done for every interface on which babeld shall run. Those procedures are moved into functions to reduce duplicate code. Signed-off-by: Fabian Bläse Reviewed-by: Robert Langhammer --- Changes in v2: - Remove exit from function calls which are allowed to fail - Add explicit return value to functions - Print error message when exiting due to a non-zero return value --- .../fff-babeld/files/etc/gateway.d/40-babel | 39 ++------ .../fff-babeld/files/lib/functions/fff/babel | 88 +++++++++++++++++++ 2 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 src/packages/fff/fff-babeld/files/lib/functions/fff/babel diff --git a/src/packages/fff/fff-babeld/files/etc/gateway.d/40-babel b/src/packages/fff/fff-babeld/files/etc/gateway.d/40-babel index cc1cf5d..28a0d50 100644 --- a/src/packages/fff/fff-babeld/files/etc/gateway.d/40-babel +++ b/src/packages/fff/fff-babeld/files/etc/gateway.d/40-babel @@ -1,4 +1,5 @@ . /lib/functions.sh +. /lib/functions/fff/babel #load board specific properties BOARD="$(uci get board.model.name)" @@ -14,10 +15,9 @@ configure() { # remove interface uci -q del network.$name # remove iif-rules - uci -q del network.${name}_rule - uci -q del network.${name}_rule6 + babel_delete_iifrules "$name" # remove babel interface - uci -q del babeld.$name + babel_delete_interface "$name" fi fi } @@ -67,37 +67,16 @@ configure() { uci set network.$name.ifname=$iface # add iif-rules - uci set network.${name}_rule=rule - uci set network.${name}_rule.in="$name" - uci set network.${name}_rule.lookup='10' - uci set network.${name}_rule.priority='31' - - uci set network.${name}_rule6=rule6 - uci set network.${name}_rule6.in="$name" - uci set network.${name}_rule6.lookup='10' - uci set network.${name}_rule6.priority='31' + babel_add_iifrules "$name" || { echo "Could not add iif-rules for babelpeer $name"; exit 1; } # peer_ip - if peer_ip=$(uci -q get gateway.@gateway[0].peer_ip); then - uci set network.$name.ipaddr="$peer_ip" - elif ipaddr=$(uci -q get gateway.@client[0].ipaddr); then - # use ipaddr (without subnet) if no peer_ip set - uci set network.$name.ipaddr=$(echo $ipaddr | cut -d / -f1) - else - echo "FATAL: Neither peer_ip nor ipaddr set! No peering ipv4 set!" - exit 1 - fi - - # peer_ip6 - if peer_ip6=$(uci -q get gateway.@gateway[0].peer_ip6); then - uci set network.$name.ip6addr="$peer_ip6" - fi + uci -q delete "network.$name.ipaddr" + uci -q delete "network.$name.ip6addr" + babel_add_peeraddr "network.$name.ipaddr" + babel_add_peer6addr "network.$name.ip6addr" # add babel interface - uci set babeld.$name=interface - uci set babeld.$name.ifname=$iface - uci set babeld.$name.type=$type - uci set babeld.$name.rxcost=$rxcost + babel_add_interface "$name" "$iface" "$type" "$rxcost" || { echo "Could not add babeld interface for babelpeer $name"; exit 1; } } config_load gateway diff --git a/src/packages/fff/fff-babeld/files/lib/functions/fff/babel b/src/packages/fff/fff-babeld/files/lib/functions/fff/babel new file mode 100644 index 0000000..0d19cef --- /dev/null +++ b/src/packages/fff/fff-babeld/files/lib/functions/fff/babel @@ -0,0 +1,88 @@ +babel_add_iifrules() { + [ "$#" -ne "1" ] && return 1 + + local name="$1" + local table='10' + local prio='31' + + uci set network.${name}_rule=rule + uci set network.${name}_rule.in="$name" + uci set network.${name}_rule.lookup="$table" + uci set network.${name}_rule.priority="$prio" + + uci set network.${name}_rule6=rule6 + uci set network.${name}_rule6.in="$name" + uci set network.${name}_rule6.lookup="$table" + uci set network.${name}_rule6.priority="$prio" + + return 0 +} + +babel_delete_iifrules() { + [ "$#" -ne "1" ] && return 1 + + local name="$1" + + uci -q del network.${name}_rule + uci -q del network.${name}_rule6 + + return 0 +} + +babel_add_peeraddr() { + [ "$#" -ne "1" ] && return 1 + + local option="$1" + + if peer_ip=$(uci -q get gateway.@gateway[0].peer_ip); then + uci add_list "$option"="$peer_ip" + elif ipaddr=$(uci -q get gateway.@client[0].ipaddr); then + # use ipaddr (without subnet) if no peer_ip set + uci add_list "$option"=$(echo $ipaddr | cut -d / -f1) + else + echo "FATAL: Neither peer_ip nor ipaddr set! No peering ipv4 set!" + return 1 + fi + + return 0 +} + +babel_add_peer6addr() { + [ "$#" -ne "1" ] && return 1 + + local option="$1" + + if peer_ip6=$(uci -q get gateway.@gateway[0].peer_ip6); then + uci add_list "$option"="$peer_ip6" + else + return 1 + fi + + return 0 +} + +babel_add_interface() { + [ "$#" -ne "4" ] && return 1 + + local name="$1" + local interface="$2" + local type="$3" + local rxcost="$4" + + uci set babeld.$name=interface + uci set babeld.$name.ifname="$interface" + uci set babeld.$name.type="$type" + uci set babeld.$name.rxcost="$rxcost" + + return 0 +} + +babel_delete_interface() { + [ "$#" -ne "1" ] && return 1 + + local name="$1" + + uci -q del babeld.$name + + return 0 +}