int ip6up_main(int argc, char **argv) { char *wan_ifname = safe_getenv("IFNAME"); char *llremote = safe_getenv("LLREMOTE"); if (!wan_ifname || strlen(wan_ifname) <= 0) return 0; nvram_set("ipv6_ll_remote", llremote); switch (get_ipv6_service()) { case IPV6_NATIVE: case IPV6_NATIVE_DHCP: wait_ppp_count = 10; while ((!is_intf_up(wan_ifname) || !getifaddr(wan_ifname, AF_INET6, 0)) && (wait_ppp_count-- > 0)) sleep(1); break; default: wait_ppp_count = 0; break; } if (wait_ppp_count != -2) { wan6_up(wan_ifname); start_firewall(0, 0); } return 0; }
const char *get_wan6face(void) { switch (get_ipv6_service()) { case IPV6_NATIVE: case IPV6_NATIVE_DHCP: return get_wanface(); case IPV6_ANYCAST_6TO4: return "v6to4"; case IPV6_6IN4: return "v6in4"; } return nvram_safe_get("ipv6_ifname"); }
int ej_get_route_array(int eid, webs_t wp, int argc, char_t **argv) { int ret = 0; #ifdef RTCONFIG_IPV6 FILE *fp; char buf[256]; unsigned int fl = 0; int found = 0; #endif ret += websWrite(wp, "var routearray = ["); ret += ipv4_route_table_array(wp); ret += websWrite(wp, "[]];\n"); ret += websWrite(wp, "var routev6array = ["); #ifdef RTCONFIG_IPV6 if (get_ipv6_service() != IPV6_DISABLED) { if ((fp = fopen("/proc/net/if_inet6", "r")) == (FILE*)0) { ret += websWrite(wp, "[]];\n"); return ret; } while (fgets(buf, 256, fp) != NULL) { if(strstr(buf, "br0") == (char*) 0) continue; if (sscanf(buf, "%*s %*02x %*02x %02x", &fl) != 1) continue; if ((fl & 0xF0) == 0x20) { /* Link-Local Address is ready */ found = 1; break; } } fclose(fp); if (found) INET6_displayroutes_array(wp); } #endif ret += websWrite(wp, "[]];\n"); return ret; }
static void ipv6aide_check(int sig) { char tmp[64]; char *p = NULL; char *q; if (get_ipv6_service() != IPV6_NATIVE_DHCP) goto END; memset(tmp, 0, sizeof(tmp)); q = tmp; p = strtok_r(ipv6_gateway_address(), " ", &q); if (!p || !strlen(p) || !strlen(q)) { alarmtimer(NORMAL_PERIOD, 0); return; } dbG("ipv6 gateway: %s (dev %s)\n", p, q); eval("route", "-A", "inet6", "add", "2000::/3", "gw", p, "dev", q); END: ipv6aide_exit(sig); }
static void ipv6aide_check(int sig) { char tmp[64]; char *p = NULL; char *q, *r; if (get_ipv6_service() != IPV6_NATIVE_DHCP) goto END; p = nvram_safe_get("ipv6_gw_addr"); if (strlen(p)) { eval("route", "-A", "inet6", "add", "2000::/3", "gw", p, "dev", (char*)get_wan6face()); goto END; } r = strdup(ipv6_gateway_address()); if (!r) return; memset(tmp, 0, sizeof(tmp)); q = tmp; p = strtok_r(r, " ", &q); if (!p || !strlen(p) || !strlen(q)) { alarmtimer(NORMAL_PERIOD, 0); return; } dbG("ipv6 gateway: %s (dev %s)\n", p, q); eval("route", "-A", "inet6", "add", "2000::/3", "gw", p, "dev", q); free(r); END: ipv6aide_exit(sig); }
void rpc_parse_nvram_from_httpd(int unit, int subunit) { int ret = 0; if (!rpc_qtn_ready()) return; if (unit == 1 && subunit == -1){ rpc_qcsapi_set_SSID(WIFINAME, nvram_safe_get("wl1_ssid")); rpc_qcsapi_set_SSID_broadcast(WIFINAME, nvram_safe_get("wl1_closed")); rpc_qcsapi_set_vht(nvram_safe_get("wl1_nmode_x")); rpc_qcsapi_set_bw(nvram_safe_get("wl1_bw")); rpc_qcsapi_set_channel(nvram_safe_get("wl1_chanspec")); rpc_qcsapi_set_beacon_type(WIFINAME, nvram_safe_get("wl1_auth_mode_x")); rpc_qcsapi_set_WPA_encryption_modes(WIFINAME, nvram_safe_get("wl1_crypto")); rpc_qcsapi_set_key_passphrase(WIFINAME, nvram_safe_get("wl1_wpa_psk")); rpc_qcsapi_set_dtim(nvram_safe_get("wl1_dtim")); rpc_qcsapi_set_beacon_interval(nvram_safe_get("wl1_bcn")); rpc_set_radio(1, 0, nvram_get_int("wl1_radio")); rpc_update_macmode(nvram_safe_get("wl1_macmode")); rpc_update_wlmaclist(); rpc_update_wdslist(); rpc_update_wdslist(); rpc_update_wds_psk(nvram_safe_get("wl1_wds_psk")); rpc_update_ap_isolate(WIFINAME, atoi(nvram_safe_get("wl1_ap_isolate"))); if(nvram_get_int("wps_enable") == 1){ ret = rpc_qcsapi_wifi_disable_wps(WIFINAME, 0); if (ret < 0) dbG("rpc_qcsapi_wifi_disable_wps %s error, return: %d\n", WIFINAME, ret); ret = qcsapi_wps_set_ap_pin(WIFINAME, nvram_safe_get("wps_device_pin")); if (ret < 0) dbG("qcsapi_wps_set_ap_pin %s error, return: %d\n", WIFINAME, ret); ret = qcsapi_wps_registrar_set_pp_devname(WIFINAME, 0, (const char *) get_productid()); if (ret < 0) dbG("qcsapi_wps_registrar_set_pp_devname %s error, return: %d\n", WIFINAME, ret); }else{ ret = rpc_qcsapi_wifi_disable_wps(WIFINAME, 1); if (ret < 0) dbG("rpc_qcsapi_wifi_disable_wps %s error, return: %d\n", WIFINAME, ret); } ret = qcsapi_wps_upnp_enable(WIFINAME, 0); if (ret < 0) dbG("disable WPS UPnP %s error, return: %d\n", WIFINAME, ret); if(nvram_get_int("sw_mode") == SW_MODE_ROUTER || (nvram_get_int("sw_mode") == SW_MODE_AP && nvram_get_int("wlc_psta") == 1)){ if(nvram_get_int("wl1_mumimo") == 1){ dbG("mu-mimo: enable MU-MIMO\n"); ret = qcsapi_wifi_set_enable_mu(WIFINAME, 1); }else{ dbG("mu-mimo: disable MU-MIMO\n"); qcsapi_wifi_set_enable_mu(WIFINAME, 0); } if (ret < 0) dbG("enable_mu %s error, return: %d\n", WIFINAME, ret); } #ifdef RTCONFIG_IPV6 if (get_ipv6_service() == IPV6_DISABLED) qcsapi_wifi_run_script("router_command.sh", "ipv6_off wifi0"); else qcsapi_wifi_run_script("router_command.sh", "ipv6_on wifi0"); #endif }else if (unit == 1 && subunit == 1){ if(nvram_get_int("wl1.1_bss_enabled") == 1){ rpc_update_mbss("wl1.1_ssid", nvram_safe_get("wl1.1_ssid")); rpc_update_mbss("wl1.1_bss_enabled", nvram_safe_get("wl1.1_bss_enabled")); rpc_update_mbss("wl1.1_wpa_psk", nvram_safe_get("wl1.1_wpa_psk")); rpc_update_mbss("wl1.1_wpa_gtk_rekey", nvram_safe_get("wl1.1_wpa_gtk_rekey")); rpc_update_mbss("wl1.1_auth_mode_x", nvram_safe_get("wl1.1_auth_mode_x")); rpc_update_mbss("wl1.1_mbss", nvram_safe_get("wl1.1_mbss")); if(nvram_get_int("sw_mode") == SW_MODE_ROUTER){ if(nvram_match("wl1.1_lanaccess", "off") && !nvram_match("wl1.1_lanaccess", "")){ dbG("[lanaccess] wifi1 lanaccess off\n"); // libqcsapi_client/qtn/qtn_vlan.h // QVLAN_VID_ALL: 0xffff qcsapi_wifi_vlan_config("wifi0", e_qcsapi_vlan_enable, 0xffff /* QVLAN_VID_ALL */); qcsapi_wifi_vlan_config("wifi1", e_qcsapi_vlan_add, 4000 /* vid */); }else{ qcsapi_wifi_vlan_config("wifi1", e_qcsapi_vlan_del, 4000 /* vid */); } } #ifdef RTCONFIG_IPV6 if (get_ipv6_service() == IPV6_DISABLED) qcsapi_wifi_run_script("router_command.sh", "ipv6_off wifi1"); else qcsapi_wifi_run_script("router_command.sh", "ipv6_on wifi1"); #endif } else{ qcsapi_wifi_remove_bss(wl_vifname_qtn(unit, subunit)); } }else if (unit == 1 && subunit == 2){ if(nvram_get_int("wl1.2_bss_enabled") == 1){ rpc_update_mbss("wl1.2_ssid", nvram_safe_get("wl1.2_ssid")); rpc_update_mbss("wl1.2_bss_enabled", nvram_safe_get("wl1.2_bss_enabled")); rpc_update_mbss("wl1.2_wpa_psk", nvram_safe_get("wl1.2_wpa_psk")); rpc_update_mbss("wl1.2_wpa_gtk_rekey", nvram_safe_get("wl1.2_wpa_gtk_rekey")); rpc_update_mbss("wl1.2_auth_mode_x", nvram_safe_get("wl1.2_auth_mode_x")); rpc_update_mbss("wl1.2_mbss", nvram_safe_get("wl1.2_mbss")); if(nvram_get_int("sw_mode") == SW_MODE_ROUTER){ if(nvram_match("wl1.2_lanaccess", "off") && !nvram_match("wl1.2_lanaccess", "")){ dbG("[lanaccess] wifi2 lanaccess off\n"); // libqcsapi_client/qtn/qtn_vlan.h // QVLAN_VID_ALL: 0xffff qcsapi_wifi_vlan_config("wifi0", e_qcsapi_vlan_enable, 0xffff /* QVLAN_VID_ALL */); qcsapi_wifi_vlan_config("wifi2", e_qcsapi_vlan_add, 4001 /* vid */); }else{ qcsapi_wifi_vlan_config("wifi1", e_qcsapi_vlan_del, 4001 /* vid */); } } #ifdef RTCONFIG_IPV6 if (get_ipv6_service() == IPV6_DISABLED) qcsapi_wifi_run_script("router_command.sh", "ipv6_off wifi2"); else qcsapi_wifi_run_script("router_command.sh", "ipv6_on wifi2"); #endif } else{ qcsapi_wifi_remove_bss(wl_vifname_qtn(unit, subunit)); } }else if (unit == 1 && subunit == 3){ if(nvram_get_int("wl1.3_bss_enabled") == 1){ rpc_update_mbss("wl1.3_ssid", nvram_safe_get("wl1.3_ssid")); rpc_update_mbss("wl1.3_bss_enabled", nvram_safe_get("wl1.3_bss_enabled")); rpc_update_mbss("wl1.3_wpa_psk", nvram_safe_get("wl1.3_wpa_psk")); rpc_update_mbss("wl1.3_wpa_gtk_rekey", nvram_safe_get("wl1.3_wpa_gtk_rekey")); rpc_update_mbss("wl1.3_auth_mode_x", nvram_safe_get("wl1.3_auth_mode_x")); rpc_update_mbss("wl1.3_mbss", nvram_safe_get("wl1.3_mbss")); if(nvram_get_int("sw_mode") == SW_MODE_ROUTER){ if(nvram_match("wl1.3_lanaccess", "off") && !nvram_match("wl1.3_lanaccess", "")){ dbG("[lanaccess] wifi3 lanaccess off\n"); // libqcsapi_client/qtn/qtn_vlan.h // QVLAN_VID_ALL: 0xffff qcsapi_wifi_vlan_config("wifi0", e_qcsapi_vlan_enable, 0xffff /* QVLAN_VID_ALL */); qcsapi_wifi_vlan_config("wifi3", e_qcsapi_vlan_add, 4002 /* vid */); }else{ qcsapi_wifi_vlan_config("wifi1", e_qcsapi_vlan_del, 4002 /* vid */); } } #ifdef RTCONFIG_IPV6 if (get_ipv6_service() == IPV6_DISABLED) qcsapi_wifi_run_script("router_command.sh", "ipv6_off wifi3"); else qcsapi_wifi_run_script("router_command.sh", "ipv6_on wifi3"); #endif } else{ qcsapi_wifi_remove_bss(wl_vifname_qtn(unit, subunit)); } } if(nvram_get_int("sw_mode") == SW_MODE_ROUTER){ create_mbssid_vlan(); } /* disable UPNP */ qcsapi_wps_upnp_enable(WIFINAME, 0); // rpc_show_config(); }
int start_pppd(int unit) { FILE *fp; char options[80]; char *pppd_argv[] = { "/usr/sbin/pppd", "file", options, NULL}; char tmp[100], prefix[] = "wanXXXXXXXXXX_"; char buf[256]; /* although maximum length of pppoe_username/pppoe_passwd is 64. pppd accepts up to 256 characters. */ mode_t mask; int ret = 0; _dprintf("%s: unit=%d.\n", __FUNCTION__, unit); snprintf(prefix, sizeof(prefix), "wan%d_", unit); sprintf(options, "/tmp/ppp/options.wan%d", unit); mask = umask(0000); /* Generate options file */ if (!(fp = fopen(options, "w"))) { perror(options); umask(mask); return -1; } umask(mask); /* do not authenticate peer and do not use eap */ fprintf(fp, "noauth\n"); fprintf(fp, "refuse-eap\n"); handle_special_char_for_pppd(buf, sizeof(buf), nvram_safe_get(strcat_r(prefix, "pppoe_username", tmp))); fprintf(fp, "user '%s'\n", buf); handle_special_char_for_pppd(buf, sizeof(buf), nvram_safe_get(strcat_r(prefix, "pppoe_passwd", tmp))); fprintf(fp, "password '%s'\n", buf); if (nvram_match(strcat_r(prefix, "proto", tmp), "pptp")) { fprintf(fp, "plugin pptp.so\n"); fprintf(fp, "pptp_server '%s'\n", nvram_invmatch(strcat_r(prefix, "heartbeat_x", tmp), "") ? nvram_safe_get(strcat_r(prefix, "heartbeat_x", tmp)) : nvram_safe_get(strcat_r(prefix, "gateway_x", tmp))); /* see KB Q189595 -- historyless & mtu */ fprintf(fp, "nomppe-stateful mtu 1400\n"); if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "-mppc")) { fprintf(fp, "nomppe nomppc\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-40")) { fprintf(fp, "require-mppe\n"); fprintf(fp, "require-mppe-40\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-56")) { fprintf(fp, "nomppe-40\n" "require-mppe\n" "require-mppe-56\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-128")) { fprintf(fp, "nomppe-40\n" "nomppe-56\n" "require-mppe\n" "require-mppe-128\n"); } } else { fprintf(fp, "nomppe nomppc\n"); } if (nvram_match(strcat_r(prefix, "proto", tmp), "pppoe")) { fprintf(fp, "plugin rp-pppoe.so nic-%s\n", nvram_safe_get(strcat_r(prefix, "ifname", tmp))); if (nvram_invmatch(strcat_r(prefix, "pppoe_service", tmp), "")) { fprintf(fp, "rp_pppoe_service '%s'\n", nvram_safe_get(strcat_r(prefix, "pppoe_service", tmp))); } if (nvram_invmatch(strcat_r(prefix, "pppoe_ac", tmp), "")) { fprintf(fp, "rp_pppoe_ac '%s'\n", nvram_safe_get(strcat_r(prefix, "pppoe_ac", tmp))); } #ifdef RTCONFIG_DSL if (nvram_match("dsl0_proto", "pppoa")) { FILE *fp_dsl_mac; char *dsl_mac = NULL; int timeout = 10; /* wait up to 10 seconds */ while (timeout--) { fp_dsl_mac = fopen("/tmp/adsl/tc_mac.txt","r"); if (fp_dsl_mac != NULL) { dsl_mac = fgets(tmp, sizeof(tmp), fp_dsl_mac); dsl_mac = strsep(&dsl_mac, "\r\n"); fclose(fp_dsl_mac); break; } usleep(1000*1000); } fprintf(fp, "rp_pppoe_sess %d:%s\n", 154, (dsl_mac && *dsl_mac) ? dsl_mac : "00:11:22:33:44:55"); } #endif fprintf(fp, "mru %s mtu %s\n", nvram_safe_get(strcat_r(prefix, "pppoe_mru", tmp)), nvram_safe_get(strcat_r(prefix, "pppoe_mtu", tmp))); } if (nvram_invmatch(strcat_r(prefix, "proto", tmp), "l2tp")) { ret = nvram_get_int(strcat_r(prefix, "pppoe_idletime", tmp)); if (ret && nvram_get_int(strcat_r(prefix, "pppoe_demand", tmp))) { fprintf(fp, "idle %d ", ret); if (nvram_invmatch(strcat_r(prefix, "pppoe_txonly_x", tmp), "0")) fprintf(fp, "tx_only "); fprintf(fp, "demand\n"); } fprintf(fp, "persist\n"); } fprintf(fp, "holdoff %d\n", nvram_get_int(strcat_r(prefix, "pppoe_holdoff", tmp)) ? : 10); fprintf(fp, "maxfail %d\n", nvram_get_int(strcat_r(prefix, "pppoe_maxfail", tmp))); if (nvram_get_int(strcat_r(prefix, "dnsenable_x", tmp))) fprintf(fp, "usepeerdns\n"); fprintf(fp, "ipcp-accept-remote ipcp-accept-local noipdefault\n"); fprintf(fp, "ktune\n"); /* pppoe set these options automatically */ /* looks like pptp also likes them */ fprintf(fp, "default-asyncmap nopcomp noaccomp\n"); /* pppoe disables "vj bsdcomp deflate" automagically */ /* ccp should still be enabled - mppe/mppc requires this */ fprintf(fp, "novj nobsdcomp nodeflate\n"); /* echo failures */ fprintf(fp, "lcp-echo-interval 6\n"); fprintf(fp, "lcp-echo-failure 10\n"); /* pptp has Echo Request/Reply, l2tp has Hello packets */ if (nvram_match(strcat_r(prefix, "proto", tmp), "pptp") || nvram_match(strcat_r(prefix, "proto", tmp), "l2tp")) fprintf(fp, "lcp-echo-adaptive\n"); fprintf(fp, "unit %d\n", unit); fprintf(fp, "linkname wan%d\n", unit); #ifdef RTCONFIG_IPV6 switch (get_ipv6_service()) { case IPV6_NATIVE_DHCP: case IPV6_MANUAL: if (nvram_match("ipv6_ifdev", "ppp")) fprintf(fp, "+ipv6\n"); break; } #endif /* user specific options */ fprintf(fp, "%s\n", nvram_safe_get(strcat_r(prefix, "pppoe_options_x", tmp))); fclose(fp); /* shut down previous instance if any */ stop_pppd(unit); nvram_set(strcat_r(prefix, "pppoe_ifname", tmp), ""); if (nvram_match(strcat_r(prefix, "proto", tmp), "l2tp")) { if (!(fp = fopen("/tmp/l2tp.conf", "w"))) { perror(options); return -1; } fprintf(fp, "# automagically generated\n" "global\n\n" "load-handler \"sync-pppd.so\"\n" "load-handler \"cmd.so\"\n\n" "section sync-pppd\n\n" "lac-pppd-opts \"file %s\"\n\n" "section peer\n" "port 1701\n" "peername %s\n" "hostname %s\n" "lac-handler sync-pppd\n" "persist yes\n" "maxfail %d\n" "holdoff %d\n" "hide-avps no\n" "section cmd\n\n", options, nvram_invmatch(strcat_r(prefix, "heartbeat_x", tmp), "") ? nvram_safe_get(strcat_r(prefix, "heartbeat_x", tmp)) : nvram_safe_get(strcat_r(prefix, "gateway_x", tmp)), nvram_invmatch(strcat_r(prefix, "hostname", tmp), "") ? nvram_safe_get(strcat_r(prefix, "hostname", tmp)) : "localhost", nvram_get_int(strcat_r(prefix, "pppoe_maxfail", tmp)) ? : 32767, nvram_get_int(strcat_r(prefix, "pppoe_holdoff", tmp)) ? : 10); fclose(fp); /* launch l2tp */ eval("/usr/sbin/l2tpd"); ret = 3; do { _dprintf("%s: wait l2tpd up at %d seconds...\n", __FUNCTION__, ret); usleep(1000*1000); } while (!pids("l2tpd") && ret--); /* start-session */ ret = eval("/usr/sbin/l2tp-control", "start-session 0.0.0.0"); /* pppd sync nodetach noaccomp nobsdcomp nodeflate */ /* nopcomp novj novjccomp file /tmp/ppp/options.l2tp */ } else
int start_pppd(int unit) { int ret; FILE *fp; char options[80]; char *pppd_argv[] = { "/usr/sbin/pppd", "file", options, NULL}; char *l2tpd_argv[] = { "/usr/sbin/l2tpd", "-f", NULL}; char tmp[100], tmp1[32], prefix[] = "wanXXXXXXXXXX_"; mode_t mask; int pid; _dprintf("%s: unit=%d.\n", __FUNCTION__, unit); snprintf(prefix, sizeof(prefix), "wan%d_", unit); sprintf(options, "/tmp/ppp/options.wan%d", unit); mask = umask(0000); /* Generate options file */ if (!(fp = fopen(options, "w"))) { perror(options); umask(mask); return -1; } umask(mask); /* do not authenticate peer and do not use eap */ fprintf(fp, "noauth\n"); fprintf(fp, "refuse-eap\n"); fprintf(fp, "user '%s'\n", nvram_safe_get(strcat_r(prefix, "pppoe_username", tmp))); fprintf(fp, "password '%s'\n", nvram_safe_get(strcat_r(prefix, "pppoe_passwd", tmp))); if (nvram_match(strcat_r(prefix, "proto", tmp), "pptp")) { fprintf(fp, "plugin pptp.so\n"); fprintf(fp, "pptp_server '%s'\n", nvram_invmatch(strcat_r(prefix, "heartbeat_x", tmp), "") ? nvram_safe_get(strcat_r(prefix, "heartbeat_x", tmp)) : nvram_safe_get(strcat_r(prefix, "gateway_x", tmp))); /* see KB Q189595 -- historyless & mtu */ fprintf(fp, "nomppe-stateful mtu 1400\n"); if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "-mppc")) { fprintf(fp, "nomppe nomppc\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-40")) { fprintf(fp, "require-mppe-40\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-56")) { fprintf(fp, "nomppe-40\n" "require-mppe-56\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-128")) { fprintf(fp, "nomppe-40\n" "nomppe-56\n" "require-mppe-128\n"); } } else { fprintf(fp, "nomppe nomppc\n"); } if (nvram_match(strcat_r(prefix, "proto", tmp), "pppoe")) { #ifdef RTCONFIG_DSL FILE* fp_dsl_mac; char buf_mac[32]; int trp_cnt; int rm_cnt; #endif fprintf(fp, "plugin rp-pppoe.so"); if (nvram_invmatch(strcat_r(prefix, "pppoe_service", tmp), "")) { fprintf(fp, " rp_pppoe_service '%s'", nvram_safe_get(strcat_r(prefix, "pppoe_service", tmp))); } if (nvram_invmatch(strcat_r(prefix, "pppoe_ac", tmp), "")) { fprintf(fp, " rp_pppoe_ac '%s'", nvram_safe_get(strcat_r(prefix, "pppoe_ac", tmp))); } fprintf(fp, " nic-%s\n", nvram_safe_get(strcat_r(prefix, "ifname", tmp))); fprintf(fp, "mru %s mtu %s\n", nvram_safe_get(strcat_r(prefix, "pppoe_mru", tmp)), nvram_safe_get(strcat_r(prefix, "pppoe_mtu", tmp))); // wait 10 seconds for DSL MAC address file ready #ifdef RTCONFIG_DSL if (nvram_match("dsl0_proto", "pppoa")) { strcpy(buf_mac, "00:11:22:33:44:55"); for (trp_cnt = 0; trp_cnt < 10; trp_cnt++) { fp_dsl_mac = fopen("/tmp/adsl/tc_mac.txt","r"); if (fp_dsl_mac != NULL) { fgets(buf_mac,sizeof(buf_mac),fp_dsl_mac); fclose(fp_dsl_mac); break; } usleep(1000*1000); } // remove cr lf in buf_mac for (rm_cnt = 0; rm_cnt < sizeof(buf_mac); rm_cnt++) { if (buf_mac[rm_cnt] == 0) break; if (buf_mac[rm_cnt] == 0x0a || buf_mac[rm_cnt] == 0x0d) { buf_mac[rm_cnt]=0; break; } } fprintf(fp, "rp_pppoe_sess %d:%s\n", 154, buf_mac); } #endif } if (nvram_invmatch(strcat_r(prefix, "proto", tmp), "l2tp")){ ret = nvram_get_int(strcat_r(prefix, "pppoe_idletime", tmp)); if (ret && nvram_match(strcat_r(prefix, "pppoe_demand", tmp), "1")) { fprintf(fp, "idle %d ", ret); if (nvram_invmatch(strcat_r(prefix, "pppoe_txonly_x", tmp), "0")) fprintf(fp, "tx_only "); fprintf(fp, "demand\n"); } fprintf(fp, "persist\n"); } fprintf(fp, "holdoff %s\n", nvram_invmatch(strcat_r(prefix, "pppoe_holdoff", tmp), "")?nvram_safe_get(tmp):"10"); // pppd re-call-time(s) fprintf(fp, "maxfail 0\n"); if (nvram_invmatch(strcat_r(prefix, "dnsenable_x", tmp), "0")) fprintf(fp, "usepeerdns\n"); fprintf(fp, "ipcp-accept-remote ipcp-accept-local noipdefault\n"); fprintf(fp, "ktune\n"); /* pppoe set these options automatically */ /* looks like pptp also likes them */ fprintf(fp, "default-asyncmap nopcomp noaccomp\n"); /* pppoe disables "vj bsdcomp deflate" automagically */ /* ccp should still be enabled - mppe/mppc requires this */ fprintf(fp, "novj nobsdcomp nodeflate\n"); /* echo failures */ fprintf(fp, "lcp-echo-interval 6\n"); fprintf(fp, "lcp-echo-failure 10\n"); fprintf(fp, "unit %d\n", unit); fprintf(fp, "linkname wan%d\n", unit); #ifdef RTCONFIG_IPV6 switch (get_ipv6_service()) { case IPV6_NATIVE: case IPV6_NATIVE_DHCP: case IPV6_MANUAL: fprintf(fp, "+ipv6\n"); break; } #endif /* user specific options */ fprintf(fp, "%s\n", nvram_safe_get(strcat_r(prefix, "pppoe_options_x", tmp))); fclose(fp); if (nvram_match(strcat_r(prefix, "proto", tmp), "l2tp")) { if (!(fp = fopen("/tmp/l2tp.conf", "w"))) { perror(options); return -1; } fprintf(fp, "# automagically generated\n" "global\n\n" "load-handler \"sync-pppd.so\"\n" "load-handler \"cmd.so\"\n\n" "section sync-pppd\n\n" "lac-pppd-opts \"file %s\"\n\n" "section peer\n" "port 1701\n" "peername %s\n" "hostname %s\n" "lac-handler sync-pppd\n" "persist yes\n" "maxfail %s\n" "holdoff %s\n" "hide-avps no\n" "section cmd\n\n", options, nvram_invmatch(strcat_r(prefix, "heartbeat_x", tmp), "") ? nvram_safe_get(strcat_r(prefix, "heartbeat_x", tmp)) : nvram_safe_get(strcat_r(prefix, "gateway_x", tmp)), nvram_invmatch(strcat_r(prefix, "hostname", tmp), "") ? // ham 0509 nvram_safe_get(strcat_r(prefix, "hostname", tmp)) : "localhost", nvram_invmatch(strcat_r(prefix, "pppoe_maxfail", tmp), "") ? nvram_safe_get(strcat_r(prefix, "pppoe_maxfail", tmp)) : "32767", nvram_invmatch(strcat_r(prefix, "pppoe_holdoff", tmp), "") ? nvram_safe_get(strcat_r(prefix, "pppoe_holdoff", tmp)) : "10"); fclose(fp); /* launch l2tp */ ret = _eval(l2tpd_argv, NULL, 0, &pid); int retry = 3; while(!pids("l2tpd") && retry--){ _dprintf("%s: wait l2tpd up at %d seconds...\n", __FUNCTION__, retry); sleep(1); } sleep(1); // when the pid of l2tpd is existed, also need to wait a more second. /* start-session */ ret = eval("/usr/sbin/l2tp-control", "start-session 0.0.0.0"); /* pppd sync nodetach noaccomp nobsdcomp nodeflate */ /* nopcomp novj novjccomp file /tmp/ppp/options.l2tp */ } else{ char pid_file[256], *value; int orig_pid; int wait_time = 0; memset(pid_file, 0, 256); snprintf(pid_file, 256, "/var/run/ppp-wan%d.pid", unit); if((value = file2str(pid_file)) != NULL && (orig_pid = atoi(value)) > 1){ _dprintf("%s: kill pppd(%d).\n", __FUNCTION__, orig_pid); kill(orig_pid, SIGHUP); sleep(1); while(check_process_exist(orig_pid) && wait_time < MAX_WAIT_FILE){ _dprintf("%s: kill pppd(%d).\n", __FUNCTION__, orig_pid); ++wait_time; kill(orig_pid, SIGTERM); sleep(1); } if(check_process_exist(orig_pid)){ kill(orig_pid, SIGKILL); sleep(1); } } if(value != NULL) free(value); ret = _eval(pppd_argv, NULL, 0, NULL); } return 0; }
ej_lan_ipv6_network_array(int eid, webs_t wp, int argc, char_t **argv) { FILE *fp; char buf[64+32+8192+1]; char *hostname, *macaddr, ipaddrs[8192+1]; char ipv6_dns_str[1024]; char *wan_type, *wan_dns, *p; int service, i, ret = 0; ret += websWrite(wp, "var ipv6cfgarray = ["); if (!(ipv6_enabled() && is_routing_enabled())) { ret += websWrite(wp, "[]];\n"); ret += websWrite(wp, "var ipv6clientarray = ["); ret += websWrite(wp, "[]];\n"); return ret; } service = get_ipv6_service(); switch (service) { case IPV6_NATIVE_DHCP: wan_type = "Native with DHCP-PD"; break; case IPV6_6TO4: wan_type = "Tunnel 6to4"; break; case IPV6_6IN4: wan_type = "Tunnel 6in4"; break; case IPV6_6RD: wan_type = "Tunnel 6rd"; break; case IPV6_MANUAL: wan_type = "Static"; break; default: wan_type = "Disabled"; break; } ret += websWrite(wp, "[\"IPv6 Connection Type\",\"%s\"],", wan_type); ret += websWrite(wp, "[\"WAN IPv6 Address\",\"%s\"],", getifaddr((char *) get_wan6face(), AF_INET6, GIF_PREFIXLEN) ? : nvram_safe_get("ipv6_rtr_addr")); ret += websWrite(wp, "[\"WAN IPv6 Gateway\",\"%s\"],", ipv6_gateway_address() ? : ""); ret += websWrite(wp, "[\"LAN IPv6 Address\",\"%s/%d\"],", nvram_safe_get("ipv6_rtr_addr"), nvram_get_int("ipv6_prefix_length")); ret += websWrite(wp, "[\"LAN IPv6 Link-Local Address\",\"%s\"],", getifaddr(nvram_safe_get("lan_ifname"), AF_INET6, GIF_LINKLOCAL | GIF_PREFIXLEN) ? : ""); if (service == IPV6_NATIVE_DHCP) { ret += websWrite(wp, "[\"DHCP-PD\",\"%s\"],", nvram_get_int("ipv6_dhcp_pd") ? "Enabled" : "Disabled"); } ret += websWrite(wp, "[\"LAN IPv6 Prefix\",\"%s/%d\"],", nvram_safe_get("ipv6_prefix"), nvram_get_int("ipv6_prefix_length")); if (service == IPV6_NATIVE_DHCP && nvram_get_int("ipv6_dnsenable")) { wan_dns = nvram_safe_get("ipv6_get_dns"); } else { char nvname[sizeof("ipv6_dnsXXX")]; char *next = ipv6_dns_str; ipv6_dns_str[0] = '\0'; for (i = 1; i <= 3; i++) { snprintf(nvname, sizeof(nvname), "ipv6_dns%d", i); wan_dns = nvram_safe_get(nvname); if (*wan_dns) next += sprintf(next, *ipv6_dns_str ? " %s" : "%s", wan_dns); } wan_dns = ipv6_dns_str; } ret += websWrite(wp, "[\"DNS Address\",\"%s\"],", wan_dns); ret += websWrite(wp, "[]];\n"); ret += websWrite(wp, "var ipv6clientarray = ["); /* Refresh lease file to get actual expire time */ killall("dnsmasq", SIGUSR2); usleep(100 * 1000); get_ipv6_client_info(); get_ipv6_client_list(); if ((fp = fopen(IPV6_CLIENT_LIST, "r")) == NULL) { _dprintf("can't open %s: %s", IPV6_CLIENT_LIST, strerror(errno)); return ret; } while (fgets(buf, sizeof(buf), fp) != NULL) { char *ptr = buf; ptr = strsep(&ptr, "\n"); hostname = strsep(&ptr, " "); macaddr = strsep(&ptr, " "); if (!macaddr || *macaddr == '\0' || !ptr || *ptr == '\0') continue; if (strlen(hostname) > 32) sprintf(hostname + 29, "..."); ipaddrs[0] = '\0'; p = ipaddrs; while (ptr && *ptr) { char *next = strsep(&ptr, ",\n"); if (next && *next) p += snprintf(p, sizeof(ipaddrs) + ipaddrs - p, "%s%s", *ipaddrs ? ", " : "", next); } ret += websWrite(wp, "[\"%s\", \"%s\", \"%s\"],", hostname, macaddr, ipaddrs); } fclose(fp); ret += websWrite(wp, "[]];\n"); return ret; }
int start_vpnc(void) { FILE *fp; char options[80]; char *pppd_argv[] = { "/usr/sbin/pppd", "file", options, NULL}; char tmp[100], prefix[] = "vpnc_", wan_prefix[] = "wanXXXXXXXXXX_"; char buf[256]; /* although maximum length of pppoe_username/pppoe_passwd is 64. pppd accepts up to 256 characters. */ mode_t mask; int ret = 0; // _dprintf("%s: unit=%d.\n", __FUNCTION__, unit); // snprintf(prefix, sizeof(prefix), "vpn%d_", unit); snprintf(wan_prefix, sizeof(wan_prefix), "wan%d_", wan_primary_ifunit()); if (nvram_match(strcat_r(wan_prefix, "proto", tmp), "pptp") || nvram_match(strcat_r(wan_prefix, "proto", tmp), "l2tp")) return 0; if (nvram_match(strcat_r(prefix, "proto", tmp), "pptp")) sprintf(options, "/tmp/ppp/vpnc_options.pptp"); else if (nvram_match(strcat_r(prefix, "proto", tmp), "l2tp")) sprintf(options, "/tmp/ppp/vpnc_options.l2tp"); else return 0; update_vpnc_state(prefix, WAN_STATE_INITIALIZING, 0); mask = umask(0000); /* Generate options file */ if (!(fp = fopen(options, "w"))) { perror(options); umask(mask); return -1; } umask(mask); /* do not authenticate peer and do not use eap */ fprintf(fp, "noauth\n"); fprintf(fp, "refuse-eap\n"); handle_special_char_for_vpnclient(buf, sizeof(buf), nvram_safe_get(strcat_r(prefix, "pppoe_username", tmp))); fprintf(fp, "user '%s'\n", buf); handle_special_char_for_vpnclient(buf, sizeof(buf), nvram_safe_get(strcat_r(prefix, "pppoe_passwd", tmp))); fprintf(fp, "password '%s'\n", buf); if (nvram_match(strcat_r(prefix, "proto", tmp), "pptp")) { fprintf(fp, "plugin pptp.so\n"); fprintf(fp, "pptp_server '%s'\n", nvram_invmatch(strcat_r(prefix, "heartbeat_x", tmp), "") ? nvram_safe_get(strcat_r(prefix, "heartbeat_x", tmp)) : nvram_safe_get(strcat_r(prefix, "gateway_x", tmp))); fprintf(fp, "vpnc 1\n"); /* see KB Q189595 -- historyless & mtu */ fprintf(fp, "nomppe-stateful mtu 1400\n"); if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "-mppc")) { fprintf(fp, "nomppe nomppc\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-40")) { fprintf(fp, "nomppe-56\n" "nomppe-128\n" "require-mppe\n" "require-mppe-40\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-56")) { fprintf(fp, "nomppe-40\n" "nomppe-128\n" "require-mppe\n" "require-mppe-56\n"); } else if (nvram_match(strcat_r(prefix, "pptp_options_x", tmp), "+mppe-128")) { fprintf(fp, "nomppe-40\n" "nomppe-56\n" "require-mppe\n" "require-mppe-128\n"); } } else { fprintf(fp, "nomppe nomppc\n"); } if (nvram_invmatch(strcat_r(prefix, "proto", tmp), "l2tp")) { ret = nvram_get_int(strcat_r(prefix, "pppoe_idletime", tmp)); if (ret && nvram_get_int(strcat_r(prefix, "pppoe_demand", tmp))) { fprintf(fp, "idle %d ", ret); if (nvram_invmatch(strcat_r(prefix, "pppoe_txonly_x", tmp), "0")) fprintf(fp, "tx_only "); fprintf(fp, "demand\n"); } fprintf(fp, "persist\n"); } fprintf(fp, "holdoff %d\n", nvram_get_int(strcat_r(prefix, "pppoe_holdoff", tmp)) ? : 10); fprintf(fp, "maxfail %d\n", nvram_get_int(strcat_r(prefix, "pppoe_maxfail", tmp))); if (nvram_invmatch(strcat_r(prefix, "dnsenable_x", tmp), "0")) fprintf(fp, "usepeerdns\n"); fprintf(fp, "ipcp-accept-remote ipcp-accept-local noipdefault\n"); fprintf(fp, "ktune\n"); /* pppoe set these options automatically */ /* looks like pptp also likes them */ fprintf(fp, "default-asyncmap nopcomp noaccomp\n"); /* pppoe disables "vj bsdcomp deflate" automagically */ /* ccp should still be enabled - mppe/mppc requires this */ fprintf(fp, "novj nobsdcomp nodeflate\n"); /* echo failures */ fprintf(fp, "lcp-echo-interval 6\n"); fprintf(fp, "lcp-echo-failure 10\n"); /* pptp has Echo Request/Reply, l2tp has Hello packets */ if (nvram_match(strcat_r(prefix, "proto", tmp), "pptp") || nvram_match(strcat_r(prefix, "proto", tmp), "l2tp")) fprintf(fp, "lcp-echo-adaptive\n"); fprintf(fp, "unit %d\n", vpnc_unit); fprintf(fp, "linkname vpn%d\n", vpnc_unit); fprintf(fp, "ip-up-script %s\n", "/tmp/ppp/vpnc-ip-up"); fprintf(fp, "ip-down-script %s\n", "/tmp/ppp/vpnc-ip-down"); fprintf(fp, "ip-pre-up-script %s\n", "/tmp/ppp/vpnc-ip-pre-up"); fprintf(fp, "auth-fail-script %s\n", "/tmp/ppp/vpnc-auth-fail"); #ifdef RTCONFIG_IPV6 switch (get_ipv6_service()) { case IPV6_NATIVE: case IPV6_NATIVE_DHCP: case IPV6_MANUAL: fprintf(fp, "+ipv6\n"); break; } #endif /* user specific options */ fprintf(fp, "%s\n", nvram_safe_get(strcat_r(prefix, "pppoe_options_x", tmp))); fclose(fp); /* shut down previous instance if any */ stop_vpnc(); if (nvram_match(strcat_r(prefix, "proto", tmp), "l2tp")) { if (!(fp = fopen("/tmp/l2tp.conf", "w"))) { perror(options); return -1; } fprintf(fp, "# automagically generated\n" "global\n\n" "load-handler \"sync-pppd.so\"\n" "load-handler \"cmd.so\"\n\n" "section sync-pppd\n\n" "lac-pppd-opts \"file %s\"\n\n" "section peer\n" "port 1701\n" "peername %s\n" "vpnc 1\n" "hostname %s\n" "lac-handler sync-pppd\n" "persist yes\n" "maxfail %d\n" "holdoff %d\n" "hide-avps no\n" "section cmd\n\n", options, nvram_invmatch(strcat_r(prefix, "heartbeat_x", tmp), "") ? nvram_safe_get(strcat_r(prefix, "heartbeat_x", tmp)) : nvram_safe_get(strcat_r(prefix, "gateway_x", tmp)), nvram_invmatch(strcat_r(prefix, "hostname", tmp), "") ? nvram_safe_get(strcat_r(prefix, "hostname", tmp)) : "localhost", nvram_get_int(strcat_r(prefix, "pppoe_maxfail", tmp)) ? : 32767, nvram_get_int(strcat_r(prefix, "pppoe_holdoff", tmp)) ? : 10); fclose(fp); /* launch l2tp */ eval("/usr/sbin/l2tpd"); ret = 3; do { _dprintf("%s: wait l2tpd up at %d seconds...\n", __FUNCTION__, ret); usleep(1000*1000); } while (!pids("l2tpd") && ret--); /* start-session */ ret = eval("/usr/sbin/l2tp-control", "start-session 0.0.0.0"); /* pppd sync nodetach noaccomp nobsdcomp nodeflate */ /* nopcomp novj novjccomp file /tmp/ppp/options.l2tp */ } else