summaryrefslogtreecommitdiff
path: root/release/src/router/rc/redial.c
blob: 6709b1624db15e58ce01926863efe6c0b3f8b830 (plain)
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;
}