diff options
| -rw-r--r-- | net/ieee80211/ieee80211_wx.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/net/ieee80211/ieee80211_wx.c b/net/ieee80211/ieee80211_wx.c index b885fd189403..0ea55cb5f172 100644 --- a/net/ieee80211/ieee80211_wx.c +++ b/net/ieee80211/ieee80211_wx.c | |||
| @@ -50,7 +50,8 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, | |||
| 50 | char *p; | 50 | char *p; |
| 51 | struct iw_event iwe; | 51 | struct iw_event iwe; |
| 52 | int i, j; | 52 | int i, j; |
| 53 | u8 max_rate, rate; | 53 | char *current_val; /* For rates */ |
| 54 | u8 rate; | ||
| 54 | 55 | ||
| 55 | /* First entry *MUST* be the AP MAC address */ | 56 | /* First entry *MUST* be the AP MAC address */ |
| 56 | iwe.cmd = SIOCGIWAP; | 57 | iwe.cmd = SIOCGIWAP; |
| @@ -107,9 +108,13 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, | |||
| 107 | start = iwe_stream_add_point(start, stop, &iwe, network->ssid); | 108 | start = iwe_stream_add_point(start, stop, &iwe, network->ssid); |
| 108 | 109 | ||
| 109 | /* Add basic and extended rates */ | 110 | /* Add basic and extended rates */ |
| 110 | max_rate = 0; | 111 | /* Rate : stuffing multiple values in a single event require a bit |
| 111 | p = custom; | 112 | * more of magic - Jean II */ |
| 112 | p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): "); | 113 | current_val = start + IW_EV_LCP_LEN; |
| 114 | iwe.cmd = SIOCGIWRATE; | ||
| 115 | /* Those two flags are ignored... */ | ||
| 116 | iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; | ||
| 117 | |||
| 113 | for (i = 0, j = 0; i < network->rates_len;) { | 118 | for (i = 0, j = 0; i < network->rates_len;) { |
| 114 | if (j < network->rates_ex_len && | 119 | if (j < network->rates_ex_len && |
| 115 | ((network->rates_ex[j] & 0x7F) < | 120 | ((network->rates_ex[j] & 0x7F) < |
| @@ -117,28 +122,21 @@ static char *ieee80211_translate_scan(struct ieee80211_device *ieee, | |||
| 117 | rate = network->rates_ex[j++] & 0x7F; | 122 | rate = network->rates_ex[j++] & 0x7F; |
| 118 | else | 123 | else |
| 119 | rate = network->rates[i++] & 0x7F; | 124 | rate = network->rates[i++] & 0x7F; |
| 120 | if (rate > max_rate) | 125 | /* Bit rate given in 500 kb/s units (+ 0x80) */ |
| 121 | max_rate = rate; | 126 | iwe.u.bitrate.value = ((rate & 0x7f) * 500000); |
| 122 | p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), | 127 | /* Add new value to event */ |
| 123 | "%d%s ", rate >> 1, (rate & 1) ? ".5" : ""); | 128 | current_val = iwe_stream_add_value(start, current_val, stop, &iwe, IW_EV_PARAM_LEN); |
| 124 | } | 129 | } |
| 125 | for (; j < network->rates_ex_len; j++) { | 130 | for (; j < network->rates_ex_len; j++) { |
| 126 | rate = network->rates_ex[j] & 0x7F; | 131 | rate = network->rates_ex[j] & 0x7F; |
| 127 | p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), | 132 | /* Bit rate given in 500 kb/s units (+ 0x80) */ |
| 128 | "%d%s ", rate >> 1, (rate & 1) ? ".5" : ""); | 133 | iwe.u.bitrate.value = ((rate & 0x7f) * 500000); |
| 129 | if (rate > max_rate) | 134 | /* Add new value to event */ |
| 130 | max_rate = rate; | 135 | current_val = iwe_stream_add_value(start, current_val, stop, &iwe, IW_EV_PARAM_LEN); |
| 131 | } | 136 | } |
| 132 | 137 | /* Check if we added any rate */ | |
| 133 | iwe.cmd = SIOCGIWRATE; | 138 | if((current_val - start) > IW_EV_LCP_LEN) |
| 134 | iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; | 139 | start = current_val; |
| 135 | iwe.u.bitrate.value = max_rate * 500000; | ||
| 136 | start = iwe_stream_add_event(start, stop, &iwe, IW_EV_PARAM_LEN); | ||
| 137 | |||
| 138 | iwe.cmd = IWEVCUSTOM; | ||
| 139 | iwe.u.data.length = p - custom; | ||
| 140 | if (iwe.u.data.length) | ||
| 141 | start = iwe_stream_add_point(start, stop, &iwe, custom); | ||
| 142 | 140 | ||
| 143 | /* Add quality statistics */ | 141 | /* Add quality statistics */ |
| 144 | iwe.cmd = IWEVQUAL; | 142 | iwe.cmd = IWEVQUAL; |
