--- /dev/null
+#!/bin/sh
+
+. /lib/functions.sh
+. /lib/functions/network.sh
+. /lib/mwan3/mwan3.sh
+
+LOG="logger -t mwan3[$$] -p"
+
+[ "$ACTION" = "connected" -o "$ACTION" = "disconnected" ] || exit 1
+[ -n "$INTERFACE" ] || exit 2
+
+if [ "$ACTION" = "connected" ]; then
+ [ -n "$DEVICE" ] || exit 3
+fi
+
+config_load mwan3
+config_get_bool enabled globals 'enabled' '0'
+config_get local_source globals 'local_source' 'none'
+[ ${enabled} = "1" ] || exit 0
+[ ${local_source} = "none" ] || exit 0
+
+config_get enabled $INTERFACE enabled 0
+config_get online_metric $INTERFACE online_metric 0
+[ "$enabled" == "1" ] || exit 0
+
+if [ "$online_metric" = 0 ]; then
+ $LOG notice "No online metric for interface "$INTERFACE" found"
+ exit 0
+fi
+
+mwan3_add_failover_metric() {
+ local iface="$1"
+ local device="$2"
+ local metric="$3"
+
+ local route_args
+
+ config_get family $iface family ipv4
+
+ if [ "$family" == "ipv4" ]; then
+ if ubus call network.interface.${iface}_4 status 1>/dev/null 2>&1; then
+ network_get_gateway route_args ${iface}_4
+ else
+ network_get_gateway route_args $iface
+ fi
+
+ if [ -n "$route_args" -a "$route_args" != "0.0.0.0" ]; then
+ route_args="via $route_args"
+ else
+ route_args=""
+ fi
+
+ $IP4 route add default $route_args dev $device proto static metric $metric 1>/dev/null 2>&1
+ fi
+
+ if [ "$family" == "ipv6" ]; then
+ if ubus call network.interface.${iface}_6 status 1>/dev/null 2>&1; then
+ network_get_gateway6 route_args ${iface}_6
+ else
+ network_get_gateway6 route_args $iface
+ fi
+
+ if [ -n "$route_args" -a "$route_args" != "::" ]; then
+ route_args="via $route_args"
+ else
+ route_args=""
+ fi
+
+ $IP6 route add default $route_args dev $device proto static metric $metric 1>/dev/null 2>&1
+ fi
+}
+
+mwan3_del_failover_metric() {
+ local iface="$1"
+ local device="$2"
+ local metric="$3"
+
+ config_get family $iface family ipv4
+
+ if [ "$family" == "ipv4" ]; then
+ $IP4 route del default dev $device proto static metric $metric 1>/dev/null 2>&1
+ fi
+
+ if [ "$family" == "ipv6" ]; then
+ $IP6 route del default dev $device proto static metric $metric 1>/dev/null 2>&1
+ fi
+}
+
+case "$ACTION" in
+ connected)
+ mwan3_add_failover_metric "$INTERFACE" "$DEVICE" "$online_metric"
+ ;;
+ disconnected)
+ mwan3_del_failover_metric "$INTERFACE" "$DEVICE" "$online_metric"
+ ;;
+esac
+
+exit 0
fi
}
}
+
+mwan3_online_metric_clean() {
+ local iface="$1"
+
+ local online_metric ifname
+
+ config_get family $iface family ipv4
+ config_get online_metric $iface online_metric ""
+ ifname=$(uci_get_state network $iface ifname)
+
+ if [ "$family" == "ipv4" ] \
+ && [ "$online_metric" != "" ] \
+ && [ "$ifname" != "" ]; then
+ $IP4 route del default dev $ifname proto static metric $online_metric 1>/dev/null 2>&1
+ fi
+
+ if [ "$family" == "ipv6" ] \
+ && [ "$online_metric" != "" ] \
+ && [ "$ifname" != "" ]; then
+ $IP6 route del default dev $ifname proto static metric $online_metric 1>/dev/null 2>&1
+ fi
+}