From 0a8b358e9a9500b82a6b996c1ecbd95e074c2d17 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Wed, 24 Jul 2019 19:58:58 +0200 Subject: [PATCH] Add a new redundant mode that should give a better failover --- .../luasrc/view/openmptcprouter/settings.htm | 1 + .../share/omr/post-tracking.d/post-tracking | 55 ++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm index df536732d..a5957210e 100644 --- a/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm +++ b/luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm @@ -174,6 +174,7 @@ + diff --git a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking index 210f74016..c1beea304 100755 --- a/mptcp/files/usr/share/omr/post-tracking.d/post-tracking +++ b/mptcp/files/usr/share/omr/post-tracking.d/post-tracking @@ -72,6 +72,52 @@ set_server_default_route() { fi } +set_routes_intf() { + local INTERFACE=$1 + multipath_config=$(uci -q get network.$INTERFACE.multipath || echo "off") + interface_if=$(ifstatus "$INTERFACE" 2>/dev/null | jsonfilter -q -e '@["l3_device"]') + [ -z "$interface_if" ] && interface_if=$(ifstatus "${INTERFACE}_4" 2>/dev/null | jsonfilter -q -e '@["l3_device"]') + [ -z "$interface_if" ] && interface_if=$(uci -q get network.$INTERFACE.ifname) + multipath_current_config=$(multipath $interface_if | grep 'deactivated') + if [ "$multipath_config" != "off" ] && [ "$multipath_current_config" = "" ] && [ "$interface_if" != "" ]; then + interface_gw="$(uci -q get network.$INTERFACE.gateway)" + if [ -z "$interface_gw" ]; then + interface_gw=$(ubus call network.interface.$INTERFACE status 2>/dev/null | jsonfilter -q -l 1 -e '@.inactive.route[@.target="0.0.0.0"].nexthop' | tr -d "\n") + fi + if [ -z "$interface_gw" ]; then + interface_gw=$(ubus call network.interface.$INTERFACE status 2>/dev/null | jsonfilter -q -l 1 -e '@.route[@.target="0.0.0.0"].nexthop' | tr -d "\n") + fi + if [ -z "$interface_gw" ]; then + interface_gw=$(ubus call network.interface.${INTERFACE}_4 status 2>/dev/null | jsonfilter -q -l 1 -e '@.inactive.route[@.target="0.0.0.0"].nexthop' | tr -d "\n") + fi + if [ "$interface_gw" != "" ]; then + routesintf="$routesintf nexthop via $interface_gw dev $interface_if weight 1" + fi + fi +} + +set_server_all_routes() { + local server=$1 + local serverip + config_get serverip $server ip + interface_if=$(uci -q get network.$OMR_TRACKER_INTERFACE.ifname) + [ -z "$interface_if" ] && interface_if=$(ifstatus "$OMR_TRACKER_INTERFACE" 2>/dev/null | jsonfilter -q -e '@["l3_device"]') + [ -z "$interface_if" ] && interface_if=$(ifstatus "${OMR_TRACKER_INTERFACE}_4" 2>/dev/null | jsonfilter -q -e '@["l3_device"]') + multipath_current_config=$(multipath $interface_if | grep "deactivated") + multipath_config_route=$(uci -q get network.$OMR_TRACKER_INTERFACE.multipath || echo "off") + if [ "$serverip" != "" ] && [ "$OMR_TRACKER_DEVICE_GATEWAY" != "" ] && [ "$(ip route show $serverip | grep nexthop | grep $OMR_TRACKER_DEVICE_GATEWAY | grep $OMR_TRACKER_INTERFACE)" = "" ] && [ "$multipath_config_route" != "off" ]; then + routesintf="" + config_load network + config_foreach set_routes_intf interface + [ -n "$routesintf" ] && { + _log "Set server $server ($serverip) default route $routesintf" + ip route replace $serverip scope global $routesintf + } + fi +} + + + set_server_route() { local server=$1 local serverip @@ -182,6 +228,9 @@ if [ "$OMR_TRACKER_STATUS" = "ERROR" ]; then fi config_load openmptcprouter config_foreach del_server_route server + if [ "$(uci -q get openmptcprouter.settings.master)" = "redundant" ]; then + config_foreach set_server_all_routes server + fi } if [ "$default_gw" = "$OMR_TRACKER_DEVICE_GATEWAY" ] || [ "$default_gw" = "" ]; then @@ -308,7 +357,11 @@ if [ "$multipath_config" = "master" ]; then ip route replace default scope global nexthop via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE else config_load openmptcprouter - config_foreach set_server_default_route server + if [ "$(uci -q get openmptcprouter.settings.master)" = "redundant" ]; then + config_foreach set_server_all_routes server + else + config_foreach set_server_default_route server + fi fi ip route replace default via $OMR_TRACKER_DEVICE_GATEWAY dev $OMR_TRACKER_DEVICE table 991337 if [ "$(uci -q get openmptcprouter.settings.uci_route)" = "1" ]; then