aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/wext-compat.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/wireless/wext-compat.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/wireless/wext-compat.c')
-rw-r--r--net/wireless/wext-compat.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
index 3a5f999703f1..226cf8609079 100644
--- a/net/wireless/wext-compat.c
+++ b/net/wireless/wext-compat.c
@@ -1156,3 +1156,62 @@ int cfg80211_wext_giwrate(struct net_device *dev,
1156 return 0; 1156 return 0;
1157} 1157}
1158EXPORT_SYMBOL_GPL(cfg80211_wext_giwrate); 1158EXPORT_SYMBOL_GPL(cfg80211_wext_giwrate);
1159
1160/* Get wireless statistics. Called by /proc/net/wireless and by SIOCGIWSTATS */
1161struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)
1162{
1163 struct wireless_dev *wdev = dev->ieee80211_ptr;
1164 struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
1165 /* we are under RTNL - globally locked - so can use static structs */
1166 static struct iw_statistics wstats;
1167 static struct station_info sinfo;
1168 u8 *addr;
1169
1170 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION)
1171 return NULL;
1172
1173 if (!rdev->ops->get_station)
1174 return NULL;
1175
1176 addr = wdev->wext.connect.bssid;
1177 if (!addr)
1178 return NULL;
1179
1180 if (rdev->ops->get_station(&rdev->wiphy, dev, addr, &sinfo))
1181 return NULL;
1182
1183 memset(&wstats, 0, sizeof(wstats));
1184
1185 switch (rdev->wiphy.signal_type) {
1186 case CFG80211_SIGNAL_TYPE_MBM:
1187 if (sinfo.filled & STATION_INFO_SIGNAL) {
1188 int sig = sinfo.signal;
1189 wstats.qual.updated |= IW_QUAL_LEVEL_UPDATED;
1190 wstats.qual.updated |= IW_QUAL_QUAL_UPDATED;
1191 wstats.qual.updated |= IW_QUAL_DBM;
1192 wstats.qual.level = sig;
1193 if (sig < -110)
1194 sig = -110;
1195 else if (sig > -40)
1196 sig = -40;
1197 wstats.qual.qual = sig + 110;
1198 break;
1199 }
1200 case CFG80211_SIGNAL_TYPE_UNSPEC:
1201 if (sinfo.filled & STATION_INFO_SIGNAL) {
1202 wstats.qual.updated |= IW_QUAL_LEVEL_UPDATED;
1203 wstats.qual.updated |= IW_QUAL_QUAL_UPDATED;
1204 wstats.qual.level = sinfo.signal;
1205 wstats.qual.qual = sinfo.signal;
1206 break;
1207 }
1208 default:
1209 wstats.qual.updated |= IW_QUAL_LEVEL_INVALID;
1210 wstats.qual.updated |= IW_QUAL_QUAL_INVALID;
1211 }
1212
1213 wstats.qual.updated |= IW_QUAL_NOISE_INVALID;
1214
1215 return &wstats;
1216}
1217EXPORT_SYMBOL_GPL(cfg80211_wireless_stats);