watchdog/multiwan: fix a whole bunch of problems

- rc: misc.c: check_wanup(): add checking for content of WAN state file; fix fopen/fclose; sprintf -> snprintf
- others: watchdog: fix hanging at nslookup in some cases
- www: basic-network.asp: add possibility to disable watchdog for given WAN if needed
arm-sdk7
pedro 4 years ago
parent b3ad6e2b27
commit 8a1ce0f01f

@ -285,29 +285,6 @@ static char* get_cfeversion(char *buf)
return buf;
}
static int check_connect(char *prefix)
{
char tmp[64];
FILE *f;
int result = 0;
memset(tmp, 0, 64);
snprintf(tmp, sizeof(tmp), "/var/lib/misc/%s_state", prefix);
if (check_wanup(prefix)) {
if (nvram_get_int("mwan_cktime") == 0)
return 1;
if ((f = fopen(tmp, "r")) == NULL)
return 0;
fscanf(f, "%d", &result);
fclose(f);
}
return result;
}
#ifdef TCONFIG_IPV6
static void print_ipv6_addrs(void) /* show IPv6 addresses: wan, dns, lan, lan-ll, lan1, lan1-ll, lan2, lan2-ll, lan3, lan3-ll */
{
@ -866,7 +843,7 @@ void asp_wanstatus(int argc, char **argv)
if ((using_dhcpc(prefix)) && (f_exists(renew_file)))
p = "Renewing...";
else if (check_connect(prefix))
else if (check_wanup(prefix))
p = "Connected";
else if (f_exists(wanconn_file))
p = "Connecting...";

@ -626,6 +626,7 @@ static const nvset_t nvset_list[] = {
{ "wan_status_script", V_01 },
#endif
{ "wan_ckmtd", V_LENGTH(1, 2) }, // check method: 1 - ping, 2 - traceroute, 3 - curl
{ "wan_ck_pause", V_01 }, /* skip watchdog check for this wan */
#ifdef TCONFIG_MULTIWAN
{ "mwan_num", V_RANGE(1, 4) },
@ -672,6 +673,7 @@ static const nvset_t nvset_list[] = {
{ "wan2_status_script", V_01 },
#endif
{ "wan2_ckmtd", V_LENGTH(1, 2) }, // check method: 1 - ping, 2 - traceroute, 3 - curl
{ "wan2_ck_pause", V_01 }, /* skip watchdog check for this wan */
#ifdef TCONFIG_MULTIWAN
{ "wan3_proto", V_LENGTH(1, 16) }, // disabled, dhcp, static, pppoe, pptp, l2tp
@ -704,6 +706,7 @@ static const nvset_t nvset_list[] = {
{ "wan3_status_script", V_01 },
#endif
{ "wan3_ckmtd", V_LENGTH(1, 2) }, // check method: 1 - ping, 2 - traceroute, 3 - curl
{ "wan3_ck_pause", V_01 }, /* skip watchdog check for this wan */
{ "wan4_proto", V_LENGTH(1, 16) }, // disabled, dhcp, static, pppoe, pptp, l2tp
{ "wan4_weight", V_RANGE(0, 256) },
@ -735,6 +738,7 @@ static const nvset_t nvset_list[] = {
{ "wan4_status_script", V_01 },
#endif
{ "wan4_ckmtd", V_LENGTH(1, 2) }, // check method: 1 - ping, 2 - traceroute, 3 - curl
{ "wan4_ck_pause", V_01 }, /* skip watchdog check for this wan */
#endif /* TCONFIG_MULTIWAN */
// LAN

@ -3,25 +3,18 @@
#
# Copyright (C) 2015 shibby
#
# changes/fixes: 2018 - 2019 by pedro
# changes/fixes: 2018 - 2021 by pedro
#
PID=$$
PIDFILE="/var/run/watchdog.pid"
IPLISTFILE="/tmp/watchdog.iplist"
MWAN=$(nvram get mwan_num)
DST=$(nvram get mwan_ckdst)
HOSTLIST=$(echo $DST | sed 's/,/ /')
IPLIST=""
TMP_ROUTE_TABLE_ID=555
for HOST in $HOSTLIST; do
IP=$(nslookup $HOST 2>/dev/null | grep "Address" | grep -v "::" | cut -d":" -f2 | cut -d' ' -f2 | head -n1)
[ -z "$IP" ] && IP="8.8.8.8"
IPLIST="$IPLIST $IP"
done
MWANTABLE="wan"
i=1
while [ $i -le $MWAN ]; do
[ "$i" -gt 1 ] && MWANTABLE="$MWANTABLE wan$i"
@ -29,15 +22,35 @@ while [ $i -le $MWAN ]; do
done
LOGS="logger -t watchdog[$PID]"
[ "$(nvram get mwan_debug)" -gt 0 ] && {
DEBUG="logger -p DEBUG -t watchdog[$PID]"
} || {
DEBUG="echo"
[ "$(nvram get mwan_debug)" -gt 0 ] && DEBUG="logger -p DEBUG -t watchdog[$PID] *** " || DEBUG="echo"
timeout() {
local cmd_pid sleep_pid retval
(shift; "$@") &
cmd_pid=$!
(sleep "$1"; kill "$cmd_pid" 2>/dev/null) &
sleep_pid=$!
wait "$cmd_pid"
retval=$?
kill "$sleep_pid" 2>/dev/null
return "$retval"
}
findHost() {
local host ip
local dst=$(nvram get mwan_ckdst)
local hostlist=$(echo $dst | sed 's/,/ /')
for host in $hostlist; do
ip=$(nslookup $host 127.0.0.1 2>/dev/null | grep "Address" | grep -v "::" | grep -v "localhost" | cut -d":" -f2 | cut -d' ' -f2 | head -n1)
IPLIST="$IPLIST $ip"
done
echo "$IPLIST" > $IPLISTFILE # because we're in subshell
}
watchdogRun() {
for PREFIX in $MWANTABLE; do
ISUP=$(wanuptime "$PREFIX")
IFACE=$(nvram get "$PREFIX"_iface)
ISPPPD=$([ -f /tmp/ppp/pppd$PREFIX ] && echo 1 || echo 0)
WEIGHT=$(nvram get "$PREFIX"_weight)
@ -48,52 +61,50 @@ watchdogRun() {
PREFIX_MWAN=$PREFIX
STATE_FILE="/var/lib/misc/"$PREFIX"_state"
[ ! -z "$(nvram get "$PREFIX"_ck_pause)" ] && {
$LOGS "Watchdog paused for $PREFIX - Skipping ..."
[ "$(nvram get "$PREFIX"_ck_pause)" -eq 1 ] && {
$DEBUG "Watchdog paused for $PREFIX - skipping ..."
continue
}
[ "$PROTO" != "disabled" ] && {
ISGW=$(ip route | grep $IFACE | grep -v "link" | wc -l)
$DEBUG "prefix=$PREFIX, iface=$IFACE, uptime=$ISUP, ISGW=$ISGW, WEIGHT=$WEIGHT"
[ "$ISUP" -gt 0 ] && {
DEFAULT_ROUTE_FRAGMENT=$(ip route | grep default | cut -d' ' -f2-)
GATEWAY_FRAGMENT="via $(nvram get "$PREFIX"_gateway)"
[ "$ISPPPD" -eq 1 ] && GATEWAY_FRAGMENT=""
for IP in $IPLIST; do
[ ! -z "$DEFAULT_ROUTE_FRAGMENT" ] && {
ROUTE_EXEC="ip route add $IP $DEFAULT_ROUTE_FRAGMENT"
$DEBUG $ROUTE_EXEC
$ROUTE_EXEC
}
ROUTE_EXEC="ip route add $IP dev $IFACE $GATEWAY_FRAGMENT metric 50000"
[ "$(nvram get mwan_debug)" -gt 0 ] && {
ISUP=$(wanuptime "$PREFIX")
ISGW=$(ip route | grep $IFACE | grep -v "link" | wc -l)
$DEBUG "prefix=$PREFIX, iface=$IFACE, uptime=$ISUP, ISGW=$ISGW, WEIGHT=$WEIGHT"
}
DEFAULT_ROUTE_FRAGMENT=$(ip route | grep default | cut -d' ' -f2-)
GATEWAY_FRAGMENT="via $(nvram get "$PREFIX"_gateway)"
[ "$ISPPPD" -eq 1 ] && GATEWAY_FRAGMENT=""
for IP in $IPLIST; do
[ ! -z "$DEFAULT_ROUTE_FRAGMENT" ] && {
ROUTE_EXEC="ip route add $IP $DEFAULT_ROUTE_FRAGMENT"
$DEBUG $ROUTE_EXEC
$ROUTE_EXEC
done
if [ "$METHOD" -eq 1 ]; then
$DEBUG "run ping-test"
ckping
elif [ "$METHOD" -eq 2 ]; then
$DEBUG "run tracert-test"
cktracert
else
$DEBUG "run curl-test"
ckcurl
fi
for IP in $IPLIST; do
[ ! -z "$DEFAULT_ROUTE_FRAGMENT" ] && {
ROUTE_EXEC="ip route del $IP $DEFAULT_ROUTE_FRAGMENT"
$DEBUG $ROUTE_EXEC
$ROUTE_EXEC
}
ROUTE_EXEC="ip route del $IP dev $IFACE $GATEWAY_FRAGMENT metric 50000"
}
ROUTE_EXEC="ip route add $IP dev $IFACE $GATEWAY_FRAGMENT metric 50000"
$DEBUG $ROUTE_EXEC
$ROUTE_EXEC
done
if [ "$METHOD" -eq 1 ]; then
ckping
elif [ "$METHOD" -eq 2 ]; then
cktracert
else
ckcurl
fi
for IP in $IPLIST; do
[ ! -z "$DEFAULT_ROUTE_FRAGMENT" ] && {
ROUTE_EXEC="ip route del $IP $DEFAULT_ROUTE_FRAGMENT"
$DEBUG $ROUTE_EXEC
$ROUTE_EXEC
done
}
}
ROUTE_EXEC="ip route del $IP dev $IFACE $GATEWAY_FRAGMENT metric 50000"
$DEBUG $ROUTE_EXEC
$ROUTE_EXEC
done
# wan is down
[ "$RESULT" -eq 0 ] && {
@ -140,7 +151,10 @@ watchdogRun() {
}
cktracert() {
RXBYTES1=$(cat /sys/class/net/$IFACE/statistics/rx_bytes)
local RXBYTES1=$(cat /sys/class/net/$IFACE/statistics/rx_bytes)
local RXBYTES2 IP
$DEBUG "run tracert for $IFACE ..."
for IP in $IPLIST; do
# we need only send/receive few packages to be sure is connection works.
@ -154,7 +168,9 @@ cktracert() {
}
ckping() {
local CHECK
local IP CHECK
$DEBUG "run ping for $IFACE ..."
for IP in $IPLIST; do
CHECK=$(ping -c 4 -I $IFACE $IP | grep "received" | cut -d "," -f2 | cut -d " " -f2)
@ -168,7 +184,9 @@ ckping() {
}
ckcurl() {
local CHECK
local IP CHECK
$DEBUG "run curl connect for $IFACE ..."
for IP in $IPLIST; do
CHECK=$(curl $IP --interface $IFACE --connect-timeout 5 -ksfI -o /dev/null && echo 1 || echo 0)
@ -206,13 +224,15 @@ mwanJob() {
mwanAlive() {
[ "$MWAN" -gt 1 ] && {
[ "$(ps | grep "mwanroute" | grep -v "grep" | wc -l)" -eq 0 ] && {
$DEBUG "mwanroute not found, launch process"
$LOGS "mwanroute not found, launch process"
mwanroute
}
}
}
checkPid() {
local PIDNO
[ -f $PIDFILE ] && {
PIDNO=$(cat $PIDFILE)
cat "/proc/$PIDNO/cmdline" > /dev/null 2>&1
@ -238,24 +258,26 @@ checkPid() {
}
checkPidSwitch() {
for PREFIX in $MWANTABLE; do
[ -f /var/run/switch3g_$PREFIX.pid ] && {
[ "$(ps | grep switch3g | grep -v "grep" | wc -l)" == "0" ] && {
local SPREFIX
for SPREFIX in $MWANTABLE; do
[ -f /var/run/switch3g_$SPREFIX.pid ] && {
[ "$(ps | grep switch3g | grep -v "grep" | wc -l)" -eq 0 ] && {
# pid file exists but process doesn't
rm /var/run/switch3g_$PREFIX.pid
rm /var/run/switch3g_$SPREFIX.pid
} || {
$LOGS "Switch3g ($PREFIX) script in action - Exiting ..."
$LOGS "Switch3g ($SPREFIX) script in action - Exiting ..."
rm -f $PIDFILE > /dev/null 2>&1
exit 0
}
}
[ -f /var/run/switch4g_$PREFIX.pid ] && {
[ "$(ps | grep switch4g | grep -v "grep" | wc -l)" == "0" ] && {
[ -f /var/run/switch4g_$SPREFIX.pid ] && {
[ "$(ps | grep switch4g | grep -v "grep" | wc -l)" -eq 0 ] && {
# pid file exists but process doesn't
rm /var/run/switch4g_$PREFIX.pid
rm /var/run/switch4g_$SPREFIX.pid
} || {
$LOGS "Switch4g ($PREFIX) script in action - Exiting ..."
$LOGS "Switch4g ($SPREFIX) script in action - Exiting ..."
rm -f $PIDFILE > /dev/null 2>&1
exit 0
}
@ -281,7 +303,13 @@ else
mwanJob
# run with a 10 sec timeout to not hang
timeout 10 findHost
[ -f $IPLISTFILE ] && IPLIST=$(cat $IPLISTFILE)
[ -z "$IPLIST" ] && IPLIST="8.8.8.8" # spare IP if the list is empty
watchdogRun
rm $IPLISTFILE
fi
rm -f $PIDFILE > /dev/null 2>&1

@ -110,53 +110,7 @@ void get_cidr(char *ipaddr, char *netmask, char *cidr)
}
in_network.s_addr = in_ipaddr.s_addr & in_netmask.s_addr;
sprintf(cidr, "%s/%d", inet_ntoa(in_network), netmask_bit);
}
int checkConnect(char *sPrefix)
{
char tmp[64];
FILE *f;
int result;
get_wan_info(sPrefix); /* here for mwan_load_balance IP / dev info in case wan is down */
memset(tmp, 0, 64);
sprintf(tmp, "/var/lib/misc/%s_state", sPrefix);
if (check_wanup(sPrefix)) {
logmsg(LOG_DEBUG, "*** %s: prefix=%s iface=%s ip/mask=%s/%s gateway=%s weight=%d", __FUNCTION__, sPrefix, wan_info.wan_iface, wan_info.wan_ipaddr, wan_info.wan_netmask, wan_info.wan_gateway, wan_info.wan_weight);
if (nvram_get_int("mwan_cktime") == 0) {
logmsg(LOG_DEBUG, "*** %s: [1], %s is connected [result from check_wanup(%s)] [mwan_cktime = 0]", __FUNCTION__, sPrefix, sPrefix);
return 1;
}
f = fopen(tmp, "r");
fscanf(f, "%d", &result);
fclose(f);
if (result == 1) {
logmsg(LOG_DEBUG, "*** %s: [1], %s is connected [result from /var/lib/misc/%s_state]", __FUNCTION__, sPrefix, sPrefix);
return 1;
}
else {
logmsg(LOG_DEBUG, "*** %s: [%d], %s is disconnected [result from /var/lib/misc/%s_state]", __FUNCTION__, result, sPrefix, sPrefix);
return 0;
}
}
else {
logmsg(LOG_DEBUG, "*** %s: prefix=%s iface=%s ip/mask=%s/%s gateway=%s weight=%d", __FUNCTION__, sPrefix, wan_info.wan_iface, wan_info.wan_ipaddr, wan_info.wan_netmask, wan_info.wan_gateway, wan_info.wan_weight);
logmsg(LOG_DEBUG, "*** %s: [0], %s is disconnected [result from check_wanup(%s)]", __FUNCTION__, sPrefix, sPrefix);
if (nvram_get_int("mwan_cktime") > 0) {
/* don't leave old outdated state */
f = fopen(tmp, "w");
fprintf(f, "0\n");
fclose(f);
}
return 0;
}
snprintf(cidr, sizeof(cidr), "%s/%d", inet_ntoa(in_network), netmask_bit);
}
void mwan_table_del(char *sPrefix)
@ -172,7 +126,7 @@ void mwan_table_del(char *sPrefix)
/* ip rule del table WAN1 pref 101 (gateway); table: 1 to 4; pref: 101 to 104 */
memset(cmd, 0, 256);
sprintf(cmd, "ip rule del table %d pref 10%d", table, wan_unit);
snprintf(cmd, sizeof(cmd), "ip rule del table %d pref 10%d", table, wan_unit);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
@ -180,14 +134,14 @@ void mwan_table_del(char *sPrefix)
/* delete only active & valid DNS; two options right now: only AUTO DNS server (1x DNS) or Manual DNS server (2x DNS) (see GUI network-basic.asp) */
for (i = 0 ; i < wan_info.dns->count; ++i) {
memset(cmd, 0, 256);
sprintf(cmd, "ip rule del table %d pref 11%d", table, wan_unit);
snprintf(cmd, sizeof(cmd), "ip rule del table %d pref 11%d", table, wan_unit);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
}
/* ip rule del fwmark 0x100/0xf00 table 1 pref 121 (mark); table: 1 to 4; pref: 121 to 124 */
memset(cmd, 0, 256);
sprintf(cmd, "ip rule del table %d pref 12%d", table, wan_unit);
snprintf(cmd, sizeof(cmd), "ip rule del table %d pref 12%d", table, wan_unit);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
@ -219,21 +173,21 @@ void mwan_table_add(char *sPrefix)
if (check_wanup(sPrefix)) {
/* ip rule add from WAN_IP table route_id pref 10X */
memset(cmd, 0, 256);
sprintf(cmd, "ip rule add from %s table %d pref 10%d", wan_info.wan_ipaddr, table, wan_unit);
snprintf(cmd, sizeof(cmd), "ip rule add from %s table %d pref 10%d", wan_info.wan_ipaddr, table, wan_unit);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
/* set the routing rules of DNS */
for (i = 0; i < wan_info.dns->count; ++i) {
memset(cmd, 0, 256);
sprintf(cmd, "ip rule add to %s table %d pref 11%d", inet_ntoa(wan_info.dns->dns[i].addr), table, wan_unit);
snprintf(cmd, sizeof(cmd), "ip rule add to %s table %d pref 11%d", inet_ntoa(wan_info.dns->dns[i].addr), table, wan_unit);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
}
/* ip rule add fwmark 0x100/0xf00 table 1 pref 121 */
memset(cmd, 0, 256);
sprintf(cmd, "ip rule add fwmark 0x%d00/0xf00 table %d pref 12%d", wan_unit, table, wan_unit);
snprintf(cmd, sizeof(cmd), "ip rule add fwmark 0x%d00/0xf00 table %d pref 12%d", wan_unit, table, wan_unit);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
@ -243,10 +197,10 @@ void mwan_table_add(char *sPrefix)
memset(cmd, 0, 256);
if ((proto == WP_DHCP) || (proto == WP_LTE) || (proto == WP_STATIC)) {
get_cidr(wan_info.wan_ipaddr, wan_info.wan_netmask, ip_cidr);
sprintf(cmd, "ip route append %s dev %s proto kernel scope link src %s table %d", ip_cidr, wan_info.wan_iface, wan_info.wan_ipaddr, wanid);
snprintf(cmd, sizeof(cmd), "ip route append %s dev %s proto kernel scope link src %s table %d", ip_cidr, wan_info.wan_iface, wan_info.wan_ipaddr, wanid);
}
else
sprintf(cmd, "ip route append %s dev %s proto kernel scope link src %s table %d", wan_info.wan_gateway, wan_info.wan_iface, wan_info.wan_ipaddr, wanid);
snprintf(cmd, sizeof(cmd), "ip route append %s dev %s proto kernel scope link src %s table %d", wan_info.wan_gateway, wan_info.wan_iface, wan_info.wan_ipaddr, wanid);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
@ -260,13 +214,13 @@ void mwan_table_add(char *sPrefix)
char* lan_netmask;
memset(nvram_var, 0, 16);
sprintf(nvram_var, (i == 0 ? "lan_ifname" : "lan%d_ifname"), i);
snprintf(nvram_var, sizeof(nvram_var), (i == 0 ? "lan_ifname" : "lan%d_ifname"), i);
lan_ifname = nvram_safe_get(nvram_var);
memset(nvram_var, 0, 16);
sprintf(nvram_var, (i == 0 ? "lan_ipaddr" : "lan%d_ipaddr"), i);
snprintf(nvram_var, sizeof(nvram_var), (i == 0 ? "lan_ipaddr" : "lan%d_ipaddr"), i);
lan_ipaddr = nvram_safe_get(nvram_var);
memset(nvram_var, 0, 16);
sprintf(nvram_var, (i == 0 ? "lan_netmask" : "lan%d_netmask"), i);
snprintf(nvram_var, sizeof(nvram_var), (i == 0 ? "lan_netmask" : "lan%d_netmask"), i);
lan_netmask = nvram_safe_get(nvram_var);
if ((lan_ifname[0] == '\0') || (lan_ipaddr[0] == '\0') || (lan_netmask[0] == '\0'))
@ -274,20 +228,20 @@ void mwan_table_add(char *sPrefix)
get_cidr(lan_ipaddr, lan_netmask, ip_cidr);
memset(cmd, 0, 256);
sprintf(cmd, "ip route append %s dev %s proto kernel scope link src %s table %d", ip_cidr, lan_ifname, lan_ipaddr, table);
snprintf(cmd, sizeof(cmd), "ip route append %s dev %s proto kernel scope link src %s table %d", ip_cidr, lan_ifname, lan_ipaddr, table);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
}
/* ip route add 127.0.0.0/8 dev lo scope link table 1 */
memset(cmd, 0, 256);
sprintf(cmd, "ip route append 127.0.0.0/8 dev lo scope link table %d", table);
snprintf(cmd, sizeof(cmd), "ip route append 127.0.0.0/8 dev lo scope link table %d", table);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
/* ip route add default via 10.0.10.1 dev ppp3 table route_id */
memset(cmd, 0, 256);
sprintf(cmd, "ip route append default via %s dev %s table %d", ((proto == WP_DHCP) || (proto == WP_LTE) || (proto == WP_STATIC)) ? wan_info.wan_gateway : wan_info.wan_ipaddr, wan_info.wan_iface, table);
snprintf(cmd, sizeof(cmd), "ip route append default via %s dev %s table %d", ((proto == WP_DHCP) || (proto == WP_LTE) || (proto == WP_STATIC)) ? wan_info.wan_gateway : wan_info.wan_ipaddr, wan_info.wan_iface, table);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, sPrefix, cmd);
system(cmd);
}
@ -311,16 +265,16 @@ void mwan_state_files(void)
get_wan_info(prefix);
memset(tmp, 0, 64);
sprintf(tmp, "/var/lib/misc/%s_state", prefix);
if (!(f = fopen(tmp, "r"))) {
snprintf(tmp, sizeof(tmp), "/var/lib/misc/%s_state", prefix);
if ((f = fopen(tmp, "r")) == NULL) {
/* if file does not exist then we create it with value "0".
* later on watchdog will set it to 1 when it proves that
* the wan is actually working (wan can connect but still be not working)
*/
f = fopen(tmp, "w+");
fprintf(f, (nvram_get_int("mwan_state_init") ? "1\n" : "0\n")); /* also allow to init state file with value "1" instead of "0" */
fclose(f);
}
fclose(f);
}
}
@ -338,7 +292,7 @@ void mwan_status_update(void)
for (wan_unit = 1; wan_unit <= mwan_num; ++wan_unit) {
get_wan_prefix(wan_unit, prefix);
get_wan_info(prefix);
if (checkConnect(prefix)) {
if (check_wanup(prefix)) {
if (wan_info.wan_weight > 0)
mwan_curr[wan_unit - 1] = '2'; /* connected, load balancing */
else
@ -400,14 +354,14 @@ void mwan_load_balance(void)
if (wan_info.wan_weight > 0) {
memset(cmd, 0, 256);
sprintf(cmd, " nexthop via %s dev %s weight %d", ((proto == WP_DHCP) || (proto == WP_LTE) || (proto == WP_STATIC)) ? wan_info.wan_gateway : wan_info.wan_ipaddr, wan_info.wan_iface, wan_info.wan_weight);
snprintf(cmd, sizeof(cmd), " nexthop via %s dev %s weight %d", ((proto == WP_DHCP) || (proto == WP_LTE) || (proto == WP_STATIC)) ? wan_info.wan_gateway : wan_info.wan_ipaddr, wan_info.wan_iface, wan_info.wan_weight);
strcat(lb_cmd, cmd);
}
}
/* ip route del default via 10.0.10.1 dev ppp3 (from main route table) */
if (strcmp(wan_info.wan_iface,"none")) { /* skip disabled / disconnected ppp wans */
if (strcmp(wan_info.wan_iface, "none")) { /* skip disabled / disconnected ppp wans */
memset(cmd, 0, 256);
sprintf(cmd, "ip route del default via %s dev %s", ((proto == WP_DHCP) || (proto == WP_LTE) || (proto == WP_STATIC)) ? wan_info.wan_gateway : wan_info.wan_ipaddr, wan_info.wan_iface);
snprintf(cmd, sizeof(cmd), "ip route del default via %s dev %s", ((proto == WP_DHCP) || (proto == WP_LTE) || (proto == WP_STATIC)) ? wan_info.wan_gateway : wan_info.wan_ipaddr, wan_info.wan_iface);
logmsg(LOG_DEBUG, "*** %s: %s, cmd=%s", __FUNCTION__, prefix, cmd);
system(cmd);
}

@ -155,7 +155,6 @@ extern void mwan_table_add(char *sPrefix);
extern void mwan_table_del(char *sPrefix);
extern void mwan_load_balance(void);
extern int mwan_route_main(int argc, char **argv);
extern int checkConnect(char *sPrefix);
extern void mwan_state_files(void);
/* pbr.c */

@ -76,6 +76,7 @@ struct nvram_tuple router_defaults[] = {
{ "wan_hilink_ip", "0.0.0.0" , 0 },
{ "wan_status_script", "0" , 0 },
{ "wan_ckmtd", "2" , 0 },
{ "wan_ck_pause", "0" , 0 }, /* skip watchdog for this wan 0|1 */
{ "wan2_proto", "dhcp" , 0 }, // [static|dhcp|pppoe|disabled]
{ "wan2_ipaddr", "0.0.0.0" , 0 }, // WAN IP address
@ -90,6 +91,7 @@ struct nvram_tuple router_defaults[] = {
{ "wan2_hilink_ip", "0.0.0.0" , 0 },
{ "wan2_status_script", "0" , 0 },
{ "wan2_ckmtd", "2" , 0 },
{ "wan2_ck_pause", "0" , 0 }, /* skip watchdog for this wan 0|1 */
#ifdef TCONFIG_MULTIWAN
{ "wan3_proto", "dhcp" , 0 }, // [static|dhcp|pppoe|disabled]
@ -105,6 +107,7 @@ struct nvram_tuple router_defaults[] = {
{ "wan3_hilink_ip", "0.0.0.0" , 0 },
{ "wan3_status_script", "0" , 0 },
{ "wan3_ckmtd", "2" , 0 },
{ "wan3_ck_pause", "0" , 0 }, /* skip watchdog for this wan 0|1 */
{ "wan4_proto", "dhcp" , 0 }, // [static|dhcp|pppoe|disabled]
{ "wan4_ipaddr", "0.0.0.0" , 0 }, // WAN IP address
@ -119,6 +122,7 @@ struct nvram_tuple router_defaults[] = {
{ "wan4_hilink_ip", "0.0.0.0" , 0 },
{ "wan4_status_script", "0" , 0 },
{ "wan4_ckmtd", "2" , 0 },
{ "wan4_ck_pause", "0" , 0 }, /* skip watchdog for this wan 0|1 */
#endif /* TCONFIG_MULTIWAN */
#ifdef TCONFIG_DNSSEC

@ -436,7 +436,7 @@ int wan_led_off(char *prefix) /* off WAN LED only if no other WAN active */
}
pclose(f);
}
}
}
}
}
if (up) ++count;
@ -494,6 +494,7 @@ long check_wanup_time(char *prefix)
int check_wanup(char *prefix)
{
FILE *f;
int up = 0;
int proto;
char buf1[64];
@ -506,27 +507,35 @@ int check_wanup(char *prefix)
char pppd_name[256];
proto = get_wanx_proto(prefix);
if (proto == WP_DISABLED)
{
if (proto == WP_DISABLED) {
return 0;
}
if ((proto == WP_PPTP) || (proto == WP_L2TP) || (proto == WP_PPPOE) || (proto == WP_PPP3G)) {
memset(ppplink_file , 0, 256);
sprintf(ppplink_file, "/tmp/ppp/%s_link", prefix);
if (f_read_string(ppplink_file, buf1, sizeof(buf1)) > 0) {
/* contains the base name of a file in /var/run/ containing pid of a daemon */
snprintf(buf2, sizeof(buf2), "/var/run/%s.pid", buf1);
if (f_read_string(buf2, buf1, sizeof(buf1)) > 0) {
name = psname(atoi(buf1), buf2, sizeof(buf2));
memset(pppd_name, 0, 256);
sprintf(pppd_name, "pppd%s", prefix);
logmsg(LOG_DEBUG, "*** %s: pppd name=%s, psname=%s", __FUNCTION__, pppd_name, name);
if (strcmp(name, pppd_name) == 0) up = 1;
if (strcmp(name, pppd_name) == 0)
up = 1;
if (proto == WP_L2TP) {
sprintf(pppd_name, "pppd");
logmsg(LOG_DEBUG, "*** %s: L2TP pppd name=%s, psname=%s", __FUNCTION__, pppd_name, name);
if (strcmp(name, pppd_name) == 0) up = 1;
if (strcmp(name, pppd_name) == 0)
up = 1;
}
}
else {
@ -547,20 +556,23 @@ int check_wanup(char *prefix)
}
else {
logmsg(LOG_DEBUG, "*** %s: default !up", __FUNCTION__);
return up; /* don't turn off WAN LED */
goto state; /* don't turn off WAN LED */
}
if ((up) && ((s = socket(AF_INET, SOCK_DGRAM, 0)) >= 0)) {
strlcpy(ifr.ifr_name, nvram_safe_get(strcat_r(prefix, "_iface", tmp)), sizeof(ifr.ifr_name));
if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) {
up = 0;
logmsg(LOG_DEBUG, "*** %s: SIOCGIFFLAGS", __FUNCTION__);
}
close(s);
if ((ifr.ifr_flags & IFF_UP) == 0 || (ifr.ifr_flags & IFF_RUNNING) == 0) {
up = 0;
logmsg(LOG_DEBUG, "*** %s: !IFF_UP || !IFF_RUNNING", __FUNCTION__);
}
if (proto == WP_STATIC) {
/* Ethernet WAN port state checker (static IF is always UP and RUNNING)
ifr.ifr_name = vlan2, vlan3 etc
@ -591,7 +603,7 @@ int check_wanup(char *prefix)
if ((f = popen("/usr/sbin/robocfg showports", "r")) != NULL) {
while (fgets(tmp, sizeof(tmp), f)) {
if (sscanf(tmp, "Port %d: %s %*s %*s %*s vlan: %d %*s", &a, b, &c) == 3) {
if ((strncmp(b, "DOWN", 4) == 0) && ( c == vlannum )) {
if ((strncmp(b, "DOWN", 4) == 0) && (c == vlannum)) {
logmsg(LOG_DEBUG, "*** %s: port state = DOWN for vlan%d", __FUNCTION__, vlannum);
up = 0;
}
@ -602,6 +614,23 @@ int check_wanup(char *prefix)
}
}
state:
memset(buf1, 0, 64);
snprintf(buf1, sizeof(buf1), "wan%s_ck_pause", prefix);
if (up == 1) { /* also check result from watchdog */
if ((nvram_get_int("mwan_cktime") == 0) || (nvram_get_int(buf1) == 1))
return 1;
memset(buf1, 0, 64);
snprintf(buf1, sizeof(buf1), "/var/lib/misc/%s_state", prefix);
if ((f = fopen(buf1, "r")) == NULL) /* no state file? */
return 0;
fscanf(f, "%d", &up);
fclose(f);
}
return up;
}

@ -20,7 +20,7 @@
<script src="interfaces.js"></script>
<script src="wireless.js"></script>
<script>
// <% nvram("dhcp_lease,dhcp_num,dhcp_start,dhcpd_startip,dhcpd_endip,lan_gateway,lan_ipaddr,lan_netmask,lan_proto,lan_state,lan_desc,lan_invert,wl_security_mode,wl_wds_enable,wl_channel,wl_closed,wl_crypto,wl_key,wl_key1,wl_key2,wl_key3,wl_key4,wl_lazywds,wl_mode,wl_net_mode,wl_passphrase,wl_radio,wl_radius_ipaddr,wl_radius_port,wl_ssid,wl_wds,wl_wep_bit,wl_wpa_gtk_rekey,wl_wpa_psk,wl_radius_key,wl_auth,wl_hwaddr,t_features,wl_nbw_cap,wl_nctrlsb,wl_nband,wl_phytype,lan_ifname,lan_stp,lan1_ifname,lan1_ipaddr,lan1_netmask,lan1_proto,lan1_stp,dhcp1_start,dhcp1_num,dhcp1_lease,dhcpd1_startip,dhcpd1_endip,lan2_ifname,lan2_ipaddr,lan2_netmask,lan2_proto,lan2_stp,dhcp2_start,dhcp2_num,dhcp2_lease,dhcpd2_startip,dhcpd2_endip,lan3_ifname,lan3_ipaddr,lan3_netmask,lan3_proto,lan3_stp,dhcp3_start,dhcp3_num,dhcp3_lease,dhcpd3_startip,dhcpd3_endip,cstats_enable,wan_proto,wan_weight,wan_modem_type,wan_modem_pin,wan_modem_dev,wan_modem_init,wan_modem_apn,wan_modem_speed,wan_modem_band,wan_modem_roam,wan_ppp_username,wan_ppp_passwd,wan_ppp_service,wan_l2tp_server_ip,wan_pptp_dhcp,wan_ipaddr,wan_netmask,wan_gateway,wan_pptp_server_ip,wan_ppp_custom,wan_ppp_demand,wan_ppp_idletime,wan_ppp_demand_dnsip,wan_ppp_redialperiod,wan_pppoe_lei,wan_pppoe_lef,wan_mtu_enable,wan_mtu,wan_ppp_mlppp,wan_modem_ipaddr,wan_sta,wan_dns,wan_dns_auto,wan_ifnameX,wan_ckmtd,wan2_proto,wan2_weight,wan2_modem_type,wan2_modem_pin,wan2_modem_dev,wan2_modem_init,wan2_modem_apn,wan2_modem_speed,wan2_modem_band,wan2_modem_roam,wan2_ppp_username,wan2_ppp_passwd,wan2_ppp_service,wan2_l2tp_server_ip,wan2_pptp_dhcp,wan2_ipaddr,wan2_netmask,wan2_gateway,wan2_pptp_server_ip,wan2_ppp_custom,wan2_ppp_demand,wan2_ppp_idletime,wan2_ppp_demand_dnsip,wan2_ppp_redialperiod,wan2_pppoe_lei,wan2_pppoe_lef,wan2_mtu_enable,wan2_mtu,wan2_ppp_mlppp,wan2_modem_ipaddr,wan2_sta,wan2_dns,wan2_dns_auto,wan2_ifnameX,wan2_ckmtd,wan3_proto,wan3_weight,wan3_modem_type,wan3_modem_pin,wan3_modem_dev,wan3_modem_init,wan3_modem_apn,wan3_modem_speed,wan3_modem_band,wan3_modem_roam,wan3_ppp_username,wan3_ppp_passwd,wan3_ppp_service,wan3_l2tp_server_ip,wan3_pptp_dhcp,wan3_ipaddr,wan3_netmask,wan3_gateway,wan3_pptp_server_ip,wan3_ppp_custom,wan3_ppp_demand,wan3_ppp_idletime,wan3_ppp_demand_dnsip,wan3_ppp_redialperiod,wan3_pppoe_lei,wan3_pppoe_lef,wan3_mtu_enable,wan3_mtu,wan3_ppp_mlppp,wan3_modem_ipaddr,wan3_sta,wan3_dns,wan3_dns_auto,wan3_ifnameX,wan3_ckmtd,wan4_proto,wan4_weight,wan4_modem_type,wan4_modem_pin,wan4_modem_dev,wan4_modem_init,wan4_modem_apn,wan4_modem_speed,wan4_modem_band,wan4_modem_roam,wan4_ppp_username,wan4_ppp_passwd,wan4_ppp_service,wan4_l2tp_server_ip,wan4_pptp_dhcp,wan4_ipaddr,wan4_netmask,wan4_gateway,wan4_pptp_server_ip,wan4_ppp_custom,wan4_ppp_demand,wan4_ppp_idletime,wan4_ppp_demand_dnsip,wan4_ppp_redialperiod,wan4_pppoe_lei,wan4_pppoe_lef,wan4_mtu_enable,wan4_mtu,wan4_ppp_mlppp,wan4_modem_ipaddr,wan4_sta,wan4_dns,wan4_dns_auto,wan4_ifnameX,wan4_ckmtd,mwan_num,mwan_cktime,mwan_ckdst,mwan_tune_gc,wan_hilink_ip,wan2_hilink_ip,wan3_hilink_ip,wan4_hilink_ip,wan_status_script,wan2_status_script,wan3_status_script,wan4_status_script,smart_connect_x,dnscrypt_proxy,dnscrypt_priority,stubby_proxy,stubby_priority"); %>
// <% nvram("dhcp_lease,dhcp_num,dhcp_start,dhcpd_startip,dhcpd_endip,lan_gateway,lan_ipaddr,lan_netmask,lan_proto,lan_state,lan_desc,lan_invert,wl_security_mode,wl_wds_enable,wl_channel,wl_closed,wl_crypto,wl_key,wl_key1,wl_key2,wl_key3,wl_key4,wl_lazywds,wl_mode,wl_net_mode,wl_passphrase,wl_radio,wl_radius_ipaddr,wl_radius_port,wl_ssid,wl_wds,wl_wep_bit,wl_wpa_gtk_rekey,wl_wpa_psk,wl_radius_key,wl_auth,wl_hwaddr,t_features,wl_nbw_cap,wl_nctrlsb,wl_nband,wl_phytype,lan_ifname,lan_stp,lan1_ifname,lan1_ipaddr,lan1_netmask,lan1_proto,lan1_stp,dhcp1_start,dhcp1_num,dhcp1_lease,dhcpd1_startip,dhcpd1_endip,lan2_ifname,lan2_ipaddr,lan2_netmask,lan2_proto,lan2_stp,dhcp2_start,dhcp2_num,dhcp2_lease,dhcpd2_startip,dhcpd2_endip,lan3_ifname,lan3_ipaddr,lan3_netmask,lan3_proto,lan3_stp,dhcp3_start,dhcp3_num,dhcp3_lease,dhcpd3_startip,dhcpd3_endip,cstats_enable,wan_proto,wan_weight,wan_modem_type,wan_modem_pin,wan_modem_dev,wan_modem_init,wan_modem_apn,wan_modem_speed,wan_modem_band,wan_modem_roam,wan_ppp_username,wan_ppp_passwd,wan_ppp_service,wan_l2tp_server_ip,wan_pptp_dhcp,wan_ipaddr,wan_netmask,wan_gateway,wan_pptp_server_ip,wan_ppp_custom,wan_ppp_demand,wan_ppp_idletime,wan_ppp_demand_dnsip,wan_ppp_redialperiod,wan_pppoe_lei,wan_pppoe_lef,wan_mtu_enable,wan_mtu,wan_ppp_mlppp,wan_modem_ipaddr,wan_sta,wan_dns,wan_dns_auto,wan_ifnameX,wan_ckmtd,wan_ck_pause,wan2_proto,wan2_weight,wan2_modem_type,wan2_modem_pin,wan2_modem_dev,wan2_modem_init,wan2_modem_apn,wan2_modem_speed,wan2_modem_band,wan2_modem_roam,wan2_ppp_username,wan2_ppp_passwd,wan2_ppp_service,wan2_l2tp_server_ip,wan2_pptp_dhcp,wan2_ipaddr,wan2_netmask,wan2_gateway,wan2_pptp_server_ip,wan2_ppp_custom,wan2_ppp_demand,wan2_ppp_idletime,wan2_ppp_demand_dnsip,wan2_ppp_redialperiod,wan2_pppoe_lei,wan2_pppoe_lef,wan2_mtu_enable,wan2_mtu,wan2_ppp_mlppp,wan2_modem_ipaddr,wan2_sta,wan2_dns,wan2_dns_auto,wan2_ifnameX,wan2_ckmtd,wan2_ck_pause,wan3_proto,wan3_weight,wan3_modem_type,wan3_modem_pin,wan3_modem_dev,wan3_modem_init,wan3_modem_apn,wan3_modem_speed,wan3_modem_band,wan3_modem_roam,wan3_ppp_username,wan3_ppp_passwd,wan3_ppp_service,wan3_l2tp_server_ip,wan3_pptp_dhcp,wan3_ipaddr,wan3_netmask,wan3_gateway,wan3_pptp_server_ip,wan3_ppp_custom,wan3_ppp_demand,wan3_ppp_idletime,wan3_ppp_demand_dnsip,wan3_ppp_redialperiod,wan3_pppoe_lei,wan3_pppoe_lef,wan3_mtu_enable,wan3_mtu,wan3_ppp_mlppp,wan3_modem_ipaddr,wan3_sta,wan3_dns,wan3_dns_auto,wan3_ifnameX,wan3_ckmtd,wan3_ck_pause,wan4_proto,wan4_weight,wan4_modem_type,wan4_modem_pin,wan4_modem_dev,wan4_modem_init,wan4_modem_apn,wan4_modem_speed,wan4_modem_band,wan4_modem_roam,wan4_ppp_username,wan4_ppp_passwd,wan4_ppp_service,wan4_l2tp_server_ip,wan4_pptp_dhcp,wan4_ipaddr,wan4_netmask,wan4_gateway,wan4_pptp_server_ip,wan4_ppp_custom,wan4_ppp_demand,wan4_ppp_idletime,wan4_ppp_demand_dnsip,wan4_ppp_redialperiod,wan4_pppoe_lei,wan4_pppoe_lef,wan4_mtu_enable,wan4_mtu,wan4_ppp_mlppp,wan4_modem_ipaddr,wan4_sta,wan4_dns,wan4_dns_auto,wan4_ifnameX,wan4_ckmtd,wan4_ck_pause,mwan_num,mwan_cktime,mwan_ckdst,mwan_tune_gc,wan_hilink_ip,wan2_hilink_ip,wan3_hilink_ip,wan4_hilink_ip,wan_status_script,wan2_status_script,wan3_status_script,wan4_status_script,smart_connect_x,dnscrypt_proxy,dnscrypt_priority,stubby_proxy,stubby_priority"); %>
/* DUALWAN-BEGIN */
maxwan_num = 2;
@ -464,6 +464,7 @@ function verifyFields(focused, quiet) {
vis['_f_wan'+u+'_status_script'] = 1;
/* USB-END */
vis['_wan'+u+'_ckmtd'] = 1;
vis['_f_wan'+u+'_ck_pause'] = 1;
vis['_wan'+u+'_pptp_server_ip'] = 1;
vis['_f_wan'+u+'_pptp_dhcp'] = 1;
vis['_wan'+u+'_ppp_demand'] = 1;
@ -504,6 +505,7 @@ function verifyFields(focused, quiet) {
E('_f_wan'+u+'_status_script').disabled = 0;
/* USB-END */
E('_wan'+u+'_ckmtd').disabled = 0;
E('_f_wan'+u+'_ck_pause').disabled = 0;
E('_wan'+u+'_pptp_server_ip').disabled = 0;
E('_f_wan'+u+'_pptp_dhcp').disabled = 0;
E('_wan'+u+'_ppp_demand').disabled = 0;
@ -543,6 +545,7 @@ function verifyFields(focused, quiet) {
vis['_wan'+u+'_netmask'] = 0;
vis['_wan'+u+'_gateway'] = 0;
vis['_wan'+u+'_ckmtd'] = 0;
vis['_f_wan'+u+'_ck_pause'] = 0;
vis['_wan'+u+'_pptp_server_ip'] = 0;
vis['_f_wan'+u+'_pptp_dhcp'] = 0;
vis['_wan'+u+'_ppp_demand'] = 0;
@ -583,6 +586,7 @@ function verifyFields(focused, quiet) {
E('_f_wan'+u+'_status_script').disabled = 1;
/* USB-END */
E('_wan'+u+'_ckmtd').disabled = 1;
E('_f_wan'+u+'_ck_pause').disabled = 1;
E('_wan'+u+'_pptp_server_ip').disabled = 1;
E('_f_wan'+u+'_pptp_dhcp').disabled = 1;
E('_wan'+u+'_ppp_demand').disabled = 1;
@ -701,6 +705,7 @@ function verifyFields(focused, quiet) {
vis['_f_wan'+u+'_status_script'] = 0;
/* USB-END */
vis['_wan'+u+'_ckmtd'] = 0;
vis['_f_wan'+u+'_ck_pause'] = 0;
vis['_wan'+u+'_pptp_server_ip'] = 0;
vis['_f_wan'+u+'_pptp_dhcp'] = 0;
vis['_wan'+u+'_ppp_demand'] = 0;
@ -860,7 +865,13 @@ function verifyFields(focused, quiet) {
vis['_wan'+u+'_modem_band'] = (E('_wan'+u+'_modem_speed').value == '03') && vis['_wan'+u+'_modem_speed'] && (eval('nvram.wan'+u+'_modem_type') != "qmi_wwan");
/* USB-END */
if (E('_mwan_cktime').value == 0) {
elem.display(PR('_wan'+u+'_ckmtd'), 0);
vis['_wan'+u+'_ckmtd'] = 0;
vis['_f_wan'+u+'_ck_pause'] = 0;
E('_wan'+u+'_ckmtd').disabled = 1;
E('_f_wan'+u+'_ck_pause').disabled = 1;
}
if (E('_f_wan'+u+'_ck_pause').checked == 1) {
vis['_wan'+u+'_ckmtd'] = 0;
E('_wan'+u+'_ckmtd').disabled = 1;
}
@ -1544,6 +1555,7 @@ REMOVE-END */
/* USB-BEGIN */
fom['wan'+u+'_status_script'].value = fom['f_wan'+u+'_status_script'].checked ? 1 : 0;
/* USB-END */
fom['wan'+u+'_ck_pause'].value = fom['f_wan'+u+'_ck_pause'].checked ? 1 : 0;
if (fom['wan'+u+'_proto'].value == 'disabled') /* if wanX is disabled (for ex. wireless bridge / AP only) */
fom['wan'+u+'_dns_auto'].value = '0'; /* make sure to use static dns! */
@ -1674,9 +1686,9 @@ REMOVE-END -->
], value: nvram.mwan_num, suffix: '&nbsp; <small>Please configure <a href="advanced-vlan.asp">VLAN<\/a> first<\/small>' },
{ title: 'Tune route cache', name: 'f_mwan_tune_gc', type: 'checkbox', suffix: '&nbsp; <small>for multiwan in load balancing mode<\/small>', value: (nvram['mwan_tune_gc'] == 1) },
{ title: 'Check connections every', name: 'mwan_cktime', type: 'select', options: [
['0','Disabled'],['60','1 minute'],['120','2 minutes'],['180','3 minutes'],['300','5 minutes'],
['0','Disabled'],['60','1 minute'],['120','2 minutes*'],['180','3 minutes'],['300','5 minutes'],
['600','10 minutes'],['900','15 minutes'],['1800','30 minutes'],['3600','1 hour']],
suffix: '&nbsp; <small>when the network conditions is poor, try use longer detection period<\/small>',
suffix: '&nbsp; <small>*recommended<\/small>',
value: nvram.mwan_cktime },
{ title: 'Target 1', indent: 2, name: 'f_mwan_ckdst_1', type: 'text', maxlen: 30, size: 30, value: ckdst[0] || ''},
{ title: 'Target 2', indent: 2, name: 'f_mwan_ckdst_2', type: 'text', maxlen: 30, size: 30, value: ckdst[1] || ''}
@ -1702,6 +1714,7 @@ REMOVE-END -->
/* USB-BEGIN */
W('<input type="hidden" name="wan'+u+'_status_script">');
/* USB-END */
W('<input type="hidden" name="wan'+u+'_ck_pause">');
W('<div class="section-title" id="wan'+u+'-title">WAN'+(uidx - 1)+' Settings<\/div>');
W('<div class="section" id="sesdiv_wan'+u+'">');
createFieldTable('', [
@ -1761,6 +1774,7 @@ REMOVE-END -->
{ title: 'Call Custom Status Script', name: 'f_wan'+u+'_status_script', type: 'checkbox', suffix: '&nbsp; <small>Call /www/user/cgi-bin/wan'+u+'_status.sh in the home page. Must output HTML<\/small>', value: (nvram['wan'+u+'_status_script'] == 1) },
/* USB-END */
{ title: 'Disable Watchdog', name: 'f_wan'+u+'_ck_pause', type: 'checkbox', suffix: '&nbsp; <small>only for this WAN<\/small>', value: (nvram['wan'+u+'_ck_pause'] == 1) },
{ title: 'Watchdog Mode', name: 'wan'+u+'_ckmtd', type: 'select', options: [['1','Ping'],['2','Traceroute*']
/* BBT-BEGIN */
,['3','Curl']

Loading…
Cancel
Save