Exemplo n.º 1
0
int madwifi_get_freqlist(const char *ifname, char *buf, int *len)
{
	int i, bl;
	int rc = -1;
	char *res;
	struct ieee80211req_chaninfo chans;
	struct iwinfo_freqlist_entry entry;

	/* A wifiX device? */
	if( madwifi_iswifi(ifname) )
	{
		if( (res = madwifi_ifadd(ifname)) != NULL )
		{
			rc = get80211priv(res, IEEE80211_IOCTL_GETCHANINFO,
							  &chans, sizeof(chans));

			madwifi_ifdel(res);
		}
	}

	/* Its an athX ... */
	else if( !!madwifi_isvap(ifname, NULL) )
	{
		rc = get80211priv(ifname, IEEE80211_IOCTL_GETCHANINFO,
						  &chans, sizeof(chans));
	}


	/* Got chaninfo? */
	if( rc >= 0 )
	{
		bl = 0;

		for( i = 0; i < chans.ic_nchans; i++ )
		{
			entry.mhz        = chans.ic_chans[i].ic_freq;
			entry.channel    = chans.ic_chans[i].ic_ieee;
			entry.restricted = 0;

			memcpy(&buf[bl], &entry, sizeof(struct iwinfo_freqlist_entry));
			bl += sizeof(struct iwinfo_freqlist_entry);
		}

		*len = bl;
		return 0;
	}

	return -1;
}
Exemplo n.º 2
0
static int madwifi_get_channel(const char *ifname, int *buf)
{
	int i;
	uint16_t freq;
	struct iwreq wrq;
	struct ieee80211req_chaninfo chans;

	if( madwifi_wrq(&wrq, ifname, SIOCGIWFREQ, NULL, 0) >= 0 )
	{
		/* Madwifi returns a Hz frequency, get it's freq list to find channel index */
		freq = (uint16_t)(wrq.u.freq.m / 100000);

		if( get80211priv(ifname, IEEE80211_IOCTL_GETCHANINFO, &chans, sizeof(chans)) >= 0 )
		{
			*buf = 0;

			for( i = 0; i < chans.ic_nchans; i++ )
			{
				if( freq == chans.ic_chans[i].ic_freq )
				{
					*buf = chans.ic_chans[i].ic_ieee;
					break;
				}
			}

			return 0;
		}
	}

	return -1;
}
Exemplo n.º 3
0
int madwifi_get_assoclist(const char *ifname, char *buf, int *len)
{
	int bl, tl, noise;
	uint8_t *cp;
	uint8_t tmp[24*1024];
	struct ieee80211req_sta_info *si;
	struct iwinfo_assoclist_entry entry;

	if( (tl = get80211priv(ifname, IEEE80211_IOCTL_STA_INFO, tmp, 24*1024)) > 0 )
	{
		cp = tmp;
		bl = 0;

		if( madwifi_get_noise(ifname, &noise) )
			noise = 0;

		do {
			si = (struct ieee80211req_sta_info *) cp;

			entry.signal = (si->isi_rssi - 95);
			entry.noise  = noise;
			memcpy(entry.mac, &si->isi_macaddr, 6);
			memcpy(&buf[bl], &entry, sizeof(struct iwinfo_assoclist_entry));

			bl += sizeof(struct iwinfo_assoclist_entry);
			cp += si->isi_len;
			tl -= si->isi_len;
		} while (tl >= sizeof(struct ieee80211req_sta_info));

		*len = bl;
		return 0;
	}

	return -1;
}
Exemplo n.º 4
0
static int madwifi_get_assoclist(const char *ifname, char *buf, int *len)
{
	int bl, tl, noise;
	uint8_t *cp;
	uint8_t tmp[24*1024];
	struct ieee80211req_sta_info *si;
	struct iwinfo_assoclist_entry entry;

	if( (tl = get80211priv(ifname, IEEE80211_IOCTL_STA_INFO, tmp, 24*1024)) > 0 )
	{
		cp = tmp;
		bl = 0;

		if( madwifi_get_noise(ifname, &noise) )
			noise = 0;

		do {
			si = (struct ieee80211req_sta_info *) cp;

			memset(&entry, 0, sizeof(entry));

			entry.signal = (si->isi_rssi - 95);
			entry.noise  = noise;
			memcpy(entry.mac, &si->isi_macaddr, 6);

			entry.inactive = si->isi_inact * 1000;

			entry.tx_packets = (si->isi_txseqs[0] & IEEE80211_SEQ_SEQ_MASK)
				>> IEEE80211_SEQ_SEQ_SHIFT;

			entry.rx_packets = (si->isi_rxseqs[0] & IEEE80211_SEQ_SEQ_MASK)
				>> IEEE80211_SEQ_SEQ_SHIFT;

			entry.tx_rate.rate =
				(si->isi_rates[si->isi_txrate] & IEEE80211_RATE_VAL) * 500;

			/* XXX: this is just a guess */
			entry.rx_rate.rate = entry.tx_rate.rate;

			entry.rx_rate.mcs = -1;
			entry.tx_rate.mcs = -1;

			memcpy(&buf[bl], &entry, sizeof(struct iwinfo_assoclist_entry));

			bl += sizeof(struct iwinfo_assoclist_entry);
			cp += si->isi_len;
			tl -= si->isi_len;
		} while (tl >= sizeof(struct ieee80211req_sta_info));

		*len = bl;
		return 0;
	}
Exemplo n.º 5
0
static void
list_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");
	}
}
Exemplo n.º 6
0
static int madwifi_get_quality(const char *ifname, int *buf)
{
	unsigned int mode, len, quality, quality_count;
	uint8_t tmp[24*1024];
	uint8_t *cp;
	struct iwreq wrq;
	struct ieee80211req_sta_info *si;

	if( madwifi_wrq(&wrq, ifname, SIOCGIWMODE, NULL, 0) >= 0 )
	{
		mode = wrq.u.mode;

		/* Calculate signal average from associated stations in ad-hoc mode */
		if( mode == 1 )
		{
			quality = quality_count = 0;

			if( (len = get80211priv(ifname, IEEE80211_IOCTL_STA_INFO, tmp, 24*1024)) > 0 )
			{
				cp = tmp;

				do {
					si = (struct ieee80211req_sta_info *) cp;

					if( si->isi_rssi > 0 )
					{
						quality_count++;
						quality += si->isi_rssi;
					}

					cp   += si->isi_len;
					len  -= si->isi_len;
				} while (len >= sizeof(struct ieee80211req_sta_info));
			}

			*buf = (quality == 0 || quality_count == 0) ? 0 : (quality / quality_count);
			return 0;
		}

		/* Return whatever wext tells us ... */
		return wext_ops.quality(ifname, buf);
	}

	return -1;
}
Exemplo n.º 7
0
static int madwifi_get_bitrate(const char *ifname, int *buf)
{
	unsigned int mode, len, rate, rate_count;
	uint8_t tmp[24*1024];
	uint8_t *cp;
	struct iwreq wrq;
	struct ieee80211req_sta_info *si;

	if( madwifi_wrq(&wrq, ifname, SIOCGIWMODE, NULL, 0) >= 0 )
	{
		mode = wrq.u.mode;

		/* Calculate bitrate average from associated stations in ad-hoc mode */
		if( mode == 1 )
		{
			rate = rate_count = 0;

			if( (len = get80211priv(ifname, IEEE80211_IOCTL_STA_INFO, tmp, 24*1024)) > 0 )
			{
				cp = tmp;

				do {
					si = (struct ieee80211req_sta_info *) cp;

					if( si->isi_rssi > 0 )
					{
						rate_count++;
						rate += ((si->isi_rates[si->isi_txrate] & IEEE80211_RATE_VAL) / 2);
					}

					cp   += si->isi_len;
					len  -= si->isi_len;
				} while (len >= sizeof(struct ieee80211req_sta_info));
			}

			*buf = (rate == 0 || rate_count == 0) ? 0 : (rate / rate_count) * 1000;
			return 0;
		}

		/* Return whatever wext tells us ... */
		return wext_ops.bitrate(ifname, buf);
	}

	return -1;
}
Exemplo n.º 8
0
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));
}
Exemplo n.º 9
0
static int madwifi_get_encryption(const char *ifname, char *buf)
{
	int ciphers = 0, key_len = 0;
	char keybuf[IW_ENCODING_TOKEN_MAX];
	struct iwinfo_crypto_entry *c = (struct iwinfo_crypto_entry *)buf;
	struct iwreq wrq;
	struct ieee80211req_key wk;

	memset(&wrq, 0, sizeof(wrq));

	/* Obtain key info */
	if( madwifi_wrq(&wrq, ifname, SIOCGIWENCODE, keybuf, sizeof(keybuf)) < 0 )
		return -1;

#if 0
	/* Have any encryption? */
	if( (wrq.u.data.flags & IW_ENCODE_DISABLED) || (wrq.u.data.length == 0) )
		return 0;
#endif

	/* Save key len */
	key_len = wrq.u.data.length;

	/* Get wpa protocol version */
	wrq.u.mode = IEEE80211_PARAM_WPA;
	if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 )
		c->wpa_version = wrq.u.mode;

	/* Get authentication suites */
	wrq.u.mode = IEEE80211_PARAM_AUTHMODE;
	if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 )
	{
		switch(wrq.u.mode) {
			case IEEE80211_AUTH_8021X:
				c->auth_suites |= IWINFO_KMGMT_8021x;
				break;

			case IEEE80211_AUTH_WPA:
				c->auth_suites |= IWINFO_KMGMT_PSK;
				break;

			case IEEE80211_AUTH_OPEN:
				c->auth_algs |= IWINFO_AUTH_OPEN;
				break;

			case IEEE80211_AUTH_SHARED:
				c->auth_algs |= IWINFO_AUTH_SHARED;
				break;

			default:
				c->auth_suites |= IWINFO_KMGMT_NONE;
				break;
		}
	}

	memset(&wk, 0, sizeof(wk));
	memset(wk.ik_macaddr, 0xff, IEEE80211_ADDR_LEN);

	/* Get key information */
	if( get80211priv(ifname, IEEE80211_IOCTL_GETKEY, &wk, sizeof(wk)) >= 0 )
	{
		/* Type 0 == WEP */
		if( (wk.ik_type == 0) && (c->auth_algs == 0) )
			c->auth_algs = (IWINFO_AUTH_OPEN | IWINFO_AUTH_SHARED);
	}

	/* Get used pairwise ciphers */
	wrq.u.mode = IEEE80211_PARAM_UCASTCIPHERS;
	if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 )
	{
		ciphers = wrq.u.mode;

		if( c->wpa_version && ciphers & (1 << IEEE80211_CIPHER_TKIP) )
			c->pair_ciphers |= IWINFO_CIPHER_TKIP;

		if( c->wpa_version && ciphers & (1 << IEEE80211_CIPHER_AES_CCM) )
			c->pair_ciphers |= IWINFO_CIPHER_CCMP;

		if( c->wpa_version && ciphers & (1 << IEEE80211_CIPHER_AES_OCB) )
			c->pair_ciphers |= IWINFO_CIPHER_AESOCB;

		if( c->wpa_version && ciphers & (1 << IEEE80211_CIPHER_CKIP) )
			c->pair_ciphers |= IWINFO_CIPHER_CKIP;

		if( !c->pair_ciphers && ciphers & (1 << IEEE80211_CIPHER_WEP) )
		{
			switch(key_len) {
				case 13:
					c->pair_ciphers |= IWINFO_CIPHER_WEP104;
					break;

				case 5:
					c->pair_ciphers |= IWINFO_CIPHER_WEP40;
					break;

				case 0:
					break;

				default:
					c->pair_ciphers = IWINFO_CIPHER_WEP40 |
						IWINFO_CIPHER_WEP104;
					break;
			}
		}

		if( ciphers & (1 << IEEE80211_CIPHER_NONE) )
			c->pair_ciphers |= IWINFO_CIPHER_NONE;
	}

	/* Get used group cipher */
	wrq.u.mode = IEEE80211_PARAM_MCASTCIPHER;
	if( madwifi_wrq(&wrq, ifname, IEEE80211_IOCTL_GETPARAM, NULL, 0) >= 0 )
	{
		ciphers = c->wpa_version ? wrq.u.mode : IEEE80211_CIPHER_WEP;

		switch(ciphers) {
			case IEEE80211_CIPHER_TKIP:
				c->group_ciphers |= IWINFO_CIPHER_TKIP;
				break;

			case IEEE80211_CIPHER_AES_CCM:
				c->group_ciphers |= IWINFO_CIPHER_CCMP;
				break;

			case IEEE80211_CIPHER_AES_OCB:
				c->group_ciphers |= IWINFO_CIPHER_AESOCB;
				break;

			case IEEE80211_CIPHER_CKIP:
				c->group_ciphers |= IWINFO_CIPHER_CKIP;
				break;

			case IEEE80211_CIPHER_WEP:
				switch(key_len) {
					case 13:
						c->group_ciphers |= IWINFO_CIPHER_WEP104;
						break;

					case 5:
						c->group_ciphers |= IWINFO_CIPHER_WEP40;
						break;

					default:
						break;
				}
				break;

			case IEEE80211_CIPHER_NONE:
				c->group_ciphers |= IWINFO_CIPHER_NONE;
				break;

			default:
				break;
		}
	}

	c->enabled = (c->wpa_version || (c->auth_algs && c->pair_ciphers)) ? 1 : 0;

	return 0;
}
Exemplo n.º 10
0
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;
}