static void list_scan(const char *ifname) { uint8_t buf[24 * 1024]; char ssid[14]; uint8_t *cp; int len; len = get80211priv(ifname, IEEE80211_IOCTL_SCAN_RESULTS, buf, sizeof(buf)); if (len == -1) errx(1, "unable to get scan results"); if (len < sizeof(struct ieee80211req_scan_result)) return; printf("%-14.14s %-17.17s %4s %4s %-5s %3s %4s\n", "SSID", "BSSID", "CHAN", "RATE", "S:N", "INT", "CAPS"); cp = buf; do { struct ieee80211req_scan_result *sr; uint8_t *vp; sr = (struct ieee80211req_scan_result *) cp; vp = (u_int8_t *)(sr+1); printf("%-14.*s %s %3d %3dM %2d:%-2d %3d %-4.4s", copy_essid(ssid, sizeof(ssid), vp, sr->isr_ssid_len), ssid, ieee80211_ntoa(sr->isr_bssid), ieee80211_mhz2ieee(sr->isr_freq), getmaxrate(sr->isr_rates, sr->isr_nrates), (int8_t) sr->isr_rssi, sr->isr_noise, sr->isr_intval, getcaps(sr->isr_capinfo)); printies(vp + sr->isr_ssid_len, sr->isr_ie_len, 24); printf("\n"); cp += sr->isr_len, len -= sr->isr_len; } while (len >= sizeof(struct ieee80211req_scan_result)); }
int ej_active_wireless_if_11n(webs_t wp, int argc, char_t ** argv, char *ifname, int cnt, int turbo, int macmask) { unsigned char *cp; int s, len; struct iwreq iwr; char nb[32]; sprintf(nb, "%s_bias", ifname); int bias = atoi(nvram_default_get(nb, "0")); if (!ifexists(ifname)) { printf("IOCTL_STA_INFO ifresolv %s failed!\n", ifname); return cnt; } int state = 0; state = get_radiostate(ifname); if (state == 0 || state == -1) { printf("IOCTL_STA_INFO radio %s not enabled!\n", ifname); return cnt; } s = getsocket(); if (s < 0) { fprintf(stderr, "socket(SOCK_DRAGM)\n"); return cnt; } (void)memset(&iwr, 0, sizeof(struct iwreq)); (void)strncpy(iwr.ifr_name, ifname, sizeof(iwr.ifr_name)); iwr.u.data.pointer = (void *)&madbuf[0]; iwr.u.data.length = 24 * 1024; if (ioctl(s, IEEE80211_IOCTL_STA_INFO, &iwr) < 0) { fprintf(stderr, "IOCTL_STA_INFO for %s failed!\n", ifname); closesocket(); return cnt; } len = iwr.u.data.length; if (len < sizeof(struct ieee80211req_sta_info)) { // fprintf(stderr,"IOCTL_STA_INFO len<struct %s failed!\n",ifname); closesocket(); return cnt; } cp = madbuf; int bufcount = 0; do { struct ieee80211req_sta_info *si; uint8_t *vp; si = (struct ieee80211req_sta_info *)cp; vp = (u_int8_t *)(si + 1); if (cnt) websWrite(wp, ","); cnt++; char mac[32]; strncpy(mac, ieee80211_ntoa(si->isi_macaddr), 31); if (nvram_match("maskmac", "1") && macmask) { mac[0] = 'x'; mac[1] = 'x'; mac[3] = 'x'; mac[4] = 'x'; mac[6] = 'x'; mac[7] = 'x'; mac[9] = 'x'; mac[10] = 'x'; } if (si->isi_noise == 0) { si->isi_noise = -95; } int qual = (si->isi_noise + si->isi_rssi) * 124 + 11600; qual /= 10; int rxrate = si->isi_rxrateKbps / 1000; int txrate = si->isi_txrateKbps / 1000; if (!rxrate) rxrate = si->isi_rates[si->isi_rxrate] & IEEE80211_RATE_VAL; if (!txrate) txrate = si->isi_rates[si->isi_txrate] & IEEE80211_RATE_VAL; char rx[32]; char tx[32]; if (rxrate) sprintf(rx, "%3dM", rxrate); else sprintf(rx, "N/A"); if (txrate) sprintf(tx, "%3dM", txrate); else sprintf(tx, "N/A"); websWrite(wp, "'%s','%s','%s','%s','%s','%d','%d','%d','%d'", mac, ifname, UPTIME(si->isi_uptime), tx, rx, si->isi_noise + si->isi_rssi + bias, si->isi_noise + bias, si->isi_rssi, qual); bufcount += si->isi_len; cp += si->isi_len; len -= si->isi_len; } while (len >= sizeof(struct ieee80211req_sta_info) && bufcount < (sizeof(madbuf) - sizeof(struct ieee80211req_sta_info))); closesocket(); return cnt; }
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; }
static void list_stations(const char *ifname) { uint8_t buf[24*1024]; struct iwreq iwr; uint8_t *cp; int s, len; s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) err(1, "socket(SOCK_DGRAM)"); (void) memset(&iwr, 0, sizeof(iwr)); (void) strncpy(iwr.ifr_name, ifname, sizeof(iwr.ifr_name)); iwr.u.data.pointer = (void *) buf; iwr.u.data.length = sizeof(buf); if (ioctl(s, IEEE80211_IOCTL_STA_INFO, &iwr) < 0) errx(1, "unable to get station information"); len = iwr.u.data.length; if (len < sizeof(struct ieee80211req_sta_info)) return; close(s); printf("%-17.17s %4s %4s %4s %4s %4s %4s %6s %6s %4s %5s %3s %8s %8s\n", "ADDR", "AID", "CHAN", "RATE", "RSSI", "DBM", "IDLE", "TXSEQ", "RXSEQ", "CAPS", "ACAPS", "ERP", "STATE", "MODE"); cp = buf; do { struct ieee80211req_sta_info *si; uint8_t *vp; si = (struct ieee80211req_sta_info *) cp; vp = (u_int8_t *)(si+1); printf("%s %4u %4d %3dM %4d %4d %4d %6d %6d %-4.4s %-5.5s %3x %8x %8s", ieee80211_ntoa(si->isi_macaddr), IEEE80211_AID(si->isi_associd), ieee80211_mhz2ieee(si->isi_freq), (si->isi_rates[si->isi_txrate] & IEEE80211_RATE_VAL) / 2, si->isi_rssi, rssi2dbm(si->isi_rssi), si->isi_inact, si->isi_txseqs[0], si->isi_rxseqs[0], getcaps(si->isi_capinfo), getathcaps(si->isi_athflags), si->isi_erp, si->isi_state, getstamode(si->isi_opmode)); printies(vp, si->isi_ie_len, 24); printf("\n"); if (si->isi_uapsd) { printf(" UAPSD QoSInfo: 0x%02x, ", si->isi_uapsd); printf("(VO,VI,BE,BK) = (%d,%d,%d,%d), MaxSpLimit = %s\n", WME_UAPSD_AC_ENABLED(WME_AC_VO, si->isi_uapsd) ? 1 : 0, WME_UAPSD_AC_ENABLED(WME_AC_VI, si->isi_uapsd) ? 1 : 0, WME_UAPSD_AC_ENABLED(WME_AC_BE, si->isi_uapsd) ? 1 : 0, WME_UAPSD_AC_ENABLED(WME_AC_BK, si->isi_uapsd) ? 1 : 0, WME_UAPSD_MAXSP(si->isi_uapsd) == 1 ? "2" : WME_UAPSD_MAXSP(si->isi_uapsd) == 2 ? "4" : WME_UAPSD_MAXSP(si->isi_uapsd) == 3 ? "6" : "NoLimit"); } cp += si->isi_len; len -= si->isi_len; } while (len >= sizeof(struct ieee80211req_sta_info)); }