mwan3: support various interface tracking methods 4629/head
authorMarcin Jurkowski <marcin1j@gmail.com>
Tue, 25 Jul 2017 17:34:40 +0000 (19:34 +0200)
committerMarcin Jurkowski <marcin1j@gmail.com>
Wed, 2 Aug 2017 15:44:07 +0000 (17:44 +0200)
Adds support for interface tracking using either ping, arping or
httping. This allows to track interface status on networks with filtered
ICMP traffic or simply to monitor data link layer etc.

To facilitate binding to a specified interface its IP address is passed
as a new mwan3track parameter. It's currently required by httping
and possibly by other tools that may be added in the future.

Signed-off-by: Marcin Jurkowski <marcin1j@gmail.com>
net/mwan3/Makefile
net/mwan3/files/etc/hotplug.d/iface/15-mwan3
net/mwan3/files/lib/mwan3/mwan3.sh
net/mwan3/files/usr/sbin/mwan3track

index 8bd1e2f11de29cdcbb80c1b02d49e5f6708892a9..e481aa298b46db99e13f6b88db8f48cea86cda14 100644 (file)
@@ -8,8 +8,8 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=mwan3
-PKG_VERSION:=2.5.3
-PKG_RELEASE:=5
+PKG_VERSION:=2.6
+PKG_RELEASE:=1
 PKG_MAINTAINER:=Florian Eckert <fe@dev.tdt.de>
 PKG_LICENSE:=GPLv2
 
index ca8f24daf912d631913626cb53649223cbc61f82..d82fe01aa69ec757175444f6893ab098b67c4175 100644 (file)
@@ -23,15 +23,19 @@ if [ "$ACTION" == "ifup" ]; then
                ubus call network.interface.${INTERFACE}_4 status &>/dev/null
                if [ "$?" -eq "0" ]; then
                        network_get_gateway gateway ${INTERFACE}_4
+                       network_get_ipaddr src_ip ${INTERFACE}_4
                else
                        network_get_gateway gateway $INTERFACE
+                       network_get_ipaddr src_ip ${INTERFACE}
                fi
        elif [ "$family" = "ipv6" ]; then
                ubus call network.interface.${INTERFACE}_6 status &>/dev/null
                if [ "$?" -eq "0" ]; then
                        network_get_gateway6 gateway ${INTERFACE}_6
+                       network_get_ipaddr6 src_ip ${INTERFACE}_6
                else
                        network_get_gateway6 gateway ${INTERFACE}
+                       network_get_ipaddr6 src_ip ${INTERFACE}
                fi
        fi
 
@@ -48,7 +52,7 @@ case "$ACTION" in
                mwan3_create_iface_rules $INTERFACE $DEVICE
                mwan3_create_iface_iptables $INTERFACE $DEVICE
                mwan3_create_iface_route $INTERFACE $DEVICE
-               mwan3_track $INTERFACE $DEVICE
+               mwan3_track $INTERFACE $DEVICE ${src_ip}
                mwan3_set_policies_iptables
                mwan3_set_user_rules
                mwan3_flush_conntrack $INTERFACE $DEVICE "ifup"
index 5681f3ec5fff39b6404bc47ffa5d9d58e7341a71..841afec0cb687ef8884c2967102bfaaa5f276f62 100644 (file)
@@ -400,7 +400,7 @@ mwan3_track()
 
        kill $(pgrep -f "mwan3track $1") &> /dev/null
        if [ -n "$track_ips" ]; then
-               [ -x /usr/sbin/mwan3track ] && /usr/sbin/mwan3track $1 $2 $track_ips &
+               [ -x /usr/sbin/mwan3track ] && /usr/sbin/mwan3track "$1" "$2" "$3" $track_ips &
        fi
 }
 
index 8afe9012939b91cd13ba0b6efb9508b37e1fd0eb..d168578dfba968da1058e470be4e8d6e12bb3731 100755 (executable)
@@ -24,6 +24,30 @@ if_down() {
        IFDOWN_EVENT=1
 }
 
+validate_track_method() {
+       case "$1" in
+               ping)
+                       # Assume that ping is installed
+                       ;;
+               arping)
+                       which arping 1>/dev/null 2>&1 || {
+                               $LOG warn "Missing arping. Please install iputils-arping package."
+                               return 1
+                       }
+                       ;;
+               httping)
+                       which httping 1>/dev/null 2>&1 || {
+                               $LOG warn "Missing httping. Please install httping package."
+                               return 1
+                       }
+                       ;;
+               *)
+                       $LOG warn "Unsupported tracking method: $track_method"
+                       return 2
+                       ;;
+       esac
+}
+
 main() {
        local reliability count timeout interval failure_interval
        local recovery_interval down up size
@@ -37,6 +61,11 @@ main() {
        trap if_down SIGUSR1
 
        config_load mwan3
+       config_get track_method $1 track_method ping
+       validate_track_method $track_method || {
+               $LOG warn "Using ping to track interface $INTERFACE avaliability"
+               track_method=ping
+       }
        config_get reliability $1 reliability 1
        config_get count $1 count 1
        config_get timeout $1 timeout 4
@@ -48,7 +77,7 @@ main() {
        config_get recovery_interval $1 recovery_interval $interval
 
        local score=$(($down+$up))
-       local track_ips=$(echo $* | cut -d ' ' -f 3-99)
+       local track_ips=$(echo $* | cut -d ' ' -f 4-99)
        local host_up_count=0
        local lost=0
        local sleep_time=0
@@ -60,7 +89,14 @@ main() {
                sleep_time=$interval
 
                for track_ip in $track_ips; do
-                       ping -I $2 -c $count -W $timeout -s $size -q $track_ip &> /dev/null
+                       case "$track_method" in
+                               ping)
+                                       ping -I $2 -c $count -W $timeout -s $size -q $track_ip &> /dev/null ;;
+                               arping)
+                                       arping -I $2 -c $count -w $timeout -q $track_ip &> /dev/null ;;
+                               httping)
+                                       httping -y $3 -c $count -t $timeout -q $track_ip &> /dev/null ;;
+                       esac
                        if [ $? -eq 0 ]; then
                                let host_up_count++
                                echo "up" > /var/run/mwan3track/$1/TRACK_${track_ip}