aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/wext.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-07-01 15:27:00 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-07-10 15:01:52 -0400
commit8990646d2fafeacfacba4a4b1073a4216662089a (patch)
tree357fcf85f7e982b9f06aaac9e7c3468c6af0333f /net/mac80211/wext.c
parent9930380f0bd8405fa6a51d644f3de88c30666519 (diff)
cfg80211: implement get_wireless_stats
By dropping the noise reporting, we can implement wireless stats in cfg80211. We also make the handler return NULL if we have no information, which is possible thanks to the recent wext change. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/wext.c')
-rw-r--r--net/mac80211/wext.c69
1 files changed, 1 insertions, 68 deletions
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c
index 244d830f5cfb..5acb8140ee58 100644
--- a/net/mac80211/wext.c
+++ b/net/mac80211/wext.c
@@ -165,73 +165,6 @@ static int ieee80211_ioctl_giwap(struct net_device *dev,
165} 165}
166 166
167 167
168/* Get wireless statistics. Called by /proc/net/wireless and by SIOCGIWSTATS */
169static struct iw_statistics *ieee80211_get_wireless_stats(struct net_device *dev)
170{
171 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
172 struct iw_statistics *wstats = &local->wstats;
173 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
174 struct sta_info *sta = NULL;
175
176 rcu_read_lock();
177
178 if (sdata->vif.type == NL80211_IFTYPE_STATION)
179 sta = sta_info_get(local, sdata->u.mgd.bssid);
180
181 if (!sta) {
182 wstats->discard.fragment = 0;
183 wstats->discard.misc = 0;
184 wstats->qual.qual = 0;
185 wstats->qual.level = 0;
186 wstats->qual.noise = 0;
187 wstats->qual.updated = IW_QUAL_ALL_INVALID;
188 } else {
189 wstats->qual.updated = 0;
190 /*
191 * mirror what cfg80211 does for iwrange/scan results,
192 * otherwise userspace gets confused.
193 */
194 if (local->hw.flags & (IEEE80211_HW_SIGNAL_UNSPEC |
195 IEEE80211_HW_SIGNAL_DBM)) {
196 wstats->qual.updated |= IW_QUAL_LEVEL_UPDATED;
197 wstats->qual.updated |= IW_QUAL_QUAL_UPDATED;
198 } else {
199 wstats->qual.updated |= IW_QUAL_LEVEL_INVALID;
200 wstats->qual.updated |= IW_QUAL_QUAL_INVALID;
201 }
202
203 if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC) {
204 wstats->qual.level = sta->last_signal;
205 wstats->qual.qual = sta->last_signal;
206 } else if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) {
207 int sig = sta->last_signal;
208
209 wstats->qual.updated |= IW_QUAL_DBM;
210 wstats->qual.level = sig;
211 if (sig < -110)
212 sig = -110;
213 else if (sig > -40)
214 sig = -40;
215 wstats->qual.qual = sig + 110;
216 }
217
218 if (local->hw.flags & IEEE80211_HW_NOISE_DBM) {
219 /*
220 * This assumes that if driver reports noise, it also
221 * reports signal in dBm.
222 */
223 wstats->qual.noise = sta->last_noise;
224 wstats->qual.updated |= IW_QUAL_NOISE_UPDATED;
225 } else {
226 wstats->qual.updated |= IW_QUAL_NOISE_INVALID;
227 }
228 }
229
230 rcu_read_unlock();
231
232 return wstats;
233}
234
235/* Structures to export the Wireless Handlers */ 168/* Structures to export the Wireless Handlers */
236 169
237static const iw_handler ieee80211_handler[] = 170static const iw_handler ieee80211_handler[] =
@@ -298,5 +231,5 @@ const struct iw_handler_def ieee80211_iw_handler_def =
298{ 231{
299 .num_standard = ARRAY_SIZE(ieee80211_handler), 232 .num_standard = ARRAY_SIZE(ieee80211_handler),
300 .standard = (iw_handler *) ieee80211_handler, 233 .standard = (iw_handler *) ieee80211_handler,
301 .get_wireless_stats = ieee80211_get_wireless_stats, 234 .get_wireless_stats = cfg80211_wireless_stats,
302}; 235};