[PATCH] hostap update

Cleaned up scan result processing by converting struct
hfa384x_scan_result into struct hfa384x_hostscan_result. This removes
special cases from result processing since the results are only used
in one, hostscan, format.

Signed-off-by: Jouni Malinen <jkmaline@cc.hut.fi>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
diff --git a/drivers/net/wireless/hostap/hostap_info.c b/drivers/net/wireless/hostap/hostap_info.c
index cf9e089..6ca9491 100644
--- a/drivers/net/wireless/hostap/hostap_info.c
+++ b/drivers/net/wireless/hostap/hostap_info.c
@@ -160,7 +160,7 @@
 {
 	struct hfa384x_join_request req;
 	struct net_device *dev = local->dev;
-	struct hfa384x_scan_result *selected, *entry;
+	struct hfa384x_hostscan_result *selected, *entry;
 	int i;
 	unsigned long flags;
 
@@ -244,9 +244,10 @@
 				    int left)
 {
 	u16 *pos;
-	int new_count;
+	int new_count, i;
 	unsigned long flags;
-	struct hfa384x_scan_result *results, *prev;
+	struct hfa384x_scan_result *res;
+	struct hfa384x_hostscan_result *results, *prev;
 
 	if (left < 4) {
 		printk(KERN_DEBUG "%s: invalid scanresult info frame "
@@ -260,11 +261,18 @@
 	left -= 4;
 
 	new_count = left / sizeof(struct hfa384x_scan_result);
-	results = kmalloc(new_count * sizeof(struct hfa384x_scan_result),
+	results = kmalloc(new_count * sizeof(struct hfa384x_hostscan_result),
 			  GFP_ATOMIC);
 	if (results == NULL)
 		return;
-	memcpy(results, pos, new_count * sizeof(struct hfa384x_scan_result));
+
+	/* Convert to hostscan result format. */
+	res = (struct hfa384x_scan_result *) pos;
+	for (i = 0; i < new_count; i++) {
+		memcpy(&results[i], &res[i],
+		       sizeof(struct hfa384x_scan_result));
+		results[i].atim = 0;
+	}
 
 	spin_lock_irqsave(&local->lock, flags);
 	local->last_scan_type = PRISM2_SCAN;
@@ -335,9 +343,9 @@
 
 	spin_lock_irqsave(&local->lock, flags);
 	local->last_scan_type = PRISM2_HOSTSCAN;
-	prev = local->last_hostscan_results;
-	local->last_hostscan_results = results;
-	local->last_hostscan_results_count = new_count;
+	prev = local->last_scan_results;
+	local->last_scan_results = results;
+	local->last_scan_results_count = new_count;
 	spin_unlock_irqrestore(&local->lock, flags);
 	kfree(prev);
 
diff --git a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c
index 4c236e7..9783619 100644
--- a/drivers/net/wireless/hostap/hostap_ioctl.c
+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
@@ -663,7 +663,7 @@
 	struct hfa384x_join_request req;
 	unsigned long flags;
 	int i;
-	struct hfa384x_scan_result *entry;
+	struct hfa384x_hostscan_result *entry;
 
 	iface = netdev_priv(dev);
 	local = iface->local;
@@ -1795,10 +1795,8 @@
 
 #ifndef PRISM2_NO_STATION_MODES
 static char * __prism2_translate_scan(local_info_t *local,
-				      struct hfa384x_scan_result *scan,
-				      struct hfa384x_hostscan_result *hscan,
-				      int hostscan,
-				      struct hostap_bss_info *bss, u8 *bssid,
+				      struct hfa384x_hostscan_result *scan,
+				      struct hostap_bss_info *bss,
 				      char *current_ev, char *end_buf)
 {
 	int i, chan;
@@ -1806,17 +1804,18 @@
 	char *current_val;
 	u16 capabilities;
 	u8 *pos;
-	u8 *ssid;
+	u8 *ssid, *bssid;
 	size_t ssid_len;
 	char *buf;
 
 	if (bss) {
 		ssid = bss->ssid;
 		ssid_len = bss->ssid_len;
+		bssid = bss->bssid;
 	} else {
-		ssid = hostscan ? hscan->ssid : scan->ssid;
-		ssid_len = le16_to_cpu(hostscan ? hscan->ssid_len :
-				       scan->ssid_len);
+		ssid = scan->ssid;
+		ssid_len = le16_to_cpu(scan->ssid_len);
+		bssid = scan->bssid;
 	}
 	if (ssid_len > 32)
 		ssid_len = 32;
@@ -1850,8 +1849,7 @@
 	if (bss) {
 		capabilities = bss->capab_info;
 	} else {
-		capabilities = le16_to_cpu(hostscan ? hscan->capability :
-					   scan->capability);
+		capabilities = le16_to_cpu(scan->capability);
 	}
 	if (capabilities & (WLAN_CAPABILITY_ESS |
 			    WLAN_CAPABILITY_IBSS)) {
@@ -1866,8 +1864,8 @@
 
 	memset(&iwe, 0, sizeof(iwe));
 	iwe.cmd = SIOCGIWFREQ;
-	if (hscan || scan) {
-		chan = hostscan ? hscan->chid : scan->chid;
+	if (scan) {
+		chan = scan->chid;
 	} else if (bss) {
 		chan = bss->chan;
 	} else {
@@ -1882,12 +1880,12 @@
 						  IW_EV_FREQ_LEN);
 	}
 
-	if (scan || hscan) {
+	if (scan) {
 		memset(&iwe, 0, sizeof(iwe));
 		iwe.cmd = IWEVQUAL;
-		if (hostscan) {
-			iwe.u.qual.level = le16_to_cpu(hscan->sl);
-			iwe.u.qual.noise = le16_to_cpu(hscan->anl);
+		if (local->last_scan_type == PRISM2_HOSTSCAN) {
+			iwe.u.qual.level = le16_to_cpu(scan->sl);
+			iwe.u.qual.noise = le16_to_cpu(scan->anl);
 		} else {
 			iwe.u.qual.level =
 				HFA384X_LEVEL_TO_dBm(le16_to_cpu(scan->sl));
@@ -1910,11 +1908,11 @@
 	current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, "");
 
 	/* TODO: add SuppRates into BSS table */
-	if (scan || hscan) {
+	if (scan) {
 		memset(&iwe, 0, sizeof(iwe));
 		iwe.cmd = SIOCGIWRATE;
 		current_val = current_ev + IW_EV_LCP_LEN;
-		pos = hostscan ? hscan->sup_rates : scan->sup_rates;
+		pos = scan->sup_rates;
 		for (i = 0; i < sizeof(scan->sup_rates); i++) {
 			if (pos[i] == 0)
 				break;
@@ -1931,29 +1929,26 @@
 
 	/* TODO: add BeaconInt,resp_rate,atim into BSS table */
 	buf = kmalloc(MAX_WPA_IE_LEN * 2 + 30, GFP_KERNEL);
-	if (buf && (scan || hscan)) {
+	if (buf && scan) {
 		memset(&iwe, 0, sizeof(iwe));
 		iwe.cmd = IWEVCUSTOM;
-		sprintf(buf, "bcn_int=%d",
-			le16_to_cpu(hostscan ? hscan->beacon_interval :
-				    scan->beacon_interval));
+		sprintf(buf, "bcn_int=%d", le16_to_cpu(scan->beacon_interval));
 		iwe.u.data.length = strlen(buf);
 		current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
 						  buf);
 
 		memset(&iwe, 0, sizeof(iwe));
 		iwe.cmd = IWEVCUSTOM;
-		sprintf(buf, "resp_rate=%d", le16_to_cpu(hostscan ?
-							 hscan->rate :
-							 scan->rate));
+		sprintf(buf, "resp_rate=%d", le16_to_cpu(scan->rate));
 		iwe.u.data.length = strlen(buf);
 		current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
 						  buf);
 
-		if (hostscan && (capabilities & WLAN_CAPABILITY_IBSS)) {
+		if (local->last_scan_type == PRISM2_HOSTSCAN &&
+		    (capabilities & WLAN_CAPABILITY_IBSS)) {
 			memset(&iwe, 0, sizeof(iwe));
 			iwe.cmd = IWEVCUSTOM;
-			sprintf(buf, "atim=%d", le16_to_cpu(hscan->atim));
+			sprintf(buf, "atim=%d", le16_to_cpu(scan->atim));
 			iwe.u.data.length = strlen(buf);
 			current_ev = iwe_stream_add_point(current_ev, end_buf,
 							  &iwe, buf);
@@ -1986,12 +1981,10 @@
 static inline int prism2_translate_scan(local_info_t *local,
 					char *buffer, int buflen)
 {
-	struct hfa384x_scan_result *scan;
-	struct hfa384x_hostscan_result *hscan;
-	int entries, entry, hostscan;
+	struct hfa384x_hostscan_result *scan;
+	int entry, hostscan;
 	char *current_ev = buffer;
 	char *end_buf = buffer + buflen;
-	u8 *bssid;
 	struct list_head *ptr;
 
 	spin_lock_bh(&local->lock);
@@ -2003,14 +1996,9 @@
 	}
 
 	hostscan = local->last_scan_type == PRISM2_HOSTSCAN;
-	entries = hostscan ? local->last_hostscan_results_count :
-		local->last_scan_results_count;
-	for (entry = 0; entry < entries; entry++) {
+	for (entry = 0; entry < local->last_scan_results_count; entry++) {
 		int found = 0;
 		scan = &local->last_scan_results[entry];
-		hscan = &local->last_hostscan_results[entry];
-
-		bssid = hostscan ? hscan->bssid : scan->bssid;
 
 		/* Report every SSID if the AP is using multiple SSIDs. If no
 		 * BSS record is found (e.g., when WPA mode is disabled),
@@ -2018,18 +2006,16 @@
 		list_for_each(ptr, &local->bss_list) {
 			struct hostap_bss_info *bss;
 			bss = list_entry(ptr, struct hostap_bss_info, list);
-			if (memcmp(bss->bssid, bssid, ETH_ALEN) == 0) {
+			if (memcmp(bss->bssid, scan->bssid, ETH_ALEN) == 0) {
 				bss->included = 1;
 				current_ev = __prism2_translate_scan(
-					local, scan, hscan, hostscan, bss,
-					bssid, current_ev, end_buf);
+					local, scan, bss, current_ev, end_buf);
 				found++;
 			}
 		}
 		if (!found) {
 			current_ev = __prism2_translate_scan(
-				local, scan, hscan, hostscan, NULL, bssid,
-				current_ev, end_buf);
+				local, scan, NULL, current_ev, end_buf);
 		}
 		/* Check if there is space for one more entry */
 		if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {
@@ -2047,9 +2033,8 @@
 		bss = list_entry(ptr, struct hostap_bss_info, list);
 		if (bss->included)
 			continue;
-		current_ev = __prism2_translate_scan(local, NULL, NULL, 0, bss,
-						     bss->bssid, current_ev,
-						     end_buf);
+		current_ev = __prism2_translate_scan(local, NULL, bss,
+						     current_ev, end_buf);
 		/* Check if there is space for one more entry */
 		if ((end_buf - current_ev) <= IW_EV_ADDR_LEN) {
 			/* Ask user space to try again with a bigger buffer */
diff --git a/drivers/net/wireless/hostap/hostap_proc.c b/drivers/net/wireless/hostap/hostap_proc.c
index 81b321b..a0a4cbd 100644
--- a/drivers/net/wireless/hostap/hostap_proc.c
+++ b/drivers/net/wireless/hostap/hostap_proc.c
@@ -302,20 +302,15 @@
 {
 	char *p = page;
 	local_info_t *local = (local_info_t *) data;
-	int entries, entry, i, len, total = 0, hostscan;
-	struct hfa384x_scan_result *scanres;
-	struct hfa384x_hostscan_result *hscanres;
+	int entry, i, len, total = 0;
+	struct hfa384x_hostscan_result *scanres;
 	u8 *pos;
 
 	p += sprintf(p, "CHID ANL SL BcnInt Capab Rate BSSID ATIM SupRates "
 		     "SSID\n");
 
 	spin_lock_bh(&local->lock);
-	hostscan = local->last_scan_type == PRISM2_HOSTSCAN;
-	entries = hostscan ? local->last_hostscan_results_count :
-		local->last_scan_results_count;
-	for (entry = 0; entry < entries; entry++) {
-		hscanres = &local->last_hostscan_results[entry];
+	for (entry = 0; entry < local->last_scan_results_count; entry++) {
 		scanres = &local->last_scan_results[entry];
 
 		if (total + (p - page) <= off) {
@@ -327,39 +322,26 @@
 		if ((p - page) > (PAGE_SIZE - 200))
 			break;
 
-		if (hostscan) {
-			p += sprintf(p, "%d %d %d %d 0x%02x %d " MACSTR " %d ",
-				     le16_to_cpu(hscanres->chid),
-				     (s16) le16_to_cpu(hscanres->anl),
-				     (s16) le16_to_cpu(hscanres->sl),
-				     le16_to_cpu(hscanres->beacon_interval),
-				     le16_to_cpu(hscanres->capability),
-				     le16_to_cpu(hscanres->rate),
-				     MAC2STR(hscanres->bssid),
-				     le16_to_cpu(hscanres->atim));
-		} else {
-			p += sprintf(p, "%d %d %d %d 0x%02x %d " MACSTR
-				     " N/A ",
-				     le16_to_cpu(scanres->chid),
-				     (s16) le16_to_cpu(scanres->anl),
-				     (s16) le16_to_cpu(scanres->sl),
-				     le16_to_cpu(scanres->beacon_interval),
-				     le16_to_cpu(scanres->capability),
-				     le16_to_cpu(scanres->rate),
-				     MAC2STR(scanres->bssid));
-		}
+		p += sprintf(p, "%d %d %d %d 0x%02x %d " MACSTR " %d ",
+			     le16_to_cpu(scanres->chid),
+			     (s16) le16_to_cpu(scanres->anl),
+			     (s16) le16_to_cpu(scanres->sl),
+			     le16_to_cpu(scanres->beacon_interval),
+			     le16_to_cpu(scanres->capability),
+			     le16_to_cpu(scanres->rate),
+			     MAC2STR(scanres->bssid),
+			     le16_to_cpu(scanres->atim));
 
-		pos = hostscan ? hscanres->sup_rates : scanres->sup_rates;
-		for (i = 0; i < sizeof(hscanres->sup_rates); i++) {
+		pos = scanres->sup_rates;
+		for (i = 0; i < sizeof(scanres->sup_rates); i++) {
 			if (pos[i] == 0)
 				break;
 			p += sprintf(p, "<%02x>", pos[i]);
 		}
 		p += sprintf(p, " ");
 
-		pos = hostscan ? hscanres->ssid : scanres->ssid;
-		len = le16_to_cpu(hostscan ? hscanres->ssid_len :
-				  scanres->ssid_len);
+		pos = scanres->ssid;
+		len = le16_to_cpu(scanres->ssid_len);
 		if (len > 32)
 			len = 32;
 		for (i = 0; i < len; i++) {
diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h
index 91beee5..03de0ea 100644
--- a/drivers/net/wireless/hostap/hostap_wlan.h
+++ b/drivers/net/wireless/hostap/hostap_wlan.h
@@ -824,10 +824,8 @@
 
 	int host_roaming;
 	unsigned long last_join_time; /* time of last JoinRequest */
-	struct hfa384x_scan_result *last_scan_results;
+	struct hfa384x_hostscan_result *last_scan_results;
 	int last_scan_results_count;
-	struct hfa384x_hostscan_result *last_hostscan_results;
-	int last_hostscan_results_count;
 	enum { PRISM2_SCAN, PRISM2_HOSTSCAN } last_scan_type;
 	struct work_struct info_queue;
 	long pending_info; /* bit field of pending info_queue items */