Date: Tue, 2 Nov 2004 21:35:09 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 64114 for review Message-ID: <200411022135.iA2LZ9gD053117@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=64114 Change 64114 by sam@sam_ebb on 2004/11/02 21:35:06 first cut at scanning Affected files ... .. //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#4 edit Differences ... ==== //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#4 (text+ko) ==== @@ -481,11 +481,139 @@ } } +static int +getmaxrate(uint8_t rates[15], uint8_t nrates) +{ + int i, maxrate = -1; + + for (i = 0; i < nrates; i++) { + int rate = rates[i] & IEEE80211_RATE_VAL; + if (rate > maxrate) + maxrate = rate; + } + return maxrate / 2; +} + +static const char * +getcaps(int capinfo) +{ + static char capstring[32]; + char *cp = capstring; + + if (capinfo & IEEE80211_CAPINFO_ESS) + *cp++ = 'E'; + if (capinfo & IEEE80211_CAPINFO_IBSS) + *cp++ = 'I'; + if (capinfo & IEEE80211_CAPINFO_CF_POLLABLE) + *cp++ = 'c'; + if (capinfo & IEEE80211_CAPINFO_CF_POLLREQ) + *cp++ = 'C'; + if (capinfo & IEEE80211_CAPINFO_PRIVACY) + *cp++ = 'P'; + if (capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) + *cp++ = 'S'; + if (capinfo & IEEE80211_CAPINFO_PBCC) + *cp++ = 'B'; + if (capinfo & IEEE80211_CAPINFO_CHNL_AGILITY) + *cp++ = 'A'; + if (capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME) + *cp++ = 's'; + if (capinfo & IEEE80211_CAPINFO_RSN) + *cp++ = 'R'; + if (capinfo & IEEE80211_CAPINFO_DSSSOFDM) + *cp++ = 'D'; + *cp = '\0'; + return capstring; +} + static void +printie(const char* tag, const uint8_t *ie, size_t ielen, int maxlen) +{ + printf("%s", tag); + if (verbose) { + maxlen -= strlen(tag)+2; + if (2*ielen > maxlen) + maxlen--; + printf("<"); + for (; ielen > 0; ie++, ielen--) { + if (maxlen-- <= 0) + break; + printf("%02x", *ie); + } + if (ielen != 0) + printf("-"); + printf(">"); + } +} + +static void set80211scan(const char *val, int d, int s, const struct afswtch *rafp) { - /* XXX optional ssid */ - set80211(s, IEEE80211_IOC_SCAN_REQ, 0, 0, NULL); + uint8_t buf[24*1024]; + struct ieee80211req ireq; + uint8_t *cp; + int len; + + (void) memset(&ireq, 0, sizeof(ireq)); + (void) strncpy(ireq.i_name, name, sizeof(ireq.i_name)); + ireq.i_type = IEEE80211_IOC_SCAN_REQ; + /* NB: only root can trigger a scan so ignore errors */ + (void) ioctl(s, SIOCS80211, &ireq); + + ireq.i_type = IEEE80211_IOC_SCAN_RESULTS; + ireq.i_data = buf; + ireq.i_len = sizeof(buf); + while (ioctl(s, SIOCG80211, &ireq) < 0) { + if (errno != EINPROGRESS) + errx(1, "unable to get scan results"); + sleep(1); + } + len = ireq.i_len; + if (len >= sizeof(struct ieee80211req_scan_result)) + printf("%-14.14s %-17.17s %4s %4s %-5s %3s %4s\n" + , "SSID" + , "BSSID" + , "CHAN" + , "RATE" + , "S:N" + , "INT" + , "CAPS" + ); + cp = buf; + while (len >= sizeof(struct ieee80211req_scan_result)) { + struct ieee80211req_scan_result *sr; + uint8_t *vp; + + sr = (struct ieee80211req_scan_result *) cp; + /* XXX clean ssid string */ + vp = (u_int8_t *)(sr+1); + printf("%-14.*s %s %3d %3dM %2d:%-2d %3d %-4.4s" + , sr->isr_ssid_len, vp + , ether_ntoa((const struct ether_addr *) sr->isr_bssid) + , ieee80211_mhz2ieee(sr->isr_freq) + , getmaxrate(sr->isr_rates, sr->isr_nrates) + , sr->isr_rssi, sr->isr_noise + , sr->isr_intval + , getcaps(sr->isr_capinfo) + ); + + if (sr->isr_ie_len > 0) { + vp += sr->isr_ssid_len; + switch (vp[0]) { + case IEEE80211_ELEMID_VENDOR: + if (vp[1] < 2 + 4 || + memcmp(&vp[2], "\x00\x50\xf2\x01", 4) != 0) + break; + printie("WPA", vp, 2+vp[1], 24); + break; + case IEEE80211_ELEMID_RSN: + printie("RSN", vp, 2+vp[1], 24); + break; + } + } + printf("\n"); + cp += sr->isr_len, len -= sr->isr_len; + } } enum ieee80211_opmode { @@ -1116,7 +1244,7 @@ { "chanlist", NEXTARG, set80211chanlist }, { "bssid", NEXTARG, set80211bssid }, { "ap", NEXTARG, set80211bssid }, - { "scan", OPTARG, set80211scan }, + { "scan", 0, set80211scan }, }; static struct afswtch af_ieee80211 = { .af_name = "ieee80211",
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200411022135.iA2LZ9gD053117>