improve startup and runtime performance by 1) moving common startup procedures out of hotplug script when called from mwan3 start 2) reducing calls to iptables to check status of rules 3) consolidating iptables updates and updating with iptables-restore 4) do not wait for kill if nothing was killed 5) running interface hotplug scripts in parallel 6) eliminate operations in hotplug script that check status on every single interface unnecessarily 7) consolidate how mwan3track makes hotplug calls 8) do not restart mwan3track on connected events This is a significant refactor, but should not result in any breaking changes or require users to update their configurations. version bump to 2.9.0 Signed-off-by: Aaron Goodman <aaronjg@stanford.edu>
110 lines
2.8 KiB
Bash
Executable file
110 lines
2.8 KiB
Bash
Executable file
#!/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 "$@"
|