⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wlanconfig.c.svn-base

📁 最新之atheros芯片driver source code, 基于linux操作系统,內含atheros芯片HAL全部代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
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 + -