diff --git a/buildscript b/buildscript index 0d89dab3..bddfaeb5 100755 --- a/buildscript +++ b/buildscript @@ -15,7 +15,7 @@ ROUTINGREV="2baff33918c089fd3744c7192f8ae7a29c47a8d7" GLUONREV="12e41d0ff07ec54bbd67a31ab50d12ca04f2238c" OPENWRT_PKGS="gpioctl-sysfs libugpio fastd haserl micrond mtr bmon" -ROUTING_PKGS="kmod-batman-adv batctl alfred babeld" +ROUTING_PKGS="kmod-batman-adv batctl alfred babeld bird2" GLUON_PKGS="simple-tc uradvd" FFF_VARIANTS="node layer3" diff --git a/src/packages/fff/fff-babel-bird2/Makefile b/src/packages/fff/fff-babel-bird2/Makefile new file mode 100644 index 00000000..67efc7a4 --- /dev/null +++ b/src/packages/fff/fff-babel-bird2/Makefile @@ -0,0 +1,29 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=fff-babel-bird2 +PKG_RELEASE:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/fff-babel-bird2 + SECTION:=base + CATEGORY:=Freifunk + TITLE:=Freifunk-Franken babel-bird2 + URL:=https://www.freifunk-franken.de + DEPENDS:=+bird2 +bird2c + PROVIDES:=fff-babel-implementation +endef + +define Package/fff-babel-bird2/description + This is the Freifunk Franken Firmware babel-bird2 package. +endef + +define Build/Compile + # nothing +endef + +define Package/fff-babel-bird2/install + $(CP) ./files/* $(1)/ +endef + +$(eval $(call BuildPackage,fff-babel-bird2)) diff --git a/src/packages/fff/fff-babel-bird2/files/etc/bird-babel-include.conf b/src/packages/fff/fff-babel-bird2/files/etc/bird-babel-include.conf new file mode 100644 index 00000000..8f7f5bb4 --- /dev/null +++ b/src/packages/fff/fff-babel-bird2/files/etc/bird-babel-include.conf @@ -0,0 +1 @@ +include "/etc/bird-babel/*.conf"; diff --git a/src/packages/fff/fff-babel-bird2/files/etc/bird-fff.conf b/src/packages/fff/fff-babel-bird2/files/etc/bird-fff.conf new file mode 100644 index 00000000..54ccda6f --- /dev/null +++ b/src/packages/fff/fff-babel-bird2/files/etc/bird-fff.conf @@ -0,0 +1,117 @@ +# router id is not required for babeld, but necessary for bird startup +router id 192.0.2.0; + +ipv4 table fff4; +ipv6 sadr table fff6; + +protocol device { + scan time 15; +} + +# device routes for ipv4 peering address +protocol direct { + ipv4 { + table fff4; + import filter { + if (net ~ 10.50.0.0/16 || net ~ 10.83.0.0/16) && net.len = 32 then { + accept; + } + reject; + }; + }; +} + +# device routes on loopback interface +protocol direct { + ipv4 { + table fff4; + import filter { + if net ~ 10.50.0.0/16 || net ~ 10.83.0.0/16 then { + accept; + } + reject; + }; + }; + + ipv6 sadr { + table fff6; + import filter { + if net ~ fdff::/64 from ::/0 then { + reject; + } + + # only import GUA + ULA addresses + if net !~ 2000::/3 from ::/0 || net !~ fc00::/7 from ::/0 then { + reject; + } + + accept; + }; + import keep filtered; + }; + + interface "lo"; +} + +# ipv6 kernel route interface +protocol kernel { + ipv6 sadr { + table fff6; + import filter { + # only import routes from kernel with proto static + if krt_source != 4 then { + reject; + } + + if net ~ fdff::/64 from ::/0 then { + reject; + } + + accept; + }; + export all; + preference 200; + }; + kernel table 10; + scan time 15; + learn yes; +} + +# ipv4 kernel route interface +protocol kernel { + ipv4 { + table fff4; + import filter { + # only import routes from kernel with proto static + if krt_source = 4 then { + accept; + } + reject; + }; + export all; + preference 200; + }; + kernel table 10; + scan time 15; + learn yes; +} + +protocol babel { + # required due to static configuration of global router id. + # also improves reconnect speed after restart. + randomize router id yes; + + ipv4 { + table fff4; + import all; + export all; + }; + + ipv6 sadr { + table fff6; + import all; + export all; + }; + + include "/etc/bird-babel-include.conf"; +}; diff --git a/src/packages/fff/fff-babel-bird2/files/etc/uci-defaults/30-disable-bird2 b/src/packages/fff/fff-babel-bird2/files/etc/uci-defaults/30-disable-bird2 new file mode 100644 index 00000000..aa46f2a5 --- /dev/null +++ b/src/packages/fff/fff-babel-bird2/files/etc/uci-defaults/30-disable-bird2 @@ -0,0 +1,3 @@ +/etc/init.d/bird disable + +exit 0 diff --git a/src/packages/fff/fff-babel-bird2/files/etc/uci-defaults/60-fff-bird-config b/src/packages/fff/fff-babel-bird2/files/etc/uci-defaults/60-fff-bird-config new file mode 100644 index 00000000..7689bea0 --- /dev/null +++ b/src/packages/fff/fff-babel-bird2/files/etc/uci-defaults/60-fff-bird-config @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-3.0-only + +mv /etc/bird-fff.conf /etc/bird.conf + +exit 0 diff --git a/src/packages/fff/fff-babel-bird2/files/lib/functions/fff/babeldaemon/bird2 b/src/packages/fff/fff-babel-bird2/files/lib/functions/fff/babeldaemon/bird2 new file mode 100644 index 00000000..f2b6e6fc --- /dev/null +++ b/src/packages/fff/fff-babel-bird2/files/lib/functions/fff/babeldaemon/bird2 @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: GPL-3.0-only + +babel_add_interface() { + [ "$#" -ne "4" ] && return 1 + + local name="$1" + local interface="$2" + local type="$3" + local rxcost="$4" + + mkdir -p /tmp/bird-babel + echo "interface \"$interface\" { type $type; rxcost $rxcost; };" > /tmp/bird-babel/$name.conf + + return 0 +} + +babel_delete_interface() { + [ "$#" -ne "1" ] && return 1 + + local name="$1" + + # Removing peers from /etc is not necessary, as all peers are generated into /tmp on every configuration run, + # which completely overwrites existing peers in /etc in the apply step. + rm -f /tmp/bird-babel/$name.conf + + return 0 +} + +babel_add_redistribute_filter() { + return 0 +} + +babel_remove_custom_redistribute_filters() { + return 0 +} + +babel_apply() { + # error output hidden because apply might be executed without a preceding configure step. + if [ -d /tmp/bird-babel ]; then + rm -rf /etc/bird-babel + mv /tmp/bird-babel /etc/bird-babel + fi + + return 0 +} + +babel_reload_implementation() { + # Change include file path, so bird uses the correct configuration, depending on the configuration state: + # - If test mode is active (and /tmp/bird-babel exists), switch to the temporary (/tmp) configuration to be tested. + # - If new settings are applied or the old settings are restored after an unsuccessful test (and /tmp/bird-babel does not exist), + # switch back to the permanent configuration (/etc). + if [ -d /tmp/bird-babel ]; then + echo 'include "/tmp/bird-babel/*.conf";' > /etc/bird-babel-include.conf + else + echo 'include "/etc/bird-babel/*.conf";' > /etc/bird-babel-include.conf + fi + + /etc/init.d/bird reload +} + +babel_revert() { + rm -r /tmp/bird-babel +} diff --git a/src/packages/fff/fff-babel-bird2/files/usr/lib/nodewatcher.d/80-bird2.sh b/src/packages/fff/fff-babel-bird2/files/usr/lib/nodewatcher.d/80-bird2.sh new file mode 100755 index 00000000..6fb79e8b --- /dev/null +++ b/src/packages/fff/fff-babel-bird2/files/usr/lib/nodewatcher.d/80-bird2.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-3.0-only + +set -e +set -o pipefail + +neighbours="$(birdc -r show babel neighbors | + tail -n +5 | + awk '{ printf "%s%s%s", $1, $2, $3 }' + )" + +echo -n "$neighbours" + +exit 0 diff --git a/src/packages/fff/fff-babel/Makefile b/src/packages/fff/fff-babel/Makefile new file mode 100644 index 00000000..abae858c --- /dev/null +++ b/src/packages/fff/fff-babel/Makefile @@ -0,0 +1,28 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=fff-babel +PKG_RELEASE:=1 + +include $(INCLUDE_DIR)/package.mk + +define Package/fff-babel + SECTION:=base + CATEGORY:=Freifunk + TITLE:=Freifunk-Franken babel + URL:=https://www.freifunk-franken.de + DEPENDS:=+fff-babel-implementation +endef + +define Package/fff-babel/description + This is the Freifunk Franken Firmware babel package. +endef + +define Build/Compile + # nothing +endef + +define Package/fff-babel/install + $(CP) ./files/* $(1)/ +endef + +$(eval $(call BuildPackage,fff-babel)) diff --git a/src/packages/fff/fff-babeld/files/etc/layer3.d/40-babel b/src/packages/fff/fff-babel/files/etc/layer3.d/40-babel similarity index 91% rename from src/packages/fff/fff-babeld/files/etc/layer3.d/40-babel rename to src/packages/fff/fff-babel/files/etc/layer3.d/40-babel index c238cc16..a5a3a478 100644 --- a/src/packages/fff/fff-babeld/files/etc/layer3.d/40-babel +++ b/src/packages/fff/fff-babel/files/etc/layer3.d/40-babel @@ -26,7 +26,7 @@ configure() { fi } - config_load babeld + config_load network config_foreach remove_babelpeer interface #add new peers @@ -75,14 +75,14 @@ configure() { babel_add_peer6addr "network.$prefixname.ip6addr" # add babel interface - babel_add_interface "$prefixname" "$iface" "$type" "$rxcost" || { echo "Could not add babeld interface for babelpeer $name"; exit 1; } + babel_add_interface "$prefixname" "$iface" "$type" "$rxcost" || { echo "Could not add babel interface for babelpeer $name"; exit 1; } } config_load gateway config_foreach add_babelpeer babelpeer - # configure babeld filters for custom ipv6 addresses + # configure babel filters for custom ipv6 addresses ## remove old filters babel_remove_custom_redistribute_filters @@ -94,10 +94,14 @@ configure() { apply() { uci commit network - uci commit babeld + babel_apply +} + +reload() { + babel_reload } revert() { uci revert network - uci revert babeld + babel_revert } diff --git a/src/packages/fff/fff-babeld/files/etc/uci-defaults/01-iproute b/src/packages/fff/fff-babel/files/etc/uci-defaults/01-iproute similarity index 100% rename from src/packages/fff/fff-babeld/files/etc/uci-defaults/01-iproute rename to src/packages/fff/fff-babel/files/etc/uci-defaults/01-iproute diff --git a/src/packages/fff/fff-babeld/files/etc/uci-defaults/02-network-rules b/src/packages/fff/fff-babel/files/etc/uci-defaults/02-network-rules similarity index 100% rename from src/packages/fff/fff-babeld/files/etc/uci-defaults/02-network-rules rename to src/packages/fff/fff-babel/files/etc/uci-defaults/02-network-rules diff --git a/src/packages/fff/fff-babeld/files/lib/functions/fff/babel b/src/packages/fff/fff-babel/files/lib/functions/fff/babel similarity index 56% rename from src/packages/fff/fff-babeld/files/lib/functions/fff/babel rename to src/packages/fff/fff-babel/files/lib/functions/fff/babel index 3b2c7dac..8233cb20 100644 --- a/src/packages/fff/fff-babeld/files/lib/functions/fff/babel +++ b/src/packages/fff/fff-babel/files/lib/functions/fff/babel @@ -1,3 +1,7 @@ + +implementation=babeld +. /lib/functions/fff/babeldaemon/$implementation + babel_add_iifrules() { [ "$#" -ne "1" ] && return 1 @@ -61,61 +65,25 @@ babel_add_peer6addr() { return 0 } -babel_add_interface() { - [ "$#" -ne "4" ] && return 1 +babel_reload() { + # switch implementation + case $implementation in + bird2) + /etc/init.d/babeld stop 2>/dev/null + /etc/init.d/babeld disable + /etc/init.d/bird enable + /etc/init.d/bird start + ;; + babeld) + /etc/init.d/bird stop 2>/dev/null + /etc/init.d/bird disable + /etc/init.d/babeld enable + /etc/init.d/babeld start + ;; + esac - 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 -} - -babel_add_redistribute_filter() { - [ "$#" -ne "1" ] && return 1 - - local prefix="$1" - - config=$(uci add babeld filter) - uci set babeld.$config.type='redistribute' - uci set babeld.$config.ip="$prefix" - uci set babeld.$config.addedbyautoconfig='true' - - return 0 -} - -babel_remove_custom_redistribute_filters() { - [ "$#" -ne "0" ] && return 1 - - remove_filters() { - local name="$1" - - # check if filter was added by configuregateway - if ! [ "$(uci -q get babeld.$name.addedbyautoconfig)" = 'true' ]; then - return - fi - - uci -q del babeld.$name - } - - config_load babeld - config_foreach remove_filters filter + # call implementation-specific reload commands + babel_reload_implementation return 0 } diff --git a/src/packages/fff/fff-babeld/Makefile b/src/packages/fff/fff-babeld/Makefile index fef12122..cc0aeb19 100644 --- a/src/packages/fff/fff-babeld/Makefile +++ b/src/packages/fff/fff-babeld/Makefile @@ -11,6 +11,7 @@ define Package/fff-babeld TITLE:=Freifunk-Franken babeld configuration example URL:=http://www.freifunk-franken.de DEPENDS:=+babeld + PROVIDES:=fff-babel-implementation endef define Package/fff-babeld/description diff --git a/src/packages/fff/fff-babeld/files/etc/uci-defaults/30-disable-babeld b/src/packages/fff/fff-babeld/files/etc/uci-defaults/30-disable-babeld new file mode 100644 index 00000000..e14dd4b9 --- /dev/null +++ b/src/packages/fff/fff-babeld/files/etc/uci-defaults/30-disable-babeld @@ -0,0 +1,3 @@ +/etc/init.d/babeld disable + +exit 0 diff --git a/src/packages/fff/fff-babeld/files/lib/functions/fff/babeldaemon/babeld b/src/packages/fff/fff-babeld/files/lib/functions/fff/babeldaemon/babeld new file mode 100644 index 00000000..ec033794 --- /dev/null +++ b/src/packages/fff/fff-babeld/files/lib/functions/fff/babeldaemon/babeld @@ -0,0 +1,72 @@ +# SPDX-License-Identifier: GPL-3.0-only + +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 +} + +babel_add_redistribute_filter() { + [ "$#" -ne "1" ] && return 1 + + local prefix="$1" + + config=$(uci add babeld filter) + uci set babeld.$config.type='redistribute' + uci set babeld.$config.ip="$prefix" + uci set babeld.$config.addedbyautoconfig='true' + + return 0 +} + +babel_remove_custom_redistribute_filters() { + [ "$#" -ne "0" ] && return 1 + + remove_filters() { + local name="$1" + + # check if filter was added by configuregateway + if ! [ "$(uci -q get babeld.$name.addedbyautoconfig)" = 'true' ]; then + return + fi + + uci -q del babeld.$name + } + + config_load babeld + config_foreach remove_filters filter + + return 0 +} + +babel_apply() { + uci commit babeld +} + +babel_reload_implementation() { + return 0 +} + +babel_revert() { + uci revert babeld +} diff --git a/src/packages/fff/fff-layer3/Makefile b/src/packages/fff/fff-layer3/Makefile index ce3d2002..782fbd16 100644 --- a/src/packages/fff/fff-layer3/Makefile +++ b/src/packages/fff/fff-layer3/Makefile @@ -11,7 +11,9 @@ define Package/fff-layer3 TITLE:=Freifunk-Franken gateway configuration URL:=https://www.freifunk-franken.de DEPENDS:=+fff-alfred-monitoring-proxy \ + +fff-babel \ +fff-babeld \ + +fff-babel-bird2 \ +fff-boardname \ +fff-dhcp \ +fff-layer3-config \ diff --git a/src/packages/fff/fff-nodewatcher/files/usr/lib/nodewatcher.d/10-systemdata.sh b/src/packages/fff/fff-nodewatcher/files/usr/lib/nodewatcher.d/10-systemdata.sh index 9b8a7d44..34ba16c8 100755 --- a/src/packages/fff/fff-nodewatcher/files/usr/lib/nodewatcher.d/10-systemdata.sh +++ b/src/packages/fff/fff-nodewatcher/files/usr/lib/nodewatcher.d/10-systemdata.sh @@ -76,6 +76,8 @@ fi if [ -x /usr/sbin/babeld ]; then SYSTEM_DATA="$SYSTEM_DATA$(/usr/sbin/babeld -V 2>&1)" +elif [ -x /usr/sbin/bird ]; then + SYSTEM_DATA="$SYSTEM_DATA$(/usr/sbin/bird --version 2>&1 | sed "s/BIRD version /bird-/")" fi # example for /etc/openwrt_release: diff --git a/src/packages/fff/fff-wireguard/Makefile b/src/packages/fff/fff-wireguard/Makefile index b37b3633..e3834565 100644 --- a/src/packages/fff/fff-wireguard/Makefile +++ b/src/packages/fff/fff-wireguard/Makefile @@ -14,7 +14,7 @@ define Package/fff-wireguard +kmod-wireguard \ +owipcalc \ +wireguard-tools \ - +fff-babeld \ + +fff-babel \ +fff-network endef diff --git a/src/packages/fff/fff-wireguard/files/etc/layer3.d/50-wireguard b/src/packages/fff/fff-wireguard/files/etc/layer3.d/50-wireguard index 3faa9e2d..b50a8967 100644 --- a/src/packages/fff/fff-wireguard/files/etc/layer3.d/50-wireguard +++ b/src/packages/fff/fff-wireguard/files/etc/layer3.d/50-wireguard @@ -30,7 +30,7 @@ configure() { fi } - config_load babeld + config_load network config_foreach remove_wgpeer interface @@ -127,7 +127,7 @@ configure() { babel_add_iifrules "$prefixname" || { echo "ERROR: Could not add iif-rules for wgpeer $name"; exit 1; } # add babel interface - babel_add_interface "$prefixname" "$prefixname" 'wired' "$rxcost" || { echo "ERROR: Could not add babeld interface for wgpeer $name"; exit 1; } + babel_add_interface "$prefixname" "$prefixname" 'wired' "$rxcost" || { echo "ERROR: Could not add babel interface for wgpeer $name"; exit 1; } } config_load gateway @@ -136,12 +136,16 @@ configure() { apply() { uci commit network - uci commit babeld uci commit gateway + babel_apply +} + +reload() { + babel_reload } revert() { uci revert network - uci revert babeld uci revert gateway + babel_revert }