commit
d0668b02fc
6 changed files with 152 additions and 57 deletions
|
@ -8,7 +8,7 @@
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=mwan3
|
PKG_NAME:=mwan3
|
||||||
PKG_VERSION:=2.6.18
|
PKG_VERSION:=2.7.0
|
||||||
PKG_RELEASE:=1
|
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
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
|
||||||
config globals 'globals'
|
config globals 'globals'
|
||||||
option mmx_mask '0x3F00'
|
option mmx_mask '0x3F00'
|
||||||
option local_source 'lan'
|
option local_source 'none'
|
||||||
|
option rtmon_interval '5'
|
||||||
|
|
||||||
config interface 'wan'
|
config interface 'wan'
|
||||||
option enabled '1'
|
option enabled '1'
|
||||||
|
|
17
net/mwan3/files/etc/hotplug.d/iface/16-mwan3
Normal file
17
net/mwan3/files/etc/hotplug.d/iface/16-mwan3
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. /lib/functions.sh
|
||||||
|
. /lib/functions/network.sh
|
||||||
|
. /lib/mwan3/mwan3.sh
|
||||||
|
|
||||||
|
config_load mwan3
|
||||||
|
config_get_bool enabled globals 'enabled' '0'
|
||||||
|
[ ${enabled} -gt 0 ] || exit 0
|
||||||
|
|
||||||
|
if [ "$ACTION" == "ifup" ]; then
|
||||||
|
mwan3_lock
|
||||||
|
mwan3_rtmon
|
||||||
|
mwan3_unlock
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
|
@ -20,6 +20,63 @@ MM_BLACKHOLE=""
|
||||||
MMX_UNREACHABLE=""
|
MMX_UNREACHABLE=""
|
||||||
MM_UNREACHABLE=""
|
MM_UNREACHABLE=""
|
||||||
|
|
||||||
|
mwan3_rtmon_ipv4()
|
||||||
|
{
|
||||||
|
local tid=1
|
||||||
|
local idx=0
|
||||||
|
local ret=1
|
||||||
|
main_tbsum=$($IP4 route list table main | grep -v ^default | md5sum | head -c32)
|
||||||
|
while uci get mwan3.@interface[$idx] >/dev/null 2>&1 ; do
|
||||||
|
idx=$((idx+1))
|
||||||
|
tid=$idx
|
||||||
|
[ "$(uci get mwan3.@interface[$((idx-1))].family)" = "ipv4" ] && {
|
||||||
|
if $IP4 route list table $tid | grep -q ^default; then
|
||||||
|
tbsum=$($IP4 route list table $tid | grep -v ^default | md5sum | head -c32)
|
||||||
|
if [ "$tbsum" != "$main_tbsum" ]; then
|
||||||
|
$IP4 route list table $tid | grep -v ^default | while read line; do
|
||||||
|
$IP4 route del table $tid $line
|
||||||
|
done
|
||||||
|
$IP4 route list table main | grep -v ^default | while read line; do
|
||||||
|
$IP4 route add table $tid $line
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
if [ "$(uci get mwan3.@interface[$((idx-1))].enabled)" = "1" ]; then
|
||||||
|
ret=0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return $ret
|
||||||
|
}
|
||||||
|
|
||||||
|
mwan3_rtmon_ipv6()
|
||||||
|
{
|
||||||
|
local tid=1
|
||||||
|
local idx=0
|
||||||
|
local ret=1
|
||||||
|
main_tbsum=$($IP6 route list table main | grep -v "^default\|^::/" | md5sum | head -c32)
|
||||||
|
while uci get mwan3.@interface[$idx] >/dev/null 2>&1 ; do
|
||||||
|
idx=$((idx+1))
|
||||||
|
tid=$idx
|
||||||
|
[ "$(uci get mwan3.@interface[$((idx-1))].family)" = "ipv6" ] && {
|
||||||
|
if $IP6 route list table $tid | grep -q ^::/0; then
|
||||||
|
tbsum=$($IP6 route list table $tid | grep -v "^default\|^::/" | md5sum | head -c32)
|
||||||
|
if [ "$tbsum" != "$main_tbsum" ]; then
|
||||||
|
$IP6 route list table $tid | grep -v "^default\|^::/" | while read line; do
|
||||||
|
$IP6 route del table $tid $line
|
||||||
|
done
|
||||||
|
$IP6 route list table main | grep -v "^default\|^::/" | while read line; do
|
||||||
|
$IP6 route add table $tid $line
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
if [ "$(uci get mwan3.@interface[$((idx-1))].enabled)" = "1" ]; then
|
||||||
|
ret=0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return $ret
|
||||||
|
}
|
||||||
|
|
||||||
# counts how many bits are set to 1
|
# counts how many bits are set to 1
|
||||||
# n&(n-1) clears the lowest bit set to 1
|
# n&(n-1) clears the lowest bit set to 1
|
||||||
|
@ -188,10 +245,6 @@ mwan3_set_general_iptables()
|
||||||
$IPT -A mwan3_connected -m set --match-set mwan3_connected dst -j MARK --set-xmark $MMX_DEFAULT/$MMX_MASK
|
$IPT -A mwan3_connected -m set --match-set mwan3_connected dst -j MARK --set-xmark $MMX_DEFAULT/$MMX_MASK
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! $IPT -S mwan3_ifaces_out &> /dev/null; then
|
|
||||||
$IPT -N mwan3_ifaces_out
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! $IPT -S mwan3_rules &> /dev/null; then
|
if ! $IPT -S mwan3_rules &> /dev/null; then
|
||||||
$IPT -N mwan3_rules
|
$IPT -N mwan3_rules
|
||||||
fi
|
fi
|
||||||
|
@ -209,7 +262,6 @@ mwan3_set_general_iptables()
|
||||||
$IPT -A mwan3_hook -j CONNMARK --restore-mark --nfmask $MMX_MASK --ctmask $MMX_MASK
|
$IPT -A mwan3_hook -j CONNMARK --restore-mark --nfmask $MMX_MASK --ctmask $MMX_MASK
|
||||||
$IPT -A mwan3_hook -m mark --mark 0x0/$MMX_MASK -j mwan3_ifaces_in
|
$IPT -A mwan3_hook -m mark --mark 0x0/$MMX_MASK -j mwan3_ifaces_in
|
||||||
$IPT -A mwan3_hook -m mark --mark 0x0/$MMX_MASK -j mwan3_connected
|
$IPT -A mwan3_hook -m mark --mark 0x0/$MMX_MASK -j mwan3_connected
|
||||||
$IPT -A mwan3_hook -m mark --mark 0x0/$MMX_MASK -j mwan3_ifaces_out
|
|
||||||
$IPT -A mwan3_hook -m mark --mark 0x0/$MMX_MASK -j mwan3_rules
|
$IPT -A mwan3_hook -m mark --mark 0x0/$MMX_MASK -j mwan3_rules
|
||||||
$IPT -A mwan3_hook -j CONNMARK --save-mark --nfmask $MMX_MASK --ctmask $MMX_MASK
|
$IPT -A mwan3_hook -j CONNMARK --save-mark --nfmask $MMX_MASK --ctmask $MMX_MASK
|
||||||
$IPT -A mwan3_hook -m mark ! --mark $MMX_DEFAULT/$MMX_MASK -j mwan3_connected
|
$IPT -A mwan3_hook -m mark ! --mark $MMX_DEFAULT/$MMX_MASK -j mwan3_connected
|
||||||
|
@ -241,30 +293,16 @@ mwan3_create_iface_iptables()
|
||||||
$IPT4 -N mwan3_ifaces_in
|
$IPT4 -N mwan3_ifaces_in
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! $IPT4 -S mwan3_ifaces_out &> /dev/null; then
|
|
||||||
$IPT4 -N mwan3_ifaces_out
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! $IPT4 -S mwan3_iface_in_$1 &> /dev/null; then
|
if ! $IPT4 -S mwan3_iface_in_$1 &> /dev/null; then
|
||||||
$IPT4 -N mwan3_iface_in_$1
|
$IPT4 -N mwan3_iface_in_$1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! $IPT4 -S mwan3_iface_out_$1 &> /dev/null; then
|
|
||||||
$IPT4 -N mwan3_iface_out_$1
|
|
||||||
fi
|
|
||||||
|
|
||||||
$IPT4 -F mwan3_iface_in_$1
|
$IPT4 -F mwan3_iface_in_$1
|
||||||
$IPT4 -A mwan3_iface_in_$1 -i $2 -m set --match-set mwan3_connected src -m mark --mark 0x0/$MMX_MASK -m comment --comment "default" -j MARK --set-xmark $MMX_DEFAULT/$MMX_MASK
|
$IPT4 -A mwan3_iface_in_$1 -i $2 -m set --match-set mwan3_connected src -m mark --mark 0x0/$MMX_MASK -m comment --comment "default" -j MARK --set-xmark $MMX_DEFAULT/$MMX_MASK
|
||||||
$IPT4 -A mwan3_iface_in_$1 -i $2 -m mark --mark 0x0/$MMX_MASK -m comment --comment "$1" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
$IPT4 -A mwan3_iface_in_$1 -i $2 -m mark --mark 0x0/$MMX_MASK -m comment --comment "$1" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
||||||
|
|
||||||
$IPT4 -D mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1 &> /dev/null
|
$IPT4 -D mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1 &> /dev/null
|
||||||
$IPT4 -A mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1
|
$IPT4 -A mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1
|
||||||
|
|
||||||
$IPT4 -F mwan3_iface_out_$1
|
|
||||||
$IPT4 -A mwan3_iface_out_$1 -o $2 -m mark --mark 0x0/$MMX_MASK -m comment --comment "$1" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
|
||||||
|
|
||||||
$IPT4 -D mwan3_ifaces_out -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_out_$1 &> /dev/null
|
|
||||||
$IPT4 -A mwan3_ifaces_out -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_out_$1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$family" == "ipv6" ]; then
|
if [ "$family" == "ipv6" ]; then
|
||||||
|
@ -274,30 +312,16 @@ mwan3_create_iface_iptables()
|
||||||
$IPT6 -N mwan3_ifaces_in
|
$IPT6 -N mwan3_ifaces_in
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! $IPT6 -S mwan3_ifaces_out &> /dev/null; then
|
|
||||||
$IPT6 -N mwan3_ifaces_out
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! $IPT6 -S mwan3_iface_in_$1 &> /dev/null; then
|
if ! $IPT6 -S mwan3_iface_in_$1 &> /dev/null; then
|
||||||
$IPT6 -N mwan3_iface_in_$1
|
$IPT6 -N mwan3_iface_in_$1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! $IPT6 -S mwan3_iface_out_$1 &> /dev/null; then
|
|
||||||
$IPT6 -N mwan3_iface_out_$1
|
|
||||||
fi
|
|
||||||
|
|
||||||
$IPT6 -F mwan3_iface_in_$1
|
$IPT6 -F mwan3_iface_in_$1
|
||||||
$IPT6 -A mwan3_iface_in_$1 -i $2 -m set --match-set mwan3_connected_v6 src -m mark --mark 0x0/$MMX_MASK -m comment --comment "default" -j MARK --set-xmark $MMX_DEFAULT/$MMX_MASK
|
$IPT6 -A mwan3_iface_in_$1 -i $2 -m set --match-set mwan3_connected_v6 src -m mark --mark 0x0/$MMX_MASK -m comment --comment "default" -j MARK --set-xmark $MMX_DEFAULT/$MMX_MASK
|
||||||
$IPT6 -A mwan3_iface_in_$1 -i $2 -m mark --mark 0x0/$MMX_MASK -m comment --comment "$1" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
$IPT6 -A mwan3_iface_in_$1 -i $2 -m mark --mark 0x0/$MMX_MASK -m comment --comment "$1" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
||||||
|
|
||||||
$IPT6 -D mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1 &> /dev/null
|
$IPT6 -D mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1 &> /dev/null
|
||||||
$IPT6 -A mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1
|
$IPT6 -A mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1
|
||||||
|
|
||||||
$IPT6 -F mwan3_iface_out_$1
|
|
||||||
$IPT6 -A mwan3_iface_out_$1 -o $2 -m mark --mark 0x0/$MMX_MASK -m comment --comment "$1" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
|
||||||
|
|
||||||
$IPT6 -D mwan3_ifaces_out -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_out_$1 &> /dev/null
|
|
||||||
$IPT6 -A mwan3_ifaces_out -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_out_$1
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,10 +334,6 @@ mwan3_delete_iface_iptables()
|
||||||
$IPT4 -D mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1 &> /dev/null
|
$IPT4 -D mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1 &> /dev/null
|
||||||
$IPT4 -F mwan3_iface_in_$1 &> /dev/null
|
$IPT4 -F mwan3_iface_in_$1 &> /dev/null
|
||||||
$IPT4 -X mwan3_iface_in_$1 &> /dev/null
|
$IPT4 -X mwan3_iface_in_$1 &> /dev/null
|
||||||
|
|
||||||
$IPT4 -D mwan3_ifaces_out -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_out_$1 &> /dev/null
|
|
||||||
$IPT4 -F mwan3_iface_out_$1 &> /dev/null
|
|
||||||
$IPT4 -X mwan3_iface_out_$1 &> /dev/null
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$family" == "ipv6" ]; then
|
if [ "$family" == "ipv6" ]; then
|
||||||
|
@ -321,10 +341,6 @@ mwan3_delete_iface_iptables()
|
||||||
$IPT6 -D mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1 &> /dev/null
|
$IPT6 -D mwan3_ifaces_in -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_in_$1 &> /dev/null
|
||||||
$IPT6 -F mwan3_iface_in_$1 &> /dev/null
|
$IPT6 -F mwan3_iface_in_$1 &> /dev/null
|
||||||
$IPT6 -X mwan3_iface_in_$1 &> /dev/null
|
$IPT6 -X mwan3_iface_in_$1 &> /dev/null
|
||||||
|
|
||||||
$IPT6 -D mwan3_ifaces_out -m mark --mark 0x0/$MMX_MASK -j mwan3_iface_out_$1 &> /dev/null
|
|
||||||
$IPT6 -F mwan3_iface_out_$1 &> /dev/null
|
|
||||||
$IPT6 -X mwan3_iface_out_$1 &> /dev/null
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,6 +368,7 @@ mwan3_create_iface_route()
|
||||||
|
|
||||||
$IP4 route flush table $id
|
$IP4 route flush table $id
|
||||||
$IP4 route add table $id default $route_args dev $2
|
$IP4 route add table $id default $route_args dev $2
|
||||||
|
mwan3_rtmon_ipv4
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$family" == "ipv6" ]; then
|
if [ "$family" == "ipv6" ]; then
|
||||||
|
@ -369,6 +386,7 @@ mwan3_create_iface_route()
|
||||||
|
|
||||||
$IP6 route flush table $id
|
$IP6 route flush table $id
|
||||||
$IP6 route add table $id default $route_args dev $2
|
$IP6 route add table $id default $route_args dev $2
|
||||||
|
mwan3_rtmon_ipv6
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -409,7 +427,7 @@ mwan3_create_iface_rules()
|
||||||
$IP4 rule del pref $(($id+2000))
|
$IP4 rule del pref $(($id+2000))
|
||||||
done
|
done
|
||||||
|
|
||||||
$IP4 rule add pref $(($id+1000)) iif $2 lookup main
|
$IP4 rule add pref $(($id+1000)) iif $2 lookup $id
|
||||||
$IP4 rule add pref $(($id+2000)) fwmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK lookup $id
|
$IP4 rule add pref $(($id+2000)) fwmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK lookup $id
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -423,7 +441,7 @@ mwan3_create_iface_rules()
|
||||||
$IP6 rule del pref $(($id+2000))
|
$IP6 rule del pref $(($id+2000))
|
||||||
done
|
done
|
||||||
|
|
||||||
$IP6 rule add pref $(($id+1000)) iif $2 lookup main
|
$IP6 rule add pref $(($id+1000)) iif $2 lookup $id
|
||||||
$IP6 rule add pref $(($id+2000)) fwmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK lookup $id
|
$IP6 rule add pref $(($id+2000)) fwmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK lookup $id
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -475,6 +493,16 @@ mwan3_delete_iface_ipset_entries()
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mwan3_rtmon()
|
||||||
|
{
|
||||||
|
pid="$(pgrep -f mwan3rtmon)"
|
||||||
|
if [ "${pid}" != "" ]; then
|
||||||
|
kill -USR1 "${pid}"
|
||||||
|
else
|
||||||
|
[ -x /usr/sbin/mwan3rtmon ] && /usr/sbin/mwan3rtmon &
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
mwan3_track()
|
mwan3_track()
|
||||||
{
|
{
|
||||||
local track_ip track_ips pid
|
local track_ip track_ips pid
|
||||||
|
@ -507,13 +535,14 @@ mwan3_track_signal()
|
||||||
|
|
||||||
mwan3_set_policy()
|
mwan3_set_policy()
|
||||||
{
|
{
|
||||||
local iface_count id iface family metric probability weight
|
local iface_count id iface family metric probability weight device
|
||||||
|
|
||||||
config_get iface $1 interface
|
config_get iface $1 interface
|
||||||
config_get metric $1 metric 1
|
config_get metric $1 metric 1
|
||||||
config_get weight $1 weight 1
|
config_get weight $1 weight 1
|
||||||
|
|
||||||
[ -n "$iface" ] || return 0
|
[ -n "$iface" ] || return 0
|
||||||
|
network_get_device device $iface
|
||||||
[ "$metric" -gt $DEFAULT_LOWEST_METRIC ] && $LOG warn "Member interface $iface has >$DEFAULT_LOWEST_METRIC metric. Not appending to policy" && return 0
|
[ "$metric" -gt $DEFAULT_LOWEST_METRIC ] && $LOG warn "Member interface $iface has >$DEFAULT_LOWEST_METRIC metric. Not appending to policy" && return 0
|
||||||
|
|
||||||
mwan3_get_iface_id id $iface
|
mwan3_get_iface_id id $iface
|
||||||
|
@ -552,6 +581,11 @@ mwan3_set_policy()
|
||||||
|
|
||||||
$IPT4 -I mwan3_policy_$policy -m mark --mark 0x0/$MMX_MASK $probability -m comment --comment "$iface $weight $total_weight_v4" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
$IPT4 -I mwan3_policy_$policy -m mark --mark 0x0/$MMX_MASK $probability -m comment --comment "$iface $weight $total_weight_v4" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
[ -n "$device" ] && {
|
||||||
|
$IPT4 -S mwan3_policy_$policy | grep -q '.*--comment ".* [0-9]* [0-9]*"' || \
|
||||||
|
$IPT4 -I mwan3_policy_$policy -o $device -m mark --mark 0x0/$MMX_MASK -m comment --comment "out $iface $device" -j MARK --set-xmark $MMX_DEFAULT/$MMX_MASK
|
||||||
|
}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -585,6 +619,11 @@ mwan3_set_policy()
|
||||||
|
|
||||||
$IPT6 -I mwan3_policy_$policy -m mark --mark 0x0/$MMX_MASK $probability -m comment --comment "$iface $weight $total_weight_v6" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
$IPT6 -I mwan3_policy_$policy -m mark --mark 0x0/$MMX_MASK $probability -m comment --comment "$iface $weight $total_weight_v6" -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
[ -n "$device" ] && {
|
||||||
|
$IPT6 -S mwan3_policy_$policy | grep -q '.*--comment ".* [0-9]* [0-9]*"' || \
|
||||||
|
$IPT6 -I mwan3_policy_$policy -o $device -m mark --mark 0x0/$MMX_MASK -m comment --comment "out $iface $device" -j MARK --set-xmark $MMX_DEFAULT/$MMX_MASK
|
||||||
|
}
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -649,7 +688,7 @@ mwan3_set_sticky_iptables()
|
||||||
[ -n "$id" ] || return 0
|
[ -n "$id" ] || return 0
|
||||||
|
|
||||||
for IPT in "$IPT4" "$IPT6"; do
|
for IPT in "$IPT4" "$IPT6"; do
|
||||||
if [ -n "$($IPT -S mwan3_iface_in_$1 2> /dev/null)" -a -n "$($IPT -S mwan3_iface_out_$1 2> /dev/null)" ]; then
|
if [ -n "$($IPT -S mwan3_iface_in_$1 2> /dev/null)" ]; then
|
||||||
$IPT -I mwan3_rule_$rule -m mark --mark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK -m set ! --match-set mwan3_sticky_$rule src,src -j MARK --set-xmark 0x0/$MMX_MASK
|
$IPT -I mwan3_rule_$rule -m mark --mark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK -m set ! --match-set mwan3_sticky_$rule src,src -j MARK --set-xmark 0x0/$MMX_MASK
|
||||||
$IPT -I mwan3_rule_$rule -m mark --mark 0/$MMX_MASK -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
$IPT -I mwan3_rule_$rule -m mark --mark 0/$MMX_MASK -j MARK --set-xmark $(mwan3_id2mask id MMX_MASK)/$MMX_MASK
|
||||||
fi
|
fi
|
||||||
|
@ -822,9 +861,9 @@ mwan3_report_iface_status()
|
||||||
|
|
||||||
if [ -z "$id" -o -z "$device" ]; then
|
if [ -z "$id" -o -z "$device" ]; then
|
||||||
result="unknown"
|
result="unknown"
|
||||||
elif [ -n "$($IP rule | awk '$1 == "'$(($id+1000)):'"')" -a -n "$($IP rule | awk '$1 == "'$(($id+2000)):'"')" -a -n "$($IPT -S mwan3_iface_in_$1 2> /dev/null)" -a -n "$($IPT -S mwan3_iface_out_$1 2> /dev/null)" -a -n "$($IP route list table $id default dev $device 2> /dev/null)" ]; then
|
elif [ -n "$($IP rule | awk '$1 == "'$(($id+1000)):'"')" -a -n "$($IP rule | awk '$1 == "'$(($id+2000)):'"')" -a -n "$($IPT -S mwan3_iface_in_$1 2> /dev/null)" -a -n "$($IP route list table $id default dev $device 2> /dev/null)" ]; then
|
||||||
result="$(mwan3_get_iface_hotplug_state $1)"
|
result="$(mwan3_get_iface_hotplug_state $1)"
|
||||||
elif [ -n "$($IP rule | awk '$1 == "'$(($id+1000)):'"')" -o -n "$($IP rule | awk '$1 == "'$(($id+2000)):'"')" -o -n "$($IPT -S mwan3_iface_in_$1 2> /dev/null)" -o -n "$($IPT -S mwan3_iface_out_$1 2> /dev/null)" -o -n "$($IP route list table $id default dev $device 2> /dev/null)" ]; then
|
elif [ -n "$($IP rule | awk '$1 == "'$(($id+1000)):'"')" -o -n "$($IP rule | awk '$1 == "'$(($id+2000)):'"')" -o -n "$($IPT -S mwan3_iface_in_$1 2> /dev/null)" -o -n "$($IP route list table $id default dev $device 2> /dev/null)" ]; then
|
||||||
result="error"
|
result="error"
|
||||||
elif [ "$enabled" == "1" ]; then
|
elif [ "$enabled" == "1" ]; then
|
||||||
result="offline"
|
result="offline"
|
||||||
|
@ -858,16 +897,16 @@ mwan3_report_policies_v4()
|
||||||
for policy in $($IPT4 -S | awk '{print $2}' | grep mwan3_policy_ | sort -u); do
|
for policy in $($IPT4 -S | awk '{print $2}' | grep mwan3_policy_ | sort -u); do
|
||||||
echo "$policy:" | sed 's/mwan3_policy_//'
|
echo "$policy:" | sed 's/mwan3_policy_//'
|
||||||
|
|
||||||
[ -n "$total_weight" ] || total_weight=$($IPT4 -S $policy | cut -s -d'"' -f2 | head -1 | awk '{print $3}')
|
[ -n "$total_weight" ] || total_weight=$($IPT4 -S $policy | grep -v '.*--comment "out .*" .*$' | cut -s -d'"' -f2 | head -1 | awk '{print $3}')
|
||||||
|
|
||||||
if [ ! -z "${total_weight##*[!0-9]*}" ]; then
|
if [ ! -z "${total_weight##*[!0-9]*}" ]; then
|
||||||
for iface in $($IPT4 -S $policy | cut -s -d'"' -f2 | awk '{print $1}'); do
|
for iface in $($IPT4 -S $policy | grep -v '.*--comment "out .*" .*$' | cut -s -d'"' -f2 | awk '{print $1}'); do
|
||||||
weight=$($IPT4 -S $policy | cut -s -d'"' -f2 | awk '$1 == "'$iface'"' | awk '{print $2}')
|
weight=$($IPT4 -S $policy | grep -v '.*--comment "out .*" .*$' | cut -s -d'"' -f2 | awk '$1 == "'$iface'"' | awk '{print $2}')
|
||||||
percent=$(($weight*100/$total_weight))
|
percent=$(($weight*100/$total_weight))
|
||||||
echo " $iface ($percent%)"
|
echo " $iface ($percent%)"
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
echo " $($IPT4 -S $policy | sed '/.*--comment \([^ ]*\) .*$/!d;s//\1/;q')"
|
echo " $($IPT4 -S $policy | grep -v '.*--comment "out .*" .*$' | sed '/.*--comment \([^ ]*\) .*$/!d;s//\1/;q')"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
unset total_weight
|
unset total_weight
|
||||||
|
@ -883,16 +922,16 @@ mwan3_report_policies_v6()
|
||||||
for policy in $($IPT6 -S | awk '{print $2}' | grep mwan3_policy_ | sort -u); do
|
for policy in $($IPT6 -S | awk '{print $2}' | grep mwan3_policy_ | sort -u); do
|
||||||
echo "$policy:" | sed 's/mwan3_policy_//'
|
echo "$policy:" | sed 's/mwan3_policy_//'
|
||||||
|
|
||||||
[ -n "$total_weight" ] || total_weight=$($IPT6 -S $policy | cut -s -d'"' -f2 | head -1 | awk '{print $3}')
|
[ -n "$total_weight" ] || total_weight=$($IPT6 -S $policy | grep -v '.*--comment "out .*" .*$' | cut -s -d'"' -f2 | head -1 | awk '{print $3}')
|
||||||
|
|
||||||
if [ ! -z "${total_weight##*[!0-9]*}" ]; then
|
if [ ! -z "${total_weight##*[!0-9]*}" ]; then
|
||||||
for iface in $($IPT6 -S $policy | cut -s -d'"' -f2 | awk '{print $1}'); do
|
for iface in $($IPT6 -S $policy | grep -v '.*--comment "out .*" .*$' | cut -s -d'"' -f2 | awk '{print $1}'); do
|
||||||
weight=$($IPT6 -S $policy | cut -s -d'"' -f2 | awk '$1 == "'$iface'"' | awk '{print $2}')
|
weight=$($IPT6 -S $policy | grep -v '.*--comment "out .*" .*$' | cut -s -d'"' -f2 | awk '$1 == "'$iface'"' | awk '{print $2}')
|
||||||
percent=$(($weight*100/$total_weight))
|
percent=$(($weight*100/$total_weight))
|
||||||
echo " $iface ($percent%)"
|
echo " $iface ($percent%)"
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
echo " $($IPT6 -S $policy | sed '/.*--comment \([^ ]*\) .*$/!d;s//\1/;q')"
|
echo " $($IPT6 -S $policy | grep -v '.*--comment "out .*" .*$' | sed '/.*--comment \([^ ]*\) .*$/!d;s//\1/;q')"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
unset total_weight
|
unset total_weight
|
||||||
|
|
|
@ -155,6 +155,12 @@ stop()
|
||||||
{
|
{
|
||||||
local ipset route rule table IP IPT pid src_ip
|
local ipset route rule table IP IPT pid src_ip
|
||||||
|
|
||||||
|
for pid in $(pgrep -f "mwan3rtmon"); do
|
||||||
|
kill -TERM "$pid" > /dev/null 2>&1
|
||||||
|
sleep 1
|
||||||
|
kill -KILL "$pid" > /dev/null 2>&1
|
||||||
|
done
|
||||||
|
|
||||||
for pid in $(pgrep -f "mwan3track"); do
|
for pid in $(pgrep -f "mwan3track"); do
|
||||||
kill -TERM "$pid" > /dev/null 2>&1
|
kill -TERM "$pid" > /dev/null 2>&1
|
||||||
sleep 1
|
sleep 1
|
||||||
|
|
32
net/mwan3/files/usr/sbin/mwan3rtmon
Executable file
32
net/mwan3/files/usr/sbin/mwan3rtmon
Executable file
|
@ -0,0 +1,32 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
. /lib/functions.sh
|
||||||
|
. /lib/mwan3/mwan3.sh
|
||||||
|
|
||||||
|
LOG="logger -t $(basename "$0")[$$] -p"
|
||||||
|
|
||||||
|
clean_up() {
|
||||||
|
$LOG notice "Stopping mwan3rtmon..."
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
rtchange() {
|
||||||
|
$LOG info "Detect rtchange event."
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local rtmon_interval
|
||||||
|
trap clean_up TERM
|
||||||
|
trap rtchange USR1
|
||||||
|
|
||||||
|
config_load mwan3
|
||||||
|
config_get rtmon_interval globals rtmon_interval '5'
|
||||||
|
|
||||||
|
sleep 3
|
||||||
|
while mwan3_rtmon_ipv4 || mwan3_rtmon_ipv6; do
|
||||||
|
[ "$rtmon_interval" = "0" ] && break
|
||||||
|
sleep $rtmon_interval
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
Loading…
Reference in a new issue