nl80211: Fetch STA TXQ backlog statistics

This makes per-STA TXQ backlog statistics available for airtime policy
configuration.

Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
This commit is contained in:
Toke Høiland-Jørgensen 2019-03-20 15:58:52 +01:00 committed by Jouni Malinen
parent 6326fa0c40
commit 1d6f63854e
2 changed files with 36 additions and 0 deletions

View file

@ -1768,6 +1768,8 @@ struct hostap_sta_driver_data {
unsigned long tx_retry_failed; unsigned long tx_retry_failed;
unsigned long tx_retry_count; unsigned long tx_retry_count;
s8 last_ack_rssi; s8 last_ack_rssi;
unsigned long backlog_packets;
unsigned long backlog_bytes;
s8 signal; s8 signal;
u8 rx_vhtmcs; u8 rx_vhtmcs;
u8 tx_vhtmcs; u8 tx_vhtmcs;

View file

@ -6262,6 +6262,36 @@ static int i802_flush(void *priv)
} }
static void get_sta_tid_stats(struct hostap_sta_driver_data *data,
struct nlattr *attr)
{
struct nlattr *tid_stats[NL80211_TID_STATS_MAX + 1], *tidattr;
struct nlattr *txq_stats[NL80211_TXQ_STATS_MAX + 1];
static struct nla_policy txq_stats_policy[NL80211_TXQ_STATS_MAX + 1] = {
[NL80211_TXQ_STATS_BACKLOG_BYTES] = { .type = NLA_U32 },
[NL80211_TXQ_STATS_BACKLOG_PACKETS] = { .type = NLA_U32 },
};
int rem;
nla_for_each_nested(tidattr, attr, rem) {
if (nla_parse_nested(tid_stats, NL80211_TID_STATS_MAX,
tidattr, NULL) != 0 ||
!tid_stats[NL80211_TID_STATS_TXQ_STATS] ||
nla_parse_nested(txq_stats, NL80211_TXQ_STATS_MAX,
tid_stats[NL80211_TID_STATS_TXQ_STATS],
txq_stats_policy) != 0)
continue;
/* sum the backlogs over all TIDs for station */
if (txq_stats[NL80211_TXQ_STATS_BACKLOG_BYTES])
data->backlog_bytes += nla_get_u32(
txq_stats[NL80211_TXQ_STATS_BACKLOG_BYTES]);
if (txq_stats[NL80211_TXQ_STATS_BACKLOG_PACKETS])
data->backlog_bytes += nla_get_u32(
txq_stats[NL80211_TXQ_STATS_BACKLOG_PACKETS]);
}
}
static int get_sta_handler(struct nl_msg *msg, void *arg) static int get_sta_handler(struct nl_msg *msg, void *arg)
{ {
struct nlattr *tb[NL80211_ATTR_MAX + 1]; struct nlattr *tb[NL80211_ATTR_MAX + 1];
@ -6406,6 +6436,9 @@ static int get_sta_handler(struct nl_msg *msg, void *arg)
} }
} }
if (stats[NL80211_STA_INFO_TID_STATS])
get_sta_tid_stats(data, stats[NL80211_STA_INFO_TID_STATS]);
return NL_SKIP; return NL_SKIP;
} }
@ -10904,6 +10937,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
.sta_remove = driver_nl80211_sta_remove, .sta_remove = driver_nl80211_sta_remove,
.hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol, .hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol,
.sta_set_flags = wpa_driver_nl80211_sta_set_flags, .sta_set_flags = wpa_driver_nl80211_sta_set_flags,
.sta_set_airtime_weight = driver_nl80211_sta_set_airtime_weight,
.hapd_init = i802_init, .hapd_init = i802_init,
.hapd_deinit = i802_deinit, .hapd_deinit = i802_deinit,
.set_wds_sta = i802_set_wds_sta, .set_wds_sta = i802_set_wds_sta,