resolved conflict before merge
[tomato/tomato-dir865l.git] / release / src / router / rc / wan.c
blob0593fe9624403b71a4da121385fb0627297dbf59
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") && nvram_match("wan_proto", "ppp3g")) {
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 int vid;
680 int vid_map;
681 int vlan0tag;
683 TRACE_PT("begin\n");
685 f_write(wan_connecting, NULL, 0, 0, 0);
689 if (!foreach_wif(1, &p, is_sta)) {
690 p = nvram_safe_get("wan_ifnameX");
691 /* vlan ID mapping */
692 if (sscanf(p, "vlan%d", &vid) == 1) {
693 vlan0tag = nvram_get_int("vlan0tag");
694 snprintf(buf, sizeof(buf), "vlan%dvid", vid);
695 vid_map = nvram_get_int(buf);
696 if ((vid_map < 1) || (vid_map > 4094)) vid_map = vlan0tag | vid;
697 snprintf(buf, sizeof(buf), "vlan%d", vid_map);
698 p = buf;
700 set_mac(p, "mac_wan", 1);
702 nvram_set("wan_ifname", p);
703 nvram_set("wan_ifnames", p);
707 wan_ifname = nvram_safe_get("wan_ifname");
708 if (wan_ifname[0] == 0) {
709 wan_ifname = "none";
710 nvram_set("wan_ifname", wan_ifname);
713 if (strcmp(wan_ifname, "none") == 0) {
714 nvram_set("wan_proto", "disabled");
715 syslog(LOG_INFO, "No WAN");
720 wan_proto = get_wan_proto();
722 // set the default gateway for WAN interface
723 nvram_set("wan_gateway_get", nvram_safe_get("wan_gateway"));
725 if (wan_proto == WP_DISABLED) {
726 start_wan_done(wan_ifname);
727 return;
730 if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
731 perror("socket");
732 return;
735 // MTU
737 switch (wan_proto) {
738 case WP_PPPOE:
739 case WP_PPP3G:
740 max = 1492;
741 break;
742 case WP_PPTP:
743 case WP_L2TP:
744 max = 1460;
745 break;
746 default:
747 max = 1500;
748 break;
750 if (nvram_match("mtu_enable", "0")) {
751 mtu = max;
753 else {
754 // KDB If we've big fat frames enabled then we *CAN* break the
755 // max MTU on PPP link
756 mtu = nvram_get_int("wan_mtu");
757 if (!(nvram_get_int("jumbo_frame_enable")) && (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_LTE:
791 case WP_L2TP:
792 case WP_PPTP:
793 if (wan_proto == WP_LTE) {
794 // prepare LTE modem
795 xstart("switch4g");
797 if (using_dhcpc()) {
798 stop_dhcpc();
799 start_dhcpc();
801 else if (wan_proto != WP_DHCP && wan_proto != WP_LTE) {
802 ifconfig(wan_ifname, IFUP, "0.0.0.0", NULL);
803 ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));
805 p = nvram_safe_get("wan_gateway");
806 if ((*p != 0) && (strcmp(p, "0.0.0.0") != 0))
807 preset_wan(wan_ifname, p, nvram_safe_get("wan_netmask"));
809 switch (wan_proto) {
810 case WP_PPTP:
811 start_pptp(mode);
812 break;
813 case WP_L2TP:
814 start_l2tp();
815 break;
818 break;
819 default: // static
820 nvram_set("wan_iface", wan_ifname);
821 ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask"));
823 int r = 10;
824 while ((!check_wanup()) && (r-- > 0)) {
825 sleep(1);
828 start_wan_done(wan_ifname);
829 break;
832 // Get current WAN hardware address
833 strlcpy(ifr.ifr_name, wan_ifname, IFNAMSIZ);
834 if (ioctl(sd, SIOCGIFHWADDR, &ifr) == 0) {
835 nvram_set("wan_hwaddr", ether_etoa(ifr.ifr_hwaddr.sa_data, buf));
838 /* Set initial QoS mode again now that WAN port is ready. */
839 set_et_qos_mode(sd);
841 close(sd);
843 enable_ip_forward();
845 led(LED_DIAG, 0); // for 4712, 5325E (?)
846 led(LED_DMZ, nvram_match("dmz_enable", "1"));
848 TRACE_PT("end\n");
851 #ifdef TCONFIG_IPV6
852 void start_wan6_done(const char *wan_ifname)
854 struct in_addr addr4;
855 struct in6_addr addr;
856 static char addr6[INET6_ADDRSTRLEN];
858 int service = get_ipv6_service();
860 if (service != IPV6_DISABLED) {
861 if ((nvram_get_int("ipv6_accept_ra") & 1) != 0)
862 accept_ra(wan_ifname);
865 switch (service) {
866 case IPV6_NATIVE:
867 eval("ip", "route", "add", "::/0", "dev", (char *)wan_ifname, "metric", "2048");
868 break;
869 case IPV6_NATIVE_DHCP:
870 if (nvram_get_int("ipv6_isp_opt") == 1) {
871 eval("ip", "route", "add", "::/0", "dev", (char *)wan_ifname, "metric", "2048"); //not needed? - workaround for misconfigured ISPs?
873 stop_dhcp6c();
874 start_dhcp6c();
875 break;
876 case IPV6_ANYCAST_6TO4:
877 case IPV6_6IN4:
878 stop_ipv6_tunnel();
879 if (service == IPV6_ANYCAST_6TO4) {
880 addr4.s_addr = 0;
881 memset(&addr, 0, sizeof(addr));
882 inet_aton(get_wanip(), &addr4);
883 addr.s6_addr16[0] = htons(0x2002);
884 ipv6_mapaddr4(&addr, 16, &addr4, 0);
885 addr.s6_addr16[3] = htons(0x0001);
886 inet_ntop(AF_INET6, &addr, addr6, sizeof(addr6));
887 nvram_set("ipv6_prefix", addr6);
889 start_ipv6_tunnel();
890 // FIXME: give it a few seconds for DAD completion
891 sleep(2);
892 break;
893 case IPV6_6RD:
894 case IPV6_6RD_DHCP:
895 stop_6rd_tunnel();
896 start_6rd_tunnel();
897 // FIXME2?: give it a few seconds for DAD completion
898 sleep(2);
899 break;
902 #endif
904 // ppp_demand: 0=keep alive, 1=connect on demand (run 'listen')
905 // wan_ifname: vlan1
906 // wan_iface: ppp# (PPPOE, PPP3G, PPTP, L2TP), vlan1 (DHCP, HB, Static, LTE)
908 void start_wan_done(char *wan_ifname)
910 int proto;
911 int n;
912 char *gw;
913 struct sysinfo si;
914 int wanup;
916 TRACE_PT("begin wan_ifname=%s\n", wan_ifname);
918 sysinfo(&si);
919 f_write("/var/lib/misc/wantime", &si.uptime, sizeof(si.uptime), 0, 0);
921 proto = get_wan_proto();
923 // delete all default routes
924 route_del(wan_ifname, 0, NULL, NULL, NULL);
926 if (proto != WP_DISABLED) {
927 // set default route to gateway if specified
928 gw = wan_gateway();
929 #if 0
930 if (proto == WP_PPTP && !using_dhcpc()) {
931 // For PPTP protocol, we must use ppp_get_ip as gateway, not pptp_server_ip (why ??)
932 if (*gw == 0 || strcmp(gw, "0.0.0.0") == 0) gw = nvram_safe_get("ppp_get_ip");
934 #endif
935 if ((*gw != 0) && (strcmp(gw, "0.0.0.0") != 0)) {
936 if (proto == WP_DHCP || proto == WP_STATIC || proto == WP_LTE) {
937 // possibly gateway is over the bridge, try adding a route to gateway first
938 route_add(wan_ifname, 0, gw, NULL, "255.255.255.255");
941 n = 5;
942 while ((route_add(wan_ifname, 0, "0.0.0.0", gw, "0.0.0.0") == 1) && (n--)) {
943 sleep(1);
945 _dprintf("set default gateway=%s n=%d\n", gw, n);
947 // hack: avoid routing cycles, when both peer and server have the same IP
948 if (proto == WP_PPTP || proto == WP_L2TP) {
949 // delete gateway route as it's no longer needed
950 route_del(wan_ifname, 0, gw, "0.0.0.0", "255.255.255.255");
954 #ifdef THREE_ARP_GRATUATOUS_SUPPORT // from 43011; checkme; commented-out -- zzz
956 // 43011: Alpha add to send Gratuitous ARP when wan_proto is Static IP 2007-04-09
957 if (proto == WP_STATIC)
959 int ifindex;
960 u_int32_t wan_ip;
961 unsigned char wan_mac[6];
963 if (read_iface(nvram_safe_get("wan_iface"), &ifindex, &wan_ip, wan_mac) >= 0)
964 arpping(wan_ip, wan_ip, wan_mac, nvram_safe_get("wan_iface"));
967 #endif
969 if (proto == WP_PPTP || proto == WP_L2TP) {
970 route_del(nvram_safe_get("wan_iface"), 0, nvram_safe_get("wan_gateway_get"), NULL, "255.255.255.255");
971 route_add(nvram_safe_get("wan_iface"), 0, nvram_safe_get("ppp_get_ip"), NULL, "255.255.255.255");
973 if (proto == WP_L2TP) {
974 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
978 dns_to_resolv();
979 start_dnsmasq();
981 start_firewall();
982 start_qos();
984 do_static_routes(1);
985 // and routes supplied via DHCP
986 do_wan_routes(using_dhcpc() ? nvram_safe_get("wan_ifname") : wan_ifname, 0, 1);
988 stop_zebra();
989 start_zebra();
991 wanup = check_wanup();
993 if ((wanup) || (time(0) < Y2K)) {
994 stop_ntpc();
995 start_ntpc();
998 if ((wanup) || (proto == WP_DISABLED)) {
999 stop_ddns();
1000 start_ddns();
1001 stop_igmp_proxy();
1002 stop_udpxy();
1003 start_igmp_proxy();
1004 start_udpxy();
1007 #ifdef TCONFIG_IPV6
1008 start_wan6_done(get_wan6face());
1009 #endif
1011 #ifdef TCONFIG_DNSSEC
1012 if (nvram_match("dnssec_enable", "1")) {
1013 killall("dnsmasq", SIGHUP);
1015 #endif
1017 stop_upnp();
1018 start_upnp();
1020 // restart httpd
1021 start_httpd();
1023 if (wanup) {
1024 SET_LED(GOT_IP);
1025 notice_set("wan", "");
1027 run_nvscript("script_wanup", NULL, 0);
1030 // We don't need STP after wireless led is lighted // no idea why... toggling it if necessary -- zzz
1031 if (check_hw_type() == HW_BCM4702) {
1032 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
1033 if (nvram_match("lan_stp", "1"))
1034 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "1");
1035 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0) {
1036 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "0");
1037 if (nvram_match("lan1_stp", "1"))
1038 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "1");
1040 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0) {
1041 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "0");
1042 if (nvram_match("lan2_stp", "1"))
1043 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "1");
1045 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0) {
1046 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "0");
1047 if (nvram_match("lan3_stp", "1"))
1048 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "1");
1052 if (wanup)
1053 start_vpn_eas();
1055 #ifdef TCONFIG_TINC
1056 if(wanup)
1057 start_tinc_wanup();
1058 #endif
1060 #ifdef TCONFIG_PPTPD
1061 if (wanup && nvram_get_int("pptp_client_enable"))
1062 start_pptp_client();
1063 #endif
1065 unlink(wan_connecting);
1067 new_qoslimit_start(); //!! RAF
1069 TRACE_PT("end\n");
1072 void stop_wan(void)
1074 char name[80];
1075 char *next;
1076 int wan_proto;
1078 TRACE_PT("begin\n");
1080 #ifdef TCONFIG_TINC
1081 stop_tinc();
1082 #endif
1084 #ifdef TCONFIG_PPTPD
1085 stop_pptp_client();
1086 stop_dnsmasq();
1087 dns_to_resolv();
1088 start_dnsmasq();
1089 #endif
1091 wan_proto = get_wan_proto();
1093 if (wan_proto == WP_LTE) {
1094 xstart("switch4g", "disconnect");
1097 new_qoslimit_stop(); //!! RAF
1099 stop_qos();
1100 stop_upnp(); //!!TB - moved from stop_services()
1101 stop_firewall();
1102 stop_igmp_proxy();
1103 stop_udpxy();
1104 stop_ntpc();
1106 #ifdef TCONFIG_IPV6
1107 stop_ipv6_tunnel();
1108 stop_dhcp6c();
1109 nvram_set("ipv6_get_dns", "");
1110 #endif
1112 /* Kill any WAN client daemons or callbacks */
1113 stop_redial();
1114 stop_pppoe();
1115 stop_ppp();
1116 stop_dhcpc();
1117 stop_vpn_eas();
1118 clear_resolv();
1119 nvram_set("wan_get_dns", "");
1121 /* Bring down WAN interfaces */
1122 foreach(name, nvram_safe_get("wan_ifnames"), next)
1123 ifconfig(name, 0, "0.0.0.0", NULL);
1125 SET_LED(RELEASE_IP);
1126 //notice_set("wan", "");
1127 unlink("/var/notice/wan");
1128 unlink(wan_connecting);
1130 TRACE_PT("end\n");