Browse Source

mwan3: support various interface tracking methods

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>
lilik-openwrt-22.03
Marcin Jurkowski 7 years ago
parent
commit
de4fc2b5de
4 changed files with 46 additions and 6 deletions
  1. +2
    -2
      net/mwan3/Makefile
  2. +5
    -1
      net/mwan3/files/etc/hotplug.d/iface/15-mwan3
  3. +1
    -1
      net/mwan3/files/lib/mwan3/mwan3.sh
  4. +38
    -2
      net/mwan3/files/usr/sbin/mwan3track

+ 2
- 2
net/mwan3/Makefile View File

@ -8,8 +8,8 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=mwan3 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_MAINTAINER:=Florian Eckert <fe@dev.tdt.de>
PKG_LICENSE:=GPLv2 PKG_LICENSE:=GPLv2


+ 5
- 1
net/mwan3/files/etc/hotplug.d/iface/15-mwan3 View File

@ -23,15 +23,19 @@ if [ "$ACTION" == "ifup" ]; then
ubus call network.interface.${INTERFACE}_4 status &>/dev/null ubus call network.interface.${INTERFACE}_4 status &>/dev/null
if [ "$?" -eq "0" ]; then if [ "$?" -eq "0" ]; then
network_get_gateway gateway ${INTERFACE}_4 network_get_gateway gateway ${INTERFACE}_4
network_get_ipaddr src_ip ${INTERFACE}_4
else else
network_get_gateway gateway $INTERFACE network_get_gateway gateway $INTERFACE
network_get_ipaddr src_ip ${INTERFACE}
fi fi
elif [ "$family" = "ipv6" ]; then elif [ "$family" = "ipv6" ]; then
ubus call network.interface.${INTERFACE}_6 status &>/dev/null ubus call network.interface.${INTERFACE}_6 status &>/dev/null
if [ "$?" -eq "0" ]; then if [ "$?" -eq "0" ]; then
network_get_gateway6 gateway ${INTERFACE}_6 network_get_gateway6 gateway ${INTERFACE}_6
network_get_ipaddr6 src_ip ${INTERFACE}_6
else else
network_get_gateway6 gateway ${INTERFACE} network_get_gateway6 gateway ${INTERFACE}
network_get_ipaddr6 src_ip ${INTERFACE}
fi fi
fi fi
@ -48,7 +52,7 @@ case "$ACTION" in
mwan3_create_iface_rules $INTERFACE $DEVICE mwan3_create_iface_rules $INTERFACE $DEVICE
mwan3_create_iface_iptables $INTERFACE $DEVICE mwan3_create_iface_iptables $INTERFACE $DEVICE
mwan3_create_iface_route $INTERFACE $DEVICE mwan3_create_iface_route $INTERFACE $DEVICE
mwan3_track $INTERFACE $DEVICE
mwan3_track $INTERFACE $DEVICE ${src_ip}
mwan3_set_policies_iptables mwan3_set_policies_iptables
mwan3_set_user_rules mwan3_set_user_rules
mwan3_flush_conntrack $INTERFACE $DEVICE "ifup" mwan3_flush_conntrack $INTERFACE $DEVICE "ifup"


+ 1
- 1
net/mwan3/files/lib/mwan3/mwan3.sh View File

@ -400,7 +400,7 @@ mwan3_track()
kill $(pgrep -f "mwan3track $1") &> /dev/null kill $(pgrep -f "mwan3track $1") &> /dev/null
if [ -n "$track_ips" ]; then 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 fi
} }


+ 38
- 2
net/mwan3/files/usr/sbin/mwan3track View File

@ -24,6 +24,30 @@ if_down() {
IFDOWN_EVENT=1 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() { main() {
local reliability count timeout interval failure_interval local reliability count timeout interval failure_interval
local recovery_interval down up size local recovery_interval down up size
@ -37,6 +61,11 @@ main() {
trap if_down SIGUSR1 trap if_down SIGUSR1
config_load mwan3 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 reliability $1 reliability 1
config_get count $1 count 1 config_get count $1 count 1
config_get timeout $1 timeout 4 config_get timeout $1 timeout 4
@ -48,7 +77,7 @@ main() {
config_get recovery_interval $1 recovery_interval $interval config_get recovery_interval $1 recovery_interval $interval
local score=$(($down+$up)) 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 host_up_count=0
local lost=0 local lost=0
local sleep_time=0 local sleep_time=0
@ -60,7 +89,14 @@ main() {
sleep_time=$interval sleep_time=$interval
for track_ip in $track_ips; do 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 if [ $? -eq 0 ]; then
let host_up_count++ let host_up_count++
echo "up" > /var/run/mwan3track/$1/TRACK_${track_ip} echo "up" > /var/run/mwan3track/$1/TRACK_${track_ip}


Loading…
Cancel
Save