[PATCH] hostap update
authorJouni Malinen <jkmaline@cc.hut.fi>
Sat, 30 Jul 2005 19:50:02 +0000 (12:50 -0700)
committerJeff Garzik <jgarzik@pobox.com>
Sat, 30 Jul 2005 22:17:23 +0000 (18:17 -0400)
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>
drivers/net/wireless/hostap/hostap_info.c
drivers/net/wireless/hostap/hostap_ioctl.c
drivers/net/wireless/hostap/hostap_proc.c
drivers/net/wireless/hostap/hostap_wlan.h

index cf9e0898b57fd15c6a1a354dffa32c138e7c5f75..6ca94918e0f834a2cbd7a3a3c6da2e31754b7128 100644 (file)
@@ -160,7 +160,7 @@ static void prism2_host_roaming(local_info_t *local)
 {
        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 @@ static void prism2_info_scanresults(local_info_t *local, unsigned char *buf,
                                    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 @@ static void prism2_info_scanresults(local_info_t *local, unsigned char *buf,
        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 @@ static void prism2_info_hostscanresults(local_info_t *local,
 
        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);
 
index 4c236e7903f5f538565a7d407129fd870ed1fabc..97836198691a7633c65c9863faa15c514401c829 100644 (file)
@@ -663,7 +663,7 @@ static int hostap_join_ap(struct net_device *dev)
        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 @@ static int prism2_ioctl_siwscan(struct net_device *dev,
 
 #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 @@ static char * __prism2_translate_scan(local_info_t *local,
        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 @@ static char * __prism2_translate_scan(local_info_t *local,
        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 @@ static char * __prism2_translate_scan(local_info_t *local,
 
        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 @@ static char * __prism2_translate_scan(local_info_t *local,
                                                  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 @@ static char * __prism2_translate_scan(local_info_t *local,
        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 @@ static char * __prism2_translate_scan(local_info_t *local,
 
        /* 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 char * __prism2_translate_scan(local_info_t *local,
 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 @@ static inline int prism2_translate_scan(local_info_t *local,
        }
 
        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 @@ static inline int prism2_translate_scan(local_info_t *local,
                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 @@ static inline int prism2_translate_scan(local_info_t *local,
                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 */
index 81b321ba189a1bd561ada1bbed543263f3c18de5..a0a4cbd4937a182676939c336a8f57b60ade7c93 100644 (file)
@@ -302,20 +302,15 @@ static int prism2_scan_results_proc_read(char *page, char **start, off_t off,
 {
        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 @@ static int prism2_scan_results_proc_read(char *page, char **start, off_t off,
                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));
-               }
-
-               pos = hostscan ? hscanres->sup_rates : scanres->sup_rates;
-               for (i = 0; i < sizeof(hscanres->sup_rates); i++) {
+               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 = 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++) {
index 91beee50c9c914fb7b8a692bf5ee0e9cbf57415e..03de0ea80bbd75861ee073eb7ef31d05040a1543 100644 (file)
@@ -824,10 +824,8 @@ struct local_info {
 
        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 */