void start_igmp_proxy(void) { int ret = 0; pid_t pid; char name[80], *next, *svbuf; char *argv[] = { "igmprt", "/tmp/igmpproxy.conf", NULL }; int ifcount = 0; FILE *fp = fopen("/tmp/igmpproxy.conf", "wb"); if (nvram_match("dtag_vlan8", "1") && nvram_match("wan_vdsl", "1")) { fprintf(fp, "quickleave\nphyint %s upstream ratelimit 0 threshold 1\n", nvram_safe_get("tvnicfrom")); fprintf(fp, "phyint %s disabled\n", get_wan_face()); } else { fprintf(fp, "quickleave\nphyint %s upstream ratelimit 0 threshold 1\n", get_wan_face()); } if (nvram_match("block_multicast", "0")) { fprintf(fp, "phyint %s downstream ratelimit 0 threshold 1\n", nvram_safe_get("lan_ifname")); ifcount++; } else { fprintf(fp, "phyint %s disabled\n" "phyint %s:0 disabled\n", nvram_safe_get("lan_ifname"), nvram_safe_get("lan_ifname")); } char ifnames[256]; getIfLists(ifnames, 256); foreach(name, ifnames, next) { if (strcmp(get_wan_face(), name) && strcmp(nvram_safe_get("lan_ifname"), name) && strcmp(nvram_safe_get("tvnicfrom"), name)) { if (nvram_nmatch("0", "%s_bridged", name) && nvram_nmatch("1", "%s_multicast", name)) { fprintf(fp, "phyint %s downstream ratelimit 0 threshold 1\n", name); ifcount++; } else fprintf(fp, "phyint %s disabled\n", name); } } fprintf(fp, "phyint lo disabled\n"); fclose(fp); if (nvram_match("wan_proto", "disabled")) // todo: add upstream // config { // ret = _evalpid (igmp_proxybr_argv, NULL, 0, &pid); return; } else { if (ifcount) { if (pidof("igmprt") < 1) ret = _evalpid(argv, NULL, 0, &pid); dd_syslog(LOG_INFO, "igmprt : multicast daemon successfully started\n"); } } cprintf("done\n"); return; }
void start_snmp(void) { int ret = 0; pid_t pid; char *snmpd_argv[] = { "snmpd", "-c", SNMP_CONF_FILE, NULL }; FILE *fp = NULL; stop_snmp(); if (!nvram_invmatch("snmpd_enable", "0")) return; fp = fopen(SNMP_CONF_FILE, "w"); if (NULL == fp) return; if (strlen(nvram_safe_get("snmpd_syslocation")) > 0) fprintf(fp, "syslocation %s\n", nvram_safe_get("snmpd_syslocation")); if (strlen(nvram_safe_get("snmpd_syscontact")) > 0) fprintf(fp, "syscontact %s\n", nvram_safe_get("snmpd_syscontact")); if (strlen(nvram_safe_get("snmpd_sysname")) > 0) fprintf(fp, "sysname %s\n", nvram_safe_get("snmpd_sysname")); if (strlen(nvram_safe_get("snmpd_rocommunity")) > 0) fprintf(fp, "rocommunity %s\n", nvram_safe_get("snmpd_rocommunity")); if (strlen(nvram_safe_get("snmpd_rwcommunity")) > 0) fprintf(fp, "rwcommunity %s\n", nvram_safe_get("snmpd_rwcommunity")); fprintf(fp, "sysservices 9\n"); fprintf(fp, "pass_persist .1.3.6.1.4.1.2021.255 /etc/wl_snmpd.sh\n"); fclose(fp); ret = _evalpid(snmpd_argv, NULL, 0, &pid); cprintf("done\n"); dd_syslog(LOG_INFO, "snmpd : SNMP daemon successfully started\n"); return; }
void start_ttraff(void) { if (!nvram_match("ttraff_enable", "1")) return; if ((nvram_match("ttraff_iface", "") || !nvram_get("ttraff_iface")) && (nvram_match("wan_proto", "disabled") || getWET())) return; pid_t pid; char *argv[] = { "ttraff", NULL }; int ret = _evalpid(argv, NULL, 0, &pid); dd_syslog(LOG_INFO, "ttraff : traffic counter daemon successfully started\n"); cprintf("done"); return; }
void start_radio_timer(void) { if (nvram_match("radio0_timer_enable", "0") && nvram_match("radio1_timer_enable", "0")) return; #ifdef HAVE_MADWIFI if (nvram_match("ath0_net_mode", "disabled")) #else if (nvram_match("wl0_net_mode", "disabled") && nvram_match("wl1_net_mode", "disabled")) #endif return; pid_t pid; char *argv[] = { "radio_timer", NULL }; int ret = _evalpid(argv, NULL, 0, &pid); dd_syslog(LOG_INFO, "radio_timer : radio timer daemon successfully started\n"); cprintf("done"); return; }
void start_l2tp(int status) { int ret; FILE *fp; char *l2tp_argv[] = { "xl2tpd", NULL }; char username[80], passwd[80]; // stop_dhcpc(); #ifdef HAVE_PPPOE stop_pppoe(); #endif #ifdef HAVE_PPTP stop_pptp(); #endif stop_l2tp(); snprintf(username, sizeof(username), "%s", nvram_safe_get("ppp_username")); snprintf(passwd, sizeof(passwd), "%s", nvram_safe_get("ppp_passwd")); if (status != REDIAL) { insmod("ipv6"); insmod("l2tp_core"); insmod("l2tp_netlink"); insmod("l2tp_ppp"); mkdir("/tmp/ppp", 0777); mkdir("/var/run/xl2tpd", 0777); mkdir("/tmp/xl2tpd", 0777); symlink("/sbin/rc", "/tmp/ppp/ip-up"); symlink("/sbin/rc", "/tmp/ppp/ip-down"); symlink("/dev/null", "/tmp/ppp/connect-errors"); /* * Generate L2TP configuration file */ if (!(fp = fopen("/tmp/xl2tpd/xl2tpd.conf", "w"))) { perror("/tmp/xl2tpd/xl2tpd.conf"); return; } /*[global] port = 1701 ;auth file = /etc/xl2tpd/xl2tp-secrets [lac fbnl2tpserver] lns = 10.64.1.237 require chap = yes refuse pap = yes require authentication = yes ; Name should be the same as the username in the PPP authentication! name = dani ppp debug = yes pppoptfile = /etc/xl2tpd/options.l2tp length bit = yes */ fprintf(fp, "[global]\n"); // Global section fprintf(fp, "port = 1701\n"); // Bind address fprintf(fp, "[lac %s]\n", nvram_safe_get("l2tp_server_name")); fprintf(fp, "lns = %s\n", nvram_safe_get("l2tp_server_name")); fprintf(fp, "require chap = %s\n", nvram_default_get("l2tp_req_chap", "yes")); fprintf(fp, "refuse pap = %s\n", nvram_default_get("l2tp_ref_pap", "yes")); fprintf(fp, "redial = yes\n"); fprintf(fp, "redial timeout = 15\n"); fprintf(fp, "require authentication = %s\n", nvram_default_get("l2tp_req_auth", "yes")); fprintf(fp, "name = %s\n", username); fprintf(fp, "pppoptfile = /tmp/ppp/options\n"); fprintf(fp, "length bit = yes\n"); fclose(fp); /* * Generate options file */ if (!(fp = fopen("/tmp/ppp/options", "w"))) { perror("/tmp/ppp/options"); return; } if (nvram_match("mtu_enable", "1")) { if (atoi(nvram_safe_get("wan_mtu")) > 0) { fprintf(fp, "mtu %s\n", nvram_safe_get("wan_mtu")); fprintf(fp, "mru %s\n", nvram_safe_get("wan_mtu")); } } fprintf(fp, "defaultroute\n"); // Add a default route to the // system routing tables, // using the peer as the // gateway fprintf(fp, "usepeerdns\n"); // Ask the peer for up to 2 DNS // server addresses // fprintf(fp, "pty 'pptp %s // --nolaunchpppd'\n",nvram_safe_get("pptp_server_ip")); fprintf(fp, "user '%s'\n", username); // fprintf(fp, "persist\n"); // Do not exit after a connection is // terminated. if (nvram_match("ppp_demand", "1")) { // demand mode fprintf(fp, "idle %d\n", nvram_match("ppp_demand", "1") ? atoi(nvram_safe_get("ppp_idletime")) * 60 : 0); // fprintf(fp, "demand\n"); // Dial on demand // fprintf(fp, "persist\n"); // Do not exit after a connection is // terminated. // fprintf(fp, "%s:%s\n",PPP_PSEUDO_IP,PPP_PSEUDO_GW); // <local // IP>:<remote IP> fprintf(fp, "ipcp-accept-remote\n"); fprintf(fp, "ipcp-accept-local\n"); fprintf(fp, "connect true\n"); fprintf(fp, "noipdefault\n"); // Disables the default // behaviour when no local IP // address is specified fprintf(fp, "ktune\n"); // Set /proc/sys/net/ipv4/ip_dynaddr // to 1 in demand mode if the local // address changes } else { // keepalive mode start_redial(); } fprintf(fp, "default-asyncmap\n"); // Disable asyncmap fprintf(fp, "crtscts\n"); // Disable protocol field compression // negotiation fprintf(fp, "nopcomp\n"); // Disable protocol field compression fprintf(fp, "refuse-eap\n"); // Disable protocol field compression fprintf(fp, "noaccomp\n"); // Disable Address/Control // compression fprintf(fp, "noccp\n"); // Disable CCP (Compression Control // Protocol) fprintf(fp, "novj\n"); // Disable Van Jacobson style TCP/IP // header compression fprintf(fp, "nobsdcomp\n"); // Disables BSD-Compress compression fprintf(fp, "nodeflate\n"); // Disables Deflate compression fprintf(fp, "lcp-echo-interval 0\n"); // Don't send an LCP // echo-request frame to the // peer fprintf(fp, "lock\n"); fprintf(fp, "noauth\n"); // fprintf(fp, "debug\n"); fclose(fp); /* * Generate pap-secrets file */ if (!(fp = fopen("/tmp/ppp/pap-secrets", "w"))) { perror("/tmp/ppp/pap-secrets"); return; } fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd); fclose(fp); chmod("/tmp/ppp/pap-secrets", 0600); /* * Generate chap-secrets file */ if (!(fp = fopen("/tmp/ppp/chap-secrets", "w"))) { perror("/tmp/ppp/chap-secrets"); return; } fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd); fclose(fp); chmod("/tmp/ppp/chap-secrets", 0600); /* * Enable Forwarding */ if ((fp = fopen("/proc/sys/net/ipv4/ip_forward", "r+"))) { fputc('1', fp); fclose(fp); } else perror("/proc/sys/net/ipv4/ip_forward"); } /* * Bring up WAN interface */ // ifconfig(nvram_safe_get("wan_ifname"), IFUP, // nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask")); ret = _evalpid(l2tp_argv, NULL, 0, NULL); sleep(1); if (nvram_match("ppp_demand", "1")) { /* * Trigger Connect On Demand if user press Connect button in Status * page */ if (nvram_match("action_service", "start_l2tp")) { start_force_to_dial(); nvram_unset("action_service"); } /* * Trigger Connect On Demand if user ping pptp server */ else eval("listen", nvram_safe_get("lan_ifname")); } else { sysprintf("echo \"c %s\" > /var/run/xl2tpd/l2tp-control", nvram_safe_get("l2tp_server_name")); } cprintf("done\n"); return; }
int _eval(char *const argv[]) { return _evalpid(argv, ">/dev/console", 0, NULL); }
void start_freeradius(void) { int ret = 0; pid_t pid; char *radiusd_argv[] = { "radiusd", "-d", "/jffs/etc/freeradius", NULL }; FILE *fp = NULL; stop_freeradius(); nvram_default_get("radius_country", "DE"); nvram_default_get("radius_state", "Saxony"); nvram_default_get("radius_locality", "none"); nvram_default_get("radius_expiration", "365"); nvram_default_get("radius_passphrase", "changeme"); nvram_default_get("radius_organisation", "DD-WRT"); nvram_default_get("radius_email", "*****@*****.**"); nvram_default_get("radius_common", "DD-WRT FreeRadius Certificate"); nvram_default_get("radius_port", "1812"); nvram_default_get("radius_enabled", "0"); if (!nvram_match("radius_enabled", "1")) return; #ifndef HAVE_OPENRISC #ifndef HAVE_VENTANA #if !defined(HAVE_RB600) || defined(HAVE_WDR4900) #ifdef HAVE_X86 system("mount --bind /usr/local /jffs"); #else if (!nvram_match("jffs_mounted", "1")) return; //jffs is a requirement for radius and must be mounted at this point here #endif #endif #endif #endif prep(); sysprintf("sed \"s/port = 0/port = %s/g\" /etc/freeradius/radiusd.conf > /jffs/etc/freeradius/radiusd.conf", nvram_safe_get("radius_port")); sysprintf("sed \"s/private_key_password = whatever/private_key_password = %s/g\" /etc/freeradius/eap.conf > /jffs/etc/freeradius/eap.conf", nvram_safe_get("radius_passphrase")); if (!f_exists("/jffs/etc/freeradius/certs/server.pem")) { //prepare certificates start_gen_radius_cert(); } int i; /* generate clients */ { struct radiusclientdb *db = loadradiusclientdb(); if (db) { fp = fopen("/jffs/etc/freeradius/clients.conf", "wb"); system("touch /jffs/etc/freeradius/clients.manual"); fprintf(fp, "$INCLUDE clients.manual\n"); for (i = 0; i < db->usercount; i++) { if (!db->users[i].clientsize) continue; if (!db->users[i].client || !strlen(db->users[i].client)) continue; fprintf(fp, "client %s {\n" "\tsecret = %s\n" "\tshortname = DD-WRT-RADIUS\n}\n", db->users[i].client, db->users[i].passwd); } fclose(fp); freeradiusclientdb(db); } } /* now generate users */ { struct radiusdb *db = loadradiusdb(); if (db) { fp = fopen("/jffs/etc/freeradius/users", "wb"); system("touch /jffs/etc/freeradius/users.manual"); fprintf(fp, "$INCLUDE users.manual\n"); fprintf(fp, "DEFAULT FreeRADIUS-Proxied-To == 127.0.0.1\n" "\tSession-Timeout := 3600,\n" "\tUser-Name := \"%%{User-Name}\",\n" "\tAcct-Interim-Interval := 300,\n" "\tFall-Through = Yes\n\n"); time_t tm; struct tm tm_time; for (i = 0; i < db->usercount; i++) { if (!db->users[i].usersize) continue; if (!db->users[i].user || !strlen(db->users[i].user)) continue; if (!db->users[i].enabled) continue; fprintf(fp, "%s Cleartext-Password := \"%s\"", db->users[i].user, db->users[i].passwd); if (db->users[i].expiration) { tm = db->users[i].expiration * 24 * 60 * 60; memcpy(&tm_time, localtime(&tm), sizeof(tm_time)); char datebuf[128]; strftime(datebuf, sizeof(datebuf), "%d %b %Y", &tm_time); fprintf(fp, ", Expiration == \"%s\"\n", datebuf); } else fprintf(fp, "\n"); if (db->users[i].downstream) { fprintf(fp, "\tWISPr-Bandwidth-Max-Down := %d,\n", db->users[i].downstream * 1024); fprintf(fp, "\tRP-Downstream-Speed-Limit := %d", db->users[i].downstream); } if (db->users[i].upstream) { if (db->users[i].downstream) fprintf(fp, ",\n"); fprintf(fp, "\tWISPr-Bandwidth-Max-Up := %d,\n", db->users[i].upstream * 1024); fprintf(fp, "\tRP-Upstream-Speed-Limit := %d", db->users[i].upstream); } fprintf(fp, "\n"); } fclose(fp); freeradiusdb(db); } } ret = _evalpid(radiusd_argv, NULL, 0, &pid); dd_syslog(LOG_INFO, "radiusd : FreeRadius daemon successfully started\n"); return; }
void start_pptp(int status) { int ret; FILE *fp; char *pptp_argv[] = { "pppd", NULL }; char username[80], passwd[80]; stop_dhcpc(); #ifdef HAVE_PPPOE stop_pppoe(); #endif stop_vpn_modules(); snprintf(username, sizeof(username), "%s", nvram_safe_get("ppp_username")); snprintf(passwd, sizeof(passwd), "%s", nvram_safe_get("ppp_passwd")); if (status != REDIAL) { create_pptp_config(nvram_safe_get("pptp_server_name"), username); /* * Generate pap-secrets file */ if (!(fp = fopen("/tmp/ppp/pap-secrets", "w"))) { perror("/tmp/ppp/pap-secrets"); return; } fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd); fclose(fp); chmod("/tmp/ppp/pap-secrets", 0600); /* * Generate chap-secrets file */ if (!(fp = fopen("/tmp/ppp/chap-secrets", "w"))) { perror("/tmp/ppp/chap-secrets"); return; } fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd); fclose(fp); chmod("/tmp/ppp/chap-secrets", 0600); /* * Enable Forwarding */ if ((fp = fopen("/proc/sys/net/ipv4/ip_forward", "r+"))) { fputc('1', fp); fclose(fp); } else perror("/proc/sys/net/ipv4/ip_forward"); } char *wan_ifname = nvram_safe_get("wan_ifname"); if (isClient()) { wan_ifname = getSTA(); } nvram_set("pptp_ifname", wan_ifname); /* * Bring up WAN interface */ if (nvram_match("pptp_use_dhcp", "1")) { // pid_t pid; // char *wan_ipaddr; // char *wan_netmask; // char *wan_gateway; // char *pptp_server_ip = nvram_safe_get ("pptp_server_ip"); // char *wan_hostname = nvram_safe_get ("wan_hostname"); nvram_set("wan_get_dns", ""); nvram_unset("dhcpc_done"); //dirty hack start_dhcpc(wan_ifname, NULL, NULL, 1); int timeout; for (timeout = 60; !nvram_match("dhcpc_done", "1") && timeout > 0; --timeout) { /* wait for info from dhcp server */ sleep(1); } stop_dhcpc(); /* we don't need dhcp client anymore */ create_pptp_config(nvram_safe_get("pptp_server_ip"), username); } else { ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask")); 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("pptp_wan_gateway"), "255.255.255.255"); } route_add(wan_ifname, 0, "0.0.0.0", nvram_safe_get("pptp_wan_gateway"), "0.0.0.0"); char pptpip[64]; getIPFromName(nvram_safe_get("pptp_server_name"), pptpip); route_del(wan_ifname, 0, "0.0.0.0", nvram_safe_get("pptp_wan_gateway"), "0.0.0.0"); if (dns_list) { for (i = 0; i < dns_list->num_servers; i++) route_del(wan_ifname, 0, dns_list->dns_server[i], nvram_safe_get("pptp_wan_gateway"), "255.255.255.255"); free(dns_list); } nvram_set("pptp_server_ip", pptpip); if (!nvram_match("pptp_wan_gateway", "0.0.0.0")) route_add(wan_ifname, 0, nvram_safe_get("pptp_server_ip"), nvram_safe_get("pptp_wan_gateway"), "255.255.255.255"); } ret = _evalpid(pptp_argv, NULL, 0, NULL); if (nvram_match("ppp_demand", "1")) { /* * Trigger Connect On Demand if user press Connect button in Status * page */ if (nvram_match("action_service", "start_pptp") || nvram_match("action_service", "start_l2tp")) { start_force_to_dial(); // force_to_dial(nvram_safe_get("action_service")); nvram_unset("action_service"); } /* * Trigger Connect On Demand if user ping pptp server */ else { eval("listen", nvram_safe_get("lan_ifname")); } } stop_wland(); start_wshaper(); start_wland(); cprintf("done\n"); return; }
void start_pppoe(int pppoe_num) { char idletime[20], retry_num[20], param[4]; char username[80], passwd[80]; char ppp_username[2][20] = { "ppp_username", "ppp_username_1" }; char ppp_passwd[2][20] = { "ppp_passwd", "ppp_passwd_1" }; char ppp_demand[2][20] = { "ppp_demand", "ppp_demand_1" }; char ppp_service[2][20] = { "ppp_service", "ppp_service_1" }; char ppp_ac[2][10] = { "ppp_ac", "ppp_ac_1" }; // 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 pppoeifname[15]; char *wan_ifname = nvram_safe_get("wan_ifname"); if (isClient()) { wan_ifname = getSTA(); } pid_t pid; sprintf(pppoeifname, "pppoe_ifname%d", pppoe_num); nvram_set(pppoeifname, ""); cprintf("start session %d\n", pppoe_num); sprintf(idletime, "%d", atoi(nvram_safe_get("ppp_idletime")) * 60); snprintf(retry_num, sizeof(retry_num), "%d", (atoi(nvram_safe_get("ppp_redialperiod")) / 5) - 1); snprintf(username, sizeof(username), "%s", nvram_safe_get(ppp_username[pppoe_num])); snprintf(passwd, sizeof(passwd), "%s", nvram_safe_get(ppp_passwd[pppoe_num])); sprintf(param, "%d", pppoe_num); /* * add here */ char *pppoe_argv[] = { "pppoecd", wan_ifname, "-u", username, "-p", passwd, "-r", nvram_safe_get("wan_mtu"), // del by honor, add by tallest. "-t", nvram_safe_get("wan_mtu"), "-i", nvram_match(ppp_demand[pppoe_num], "1") ? idletime : "0", "-I", "10", // Send an LCP echo-request frame to the // server every 10 seconds "-T", "20", // pppd will presume the server to be dead if // 20 LCP echo-requests are sent without //-> timeout 1 min // receiving a valid LCP echo-reply "-P", param, // PPPOE session number. "-N", retry_num, // To avoid kill pppd when pppd has been // connecting. #if LOG_PPPOE == 2 "-d", #endif "-C", "disconnected_pppoe", // by tallest 0407 NULL, /* set default route */ NULL, NULL, /* pppoe_service */ NULL, NULL, /* pppoe_ac */ NULL, /* pppoe_keepalive */ NULL }, **arg; /* * Add optional arguments */ for (arg = pppoe_argv; *arg; arg++) ; /* * Removed by AhMan */ if (pppoe_num == PPPOE0) { // PPPOE0 must set default route. *arg++ = "-R"; } if (nvram_invmatch(ppp_service[pppoe_num], "")) { *arg++ = "-s"; *arg++ = nvram_safe_get(ppp_service[pppoe_num]); } if (nvram_invmatch(ppp_ac[pppoe_num], "")) { *arg++ = "-a"; *arg++ = nvram_safe_get(ppp_ac[pppoe_num]); } if (nvram_match("ppp_static", "1")) { *arg++ = "-L"; *arg++ = nvram_safe_get("ppp_static_ip"); } // if (nvram_match("pppoe_demand", "1") || nvram_match("pppoe_keepalive", // "1")) *arg++ = "-k"; mkdir("/tmp/ppp", 0777); symlink("/sbin/rc", "/tmp/ppp/ip-up"); symlink("/sbin/rc", "/tmp/ppp/ip-down"); symlink("/sbin/rc", "/tmp/ppp/set-pppoepid"); // tallest 1219 unlink("/tmp/ppp/log"); // Clean rpppoe client files - Added by ice-man (Wed Jun 1) unlink("/tmp/ppp/options.pppoe"); unlink("/tmp/ppp/connect-errors"); _evalpid(pppoe_argv, NULL, 0, &pid); if (nvram_match(ppp_demand[pppoe_num], "1")) { // int timeout = 5; start_tmp_ppp(pppoe_num); // This should be handled in start_wan_done // while (ifconfig (nvram_safe_get (pppoeifname), IFUP, NULL, NULL) // && timeout--) // sleep (1); // route_add (nvram_safe_get ("wan_iface"), 0, "0.0.0.0", // "10.112.112.112", // "0.0.0.0"); } cprintf("done. session %d\n", pppoe_num); return; }
void start_nas_notify(char *ifname) { char *argv[] = { "nas4not", "lan", ifname, "up", NULL, /* role */ NULL, /* crypto */ NULL, /* auth */ NULL, /* passphrase */ NULL, /* ssid */ NULL }; char *str = NULL; char tmp[100], prefix[] = "wlXXXXXXXXXX_", pidfile[] = "/tmp/nas.wlXXXXXXXlan.pid"; int unit; char remote[ETHER_ADDR_LEN]; char ssid[48], pass[80], auth[16], crypto[16], role[8]; int i; /* * the wireless interface must be configured to run NAS */ wl_ioctl(ifname, WLC_GET_INSTANCE, &unit, sizeof(unit)); snprintf(prefix, sizeof(prefix), "wl%d_", unit); snprintf(pidfile, sizeof(pidfile), "/tmp/nas.wl%dlan.pid", unit); if (!(str = file2str(pidfile))) // no pidfile means no nas was run (required) { return; } free(str); sleep(3); /* * find WDS link configuration */ wl_ioctl(ifname, WLC_WDS_GET_REMOTE_HWADDR, remote, ETHER_ADDR_LEN); for (i = 0; i < MAX_NVPARSE; i++) { char mac[ETHER_ADDR_STR_LEN]; uint8 ea[ETHER_ADDR_LEN]; if (get_wds_wsec(unit, i, mac, role, crypto, auth, ssid, pass) && ether_atoe(mac, ea) && !bcmp(ea, remote, ETHER_ADDR_LEN)) { argv[4] = role; argv[5] = crypto; argv[6] = auth; argv[7] = pass; argv[8] = ssid; break; } } /* * did not find WDS link configuration, use wireless' */ if (i == MAX_NVPARSE) { /* * role */ argv[4] = "auto"; /* * crypto */ argv[5] = nvram_safe_get(strcat_r(prefix, "crypto", tmp)); /* * auth mode */ argv[6] = nvram_safe_get(strcat_r(prefix, "akm", tmp)); /* * passphrase */ argv[7] = nvram_safe_get(strcat_r(prefix, "wpa_psk", tmp)); /* * ssid */ argv[8] = nvram_safe_get(strcat_r(prefix, "ssid", tmp)); } int pid; _evalpid(argv, ">/dev/console", 0, &pid); }