static int bound(char *ifname) { _dprintf("%s: begin\n", __FUNCTION__); unlink(renewing); env2nv("ip", "wan_ipaddr"); env2nv("subnet", "wan_netmask"); env2nv_gateway("wan_gateway"); env2nv("dns", "wan_get_dns"); env2nv("domain", "wan_get_domain"); env2nv("lease", "wan_lease"); expires(atoi(safe_getenv("lease"))); _dprintf("wan_ipaddr=%s\n", nvram_safe_get("wan_ipaddr")); _dprintf("wan_netmask=%s\n", nvram_safe_get("wan_netmask")); _dprintf("wan_gateway=%s\n", nvram_safe_get("wan_gateway")); _dprintf("wan_get_domain=%s\n", nvram_safe_get("wan_get_domain")); _dprintf("wan_get_dns=%s\n", nvram_safe_get("wan_get_dns")); _dprintf("wan_lease=%s\n", nvram_safe_get("wan_lease")); ifconfig(ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask")); if (get_wan_proto() == WP_L2TP) { int i = 0; /* Delete all default routes */ while ((route_del(ifname, 0, NULL, NULL, NULL) == 0) || (i++ < 10)); /* Set default route to gateway if specified */ route_add(ifname, 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0"); /* Backup the default gateway. It should be used if L2TP connection is broken */ nvram_set("wan_gateway_buf", nvram_get("wan_gateway")); /* clear dns from the resolv.conf */ nvram_set("wan_get_dns",""); dns_to_resolv(); start_firewall(); start_l2tp(); } else { start_wan_done(ifname); } _dprintf("%s: end\n", __FUNCTION__); return 0; }
int ipup_main(int argc, char **argv) { char *wan_ifname; char *value; char buf[256]; const char *p; TRACE_PT("begin\n"); killall("listen", SIGKILL); if (!wait_action_idle(10)) return -1; wan_ifname = safe_getenv("IFNAME"); if ((!wan_ifname) || (!*wan_ifname)) return -1; nvram_set("wan_iface", wan_ifname); // ppp# // ipup receives six arguments: // <interface name> <tty device> <speed> <local IP address> <remote IP address> <ipparam> // ppp1 vlan1 0 71.135.98.32 151.164.184.87 0 f_write_string("/tmp/ppp/link", argv[1], 0, 0); if ((p = getenv("IPREMOTE"))) { nvram_set("wan_gateway_get", p); TRACE_PT("IPREMOTE=%s\n", p); } if ((value = getenv("IPLOCAL"))) { _dprintf("IPLOCAL=%s\n", value); switch (get_wan_proto()) { case WP_PPPOE: case WP_PPP3G: nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr")); // store last ip address nvram_set("wan_ipaddr", value); nvram_set("wan_netmask", "255.255.255.255"); break; case WP_PPTP: case WP_L2TP: nvram_set("wan_ipaddr_buf", nvram_safe_get("ppp_get_ip")); break; } if (!nvram_match("ppp_get_ip", value)) { ifconfig(wan_ifname, IFUP, "0.0.0.0", NULL); nvram_set("ppp_get_ip", value); } _ifconfig(wan_ifname, IFUP, value, "255.255.255.255", (p && (*p)) ? p : NULL); } buf[0] = 0; if ((p = getenv("DNS1")) != NULL) strlcpy(buf, p, sizeof(buf)); if ((p = getenv("DNS2")) != NULL) { if (buf[0]) strlcat(buf, " ", sizeof(buf)); strlcat(buf, p, sizeof(buf)); } nvram_set("wan_get_dns", buf); TRACE_PT("DNS=%s\n", buf); if ((value = getenv("AC_NAME"))) nvram_set("ppp_get_ac", value); if ((value = getenv("SRV_NAME"))) nvram_set("ppp_get_srv", value); if ((value = getenv("MTU"))) nvram_set("wan_run_mtu", value); start_wan_done(wan_ifname); TRACE_PT("end\n"); return 0; }
static int bound(void) { nvram_unset("dhcpc_done"); char *wan_ifname = safe_getenv("interface"); char *value; static char temp_wan_ipaddr[16], temp_wan_netmask[16], temp_wan_gateway[16]; int changed = 0; static char *cidr; if (nvram_match("wan_proto", "iphone")) stop_process("ipheth-loop", "IPhone Pairing Daemon"); cidr = getenv("cidrroute"); if (cidr && wan_ifname) { char *callbuffer = malloc(strlen(cidr) + 128); sprintf(callbuffer, "export cidrroute=\"%s\";export interface=\"%s\";/etc/cidrroute.sh", cidr, wan_ifname); system(callbuffer); free(callbuffer); } if ((value = getenv("ip"))) { chomp(value); if (nvram_match("wan_proto", "pptp") && nvram_match("pptp_use_dhcp", "1")) strcpy(temp_wan_ipaddr, value); else { if (nvram_invmatch("wan_ipaddr", value)) changed = 1; } nvram_set("wan_ipaddr", value); } if ((value = getenv("subnet"))) { chomp(value); if (nvram_match("wan_proto", "pptp") && nvram_match("pptp_use_dhcp", "1")) strcpy(temp_wan_netmask, value); else { if (nvram_invmatch("wan_netmask", value)) changed = 1; nvram_set("wan_netmask", value); } } if ((value = getenv("router"))) { chomp(value); if (nvram_invmatch("wan_gateway", value)) changed = 1; nvram_set("wan_gateway", value); } if ((value = getenv("dns"))) { chomp(value); // if (nvram_invmatch("wan_get_dns",value)) // changed=1; nvram_set("wan_get_dns", value); } /* * Don't care for linksys spec if ((value = getenv("wins"))) * nvram_set("wan_wins", value); if ((value = getenv("hostname"))) * sethostname(value, strlen(value) + 1); */ if ((value = getenv("domain"))) { chomp(value); if (nvram_invmatch("wan_get_domain", value)) changed = 1; nvram_set("wan_get_domain", value); // HeartBeat need to use } if ((value = getenv("lease"))) { chomp(value); nvram_set("wan_lease", value); expires(atoi(value)); } if (!changed) { cprintf("interface hasnt changed, do nothing\n"); return 0; } stop_firewall(); cprintf("configure to IF[%s] , IP[%s], MASK[%s]\n", wan_ifname, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask")); if (nvram_match("wan_proto", "pptp") && nvram_match("pptp_use_dhcp", "1")) eval("ifconfig", wan_ifname, temp_wan_ipaddr, "netmask", temp_wan_netmask, "up"); else eval("ifconfig", wan_ifname, nvram_safe_get("wan_ipaddr"), "netmask", nvram_safe_get("wan_netmask"), "up"); /* * We only want to exec bellow functions after dhcp get ip if the * wan_proto is heartbeat */ #ifdef HAVE_HEARTBEAT if (nvram_match("wan_proto", "heartbeat")) { int i = 0; /* * Delete all default routes */ while (route_del(wan_ifname, 0, NULL, NULL, NULL) == 0 || i++ < 10) ; /* * Set default route to gateway if specified */ route_add(wan_ifname, 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0"); /* * save dns to resolv.conf */ dns_to_resolv(); stop_udhcpd(); start_udhcpd(); start_firewall(); stop_wland(); start_wshaper(); start_wland(); start_heartbeat_boot(); } #else if (0) { // nothing } #endif #ifdef HAVE_PPTP else if (nvram_match("wan_proto", "pptp") && nvram_match("pptp_use_dhcp", "1")) { char pptpip[64]; struct dns_lists *dns_list = NULL; dns_to_resolv(); dns_list = get_dns_list(); int i = 0; if (dns_list) { for (i = 0; i < dns_list->num_servers; i++) route_add(wan_ifname, 0, dns_list->dns_server[i], nvram_safe_get("wan_gateway"), "255.255.255.255"); free(dns_list); } route_add(wan_ifname, 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0"); nvram_set("wan_gateway_buf", nvram_get("wan_gateway")); getIPFromName(nvram_safe_get("pptp_server_name"), pptpip); nvram_set("pptp_server_ip", pptpip); // Add the route to the PPTP server on the wan interface for pptp // client to reach it if (nvram_match("wan_gateway", "0.0.0.0") || nvram_match("wan_netmask", "0.0.0.0")) route_add(wan_ifname, 0, nvram_safe_get("pptp_server_ip"), nvram_safe_get("wan_gateway"), "255.255.255.255"); else route_add(wan_ifname, 0, nvram_safe_get("pptp_server_ip"), nvram_safe_get("wan_gateway"), nvram_safe_get("wan_netmask")); } #endif #ifdef HAVE_L2TP else if (nvram_match("wan_proto", "l2tp")) { char l2tpip[64]; struct dns_lists *dns_list = NULL; dns_to_resolv(); dns_list = get_dns_list(); int i = 0; if (dns_list) { for (i = 0; i < dns_list->num_servers; i++) route_add(wan_ifname, 0, dns_list->dns_server[i], nvram_safe_get("wan_gateway"), "255.255.255.255"); free(dns_list); } /* * Backup the default gateway. It should be used if L2TP connection * is broken */ nvram_set("wan_gateway_buf", nvram_get("wan_gateway")); getIPFromName(nvram_safe_get("l2tp_server_name"), l2tpip); nvram_set("l2tp_server_ip", l2tpip); route_add(wan_ifname, 0, nvram_safe_get("l2tp_server_ip"), nvram_safe_get("wan_gateway"), "255.255.255.255"); start_firewall(); start_l2tp_boot(); } #endif else { cprintf("start wan done\n"); start_wan_done(wan_ifname); } nvram_set("dhcpc_done", "1"); cprintf("done\n"); return 0; }
/* * Get the IP, Subnetmask, Geteway from WAN interface * and set to NV ram. */ void start_tmp_ppp(int num) { int timeout = 5; char pppoeifname[15]; char wanip[2][15] = { "wan_ipaddr", "wan_ipaddr_1" }; char wanmask[2][15] = { "wan_netmask", "wan_netmask_1" }; char wangw[2][15] = { "wan_gateway", "wan_gateway_1" }; // char wanif[2][15]={"wan_ifname","wan_ifname_1"}; // char *wan_ifname = nvram_safe_get("wan_ifname"); struct ifreq ifr; int s; cprintf("start session %d\n", num); sprintf(pppoeifname, "pppoe_ifname%d", num); if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) return; /* * Wait for ppp0 to be created */ while (ifconfig(nvram_safe_get(pppoeifname), IFUP, NULL, NULL) && timeout--) sleep(1); strncpy(ifr.ifr_name, nvram_safe_get(pppoeifname), IFNAMSIZ); /* * Set temporary IP address */ timeout = 3; while (ioctl(s, SIOCGIFADDR, &ifr) && timeout--) { perror(nvram_safe_get(pppoeifname)); printf("Wait %s inteface to init (1) ...\n", nvram_safe_get(pppoeifname)); sleep(1); }; nvram_set(wanip[num], inet_ntoa(sin_addr(&(ifr.ifr_addr)))); nvram_set(wanmask[num], "255.255.255.255"); /* * Set temporary P-t-P address */ timeout = 3; while (ioctl(s, SIOCGIFDSTADDR, &ifr) && timeout--) { perror(nvram_safe_get(pppoeifname)); printf("Wait %s inteface to init (2) ...\n", nvram_safe_get(pppoeifname)); sleep(1); } nvram_set(wangw[num], inet_ntoa(sin_addr(&(ifr.ifr_dstaddr)))); start_wan_done(nvram_safe_get(pppoeifname)); // if user press Connect" button from web, we must force to dial if (nvram_match("action_service", "start_pppoe") || nvram_match("action_service", "start_pppoe_1")) { sleep(3); // force_to_dial(nvram_safe_get("action_service")); start_force_to_dial(); nvram_unset("action_service"); } close(s); cprintf("done session %d\n", num); return; }
/* * Called when link comes up */ int ipup_main(int argc, char **argv) { FILE *fp; char *wan_ifname = safe_getenv("IFNAME"); // char *wan_proto = nvram_safe_get("wan_proto"); char *value; char buf[256]; cprintf("%s\n", argv[0]); stop_process("listen", "activity listener"); nvram_set("wan_iface", wan_ifname); if (check_action() != ACT_IDLE) return -1; /* * ipup will receive bellow six arguments */ /* * interface-name tty-device speed local-IP-address remote-IP-address * ipparam */ /* * Touch connection file */ if (!(fp = fopen("/tmp/ppp/link", "a"))) { perror("/tmp/ppp/link"); return errno; } fprintf(fp, "%s", argv[1]); fclose(fp); nvram_set("pppd_pppifname", wan_ifname); if (nvram_match("wan_proto", "pppoe")) nvram_set("pppoe_ifname", wan_ifname); if (getenv("IPLOCAL")) { value = getenvs("IPLOCAL"); ifconfig(wan_ifname, IFUP, value, "255.255.255.255"); if (nvram_match("wan_proto", "pppoe")) { nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr")); // Store nvram_set("wan_ipaddr", value); nvram_set("wan_netmask", "255.255.255.255"); #ifdef HAVE_PPPOATM } else if (nvram_match("wan_proto", "pppoa")) { nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr")); // Store nvram_set("wan_ipaddr", value); nvram_set("wan_netmask", "255.255.255.255"); #endif #ifdef HAVE_PPTP } else if (nvram_match("wan_proto", "pptp")) { nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr")); // Store nvram_set("pptp_get_ip", value); #endif #ifdef HAVE_L2TP } else if (nvram_match("wan_proto", "l2tp")) { nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr")); // Store nvram_set("l2tp_get_ip", value); #endif } #ifdef HAVE_3G else if (nvram_match("wan_proto", "3g")) { nvram_set("wan_ipaddr_buf", nvram_safe_get("wan_ipaddr")); // Store nvram_set("wan_ipaddr", value); nvram_set("wan_netmask", "255.255.255.255"); // reset 3gnetmodetoggle for mode 5 nvram_unset("3gnetmodetoggle"); #if defined(HAVE_TMK) || defined(HAVE_BKM) char *gpio3g = nvram_get("gpio3g"); if (gpio3g != NULL) set_gpio(atoi(gpio3g), 1); #endif } #endif } if (getenv("IPREMOTE")) { value = getenvs("IPREMOTE"); if (nvram_match("wan_proto", "pptp")) { nvram_set("wan_gateway", value); eval("route", "del", "default"); route_add(wan_ifname, 0, "0.0.0.0", value, "0.0.0.0"); } else { nvram_set("wan_gateway", value); } } strcpy(buf, ""); if (getenv("DNS1")) sprintf(buf, "%s", getenvs("DNS1")); if (getenv("DNS2")) sprintf(buf + strlen(buf), "%s%s", strlen(buf) ? " " : "", getenvs("DNS2")); nvram_set("wan_get_dns", buf); if ((value = getenv("AC_NAME"))) nvram_set("ppp_get_ac", value); if ((value = getenv("SRV_NAME"))) nvram_set("ppp_get_srv", value); if ((value = getenv("MTU"))) nvram_set("wan_run_mtu", value); start_wan_done(wan_ifname); cprintf("done\n"); return 0; }