int site_survey_main(int argc, char *argv[]) #endif { #define DOT11_CAP_ESS 0x0001 #define DOT11_CAP_IBSS 0x0002 #define DOT11_CAP_PRIVACY 0x0010 /* d11 cap. privacy */ unsigned char b1[32], b2[64], b3[32], b4[32], b5[32], b6[32], b7[32], ext[32]; int i = 0; unlink(SITE_SURVEY_DB); int ap = 0, oldap = 0; int len; memset(site_survey_lists, sizeof(site_survey_lists), 0); if (nvram_match("wl0_mode", "ap") || nvram_match("wl0_mode", "apsta")) { eval("iwpriv", "ra0", "set", "SiteSurvey=1"); // only in ap mode sleep(4); //wait 4 seconds per spec } FILE *scan = popen("iwpriv ra0 get_site_survey", "rb"); skipline(scan); skipline(scan); // fscanf(scan, "%s %s", b1, b2); // skip first line // fscanf(scan, "%s %s %s %s %s %s %s", b1, b2, b3, b4, b5, b6, b7); //skip second line i = 0; int c = 0; do { if (feof(scan)) break; fread(b1, 4, 1, scan); b1[4] = 0; b1[strlen(b1)] = 0; fread(b2, 33, 1, scan); b2[32] = 0; b2[strlen(b2)] = 0; //kill trailing blanks for (c = 0; c < 32; c++) { if (b2[31 - c] != 0x20) break; b2[31 - c] = 0; } //skip leading blanks for (c = 0; c < 32; c++) { if (b2[c] != 0x20) break; } if (c && c < 32) { for (i = 0; i < 32 - c; i++) b2[i] = b2[i + c]; } int ret = fscanf(scan, "%s %s %s %s %s %s", b3, b4, b5, b6, ext, b7); //skip second line if (ret < 5) break; if (ret == 6) skipline(scan); else strncpy(b7, ext, 31); site_survey_lists[i].channel = atoi(b1); // channel site_survey_lists[i].frequency = ieee80211_ieee2mhz(site_survey_lists[i].channel); strcpy(site_survey_lists[i].SSID, b2); //SSID strcpy(site_survey_lists[i].BSSID, b3); //BSSID site_survey_lists[i].phy_noise = -95; // no way strcpy(site_survey_lists[i].ENCINFO, b4); site_survey_lists[i].RSSI = -atoi(b5); if (!strcmp(b6, "11b/g")) site_survey_lists[i].rate_count = 12; if (!strcmp(b6, "11b")) site_survey_lists[i].rate_count = 4; if (!strcmp(b6, "11b/g/n")) site_survey_lists[i].rate_count = 300; if (!strcmp(b7, "In")) site_survey_lists[i].capability = DOT11_CAP_ESS; if (!strcmp(b7, "Ad")) site_survey_lists[i].capability = DOT11_CAP_IBSS; if (strcmp(b4, "OPEN")) site_survey_lists[i].capability |= DOT11_CAP_PRIVACY; i++; } while (1); fclose(scan); write_site_survey(); open_site_survey(); for (i = 0; i < SITE_SURVEY_NUM && site_survey_lists[i].BSSID[0] && site_survey_lists[i].channel != 0; i++) { fprintf(stderr, "[%2d] SSID[%20s] BSSID[%s] channel[%2d] frequency[%4d] rssi[%d] noise[%d] beacon[%d] cap[%x] dtim[%d] rate[%d] enc[%s]\n", i, site_survey_lists[i].SSID, site_survey_lists[i].BSSID, site_survey_lists[i].channel, site_survey_lists[i].frequency, site_survey_lists[i].RSSI, site_survey_lists[i].phy_noise, site_survey_lists[i].beacon_period, site_survey_lists[i].capability, site_survey_lists[i].dtim_period, site_survey_lists[i].rate_count, site_survey_lists[i].ENCINFO); } return 0; }
int site_survey_main(int argc, char *argv[]) { char *name = nvram_safe_get("wl0_ifname"); unsigned char mac[20]; int i = 0; char *dev = name; unlink(SITE_SURVEY_DB); int ap = 0, oldap = 0; unsigned char buf[24 * 1024]; char ssid[31]; unsigned char *cp; int len; system2("airoscan-ng wifi0"); len = do80211priv("ath0", IEEE80211_IOCTL_SCAN_RESULTS, buf, sizeof(buf)); if (len == -1) fprintf(stderr, "unable to get scan results"); if (len < sizeof(struct ieee80211req_scan_result)) return; cp = buf; do { struct ieee80211req_scan_result *sr; unsigned char *vp; char ssid[14]; sr = (struct ieee80211req_scan_result *)cp; vp = (u_int8_t *)(sr + 1); memset(ssid, 0, sizeof(ssid)); strncpy(site_survey_lists[i].SSID, vp, sr->isr_ssid_len); strcpy(site_survey_lists[i].BSSID, ieee80211_ntoa(sr->isr_bssid)); site_survey_lists[i].channel = ieee80211_mhz2ieee(sr->isr_freq); site_survey_lists[i].frequency = sr->isr_freq; int noise = 256; noise -= (int)sr->isr_noise; site_survey_lists[i].phy_noise = -noise; site_survey_lists[i].RSSI = (int)site_survey_lists[i].phy_noise + (int)sr->isr_rssi; site_survey_lists[i].capability = sr->isr_capinfo; site_survey_lists[i].rate_count = sr->isr_nrates; cp += sr->isr_len, len -= sr->isr_len; i++; } while (len >= sizeof(struct ieee80211req_scan_result)); write_site_survey(); open_site_survey(); for (i = 0; i < SITE_SURVEY_NUM && site_survey_lists[i].BSSID[0] && site_survey_lists[i].channel != 0; i++) { fprintf(stderr, "[%2d] SSID[%20s] BSSID[%s] channel[%2d] frequency[%4d] rssi[%d] noise[%d] beacon[%d] cap[%x] dtim[%d] rate[%d]\n", i, site_survey_lists[i].SSID, site_survey_lists[i].BSSID, site_survey_lists[i].channel, site_survey_lists[i].frequency, site_survey_lists[i].RSSI, site_survey_lists[i].phy_noise, site_survey_lists[i].beacon_period, site_survey_lists[i].capability, site_survey_lists[i].dtim_period, site_survey_lists[i].rate_count); } return 0; }
int site_survey_main(int argc, char *argv[]) { char tmp[32]; sprintf(tmp, "%s_ifname", nvram_safe_get("wifi_display")); char *name = nvram_safe_get(tmp); unsigned char buf[10000]; wl_scan_results_t *scan_res = (wl_scan_results_t *) buf; wl_bss_info_t *bss_info; unsigned char mac[20]; int i; char *dev = name; unlink(SITE_SURVEY_DB); int ap = 0, oldap = 0; wl_scan_params_t params; memset(¶ms, 0, sizeof(params)); /* * use defaults (same parameters as wl scan) */ memset(¶ms.bssid, 0xff, sizeof(params.bssid)); if (argc > 1) { params.ssid.SSID_len = strlen(argv[1]); strcpy(params.ssid.SSID, argv[1]); } params.bss_type = DOT11_BSSTYPE_ANY; params.scan_type = 0; params.nprobes = -1; params.active_time = -1; params.passive_time = -1; params.home_time = -1; params.channel_num = 0; /* * can only scan in STA mode */ if (wl_ioctl(dev, WLC_SCAN, ¶ms, 64) < 0) { fprintf(stderr, "scan failed\n"); return -1; } int count = 10; int ret = 0; while ((count--) > 0) //scan for max 5 seconds { usleep(500 * 1000); bzero(buf, sizeof(buf)); scan_res->buflen = sizeof(buf); ret = wl_ioctl(dev, WLC_SCAN_RESULTS, buf, WLC_IOCTL_MAXLEN); if (!ret) break; } if (ret < 0) { fprintf(stderr, "scan failed with errorcode %d\n", ret); } fprintf(stderr, "buflen=[%d] version=[%d] count=[%d]\n", scan_res->buflen, scan_res->version, scan_res->count); if (scan_res->count == 0) { cprintf("Can't find any wireless device\n"); goto endss; } bss_info = &scan_res->bss_info[0]; for (i = 0; i < scan_res->count; i++) { strcpy(site_survey_lists[i].SSID, bss_info->SSID); strcpy(site_survey_lists[i].BSSID, ether_etoa(bss_info->BSSID.octet, mac)); #ifndef HAVE_RB500 site_survey_lists[i].channel = bss_info->chanspec & 0xff; #endif site_survey_lists[i].frequency = ieee80211_ieee2mhz(site_survey_lists[i].channel); #ifdef WL_CHANSPEC_BW_80 switch (bss_info->chanspec & 0x3800) { case WL_CHANSPEC_BW_80: site_survey_lists[i].channel |= 0x1000; break; case WL_CHANSPEC_BW_8080: site_survey_lists[i].channel |= 0x1100; break; case WL_CHANSPEC_BW_160: site_survey_lists[i].channel |= 0x1200; break; } #endif site_survey_lists[i].RSSI = bss_info->RSSI; site_survey_lists[i].phy_noise = bss_info->phy_noise; site_survey_lists[i].beacon_period = bss_info->beacon_period; site_survey_lists[i].capability = bss_info->capability; site_survey_lists[i].rate_count = get_mcs_max(bss_info->basic_mcs); if (!site_survey_lists[i].rate_count) site_survey_lists[i].rate_count = get_legacy(bss_info->rateset.rates, bss_info->rateset.count); site_survey_lists[i].dtim_period = bss_info->dtim_period; strcpy(site_survey_lists[i].ENCINFO, getEncInfo(bss_info)); bss_info = (wl_bss_info_t *) ((uint32) bss_info + bss_info->length); } write_site_survey(); open_site_survey(); // modded by ascott and fractal, may 17th, 2012 to show "hidden" SSIDS for (i = 0; i < SITE_SURVEY_NUM && site_survey_lists[i].BSSID[0]; i++) { if (site_survey_lists[i].SSID[0] == 0) { strcpy(site_survey_lists[i].SSID, "hidden"); } fprintf(stderr, "[%2d] SSID[%20s] BSSID[%s] channel[%2d] frequency[%4d] rssi[%d] noise[%d] beacon[%d] cap[%x] dtim[%d] rate[%d] enc[%s]\n", i, site_survey_lists[i].SSID, site_survey_lists[i].BSSID, site_survey_lists[i].channel & 0xff, site_survey_lists[i].frequency, site_survey_lists[i].RSSI, site_survey_lists[i].phy_noise, site_survey_lists[i].beacon_period, site_survey_lists[i].capability, site_survey_lists[i].dtim_period, site_survey_lists[i].rate_count, site_survey_lists[i].ENCINFO); } endss: C_led(0); eval("wl", "-i", name, "up"); return 0; }