3G Modem: Add support for ZTE MF195
[tomato.git] / release / src / router / rc / wan.c
blob0845cdfaa1969adabff1344f7e8fd7bba0b6c341
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!
13 THIS SOFTWARE IS OFFERED "AS IS", AND CYBERTAN GRANTS NO WARRANTIES OF ANY
14 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. CYBERTAN
15 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
16 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.
32 Modified for Tomato Firmware
33 Portions, Copyright (C) 2006-2009 Jonathan Zarate
37 #include "rc.h"
39 #include <sys/ioctl.h>
40 #include <arpa/inet.h>
41 #include <sys/sysinfo.h>
42 #include <time.h>
43 #include <bcmdevs.h>
45 static const char ppp_linkfile[] = "/tmp/ppp/link";
46 static const char ppp_optfile[] = "/tmp/ppp/wanoptions";
47 #ifdef LINUX26
48 #ifdef TCONFIG_USB
49 static const char ppp3g_chatfile[] = "/tmp/ppp/connect.chat";
50 #endif
51 #endif
53 static void make_secrets(void)
55 FILE *f;
56 char *user;
57 char *pass;
59 user = nvram_safe_get("ppp_username");
60 pass = nvram_safe_get("ppp_passwd");
61 if ((f = fopen("/tmp/ppp/pap-secrets", "w")) != NULL) {
62 fprintf(f, "\"%s\" * \"%s\" *\n", user, pass);
63 fclose(f);
65 chmod("/tmp/ppp/pap-secrets", 0600);
67 if ((f = fopen("/tmp/ppp/chap-secrets", "w")) != NULL) {
68 fprintf(f, "\"%s\" * \"%s\" *\n", user, pass);
69 fclose(f);
71 chmod("/tmp/ppp/chap-secrets", 0600);
74 // -----------------------------------------------------------------------------
76 static int config_pppd(int wan_proto, int num)
78 TRACE_PT("begin\n");
80 FILE *fp;
81 FILE *cfp;
82 char *p;
83 int demand;
85 mkdir("/tmp/ppp", 0777);
86 symlink("/sbin/rc", "/tmp/ppp/ip-up");
87 symlink("/sbin/rc", "/tmp/ppp/ip-down");
88 #ifdef TCONFIG_IPV6
89 symlink("/sbin/rc", "/tmp/ppp/ipv6-up");
90 symlink("/sbin/rc", "/tmp/ppp/ipv6-down");
91 #endif
92 symlink("/dev/null", "/tmp/ppp/connect-errors");
94 demand = nvram_get_int("ppp_demand");
96 // Generate options file
97 if ((fp = fopen(ppp_optfile, "w")) == NULL) {
98 perror(ppp_optfile);
99 return -1;
102 #ifdef LINUX26
103 #ifdef TCONFIG_USB
104 if (nvram_match("wan_proto", "ppp3g") ) {
105 fprintf(fp,
106 "/dev/%s\n"
107 "460800\n"
108 "connect \"/usr/sbin/chat -V -t 60 -f %s\"\n"
109 "noipdefault\n"
110 "lock\n"
111 "crtscts\n"
112 "modem\n"
113 "ipcp-accept-local\n",
114 nvram_safe_get("modem_dev"),
115 ppp3g_chatfile);
117 if (strlen(nvram_get("ppp_username")) >0 )
118 fprintf(fp, "user '%s'\n", nvram_get("ppp_username"));
119 } else {
120 #endif
121 #endif
122 fprintf(fp,
123 "unit %d\n"
124 "user '%s'\n"
125 "lcp-echo-adaptive\n", // Suppress LCP echo-requests if traffic was received
126 num,
127 nvram_safe_get("ppp_username"));
128 #ifdef LINUX26
129 #ifdef TCONFIG_USB
131 #endif
132 #endif
134 fprintf(fp,
135 "defaultroute\n" // Add a default route to the system routing tables, using the peer as the gateway
136 "usepeerdns\n" // Ask the peer for up to 2 DNS server addresses
137 "default-asyncmap\n" // Disable asyncmap negotiation
138 "novj\n" // Disable Van Jacobson style TCP/IP header compression
139 "nobsdcomp\n" // Disable BSD-Compress compression
140 "nodeflate\n" // Disable Deflate compression
141 "noauth\n" // Do not authenticate peer
142 "refuse-eap\n" // Do not use eap
143 "maxfail 0\n" // Never give up
144 "lcp-echo-interval %d\n"// Interval between LCP echo-requests
145 "lcp-echo-failure %d\n" // Tolerance to unanswered echo-requests
146 "%s", // Debug
147 nvram_get_int("pppoe_lei") ? : 10,
148 nvram_get_int("pppoe_lef") ? : 5,
149 nvram_get_int("debug_ppp") ? "debug\n" : "");
151 #ifdef LINUX26
152 #ifdef TCONFIG_USB
153 if (nvram_match("wan_proto", "ppp3g") && nvram_match("modem_dev", "ttyACM0") ) {
154 //don`t write nopcomp and noaccomp options
155 } else {
156 #endif
157 #endif
158 fprintf(fp,
159 "nopcomp\n" // Disable protocol field compression
160 "noaccomp\n" // Disable Address/Control compression
162 #ifdef LINUX26
163 #ifdef TCONFIG_USB
165 #endif
166 #endif
169 if (wan_proto != WP_L2TP) {
170 fprintf(fp,
171 "persist\n"
172 "holdoff %d\n",
173 demand ? 30 : (nvram_get_int("ppp_redialperiod") ? : 30));
176 switch (wan_proto) {
177 case WP_PPTP:
178 fprintf(fp,
179 "plugin pptp.so\n"
180 "pptp_server %s\n"
181 "nomppe-stateful\n"
182 "mtu %d\n",
183 nvram_safe_get("pptp_server_ip"),
184 nvram_get_int("mtu_enable") ? nvram_get_int("wan_mtu") : 1400);
185 break;
186 case WP_PPPOE:
187 fprintf(fp,
188 "password '%s'\n"
189 "plugin rp-pppoe.so\n"
190 "nomppe nomppc\n"
191 "nic-%s\n"
192 "mru %d mtu %d\n",
193 nvram_safe_get("ppp_passwd"),
194 nvram_safe_get("wan_ifname"),
195 nvram_get_int("wan_mtu"), nvram_get_int("wan_mtu"));
196 if (((p = nvram_get("ppp_service")) != NULL) && (*p)) {
197 fprintf(fp, "rp_pppoe_service '%s'\n", p);
199 if (((p = nvram_get("ppp_ac")) != NULL) && (*p)) {
200 fprintf(fp, "rp_pppoe_ac '%s'\n", p);
202 if (nvram_match("ppp_mlppp", "1")) {
203 fprintf(fp, "mp\n");
206 break;
207 #ifdef LINUX26
208 #ifdef TCONFIG_USB
209 case WP_PPP3G:
210 if ((cfp = fopen(ppp3g_chatfile, "w")) == NULL) {
211 perror(ppp3g_chatfile);
212 return -1;
214 fprintf(cfp,
215 "ABORT \"NO CARRIER\"\n"
216 "ABORT \"NO DIALTONE\"\n"
217 "ABORT \"NO ERROR\"\n"
218 "ABORT \"NO ANSWER\"\n"
219 "ABORT \"BUSY\"\n"
220 "REPORT CONNECT\n"
221 "\"\" \"AT\"\n");
222 /* moved to switch3g script
223 if (strlen(nvram_get("modem_pin")) >0 ) {
224 fprintf(cfp,
225 "TIMEOUT 60\n"
226 "OK \"AT+CPIN=%s\"\n"
227 "TIMEOUT 10\n",
228 nvram_get("modem_pin"));
231 fprintf(cfp,
232 "OK \"AT&FE0V1X1&D2&C1S0=0\"\n"
233 "OK \"AT\"\n"
234 "OK \"ATS0=0\"\n"
235 "OK \"AT\"\n"
236 "OK \"AT&FE0V1X1&D2&C1S0=0\"\n"
237 "OK \"AT\"\n"
238 "OK 'AT+CGDCONT=1,\"IP\",\"%s\"'\n"
239 "OK \"ATDT%s\"\n"
240 "CONNECT \c\n",
241 nvram_safe_get("modem_apn"),
242 nvram_safe_get("modem_init")
244 fclose(cfp);
247 if (nvram_match("usb_3g", "1")) {
248 // clear old gateway
249 if (strlen(nvram_get("wan_gateway")) >0 ) {
250 nvram_set("wan_gateway", "");
253 // detect 3G Modem
254 xstart("switch3g");
256 break;
257 #endif
258 #endif
259 case WP_L2TP:
260 fprintf(fp, "nomppe nomppc\n");
261 if (nvram_get_int("mtu_enable"))
262 fprintf(fp, "mtu %d\n", nvram_get_int("wan_mtu"));
263 break;
266 if (demand) {
267 // demand mode
268 fprintf(fp,
269 "demand\n" // Dial on demand
270 "idle %d\n"
271 "ipcp-accept-remote\n"
272 "ipcp-accept-local\n"
273 "noipdefault\n" // Disables the default behaviour when no local IP address is specified
274 "ktune\n", // Set /proc/sys/net/ipv4/ip_dynaddr to 1 in demand mode if the local address changes
275 nvram_get_int("ppp_idletime") * 60);
278 #ifdef TCONFIG_IPV6
279 switch (get_ipv6_service()) {
280 case IPV6_NATIVE:
281 case IPV6_NATIVE_DHCP:
282 fprintf(fp, "+ipv6\n");
283 break;
285 #endif
286 // User specific options
287 fprintf(fp, "%s\n", nvram_safe_get("ppp_custom"));
289 fclose(fp);
290 make_secrets();
292 TRACE_PT("end\n");
293 return 0;
296 static void stop_ppp(void)
298 TRACE_PT("begin\n");
300 unlink(ppp_linkfile);
302 killall_tk("ip-up");
303 killall_tk("ip-down");
304 #ifdef TCONFIG_IPV6
305 killall_tk("ipv6-up");
306 killall_tk("ipv6-down");
307 #endif
308 killall_tk("xl2tpd");
309 killall_tk("pppd");
310 killall_tk("listen");
312 TRACE_PT("end\n");
315 static void run_pppd(void)
317 eval("pppd", "file", ppp_optfile);
319 if (nvram_get_int("ppp_demand")) {
320 // demand mode
322 Fixed issue id 7887(or 7787):
323 When DUT is PPTP Connect on Demand mode, it couldn't be trigger from LAN.
325 stop_dnsmasq();
326 dns_to_resolv();
327 start_dnsmasq();
329 // Trigger Connect On Demand if user ping pptp server
330 eval("listen", nvram_safe_get("lan_ifname"));
332 else {
333 // keepalive mode
334 start_redial();
338 // -----------------------------------------------------------------------------
340 inline void stop_pptp(void)
342 stop_ppp();
345 void start_pptp(int mode)
347 TRACE_PT("begin\n");
349 if (!using_dhcpc()) stop_dhcpc();
350 stop_pptp();
352 if (config_pppd(WP_PPTP, 0) != 0)
353 return;
355 run_pppd();
357 TRACE_PT("end\n");
360 // -----------------------------------------------------------------------------
362 void preset_wan(char *ifname, char *gw, char *netmask)
364 int i;
366 /* Delete all default routes */
367 route_del(ifname, 0, NULL, NULL, NULL);
369 /* try adding a route to gateway first */
370 route_add(ifname, 0, gw, NULL, "255.255.255.255");
372 /* Set default route to gateway if specified */
373 i = 5;
374 while ((route_add(ifname, 1, "0.0.0.0", gw, "0.0.0.0") == 1) && (i--)) {
375 sleep(1);
377 _dprintf("set default gateway=%s n=%d\n", gw, i);
379 /* Add routes to dns servers as well for demand ppp to work */
380 char word[100], *next;
381 in_addr_t mask = inet_addr(netmask);
382 foreach(word, nvram_safe_get("wan_get_dns"), next) {
383 if ((inet_addr(word) & mask) != (inet_addr(nvram_safe_get("wan_ipaddr")) & mask))
384 route_add(ifname, 0, word, gw, "255.255.255.255");
387 dns_to_resolv();
388 start_dnsmasq();
389 sleep(1);
390 start_firewall();
393 // -----------------------------------------------------------------------------
396 // Get the IP, Subnetmask, Geteway from WAN interface and set nvram
397 static void start_tmp_ppp(int num, char *ifname)
399 int timeout;
400 struct ifreq ifr;
401 int s;
403 TRACE_PT("begin: num=%d\n", num);
405 if (num != 0) return;
407 // Wait for ppp0 to be created
408 timeout = 15;
409 while ((ifconfig(ifname, IFUP, NULL, NULL) != 0) && (timeout-- > 0)) {
410 sleep(1);
411 _dprintf("[%d] waiting for %s %d...\n", __LINE__, ifname, timeout);
414 if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) return;
415 strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
417 // Set temporary IP address
418 timeout = 3;
419 while (ioctl(s, SIOCGIFADDR, &ifr) && timeout--){
420 _dprintf("[%d] waiting for %s...\n", __LINE__, ifname);
421 sleep(1);
423 nvram_set("wan_ipaddr", inet_ntoa(sin_addr(&(ifr.ifr_addr))));
424 nvram_set("wan_netmask", "255.255.255.255");
426 // Set temporary P-t-P address
427 timeout = 3;
428 while (ioctl(s, SIOCGIFDSTADDR, &ifr) && timeout--){
429 _dprintf("[%d] waiting for %s...\n", __LINE__, ifname);
430 sleep(1);
432 nvram_set("wan_gateway", inet_ntoa(sin_addr(&(ifr.ifr_dstaddr))));
434 close(s);
436 start_wan_done(ifname);
437 TRACE_PT("end\n");
440 void start_pppoe(int num)
442 char ifname[8];
444 TRACE_PT("begin pppoe_num=%d\n", num);
446 if (num != 0) return;
448 stop_pppoe();
450 snprintf(ifname, sizeof(ifname), "ppp%d", num);
452 #ifdef LINUX26
453 #ifdef TCONFIG_USB
454 if (nvram_match( "wan_proto", "ppp3g") ) {
455 if (config_pppd(WP_PPP3G, num) != 0)
456 return;
457 } else {
458 #endif
459 #endif
460 if (config_pppd(WP_PPPOE, num) != 0)
461 return;
462 #ifdef LINUX26
463 #ifdef TCONFIG_USB
465 #endif
466 #endif
467 run_pppd();
469 if (nvram_get_int("ppp_demand"))
470 start_tmp_ppp(num, ifname);
471 else
472 ifconfig(ifname, IFUP, NULL, NULL);
474 TRACE_PT("end\n");
477 void stop_pppoe(void)
479 stop_ppp();
484 #if 0
485 void stop_singe_pppoe(int num)
487 _dprintf("%s pppoe_num=%d\n", __FUNCTION__, num);
489 int i;
491 if (num != 0) return;
493 i = nvram_get_int("pppoe_pid0");
494 if ((i > 1) && (kill(i, SIGTERM) == 0)) {
495 do {
496 sleep(2);
497 } while (kill(i, SIGKILL) == 0);
500 unlink(ppp_linkfile);
501 nvram_unset("pppoe_ifname0");
503 nvram_set("wan_get_dns", "");
504 clear_resolv();
506 #endif
508 // -----------------------------------------------------------------------------
510 inline void stop_l2tp(void)
512 stop_ppp();
515 void start_l2tp(void)
517 TRACE_PT("begin\n");
519 FILE *fp;
520 int demand;
522 stop_l2tp();
524 if (config_pppd(WP_L2TP, 0) != 0)
525 return;
527 demand = nvram_get_int("ppp_demand");
529 /* Generate XL2TPD configuration file */
530 if ((fp = fopen("/etc/xl2tpd.conf", "w")) == NULL)
531 return;
532 fprintf(fp,
533 "[global]\n"
534 "access control = no\n"
535 "port = 1701\n"
536 "[lac l2tp]\n"
537 "lns = %s\n"
538 "tx bps = 100000000\n"
539 "pppoptfile = %s\n"
540 "redial = yes\n"
541 "max redials = 32767\n"
542 "redial timeout = %d\n"
543 "ppp debug = %s\n",
544 nvram_safe_get("l2tp_server_ip"),
545 ppp_optfile,
546 demand ? 30 : (nvram_get_int("ppp_redialperiod") ? : 30),
547 nvram_get_int("debug_ppp") ? "yes" : "no");
548 fclose(fp);
550 enable_ip_forward();
552 eval("xl2tpd");
554 if (demand) {
555 eval("listen", nvram_safe_get("lan_ifname"));
557 else {
558 force_to_dial();
559 start_redial();
562 TRACE_PT("end\n");
565 // -----------------------------------------------------------------------------
567 char *wan_gateway(void)
569 char *gw = nvram_safe_get("wan_gateway_get");
570 if ((*gw == 0) || (strcmp(gw, "0.0.0.0") == 0))
571 gw = nvram_safe_get("wan_gateway");
572 return gw;
575 // -----------------------------------------------------------------------------
577 // trigger connect on demand
578 void force_to_dial(void)
580 TRACE_PT("begin\n");
582 sleep(1);
583 switch (get_wan_proto()) {
584 case WP_L2TP:
585 f_write_string("/var/run/l2tp-control", "c l2tp", 0, 0);
586 break;
587 case WP_PPTP:
588 eval("ping", "-c", "2", "10.112.112.112");
589 break;
590 case WP_DISABLED:
591 case WP_STATIC:
592 break;
593 default:
594 eval("ping", "-c", "2", wan_gateway());
595 break;
598 TRACE_PT("end\n");
601 // -----------------------------------------------------------------------------
603 static void _do_wan_routes(char *ifname, char *nvname, int metric, int add)
605 char *routes, *tmp;
606 int bits;
607 struct in_addr mask;
608 char netmask[16];
610 // IP[/MASK] ROUTER IP2[/MASK2] ROUTER2 ...
611 tmp = routes = strdup(nvram_safe_get(nvname));
612 while (tmp && *tmp) {
613 char *ipaddr, *gateway, *nmask;
615 ipaddr = nmask = strsep(&tmp, " ");
616 strcpy(netmask, "255.255.255.255");
618 if (nmask) {
619 ipaddr = strsep(&nmask, "/");
620 if (nmask && *nmask) {
621 bits = strtol(nmask, &nmask, 10);
622 if (bits >= 1 && bits <= 32) {
623 mask.s_addr = htonl(0xffffffff << (32 - bits));
624 strcpy(netmask, inet_ntoa(mask));
628 gateway = strsep(&tmp, " ");
630 if (gateway && *gateway) {
631 if (add)
632 route_add(ifname, metric, ipaddr, gateway, netmask);
633 else
634 route_del(ifname, metric, ipaddr, gateway, netmask);
637 free(routes);
640 void do_wan_routes(char *ifname, int metric, int add)
642 if (nvram_get_int("dhcp_routes")) {
643 // Static Routes: IP ROUTER IP2 ROUTER2 ...
644 // Classless Static Routes: IP/MASK ROUTER IP2/MASK2 ROUTER2 ...
645 _do_wan_routes(ifname, "wan_routes1", metric, add);
646 _do_wan_routes(ifname, "wan_routes2", metric, add);
650 // -----------------------------------------------------------------------------
652 const char wan_connecting[] = "/var/lib/misc/wan.connecting";
654 static int is_sta(int idx, int unit, int subunit, void *param)
656 char **p = param;
658 if (nvram_match(wl_nvname("mode", unit, subunit), "sta")) {
659 *p = nvram_safe_get(wl_nvname("ifname", unit, subunit));
660 return 1;
662 return 0;
665 void start_wan(int mode)
667 int wan_proto;
668 char *wan_ifname;
669 char *p = NULL;
670 struct ifreq ifr;
671 int sd;
672 int max;
673 int mtu;
674 char buf[128];
675 int vid;
676 int vid_map;
677 int vlan0tag;
679 TRACE_PT("begin\n");
681 f_write(wan_connecting, NULL, 0, 0, 0);
685 if (!foreach_wif(1, &p, is_sta)) {
686 p = nvram_safe_get("wan_ifnameX");
687 /* vlan ID mapping */
688 if (sscanf(p, "vlan%d", &vid) == 1) {
689 vlan0tag = nvram_get_int("vlan0tag");
690 snprintf(buf, sizeof(buf), "vlan%dvid", vid);
691 vid_map = nvram_get_int(buf);
692 if ((vid_map < 1) || (vid_map > 4094)) vid_map = vlan0tag | vid;
693 snprintf(buf, sizeof(buf), "vlan%d", vid_map);
694 p = buf;
696 set_mac(p, "mac_wan", 1);
698 nvram_set("wan_ifname", p);
699 nvram_set("wan_ifnames", p);
703 wan_ifname = nvram_safe_get("wan_ifname");
704 if (wan_ifname[0] == 0) {
705 wan_ifname = "none";
706 nvram_set("wan_ifname", wan_ifname);
709 if (strcmp(wan_ifname, "none") == 0) {
710 nvram_set("wan_proto", "disabled");
711 syslog(LOG_INFO, "No WAN");
716 wan_proto = get_wan_proto();
718 // set the default gateway for WAN interface
719 nvram_set("wan_gateway_get", nvram_safe_get("wan_gateway"));
721 if (wan_proto == WP_DISABLED) {
722 start_wan_done(wan_ifname);
723 return;
726 if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
727 perror("socket");
728 return;
731 // MTU
733 switch (wan_proto) {
734 case WP_PPPOE:
735 case WP_PPP3G:
736 max = 1492;
737 break;
738 case WP_PPTP:
739 case WP_L2TP:
740 max = 1460;
741 break;
742 default:
743 max = 1500;
744 break;
746 if (nvram_match("mtu_enable", "0")) {
747 mtu = max;
749 else {
750 mtu = nvram_get_int("wan_mtu");
751 if (mtu > max) mtu = max;
752 else if (mtu < 576) mtu = 576;
754 sprintf(buf, "%d", mtu);
755 nvram_set("wan_mtu", buf);
756 nvram_set("wan_run_mtu", buf);
758 // 43011: zhijian 2006-12-25 for CD-Router v3.4 mtu bug of PPTP connection mode
759 /* if (wan_proto == WP_PPTP) {
760 mtu += 40;
761 } */ // commented out; checkme -- zzz
763 if (wan_proto != WP_PPTP && wan_proto != WP_L2TP && wan_proto != WP_PPPOE) {
764 // Don't set the MTU on the port for PPP connections, it will be set on the link instead
765 ifr.ifr_mtu = mtu;
766 strcpy(ifr.ifr_name, wan_ifname);
767 ioctl(sd, SIOCSIFMTU, &ifr);
772 ifconfig(wan_ifname, IFUP, NULL, NULL);
774 start_firewall();
776 set_host_domain_name();
778 switch (wan_proto) {
779 case WP_PPPOE:
780 case WP_PPP3G:
781 start_pppoe(PPPOE0);
782 break;
783 case WP_DHCP:
784 case WP_L2TP:
785 case WP_PPTP:
786 if (using_dhcpc()) {
787 stop_dhcpc();
788 start_dhcpc();
790 else if (wan_proto != WP_DHCP) {
791 ifconfig(wan_ifname, IFUP, "0.0.0.0", NULL);
792 ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));
794 p = nvram_safe_get("wan_gateway");
795 if ((*p != 0) && (strcmp(p, "0.0.0.0") != 0))
796 preset_wan(wan_ifname, p, nvram_safe_get("wan_netmask"));
798 switch (wan_proto) {
799 case WP_PPTP:
800 start_pptp(mode);
801 break;
802 case WP_L2TP:
803 start_l2tp();
804 break;
807 break;
808 default: // static
809 nvram_set("wan_iface", wan_ifname);
810 ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));
812 int r = 10;
813 while ((!check_wanup()) && (r-- > 0)) {
814 sleep(1);
817 start_wan_done(wan_ifname);
818 break;
821 // Get current WAN hardware address
822 strlcpy(ifr.ifr_name, wan_ifname, IFNAMSIZ);
823 if (ioctl(sd, SIOCGIFHWADDR, &ifr) == 0) {
824 nvram_set("wan_hwaddr", ether_etoa(ifr.ifr_hwaddr.sa_data, buf));
827 /* Set initial QoS mode again now that WAN port is ready. */
828 set_et_qos_mode(sd);
830 close(sd);
832 enable_ip_forward();
834 led(LED_DIAG, 0); // for 4712, 5325E (?)
835 led(LED_DMZ, nvram_match("dmz_enable", "1"));
837 TRACE_PT("end\n");
840 #ifdef TCONFIG_IPV6
841 void start_wan6_done(const char *wan_ifname)
843 struct in_addr addr4;
844 struct in6_addr addr;
845 static char addr6[INET6_ADDRSTRLEN];
847 int service = get_ipv6_service();
849 if (service != IPV6_DISABLED) {
850 if ((nvram_get_int("ipv6_accept_ra") & 1) != 0)
851 accept_ra(wan_ifname);
854 switch (service) {
855 case IPV6_NATIVE:
856 eval("ip", "route", "add", "::/0", "dev", (char *)wan_ifname, "metric", "2048");
857 break;
858 case IPV6_NATIVE_DHCP:
859 eval("ip", "route", "add", "::/0", "dev", (char *)wan_ifname);
860 stop_dhcp6c();
861 start_dhcp6c();
862 break;
863 case IPV6_ANYCAST_6TO4:
864 case IPV6_6IN4:
865 stop_ipv6_tunnel();
866 if (service == IPV6_ANYCAST_6TO4) {
867 addr4.s_addr = 0;
868 memset(&addr, 0, sizeof(addr));
869 inet_aton(get_wanip(), &addr4);
870 addr.s6_addr16[0] = htons(0x2002);
871 ipv6_mapaddr4(&addr, 16, &addr4, 0);
872 addr.s6_addr16[3] = htons(0x0001);
873 inet_ntop(AF_INET6, &addr, addr6, sizeof(addr6));
874 nvram_set("ipv6_prefix", addr6);
876 start_ipv6_tunnel();
877 // FIXME: give it a few seconds for DAD completion
878 sleep(2);
879 break;
880 case IPV6_6RD:
881 case IPV6_6RD_DHCP:
882 stop_6rd_tunnel();
883 start_6rd_tunnel();
884 // FIXME2?: give it a few seconds for DAD completion
885 sleep(2);
886 break;
889 #endif
891 // ppp_demand: 0=keep alive, 1=connect on demand (run 'listen')
892 // wan_ifname: vlan1
893 // wan_iface: ppp# (PPPOE, PPP3G, PPTP, L2TP), vlan1 (DHCP, HB, Static)
895 void start_wan_done(char *wan_ifname)
897 int proto;
898 int n;
899 char *gw;
900 struct sysinfo si;
901 int wanup;
903 TRACE_PT("begin wan_ifname=%s\n", wan_ifname);
905 sysinfo(&si);
906 f_write("/var/lib/misc/wantime", &si.uptime, sizeof(si.uptime), 0, 0);
908 proto = get_wan_proto();
910 // delete all default routes
911 route_del(wan_ifname, 0, NULL, NULL, NULL);
913 if (proto != WP_DISABLED) {
914 // set default route to gateway if specified
915 gw = wan_gateway();
916 #if 0
917 if (proto == WP_PPTP && !using_dhcpc()) {
918 // For PPTP protocol, we must use ppp_get_ip as gateway, not pptp_server_ip (why ??)
919 if (*gw == 0 || strcmp(gw, "0.0.0.0") == 0) gw = nvram_safe_get("ppp_get_ip");
921 #endif
922 if ((*gw != 0) && (strcmp(gw, "0.0.0.0") != 0)) {
923 if (proto == WP_DHCP || proto == WP_STATIC) {
924 // possibly gateway is over the bridge, try adding a route to gateway first
925 route_add(wan_ifname, 0, gw, NULL, "255.255.255.255");
928 n = 5;
929 while ((route_add(wan_ifname, 0, "0.0.0.0", gw, "0.0.0.0") == 1) && (n--)) {
930 sleep(1);
932 _dprintf("set default gateway=%s n=%d\n", gw, n);
934 // hack: avoid routing cycles, when both peer and server have the same IP
935 if (proto == WP_PPTP || proto == WP_L2TP) {
936 // delete gateway route as it's no longer needed
937 route_del(wan_ifname, 0, gw, "0.0.0.0", "255.255.255.255");
941 #ifdef THREE_ARP_GRATUATOUS_SUPPORT // from 43011; checkme; commented-out -- zzz
943 // 43011: Alpha add to send Gratuitous ARP when wan_proto is Static IP 2007-04-09
944 if (proto == WP_STATIC)
946 int ifindex;
947 u_int32_t wan_ip;
948 unsigned char wan_mac[6];
950 if (read_iface(nvram_safe_get("wan_iface"), &ifindex, &wan_ip, wan_mac) >= 0)
951 arpping(wan_ip, wan_ip, wan_mac, nvram_safe_get("wan_iface"));
954 #endif
956 if (proto == WP_PPTP || proto == WP_L2TP) {
957 route_del(nvram_safe_get("wan_iface"), 0, nvram_safe_get("wan_gateway_get"), NULL, "255.255.255.255");
958 route_add(nvram_safe_get("wan_iface"), 0, nvram_safe_get("ppp_get_ip"), NULL, "255.255.255.255");
960 if (proto == WP_L2TP) {
961 route_add(nvram_safe_get("wan_ifname"), 0, nvram_safe_get("l2tp_server_ip"), nvram_safe_get("wan_gateway"), "255.255.255.255"); // fixed routing problem in Israel by kanki
965 dns_to_resolv();
966 start_dnsmasq();
968 start_firewall();
969 start_qos();
971 do_static_routes(1);
972 // and routes supplied via DHCP
973 do_wan_routes(using_dhcpc() ? nvram_safe_get("wan_ifname") : wan_ifname, 0, 1);
975 stop_zebra();
976 start_zebra();
978 wanup = check_wanup();
980 if ((wanup) || (time(0) < Y2K)) {
981 stop_ntpc();
982 start_ntpc();
985 if ((wanup) || (proto == WP_DISABLED)) {
986 stop_ddns();
987 start_ddns();
988 stop_igmp_proxy();
989 stop_udpxy();
990 start_igmp_proxy();
991 start_udpxy();
994 #ifdef TCONFIG_IPV6
995 start_wan6_done(get_wan6face());
996 #endif
998 stop_upnp();
999 start_upnp();
1001 // restart httpd
1002 start_httpd();
1004 if (wanup) {
1005 SET_LED(GOT_IP);
1006 notice_set("wan", "");
1008 run_nvscript("script_wanup", NULL, 0);
1011 // We don't need STP after wireless led is lighted // no idea why... toggling it if necessary -- zzz
1012 if (check_hw_type() == HW_BCM4702) {
1013 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
1014 if (nvram_match("lan_stp", "1"))
1015 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "1");
1016 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0) {
1017 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "0");
1018 if (nvram_match("lan1_stp", "1"))
1019 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "1");
1021 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0) {
1022 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "0");
1023 if (nvram_match("lan2_stp", "1"))
1024 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "1");
1026 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0) {
1027 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "0");
1028 if (nvram_match("lan3_stp", "1"))
1029 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "1");
1033 if (wanup)
1034 start_vpn_eas();
1036 #ifdef TCONFIG_PPTPD
1037 if (wanup && nvram_get_int("pptp_client_enable"))
1038 start_pptp_client();
1039 #endif
1041 unlink(wan_connecting);
1043 new_qoslimit_start(); //!! RAF
1045 TRACE_PT("end\n");
1048 void stop_wan(void)
1050 char name[80];
1051 char *next;
1053 TRACE_PT("begin\n");
1055 #ifdef TCONFIG_PPTPD
1056 stop_pptp_client();
1057 stop_dnsmasq();
1058 dns_to_resolv();
1059 start_dnsmasq();
1060 #endif
1062 new_qoslimit_stop(); //!! RAF
1064 stop_qos();
1065 stop_upnp(); //!!TB - moved from stop_services()
1066 stop_firewall();
1067 stop_igmp_proxy();
1068 stop_udpxy();
1069 stop_ntpc();
1071 #ifdef TCONFIG_IPV6
1072 stop_ipv6_tunnel();
1073 stop_dhcp6c();
1074 nvram_set("ipv6_get_dns", "");
1075 #endif
1077 /* Kill any WAN client daemons or callbacks */
1078 stop_redial();
1079 stop_pppoe();
1080 stop_ppp();
1081 stop_dhcpc();
1082 stop_vpn_eas();
1083 #ifdef TCONFIG_PPTPD
1084 if (nvram_get_int("pptp_client_enable"))
1085 stop_pptp_client();
1086 #endif
1087 clear_resolv();
1088 nvram_set("wan_get_dns", "");
1090 /* Bring down WAN interfaces */
1091 foreach(name, nvram_safe_get("wan_ifnames"), next)
1092 ifconfig(name, 0, "0.0.0.0", NULL);
1094 SET_LED(RELEASE_IP);
1095 //notice_set("wan", "");
1096 unlink("/var/notice/wan");
1097 unlink(wan_connecting);
1099 TRACE_PT("end\n");