static void printssid(const char *tag, const u_int8_t *ie, size_t ielen, int maxlen) { char ssid[2*IEEE80211_NWID_LEN+1]; printf("%s<%.*s>", tag, copy_essid(ssid, maxlen, ie+2, ie[1]), ssid); }
static void list_scan(prop_dictionary_t env) { u_int8_t buf[64*1024 - 1]; struct ieee80211req ireq; char ssid[IEEE80211_NWID_LEN+1]; const u_int8_t *cp; int len, ssidmax; const struct ieee80211req_scan_result *sr; memset(&ireq, 0, sizeof(ireq)); ireq.i_type = IEEE80211_IOC_SCAN_RESULTS; ireq.i_data = buf; ireq.i_len = sizeof(buf); if (direct_ioctl(env, SIOCG80211, &ireq) < 0) errx(EXIT_FAILURE, "unable to get scan results"); len = ireq.i_len; if (len < (int)sizeof(*sr)) return; ssidmax = calc_len(buf, len); printf("%-*.*s %-17.17s %4s %4s %-7s %3s %4s\n" , ssidmax, ssidmax, "SSID" , "BSSID" , "CHAN" , "RATE" , "S:N" , "INT" , "CAPS" ); cp = buf; while (len >= (int)sizeof(*sr)) { const uint8_t *vp; sr = (const struct ieee80211req_scan_result *) cp; vp = (const u_int8_t *)(sr+1); (void)copy_essid(ssid, sizeof(ssid), vp, sr->isr_ssid_len); printf("%-*.*s %s %3d %3dM %3d:%-3d %3d %-4.4s" , ssidmax, ssidmax, ssid , ether_ntoa((const struct ether_addr *) sr->isr_bssid) , ieee80211_mhz2ieee(sr->isr_freq, sr->isr_flags) , getmaxrate(sr->isr_rates, sr->isr_nrates) , 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; } }
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)); }
static int calc_len(const u_int8_t *cp, int len) { int maxlen = 0, curlen; const struct ieee80211req_scan_result *sr; char buf[IEEE80211_NWID_LEN]; while (len >= (int)sizeof(*sr)) { sr = (const struct ieee80211req_scan_result *)cp; cp += sr->isr_len; len -= sr->isr_len; curlen = copy_essid(buf, sizeof(buf), (const u_int8_t *)(sr + 1), sr->isr_ssid_len); if (curlen >= IEEE80211_NWID_LEN) return IEEE80211_NWID_LEN; if (curlen > maxlen) maxlen = curlen; } return maxlen; }
static void list_scan(AP_IW_CHANSCAN_RESULT_T *cfg, const char *ifname) { uint8_t buf[48*1024]; uint8_t *cp = NULL; int len = 0; int count = 0; //to count results. int iTemp = 0; AP_IW_CHANSCAN_RESULT_ENTRY *entry; struct ieee80211req_scan_result *sr; uint8_t *vp; len = get80211priv(ifname, IEEE80211_IOCTL_SCAN_RESULTS, buf, sizeof(buf)); if (len == -1) { RTN_LOG("IOCTL error,unable to get scan results"); return; } if (len < sizeof(struct ieee80211req_scan_result)) { RTN_LOG("get scan results len %d < struct", len); return; } cp = buf; do { sr = (struct ieee80211req_scan_result *) cp; vp = (u_int8_t *)(sr+1); // RTN_LOG("Get assignchan=%d, match chan=%d", cfg->assignChan, sr->isr_freq); if(cfg->assignChan == 0 || cfg->assignChan == sr->isr_freq) { entry = &cfg->scan_entry[count]; //set ssid iTemp = copy_essid((char *)entry->ssid, 32, vp, sr->isr_ssid_len); entry->ssid[iTemp] = '\0'; //set bssid memcpy(entry->bssid, sr->isr_bssid, 6); //set chan entry->chan = sr->isr_freq; //set maxrate entry->maxrate = getmaxrate(sr->isr_rates, sr->isr_nrates); //set rssi entry->rssi = sr->isr_rssi; //set noise entry->noise = sr->isr_noise; //set intval entry->intval = sr->isr_intval; //set caps getcaps(sr->isr_capinfo, (char *)entry->caps); //set ies,max = 96/4-1=23 getIEs(vp + sr->isr_ssid_len, sr->isr_ie_len, 23, entry->ieinfo); count++; } cp += sr->isr_len, len -= sr->isr_len; } while ((len >= sizeof(struct ieee80211req_scan_result)) && (count < AP_IW_CHANSCAN_MAX_RESULT_NUM)); cfg->num = count; }