#!/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 "$@"