Netgear WNR3500L: correct leds behavior
[tomato.git] / release / src / router / rc / ppp.c
blob4c2f74bda45e7e8712d20f419b97676b4a49b37e
1 /*
3 Copyright 2003, CyberTAN Inc. All Rights Reserved
5 This is UNPUBLISHED PROPRIETARY SOURCE CODE of CyberTAN Inc.
6 the contents of this file may not be disclosed to third parties,
7 copied or duplicated in any form without the prior written
8 permission of CyberTAN Inc.
10 This software should be used as a reference only, and it not
11 intended for production use!
14 THIS SOFTWARE IS OFFERED "AS IS", AND CYBERTAN GRANTS NO WARRANTIES OF ANY
15 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. CYBERTAN
16 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
17 FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE
21 Copyright 2005, Broadcom Corporation
22 All Rights Reserved.
24 THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
25 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
26 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
27 FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
31 $Id: ppp.c,v 1.27 2005/03/29 02:00:06 honor Exp $
34 #include "rc.h"
36 #include <sys/ioctl.h>
39 #define IFUP (IFF_UP | IFF_RUNNING | IFF_BROADCAST | IFF_MULTICAST)
43 int ipup_main(int argc, char **argv)
45 char *wan_ifname;
46 char *value;
47 char buf[256];
48 const char *p;
50 _dprintf("%s: begin\n", __FUNCTION__);
52 killall("listen", SIGKILL);
54 if (!wait_action_idle(10)) return -1;
57 wan_ifname = safe_getenv("IFNAME");
58 if ((!wan_ifname) || (!*wan_ifname)) return -1;
59 nvram_set("wan_iface", wan_ifname); // ppp#
61 // ipup receives six arguments:
62 // <interface name> <tty device> <speed> <local IP address> <remote IP address> <ipparam>
63 // ppp1 vlan1 0 71.135.98.32 151.164.184.87 0
65 f_write_string("/tmp/ppp/link", argv[1], 0, 0);
67 if ((value = getenv("IPLOCAL"))) {
68 _dprintf("IPLOCAL=%s\n", getenv("IPLOCAL"));
70 ifconfig(wan_ifname, IFUP, value, "255.255.255.255");
72 switch (get_wan_proto()) {
73 case WP_PPPOE:
74 nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr")); // store last ip address
75 nvram_set("wan_ipaddr", value);
76 nvram_set("wan_netmask", "255.255.255.255");
77 break;
78 case WP_PPTP:
79 nvram_set("wan_ipaddr_buf", nvram_safe_get("pptp_get_ip"));
80 nvram_set("pptp_get_ip", value);
81 break;
82 case WP_L2TP:
83 nvram_set("wan_ipaddr_buf", nvram_safe_get("l2tp_get_ip"));
84 nvram_set("l2tp_get_ip", value);
85 break;
89 if ((value = getenv("IPREMOTE"))) {
90 nvram_set("wan_gateway", value);
91 _dprintf("IPREMOTE=%s\n", getenv("IPREMOTE"));
94 buf[0] = 0;
95 if ((p = getenv("DNS1")) != NULL) strlcpy(buf, p, sizeof(buf));
96 if ((p = getenv("DNS2")) != NULL) {
97 if (buf[0]) strlcat(buf, " ", sizeof(buf));
98 strlcat(buf, p, sizeof(buf));
100 nvram_set("wan_get_dns", buf);
102 if ((value = getenv("AC_NAME"))) nvram_set("ppp_get_ac", value);
103 if ((value = getenv("SRV_NAME"))) nvram_set("ppp_get_srv", value);
104 if ((value = getenv("MTU"))) nvram_set("wan_run_mtu", value);
106 start_wan_done(wan_ifname);
108 _dprintf("%s: end\n", __FUNCTION__);
109 return 0;
112 int ipdown_main(int argc, char **argv)
114 int proto;
116 _dprintf("%s: begin\n", __FUNCTION__);
118 if (!wait_action_idle(10)) return -1;
120 stop_ddns(); // avoid to trigger DOD
121 stop_ntpc();
123 unlink("/tmp/ppp/link");
125 proto = get_wan_proto();
126 if (proto == WP_L2TP) {
127 /* clear dns from the resolv.conf */
128 nvram_set("wan_get_dns","");
129 dns_to_resolv();
131 route_del(nvram_safe_get("wan_ifname"), 0, nvram_safe_get("l2tp_server_ip"),
132 nvram_safe_get("wan_gateway_buf"), "255.255.255.255"); // fixed routing problem in Israel by kanki
134 // Restore the default gateway for WAN interface
135 nvram_set("wan_gateway", nvram_safe_get("wan_gateway_buf"));
137 // Set default route to gateway if specified
138 route_add(nvram_safe_get("wan_ifname"), 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");
141 if ((nvram_match("ppp_demand", "1")) && ((proto == WP_PPTP) || (proto == WP_L2TP))) {
142 killall("listen", SIGKILL);
143 eval("listen", nvram_safe_get("lan_ifname"));
146 _dprintf("%s: end\n", __FUNCTION__);
147 return 1;
150 int pppevent_main(int argc, char **argv)
152 int i;
154 _dprintf("%s: begin\n", __FUNCTION__);
156 for (i = 1; i < argc; ++i) {
157 _dprintf("%s: arg%d=%s\n", __FUNCTION__, i, argv[i]);
158 if (strcmp(argv[i], "-t") == 0) {
159 if (++i >= argc) return 1;
160 if ((strcmp(argv[i], "PAP_AUTH_FAIL") == 0) || (strcmp(argv[i], "CHAP_AUTH_FAIL") == 0)) {
161 f_write_string("/tmp/ppp/log", argv[i], 0, 0);
162 notice_set("wan", "Authentication failed"); // !!!
163 return 0;
168 _dprintf("%s: end\n", __FUNCTION__);
169 return 1;
172 int set_pppoepid_main(int argc, char **argv)
174 if (argc < 2) return 0;
176 _dprintf("%s: num=%s\n", __FUNCTION__, argv[1]);
178 if (atoi(argv[1]) != 0) return 0;
180 nvram_set("pppoe_pid0", getenv("PPPD_PID"));
181 nvram_set("pppoe_ifname0", getenv("IFNAME"));
182 nvram_set("wan_iface", getenv("IFNAME"));
184 _dprintf("IFNAME=%s DEVICE=%s\n", getenv("IFNAME"), getenv("DEVICE"));
185 return 0;
188 int pppoe_down_main(int argc, char **argv)
190 if (argc < 2) return 0;
192 _dprintf("%s: num=%s\n", __FUNCTION__, argv[1]);
194 if (atoi(argv[1]) != 0) return 0;
196 if ((nvram_match("ppp_demand", "1")) && (nvram_match("action_service", ""))) {
197 stop_singe_pppoe(0);
198 start_pppoe(0);
200 stop_dnsmasq();
201 dns_to_resolv();
202 start_dnsmasq();
204 return 0;