usbmodeswitch: Updated to v.1.2.6 from shibby's branch.
[tomato.git] / release / src / router / rc / ppp.c
blob62fbc994f806368c8d1d7cb495d19b456b5e28cf
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"
35 #include <stdlib.h>
37 #include <sys/ioctl.h>
40 int ipup_main(int argc, char **argv)
42 char *wan_ifname;
43 char *value;
44 char buf[256];
45 const char *p;
47 TRACE_PT("begin\n");
49 killall("listen", SIGKILL);
51 if (!wait_action_idle(10)) return -1;
53 wan_ifname = safe_getenv("IFNAME");
54 if ((!wan_ifname) || (!*wan_ifname)) return -1;
55 nvram_set("wan_iface", wan_ifname); // ppp#
57 // ipup receives six arguments:
58 // <interface name> <tty device> <speed> <local IP address> <remote IP address> <ipparam>
59 // ppp1 vlan1 0 71.135.98.32 151.164.184.87 0
61 f_write_string("/tmp/ppp/link", argv[1], 0, 0);
63 if ((p = getenv("IPREMOTE"))) {
64 nvram_set("wan_gateway_get", p);
65 TRACE_PT("IPREMOTE=%s\n", p);
68 if ((value = getenv("IPLOCAL"))) {
69 _dprintf("IPLOCAL=%s\n", value);
71 switch (get_wan_proto()) {
72 case WP_PPPOE:
73 case WP_PPP3G:
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 case WP_L2TP:
80 nvram_set("wan_ipaddr_buf", nvram_safe_get("ppp_get_ip"));
81 break;
84 if (!nvram_match("ppp_get_ip", value)) {
85 ifconfig(wan_ifname, IFUP, "0.0.0.0", NULL);
86 nvram_set("ppp_get_ip", value);
89 _ifconfig(wan_ifname, IFUP, value, "255.255.255.255", (p && (*p)) ? p : NULL);
92 buf[0] = 0;
93 if ((p = getenv("DNS1")) != NULL) strlcpy(buf, p, sizeof(buf));
94 if ((p = getenv("DNS2")) != NULL) {
95 if (buf[0]) strlcat(buf, " ", sizeof(buf));
96 strlcat(buf, p, sizeof(buf));
98 nvram_set("wan_get_dns", buf);
99 TRACE_PT("DNS=%s\n", buf);
101 if ((value = getenv("AC_NAME"))) nvram_set("ppp_get_ac", value);
102 if ((value = getenv("SRV_NAME"))) nvram_set("ppp_get_srv", value);
103 if ((value = getenv("MTU"))) nvram_set("wan_run_mtu", value);
105 start_wan_done(wan_ifname);
107 TRACE_PT("end\n");
108 return 0;
111 int ipdown_main(int argc, char **argv)
113 int proto;
115 TRACE_PT("begin\n");
117 if (!wait_action_idle(10)) return -1;
119 stop_ddns(); // avoid to trigger DOD
120 stop_ntpc();
122 unlink("/tmp/ppp/link");
124 proto = get_wan_proto();
125 if (proto == WP_L2TP || proto == WP_PPTP) {
126 /* clear dns from the resolv.conf */
127 nvram_set("wan_get_dns","");
128 dns_to_resolv();
130 if (proto == WP_L2TP) {
131 route_del(nvram_safe_get("wan_ifname"), 0, nvram_safe_get("l2tp_server_ip"),
132 nvram_safe_get("wan_gateway"), "255.255.255.255"); // fixed routing problem in Israel by kanki
135 // Restore the default gateway for WAN interface
136 nvram_set("wan_gateway_get", nvram_safe_get("wan_gateway"));
138 // Set default route to gateway if specified
139 route_del(nvram_safe_get("wan_ifname"), 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");
140 route_add(nvram_safe_get("wan_ifname"), 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0");
143 if (nvram_get_int("ppp_demand")) {
144 killall("listen", SIGKILL);
145 eval("listen", nvram_safe_get("lan_ifname"));
148 TRACE_PT("end\n");
149 return 1;
152 #ifdef TCONFIG_IPV6
153 int ip6up_main(int argc, char **argv)
156 char *wan_ifname;
157 char *value;
159 TRACE_PT("begin\n");
160 if (!wait_action_idle(10)) return -1;
162 wan_ifname = safe_getenv("IFNAME");
163 if ((!wan_ifname) || (!*wan_ifname)) return -1;
165 value = getenv("LLREMOTE");
167 // ???
169 start_wan6_done(wan_ifname);
170 TRACE_PT("end\n");
172 return 0;
175 int ip6down_main(int argc, char **argv)
178 TRACE_PT("begin\n");
179 if (!wait_action_idle(10)) return -1;
181 // ???
183 TRACE_PT("end\n");
185 return 1;
187 #endif // IPV6
189 int pppevent_main(int argc, char **argv)
191 int i;
193 TRACE_PT("begin\n");
195 for (i = 1; i < argc; ++i) {
196 TRACE_PT("arg%d=%s\n", i, argv[i]);
197 if (strcmp(argv[i], "-t") == 0) {
198 if (++i >= argc) return 1;
199 if ((strcmp(argv[i], "PAP_AUTH_FAIL") == 0) || (strcmp(argv[i], "CHAP_AUTH_FAIL") == 0)) {
200 f_write_string("/tmp/ppp/log", argv[i], 0, 0);
201 return 0;
203 if ((strcmp(argv[i], "PADO_TIMEOUT") == 0) || (strcmp(argv[i], "PADS_TIMEOUT") == 0)) {
204 f_write_string("/tmp/ppp/log", argv[i], 0, 0);
205 return 0;
210 TRACE_PT("end\n");
211 return 1;
214 #if 0
215 int set_pppoepid_main(int argc, char **argv)
217 if (argc < 2) return 0;
219 TRACE_PT("num=%s\n", argv[1]);
221 if (atoi(argv[1]) != 0) return 0;
223 nvram_set("pppoe_pid0", getenv("PPPD_PID"));
224 nvram_set("pppoe_ifname0", getenv("IFNAME"));
225 nvram_set("wan_iface", getenv("IFNAME"));
227 TRACE_PT("IFNAME=%s DEVICE=%s\n", getenv("IFNAME"), getenv("DEVICE"));
228 return 0;
231 int pppoe_down_main(int argc, char **argv)
233 if (argc < 2) return 0;
235 TRACE_PT("num=%s\n", argv[1]);
237 if (atoi(argv[1]) != 0) return 0;
239 if ((nvram_get_int("ppp_demand")) && (nvram_match("action_service", ""))) {
240 stop_singe_pppoe(0);
241 start_pppoe(0);
243 stop_dnsmasq();
244 dns_to_resolv();
245 start_dnsmasq();
247 return 0;
249 #endif // 0