1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/*
Copyright 2003, CyberTAN Inc. All Rights Reserved
THIS SOFTWARE IS OFFERED "AS IS", AND CYBERTAN GRANTS NO WARRANTIES OF ANY
KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. CYBERTAN
SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE
*/
/*
Copyright 2005, Broadcom Corporation
All Rights Reserved.
THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
*/
#include "rc.h"
#include <sys/ioctl.h>
#include <wait.h>
// used in keepalive mode (ppp_demand=0)
int start_redial(void)
{
stop_redial();
xstart("redial");
return 0;
}
int stop_redial(void)
{
while (killall("redial", SIGKILL) == 0) {
sleep(1);
}
return 0;
}
int redial_main(int argc, char **argv)
{
int tm;
long ut;
int count;
if (nvram_get_int("ppp_demand") != 0) return 0;
tm = nvram_get_int("ppp_redialperiod");
if (tm < 5) tm = 5;
syslog(LOG_INFO, "Started. Time: %d", tm);
count = 0;
sleep(10);
while (1) {
while (1) {
sleep(tm);
if (!check_wanup()) break;
count = 0;
}
if ((count < 3) && (get_wan_proto() == WP_PPPOE)) {
if (f_read("/var/lib/misc/pppoe-disc", &ut, sizeof(ut)) == sizeof(ut)) {
ut = (get_uptime() - ut);
if (ut <= 15) {
syslog(LOG_INFO, "PPPoE reconnect in progress (%ld)", ut);
++count;
continue;
}
}
}
if ((!wait_action_idle(10)) || (check_wanup())) continue;
if (!nvram_match("action_service", "wan-restart")) {
syslog(LOG_INFO, "WAN down. Reconnecting...");
xstart("service", "wan", "restart");
break;
}
else {
syslog(LOG_INFO, "WAN down. Reconnect is already in progress...");
}
}
return 0;
}
|