#!/bin/sh
|
|
|
|
. /lib/functions.sh
|
|
. /lib/functions/network.sh
|
|
. /lib/mwan3/mwan3.sh
|
|
. /lib/mwan3/common.sh
|
|
|
|
mwan3_rtmon_route_handle()
|
|
{
|
|
config_load mwan3
|
|
local section action route_line family tbl device metric tos dst line
|
|
local route_device tid
|
|
route_line=${1##"Deleted "}
|
|
route_family=$2
|
|
|
|
if [ "$route_family" = "ipv4" ]; then
|
|
IP="$IP4"
|
|
elif [ "$route_family" = "ipv6" ] && [ $NO_IPV6 -eq 0 ]; then
|
|
IP="$IP6"
|
|
else
|
|
return
|
|
fi
|
|
|
|
if [ "$route_line" == "$1" ]; then
|
|
action="add"
|
|
else
|
|
action="del"
|
|
fi
|
|
|
|
# never add default route lines, since this is handled elsewhere
|
|
[ -z "${route_line##default*}" ] && return
|
|
[ -z "${route_line##::/0*}" ] && return
|
|
route_line=${route_line%% linkdown*}
|
|
route_line=${route_line%% unreachable*}
|
|
mwan3_update_dev_to_table
|
|
mwan3_route_line_dev "tid" "$route_line" "$route_family"
|
|
handle_route() {
|
|
tbl=$($IP route list table $tid)
|
|
if [ $action = "add" ]; then
|
|
echo "$tbl" | grep -q "^default\|^::/0" || return
|
|
else
|
|
[ -z "$tbl" ] && return
|
|
fi
|
|
# check that action needs to be performed. May not need to take action if:
|
|
# Got a route update on ipv6 where route is already in the table
|
|
# Got a delete event, but table was already flushed
|
|
|
|
[ $action = "add" ] && [ -z "${tbl##*$route_line*}" ] && return
|
|
[ $action = "del" ] && [ -n "${tbl##*$route_line*}" ] && return
|
|
network_get_device device "$section"
|
|
LOG debug "adjusting route $device: $IP route "$action" table $tid $route_line"
|
|
$IP route "$action" table $tid $route_line ||
|
|
LOG warn "failed: $IP route $action table $tid $route_line"
|
|
}
|
|
handle_route_cb(){
|
|
let tid++
|
|
config_get family "$section" family ipv4
|
|
[ "$family" != "$route_family" ] && return
|
|
handle_route
|
|
}
|
|
|
|
if [ $action = "add" ]; then
|
|
## handle old routes from 'change' or 'replace'
|
|
metric=${route_line##*metric }
|
|
[ "$metric" = "$route_line" ] && unset metric || metric=${metric%% *}
|
|
|
|
tos=${route_line##*tos }
|
|
[ "$tos" = "$route_line" ] && unset tos || tos=${tos%% *}
|
|
|
|
dst=${route_line%% *}
|
|
grep_line="$dst ${tos:+tos $tos}.*table [0-9].*${metric:+metric $metric}"
|
|
$IP route list table all | grep "$grep_line" | while read line; do
|
|
tbl=${line##*table }
|
|
tbl=${tbl%% *}
|
|
[ $tbl -gt $MWAN3_INTERFACE_MAX ] && continue
|
|
LOG debug "removing route on ip route change/replace: $line"
|
|
$IP route del $line
|
|
done
|
|
fi
|
|
|
|
if [ -n "$tid" ]; then
|
|
handle_route
|
|
else
|
|
config_foreach handle_route_cb interface
|
|
fi
|
|
}
|
|
|
|
main()
|
|
{
|
|
local IP family
|
|
|
|
config_load mwan3
|
|
family=$1
|
|
[ -z $family ] && family=ipv4
|
|
if [ "$family" = ipv6 ]; then
|
|
IP="$IP6"
|
|
else
|
|
IP="$IP4"
|
|
fi
|
|
mwan3_init
|
|
|
|
$IP monitor route | while read line; do
|
|
[ -z "${line##*table*}" ] && continue
|
|
LOG debug "handling route update $family $line"
|
|
mwan3_lock "service" "mwan3rtmon"
|
|
mwan3_rtmon_route_handle "$line" "$family"
|
|
mwan3_unlock "service" "mwan3rtmon"
|
|
done
|
|
}
|
|
main "$@"
|