]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Fetch STA TXQ backlog statistics
authorToke Høiland-Jørgensen <toke@toke.dk>
Wed, 20 Mar 2019 14:58:52 +0000 (15:58 +0100)
committerJouni Malinen <j@w1.fi>
Tue, 30 Apr 2019 09:34:58 +0000 (12:34 +0300)
This makes per-STA TXQ backlog statistics available for airtime policy
configuration.

Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
src/drivers/driver.h
src/drivers/driver_nl80211.c

index 0acc0958aefb040a3f01274acdbf61ca8ed6613c..fdf9d197b402269057ddc75a7b2821548caa4d78 100644 (file)
@@ -1768,6 +1768,8 @@ struct hostap_sta_driver_data {
        unsigned long tx_retry_failed;
        unsigned long tx_retry_count;
        s8 last_ack_rssi;
+       unsigned long backlog_packets;
+       unsigned long backlog_bytes;
        s8 signal;
        u8 rx_vhtmcs;
        u8 tx_vhtmcs;
index ef37c8bcdfec7c585224eed5dae01039454e27cc..ff97720b241c833d16fc6f9c36cad0b03834e3b7 100644 (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)
 {
        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;
 }
 
@@ -10904,6 +10937,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
        .sta_remove = driver_nl80211_sta_remove,
        .hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol,
        .sta_set_flags = wpa_driver_nl80211_sta_set_flags,
+       .sta_set_airtime_weight = driver_nl80211_sta_set_airtime_weight,
        .hapd_init = i802_init,
        .hapd_deinit = i802_deinit,
        .set_wds_sta = i802_set_wds_sta,