示例#1
0
int site_survey_main(int argc, char *argv[])
#endif
{
#define DOT11_CAP_ESS				0x0001
#define DOT11_CAP_IBSS				0x0002
#define DOT11_CAP_PRIVACY			0x0010	/* d11 cap. privacy */

	unsigned char b1[32], b2[64], b3[32], b4[32], b5[32], b6[32], b7[32], ext[32];
	int i = 0;

	unlink(SITE_SURVEY_DB);
	int ap = 0, oldap = 0;
	int len;

	memset(site_survey_lists, sizeof(site_survey_lists), 0);
	if (nvram_match("wl0_mode", "ap")
	    || nvram_match("wl0_mode", "apsta")) {
		eval("iwpriv", "ra0", "set", "SiteSurvey=1");	// only in ap mode
		sleep(4);	//wait 4 seconds per spec
	}

	FILE *scan = popen("iwpriv ra0 get_site_survey", "rb");

	skipline(scan);
	skipline(scan);
//      fscanf(scan, "%s %s", b1, b2);  // skip first line
//      fscanf(scan, "%s %s %s %s %s %s %s", b1, b2, b3, b4, b5, b6, b7);       //skip second line
	i = 0;
	int c = 0;
	do {
		if (feof(scan))
			break;
		fread(b1, 4, 1, scan);
		b1[4] = 0;
		b1[strlen(b1)] = 0;
		fread(b2, 33, 1, scan);
		b2[32] = 0;
		b2[strlen(b2)] = 0;
		//kill trailing blanks
		for (c = 0; c < 32; c++) {
			if (b2[31 - c] != 0x20)
				break;
			b2[31 - c] = 0;
		}
		//skip leading blanks
		for (c = 0; c < 32; c++) {
			if (b2[c] != 0x20)
				break;
		}
		if (c && c < 32) {
			for (i = 0; i < 32 - c; i++)
				b2[i] = b2[i + c];
		}
		int ret = fscanf(scan, "%s %s %s %s %s %s", b3, b4, b5, b6, ext, b7);	//skip second line
		if (ret < 5)
			break;
		if (ret == 6)
			skipline(scan);
		else
			strncpy(b7, ext, 31);
		site_survey_lists[i].channel = atoi(b1);	// channel
		site_survey_lists[i].frequency = ieee80211_ieee2mhz(site_survey_lists[i].channel);
		strcpy(site_survey_lists[i].SSID, b2);	//SSID
		strcpy(site_survey_lists[i].BSSID, b3);	//BSSID
		site_survey_lists[i].phy_noise = -95;	// no way
		strcpy(site_survey_lists[i].ENCINFO, b4);
		site_survey_lists[i].RSSI = -atoi(b5);

		if (!strcmp(b6, "11b/g"))
			site_survey_lists[i].rate_count = 12;
		if (!strcmp(b6, "11b"))
			site_survey_lists[i].rate_count = 4;
		if (!strcmp(b6, "11b/g/n"))
			site_survey_lists[i].rate_count = 300;

		if (!strcmp(b7, "In"))
			site_survey_lists[i].capability = DOT11_CAP_ESS;

		if (!strcmp(b7, "Ad"))
			site_survey_lists[i].capability = DOT11_CAP_IBSS;

		if (strcmp(b4, "OPEN"))
			site_survey_lists[i].capability |= DOT11_CAP_PRIVACY;

		i++;
	}
	while (1);
	fclose(scan);
	write_site_survey();
	open_site_survey();
	for (i = 0; i < SITE_SURVEY_NUM && site_survey_lists[i].BSSID[0]
	     && site_survey_lists[i].channel != 0; i++) {

		fprintf(stderr,
			"[%2d] SSID[%20s] BSSID[%s] channel[%2d] frequency[%4d] rssi[%d] noise[%d] beacon[%d] cap[%x] dtim[%d] rate[%d] enc[%s]\n",
			i, site_survey_lists[i].SSID,
			site_survey_lists[i].BSSID,
			site_survey_lists[i].channel,
			site_survey_lists[i].frequency,
			site_survey_lists[i].RSSI,
			site_survey_lists[i].phy_noise,
			site_survey_lists[i].beacon_period, site_survey_lists[i].capability, site_survey_lists[i].dtim_period, site_survey_lists[i].rate_count, site_survey_lists[i].ENCINFO);
	}

	return 0;
}
示例#2
0
int site_survey_main(int argc, char *argv[])
{
	char *name = nvram_safe_get("wl0_ifname");
	unsigned char mac[20];
	int i = 0;
	char *dev = name;

	unlink(SITE_SURVEY_DB);
	int ap = 0, oldap = 0;

	unsigned char buf[24 * 1024];
	char ssid[31];
	unsigned char *cp;
	int len;

	system2("airoscan-ng wifi0");
	len =
	    do80211priv("ath0", IEEE80211_IOCTL_SCAN_RESULTS, buf, sizeof(buf));

	if (len == -1)
		fprintf(stderr, "unable to get scan results");
	if (len < sizeof(struct ieee80211req_scan_result))
		return;
	cp = buf;
	do {
		struct ieee80211req_scan_result *sr;
		unsigned char *vp;
		char ssid[14];

		sr = (struct ieee80211req_scan_result *)cp;
		vp = (u_int8_t *)(sr + 1);
		memset(ssid, 0, sizeof(ssid));
		strncpy(site_survey_lists[i].SSID, vp, sr->isr_ssid_len);
		strcpy(site_survey_lists[i].BSSID,
		       ieee80211_ntoa(sr->isr_bssid));
		site_survey_lists[i].channel = ieee80211_mhz2ieee(sr->isr_freq);
		site_survey_lists[i].frequency = sr->isr_freq;
		int noise = 256;

		noise -= (int)sr->isr_noise;
		site_survey_lists[i].phy_noise = -noise;
		site_survey_lists[i].RSSI =
		    (int)site_survey_lists[i].phy_noise + (int)sr->isr_rssi;
		site_survey_lists[i].capability = sr->isr_capinfo;
		site_survey_lists[i].rate_count = sr->isr_nrates;
		cp += sr->isr_len, len -= sr->isr_len;
		i++;
	}
	while (len >= sizeof(struct ieee80211req_scan_result));

	write_site_survey();
	open_site_survey();
	for (i = 0; i < SITE_SURVEY_NUM && site_survey_lists[i].BSSID[0]
	     && site_survey_lists[i].channel != 0; i++) {
		fprintf(stderr,
			"[%2d] SSID[%20s] BSSID[%s] channel[%2d] frequency[%4d] rssi[%d] noise[%d] beacon[%d] cap[%x] dtim[%d] rate[%d]\n",
			i, site_survey_lists[i].SSID,
			site_survey_lists[i].BSSID,
			site_survey_lists[i].channel,
			site_survey_lists[i].frequency,
			site_survey_lists[i].RSSI,
			site_survey_lists[i].phy_noise,
			site_survey_lists[i].beacon_period,
			site_survey_lists[i].capability,
			site_survey_lists[i].dtim_period,
			site_survey_lists[i].rate_count);
	}

	return 0;
}
示例#3
0
int site_survey_main(int argc, char *argv[])
{
	char tmp[32];
	sprintf(tmp, "%s_ifname", nvram_safe_get("wifi_display"));
	char *name = nvram_safe_get(tmp);

	unsigned char buf[10000];
	wl_scan_results_t *scan_res = (wl_scan_results_t *) buf;
	wl_bss_info_t *bss_info;
	unsigned char mac[20];
	int i;
	char *dev = name;

	unlink(SITE_SURVEY_DB);
	int ap = 0, oldap = 0;
	wl_scan_params_t params;

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

	/*
	 * use defaults (same parameters as wl scan) 
	 */

	memset(&params.bssid, 0xff, sizeof(params.bssid));
	if (argc > 1) {
		params.ssid.SSID_len = strlen(argv[1]);
		strcpy(params.ssid.SSID, argv[1]);
	}
	params.bss_type = DOT11_BSSTYPE_ANY;
	params.scan_type = 0;
	params.nprobes = -1;
	params.active_time = -1;
	params.passive_time = -1;
	params.home_time = -1;
	params.channel_num = 0;

	/*
	 * can only scan in STA mode 
	 */
	if (wl_ioctl(dev, WLC_SCAN, &params, 64) < 0) {
		fprintf(stderr, "scan failed\n");
		return -1;
	}
	int count = 10;
	int ret = 0;
	while ((count--) > 0)	//scan for max 5 seconds
	{
		usleep(500 * 1000);

		bzero(buf, sizeof(buf));
		scan_res->buflen = sizeof(buf);
		ret = wl_ioctl(dev, WLC_SCAN_RESULTS, buf, WLC_IOCTL_MAXLEN);
		if (!ret)
			break;
	}
	if (ret < 0) {
		fprintf(stderr, "scan failed with errorcode %d\n", ret);
	}

	fprintf(stderr, "buflen=[%d] version=[%d] count=[%d]\n", scan_res->buflen, scan_res->version, scan_res->count);

	if (scan_res->count == 0) {
		cprintf("Can't find any wireless device\n");
		goto endss;
	}

	bss_info = &scan_res->bss_info[0];
	for (i = 0; i < scan_res->count; i++) {
		strcpy(site_survey_lists[i].SSID, bss_info->SSID);
		strcpy(site_survey_lists[i].BSSID, ether_etoa(bss_info->BSSID.octet, mac));
#ifndef HAVE_RB500
		site_survey_lists[i].channel = bss_info->chanspec & 0xff;
#endif
		site_survey_lists[i].frequency = ieee80211_ieee2mhz(site_survey_lists[i].channel);
#ifdef WL_CHANSPEC_BW_80
		switch (bss_info->chanspec & 0x3800) {
		case WL_CHANSPEC_BW_80:
			site_survey_lists[i].channel |= 0x1000;
			break;
		case WL_CHANSPEC_BW_8080:
			site_survey_lists[i].channel |= 0x1100;
			break;
		case WL_CHANSPEC_BW_160:
			site_survey_lists[i].channel |= 0x1200;
			break;
		}
#endif

		site_survey_lists[i].RSSI = bss_info->RSSI;
		site_survey_lists[i].phy_noise = bss_info->phy_noise;
		site_survey_lists[i].beacon_period = bss_info->beacon_period;
		site_survey_lists[i].capability = bss_info->capability;
		site_survey_lists[i].rate_count = get_mcs_max(bss_info->basic_mcs);
		if (!site_survey_lists[i].rate_count)
			site_survey_lists[i].rate_count = get_legacy(bss_info->rateset.rates, bss_info->rateset.count);

		site_survey_lists[i].dtim_period = bss_info->dtim_period;
		strcpy(site_survey_lists[i].ENCINFO, getEncInfo(bss_info));

		bss_info = (wl_bss_info_t *) ((uint32) bss_info + bss_info->length);
	}
	write_site_survey();
	open_site_survey();
	// modded by ascott and fractal, may 17th, 2012 to show "hidden" SSIDS
	for (i = 0; i < SITE_SURVEY_NUM && site_survey_lists[i].BSSID[0]; i++) {
		if (site_survey_lists[i].SSID[0] == 0) {
			strcpy(site_survey_lists[i].SSID, "hidden");
		}
		fprintf(stderr,
			"[%2d] SSID[%20s] BSSID[%s] channel[%2d] frequency[%4d] rssi[%d] noise[%d] beacon[%d] cap[%x] dtim[%d] rate[%d] enc[%s]\n",
			i, site_survey_lists[i].SSID,
			site_survey_lists[i].BSSID,
			site_survey_lists[i].channel & 0xff,
			site_survey_lists[i].frequency,
			site_survey_lists[i].RSSI,
			site_survey_lists[i].phy_noise,
			site_survey_lists[i].beacon_period, site_survey_lists[i].capability, site_survey_lists[i].dtim_period, site_survey_lists[i].rate_count, site_survey_lists[i].ENCINFO);
	}

endss:

	C_led(0);
	eval("wl", "-i", name, "up");
	return 0;
}