[ -n "$DEVICE" ] || exit 3
fi
-mwan3_lock
-mwan3_set_connected_iptables
-mwan3_unlock
-
config_load mwan3
+config_get_bool enabled globals 'enabled' '0'
+[ ${enabled} -gt 0 ] || exit 0
+
config_get enabled $INTERFACE enabled 0
config_get initial_state $INTERFACE initial_state "online"
[ "$enabled" == "1" ] || exit 0
+mwan3_lock
+mwan3_init
+mwan3_set_connected_iptables
+mwan3_unlock
+
if [ "$ACTION" == "ifup" ]; then
config_get family $INTERFACE family ipv4
if [ "$family" = "ipv4" ]; then
MWAN3_STATUS_DIR="/var/run/mwan3"
MWAN3TRACK_STATUS_DIR="/var/run/mwan3track"
DEFAULT_LOWEST_METRIC=256
+MMX_MASK=""
+MMX_DEFAULT=""
+MMX_BLACKHOLE=""
+MM_BLACKHOLE=""
+
+MMX_UNREACHABLE=""
+MM_UNREACHABLE=""
-[ -d $MWAN3_STATUS_DIR ] || mkdir -p $MWAN3_STATUS_DIR/iface_state
-# mwan3's MARKing mask (at least 3 bits should be set)
-if [ -e "${MWAN3_STATUS_DIR}/mmx_mask" ]; then
- MMX_MASK=$(cat "${MWAN3_STATUS_DIR}/mmx_mask")
-else
- config_load mwan3
- config_get MMX_MASK globals mmx_mask '0xff00'
- echo "$MMX_MASK" > "${MWAN3_STATUS_DIR}/mmx_mask"
- $LOG notice "Using firewall mask ${MMX_MASK}"
-fi
# counts how many bits are set to 1
# n&(n-1) clears the lowest bit set to 1
printf "0x%x" $result
}
-# mark mask constants
-MM_BIT_CNT=$(mwan3_count_one_bits MMX_MASK)
-MM_DEFAULT=$(((1<<MM_BIT_CNT)-1))
-MM_BLACKHOLE=$(($MM_DEFAULT-2))
-MM_UNREACHABLE=$(($MM_DEFAULT-1))
+mwan3_init()
+{
+ local bitcnt
+ local mmdefault mmblackhole mmunreachable
+
+ [ -d $MWAN3_STATUS_DIR ] || mkdir -p $MWAN3_STATUS_DIR/iface_state
-# MMX_DEFAULT should equal MMX_MASK
-MMX_DEFAULT=$(mwan3_id2mask MM_DEFAULT MMX_MASK)
-MMX_BLACKHOLE=$(mwan3_id2mask MM_BLACKHOLE MMX_MASK)
-MMX_UNREACHABLE=$(mwan3_id2mask MM_UNREACHABLE MMX_MASK)
+ # mwan3's MARKing mask (at least 3 bits should be set)
+ if [ -e "${MWAN3_STATUS_DIR}/mmx_mask" ]; then
+ MMX_MASK=$(cat "${MWAN3_STATUS_DIR}/mmx_mask")
+ else
+ config_load mwan3
+ config_get MMX_MASK globals mmx_mask '0xff00'
+ echo "$MMX_MASK" > "${MWAN3_STATUS_DIR}/mmx_mask"
+ $LOG notice "Using firewall mask ${MMX_MASK}"
+ fi
+
+ # mark mask constants
+ bitcnt=$(mwan3_count_one_bits MMX_MASK)
+ mmdefault=$(((1<<bitcnt)-1))
+ MM_BLACKHOLE=$(($mmdefault-2))
+ MM_UNREACHABLE=$(($mmdefault-1))
+
+ # MMX_DEFAULT should equal MMX_MASK
+ MMX_DEFAULT=$(mwan3_id2mask mmdefault MMX_MASK)
+ MMX_BLACKHOLE=$(mwan3_id2mask MM_BLACKHOLE MMX_MASK)
+ MMX_UNREACHABLE=$(mwan3_id2mask MM_UNREACHABLE MMX_MASK)
+}
mwan3_lock() {
lock /var/run/mwan3.lock
mwan3_track()
{
- local track_ip track_ips
+ local track_ip track_ips pid
mwan3_list_track_ips()
{
}
config_list_foreach $1 track_ip mwan3_list_track_ips
- kill $(pgrep -f "mwan3track $1 $2") &> /dev/null
+ for pid in $(pgrep -f "mwan3track $1 $2"); do
+ kill -TERM "$pid" > /dev/null 2>&1
+ sleep 1
+ kill -KILL "$pid" > /dev/null 2>&1
+ done
if [ -n "$track_ips" ]; then
[ -x /usr/sbin/mwan3track ] && /usr/sbin/mwan3track "$1" "$2" "$3" "$4" $track_ips &
fi
echo "Too many arguments. Usage: mwan3 ifup <interface>" && exit 0
fi
+ config_get_bool enabled globals 'enabled' 0
+ [ ${enabled} -gt 0 ] || {
+ echo "Warning: mwan3 is global disabled. Usage: /etc/init.d/mwan3 start"
+ exit 0
+ }
+
config_get enabled "$1" enabled 0
device=$(uci -p /var/state get network.$1.ifname) &> /dev/null
start()
{
+ local enabled
+
config_load mwan3
+ config_get_bool enabled globals 'enabled' 0
+ [ ${enabled} -gt 0 ] || {
+ echo "Warning: mwan3 is global disabled. Usage: /etc/init.d/mwan3 start"
+ exit 0
+ }
+
config_foreach ifup interface
}
stop()
{
- local ipset route rule table IP IPT
+ local ipset route rule table IP IPT pid
- killall mwan3track &> /dev/null
+ for pid in $(pgrep -f "mwan3track"); do
+ kill -TERM "$pid" > /dev/null 2>&1
+ sleep 1
+ kill -KILL "$pid" > /dev/null 2>&1
+ done
config_load mwan3
config_foreach mwan3_track_clean interface
case "$1" in
ifup|ifdown|interfaces|policies|connected|rules|status|start|stop|restart)
+ mwan3_init
$*
;;
*)