aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruno Randolf <br1@einfach.org>2010-11-15 20:58:48 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-11-18 14:22:20 -0500
commit86107fd170bc379869250eb7e1bd393a3a70e8ae (patch)
tree579ee24be87e94246450420f4de57d8eda942848
parenteef39befaae2a1559efe197d795c376a317af2af (diff)
nl80211/mac80211: Report signal average
Extend nl80211 to report an exponential weighted moving average (EWMA) of the signal value. Since the signal value usually fluctuates between different packets, an average can be more useful than the value of the last packet. This uses the recently added generic EWMA library function. Signed-off-by: Bruno Randolf <br1@einfach.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--include/linux/nl80211.h2
-rw-r--r--include/net/cfg80211.h4
-rw-r--r--net/mac80211/Kconfig1
-rw-r--r--net/mac80211/cfg.c3
-rw-r--r--net/mac80211/rx.c1
-rw-r--r--net/mac80211/sta_info.c2
-rw-r--r--net/mac80211/sta_info.h3
-rw-r--r--net/wireless/nl80211.c3
8 files changed, 18 insertions, 1 deletions
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index 037b4e498890..1ce3775e9e26 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -1161,6 +1161,7 @@ enum nl80211_rate_info {
1161 * @__NL80211_STA_INFO_AFTER_LAST: internal 1161 * @__NL80211_STA_INFO_AFTER_LAST: internal
1162 * @NL80211_STA_INFO_MAX: highest possible station info attribute 1162 * @NL80211_STA_INFO_MAX: highest possible station info attribute
1163 * @NL80211_STA_INFO_SIGNAL: signal strength of last received PPDU (u8, dBm) 1163 * @NL80211_STA_INFO_SIGNAL: signal strength of last received PPDU (u8, dBm)
1164 * @NL80211_STA_INFO_SIGNAL_AVG: signal strength average (u8, dBm)
1164 * @NL80211_STA_INFO_TX_BITRATE: current unicast tx rate, nested attribute 1165 * @NL80211_STA_INFO_TX_BITRATE: current unicast tx rate, nested attribute
1165 * containing info as possible, see &enum nl80211_sta_info_txrate. 1166 * containing info as possible, see &enum nl80211_sta_info_txrate.
1166 * @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station) 1167 * @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station)
@@ -1178,6 +1179,7 @@ enum nl80211_sta_info {
1178 NL80211_STA_INFO_PLID, 1179 NL80211_STA_INFO_PLID,
1179 NL80211_STA_INFO_PLINK_STATE, 1180 NL80211_STA_INFO_PLINK_STATE,
1180 NL80211_STA_INFO_SIGNAL, 1181 NL80211_STA_INFO_SIGNAL,
1182 NL80211_STA_INFO_SIGNAL_AVG,
1181 NL80211_STA_INFO_TX_BITRATE, 1183 NL80211_STA_INFO_TX_BITRATE,
1182 NL80211_STA_INFO_RX_PACKETS, 1184 NL80211_STA_INFO_RX_PACKETS,
1183 NL80211_STA_INFO_TX_PACKETS, 1185 NL80211_STA_INFO_TX_PACKETS,
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 8fd9eebd0cc9..69e2364889f1 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -424,6 +424,7 @@ struct station_parameters {
424 * @STATION_INFO_TX_RETRIES: @tx_retries filled 424 * @STATION_INFO_TX_RETRIES: @tx_retries filled
425 * @STATION_INFO_TX_FAILED: @tx_failed filled 425 * @STATION_INFO_TX_FAILED: @tx_failed filled
426 * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled 426 * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled
427 * @STATION_INFO_SIGNAL_AVG: @signal_avg filled
427 */ 428 */
428enum station_info_flags { 429enum station_info_flags {
429 STATION_INFO_INACTIVE_TIME = 1<<0, 430 STATION_INFO_INACTIVE_TIME = 1<<0,
@@ -439,6 +440,7 @@ enum station_info_flags {
439 STATION_INFO_TX_RETRIES = 1<<10, 440 STATION_INFO_TX_RETRIES = 1<<10,
440 STATION_INFO_TX_FAILED = 1<<11, 441 STATION_INFO_TX_FAILED = 1<<11,
441 STATION_INFO_RX_DROP_MISC = 1<<12, 442 STATION_INFO_RX_DROP_MISC = 1<<12,
443 STATION_INFO_SIGNAL_AVG = 1<<13,
442}; 444};
443 445
444/** 446/**
@@ -485,6 +487,7 @@ struct rate_info {
485 * @plid: mesh peer link id 487 * @plid: mesh peer link id
486 * @plink_state: mesh peer link state 488 * @plink_state: mesh peer link state
487 * @signal: signal strength of last received packet in dBm 489 * @signal: signal strength of last received packet in dBm
490 * @signal_avg: signal strength average in dBm
488 * @txrate: current unicast bitrate to this station 491 * @txrate: current unicast bitrate to this station
489 * @rx_packets: packets received from this station 492 * @rx_packets: packets received from this station
490 * @tx_packets: packets transmitted to this station 493 * @tx_packets: packets transmitted to this station
@@ -505,6 +508,7 @@ struct station_info {
505 u16 plid; 508 u16 plid;
506 u8 plink_state; 509 u8 plink_state;
507 s8 signal; 510 s8 signal;
511 s8 signal_avg;
508 struct rate_info txrate; 512 struct rate_info txrate;
509 u32 rx_packets; 513 u32 rx_packets;
510 u32 tx_packets; 514 u32 tx_packets;
diff --git a/net/mac80211/Kconfig b/net/mac80211/Kconfig
index 4d6f8653ec88..798d9b9462e2 100644
--- a/net/mac80211/Kconfig
+++ b/net/mac80211/Kconfig
@@ -6,6 +6,7 @@ config MAC80211
6 select CRYPTO_ARC4 6 select CRYPTO_ARC4
7 select CRYPTO_AES 7 select CRYPTO_AES
8 select CRC32 8 select CRC32
9 select AVERAGE
9 ---help--- 10 ---help---
10 This option enables the hardware independent IEEE 802.11 11 This option enables the hardware independent IEEE 802.11
11 networking stack. 12 networking stack.
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 0c544074479e..92c9cf6a7d1c 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -343,8 +343,9 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
343 343
344 if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) || 344 if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
345 (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) { 345 (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
346 sinfo->filled |= STATION_INFO_SIGNAL; 346 sinfo->filled |= STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG;
347 sinfo->signal = (s8)sta->last_signal; 347 sinfo->signal = (s8)sta->last_signal;
348 sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
348 } 349 }
349 350
350 sinfo->txrate.flags = 0; 351 sinfo->txrate.flags = 0;
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index d2fcd22ab06d..9dd60a74181f 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1156,6 +1156,7 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
1156 sta->rx_fragments++; 1156 sta->rx_fragments++;
1157 sta->rx_bytes += rx->skb->len; 1157 sta->rx_bytes += rx->skb->len;
1158 sta->last_signal = status->signal; 1158 sta->last_signal = status->signal;
1159 ewma_add(&sta->avg_signal, -status->signal);
1159 1160
1160 /* 1161 /*
1161 * Change STA power saving mode only at the end of a frame 1162 * Change STA power saving mode only at the end of a frame
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index eff58571fd7e..f43fca8907f7 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -244,6 +244,8 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
244 sta->local = local; 244 sta->local = local;
245 sta->sdata = sdata; 245 sta->sdata = sdata;
246 246
247 ewma_init(&sta->avg_signal, 1000, 8);
248
247 if (sta_prepare_rate_control(local, sta, gfp)) { 249 if (sta_prepare_rate_control(local, sta, gfp)) {
248 kfree(sta); 250 kfree(sta);
249 return NULL; 251 return NULL;
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 9265acadef32..84062e2c782c 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -13,6 +13,7 @@
13#include <linux/types.h> 13#include <linux/types.h>
14#include <linux/if_ether.h> 14#include <linux/if_ether.h>
15#include <linux/workqueue.h> 15#include <linux/workqueue.h>
16#include <linux/average.h>
16#include "key.h" 17#include "key.h"
17 18
18/** 19/**
@@ -224,6 +225,7 @@ enum plink_state {
224 * @rx_fragments: number of received MPDUs 225 * @rx_fragments: number of received MPDUs
225 * @rx_dropped: number of dropped MPDUs from this STA 226 * @rx_dropped: number of dropped MPDUs from this STA
226 * @last_signal: signal of last received frame from this STA 227 * @last_signal: signal of last received frame from this STA
228 * @avg_signal: moving average of signal of received frames from this STA
227 * @last_seq_ctrl: last received seq/frag number from this STA (per RX queue) 229 * @last_seq_ctrl: last received seq/frag number from this STA (per RX queue)
228 * @tx_filtered_count: number of frames the hardware filtered for this STA 230 * @tx_filtered_count: number of frames the hardware filtered for this STA
229 * @tx_retry_failed: number of frames that failed retry 231 * @tx_retry_failed: number of frames that failed retry
@@ -291,6 +293,7 @@ struct sta_info {
291 unsigned long rx_fragments; 293 unsigned long rx_fragments;
292 unsigned long rx_dropped; 294 unsigned long rx_dropped;
293 int last_signal; 295 int last_signal;
296 struct ewma avg_signal;
294 __le16 last_seq_ctrl[NUM_RX_DATA_QUEUES]; 297 __le16 last_seq_ctrl[NUM_RX_DATA_QUEUES];
295 298
296 /* Updated from TX status path only, no locking requirements */ 299 /* Updated from TX status path only, no locking requirements */
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 605553842226..d06a40d17002 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -1872,6 +1872,9 @@ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
1872 if (sinfo->filled & STATION_INFO_SIGNAL) 1872 if (sinfo->filled & STATION_INFO_SIGNAL)
1873 NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL, 1873 NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL,
1874 sinfo->signal); 1874 sinfo->signal);
1875 if (sinfo->filled & STATION_INFO_SIGNAL_AVG)
1876 NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG,
1877 sinfo->signal_avg);
1875 if (sinfo->filled & STATION_INFO_TX_BITRATE) { 1878 if (sinfo->filled & STATION_INFO_TX_BITRATE) {
1876 txrate = nla_nest_start(msg, NL80211_STA_INFO_TX_BITRATE); 1879 txrate = nla_nest_start(msg, NL80211_STA_INFO_TX_BITRATE);
1877 if (!txrate) 1880 if (!txrate)