diff options
author | Jouni Malinen <jouni.malinen@atheros.com> | 2009-02-17 06:24:57 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-02-27 14:52:39 -0500 |
commit | 98c8a60a04316e94ccea8221cf16768ce91bd214 (patch) | |
tree | c698e0526f7521bf0f7bd0122c0ee6a2ab08eb1c | |
parent | fdbf7335ea1a4048ff4818bf15bdcab1925dc6df (diff) |
nl80211: Provide access to STA TX/RX packet counters
The TX/RX packet counters are needed to fill in RADIUS Accounting
attributes Acct-Output-Packets and Acct-Input-Packets. We already
collect the needed information, but only the TX/RX bytes were
previously exposed through nl80211. Allow applications to fetch the
packet counters, too, to provide more complete support for accounting.
Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | include/linux/nl80211.h | 5 | ||||
-rw-r--r-- | include/net/cfg80211.h | 8 | ||||
-rw-r--r-- | net/mac80211/cfg.c | 4 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 6 |
4 files changed, 23 insertions, 0 deletions
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 8802d1bda382..f6e56370ea65 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h | |||
@@ -526,6 +526,9 @@ enum nl80211_rate_info { | |||
526 | * @NL80211_STA_INFO_SIGNAL: signal strength of last received PPDU (u8, dBm) | 526 | * @NL80211_STA_INFO_SIGNAL: signal strength of last received PPDU (u8, dBm) |
527 | * @NL80211_STA_INFO_TX_BITRATE: current unicast tx rate, nested attribute | 527 | * @NL80211_STA_INFO_TX_BITRATE: current unicast tx rate, nested attribute |
528 | * containing info as possible, see &enum nl80211_sta_info_txrate. | 528 | * containing info as possible, see &enum nl80211_sta_info_txrate. |
529 | * @NL80211_STA_INFO_RX_PACKETS: total received packet (u32, from this station) | ||
530 | * @NL80211_STA_INFO_TX_PACKETS: total transmitted packets (u32, to this | ||
531 | * station) | ||
529 | */ | 532 | */ |
530 | enum nl80211_sta_info { | 533 | enum nl80211_sta_info { |
531 | __NL80211_STA_INFO_INVALID, | 534 | __NL80211_STA_INFO_INVALID, |
@@ -537,6 +540,8 @@ enum nl80211_sta_info { | |||
537 | NL80211_STA_INFO_PLINK_STATE, | 540 | NL80211_STA_INFO_PLINK_STATE, |
538 | NL80211_STA_INFO_SIGNAL, | 541 | NL80211_STA_INFO_SIGNAL, |
539 | NL80211_STA_INFO_TX_BITRATE, | 542 | NL80211_STA_INFO_TX_BITRATE, |
543 | NL80211_STA_INFO_RX_PACKETS, | ||
544 | NL80211_STA_INFO_TX_PACKETS, | ||
540 | 545 | ||
541 | /* keep last */ | 546 | /* keep last */ |
542 | __NL80211_STA_INFO_AFTER_LAST, | 547 | __NL80211_STA_INFO_AFTER_LAST, |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 33f43b0d08fb..8dcc46444037 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -178,6 +178,8 @@ struct station_parameters { | |||
178 | * @STATION_INFO_SIGNAL: @signal filled | 178 | * @STATION_INFO_SIGNAL: @signal filled |
179 | * @STATION_INFO_TX_BITRATE: @tx_bitrate fields are filled | 179 | * @STATION_INFO_TX_BITRATE: @tx_bitrate fields are filled |
180 | * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) | 180 | * (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs) |
181 | * @STATION_INFO_RX_PACKETS: @rx_packets filled | ||
182 | * @STATION_INFO_TX_PACKETS: @tx_packets filled | ||
181 | */ | 183 | */ |
182 | enum station_info_flags { | 184 | enum station_info_flags { |
183 | STATION_INFO_INACTIVE_TIME = 1<<0, | 185 | STATION_INFO_INACTIVE_TIME = 1<<0, |
@@ -188,6 +190,8 @@ enum station_info_flags { | |||
188 | STATION_INFO_PLINK_STATE = 1<<5, | 190 | STATION_INFO_PLINK_STATE = 1<<5, |
189 | STATION_INFO_SIGNAL = 1<<6, | 191 | STATION_INFO_SIGNAL = 1<<6, |
190 | STATION_INFO_TX_BITRATE = 1<<7, | 192 | STATION_INFO_TX_BITRATE = 1<<7, |
193 | STATION_INFO_RX_PACKETS = 1<<8, | ||
194 | STATION_INFO_TX_PACKETS = 1<<9, | ||
191 | }; | 195 | }; |
192 | 196 | ||
193 | /** | 197 | /** |
@@ -235,6 +239,8 @@ struct rate_info { | |||
235 | * @plink_state: mesh peer link state | 239 | * @plink_state: mesh peer link state |
236 | * @signal: signal strength of last received packet in dBm | 240 | * @signal: signal strength of last received packet in dBm |
237 | * @txrate: current unicast bitrate to this station | 241 | * @txrate: current unicast bitrate to this station |
242 | * @rx_packets: packets received from this station | ||
243 | * @tx_packets: packets transmitted to this station | ||
238 | */ | 244 | */ |
239 | struct station_info { | 245 | struct station_info { |
240 | u32 filled; | 246 | u32 filled; |
@@ -246,6 +252,8 @@ struct station_info { | |||
246 | u8 plink_state; | 252 | u8 plink_state; |
247 | s8 signal; | 253 | s8 signal; |
248 | struct rate_info txrate; | 254 | struct rate_info txrate; |
255 | u32 rx_packets; | ||
256 | u32 tx_packets; | ||
249 | }; | 257 | }; |
250 | 258 | ||
251 | /** | 259 | /** |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index f453bb7c564b..c43129efc3bf 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -341,11 +341,15 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) | |||
341 | sinfo->filled = STATION_INFO_INACTIVE_TIME | | 341 | sinfo->filled = STATION_INFO_INACTIVE_TIME | |
342 | STATION_INFO_RX_BYTES | | 342 | STATION_INFO_RX_BYTES | |
343 | STATION_INFO_TX_BYTES | | 343 | STATION_INFO_TX_BYTES | |
344 | STATION_INFO_RX_PACKETS | | ||
345 | STATION_INFO_TX_PACKETS | | ||
344 | STATION_INFO_TX_BITRATE; | 346 | STATION_INFO_TX_BITRATE; |
345 | 347 | ||
346 | sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx); | 348 | sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx); |
347 | sinfo->rx_bytes = sta->rx_bytes; | 349 | sinfo->rx_bytes = sta->rx_bytes; |
348 | sinfo->tx_bytes = sta->tx_bytes; | 350 | sinfo->tx_bytes = sta->tx_bytes; |
351 | sinfo->rx_packets = sta->rx_packets; | ||
352 | sinfo->tx_packets = sta->tx_packets; | ||
349 | 353 | ||
350 | if (sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) { | 354 | if (sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) { |
351 | sinfo->filled |= STATION_INFO_SIGNAL; | 355 | sinfo->filled |= STATION_INFO_SIGNAL; |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 67b18b3a93a0..badccf98074e 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -1206,6 +1206,12 @@ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq, | |||
1206 | 1206 | ||
1207 | nla_nest_end(msg, txrate); | 1207 | nla_nest_end(msg, txrate); |
1208 | } | 1208 | } |
1209 | if (sinfo->filled & STATION_INFO_RX_PACKETS) | ||
1210 | NLA_PUT_U32(msg, NL80211_STA_INFO_RX_PACKETS, | ||
1211 | sinfo->rx_packets); | ||
1212 | if (sinfo->filled & STATION_INFO_TX_PACKETS) | ||
1213 | NLA_PUT_U32(msg, NL80211_STA_INFO_TX_PACKETS, | ||
1214 | sinfo->tx_packets); | ||
1209 | nla_nest_end(msg, sinfoattr); | 1215 | nla_nest_end(msg, sinfoattr); |
1210 | 1216 | ||
1211 | return genlmsg_end(msg, hdr); | 1217 | return genlmsg_end(msg, hdr); |