/* * Copyright 2004, ASUSTek Inc. * All Rights Reserved. * * THIS SOFTWARE IS OFFERED "AS IS", AND ASUS GRANTS NO WARRANTIES OF ANY * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. * * $Id: common_ex.c,v 1.9 2009/03/12 07:15:02 james26_jang Exp $ */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "rc.h" #define XSTR(s) STR(s) #define STR(s) #s static char list[2048]; void update_lan_status(int); /* remove space in the end of string */ char *trim_r(char *str) { int i; i=strlen(str); while(i>=1) { if (*(str+i-1) == ' ' || *(str+i-1) == 0x0a || *(str+i-1) == 0x0d) *(str+i-1)=0x0; else break; i--; } return(str); } /* convert mac address format from XXXXXXXXXXXX to XX:XX:XX:XX:XX:XX */ char *mac_conv(char *mac_name, int idx, char *buf) { char *mac, name[32]; int i, j; if (idx!=-1) sprintf(name, "%s%d", mac_name, idx); else sprintf(name, "%s", mac_name); mac = nvram_safe_get(name); if (strlen(mac)==0) { buf[0] = 0; } else { j=0; for(i=0; i<12; i++) { if (i!=0&&i%2==0) buf[j++] = ':'; buf[j++] = mac[i]; } buf[j] = 0; } dprintf("mac: %s\n", buf); return(buf); } void getsyspara(void) { FILE *fp; // char buf[1]; unsigned long *imagelen; char dataPtr[4]; char verPtr[64]; char productid[13]; char fwver[12]; // int i; strcpy(productid, "WLHDD"); strcpy(fwver, "0.1.0.1"); if((fp = fopen("/dev/mtd/1", "rb")) != NULL){ if(fseek(fp, 4, SEEK_SET) != 0) goto write_ver; fread(dataPtr, 1, 4, fp); imagelen = (unsigned long *)dataPtr; dprintf("image len %x\n", *imagelen); if(fseek(fp, *imagelen-64, SEEK_SET) != 0) goto write_ver; dprintf("seek\n"); if(!fread(verPtr, 1, 64, fp)) goto write_ver; dprintf("ver %x %x", verPtr[0], verPtr[1]); strncpy(productid, verPtr+4, 12); productid[12] = 0; sprintf(fwver, "%d.%d.%d.%d", verPtr[0], verPtr[1], verPtr[2], verPtr[3]); dprintf("get fw ver: %s\n", productid); fclose(fp); } write_ver: // its a ugle solution for Product ID if(strstr(productid, "WL500gx")) nvram_set("productid", "WL500g.Deluxe"); // else if (strstr(productid, "WL500gp")) // nvram_set("productid", "WL500g.Premium"); else nvram_set("productid", trim_r(productid)); nvram_set("firmver", trim_r(fwver)); } void wan_netmask_check(void) { unsigned int ip, gw, nm, lip, lnm; if (nvram_match("wan0_proto", "static") || nvram_match("wan0_proto", "pptp") || nvram_match("wan0_proto", "l2tp")) { ip = inet_addr(nvram_safe_get("wan_ipaddr")); gw = inet_addr(nvram_safe_get("wan_gateway")); nm = inet_addr(nvram_safe_get("wan_netmask")); lip = inet_addr(nvram_safe_get("lan_ipaddr")); lnm = inet_addr(nvram_safe_get("lan_netmask")); dprintf("ip : %x %x %x\n", ip, gw, nm); if (ip==0x0 && (nvram_match("wan0_proto", "pptp") || nvram_match("wan0_proto", "l2tp"))) return; if (ip==0x0 || (ip&lnm)==(lip&lnm)) { nvram_set("wan_ipaddr", "1.1.1.1"); nvram_set("wan_netmask", "255.0.0.0"); nvram_set("wan0_ipaddr", nvram_safe_get("wan_ipaddr")); nvram_set("wan0_netmask", nvram_safe_get("wan_netmask")); } // check netmask here if (gw==0 || gw==0xffffffff || (ip&nm)==(gw&nm)) { nvram_set("wan0_netmask", nvram_safe_get("wan_netmask")); } else { for(nm=0xffffffff;nm!=0;nm=(nm>>8)) { if ((ip&nm)==(gw&nm)) break; } dprintf("nm: %x\n", nm); if (nm==0xffffffff) nvram_set("wan0_netmask", "255.255.255.255"); else if (nm==0xffffff) nvram_set("wan0_netmask", "255.255.255.0"); else if (nm==0xffff) nvram_set("wan0_netmask", "255.255.0.0"); else if (nm==0xff) nvram_set("wan0_netmask", "255.0.0.0"); else nvram_set("wan0_netmask", "0.0.0.0"); } } } /* This function is used to map nvram value from asus to Broadcom */ void convert_asus_values(int skipflag) { char tmpstr[32], tmpstr1[32], macbuf[36]; char servers[64]; char ifnames[36]; char sbuf[64]; int i, num; char *ptr; FILE *fp; printf("*** Start convert_asus_values(%d). ***\n", skipflag); // 2008.03 James. { // Fixed the wrong value of nvram. { if(nvram_match("macfilter_enable_x", "disabled")) nvram_set("macfilter_enable_x", "0"); if(nvram_match("wl_frameburst", "0")) nvram_set("wl_frameburst", "off"); if(nvram_match("wl_crypto", "0")) nvram_set("wl_crypto", "tkip"); if(nvram_match("wl_preauth", "1")) nvram_set("wl_preauth", "enabled"); else if(nvram_match("wl_preauth", "0")) nvram_set("wl_preauth", "disabled"); // Fixed the wrong value of nvram. } char *ddns_hostname_x = nvram_safe_get("ddns_hostname_x"); char *follow_info = strchr(ddns_hostname_x, '.'); char ddns_account[64]; int len = 0; if(nvram_match("ddns_enable_x", "1") && nvram_match("ddns_server_x", "WWW.ASUS.COM") && follow_info != NULL && !strcmp(follow_info, ".asuscomm.com")){ len = strlen(ddns_hostname_x)-strlen(follow_info); memset(ddns_account, 0, 64); strncpy(ddns_account, ddns_hostname_x, len); nvram_set("computer_name", ddns_account); nvram_set("computer_nameb", ddns_account); } // 2008.03 James. } if(!skipflag) { getsyspara(); /* convert country code from regulation_domain */ convert_country(); } #ifndef CDMA if(nvram_match("wan_proto", "cdma")) nvram_set("wan_proto", "dhcp"); #endif // CDMA #if 0 #ifndef WL500GPV2 { int radio=atoi(nvram_safe_get("wl_radio_power_x")); //early_convert_asus_values(); if (radio>=13) nvram_set("wl_radio_power_x", "9"); } #endif // WL500GPV2 #endif // 0 #if 0 if(nvram_get("preferred_lang")==NULL){ if((nvram_match("regulation_domain","0x47TW"))||(nvram_match("regulation_domain","0X47TW"))) nvram_set("preferred_lang","TW"); else nvram_set("preferred_lang","EN"); } if(nvram_invmatch("temp_lang", "")) nvram_set("preferred_lang", nvram_get("temp_lang")); #endif // 0 #ifdef DLM if (nvram_match("ftp_lang","")){ if((nvram_match("regulation_domain","0x47TW"))||(nvram_match("regulation_domain","0X47TW"))) nvram_set("ftp_lang","TW"); else if ((nvram_match("regulation_domain","0x44CN"))||(nvram_match("regulation_domain","0X44CN"))) nvram_set("ftp_lang", "CN"); else if ((nvram_match("regulation_domain","0x46KR"))||(nvram_match("regulation_domain","0X46KR"))) nvram_set("ftp_lang", "KR"); else nvram_set("ftp_lang","EN"); } #endif // DLM if(nvram_invmatch("httpd_die_reboot", "")) nvram_set("httpd_die_reboot", ""); #if 0 { int radio = atoi(nvram_safe_get("wl_radio_power_x")); if (radio < 16) eval("wl", "txpwr1", "-o", "-d", nvram_safe_get("wl_radio_power_x")); else eval("wl", "txpwr1", "-1"); } #endif // 0 #ifdef WL500GPV2 /* Clean MFG test values when boot */ if (nvram_invmatch("asus_mfg", "")) nvram_set("asus_mfg", ""); if (nvram_invmatch("asus_mfg_webcam", "")) nvram_set("asus_mfg_webcam", ""); if (nvram_invmatch("asus_mfg_flash", "")) nvram_set("asus_mfg_flash", ""); if (nvram_invmatch("asus_mfg_printer", "")) nvram_set("asus_mfg_printer", ""); if (nvram_invmatch("btn_rst", "")) nvram_set("btn_rst", ""); if (nvram_invmatch("btn_ez", "")) nvram_set("btn_ez", ""); #endif // WL500GPV2 #ifdef RT2400_SUPPORT write_rt2400_conf(); #endif // RT2400_SUPPORT #ifdef WOB // add for 4712/5350 which have no eeprom //nvram_set("il0macaddr", nvram_safe_get("et0macaddr")); nvram_unset("wl0_hwaddr"); #endif // WOB if (nvram_match("productid", "WL500b") || nvram_match("productid", "WL500bv2")) { nvram_set("wl_gmode", "0"); } cprintf("read from nvram\n"); nvram_set("wl_wsc_mode", nvram_safe_get("wsc_mode")); // for WPA/WPA2 - Enterprise nvram_set("wl0_wsc_mode", nvram_safe_get("wl_wsc_mode")); /* Wireless Section */ nvram_set("wl0_bss_enabled", nvram_safe_get("wl_bss_enabled")); /* Country Code */ nvram_set("wl0_country_code", nvram_safe_get("wl_country_code")); /* GMODE */ nvram_set("wl0_gmode", nvram_safe_get("wl_gmode")); if (nvram_match("wl_gmode_protection_x", "1")) { //cprintf("set to auto\n"); nvram_set("wl_gmode_protection", "auto"); nvram_set("wl0_gmode_protection", "auto"); } else { //cprintf("set to off"); nvram_set("wl_gmode_protection", "off"); nvram_set("wl0_gmode_protection", "off"); } if (nvram_match("wl_wep_x", "0") || nvram_match("wl_auth_mode", "psk")) nvram_set("wl0_wep", "disabled"); else nvram_set("wl0_wep", "enabled"); if (nvram_match("wl_auth_mode", "shared")) nvram_set("wl0_auth", "1"); else nvram_set("wl0_auth", "0"); #ifdef WPA2_WMM // 2008.06 James. { /*if(nvram_match("wl_auth_mode", "wpa")){ if(nvram_match("wl_wpa_mode", "4")){ if(nvram_match("wl_crypto", "tkip") || nvram_match("wl_crypto", "0")){ nvram_set("wl_akm", "wpa"); nvram_set("wl0_akm", "wpa"); } else if(nvram_match("wl_crypto", "aes")){ nvram_set("wl_akm", "wpa2"); nvram_set("wl0_akm", "wpa2"); } else{ nvram_set("wl_akm", "wpa wpa2"); nvram_set("wl0_akm", "wpa wpa2"); } } else if(nvram_match("wl_wpa_mode", "3")){ nvram_set("wl_akm", "wpa"); nvram_set("wl0_akm", "wpa"); } } else if(nvram_match("wl_auth_mode", "wpa2")){ nvram_set("wl_akm", "wpa2"); nvram_set("wl0_akm", "wpa2"); } else if(nvram_match("wl_auth_mode", "psk")){ if(nvram_match("wl_wpa_mode", "0")){ if(nvram_match("wl_crypto", "tkip") || nvram_match("wl_crypto", "0")){ nvram_set("wl_akm", "psk"); nvram_set("wl0_akm", "psk"); } else if(nvram_match("wl_crypto", "aes")){ nvram_set("wl_akm", "psk2"); nvram_set("wl0_akm", "psk2"); } else{ nvram_set("wl_akm", "psk psk2"); nvram_set("wl0_akm", "psk psk2"); } } else if(nvram_match("wl_wpa_mode", "1")){ nvram_set("wl_akm", "psk"); nvram_set("wl0_akm", "psk"); } else if(nvram_match("wl_wpa_mode", "2")){ nvram_set("wl_akm", "psk2"); nvram_set("wl0_akm", "psk2"); } } else{ nvram_set("wl_akm", ""); nvram_set("wl0_akm", ""); }//*/ if(nvram_match("wl_auth_mode", "psk")){ if(nvram_match("wl_wpa_mode", "1")){ nvram_set("wl_akm", "psk"); nvram_set("wl0_akm", "psk"); } else if(nvram_match("wl_wpa_mode", "2")){ nvram_set("wl_akm", "psk2"); nvram_set("wl0_akm", "psk2"); } else{ // wl_wpa_mode == 0 nvram_set("wl_akm", "psk"); // according to the official firmware. nvram_set("wl0_akm", "psk psk2"); } } else if(nvram_match("wl_auth_mode", "wpa") || nvram_match("wl_auth_mode", "wpa2")){ if(nvram_match("wl_auth_mode", "wpa2")){ nvram_set("wl_akm", "wpa2"); nvram_set("wl0_akm", "wpa2"); } else if(nvram_match("wl_wpa_mode", "3")){ nvram_set("wl_akm", "wpa"); nvram_set("wl0_akm", "wpa"); } else{ // wl_wpa_mode == 4 nvram_set("wl_akm", "psk"); // according to the official firmware. nvram_set("wl0_akm", "wpa wpa2"); } } else{ nvram_set("wl_akm", ""); nvram_set("wl0_akm", ""); }//*/ // 2008.06 James. } // thanks for Oleg nvram_set("wl0_auth_mode", nvram_match("wl_auth_mode", "radius") ? "radius" : "none"); nvram_set("wl0_preauth", nvram_safe_get("wl_preauth")); nvram_set("wl0_net_reauth", nvram_safe_get("wl_net_reauth")); nvram_set("wl0_wme", nvram_safe_get("wl_wme")); nvram_set("wl0_wme_no_ack", nvram_safe_get("wl_wme_no_ack")); nvram_set("wl0_wme_sta_bk", nvram_safe_get("wl_wme_sta_bk")); nvram_set("wl0_wme_sta_be", nvram_safe_get("wl_wme_sta_be")); nvram_set("wl0_wme_sta_vi", nvram_safe_get("wl_wme_sta_vi")); nvram_set("wl0_wme_sta_vo", nvram_safe_get("wl_wme_sta_vo")); nvram_set("wl0_wme_ap_bk", nvram_safe_get("wl_wme_ap_bk")); nvram_set("wl0_wme_ap_be", nvram_safe_get("wl_wme_ap_be")); nvram_set("wl0_wme_ap_vi", nvram_safe_get("wl_wme_ap_vi")); nvram_set("wl0_wme_ap_vo", nvram_safe_get("wl_wme_ap_vo")); // 2008.06 James. { nvram_set("wl0_wme_txp_bk", nvram_safe_get("wl_wme_txp_bk")); nvram_set("wl0_wme_txp_be", nvram_safe_get("wl_wme_txp_be")); nvram_set("wl0_wme_txp_vi", nvram_safe_get("wl_wme_txp_vi")); nvram_set("wl0_wme_txp_vo", nvram_safe_get("wl_wme_txp_vo")); // 2008.06 James. } #else // WPA2_WMM nvram_set("wl0_auth_mode", nvram_safe_get("wl_auth_mode")); nvram_set("wl_akm", ""); nvram_set("wl0_akm", ""); nvram_set("wl0_wme", "off"); #endif // WPA2_WMM nvram_set("wl0_ssid", nvram_safe_get("wl_ssid")); nvram_set("wl0_channel", nvram_safe_get("wl_channel")); nvram_set("wl0_country_code", nvram_safe_get("wl_country_code")); nvram_set("wl0_rate", nvram_safe_get("wl_rate")); nvram_set("wl0_mrate", nvram_safe_get("wl_mrate")); nvram_set("wl0_rateset", nvram_safe_get("wl_rateset")); nvram_set("wl0_frag", nvram_safe_get("wl_frag")); nvram_set("wl0_rts", nvram_safe_get("wl_rts")); nvram_set("wl0_dtim", nvram_safe_get("wl_dtim")); nvram_set("wl0_bcn", nvram_safe_get("wl_bcn")); nvram_set("wl0_plcphdr", nvram_safe_get("wl_plcphdr")); nvram_set("wl0_crypto", nvram_safe_get("wl_crypto")); nvram_set("wl0_wpa_psk", nvram_safe_get("wl_wpa_psk")); nvram_set("wl0_key", nvram_safe_get("wl_key")); nvram_set("wl0_key1", nvram_safe_get("wl_key1")); nvram_set("wl0_key2", nvram_safe_get("wl_key2")); nvram_set("wl0_key3", nvram_safe_get("wl_key3")); nvram_set("wl0_key4", nvram_safe_get("wl_key4")); nvram_set("wl0_closed", nvram_safe_get("wl_closed")); nvram_set("wl0_frameburst", nvram_safe_get("wl_frameburst")); nvram_set("wl0_afterburner", nvram_safe_get("wl_afterburner")); nvram_set("wl0_ap_isolate", nvram_safe_get("wl_ap_isolate")); nvram_set("wl0_radio", nvram_safe_get("wl_radio_x")); if (nvram_match("wl_wpa_mode", "")) nvram_set("wl_wpa_mode", "0"); nvram_set("wl0_radius_ipaddr", nvram_safe_get("wl_radius_ipaddr")); nvram_set("wl0_radius_port", nvram_safe_get("wl_radius_port")); nvram_set("wl0_radius_key", nvram_safe_get("wl_radius_key")); nvram_set("wl0_wpa_gtk_rekey", nvram_safe_get("wl_wpa_gtk_rekey")); if (nvram_invmatch("wl_mode_ex", "ap")) { int wepidx=atoi(nvram_safe_get("wl0_key")); char wepname[16]; sprintf(sbuf, "wl join \"%s\"", nvram_safe_get("wl0_ssid")); // key ?? if (nvram_match("wl0_auth_mode", "psk")) { sprintf(sbuf, "%s key %s", sbuf, nvram_safe_get("wl0_wpa_psk")); } else if (nvram_match("wl0_wep", "enabled") && wepidx>=1 && wepidx<=4) { sprintf(wepname, "wl0_key%d", wepidx); sprintf(sbuf, "%s key %s", sbuf, nvram_safe_get(wepname)); } sprintf(sbuf, "%s imode bss", sbuf); if (nvram_match("wl_auth_mode", "psk")) sprintf(sbuf, "%s amode wpapsk", sbuf); else if (nvram_match("wl_auth_mode", "shared")) sprintf(sbuf, "%s amode shared", sbuf); else sprintf(sbuf, "%s amode open", sbuf); nvram_set("wl0_join", sbuf); /* Station or Ethernet Bridge Mode */ nvram_set("wl0_mode", nvram_safe_get("wl_mode_ex")); } else { /* WDS control */ if (nvram_match("wl_mode_x", "1") && nvram_invmatch("wl_radio_x", "0") // 2010.03 James. Fix the reboot issue. ){ nvram_set("wl_mode", "wds"); nvram_set("wl0_mode", "wds"); } else{ nvram_set("wl_mode", "ap"); nvram_set("wl0_mode", "ap"); } nvram_set("wl0_lazywds", nvram_safe_get("wl_lazywds")); } if (nvram_match("wl_wdsapply_x", "1")) { num = atoi(nvram_safe_get("wl_wdsnum_x")); list[0]=0; #ifdef RT2400_SUPPORT fp = fopen("/tmp/RT2400AP.dat", "a+"); if (fp) fprintf(fp, "WdsList="); #endif // RT2400_SUPPORT for(i=0;i 0) sprintf(dns_str, "%s %s", dns_str, nvram_safe_get("wan_dns2_x")); else sprintf(dns_str, "%s", nvram_safe_get("wan_dns2_x")); } nvram_set("wan_dns_t", dns_str); } else nvram_set("wan_dns_t", nvram_safe_get("wan0_dns")); nvram_set("wan_status_t", "Connected"); } } /* * logmessage * */ void logmessage(char *logheader, char *fmt, ...){ va_list args; char buf[512]; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); openlog(logheader, 0, 0); syslog(0, buf); closelog(); va_end(args); } /* * wanmessage * */ void wanmessage(char *fmt, ...) { va_list args; char buf[512]; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); nvram_set("wan_reason_t", buf); va_end(args); } /* * pppstatus * */ char *pppstatus(char *buf) { FILE *fp; char sline[128], *p; if ((fp=fopen("/tmp/wanstatus.log", "r")) && fgets(sline, sizeof(sline), fp)) { p = strstr(sline, ","); strcpy(buf, p+1); } else { strcpy(buf, "unknown reason"); } return buf; } /* * Kills process whose PID is stored in plaintext in pidfile * @param pidfile PID file, signal * @return 0 on success and errno on failure */ int kill_pidfile_s(char *pidfile, int sig) { FILE *fp = fopen(pidfile, "r"); char buf[256]; extern int errno; if(fp && fgets(buf, sizeof(buf), fp)){ pid_t pid = strtoul(buf, NULL, 0); fclose(fp); return kill(pid, sig); } else return errno; } #ifdef RT2400_SUPPORT void write_rt2400_conf(void) { FILE *fp; char *tmpstr; // create hostapd.conf fp=fopen("/tmp/RT2400AP.dat","w"); if (fp==NULL) { return; } fprintf(fp, "[Default]\n"); fprintf(fp, "SSID=%s\n", nvram_safe_get("wl_ssid")); if (nvram_match("wl_channel", "0")) fprintf(fp, "Channel=6\n"); else fprintf(fp, "Channel=%s\n", nvram_safe_get("wl_channel")); fprintf(fp, "HIDESSID=%s\n", nvram_safe_get("wl_closed")); fprintf(fp, "BeaconPeriod=%s\n", nvram_safe_get("wl_bcn")); fprintf(fp, "RTSThreshold=%s\n", nvram_safe_get("wl_rts")); fprintf(fp, "FragThreshold=%s\n", nvram_safe_get("wl_frag")); if (nvram_invmatch("wl_wep_x","0")) { fprintf(fp, "DefaultKeyID=%s\n", nvram_safe_get("wl_key")); fprintf(fp, "Key1Type=0\n"); fprintf(fp, "Key1Str=%s\n", nvram_safe_get("wl_key1")); fprintf(fp, "Key2Type=0\n"); fprintf(fp, "Key2Str=%s\n", nvram_safe_get("wl_key2")); fprintf(fp, "Key3Type=0\n"); fprintf(fp, "Key3Str=%s\n", nvram_safe_get("wl_key3")); fprintf(fp, "Key4Type=0\n"); fprintf(fp, "Key4Str=%s\n", nvram_safe_get("wl_key4")); } if (nvram_match("wl_auth_mode","shared")) { fprintf(fp, "AuthMode=shared\n"); fprintf(fp, "EncrypType=wep\n"); } else if (nvram_match("wl_auth_mode","psk")) { fprintf(fp, "AuthMode=wpapsk\n"); fprintf(fp, "EncrypType=tkip\n"); fprintf(fp, "WPAPSK=%s\n", nvram_safe_get("wl_wpa_psk")); fprintf(fp, "RekeyInterval=%s\n", nvram_safe_get("wl_wpa_gtk_rekey")); fprintf(fp, "RekeyMethod=time\n"); } else { fprintf(fp, "AuthMode=open\n"); if (nvram_invmatch("wl_wep_x","0")) fprintf(fp, "EncrypType=wep\n"); else fprintf(fp, "EncrypType=none\n"); } if (nvram_match("wl_macmode", "allow")) { fprintf(fp, "AclEnable=1\n"); } else if (nvram_match("wl_macmode", "deny")) { fprintf(fp, "AclEnable=2\n"); } else fprintf(fp, "AclEnable=0\n"); if (nvram_match("wl_mode_x", "0")) fprintf(fp, "WdsEnable=0\n"); else fprintf(fp, "WdsEnable=1\n"); fclose(fp); } #endif