Reinstate dropbear 0.54 update
[tomato.git] / release / src / router / rc / wan.c
blob56639f517fd1be0f8d703e494f933d11a16a7c9d
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";
48 static void make_secrets(void)
50 FILE *f;
51 char *user;
52 char *pass;
54 user = nvram_safe_get("ppp_username");
55 pass = nvram_safe_get("ppp_passwd");
56 if ((f = fopen("/tmp/ppp/pap-secrets", "w")) != NULL) {
57 fprintf(f, "\"%s\" * \"%s\" *\n", user, pass);
58 fclose(f);
60 chmod("/tmp/ppp/pap-secrets", 0600);
62 if ((f = fopen("/tmp/ppp/chap-secrets", "w")) != NULL) {
63 fprintf(f, "\"%s\" * \"%s\" *\n", user, pass);
64 fclose(f);
66 chmod("/tmp/ppp/chap-secrets", 0600);
69 // -----------------------------------------------------------------------------
71 static int config_pppd(int wan_proto, int num)
73 TRACE_PT("begin\n");
75 FILE *fp;
76 char *p;
77 int demand;
79 mkdir("/tmp/ppp", 0777);
80 symlink("/sbin/rc", "/tmp/ppp/ip-up");
81 symlink("/sbin/rc", "/tmp/ppp/ip-down");
82 #ifdef TCONFIG_IPV6
83 symlink("/sbin/rc", "/tmp/ppp/ipv6-up");
84 symlink("/sbin/rc", "/tmp/ppp/ipv6-down");
85 #endif
86 symlink("/dev/null", "/tmp/ppp/connect-errors");
88 demand = nvram_get_int("ppp_demand");
90 // Generate options file
91 if ((fp = fopen(ppp_optfile, "w")) == NULL) {
92 perror(ppp_optfile);
93 return -1;
96 fprintf(fp,
97 "unit %d\n"
98 "defaultroute\n" // Add a default route to the system routing tables, using the peer as the gateway
99 "usepeerdns\n" // Ask the peer for up to 2 DNS server addresses
100 "user '%s'\n"
101 "default-asyncmap\n" // Disable asyncmap negotiation
102 "nopcomp\n" // Disable protocol field compression
103 "noaccomp\n" // Disable Address/Control compression
104 "novj\n" // Disable Van Jacobson style TCP/IP header compression
105 "nobsdcomp\n" // Disable BSD-Compress compression
106 "nodeflate\n" // Disable Deflate compression
107 "noauth\n" // Do not authenticate peer
108 "refuse-eap\n" // Do not use eap
109 "maxfail 0\n" // Never give up
110 "lcp-echo-interval %d\n"// Interval between LCP echo-requests
111 "lcp-echo-failure %d\n" // Tolerance to unanswered echo-requests
112 "lcp-echo-adaptive\n" // Suppress LCP echo-requests if traffic was received
113 "%s", // Debug
114 num,
115 nvram_safe_get("ppp_username"),
116 nvram_get_int("pppoe_lei") ? : 10,
117 nvram_get_int("pppoe_lef") ? : 5,
118 nvram_get_int("debug_ppp") ? "debug\n" : "");
120 if (wan_proto != WP_L2TP) {
121 fprintf(fp,
122 "persist\n"
123 "holdoff %d\n",
124 demand ? 30 : (nvram_get_int("ppp_redialperiod") ? : 30));
127 switch (wan_proto) {
128 case WP_PPTP:
129 fprintf(fp,
130 "plugin pptp.so\n"
131 "pptp_server %s\n"
132 "nomppe-stateful\n"
133 "mtu %d\n",
134 nvram_safe_get("pptp_server_ip"),
135 nvram_get_int("mtu_enable") ? nvram_get_int("wan_mtu") : 1400);
136 break;
137 case WP_PPPOE:
138 fprintf(fp,
139 "password '%s'\n"
140 "plugin rp-pppoe.so\n"
141 "nomppe nomppc\n"
142 "nic-%s\n"
143 "mru %d mtu %d\n",
144 nvram_safe_get("ppp_passwd"),
145 nvram_safe_get("wan_ifname"),
146 nvram_get_int("wan_mtu"), nvram_get_int("wan_mtu"));
147 if (((p = nvram_get("ppp_service")) != NULL) && (*p)) {
148 fprintf(fp, "rp_pppoe_service '%s'\n", p);
150 if (((p = nvram_get("ppp_ac")) != NULL) && (*p)) {
151 fprintf(fp, "rp_pppoe_ac '%s'\n", p);
153 if (nvram_match("ppp_mlppp", "1")) {
154 fprintf(fp, "mp\n");
156 break;
157 case WP_L2TP:
158 fprintf(fp, "nomppe nomppc\n");
159 if (nvram_get_int("mtu_enable"))
160 fprintf(fp, "mtu %d\n", nvram_get_int("wan_mtu"));
161 break;
164 if (demand) {
165 // demand mode
166 fprintf(fp,
167 "demand\n" // Dial on demand
168 "idle %d\n"
169 "ipcp-accept-remote\n"
170 "ipcp-accept-local\n"
171 "noipdefault\n" // Disables the default behaviour when no local IP address is specified
172 "ktune\n", // Set /proc/sys/net/ipv4/ip_dynaddr to 1 in demand mode if the local address changes
173 nvram_get_int("ppp_idletime") * 60);
176 #ifdef TCONFIG_IPV6
177 switch (get_ipv6_service()) {
178 case IPV6_NATIVE:
179 case IPV6_NATIVE_DHCP:
180 fprintf(fp, "+ipv6\n");
181 break;
183 #endif
184 // User specific options
185 fprintf(fp, "%s\n", nvram_safe_get("ppp_custom"));
187 fclose(fp);
188 make_secrets();
190 TRACE_PT("end\n");
191 return 0;
194 static void stop_ppp(void)
196 TRACE_PT("begin\n");
198 unlink(ppp_linkfile);
200 killall_tk("ip-up");
201 killall_tk("ip-down");
202 #ifdef TCONFIG_IPV6
203 killall_tk("ipv6-up");
204 killall_tk("ipv6-down");
205 #endif
206 killall_tk("xl2tpd");
207 killall_tk("pppd");
208 killall_tk("listen");
210 TRACE_PT("end\n");
213 static void run_pppd(void)
215 eval("pppd", "file", ppp_optfile);
217 if (nvram_get_int("ppp_demand")) {
218 // demand mode
220 Fixed issue id 7887(or 7787):
221 When DUT is PPTP Connect on Demand mode, it couldn't be trigger from LAN.
223 stop_dnsmasq();
224 dns_to_resolv();
225 start_dnsmasq();
227 // Trigger Connect On Demand if user ping pptp server
228 eval("listen", nvram_safe_get("lan_ifname"));
230 else {
231 // keepalive mode
232 start_redial();
236 // -----------------------------------------------------------------------------
238 inline void stop_pptp(void)
240 stop_ppp();
243 void start_pptp(int mode)
245 TRACE_PT("begin\n");
247 if (!using_dhcpc()) stop_dhcpc();
248 stop_pptp();
250 if (config_pppd(WP_PPTP, 0) != 0)
251 return;
253 run_pppd();
255 TRACE_PT("end\n");
258 // -----------------------------------------------------------------------------
260 void preset_wan(char *ifname, char *gw, char *netmask)
262 int i;
264 /* Delete all default routes */
265 route_del(ifname, 0, NULL, NULL, NULL);
267 /* try adding a route to gateway first */
268 route_add(ifname, 0, gw, NULL, "255.255.255.255");
270 /* Set default route to gateway if specified */
271 i = 5;
272 while ((route_add(ifname, 1, "0.0.0.0", gw, "0.0.0.0") == 1) && (i--)) {
273 sleep(1);
275 _dprintf("set default gateway=%s n=%d\n", gw, i);
277 /* Add routes to dns servers as well for demand ppp to work */
278 char word[100], *next;
279 in_addr_t mask = inet_addr(netmask);
280 foreach(word, nvram_safe_get("wan_get_dns"), next) {
281 if ((inet_addr(word) & mask) != (inet_addr(nvram_safe_get("wan_ipaddr")) & mask))
282 route_add(ifname, 0, word, gw, "255.255.255.255");
285 dns_to_resolv();
286 start_dnsmasq();
287 sleep(1);
288 start_firewall();
291 // -----------------------------------------------------------------------------
294 // Get the IP, Subnetmask, Geteway from WAN interface and set nvram
295 static void start_tmp_ppp(int num, char *ifname)
297 int timeout;
298 struct ifreq ifr;
299 int s;
301 TRACE_PT("begin: num=%d\n", num);
303 if (num != 0) return;
305 // Wait for ppp0 to be created
306 timeout = 15;
307 while ((ifconfig(ifname, IFUP, NULL, NULL) != 0) && (timeout-- > 0)) {
308 sleep(1);
309 _dprintf("[%d] waiting for %s %d...\n", __LINE__, ifname, timeout);
312 if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) return;
313 strlcpy(ifr.ifr_name, ifname, IFNAMSIZ);
315 // Set temporary IP address
316 timeout = 3;
317 while (ioctl(s, SIOCGIFADDR, &ifr) && timeout--){
318 _dprintf("[%d] waiting for %s...\n", __LINE__, ifname);
319 sleep(1);
321 nvram_set("wan_ipaddr", inet_ntoa(sin_addr(&(ifr.ifr_addr))));
322 nvram_set("wan_netmask", "255.255.255.255");
324 // Set temporary P-t-P address
325 timeout = 3;
326 while (ioctl(s, SIOCGIFDSTADDR, &ifr) && timeout--){
327 _dprintf("[%d] waiting for %s...\n", __LINE__, ifname);
328 sleep(1);
330 nvram_set("wan_gateway", inet_ntoa(sin_addr(&(ifr.ifr_dstaddr))));
332 close(s);
334 start_wan_done(ifname);
335 TRACE_PT("end\n");
338 void start_pppoe(int num)
340 char ifname[8];
342 TRACE_PT("begin pppoe_num=%d\n", num);
344 if (num != 0) return;
346 stop_pppoe();
348 snprintf(ifname, sizeof(ifname), "ppp%d", num);
350 if (config_pppd(WP_PPPOE, num) != 0)
351 return;
353 run_pppd();
355 if (nvram_get_int("ppp_demand"))
356 start_tmp_ppp(num, ifname);
357 else
358 ifconfig(ifname, IFUP, NULL, NULL);
360 TRACE_PT("end\n");
363 void stop_pppoe(void)
365 stop_ppp();
368 #if 0
369 void stop_singe_pppoe(int num)
371 _dprintf("%s pppoe_num=%d\n", __FUNCTION__, num);
373 int i;
375 if (num != 0) return;
377 i = nvram_get_int("pppoe_pid0");
378 if ((i > 1) && (kill(i, SIGTERM) == 0)) {
379 do {
380 sleep(2);
381 } while (kill(i, SIGKILL) == 0);
384 unlink(ppp_linkfile);
385 nvram_unset("pppoe_ifname0");
387 nvram_set("wan_get_dns", "");
388 clear_resolv();
390 #endif
392 // -----------------------------------------------------------------------------
394 inline void stop_l2tp(void)
396 stop_ppp();
399 void start_l2tp(void)
401 TRACE_PT("begin\n");
403 FILE *fp;
404 int demand;
406 stop_l2tp();
408 if (config_pppd(WP_L2TP, 0) != 0)
409 return;
411 demand = nvram_get_int("ppp_demand");
413 /* Generate XL2TPD configuration file */
414 if ((fp = fopen("/etc/xl2tpd.conf", "w")) == NULL)
415 return;
416 fprintf(fp,
417 "[global]\n"
418 "access control = no\n"
419 "port = 1701\n"
420 "[lac l2tp]\n"
421 "lns = %s\n"
422 "tx bps = 100000000\n"
423 "pppoptfile = %s\n"
424 "redial = yes\n"
425 "max redials = 32767\n"
426 "redial timeout = %d\n"
427 "tunnel rws = 8\n"
428 "ppp debug = %s\n"
429 "%s\n",
430 nvram_safe_get("l2tp_server_ip"),
431 ppp_optfile,
432 demand ? 30 : (nvram_get_int("ppp_redialperiod") ? : 30),
433 nvram_get_int("debug_ppp") ? "yes" : "no",
434 nvram_safe_get("xl2tpd_custom"));
435 fappend(fp, "/etc/xl2tpd.custom");
436 fclose(fp);
438 enable_ip_forward();
440 eval("xl2tpd");
442 if (demand) {
443 eval("listen", nvram_safe_get("lan_ifname"));
445 else {
446 force_to_dial();
447 start_redial();
450 TRACE_PT("end\n");
453 // -----------------------------------------------------------------------------
455 char *wan_gateway(void)
457 char *gw = nvram_safe_get("wan_gateway_get");
458 if ((*gw == 0) || (strcmp(gw, "0.0.0.0") == 0))
459 gw = nvram_safe_get("wan_gateway");
460 return gw;
463 // -----------------------------------------------------------------------------
465 // trigger connect on demand
466 void force_to_dial(void)
468 TRACE_PT("begin\n");
470 sleep(1);
471 switch (get_wan_proto()) {
472 case WP_L2TP:
473 f_write_string("/var/run/l2tp-control", "c l2tp", 0, 0);
474 break;
475 case WP_PPTP:
476 eval("ping", "-c", "2", "10.112.112.112");
477 break;
478 case WP_DISABLED:
479 case WP_STATIC:
480 break;
481 default:
482 eval("ping", "-c", "2", wan_gateway());
483 break;
486 TRACE_PT("end\n");
489 // -----------------------------------------------------------------------------
491 static void _do_wan_routes(char *ifname, char *nvname, int metric, int add)
493 char *routes, *tmp;
494 int bits;
495 struct in_addr mask;
496 char netmask[16];
498 // IP[/MASK] ROUTER IP2[/MASK2] ROUTER2 ...
499 tmp = routes = strdup(nvram_safe_get(nvname));
500 while (tmp && *tmp) {
501 char *ipaddr, *gateway, *nmask;
503 ipaddr = nmask = strsep(&tmp, " ");
504 strcpy(netmask, "255.255.255.255");
506 if (nmask) {
507 ipaddr = strsep(&nmask, "/");
508 if (nmask && *nmask) {
509 bits = strtol(nmask, &nmask, 10);
510 if (bits >= 1 && bits <= 32) {
511 mask.s_addr = htonl(0xffffffff << (32 - bits));
512 strcpy(netmask, inet_ntoa(mask));
516 gateway = strsep(&tmp, " ");
518 if (gateway && *gateway) {
519 if (add)
520 route_add(ifname, metric, ipaddr, gateway, netmask);
521 else
522 route_del(ifname, metric, ipaddr, gateway, netmask);
525 free(routes);
528 void do_wan_routes(char *ifname, int metric, int add)
530 if (nvram_get_int("dhcp_routes")) {
531 // Static Routes: IP ROUTER IP2 ROUTER2 ...
532 // Classless Static Routes: IP/MASK ROUTER IP2/MASK2 ROUTER2 ...
533 _do_wan_routes(ifname, "wan_routes1", metric, add);
534 _do_wan_routes(ifname, "wan_routes2", metric, add);
538 // -----------------------------------------------------------------------------
540 const char wan_connecting[] = "/var/lib/misc/wan.connecting";
542 static int is_sta(int idx, int unit, int subunit, void *param)
544 char **p = param;
546 if (nvram_match(wl_nvname("mode", unit, subunit), "sta")) {
547 *p = nvram_safe_get(wl_nvname("ifname", unit, subunit));
548 return 1;
550 return 0;
553 void start_wan(int mode)
555 int wan_proto;
556 char *wan_ifname;
557 char *p = NULL;
558 struct ifreq ifr;
559 int sd;
560 int max;
561 int mtu;
562 char buf[128];
564 TRACE_PT("begin\n");
566 f_write(wan_connecting, NULL, 0, 0, 0);
570 if (!foreach_wif(1, &p, is_sta)) {
571 p = nvram_safe_get("wan_ifnameX");
572 set_mac(p, "mac_wan", 1);
574 nvram_set("wan_ifname", p);
575 nvram_set("wan_ifnames", p);
579 wan_ifname = nvram_safe_get("wan_ifname");
580 if (wan_ifname[0] == 0) {
581 wan_ifname = "none";
582 nvram_set("wan_ifname", wan_ifname);
585 if (strcmp(wan_ifname, "none") == 0) {
586 nvram_set("wan_proto", "disabled");
587 syslog(LOG_INFO, "No WAN");
592 wan_proto = get_wan_proto();
594 // set the default gateway for WAN interface
595 nvram_set("wan_gateway_get", nvram_safe_get("wan_gateway"));
597 if (wan_proto == WP_DISABLED) {
598 start_wan_done(wan_ifname);
599 return;
602 if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
603 perror("socket");
604 return;
607 // MTU
609 switch (wan_proto) {
610 case WP_PPPOE:
611 max = 1492;
612 break;
613 case WP_PPTP:
614 case WP_L2TP:
615 max = 1460;
616 break;
617 default:
618 max = 1500;
619 break;
621 if (nvram_match("mtu_enable", "0")) {
622 mtu = max;
624 else {
625 mtu = nvram_get_int("wan_mtu");
626 if (mtu > max) mtu = max;
627 else if (mtu < 576) mtu = 576;
629 sprintf(buf, "%d", mtu);
630 nvram_set("wan_mtu", buf);
631 nvram_set("wan_run_mtu", buf);
633 // 43011: zhijian 2006-12-25 for CD-Router v3.4 mtu bug of PPTP connection mode
634 /* if (wan_proto == WP_PPTP) {
635 mtu += 40;
636 } */ // commented out; checkme -- zzz
638 if (wan_proto != WP_PPTP && wan_proto != WP_L2TP && wan_proto != WP_PPPOE) {
639 // Don't set the MTU on the port for PPP connections, it will be set on the link instead
640 ifr.ifr_mtu = mtu;
641 strcpy(ifr.ifr_name, wan_ifname);
642 ioctl(sd, SIOCSIFMTU, &ifr);
647 ifconfig(wan_ifname, IFUP, NULL, NULL);
649 start_firewall();
651 set_host_domain_name();
653 switch (wan_proto) {
654 case WP_PPPOE:
655 start_pppoe(PPPOE0);
656 break;
657 case WP_DHCP:
658 case WP_L2TP:
659 case WP_PPTP:
660 if (using_dhcpc()) {
661 stop_dhcpc();
662 start_dhcpc();
664 else if (wan_proto != WP_DHCP) {
665 ifconfig(wan_ifname, IFUP, "0.0.0.0", NULL);
666 ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));
668 p = nvram_safe_get("wan_gateway");
669 if ((*p != 0) && (strcmp(p, "0.0.0.0") != 0))
670 preset_wan(wan_ifname, p, nvram_safe_get("wan_netmask"));
672 switch (wan_proto) {
673 case WP_PPTP:
674 start_pptp(mode);
675 break;
676 case WP_L2TP:
677 start_l2tp();
678 break;
681 break;
682 default: // static
683 nvram_set("wan_iface", wan_ifname);
684 ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));
686 int r = 10;
687 while ((!check_wanup()) && (r-- > 0)) {
688 sleep(1);
691 start_wan_done(wan_ifname);
692 break;
695 // Get current WAN hardware address
696 strlcpy(ifr.ifr_name, wan_ifname, IFNAMSIZ);
697 if (ioctl(sd, SIOCGIFHWADDR, &ifr) == 0) {
698 nvram_set("wan_hwaddr", ether_etoa(ifr.ifr_hwaddr.sa_data, buf));
701 /* Set initial QoS mode again now that WAN port is ready. */
702 set_et_qos_mode(sd);
704 close(sd);
706 enable_ip_forward();
708 led(LED_DIAG, 0); // for 4712, 5325E (?)
709 led(LED_DMZ, nvram_match("dmz_enable", "1"));
711 TRACE_PT("end\n");
714 #ifdef TCONFIG_IPV6
715 void start_wan6_done(const char *wan_ifname)
717 struct in_addr addr4;
718 struct in6_addr addr;
719 static char addr6[INET6_ADDRSTRLEN];
721 int service = get_ipv6_service();
723 if (service != IPV6_DISABLED) {
724 if ((nvram_get_int("ipv6_accept_ra") & 1) != 0)
725 accept_ra(wan_ifname);
728 switch (service) {
729 case IPV6_NATIVE:
730 eval("ip", "route", "add", "::/0", "dev", (char *)wan_ifname, "metric", "2048");
731 break;
732 case IPV6_NATIVE_DHCP:
733 eval("ip", "route", "add", "::/0", "dev", (char *)wan_ifname);
734 stop_dhcp6c();
735 start_dhcp6c();
736 break;
737 case IPV6_ANYCAST_6TO4:
738 case IPV6_6IN4:
739 stop_ipv6_tunnel();
740 if (service == IPV6_ANYCAST_6TO4) {
741 addr4.s_addr = 0;
742 memset(&addr, 0, sizeof(addr));
743 inet_aton(get_wanip(), &addr4);
744 addr.s6_addr16[0] = htons(0x2002);
745 ipv6_mapaddr4(&addr, 16, &addr4, 0);
746 addr.s6_addr16[3] = htons(0x0001);
747 inet_ntop(AF_INET6, &addr, addr6, sizeof(addr6));
748 nvram_set("ipv6_prefix", addr6);
750 start_ipv6_tunnel();
751 // FIXME: give it a few seconds for DAD completion
752 sleep(2);
753 break;
756 #endif
758 // ppp_demand: 0=keep alive, 1=connect on demand (run 'listen')
759 // wan_ifname: vlan1
760 // wan_iface: ppp# (PPPOE, PPTP, L2TP), vlan1 (DHCP, HB, Static)
762 void start_wan_done(char *wan_ifname)
764 int proto;
765 int n;
766 char *gw;
767 struct sysinfo si;
768 int wanup;
770 TRACE_PT("begin wan_ifname=%s\n", wan_ifname);
772 sysinfo(&si);
773 f_write("/var/lib/misc/wantime", &si.uptime, sizeof(si.uptime), 0, 0);
775 proto = get_wan_proto();
777 // delete all default routes
778 route_del(wan_ifname, 0, NULL, NULL, NULL);
780 if (proto != WP_DISABLED) {
781 // set default route to gateway if specified
782 gw = wan_gateway();
783 #if 0
784 if (proto == WP_PPTP && !using_dhcpc()) {
785 // For PPTP protocol, we must use ppp_get_ip as gateway, not pptp_server_ip (why ??)
786 if (*gw == 0 || strcmp(gw, "0.0.0.0") == 0) gw = nvram_safe_get("ppp_get_ip");
788 #endif
789 if ((*gw != 0) && (strcmp(gw, "0.0.0.0") != 0)) {
790 if (proto == WP_DHCP || proto == WP_STATIC) {
791 // possibly gateway is over the bridge, try adding a route to gateway first
792 route_add(wan_ifname, 0, gw, NULL, "255.255.255.255");
795 n = 5;
796 while ((route_add(wan_ifname, 0, "0.0.0.0", gw, "0.0.0.0") == 1) && (n--)) {
797 sleep(1);
799 _dprintf("set default gateway=%s n=%d\n", gw, n);
801 // hack: avoid routing cycles, when both peer and server have the same IP
802 if (proto == WP_PPTP || proto == WP_L2TP) {
803 // delete gateway route as it's no longer needed
804 route_del(wan_ifname, 0, gw, "0.0.0.0", "255.255.255.255");
808 #ifdef THREE_ARP_GRATUATOUS_SUPPORT // from 43011; checkme; commented-out -- zzz
810 // 43011: Alpha add to send Gratuitous ARP when wan_proto is Static IP 2007-04-09
811 if (proto == WP_STATIC)
813 int ifindex;
814 u_int32_t wan_ip;
815 unsigned char wan_mac[6];
817 if (read_iface(nvram_safe_get("wan_iface"), &ifindex, &wan_ip, wan_mac) >= 0)
818 arpping(wan_ip, wan_ip, wan_mac, nvram_safe_get("wan_iface"));
821 #endif
823 if (proto == WP_PPTP || proto == WP_L2TP) {
824 route_del(nvram_safe_get("wan_iface"), 0, nvram_safe_get("wan_gateway_get"), NULL, "255.255.255.255");
825 route_add(nvram_safe_get("wan_iface"), 0, nvram_safe_get("ppp_get_ip"), NULL, "255.255.255.255");
827 if (proto == WP_L2TP) {
828 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
832 dns_to_resolv();
833 start_dnsmasq();
834 start_firewall();
835 start_qos();
836 start_qoslimit();
837 start_arpbind();
841 do_static_routes(1);
842 // and routes supplied via DHCP
843 do_wan_routes(using_dhcpc() ? nvram_safe_get("wan_ifname") : wan_ifname, 0, 1);
845 stop_zebra();
846 start_zebra();
848 wanup = check_wanup();
850 if ((wanup) || (time(0) < Y2K)) {
851 stop_ntpc();
852 start_ntpc();
855 if ((wanup) || (proto == WP_DISABLED)) {
856 stop_ddns();
857 start_ddns();
858 stop_igmp_proxy();
859 stop_udpxy();
860 start_igmp_proxy();
861 start_udpxy();
864 #ifdef TCONFIG_IPV6
865 start_wan6_done(get_wan6face());
866 #endif
868 stop_upnp();
869 start_upnp();
871 // restart httpd
872 start_httpd();
874 if (wanup) {
875 SET_LED(GOT_IP);
876 notice_set("wan", "");
878 run_nvscript("script_wanup", NULL, 0);
881 // We don't need STP after wireless led is lighted // no idea why... toggling it if necessary -- zzz
882 if (check_hw_type() == HW_BCM4702) {
883 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
884 if (nvram_match("lan_stp", "1"))
885 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "1");
886 #ifdef TCONFIG_VLAN
887 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0) {
888 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "0");
889 if (nvram_match("lan1_stp", "1"))
890 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "1");
892 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0) {
893 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "0");
894 if (nvram_match("lan2_stp", "1"))
895 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "1");
897 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0) {
898 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "0");
899 if (nvram_match("lan3_stp", "1"))
900 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "1");
902 #endif
905 if (wanup)
906 start_vpn_eas();
908 #ifdef TCONFIG_USERPPTP
909 if (wanup && nvram_get_int("pptp_client_enable"))
910 start_pptp_client();
911 #endif
913 unlink(wan_connecting);
915 TRACE_PT("end\n");
918 void stop_wan(void)
920 char name[80];
921 char *next;
923 TRACE_PT("begin\n");
925 #ifdef TCONFIG_USERPPTP
926 stop_pptp_client();
927 stop_dnsmasq();
928 dns_to_resolv();
929 start_dnsmasq();
930 #endif
931 stop_vpn_eas();
932 stop_arpbind();
933 stop_qoslimit();
934 stop_qos();
935 stop_upnp(); //!!TB - moved from stop_services()
936 stop_firewall();
937 stop_igmp_proxy();
938 stop_udpxy();
939 stop_ntpc();
941 #ifdef TCONFIG_IPV6
942 stop_ipv6_tunnel();
943 stop_dhcp6c();
944 nvram_set("ipv6_get_dns", "");
945 #endif
947 /* Kill any WAN client daemons or callbacks */
948 stop_redial();
949 stop_pppoe();
950 stop_ppp();
951 stop_dhcpc();
952 clear_resolv();
953 nvram_set("wan_get_dns", "");
955 /* Bring down WAN interfaces */
956 foreach(name, nvram_safe_get("wan_ifnames"), next)
957 ifconfig(name, 0, "0.0.0.0", NULL);
959 SET_LED(RELEASE_IP);
960 //notice_set("wan", "");
961 unlink("/var/notice/wan");
962 unlink(wan_connecting);
964 TRACE_PT("end\n");