forked from freifunk-franken/firmware
115 lines
2.7 KiB
Plaintext
115 lines
2.7 KiB
Plaintext
. /lib/functions.sh
|
|
. /lib/functions/fff/network
|
|
. /lib/functions/fff/babel
|
|
|
|
#load board specific properties
|
|
BOARD="$(uci get board.model.name)"
|
|
. /etc/network.$BOARD
|
|
|
|
configure() {
|
|
# remove peers missing in gateway config
|
|
remove_gre6peer() {
|
|
local name="$1"
|
|
|
|
# check prefix
|
|
if [ "$name" = "${name#gre_}" ]; then
|
|
return
|
|
fi
|
|
|
|
if ! uci -q get gateway.${name#gre_} > /dev/null; then
|
|
# remove interfaces
|
|
uci -q del network.$name
|
|
uci -q del network.${name}_ip
|
|
|
|
# remove iif-rules
|
|
babel_delete_iifrules "$name"
|
|
# remove babel interface
|
|
babel_delete_interface "$name"
|
|
fi
|
|
}
|
|
|
|
config_load babeld
|
|
config_foreach remove_gre6peer interface
|
|
|
|
|
|
# add new peers
|
|
add_gre6peer() {
|
|
local name="$1"
|
|
local prefixname="gre_$name"
|
|
local ip6addr
|
|
local peer6addr
|
|
local mtu
|
|
|
|
# ensure name length
|
|
if [ ${#name} -gt 5 ]; then
|
|
echo "ERROR: name $name is too long!"
|
|
exit 1
|
|
fi
|
|
|
|
# get rxcost
|
|
if rxcost=$(uci -q get gateway.$name.rxcost); then
|
|
rxcost="$rxcost"
|
|
else
|
|
rxcost=16384
|
|
fi
|
|
|
|
# get addresses properties
|
|
if ! ip6addr=$(uci -q get gateway.$name.ip6addr); then
|
|
echo "ERROR: No ip6addr set for gre6peer $name!"
|
|
exit 1
|
|
fi
|
|
|
|
if ! peer6addr=$(uci -q get gateway.$name.peer6addr); then
|
|
echo "ERROR: No peer6addr set for gre6peer $name!"
|
|
exit 1
|
|
fi
|
|
|
|
mtu=$(uci -q get gateway.$name.mtu)
|
|
|
|
|
|
# add interface
|
|
uci set network.$prefixname=interface
|
|
uci set network.$prefixname.proto=grev6
|
|
uci set network.$prefixname.nohostroute='1'
|
|
uci set network.$prefixname.tunlink='wan'
|
|
uci set network.$prefixname.mtu="${mtu:-1448}"
|
|
uci set network.$prefixname.ip6addr="$ip6addr"
|
|
uci set network.$prefixname.peer6addr="$peer6addr"
|
|
|
|
# remove old addresses
|
|
uci -q del network.${prefixname}_ip.ip6addr
|
|
uci -q del network.${prefixname}_ip.ipaddr
|
|
|
|
# logical interface for adding ips
|
|
uci set network.${prefixname}_ip=interface
|
|
uci set network.${prefixname}_ip.proto=static
|
|
uci set network.${prefixname}_ip.ifname="@$prefixname"
|
|
|
|
# add link local address
|
|
uci add_list network.${prefixname}_ip.ip6addr="$(ipEUIAssemble "fe80::/64" "$ROUTERMAC")"
|
|
|
|
# peer_ip
|
|
babel_add_peeraddr "network.${prefixname}_ip.ipaddr"
|
|
babel_add_peer6addr "network.${prefixname}_ip.ip6addr"
|
|
|
|
# add iif-rules
|
|
babel_add_iifrules "$prefixname" || { echo "ERROR: Could not add iif-rules for gre6eer $name"; exit 1; }
|
|
|
|
# add babel interface
|
|
babel_add_interface "$prefixname" "$prefixname" 'tunnel' "$rxcost" || { echo "ERROR: Could not add babeld interface for gre6eer $name"; exit 1; }
|
|
}
|
|
|
|
config_load gateway
|
|
config_foreach add_gre6peer gre6peer
|
|
}
|
|
|
|
commit() {
|
|
uci commit network
|
|
uci commit babeld
|
|
}
|
|
|
|
revert() {
|
|
uci revert network
|
|
uci revert babeld
|
|
}
|