📄 wlanconfig.c.svn-base
字号:
static __inline intisatherosoui(const u_int8_t *frm){ return frm[1] > 3 && LE_READ_4(frm + 2) == ((ATH_OUI_TYPE << 24) | ATH_OUI);}static voidprinties(const u_int8_t *vp, int ielen, int maxcols){ while (ielen > 0) { switch (vp[0]) { case IEEE80211_ELEMID_VENDOR: if (iswpaoui(vp)) printie(" WPA", vp, 2 + vp[1], maxcols); else if (iswmeoui(vp)) printie(" WME", vp, 2 + vp[1], maxcols); else if (isatherosoui(vp)) printie(" ATH", vp, 2 + vp[1], maxcols); else printie(" VEN", vp, 2 + vp[1], maxcols); break; case IEEE80211_ELEMID_RSN: printie(" RSN", vp, 2 + vp[1], maxcols); break; default: printie(" ???", vp, 2 + vp[1], maxcols); break; } ielen -= 2 + vp[1]; vp += 2 + vp[1]; }}static const char *ieee80211_ntoa(const uint8_t mac[IEEE80211_ADDR_LEN]){ static char a[18]; int i; i = snprintf(a, sizeof(a), "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return (i < 17 ? NULL : a);}static voidlist_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 %5s %6s %7s %6s %7s %4s %5s %3s %8s %8s\n", "ADDR", "AID", "CHAN", "RATE", "RSSI", "DBM", "IDLE", "TXSEQ", "TXFRAG", "RXSEQ", "RXFRAG", "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 %5d %6d %7d %6d %7d %-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] & IEEE80211_SEQ_SEQ_MASK) >> IEEE80211_SEQ_SEQ_SHIFT, si->isi_txseqs[0] & IEEE80211_SEQ_FRAG_MASK, (si->isi_rxseqs[0] & IEEE80211_SEQ_SEQ_MASK) >> IEEE80211_SEQ_SEQ_SHIFT, si->isi_rxseqs[0] & IEEE80211_SEQ_FRAG_MASK, 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));}/* unaligned little endian access */#define LE_READ_4(p) \ ((u_int32_t) \ ((((const u_int8_t *)(p))[0] ) | \ (((const u_int8_t *)(p))[1] << 8) | \ (((const u_int8_t *)(p))[2] << 16) | \ (((const u_int8_t *)(p))[3] << 24)))static voidlist_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 voidprint_chaninfo(const struct ieee80211_channel *c){ char buf[14]; buf[0] = '\0'; if (IEEE80211_IS_CHAN_FHSS(c)) strlcat(buf, " FHSS", sizeof(buf)); if (IEEE80211_IS_CHAN_A(c)) strlcat(buf, " 11a", sizeof(buf)); /* XXX 11g schizophrenia */ if (IEEE80211_IS_CHAN_G(c) || IEEE80211_IS_CHAN_PUREG(c)) strlcat(buf, " 11g", sizeof(buf)); else if (IEEE80211_IS_CHAN_B(c)) strlcat(buf, " 11b", sizeof(buf)); if (IEEE80211_IS_CHAN_STURBO(c)) strlcat(buf, " Static", sizeof(buf)); if (IEEE80211_IS_CHAN_DTURBO(c)) strlcat(buf, " Dynamic", sizeof(buf)); if (IEEE80211_IS_CHAN_HALF(c)) strlcat(buf, " Half", sizeof(buf)); if (IEEE80211_IS_CHAN_QUARTER(c)) strlcat(buf, " Quarter", sizeof(buf)); printf("Channel %3u : %u%c%c Mhz%-14.14s", c->ic_ieee, c->ic_freq, IEEE80211_IS_CHAN_PASSIVE(c) ? '*' : ' ', IEEE80211_IS_CHAN_RADAR(c) ? '!' : ' ', buf);}static voidlist_channels(const char *ifname, int allchans){ struct ieee80211req_chaninfo chans; struct ieee80211req_chaninfo achans; const struct ieee80211_channel *c; int i, half; if (get80211priv(ifname, IEEE80211_IOCTL_GETCHANINFO, &chans, sizeof(chans)) < 0) errx(1, "unable to get channel information"); if (!allchans) { uint8_t active[32]; if (get80211priv(ifname, IEEE80211_IOCTL_GETCHANLIST, &active, sizeof(active)) < 0) errx(1, "unable to get active channel list"); memset(&achans, 0, sizeof(achans)); for (i = 0; i < chans.ic_nchans; i++) { c = &chans.ic_chans[i]; if (isset(active, ieee80211_mhz2ieee(c->ic_freq)) || allchans) achans.ic_chans[achans.ic_nchans++] = *c; } } else achans = chans; half = achans.ic_nchans / 2; if (achans.ic_nchans % 2) half++; for (i = 0; i < achans.ic_nchans / 2; i++) { print_chaninfo(&achans.ic_chans[i]); print_chaninfo(&achans.ic_chans[half + i]); printf("\n"); } if (achans.ic_nchans % 2) { print_chaninfo(&achans.ic_chans[i]); printf("\n"); }}static voidlist_keys(const char *ifname){ char cmd[256]; puts("[list_keys not implemented (yet). Spawning iwlist...]"); strcpy(cmd, "iwlist "); strcat(cmd, ifname); strcat(cmd, " key"); system(cmd);}#define IEEE80211_C_BITS \"\020\1WEP\2TKIP\3AES\4AES_CCM\6CKIP\7FF\10TURBOP\11IBSS\12PMGT\13HOSTAP\14AHDEMO" \"\15SWRETRY\16TXPMGT\17SHSLOT\20SHPREAMBLE\21MONITOR\22TKIPMIC\30WPA1" \"\31WPA2\32BURST\33WME"/* * Print a value a la the %b format of the kernel's printf */static voidprintb(const char *s, unsigned v, const char *bits){ int i, any = 0; char c; if (bits && *bits == 8) printf("%s=%o", s, v); else printf("%s=%x", s, v); bits++; if (bits) { putchar('<'); while ((i = *bits++) != '\0') { if (v & (1 << (i-1))) { if (any) putchar(','); any = 1; for (; (c = *bits) > 32; bits++) putchar(c); } else for (; *bits > 32; bits++); } putchar('>'); }}static voidlist_capabilities(const char *ifname){ u_int32_t caps; if (get80211param(ifname, IEEE80211_PARAM_DRIVER_CAPS, &caps, sizeof(caps)) < 0) errx(1, "unable to get driver capabilities"); printb(ifname, caps, IEEE80211_C_BITS); putchar('\n');}static voidlist_wme(const char *ifname){#define GETPARAM() \ (get80211priv(ifname, IEEE80211_IOCTL_GETWMMPARAMS, param, sizeof(param)) != -1) static const char *acnames[] = { "AC_BE", "AC_BK", "AC_VI", "AC_VO" }; int param[3]; int ac; param[2] = 0; /* channel params */ for (ac = WME_AC_BE; ac <= WME_AC_VO; ac++) {again: if (param[2] != 0) printf("\t%s", " "); else printf("\t%s", acnames[ac]); param[1] = ac; /* show WME BSS parameters */ param[0] = IEEE80211_WMMPARAMS_CWMIN; if (GETPARAM()) printf(" cwmin %2u", param[0]); param[0] = IEEE80211_WMMPARAMS_CWMAX; if (GETPARAM()) printf(" cwmax %2u", param[0]); param[0] = IEEE80211_WMMPARAMS_AIFS; if (GETPARAM()) printf(" aifs %2u", param[0]); param[0] = IEEE80211_WMMPARAMS_TXOPLIMIT; if (GETPARAM()) printf(" txopLimit %3u", param[0]); param[0] = IEEE80211_WMMPARAMS_ACM; if (GETPARAM()) { if (param[0]) printf(" acm"); else if (verbose) printf(" -acm"); } /* !BSS only */ if (param[2] == 0) { param[0] = IEEE80211_WMMPARAMS_NOACKPOLICY; if (GETPARAM()) { if (param[0]) printf(" -ack"); else if (verbose) printf(" ack"); } } printf("\n"); if (param[2] == 0) { param[2] = 1; /* bss params */ goto again; } else param[2] = 0; }}static voidieee80211_status(const char *ifname){ /* XXX fill in */ char cmd[256]; puts("[status not implemented (yet). Spawning iwconfig...]"); strcpy(cmd, "iwconfig "); strcat(cmd, ifname); system(cmd);}static intgetsocket(void){ static int s = -1; if (s < 0) { s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) err(1, "socket(SOCK_DGRAM)"); } return s;}static intget80211param(const char *ifname, int param, void *data, size_t len){ struct iwreq iwr; memset(&iwr, 0, sizeof(iwr)); strncpy(iwr.ifr_name, ifname, IFNAMSIZ); iwr.u.mode = param; if (ioctl(getsocket(), IEEE80211_IOCTL_GETPARAM, &iwr) < 0) { perror("ioctl[IEEE80211_IOCTL_GETPARAM]"); return -1; } if (len < IFNAMSIZ) { /* * Argument data fits inline; put it there. */ memcpy(data, iwr.u.name, len); } return iwr.u.data.length;}#define IOCTL_ERR(x) [x - SIOCIWFIRSTPRIV] = "ioctl[" #x "]"static intdo80211priv(struct iwreq *iwr, const char *ifname, int op, void *data, size_t len){ memset(iwr, 0, sizeof(struct iwreq)); strncpy(iwr->ifr_name, ifname, IFNAMSIZ); if (len < IFNAMSIZ) { /* * Argument data fits inline; put it there. */ memcpy(iwr->u.name, data, len); } else { /* * Argument data too big for inline transfer; setup a * parameter block instead; the kernel will transfer * the data for the driver. */ iwr->u.data.pointer = data; iwr->u.data.length = len; } if (ioctl(getsocket(), op, iwr) < 0) { static const char *opnames[] = { IOCTL_ERR(IEEE80211_IOCTL_SETPARAM), IOCTL_ERR(IEEE80211_IOCTL_GETPARAM), IOCTL_ERR(IEEE80211_IOCTL_SETMODE), IOCTL_ERR(IEEE80211_IOCTL_GETMODE), IOCTL_ERR(IEEE80211_IOCTL_SETWMMPARAMS), IOCTL_ERR(IEEE80211_IOCTL_GETWMMPARAMS), IOCTL_ERR(IEEE80211_IOCTL_SETCHANLIST), IOCTL_ERR(IEEE80211_IOCTL_GETCHANLIST), IOCTL_ERR(IEEE80211_IOCTL_CHANSWITCH), IOCTL_ERR(IEEE80211_IOCTL_GETCHANINFO), IOCTL_ERR(IEEE80211_IOCTL_SETOPTIE), IOCTL_ERR(IEEE80211_IOCTL_GETOPTIE), IOCTL_ERR(IEEE80211_IOCTL_SETMLME), IOCTL_ERR(IEEE80211_IOCTL_RADAR), IOCTL_ERR(IEEE80211_IOCTL_SETKEY), IOCTL_ERR(IEEE80211_IOCTL_DELKEY), IOCTL_ERR(IEEE80211_IOCTL_HALMAP), IOCTL_ERR(IEEE80211_IOCTL_ADDMAC), IOCTL_ERR(IEEE80211_IOCTL_DELMAC), IOCTL_ERR(IEEE80211_IOCTL_WDSADDMAC), IOCTL_ERR(IEEE80211_IOCTL_WDSDELMAC), IOCTL_ERR(IEEE80211_IOCTL_READREG), IOCTL_ERR(IEEE80211_IOCTL_WRITEREG), }; op -= SIOCIWFIRSTPRIV; if (0 <= op && op < ARRAY_SIZE(opnames)) perror(opnames[op]); else perror("ioctl[unknown???]"); return -1; } return 0;}static intget80211priv(const char *ifname, int op, void *data, size_t len){ struct iwreq iwr; if (do80211priv(&iwr, ifname, op, data, len) < 0) return -1; if (len < IFNAMSIZ) memcpy(data, iwr.u.name, len); return iwr.u.data.length;}/* * Appends src to string dst of size siz (unlike strncat, siz is the * full size of dst, not space left). At most siz-1 characters * will be copied. Always NUL terminates (unless siz <= strlen(dst)). * Returns strlen(src) + MIN(siz, strlen(initial dst)). * If retval >= siz, truncation occurred. */size_tstrlcat(char *dst, const char *src, size_t siz){ char *d = dst; const char *s = src; size_t n = siz; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end */ while (n-- != 0 && *d != '\0') d++; dlen = d - dst; n = siz - dlen; if (n == 0) return(dlen + strlen(s)); while (*s != '\0') { if (n != 1) { *d++ = *s; n--; } s++; } *d = '\0'; return(dlen + (s - src)); /* count does not include NUL */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -