rc: wrong service name typo
[tomato.git] / release / src / router / rc / wan.c
blob5d5dc2e8476cc4d75f775ac394b09ebd5b19490c
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");
205 break;
206 #ifdef LINUX26
207 #ifdef TCONFIG_USB
208 case WP_PPP3G:
209 if ((cfp = fopen(ppp3g_chatfile, "w")) == NULL) {
210 perror(ppp3g_chatfile);
211 return -1;
213 fprintf(cfp,
214 "ABORT \"NO CARRIER\"\n"
215 "ABORT \"NO DIALTONE\"\n"
216 "ABORT \"NO ERROR\"\n"
217 "ABORT \"NO ANSWER\"\n"
218 "ABORT \"BUSY\"\n"
219 "REPORT CONNECT\n"
220 "\"\" \"AT\"\n");
221 /* moved to switch3g script
222 if (strlen(nvram_get("modem_pin")) >0 ) {
223 fprintf(cfp,
224 "TIMEOUT 60\n"
225 "OK \"AT+CPIN=%s\"\n"
226 "TIMEOUT 10\n",
227 nvram_get("modem_pin"));
230 fprintf(cfp,
231 "OK \"AT&FE0V1X1&D2&C1S0=0\"\n"
232 "OK \"AT\"\n"
233 "OK \"ATS0=0\"\n"
234 "OK \"AT\"\n"
235 "OK \"AT&FE0V1X1&D2&C1S0=0\"\n"
236 "OK \"AT\"\n"
237 "OK 'AT+CGDCONT=1,\"IP\",\"%s\"'\n"
238 "OK \"ATDT%s\"\n"
239 "CONNECT \\c\n",
240 nvram_safe_get("modem_apn"),
241 nvram_safe_get("modem_init")
243 fclose(cfp);
246 if (nvram_match("usb_3g", "1")) {
247 // clear old gateway
248 if (strlen(nvram_get("wan_gateway")) >0 ) {
249 nvram_set("wan_gateway", "");
252 // detect 3G Modem
253 xstart("switch3g");
255 break;
256 #endif
257 #endif
258 case WP_L2TP:
259 fprintf(fp, "nomppe nomppc\n");
260 if (nvram_get_int("mtu_enable"))
261 fprintf(fp, "mtu %d\n", nvram_get_int("wan_mtu"));
262 break;
265 if (demand) {
266 // demand mode
267 fprintf(fp,
268 "demand\n" // Dial on demand
269 "idle %d\n"
270 "ipcp-accept-remote\n"
271 "ipcp-accept-local\n"
272 "noipdefault\n" // Disables the default behaviour when no local IP address is specified
273 "ktune\n", // Set /proc/sys/net/ipv4/ip_dynaddr to 1 in demand mode if the local address changes
274 nvram_get_int("ppp_idletime") * 60);
277 #ifdef TCONFIG_IPV6
278 switch (get_ipv6_service()) {
279 case IPV6_NATIVE:
280 case IPV6_NATIVE_DHCP:
281 fprintf(fp, "+ipv6\n");
282 break;
284 #endif
285 // User specific options
286 fprintf(fp, "%s\n", nvram_safe_get("ppp_custom"));
288 fclose(fp);
289 make_secrets();
291 TRACE_PT("end\n");
292 return 0;
295 static void stop_ppp(void)
297 TRACE_PT("begin\n");
299 unlink(ppp_linkfile);
301 killall_tk("ip-up");
302 killall_tk("ip-down");
303 #ifdef TCONFIG_IPV6
304 killall_tk("ipv6-up");
305 killall_tk("ipv6-down");
306 #endif
307 killall_tk("xl2tpd");
308 killall_tk("pppd");
309 killall_tk("listen");
311 TRACE_PT("end\n");
314 static void run_pppd(void)
317 eval("pppd", "file", (char *)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 "tunnel rws = 8\n"
544 "ppp debug = %s\n"
545 "%s\n",
546 nvram_safe_get("l2tp_server_ip"),
547 ppp_optfile,
548 demand ? 30 : (nvram_get_int("ppp_redialperiod") ? : 30),
549 nvram_get_int("debug_ppp") ? "yes" : "no",
550 nvram_safe_get("xl2tpd_custom"));
551 fappend(fp, "/etc/xl2tpd.custom");
552 fclose(fp);
554 enable_ip_forward();
556 eval("xl2tpd");
558 if (demand) {
559 eval("listen", nvram_safe_get("lan_ifname"));
561 else {
562 force_to_dial();
563 start_redial();
566 TRACE_PT("end\n");
569 // -----------------------------------------------------------------------------
571 char *wan_gateway(void)
573 char *gw = nvram_safe_get("wan_gateway_get");
574 if ((*gw == 0) || (strcmp(gw, "0.0.0.0") == 0))
575 gw = nvram_safe_get("wan_gateway");
576 return gw;
579 // -----------------------------------------------------------------------------
581 // trigger connect on demand
582 void force_to_dial(void)
584 TRACE_PT("begin\n");
586 sleep(1);
587 switch (get_wan_proto()) {
588 case WP_L2TP:
589 f_write_string("/var/run/l2tp-control", "c l2tp", 0, 0);
590 break;
591 case WP_PPTP:
592 eval("ping", "-c", "2", "10.112.112.112");
593 break;
594 case WP_DISABLED:
595 case WP_STATIC:
596 break;
597 default:
598 eval("ping", "-c", "2", wan_gateway());
599 break;
602 TRACE_PT("end\n");
605 // -----------------------------------------------------------------------------
607 static void _do_wan_routes(char *ifname, char *nvname, int metric, int add)
609 char *routes, *tmp;
610 int bits;
611 struct in_addr mask;
612 char netmask[16];
614 // IP[/MASK] ROUTER IP2[/MASK2] ROUTER2 ...
615 tmp = routes = strdup(nvram_safe_get(nvname));
616 while (tmp && *tmp) {
617 char *ipaddr, *gateway, *nmask;
619 ipaddr = nmask = strsep(&tmp, " ");
620 strcpy(netmask, "255.255.255.255");
622 if (nmask) {
623 ipaddr = strsep(&nmask, "/");
624 if (nmask && *nmask) {
625 bits = strtol(nmask, &nmask, 10);
626 if (bits >= 1 && bits <= 32) {
627 mask.s_addr = htonl(0xffffffff << (32 - bits));
628 strcpy(netmask, inet_ntoa(mask));
632 gateway = strsep(&tmp, " ");
634 if (gateway && *gateway) {
635 if (add)
636 route_add(ifname, metric, ipaddr, gateway, netmask);
637 else
638 route_del(ifname, metric, ipaddr, gateway, netmask);
641 free(routes);
644 void do_wan_routes(char *ifname, int metric, int add)
646 if (nvram_get_int("dhcp_routes")) {
647 // Static Routes: IP ROUTER IP2 ROUTER2 ...
648 // Classless Static Routes: IP/MASK ROUTER IP2/MASK2 ROUTER2 ...
649 _do_wan_routes(ifname, "wan_routes1", metric, add);
650 _do_wan_routes(ifname, "wan_routes2", metric, add);
654 // -----------------------------------------------------------------------------
656 const char wan_connecting[] = "/var/lib/misc/wan.connecting";
658 static int is_sta(int idx, int unit, int subunit, void *param)
660 char **p = param;
662 if (nvram_match(wl_nvname("mode", unit, subunit), "sta")) {
663 *p = nvram_safe_get(wl_nvname("ifname", unit, subunit));
664 return 1;
666 return 0;
669 void start_wan(int mode)
671 int wan_proto;
672 char *wan_ifname;
673 char *p = NULL;
674 struct ifreq ifr;
675 int sd;
676 int max;
677 int mtu;
678 char buf[128];
679 struct sysinfo si;
680 int vid;
681 int vid_map;
682 int vlan0tag;
684 TRACE_PT("begin\n");
686 sysinfo(&si);
687 f_write(wan_connecting, &si.uptime, sizeof(si.uptime), 0, 0);
691 if (!foreach_wif(1, &p, is_sta)) {
692 p = nvram_safe_get("wan_ifnameX");
693 /* vlan ID mapping */
694 if (sscanf(p, "vlan%d", &vid) == 1) {
695 vlan0tag = nvram_get_int("vlan0tag");
696 snprintf(buf, sizeof(buf), "vlan%dvid", vid);
697 vid_map = nvram_get_int(buf);
698 if ((vid_map < 1) || (vid_map > 4094)) vid_map = vlan0tag | vid;
699 snprintf(buf, sizeof(buf), "vlan%d", vid_map);
700 p = buf;
702 set_mac(p, "mac_wan", 1);
704 nvram_set("wan_ifname", p);
705 nvram_set("wan_ifnames", p);
709 wan_ifname = nvram_safe_get("wan_ifname");
710 if (wan_ifname[0] == 0) {
711 wan_ifname = "none";
712 nvram_set("wan_ifname", wan_ifname);
715 if (strcmp(wan_ifname, "none") == 0) {
716 nvram_set("wan_proto", "disabled");
717 syslog(LOG_INFO, "No WAN");
722 wan_proto = get_wan_proto();
724 // set the default gateway for WAN interface
725 nvram_set("wan_gateway_get", nvram_safe_get("wan_gateway"));
727 if (wan_proto == WP_DISABLED) {
728 start_wan_done(wan_ifname);
729 return;
732 if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
733 perror("socket");
734 return;
737 // MTU
739 switch (wan_proto) {
740 case WP_PPPOE:
741 case WP_PPP3G:
742 max = 1492;
743 break;
744 case WP_PPTP:
745 case WP_L2TP:
746 max = 1460;
747 break;
748 default:
749 max = 1500;
750 break;
752 if (nvram_match("mtu_enable", "0")) {
753 mtu = max;
755 else {
756 mtu = nvram_get_int("wan_mtu");
757 if (mtu > max) mtu = max;
758 else if (mtu < 576) mtu = 576;
760 sprintf(buf, "%d", mtu);
761 nvram_set("wan_mtu", buf);
762 nvram_set("wan_run_mtu", buf);
764 // 43011: zhijian 2006-12-25 for CD-Router v3.4 mtu bug of PPTP connection mode
765 /* if (wan_proto == WP_PPTP) {
766 mtu += 40;
767 } */ // commented out; checkme -- zzz
769 if (wan_proto != WP_PPTP && wan_proto != WP_L2TP && wan_proto != WP_PPPOE) {
770 // Don't set the MTU on the port for PPP connections, it will be set on the link instead
771 ifr.ifr_mtu = mtu;
772 strcpy(ifr.ifr_name, wan_ifname);
773 ioctl(sd, SIOCSIFMTU, &ifr);
778 ifconfig(wan_ifname, IFUP, NULL, NULL);
780 start_firewall();
782 set_host_domain_name();
784 switch (wan_proto) {
785 case WP_PPPOE:
786 case WP_PPP3G:
787 start_pppoe(PPPOE0);
788 break;
789 case WP_DHCP:
790 case WP_L2TP:
791 case WP_PPTP:
792 if (using_dhcpc()) {
793 stop_dhcpc();
794 start_dhcpc();
796 else if (wan_proto != WP_DHCP) {
797 ifconfig(wan_ifname, IFUP, "0.0.0.0", NULL);
798 ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));
800 p = nvram_safe_get("wan_gateway");
801 if ((*p != 0) && (strcmp(p, "0.0.0.0") != 0))
802 preset_wan(wan_ifname, p, nvram_safe_get("wan_netmask"));
804 switch (wan_proto) {
805 case WP_PPTP:
806 start_pptp(mode);
807 break;
808 case WP_L2TP:
809 start_l2tp();
810 break;
813 break;
814 default: // static
815 nvram_set("wan_iface", wan_ifname);
816 ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));
818 int r = 10;
819 while ((!check_wanup()) && (r-- > 0)) {
820 sleep(1);
823 start_wan_done(wan_ifname);
824 break;
827 // Get current WAN hardware address
828 strlcpy(ifr.ifr_name, wan_ifname, IFNAMSIZ);
829 if (ioctl(sd, SIOCGIFHWADDR, &ifr) == 0) {
830 nvram_set("wan_hwaddr", ether_etoa(ifr.ifr_hwaddr.sa_data, buf));
833 /* Set initial QoS mode again now that WAN port is ready. */
834 set_et_qos_mode(sd);
836 close(sd);
838 enable_ip_forward();
840 led(LED_DIAG, 0); // for 4712, 5325E (?)
841 led(LED_DMZ, nvram_match("dmz_enable", "1"));
843 TRACE_PT("end\n");
846 #ifdef TCONFIG_IPV6
847 void start_wan6_done(const char *wan_ifname)
849 struct in_addr addr4;
850 struct in6_addr addr;
851 static char addr6[INET6_ADDRSTRLEN];
853 int service = get_ipv6_service();
855 if (service != IPV6_DISABLED) {
856 if ((nvram_get_int("ipv6_accept_ra") & 1) != 0)
857 accept_ra(wan_ifname);
860 switch (service) {
861 case IPV6_NATIVE:
862 eval("ip", "route", "add", "::/0", "dev", (char *)wan_ifname, "metric", "2048");
863 break;
864 case IPV6_NATIVE_DHCP:
865 // eval("ip", "route", "add", "::/0", "dev", (char *)wan_ifname); //removed by Toastman
866 // see discussion at http://www.linksysinfo.org/index.php?threads/ipv6-and-comcast.38006/
867 // post #24 refers.
868 stop_dhcp6c();
869 start_dhcp6c();
870 break;
871 case IPV6_ANYCAST_6TO4:
872 case IPV6_6IN4:
873 stop_ipv6_tunnel();
874 if (service == IPV6_ANYCAST_6TO4) {
875 addr4.s_addr = 0;
876 memset(&addr, 0, sizeof(addr));
877 inet_aton(get_wanip(), &addr4);
878 addr.s6_addr16[0] = htons(0x2002);
879 ipv6_mapaddr4(&addr, 16, &addr4, 0);
880 addr.s6_addr16[3] = htons(0x0001);
881 inet_ntop(AF_INET6, &addr, addr6, sizeof(addr6));
882 nvram_set("ipv6_prefix", addr6);
884 start_ipv6_tunnel();
885 // FIXME: give it a few seconds for DAD completion
886 sleep(2);
887 break;
888 case IPV6_6RD:
889 case IPV6_6RD_DHCP:
890 stop_6rd_tunnel();
891 start_6rd_tunnel();
892 // FIXME2?: give it a few seconds for DAD completion
893 sleep(2);
894 break;
897 #endif
899 // ppp_demand: 0=keep alive, 1=connect on demand (run 'listen')
900 // wan_ifname: vlan1
901 // wan_iface: ppp# (PPPOE, PPP3G, PPTP, L2TP), vlan1 (DHCP, HB, Static)
903 void start_wan_done(char *wan_ifname)
905 int proto;
906 int n;
907 char *gw;
908 struct sysinfo si;
909 int wanup;
911 TRACE_PT("begin wan_ifname=%s\n", wan_ifname);
913 sysinfo(&si);
914 f_write("/var/lib/misc/wantime", &si.uptime, sizeof(si.uptime), 0, 0);
916 proto = get_wan_proto();
918 // delete all default routes
919 route_del(wan_ifname, 0, NULL, NULL, NULL);
921 if (proto != WP_DISABLED) {
922 // set default route to gateway if specified
923 gw = wan_gateway();
924 #if 0
925 if (proto == WP_PPTP && !using_dhcpc()) {
926 // For PPTP protocol, we must use ppp_get_ip as gateway, not pptp_server_ip (why ??)
927 if (*gw == 0 || strcmp(gw, "0.0.0.0") == 0) gw = nvram_safe_get("ppp_get_ip");
929 #endif
930 if ((*gw != 0) && (strcmp(gw, "0.0.0.0") != 0)) {
931 if (proto == WP_DHCP || proto == WP_STATIC) {
932 // possibly gateway is over the bridge, try adding a route to gateway first
933 route_add(wan_ifname, 0, gw, NULL, "255.255.255.255");
936 n = 5;
937 while ((route_add(wan_ifname, 0, "0.0.0.0", gw, "0.0.0.0") == 1) && (n--)) {
938 sleep(1);
940 _dprintf("set default gateway=%s n=%d\n", gw, n);
942 // hack: avoid routing cycles, when both peer and server have the same IP
943 if (proto == WP_PPTP || proto == WP_L2TP) {
944 // delete gateway route as it's no longer needed
945 route_del(wan_ifname, 0, gw, "0.0.0.0", "255.255.255.255");
949 #ifdef THREE_ARP_GRATUATOUS_SUPPORT // from 43011; checkme; commented-out -- zzz
951 // 43011: Alpha add to send Gratuitous ARP when wan_proto is Static IP 2007-04-09
952 if (proto == WP_STATIC)
954 int ifindex;
955 u_int32_t wan_ip;
956 unsigned char wan_mac[6];
958 if (read_iface(nvram_safe_get("wan_iface"), &ifindex, &wan_ip, wan_mac) >= 0)
959 arpping(wan_ip, wan_ip, wan_mac, nvram_safe_get("wan_iface"));
962 #endif
964 if (proto == WP_PPTP || proto == WP_L2TP) {
965 route_del(nvram_safe_get("wan_iface"), 0, nvram_safe_get("wan_gateway_get"), NULL, "255.255.255.255");
966 route_add(nvram_safe_get("wan_iface"), 0, nvram_safe_get("ppp_get_ip"), NULL, "255.255.255.255");
968 if (proto == WP_L2TP) {
969 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
973 dns_to_resolv();
974 start_dnsmasq();
975 start_firewall();
976 start_qos();
977 start_qoslimit();
978 start_arpbind();
981 do_static_routes(1);
982 // and routes supplied via DHCP
983 do_wan_routes(using_dhcpc() ? nvram_safe_get("wan_ifname") : wan_ifname, 0, 1);
985 stop_zebra();
986 start_zebra();
988 wanup = check_wanup();
990 if ((wanup) || (time(0) < Y2K)) {
991 stop_ntpc();
992 start_ntpc();
995 if ((wanup) || (proto == WP_DISABLED)) {
996 stop_ddns();
997 start_ddns();
998 stop_igmp_proxy();
999 stop_udpxy();
1000 start_igmp_proxy();
1001 start_udpxy();
1004 #ifdef TCONFIG_IPV6
1005 start_wan6_done(get_wan6face());
1006 #endif
1008 stop_upnp();
1009 start_upnp();
1011 // restart httpd
1012 start_httpd();
1014 if (wanup) {
1015 SET_LED(GOT_IP);
1016 notice_set("wan", "");
1018 run_nvscript("script_wanup", NULL, 0);
1021 // We don't need STP after wireless led is lighted // no idea why... toggling it if necessary -- zzz
1022 if (check_hw_type() == HW_BCM4702) {
1023 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
1024 if (nvram_match("lan_stp", "1"))
1025 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "1");
1026 #ifdef TCONFIG_VLAN
1027 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0) {
1028 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "0");
1029 if (nvram_match("lan1_stp", "1"))
1030 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "1");
1032 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0) {
1033 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "0");
1034 if (nvram_match("lan2_stp", "1"))
1035 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "1");
1037 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0) {
1038 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "0");
1039 if (nvram_match("lan3_stp", "1"))
1040 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "1");
1042 #endif
1045 if (wanup)
1046 start_vpn_eas();
1048 #ifdef TCONFIG_USERPPTP
1049 if (wanup && nvram_get_int("pptp_client_enable"))
1050 start_pptp_client();
1051 #endif
1053 unlink(wan_connecting);
1054 start_qoslimit(); //!! RAF
1055 TRACE_PT("end\n");
1058 void stop_wan(void)
1060 char name[80];
1061 char *next;
1063 TRACE_PT("begin\n");
1065 #ifdef TCONFIG_USERPPTP
1066 stop_pptp_client();
1067 stop_dnsmasq();
1068 dns_to_resolv();
1069 start_dnsmasq();
1070 #endif
1071 stop_arpbind();
1072 stop_qoslimit(); //!! RAF
1073 stop_qos();
1074 stop_upnp(); //!!TB - moved from stop_services()
1075 stop_firewall();
1076 stop_igmp_proxy();
1077 stop_udpxy();
1078 stop_ntpc();
1080 #ifdef TCONFIG_IPV6
1081 stop_ipv6_tunnel();
1082 stop_dhcp6c();
1083 nvram_set("ipv6_get_dns", "");
1084 #endif
1086 /* Kill any WAN client daemons or callbacks */
1087 stop_redial();
1088 stop_pppoe();
1089 stop_ppp();
1090 stop_dhcpc();
1091 stop_vpn_eas();
1092 clear_resolv();
1093 nvram_set("wan_get_dns", "");
1095 /* Bring down WAN interfaces */
1096 foreach(name, nvram_safe_get("wan_ifnames"), next)
1097 ifconfig(name, 0, "0.0.0.0", NULL);
1099 SET_LED(RELEASE_IP);
1100 //notice_set("wan", "");
1101 unlink("/var/notice/wan");
1102 unlink(wan_connecting);
1104 TRACE_PT("end\n");