Skip to contentSkip to conversation

d80211/bcm43xx: Modify ieee80211_ioctl.c for wireless statistics.

PATCH In review Larry Finger 2 participants 3 messages Aug 9, 2006

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 8/8 d80211/bcm43xx: Modify ieee80211_ioctl.c for wireless statistics.

Part 8 of 8 to add wireless statistics to the bcm43xx-d80211 system. This patch adds the appropriate range parameters and routine ieee80211_get_wireless_stats to ieee80211_ioctl.c.

The patch is for the August 8 version of Linville's wireless-dev tree.

net/d80211/ieee80211_ioctl.c +44 -0
index dd52555..3a1b97f 100644
@@ -1525,6 +1525,16 @@ static int ieee80211_ioctl_giwrange(stru
 	range->min_frag = 256;
 	range->max_frag = 2346;
 
+	range->max_qual.qual = 100;
+	range->max_qual.level = 152;  /* set floor at -104 dBm (152 - 256) */
+	range->max_qual.noise = 152;
+	range->max_qual.updated = IW_QUAL_ALL_UPDATED;
+
+	range->avg_qual.qual = 50;
+	range->avg_qual.level = 0;
+	range->avg_qual.noise = 0;
+	range->avg_qual.updated = IW_QUAL_ALL_UPDATED;
+
 	return 0;
 }
 
@@ -2963,6 +2973,39 @@ static int ieee80211_ioctl_giwauth(struc
 	return ret;
 }
 
+/* Get wireless statistics.  Called by /proc/net/wireless and by SIOCGIWSTATS */
+static struct iw_statistics *ieee80211_get_wireless_stats(struct net_device *net_dev)
+{
+	struct ieee80211_local *local = net_dev->ieee80211_ptr;
+	struct iw_statistics * wstats = &local->wstats;
+	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(net_dev);
+	struct sta_info *sta;
+	static int tmp_level = 0;
+	static int tmp_qual = 0;
+
+	sta = sta_info_get(local, sdata->u.wds.remote_addr);
+	if (!sta) {
+		wstats->discard.fragment = 0;
+		wstats->discard.misc = 0;
+		wstats->qual.qual = 0;
+		wstats->qual.level = 0;
+		wstats->qual.noise = 0;
+		wstats->qual.updated |= IW_QUAL_ALL_UPDATED;
+	} else {
+		if (!tmp_level) {       /* get initial values */
+			tmp_level = sta->last_signal;
+			tmp_qual = sta->last_rssi;
+		} else {                        /* smooth results */
+			tmp_level = (15 * tmp_level + sta->last_signal)/16;
+			tmp_qual = (15 * tmp_qual + sta->last_rssi)/16;
+		}
+		wstats->qual.level = tmp_level;
+		wstats->qual.qual = 100*tmp_qual/sta->max_rssi;
+		wstats->qual.noise = sta->last_noise;
+		wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
+	}
+	return wstats;
+}
 
 static int ieee80211_ioctl_siwencodeext(struct net_device *dev,
 					struct iw_request_info *info,
@@ -3128,4 +3171,5 @@ const struct iw_handler_def ieee80211_iw
 	.standard	= (iw_handler *) ieee80211_handler,
 	.private	= (iw_handler *) ieee80211_private_handler,
 	.private_args	= (struct iw_priv_args *) ieee80211_ioctl_priv,
+	.get_wireless_stats = ieee80211_get_wireless_stats,
 };
#1 lore raw
Quoted 42 lines · Larry Finger

Part 8 of 8 to add wireless statistics to the bcm43xx-d80211 system. This patch adds the appropriate range parameters and routine ieee80211_get_wireless_stats to ieee80211_ioctl.c.

The patch is for the August 8 version of Linville's wireless-dev tree.

net/d80211/ieee80211_ioctl.c +18 -0
index dd52555..3a1b97f 100644
@@ -1525,6 +1525,16 @@ static int ieee80211_ioctl_giwrange(stru
  	range->min_frag = 256;
  	range->max_frag = 2346;
 
+	range->max_qual.qual = 100;
+	range->max_qual.level = 152;  /* set floor at -104 dBm (152 - 256) */
+	range->max_qual.noise = 152;
+	range->max_qual.updated = IW_QUAL_ALL_UPDATED;
+
+	range->avg_qual.qual = 50;
+	range->avg_qual.level = 0;
+	range->avg_qual.noise = 0;
+	range->avg_qual.updated = IW_QUAL_ALL_UPDATED;
+
  	return 0;
  }
 
@@ -2963,6 +2973,39 @@ static int ieee80211_ioctl_giwauth(struc
  	return ret;
  }
 
+/* Get wireless statistics.  Called by /proc/net/wireless and by SIOCGIWSTATS */
+static struct iw_statistics *ieee80211_get_wireless_stats(struct net_device *net_dev)
+{
+	struct ieee80211_local *local = net_dev->ieee80211_ptr;
+	struct iw_statistics * wstats = &local->wstats;
+	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(net_dev);
+	struct sta_info *sta;
+	static int tmp_level = 0;

net/d80211/ieee80211_ioctl.c static int ieee80211_ioctl_giwauth(struc · line 2993

Quoted 10 lines
net/d80211/ieee80211_ioctl.c +10 -0
+	static int tmp_qual = 0;
+
+	sta = sta_info_get(local, sdata->u.wds.remote_addr);
+	if (!sta) {
+		wstats->discard.fragment = 0;
+		wstats->discard.misc = 0;
+		wstats->qual.qual = 0;
+		wstats->qual.level = 0;
+		wstats->qual.noise = 0;
+		wstats->qual.updated |= IW_QUAL_ALL_UPDATED;

What does the 'if (!sta)' check do? What's the case here? If the card is not connected an access point or otherwise unconnected to anything else, you should use IW_QUAL_ALL_INVALID here I think, because signal quality has no meaning when you're disconnected (except possibly background noise).

net/d80211/ieee80211_ioctl.c static int ieee80211_ioctl_giwauth(struc · line 3005

Quoted 12 lines
net/d80211/ieee80211_ioctl.c +12 -0
+	} else {
+		if (!tmp_level) {       /* get initial values */
+			tmp_level = sta->last_signal;
+			tmp_qual = sta->last_rssi;
+		} else {                        /* smooth results */
+			tmp_level = (15 * tmp_level + sta->last_signal)/16;
+			tmp_qual = (15 * tmp_qual + sta->last_rssi)/16;
+		}
+		wstats->qual.level = tmp_level;
+		wstats->qual.qual = 100*tmp_qual/sta->max_rssi;
+		wstats->qual.noise = sta->last_noise;
+		wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;

By using IW_QUAL_DBM, you're forcing all cards that use d80211 to report statistics in dBm. I think that's a _good_ thing personally (it brings some consistency to the whole wireless quality pit-of-doom), but I want to make sure this is actually what you want to do here.

Dan

Quoted 20 lines
net/d80211/ieee80211_ioctl.c +4 -1
+	}
+	return wstats;
+}
 
  static int ieee80211_ioctl_siwencodeext(struct net_device *dev,
  					struct iw_request_info *info,
@@ -3128,4 +3171,5 @@ const struct iw_handler_def ieee80211_iw
  	.standard	= (iw_handler *) ieee80211_handler,
  	.private	= (iw_handler *) ieee80211_private_handler,
  	.private_args	= (struct iw_priv_args *) ieee80211_ioctl_priv,
+	.get_wireless_stats = ieee80211_get_wireless_stats,
  };
 
 
 
 
-

To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#2 lore raw
Quoted 51 lines · Dan Williams
Quoted 50 lines · Larry Finger

Part 8 of 8 to add wireless statistics to the bcm43xx-d80211 system. This patch adds the appropriate range parameters and routine ieee80211_get_wireless_stats to ieee80211_ioctl.c.

The patch is for the August 8 version of Linville's wireless-dev tree.

net/d80211/ieee80211_ioctl.c +26 -0
index dd52555..3a1b97f 100644
@@ -1525,6 +1525,16 @@ static int ieee80211_ioctl_giwrange(stru
  	range->min_frag = 256;
  	range->max_frag = 2346;
 
+	range->max_qual.qual = 100;
+	range->max_qual.level = 152;  /* set floor at -104 dBm (152 - 256) */
+	range->max_qual.noise = 152;
+	range->max_qual.updated = IW_QUAL_ALL_UPDATED;
+
+	range->avg_qual.qual = 50;
+	range->avg_qual.level = 0;
+	range->avg_qual.noise = 0;
+	range->avg_qual.updated = IW_QUAL_ALL_UPDATED;
+
  	return 0;
  }
 
@@ -2963,6 +2973,39 @@ static int ieee80211_ioctl_giwauth(struc
  	return ret;
  }
 
+/* Get wireless statistics.  Called by /proc/net/wireless and by SIOCGIWSTATS */
+static struct iw_statistics *ieee80211_get_wireless_stats(struct net_device *net_dev)
+{
+	struct ieee80211_local *local = net_dev->ieee80211_ptr;
+	struct iw_statistics * wstats = &local->wstats;
+	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(net_dev);
+	struct sta_info *sta;
+	static int tmp_level = 0;
+	static int tmp_qual = 0;
+
+	sta = sta_info_get(local, sdata->u.wds.remote_addr);
+	if (!sta) {
+		wstats->discard.fragment = 0;
+		wstats->discard.misc = 0;
+		wstats->qual.qual = 0;
+		wstats->qual.level = 0;
Quoted 8 lines

net/d80211/ieee80211_ioctl.c static int ieee80211_ioctl_giwauth(struc · line 2993

Quoted 2 lines
net/d80211/ieee80211_ioctl.c +2 -0
+		wstats->qual.noise = 0;
+		wstats->qual.updated |= IW_QUAL_ALL_UPDATED;

What does the 'if (!sta)' check do? What's the case here? If the card is not connected an access point or otherwise unconnected to anything else, you should use IW_QUAL_ALL_INVALID here I think, because signal quality has no meaning when you're disconnected (except possibly background noise).

The check is mostly to prevent NULL pointers in the else branch, but your suggestion of INVALID is good.

Quoted 10 lines
Quoted 10 lines
net/d80211/ieee80211_ioctl.c +9 -0
+	} else {
+		if (!tmp_level) {       /* get initial values */
+			tmp_level = sta->last_signal;
+			tmp_qual = sta->last_rssi;
+		} else {                        /* smooth results */
+			tmp_level = (15 * tmp_level + sta->last_signal)/16;
+			tmp_qual = (15 * tmp_qual + sta->last_rssi)/16;
+		}
+		wstats->qual.level = tmp_level;
Quoted 8 lines

net/d80211/ieee80211_ioctl.c static int ieee80211_ioctl_giwauth(struc · line 3005

Quoted 3 lines
net/d80211/ieee80211_ioctl.c +3 -0
+		wstats->qual.qual = 100*tmp_qual/sta->max_rssi;
+		wstats->qual.noise = sta->last_noise;
+		wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;

By using IW_QUAL_DBM, you're forcing all cards that use d80211 to report statistics in dBm. I think that's a _good_ thing personally (it brings some consistency to the whole wireless quality pit-of-doom), but I want to make sure this is actually what you want to do here.

From what I learned in our previous discussions, that is exactly what I meant.

Thanks for your comments.

Larry