This patch enhance iwlist scan to dispaly supported rate with readable format. It also add a macro to convert channel to freq value. this macro is needed in ieee80211_rx_bss_info. In 3945 we issues a host scan command to perform scanning which will cause in setting the freq to the wrong value.
diff --git a/net/d80211/ieee80211_i.h b/net/d80211/ieee80211_i.h
index bdaaf5e..29c40c5 100644
--- a/net/d80211/ieee80211_i.h
+++ b/net/d80211/ieee80211_i.h
@@ -442,6 +445,7 @@ #define IEEE80211_IRQSAFE_QUEUE_LIMIT 12
 #define IEEE80211_SCAN_MATCH_SSID BIT(0)
 #define IEEE80211_SCAN_WPA_ONLY BIT(1)
 #define IEEE80211_SCAN_EXTRA_INFO BIT(2)
+#define IEEE80211_SCAN_SUPP_RATE_INFO BIT(3)
        int scan_flags;
 
 #ifdef CONFIG_HOSTAPD_WPA_TESTING
diff --git a/net/d80211/ieee80211_sta.c b/net/d80211/ieee80211_sta.c
index 8caf352..1153932 100644
--- a/net/d80211/ieee80211_sta.c
+++ b/net/d80211/ieee80211_sta.c
@@ -1329,6 +1329,11 @@ void ieee80211_rx_bss_list_deinit(struct
        }
 }
 
+/* macro to convert channel to freq value */
+#define ieee80211chan2mhz(x) \
+        (((x) <= 14) ? \
+        (((x) == 14) ? 2484 : ((x) * 5) + 2407) : \
+        ((x) + 1000) * 5)
 
 static void ieee80211_rx_bss_info(struct net_device *dev,
                                  struct ieee80211_mgmt *mgmt,
@@ -1547,18 +1552,7 @@ #endif
        bss->hw_mode = local->conf.phymode;
        bss->channel = channel;
        bss->freq = local->conf.freq;
-       if (channel != local->conf.channel &&
-           (local->conf.phymode == MODE_IEEE80211G ||
-            local->conf.phymode == MODE_IEEE80211B) &&
-           channel >= 1 && channel <= 14) {
-               static const int freq_list[] = {
-                       2412, 2417, 2422, 2427, 2432, 2437, 2442,
-                       2447, 2452, 2457, 2462, 2467, 2472, 2484
-               };
-               /* IEEE 802.11g/b mode can receive packets from neighboring
-                * channels, so map the channel into frequency. */
-               bss->freq = freq_list[channel - 1];
-       }
+       bss->freq = ieee80211chan2mhz(channel);
        bss->timestamp = timestamp;
        bss->last_update = jiffies;
        bss->rssi = rx_status->ssi;
@@ -2724,16 +2719,33 @@ ieee80211_sta_scan_result(struct net_dev
                current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
                                                  buf);
 
-               p = buf;
-               p += sprintf(p, "supp_rates=");
-               for (i = 0; i < bss->supp_rates_len; i++)
-                       p+= sprintf(p, "%02x", bss->supp_rates[i]);
-               memset(&iwe, 0, sizeof(iwe));
-               iwe.cmd = IWEVCUSTOM;
-               iwe.u.data.length = strlen(buf);
-               current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
-                                                 buf);
-
+               /* dispaly all support rates in readable format */
+               if ((local->scan_flags & IEEE80211_SCAN_SUPP_RATE_INFO)) {
+                       p = current_ev + IW_EV_LCP_LEN;
+                       iwe.cmd = SIOCGIWRATE;
+                       /* Those two flags are ignored... */
+                       iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
+
+                       for (i = 0; i < bss->supp_rates_len; i++) {
+                               iwe.u.bitrate.value = ((bss->supp_rates[i] & 
+                                                             0x7f) * 500000);
+                               p = iwe_stream_add_value(current_ev, p, 
+                                             end_buf, &iwe, IW_EV_PARAM_LEN);
+                       }
+                       /* Check if we added any rate */
+                       if((p - current_ev) > IW_EV_LCP_LEN)
+                               current_ev = p;
+               } else {
+                       p = buf;
+                       p += sprintf(p, "supp_rates=");
+                       for (i = 0; i < bss->supp_rates_len; i++)
+                               p+= sprintf(p, "%02x", bss->supp_rates[i]);
+                       memset(&iwe, 0, sizeof(iwe));
+                       iwe.cmd = IWEVCUSTOM;
+                       iwe.u.data.length = strlen(buf);
+                       current_ev = iwe_stream_add_point(current_ev, end_buf, 
+                                                 &iwe, buf);
+               }
                kfree(buf);
                break;
        } while (0);

Reply via email to