LCOV - code coverage report
Current view: top level - net/mac80211 - sta_info.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 1164 0.0 %
Date: 2022-04-01 14:17:54 Functions: 0 56 0.0 %
Branches: 0 724 0.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-only
       2                 :            : /*
       3                 :            :  * Copyright 2002-2005, Instant802 Networks, Inc.
       4                 :            :  * Copyright 2006-2007  Jiri Benc <jbenc@suse.cz>
       5                 :            :  * Copyright 2013-2014  Intel Mobile Communications GmbH
       6                 :            :  * Copyright (C) 2015 - 2017 Intel Deutschland GmbH
       7                 :            :  * Copyright (C) 2018-2020 Intel Corporation
       8                 :            :  */
       9                 :            : 
      10                 :            : #include <linux/module.h>
      11                 :            : #include <linux/init.h>
      12                 :            : #include <linux/etherdevice.h>
      13                 :            : #include <linux/netdevice.h>
      14                 :            : #include <linux/types.h>
      15                 :            : #include <linux/slab.h>
      16                 :            : #include <linux/skbuff.h>
      17                 :            : #include <linux/if_arp.h>
      18                 :            : #include <linux/timer.h>
      19                 :            : #include <linux/rtnetlink.h>
      20                 :            : 
      21                 :            : #include <net/codel.h>
      22                 :            : #include <net/mac80211.h>
      23                 :            : #include "ieee80211_i.h"
      24                 :            : #include "driver-ops.h"
      25                 :            : #include "rate.h"
      26                 :            : #include "sta_info.h"
      27                 :            : #include "debugfs_sta.h"
      28                 :            : #include "mesh.h"
      29                 :            : #include "wme.h"
      30                 :            : 
      31                 :            : /**
      32                 :            :  * DOC: STA information lifetime rules
      33                 :            :  *
      34                 :            :  * STA info structures (&struct sta_info) are managed in a hash table
      35                 :            :  * for faster lookup and a list for iteration. They are managed using
      36                 :            :  * RCU, i.e. access to the list and hash table is protected by RCU.
      37                 :            :  *
      38                 :            :  * Upon allocating a STA info structure with sta_info_alloc(), the caller
      39                 :            :  * owns that structure. It must then insert it into the hash table using
      40                 :            :  * either sta_info_insert() or sta_info_insert_rcu(); only in the latter
      41                 :            :  * case (which acquires an rcu read section but must not be called from
      42                 :            :  * within one) will the pointer still be valid after the call. Note that
      43                 :            :  * the caller may not do much with the STA info before inserting it, in
      44                 :            :  * particular, it may not start any mesh peer link management or add
      45                 :            :  * encryption keys.
      46                 :            :  *
      47                 :            :  * When the insertion fails (sta_info_insert()) returns non-zero), the
      48                 :            :  * structure will have been freed by sta_info_insert()!
      49                 :            :  *
      50                 :            :  * Station entries are added by mac80211 when you establish a link with a
      51                 :            :  * peer. This means different things for the different type of interfaces
      52                 :            :  * we support. For a regular station this mean we add the AP sta when we
      53                 :            :  * receive an association response from the AP. For IBSS this occurs when
      54                 :            :  * get to know about a peer on the same IBSS. For WDS we add the sta for
      55                 :            :  * the peer immediately upon device open. When using AP mode we add stations
      56                 :            :  * for each respective station upon request from userspace through nl80211.
      57                 :            :  *
      58                 :            :  * In order to remove a STA info structure, various sta_info_destroy_*()
      59                 :            :  * calls are available.
      60                 :            :  *
      61                 :            :  * There is no concept of ownership on a STA entry, each structure is
      62                 :            :  * owned by the global hash table/list until it is removed. All users of
      63                 :            :  * the structure need to be RCU protected so that the structure won't be
      64                 :            :  * freed before they are done using it.
      65                 :            :  */
      66                 :            : 
      67                 :            : static const struct rhashtable_params sta_rht_params = {
      68                 :            :         .nelem_hint = 3, /* start small */
      69                 :            :         .automatic_shrinking = true,
      70                 :            :         .head_offset = offsetof(struct sta_info, hash_node),
      71                 :            :         .key_offset = offsetof(struct sta_info, addr),
      72                 :            :         .key_len = ETH_ALEN,
      73                 :            :         .max_size = CONFIG_MAC80211_STA_HASH_MAX_SIZE,
      74                 :            : };
      75                 :            : 
      76                 :            : /* Caller must hold local->sta_mtx */
      77                 :          0 : static int sta_info_hash_del(struct ieee80211_local *local,
      78                 :            :                              struct sta_info *sta)
      79                 :            : {
      80                 :          0 :         return rhltable_remove(&local->sta_hash, &sta->hash_node,
      81                 :            :                                sta_rht_params);
      82                 :            : }
      83                 :            : 
      84                 :          0 : static void __cleanup_single_sta(struct sta_info *sta)
      85                 :            : {
      86                 :          0 :         int ac, i;
      87                 :          0 :         struct tid_ampdu_tx *tid_tx;
      88                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
      89                 :          0 :         struct ieee80211_local *local = sdata->local;
      90                 :          0 :         struct ps_data *ps;
      91                 :            : 
      92   [ #  #  #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_PS_STA) ||
      93         [ #  # ]:          0 :             test_sta_flag(sta, WLAN_STA_PS_DRIVER) ||
      94                 :            :             test_sta_flag(sta, WLAN_STA_PS_DELIVER)) {
      95         [ #  # ]:          0 :                 if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
      96                 :            :                     sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
      97                 :          0 :                         ps = &sdata->bss->ps;
      98                 :            :                 else if (ieee80211_vif_is_mesh(&sdata->vif))
      99                 :            :                         ps = &sdata->u.mesh.ps;
     100                 :            :                 else
     101                 :            :                         return;
     102                 :            : 
     103                 :          0 :                 clear_sta_flag(sta, WLAN_STA_PS_STA);
     104                 :          0 :                 clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
     105                 :          0 :                 clear_sta_flag(sta, WLAN_STA_PS_DELIVER);
     106                 :            : 
     107                 :          0 :                 atomic_dec(&ps->num_sta_ps);
     108                 :            :         }
     109                 :            : 
     110         [ #  # ]:          0 :         if (sta->sta.txq[0]) {
     111         [ #  # ]:          0 :                 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
     112                 :          0 :                         struct txq_info *txqi;
     113                 :            : 
     114         [ #  # ]:          0 :                         if (!sta->sta.txq[i])
     115                 :          0 :                                 continue;
     116                 :            : 
     117                 :          0 :                         txqi = to_txq_info(sta->sta.txq[i]);
     118                 :            : 
     119                 :          0 :                         ieee80211_txq_purge(local, txqi);
     120                 :            :                 }
     121                 :            :         }
     122                 :            : 
     123         [ #  # ]:          0 :         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
     124                 :          0 :                 local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]);
     125                 :          0 :                 ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]);
     126                 :          0 :                 ieee80211_purge_tx_queue(&local->hw, &sta->tx_filtered[ac]);
     127                 :            :         }
     128                 :            : 
     129                 :          0 :         if (ieee80211_vif_is_mesh(&sdata->vif))
     130                 :            :                 mesh_sta_cleanup(sta);
     131                 :            : 
     132                 :          0 :         cancel_work_sync(&sta->drv_deliver_wk);
     133                 :            : 
     134                 :            :         /*
     135                 :            :          * Destroy aggregation state here. It would be nice to wait for the
     136                 :            :          * driver to finish aggregation stop and then clean up, but for now
     137                 :            :          * drivers have to handle aggregation stop being requested, followed
     138                 :            :          * directly by station destruction.
     139                 :            :          */
     140         [ #  # ]:          0 :         for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
     141                 :          0 :                 kfree(sta->ampdu_mlme.tid_start_tx[i]);
     142         [ #  # ]:          0 :                 tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]);
     143         [ #  # ]:          0 :                 if (!tid_tx)
     144                 :          0 :                         continue;
     145                 :          0 :                 ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending);
     146                 :          0 :                 kfree(tid_tx);
     147                 :            :         }
     148                 :            : }
     149                 :            : 
     150                 :          0 : static void cleanup_single_sta(struct sta_info *sta)
     151                 :            : {
     152                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
     153                 :          0 :         struct ieee80211_local *local = sdata->local;
     154                 :            : 
     155                 :          0 :         __cleanup_single_sta(sta);
     156                 :          0 :         sta_info_free(local, sta);
     157                 :          0 : }
     158                 :            : 
     159                 :          0 : struct rhlist_head *sta_info_hash_lookup(struct ieee80211_local *local,
     160                 :            :                                          const u8 *addr)
     161                 :            : {
     162                 :          0 :         return rhltable_lookup(&local->sta_hash, addr, sta_rht_params);
     163                 :            : }
     164                 :            : 
     165                 :            : /* protected by RCU */
     166                 :          0 : struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata,
     167                 :            :                               const u8 *addr)
     168                 :            : {
     169                 :          0 :         struct ieee80211_local *local = sdata->local;
     170                 :          0 :         struct rhlist_head *tmp;
     171                 :          0 :         struct sta_info *sta;
     172                 :            : 
     173                 :          0 :         rcu_read_lock();
     174         [ #  # ]:          0 :         for_each_sta_info(local, addr, sta, tmp) {
     175         [ #  # ]:          0 :                 if (sta->sdata == sdata) {
     176                 :          0 :                         rcu_read_unlock();
     177                 :            :                         /* this is safe as the caller must already hold
     178                 :            :                          * another rcu read section or the mutex
     179                 :            :                          */
     180                 :          0 :                         return sta;
     181                 :            :                 }
     182                 :            :         }
     183                 :          0 :         rcu_read_unlock();
     184                 :          0 :         return NULL;
     185                 :            : }
     186                 :            : 
     187                 :            : /*
     188                 :            :  * Get sta info either from the specified interface
     189                 :            :  * or from one of its vlans
     190                 :            :  */
     191                 :          0 : struct sta_info *sta_info_get_bss(struct ieee80211_sub_if_data *sdata,
     192                 :            :                                   const u8 *addr)
     193                 :            : {
     194                 :          0 :         struct ieee80211_local *local = sdata->local;
     195                 :          0 :         struct rhlist_head *tmp;
     196                 :          0 :         struct sta_info *sta;
     197                 :            : 
     198                 :          0 :         rcu_read_lock();
     199         [ #  # ]:          0 :         for_each_sta_info(local, addr, sta, tmp) {
     200         [ #  # ]:          0 :                 if (sta->sdata == sdata ||
     201   [ #  #  #  # ]:          0 :                     (sta->sdata->bss && sta->sdata->bss == sdata->bss)) {
     202                 :          0 :                         rcu_read_unlock();
     203                 :            :                         /* this is safe as the caller must already hold
     204                 :            :                          * another rcu read section or the mutex
     205                 :            :                          */
     206                 :          0 :                         return sta;
     207                 :            :                 }
     208                 :            :         }
     209                 :          0 :         rcu_read_unlock();
     210                 :          0 :         return NULL;
     211                 :            : }
     212                 :            : 
     213                 :          0 : struct sta_info *sta_info_get_by_addrs(struct ieee80211_local *local,
     214                 :            :                                        const u8 *sta_addr, const u8 *vif_addr)
     215                 :            : {
     216                 :          0 :         struct rhlist_head *tmp;
     217                 :          0 :         struct sta_info *sta;
     218                 :            : 
     219         [ #  # ]:          0 :         for_each_sta_info(local, sta_addr, sta, tmp) {
     220         [ #  # ]:          0 :                 if (ether_addr_equal(vif_addr, sta->sdata->vif.addr))
     221                 :          0 :                         return sta;
     222                 :            :         }
     223                 :            : 
     224                 :            :         return NULL;
     225                 :            : }
     226                 :            : 
     227                 :          0 : struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata,
     228                 :            :                                      int idx)
     229                 :            : {
     230                 :          0 :         struct ieee80211_local *local = sdata->local;
     231                 :          0 :         struct sta_info *sta;
     232                 :          0 :         int i = 0;
     233                 :            : 
     234         [ #  # ]:          0 :         list_for_each_entry_rcu(sta, &local->sta_list, list) {
     235         [ #  # ]:          0 :                 if (sdata != sta->sdata)
     236                 :          0 :                         continue;
     237         [ #  # ]:          0 :                 if (i < idx) {
     238                 :          0 :                         ++i;
     239                 :          0 :                         continue;
     240                 :            :                 }
     241                 :            :                 return sta;
     242                 :            :         }
     243                 :            : 
     244                 :            :         return NULL;
     245                 :            : }
     246                 :            : 
     247                 :            : /**
     248                 :            :  * sta_info_free - free STA
     249                 :            :  *
     250                 :            :  * @local: pointer to the global information
     251                 :            :  * @sta: STA info to free
     252                 :            :  *
     253                 :            :  * This function must undo everything done by sta_info_alloc()
     254                 :            :  * that may happen before sta_info_insert(). It may only be
     255                 :            :  * called when sta_info_insert() has not been attempted (and
     256                 :            :  * if that fails, the station is freed anyway.)
     257                 :            :  */
     258                 :          0 : void sta_info_free(struct ieee80211_local *local, struct sta_info *sta)
     259                 :            : {
     260         [ #  # ]:          0 :         if (sta->rate_ctrl)
     261                 :          0 :                 rate_control_free_sta(sta);
     262                 :            : 
     263                 :          0 :         sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr);
     264                 :            : 
     265         [ #  # ]:          0 :         if (sta->sta.txq[0])
     266                 :          0 :                 kfree(to_txq_info(sta->sta.txq[0]));
     267                 :          0 :         kfree(rcu_dereference_raw(sta->sta.rates));
     268                 :            : #ifdef CONFIG_MAC80211_MESH
     269                 :            :         kfree(sta->mesh);
     270                 :            : #endif
     271                 :          0 :         free_percpu(sta->pcpu_rx_stats);
     272                 :          0 :         kfree(sta);
     273                 :          0 : }
     274                 :            : 
     275                 :            : /* Caller must hold local->sta_mtx */
     276                 :          0 : static int sta_info_hash_add(struct ieee80211_local *local,
     277                 :            :                              struct sta_info *sta)
     278                 :            : {
     279                 :          0 :         return rhltable_insert(&local->sta_hash, &sta->hash_node,
     280                 :            :                                sta_rht_params);
     281                 :            : }
     282                 :            : 
     283                 :          0 : static void sta_deliver_ps_frames(struct work_struct *wk)
     284                 :            : {
     285                 :          0 :         struct sta_info *sta;
     286                 :            : 
     287                 :          0 :         sta = container_of(wk, struct sta_info, drv_deliver_wk);
     288                 :            : 
     289         [ #  # ]:          0 :         if (sta->dead)
     290                 :            :                 return;
     291                 :            : 
     292                 :          0 :         local_bh_disable();
     293         [ #  # ]:          0 :         if (!test_sta_flag(sta, WLAN_STA_PS_STA))
     294                 :          0 :                 ieee80211_sta_ps_deliver_wakeup(sta);
     295         [ #  # ]:          0 :         else if (test_and_clear_sta_flag(sta, WLAN_STA_PSPOLL))
     296                 :          0 :                 ieee80211_sta_ps_deliver_poll_response(sta);
     297         [ #  # ]:          0 :         else if (test_and_clear_sta_flag(sta, WLAN_STA_UAPSD))
     298                 :          0 :                 ieee80211_sta_ps_deliver_uapsd(sta);
     299                 :          0 :         local_bh_enable();
     300                 :            : }
     301                 :            : 
     302                 :          0 : static int sta_prepare_rate_control(struct ieee80211_local *local,
     303                 :            :                                     struct sta_info *sta, gfp_t gfp)
     304                 :            : {
     305         [ #  # ]:          0 :         if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
     306                 :            :                 return 0;
     307                 :            : 
     308                 :          0 :         sta->rate_ctrl = local->rate_ctrl;
     309                 :          0 :         sta->rate_ctrl_priv = rate_control_alloc_sta(sta->rate_ctrl,
     310                 :            :                                                      sta, gfp);
     311         [ #  # ]:          0 :         if (!sta->rate_ctrl_priv)
     312                 :          0 :                 return -ENOMEM;
     313                 :            : 
     314                 :            :         return 0;
     315                 :            : }
     316                 :            : 
     317                 :          0 : struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
     318                 :            :                                 const u8 *addr, gfp_t gfp)
     319                 :            : {
     320                 :          0 :         struct ieee80211_local *local = sdata->local;
     321                 :          0 :         struct ieee80211_hw *hw = &local->hw;
     322                 :          0 :         struct sta_info *sta;
     323                 :          0 :         int i;
     324                 :            : 
     325                 :          0 :         sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp);
     326         [ #  # ]:          0 :         if (!sta)
     327                 :            :                 return NULL;
     328                 :            : 
     329         [ #  # ]:          0 :         if (ieee80211_hw_check(hw, USES_RSS)) {
     330                 :          0 :                 sta->pcpu_rx_stats =
     331                 :          0 :                         alloc_percpu_gfp(struct ieee80211_sta_rx_stats, gfp);
     332         [ #  # ]:          0 :                 if (!sta->pcpu_rx_stats)
     333                 :          0 :                         goto free;
     334                 :            :         }
     335                 :            : 
     336                 :          0 :         spin_lock_init(&sta->lock);
     337                 :          0 :         spin_lock_init(&sta->ps_lock);
     338                 :          0 :         INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames);
     339                 :          0 :         INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
     340                 :          0 :         mutex_init(&sta->ampdu_mlme.mtx);
     341                 :            : #ifdef CONFIG_MAC80211_MESH
     342                 :            :         if (ieee80211_vif_is_mesh(&sdata->vif)) {
     343                 :            :                 sta->mesh = kzalloc(sizeof(*sta->mesh), gfp);
     344                 :            :                 if (!sta->mesh)
     345                 :            :                         goto free;
     346                 :            :                 sta->mesh->plink_sta = sta;
     347                 :            :                 spin_lock_init(&sta->mesh->plink_lock);
     348                 :            :                 if (ieee80211_vif_is_mesh(&sdata->vif) &&
     349                 :            :                     !sdata->u.mesh.user_mpm)
     350                 :            :                         timer_setup(&sta->mesh->plink_timer, mesh_plink_timer,
     351                 :            :                                     0);
     352                 :            :                 sta->mesh->nonpeer_pm = NL80211_MESH_POWER_ACTIVE;
     353                 :            :         }
     354                 :            : #endif
     355                 :            : 
     356                 :          0 :         memcpy(sta->addr, addr, ETH_ALEN);
     357                 :          0 :         memcpy(sta->sta.addr, addr, ETH_ALEN);
     358                 :          0 :         sta->sta.max_rx_aggregation_subframes =
     359                 :          0 :                 local->hw.max_rx_aggregation_subframes;
     360                 :            : 
     361                 :            :         /* Extended Key ID needs to install keys for keyid 0 and 1 Rx-only.
     362                 :            :          * The Tx path starts to use a key as soon as the key slot ptk_idx
     363                 :            :          * references to is not NULL. To not use the initial Rx-only key
     364                 :            :          * prematurely for Tx initialize ptk_idx to an impossible PTK keyid
     365                 :            :          * which always will refer to a NULL key.
     366                 :            :          */
     367                 :          0 :         BUILD_BUG_ON(ARRAY_SIZE(sta->ptk) <= INVALID_PTK_KEYIDX);
     368                 :          0 :         sta->ptk_idx = INVALID_PTK_KEYIDX;
     369                 :            : 
     370                 :          0 :         sta->local = local;
     371                 :          0 :         sta->sdata = sdata;
     372                 :          0 :         sta->rx_stats.last_rx = jiffies;
     373                 :            : 
     374                 :          0 :         u64_stats_init(&sta->rx_stats.syncp);
     375                 :            : 
     376                 :          0 :         sta->sta_state = IEEE80211_STA_NONE;
     377                 :            : 
     378                 :            :         /* Mark TID as unreserved */
     379                 :          0 :         sta->reserved_tid = IEEE80211_TID_UNRESERVED;
     380                 :            : 
     381                 :          0 :         sta->last_connected = ktime_get_seconds();
     382                 :          0 :         ewma_signal_init(&sta->rx_stats_avg.signal);
     383                 :          0 :         ewma_avg_signal_init(&sta->status_stats.avg_ack_signal);
     384         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(sta->rx_stats_avg.chain_signal); i++)
     385                 :          0 :                 ewma_signal_init(&sta->rx_stats_avg.chain_signal[i]);
     386                 :            : 
     387         [ #  # ]:          0 :         if (local->ops->wake_tx_queue) {
     388                 :          0 :                 void *txq_data;
     389                 :          0 :                 int size = sizeof(struct txq_info) +
     390                 :          0 :                            ALIGN(hw->txq_data_size, sizeof(void *));
     391                 :            : 
     392                 :          0 :                 txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp);
     393         [ #  # ]:          0 :                 if (!txq_data)
     394                 :          0 :                         goto free;
     395                 :            : 
     396         [ #  # ]:          0 :                 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
     397                 :          0 :                         struct txq_info *txq = txq_data + i * size;
     398                 :            : 
     399                 :            :                         /* might not do anything for the bufferable MMPDU TXQ */
     400                 :          0 :                         ieee80211_txq_init(sdata, sta, txq, i);
     401                 :            :                 }
     402                 :            :         }
     403                 :            : 
     404         [ #  # ]:          0 :         if (sta_prepare_rate_control(local, sta, gfp))
     405                 :          0 :                 goto free_txq;
     406                 :            : 
     407                 :          0 :         sta->airtime_weight = IEEE80211_DEFAULT_AIRTIME_WEIGHT;
     408                 :            : 
     409         [ #  # ]:          0 :         for (i = 0; i < IEEE80211_NUM_ACS; i++) {
     410                 :          0 :                 skb_queue_head_init(&sta->ps_tx_buf[i]);
     411                 :          0 :                 skb_queue_head_init(&sta->tx_filtered[i]);
     412                 :          0 :                 sta->airtime[i].deficit = sta->airtime_weight;
     413                 :          0 :                 atomic_set(&sta->airtime[i].aql_tx_pending, 0);
     414                 :          0 :                 sta->airtime[i].aql_limit_low = local->aql_txq_limit_low[i];
     415                 :          0 :                 sta->airtime[i].aql_limit_high = local->aql_txq_limit_high[i];
     416                 :            :         }
     417                 :            : 
     418         [ #  # ]:          0 :         for (i = 0; i < IEEE80211_NUM_TIDS; i++)
     419                 :          0 :                 sta->last_seq_ctrl[i] = cpu_to_le16(USHRT_MAX);
     420                 :            : 
     421         [ #  # ]:          0 :         for (i = 0; i < NUM_NL80211_BANDS; i++) {
     422                 :          0 :                 u32 mandatory = 0;
     423                 :          0 :                 int r;
     424                 :            : 
     425         [ #  # ]:          0 :                 if (!hw->wiphy->bands[i])
     426                 :          0 :                         continue;
     427                 :            : 
     428   [ #  #  #  # ]:          0 :                 switch (i) {
     429                 :          0 :                 case NL80211_BAND_2GHZ:
     430                 :            :                         /*
     431                 :            :                          * We use both here, even if we cannot really know for
     432                 :            :                          * sure the station will support both, but the only use
     433                 :            :                          * for this is when we don't know anything yet and send
     434                 :            :                          * management frames, and then we'll pick the lowest
     435                 :            :                          * possible rate anyway.
     436                 :            :                          * If we don't include _G here, we cannot find a rate
     437                 :            :                          * in P2P, and thus trigger the WARN_ONCE() in rate.c
     438                 :            :                          */
     439                 :          0 :                         mandatory = IEEE80211_RATE_MANDATORY_B |
     440                 :            :                                     IEEE80211_RATE_MANDATORY_G;
     441                 :          0 :                         break;
     442                 :          0 :                 case NL80211_BAND_5GHZ:
     443                 :          0 :                         mandatory = IEEE80211_RATE_MANDATORY_A;
     444                 :          0 :                         break;
     445                 :            :                 case NL80211_BAND_60GHZ:
     446                 :          0 :                         WARN_ON(1);
     447                 :          0 :                         mandatory = 0;
     448                 :          0 :                         break;
     449                 :            :                 }
     450                 :            : 
     451         [ #  # ]:          0 :                 for (r = 0; r < hw->wiphy->bands[i]->n_bitrates; r++) {
     452                 :          0 :                         struct ieee80211_rate *rate;
     453                 :            : 
     454                 :          0 :                         rate = &hw->wiphy->bands[i]->bitrates[r];
     455                 :            : 
     456         [ #  # ]:          0 :                         if (!(rate->flags & mandatory))
     457                 :          0 :                                 continue;
     458                 :          0 :                         sta->sta.supp_rates[i] |= BIT(r);
     459                 :            :                 }
     460                 :            :         }
     461                 :            : 
     462                 :          0 :         sta->sta.smps_mode = IEEE80211_SMPS_OFF;
     463         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP ||
     464                 :            :             sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
     465                 :          0 :                 struct ieee80211_supported_band *sband;
     466                 :          0 :                 u8 smps;
     467                 :            : 
     468                 :          0 :                 sband = ieee80211_get_sband(sdata);
     469         [ #  # ]:          0 :                 if (!sband)
     470                 :          0 :                         goto free_txq;
     471                 :            : 
     472                 :          0 :                 smps = (sband->ht_cap.cap & IEEE80211_HT_CAP_SM_PS) >>
     473                 :            :                         IEEE80211_HT_CAP_SM_PS_SHIFT;
     474                 :            :                 /*
     475                 :            :                  * Assume that hostapd advertises our caps in the beacon and
     476                 :            :                  * this is the known_smps_mode for a station that just assciated
     477                 :            :                  */
     478   [ #  #  #  # ]:          0 :                 switch (smps) {
     479                 :          0 :                 case WLAN_HT_SMPS_CONTROL_DISABLED:
     480                 :          0 :                         sta->known_smps_mode = IEEE80211_SMPS_OFF;
     481                 :          0 :                         break;
     482                 :          0 :                 case WLAN_HT_SMPS_CONTROL_STATIC:
     483                 :          0 :                         sta->known_smps_mode = IEEE80211_SMPS_STATIC;
     484                 :          0 :                         break;
     485                 :          0 :                 case WLAN_HT_SMPS_CONTROL_DYNAMIC:
     486                 :          0 :                         sta->known_smps_mode = IEEE80211_SMPS_DYNAMIC;
     487                 :          0 :                         break;
     488                 :            :                 default:
     489                 :          0 :                         WARN_ON(1);
     490                 :            :                 }
     491                 :          0 :         }
     492                 :            : 
     493                 :          0 :         sta->sta.max_rc_amsdu_len = IEEE80211_MAX_MPDU_LEN_HT_BA;
     494                 :            : 
     495                 :          0 :         sta->cparams.ce_threshold = CODEL_DISABLED_THRESHOLD;
     496                 :          0 :         sta->cparams.target = MS2TIME(20);
     497                 :          0 :         sta->cparams.interval = MS2TIME(100);
     498                 :          0 :         sta->cparams.ecn = true;
     499                 :            : 
     500                 :          0 :         sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr);
     501                 :            : 
     502                 :          0 :         return sta;
     503                 :            : 
     504                 :          0 : free_txq:
     505         [ #  # ]:          0 :         if (sta->sta.txq[0])
     506                 :          0 :                 kfree(to_txq_info(sta->sta.txq[0]));
     507                 :          0 : free:
     508                 :          0 :         free_percpu(sta->pcpu_rx_stats);
     509                 :            : #ifdef CONFIG_MAC80211_MESH
     510                 :            :         kfree(sta->mesh);
     511                 :            : #endif
     512                 :          0 :         kfree(sta);
     513                 :          0 :         return NULL;
     514                 :            : }
     515                 :            : 
     516                 :          0 : static int sta_info_insert_check(struct sta_info *sta)
     517                 :            : {
     518                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
     519                 :            : 
     520                 :            :         /*
     521                 :            :          * Can't be a WARN_ON because it can be triggered through a race:
     522                 :            :          * something inserts a STA (on one CPU) without holding the RTNL
     523                 :            :          * and another CPU turns off the net device.
     524                 :            :          */
     525         [ #  # ]:          0 :         if (unlikely(!ieee80211_sdata_running(sdata)))
     526                 :            :                 return -ENETDOWN;
     527                 :            : 
     528   [ #  #  #  #  :          0 :         if (WARN_ON(ether_addr_equal(sta->sta.addr, sdata->vif.addr) ||
             #  #  #  # ]
     529                 :            :                     is_multicast_ether_addr(sta->sta.addr)))
     530                 :            :                 return -EINVAL;
     531                 :            : 
     532                 :            :         /* The RCU read lock is required by rhashtable due to
     533                 :            :          * asynchronous resize/rehash.  We also require the mutex
     534                 :            :          * for correctness.
     535                 :            :          */
     536                 :          0 :         rcu_read_lock();
     537                 :          0 :         lockdep_assert_held(&sdata->local->sta_mtx);
     538   [ #  #  #  # ]:          0 :         if (ieee80211_hw_check(&sdata->local->hw, NEEDS_UNIQUE_STA_ADDR) &&
     539                 :          0 :             ieee80211_find_sta_by_ifaddr(&sdata->local->hw, sta->addr, NULL)) {
     540                 :          0 :                 rcu_read_unlock();
     541                 :          0 :                 return -ENOTUNIQ;
     542                 :            :         }
     543                 :          0 :         rcu_read_unlock();
     544                 :            : 
     545                 :          0 :         return 0;
     546                 :            : }
     547                 :            : 
     548                 :          0 : static int sta_info_insert_drv_state(struct ieee80211_local *local,
     549                 :            :                                      struct ieee80211_sub_if_data *sdata,
     550                 :            :                                      struct sta_info *sta)
     551                 :            : {
     552                 :          0 :         enum ieee80211_sta_state state;
     553                 :          0 :         int err = 0;
     554                 :            : 
     555         [ #  # ]:          0 :         for (state = IEEE80211_STA_NOTEXIST; state < sta->sta_state; state++) {
     556                 :          0 :                 err = drv_sta_state(local, sdata, sta, state, state + 1);
     557         [ #  # ]:          0 :                 if (err)
     558                 :            :                         break;
     559                 :            :         }
     560                 :            : 
     561         [ #  # ]:          0 :         if (!err) {
     562                 :            :                 /*
     563                 :            :                  * Drivers using legacy sta_add/sta_remove callbacks only
     564                 :            :                  * get uploaded set to true after sta_add is called.
     565                 :            :                  */
     566         [ #  # ]:          0 :                 if (!local->ops->sta_add)
     567                 :          0 :                         sta->uploaded = true;
     568                 :          0 :                 return 0;
     569                 :            :         }
     570                 :            : 
     571         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
     572                 :          0 :                 sdata_info(sdata,
     573                 :            :                            "failed to move IBSS STA %pM to state %d (%d) - keeping it anyway\n",
     574                 :            :                            sta->sta.addr, state + 1, err);
     575                 :          0 :                 err = 0;
     576                 :            :         }
     577                 :            : 
     578                 :            :         /* unwind on error */
     579         [ #  # ]:          0 :         for (; state > IEEE80211_STA_NOTEXIST; state--)
     580         [ #  # ]:          0 :                 WARN_ON(drv_sta_state(local, sdata, sta, state, state - 1));
     581                 :            : 
     582                 :            :         return err;
     583                 :            : }
     584                 :            : 
     585                 :            : static void
     586                 :          0 : ieee80211_recalc_p2p_go_ps_allowed(struct ieee80211_sub_if_data *sdata)
     587                 :            : {
     588                 :          0 :         struct ieee80211_local *local = sdata->local;
     589                 :          0 :         bool allow_p2p_go_ps = sdata->vif.p2p;
     590                 :          0 :         struct sta_info *sta;
     591                 :            : 
     592                 :          0 :         rcu_read_lock();
     593         [ #  # ]:          0 :         list_for_each_entry_rcu(sta, &local->sta_list, list) {
     594   [ #  #  #  # ]:          0 :                 if (sdata != sta->sdata ||
     595                 :            :                     !test_sta_flag(sta, WLAN_STA_ASSOC))
     596                 :          0 :                         continue;
     597         [ #  # ]:          0 :                 if (!sta->sta.support_p2p_ps) {
     598                 :            :                         allow_p2p_go_ps = false;
     599                 :            :                         break;
     600                 :            :                 }
     601                 :            :         }
     602                 :          0 :         rcu_read_unlock();
     603                 :            : 
     604         [ #  # ]:          0 :         if (allow_p2p_go_ps != sdata->vif.bss_conf.allow_p2p_go_ps) {
     605                 :          0 :                 sdata->vif.bss_conf.allow_p2p_go_ps = allow_p2p_go_ps;
     606                 :          0 :                 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_P2P_PS);
     607                 :            :         }
     608                 :          0 : }
     609                 :            : 
     610                 :            : /*
     611                 :            :  * should be called with sta_mtx locked
     612                 :            :  * this function replaces the mutex lock
     613                 :            :  * with a RCU lock
     614                 :            :  */
     615                 :          0 : static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
     616                 :            : {
     617                 :          0 :         struct ieee80211_local *local = sta->local;
     618                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
     619                 :          0 :         struct station_info *sinfo = NULL;
     620                 :          0 :         int err = 0;
     621                 :            : 
     622                 :          0 :         lockdep_assert_held(&local->sta_mtx);
     623                 :            : 
     624                 :            :         /* check if STA exists already */
     625         [ #  # ]:          0 :         if (sta_info_get_bss(sdata, sta->sta.addr)) {
     626                 :          0 :                 err = -EEXIST;
     627                 :          0 :                 goto out_err;
     628                 :            :         }
     629                 :            : 
     630                 :          0 :         sinfo = kzalloc(sizeof(struct station_info), GFP_KERNEL);
     631         [ #  # ]:          0 :         if (!sinfo) {
     632                 :          0 :                 err = -ENOMEM;
     633                 :          0 :                 goto out_err;
     634                 :            :         }
     635                 :            : 
     636                 :          0 :         local->num_sta++;
     637                 :          0 :         local->sta_generation++;
     638                 :          0 :         smp_mb();
     639                 :            : 
     640                 :            :         /* simplify things and don't accept BA sessions yet */
     641                 :          0 :         set_sta_flag(sta, WLAN_STA_BLOCK_BA);
     642                 :            : 
     643                 :            :         /* make the station visible */
     644                 :          0 :         err = sta_info_hash_add(local, sta);
     645         [ #  # ]:          0 :         if (err)
     646                 :          0 :                 goto out_drop_sta;
     647                 :            : 
     648                 :          0 :         list_add_tail_rcu(&sta->list, &local->sta_list);
     649                 :            : 
     650                 :            :         /* notify driver */
     651                 :          0 :         err = sta_info_insert_drv_state(local, sdata, sta);
     652         [ #  # ]:          0 :         if (err)
     653                 :          0 :                 goto out_remove;
     654                 :            : 
     655                 :          0 :         set_sta_flag(sta, WLAN_STA_INSERTED);
     656                 :            : 
     657         [ #  # ]:          0 :         if (sta->sta_state >= IEEE80211_STA_ASSOC) {
     658                 :          0 :                 ieee80211_recalc_min_chandef(sta->sdata);
     659         [ #  # ]:          0 :                 if (!sta->sta.support_p2p_ps)
     660                 :          0 :                         ieee80211_recalc_p2p_go_ps_allowed(sta->sdata);
     661                 :            :         }
     662                 :            : 
     663                 :            :         /* accept BA sessions now */
     664                 :          0 :         clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
     665                 :            : 
     666                 :          0 :         ieee80211_sta_debugfs_add(sta);
     667                 :          0 :         rate_control_add_sta_debugfs(sta);
     668                 :            : 
     669                 :          0 :         sinfo->generation = local->sta_generation;
     670                 :          0 :         cfg80211_new_sta(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL);
     671                 :          0 :         kfree(sinfo);
     672                 :            : 
     673                 :          0 :         sta_dbg(sdata, "Inserted STA %pM\n", sta->sta.addr);
     674                 :            : 
     675                 :            :         /* move reference to rcu-protected */
     676                 :          0 :         rcu_read_lock();
     677                 :          0 :         mutex_unlock(&local->sta_mtx);
     678                 :            : 
     679                 :          0 :         if (ieee80211_vif_is_mesh(&sdata->vif))
     680                 :            :                 mesh_accept_plinks_update(sdata);
     681                 :            : 
     682                 :          0 :         return 0;
     683                 :            :  out_remove:
     684                 :          0 :         sta_info_hash_del(local, sta);
     685                 :          0 :         list_del_rcu(&sta->list);
     686                 :          0 :  out_drop_sta:
     687                 :          0 :         local->num_sta--;
     688                 :          0 :         synchronize_net();
     689                 :          0 :         __cleanup_single_sta(sta);
     690                 :          0 :  out_err:
     691                 :          0 :         mutex_unlock(&local->sta_mtx);
     692                 :          0 :         kfree(sinfo);
     693                 :          0 :         rcu_read_lock();
     694                 :          0 :         return err;
     695                 :            : }
     696                 :            : 
     697                 :          0 : int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU)
     698                 :            : {
     699                 :          0 :         struct ieee80211_local *local = sta->local;
     700                 :          0 :         int err;
     701                 :            : 
     702                 :          0 :         might_sleep();
     703                 :            : 
     704                 :          0 :         mutex_lock(&local->sta_mtx);
     705                 :            : 
     706                 :          0 :         err = sta_info_insert_check(sta);
     707         [ #  # ]:          0 :         if (err) {
     708                 :          0 :                 mutex_unlock(&local->sta_mtx);
     709                 :          0 :                 rcu_read_lock();
     710                 :          0 :                 goto out_free;
     711                 :            :         }
     712                 :            : 
     713                 :          0 :         err = sta_info_insert_finish(sta);
     714         [ #  # ]:          0 :         if (err)
     715                 :          0 :                 goto out_free;
     716                 :            : 
     717                 :            :         return 0;
     718                 :          0 :  out_free:
     719                 :          0 :         sta_info_free(local, sta);
     720                 :          0 :         return err;
     721                 :            : }
     722                 :            : 
     723                 :          0 : int sta_info_insert(struct sta_info *sta)
     724                 :            : {
     725                 :          0 :         int err = sta_info_insert_rcu(sta);
     726                 :            : 
     727                 :          0 :         rcu_read_unlock();
     728                 :            : 
     729                 :          0 :         return err;
     730                 :            : }
     731                 :            : 
     732                 :          0 : static inline void __bss_tim_set(u8 *tim, u16 id)
     733                 :            : {
     734                 :            :         /*
     735                 :            :          * This format has been mandated by the IEEE specifications,
     736                 :            :          * so this line may not be changed to use the __set_bit() format.
     737                 :            :          */
     738                 :          0 :         tim[id / 8] |= (1 << (id % 8));
     739                 :          0 : }
     740                 :            : 
     741                 :          0 : static inline void __bss_tim_clear(u8 *tim, u16 id)
     742                 :            : {
     743                 :            :         /*
     744                 :            :          * This format has been mandated by the IEEE specifications,
     745                 :            :          * so this line may not be changed to use the __clear_bit() format.
     746                 :            :          */
     747                 :          0 :         tim[id / 8] &= ~(1 << (id % 8));
     748                 :          0 : }
     749                 :            : 
     750                 :          0 : static inline bool __bss_tim_get(u8 *tim, u16 id)
     751                 :            : {
     752                 :            :         /*
     753                 :            :          * This format has been mandated by the IEEE specifications,
     754                 :            :          * so this line may not be changed to use the test_bit() format.
     755                 :            :          */
     756                 :          0 :         return tim[id / 8] & (1 << (id % 8));
     757                 :            : }
     758                 :            : 
     759                 :          0 : static unsigned long ieee80211_tids_for_ac(int ac)
     760                 :            : {
     761                 :            :         /* If we ever support TIDs > 7, this obviously needs to be adjusted */
     762                 :          0 :         switch (ac) {
     763                 :            :         case IEEE80211_AC_VO:
     764                 :            :                 return BIT(6) | BIT(7);
     765                 :            :         case IEEE80211_AC_VI:
     766                 :            :                 return BIT(4) | BIT(5);
     767                 :            :         case IEEE80211_AC_BE:
     768                 :            :                 return BIT(0) | BIT(3);
     769                 :            :         case IEEE80211_AC_BK:
     770                 :            :                 return BIT(1) | BIT(2);
     771                 :            :         default:
     772                 :            :                 WARN_ON(1);
     773                 :            :                 return 0;
     774                 :            :         }
     775                 :            : }
     776                 :            : 
     777                 :          0 : static void __sta_info_recalc_tim(struct sta_info *sta, bool ignore_pending)
     778                 :            : {
     779                 :          0 :         struct ieee80211_local *local = sta->local;
     780                 :          0 :         struct ps_data *ps;
     781                 :          0 :         bool indicate_tim = false;
     782                 :          0 :         u8 ignore_for_tim = sta->sta.uapsd_queues;
     783                 :          0 :         int ac;
     784                 :          0 :         u16 id = sta->sta.aid;
     785                 :            : 
     786         [ #  # ]:          0 :         if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
     787                 :            :             sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
     788   [ #  #  #  # ]:          0 :                 if (WARN_ON_ONCE(!sta->sdata->bss))
     789                 :            :                         return;
     790                 :            : 
     791                 :          0 :                 ps = &sta->sdata->bss->ps;
     792                 :            : #ifdef CONFIG_MAC80211_MESH
     793                 :            :         } else if (ieee80211_vif_is_mesh(&sta->sdata->vif)) {
     794                 :            :                 ps = &sta->sdata->u.mesh.ps;
     795                 :            : #endif
     796                 :            :         } else {
     797                 :            :                 return;
     798                 :            :         }
     799                 :            : 
     800                 :            :         /* No need to do anything if the driver does all */
     801   [ #  #  #  # ]:          0 :         if (ieee80211_hw_check(&local->hw, AP_LINK_PS) && !local->ops->set_tim)
     802                 :            :                 return;
     803                 :            : 
     804         [ #  # ]:          0 :         if (sta->dead)
     805                 :          0 :                 goto done;
     806                 :            : 
     807                 :            :         /*
     808                 :            :          * If all ACs are delivery-enabled then we should build
     809                 :            :          * the TIM bit for all ACs anyway; if only some are then
     810                 :            :          * we ignore those and build the TIM bit using only the
     811                 :            :          * non-enabled ones.
     812                 :            :          */
     813         [ #  # ]:          0 :         if (ignore_for_tim == BIT(IEEE80211_NUM_ACS) - 1)
     814                 :          0 :                 ignore_for_tim = 0;
     815                 :            : 
     816         [ #  # ]:          0 :         if (ignore_pending)
     817                 :          0 :                 ignore_for_tim = BIT(IEEE80211_NUM_ACS) - 1;
     818                 :            : 
     819         [ #  # ]:          0 :         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
     820                 :          0 :                 unsigned long tids;
     821                 :            : 
     822         [ #  # ]:          0 :                 if (ignore_for_tim & ieee80211_ac_to_qos_mask[ac])
     823                 :          0 :                         continue;
     824                 :            : 
     825   [ #  #  #  # ]:          0 :                 indicate_tim |= !skb_queue_empty(&sta->tx_filtered[ac]) ||
     826         [ #  # ]:          0 :                                 !skb_queue_empty(&sta->ps_tx_buf[ac]);
     827         [ #  # ]:          0 :                 if (indicate_tim)
     828                 :            :                         break;
     829                 :            : 
     830                 :          0 :                 tids = ieee80211_tids_for_ac(ac);
     831                 :            : 
     832                 :          0 :                 indicate_tim |=
     833                 :          0 :                         sta->driver_buffered_tids & tids;
     834                 :          0 :                 indicate_tim |=
     835                 :          0 :                         sta->txq_buffered_tids & tids;
     836                 :            :         }
     837                 :            : 
     838                 :          0 :  done:
     839                 :          0 :         spin_lock_bh(&local->tim_lock);
     840                 :            : 
     841         [ #  # ]:          0 :         if (indicate_tim == __bss_tim_get(ps->tim, id))
     842                 :          0 :                 goto out_unlock;
     843                 :            : 
     844         [ #  # ]:          0 :         if (indicate_tim)
     845                 :          0 :                 __bss_tim_set(ps->tim, id);
     846                 :            :         else
     847                 :          0 :                 __bss_tim_clear(ps->tim, id);
     848                 :            : 
     849   [ #  #  #  #  :          0 :         if (local->ops->set_tim && !WARN_ON(sta->dead)) {
                   #  # ]
     850                 :          0 :                 local->tim_in_locked_section = true;
     851                 :          0 :                 drv_set_tim(local, &sta->sta, indicate_tim);
     852                 :          0 :                 local->tim_in_locked_section = false;
     853                 :            :         }
     854                 :            : 
     855                 :          0 : out_unlock:
     856                 :          0 :         spin_unlock_bh(&local->tim_lock);
     857                 :            : }
     858                 :            : 
     859                 :          0 : void sta_info_recalc_tim(struct sta_info *sta)
     860                 :            : {
     861                 :          0 :         __sta_info_recalc_tim(sta, false);
     862                 :          0 : }
     863                 :            : 
     864                 :          0 : static bool sta_info_buffer_expired(struct sta_info *sta, struct sk_buff *skb)
     865                 :            : {
     866                 :          0 :         struct ieee80211_tx_info *info;
     867                 :          0 :         int timeout;
     868                 :            : 
     869                 :          0 :         if (!skb)
     870                 :            :                 return false;
     871                 :            : 
     872   [ #  #  #  # ]:          0 :         info = IEEE80211_SKB_CB(skb);
     873                 :            : 
     874                 :            :         /* Timeout: (2 * listen_interval * beacon_int * 1024 / 1000000) sec */
     875                 :          0 :         timeout = (sta->listen_interval *
     876                 :          0 :                    sta->sdata->vif.bss_conf.beacon_int *
     877                 :          0 :                    32 / 15625) * HZ;
     878                 :          0 :         if (timeout < STA_TX_BUFFER_EXPIRE)
     879                 :            :                 timeout = STA_TX_BUFFER_EXPIRE;
     880   [ #  #  #  # ]:          0 :         return time_after(jiffies, info->control.jiffies + timeout);
     881                 :            : }
     882                 :            : 
     883                 :            : 
     884                 :          0 : static bool sta_info_cleanup_expire_buffered_ac(struct ieee80211_local *local,
     885                 :            :                                                 struct sta_info *sta, int ac)
     886                 :            : {
     887                 :          0 :         unsigned long flags;
     888                 :          0 :         struct sk_buff *skb;
     889                 :            : 
     890                 :            :         /*
     891                 :            :          * First check for frames that should expire on the filtered
     892                 :            :          * queue. Frames here were rejected by the driver and are on
     893                 :            :          * a separate queue to avoid reordering with normal PS-buffered
     894                 :            :          * frames. They also aren't accounted for right now in the
     895                 :            :          * total_ps_buffered counter.
     896                 :            :          */
     897                 :          0 :         for (;;) {
     898                 :          0 :                 spin_lock_irqsave(&sta->tx_filtered[ac].lock, flags);
     899         [ #  # ]:          0 :                 skb = skb_peek(&sta->tx_filtered[ac]);
     900   [ #  #  #  # ]:          0 :                 if (sta_info_buffer_expired(sta, skb))
     901         [ #  # ]:          0 :                         skb = __skb_dequeue(&sta->tx_filtered[ac]);
     902                 :            :                 else
     903                 :            :                         skb = NULL;
     904                 :          0 :                 spin_unlock_irqrestore(&sta->tx_filtered[ac].lock, flags);
     905                 :            : 
     906                 :            :                 /*
     907                 :            :                  * Frames are queued in order, so if this one
     908                 :            :                  * hasn't expired yet we can stop testing. If
     909                 :            :                  * we actually reached the end of the queue we
     910                 :            :                  * also need to stop, of course.
     911                 :            :                  */
     912         [ #  # ]:          0 :                 if (!skb)
     913                 :            :                         break;
     914                 :          0 :                 ieee80211_free_txskb(&local->hw, skb);
     915                 :            :         }
     916                 :            : 
     917                 :            :         /*
     918                 :            :          * Now also check the normal PS-buffered queue, this will
     919                 :            :          * only find something if the filtered queue was emptied
     920                 :            :          * since the filtered frames are all before the normal PS
     921                 :            :          * buffered frames.
     922                 :            :          */
     923                 :          0 :         for (;;) {
     924                 :          0 :                 spin_lock_irqsave(&sta->ps_tx_buf[ac].lock, flags);
     925         [ #  # ]:          0 :                 skb = skb_peek(&sta->ps_tx_buf[ac]);
     926   [ #  #  #  # ]:          0 :                 if (sta_info_buffer_expired(sta, skb))
     927                 :          0 :                         skb = __skb_dequeue(&sta->ps_tx_buf[ac]);
     928                 :            :                 else
     929                 :            :                         skb = NULL;
     930                 :          0 :                 spin_unlock_irqrestore(&sta->ps_tx_buf[ac].lock, flags);
     931                 :            : 
     932                 :            :                 /*
     933                 :            :                  * frames are queued in order, so if this one
     934                 :            :                  * hasn't expired yet (or we reached the end of
     935                 :            :                  * the queue) we can stop testing
     936                 :            :                  */
     937         [ #  # ]:          0 :                 if (!skb)
     938                 :            :                         break;
     939                 :            : 
     940                 :          0 :                 local->total_ps_buffered--;
     941                 :          0 :                 ps_dbg(sta->sdata, "Buffered frame expired (STA %pM)\n",
     942                 :            :                        sta->sta.addr);
     943                 :          0 :                 ieee80211_free_txskb(&local->hw, skb);
     944                 :            :         }
     945                 :            : 
     946                 :            :         /*
     947                 :            :          * Finally, recalculate the TIM bit for this station -- it might
     948                 :            :          * now be clear because the station was too slow to retrieve its
     949                 :            :          * frames.
     950                 :            :          */
     951                 :          0 :         sta_info_recalc_tim(sta);
     952                 :            : 
     953                 :            :         /*
     954                 :            :          * Return whether there are any frames still buffered, this is
     955                 :            :          * used to check whether the cleanup timer still needs to run,
     956                 :            :          * if there are no frames we don't need to rearm the timer.
     957                 :            :          */
     958   [ #  #  #  # ]:          0 :         return !(skb_queue_empty(&sta->ps_tx_buf[ac]) &&
     959                 :            :                  skb_queue_empty(&sta->tx_filtered[ac]));
     960                 :            : }
     961                 :            : 
     962                 :          0 : static bool sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
     963                 :            :                                              struct sta_info *sta)
     964                 :            : {
     965                 :          0 :         bool have_buffered = false;
     966                 :          0 :         int ac;
     967                 :            : 
     968                 :            :         /* This is only necessary for stations on BSS/MBSS interfaces */
     969         [ #  # ]:          0 :         if (!sta->sdata->bss &&
     970                 :            :             !ieee80211_vif_is_mesh(&sta->sdata->vif))
     971                 :            :                 return false;
     972                 :            : 
     973         [ #  # ]:          0 :         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
     974                 :          0 :                 have_buffered |=
     975                 :          0 :                         sta_info_cleanup_expire_buffered_ac(local, sta, ac);
     976                 :            : 
     977                 :            :         return have_buffered;
     978                 :            : }
     979                 :            : 
     980                 :          0 : static int __must_check __sta_info_destroy_part1(struct sta_info *sta)
     981                 :            : {
     982                 :          0 :         struct ieee80211_local *local;
     983                 :          0 :         struct ieee80211_sub_if_data *sdata;
     984                 :          0 :         int ret;
     985                 :            : 
     986                 :          0 :         might_sleep();
     987                 :            : 
     988         [ #  # ]:          0 :         if (!sta)
     989                 :            :                 return -ENOENT;
     990                 :            : 
     991                 :          0 :         local = sta->local;
     992                 :          0 :         sdata = sta->sdata;
     993                 :            : 
     994                 :          0 :         lockdep_assert_held(&local->sta_mtx);
     995                 :            : 
     996                 :            :         /*
     997                 :            :          * Before removing the station from the driver and
     998                 :            :          * rate control, it might still start new aggregation
     999                 :            :          * sessions -- block that to make sure the tear-down
    1000                 :            :          * will be sufficient.
    1001                 :            :          */
    1002                 :          0 :         set_sta_flag(sta, WLAN_STA_BLOCK_BA);
    1003                 :          0 :         ieee80211_sta_tear_down_BA_sessions(sta, AGG_STOP_DESTROY_STA);
    1004                 :            : 
    1005                 :            :         /*
    1006                 :            :          * Before removing the station from the driver there might be pending
    1007                 :            :          * rx frames on RSS queues sent prior to the disassociation - wait for
    1008                 :            :          * all such frames to be processed.
    1009                 :            :          */
    1010                 :          0 :         drv_sync_rx_queues(local, sta);
    1011                 :            : 
    1012                 :          0 :         ret = sta_info_hash_del(local, sta);
    1013   [ #  #  #  # ]:          0 :         if (WARN_ON(ret))
    1014                 :            :                 return ret;
    1015                 :            : 
    1016                 :            :         /*
    1017                 :            :          * for TDLS peers, make sure to return to the base channel before
    1018                 :            :          * removal.
    1019                 :            :          */
    1020         [ #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_TDLS_OFF_CHANNEL)) {
    1021                 :          0 :                 drv_tdls_cancel_channel_switch(local, sdata, &sta->sta);
    1022                 :          0 :                 clear_sta_flag(sta, WLAN_STA_TDLS_OFF_CHANNEL);
    1023                 :            :         }
    1024                 :            : 
    1025                 :          0 :         list_del_rcu(&sta->list);
    1026                 :          0 :         sta->removed = true;
    1027                 :            : 
    1028                 :          0 :         drv_sta_pre_rcu_remove(local, sta->sdata, sta);
    1029                 :            : 
    1030   [ #  #  #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
    1031         [ #  # ]:          0 :             rcu_access_pointer(sdata->u.vlan.sta) == sta)
    1032                 :          0 :                 RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
    1033                 :            : 
    1034                 :            :         return 0;
    1035                 :            : }
    1036                 :            : 
    1037                 :          0 : static void __sta_info_destroy_part2(struct sta_info *sta)
    1038                 :            : {
    1039                 :          0 :         struct ieee80211_local *local = sta->local;
    1040                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
    1041                 :          0 :         struct station_info *sinfo;
    1042                 :          0 :         int ret;
    1043                 :            : 
    1044                 :            :         /*
    1045                 :            :          * NOTE: This assumes at least synchronize_net() was done
    1046                 :            :          *       after _part1 and before _part2!
    1047                 :            :          */
    1048                 :            : 
    1049                 :          0 :         might_sleep();
    1050                 :          0 :         lockdep_assert_held(&local->sta_mtx);
    1051                 :            : 
    1052         [ #  # ]:          0 :         while (sta->sta_state == IEEE80211_STA_AUTHORIZED) {
    1053                 :          0 :                 ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
    1054         [ #  # ]:          0 :                 WARN_ON_ONCE(ret);
    1055                 :            :         }
    1056                 :            : 
    1057                 :            :         /* now keys can no longer be reached */
    1058                 :          0 :         ieee80211_free_sta_keys(local, sta);
    1059                 :            : 
    1060                 :            :         /* disable TIM bit - last chance to tell driver */
    1061                 :          0 :         __sta_info_recalc_tim(sta, true);
    1062                 :            : 
    1063                 :          0 :         sta->dead = true;
    1064                 :            : 
    1065                 :          0 :         local->num_sta--;
    1066                 :          0 :         local->sta_generation++;
    1067                 :            : 
    1068         [ #  # ]:          0 :         while (sta->sta_state > IEEE80211_STA_NONE) {
    1069                 :          0 :                 ret = sta_info_move_state(sta, sta->sta_state - 1);
    1070         [ #  # ]:          0 :                 if (ret) {
    1071                 :          0 :                         WARN_ON_ONCE(1);
    1072                 :          0 :                         break;
    1073                 :            :                 }
    1074                 :            :         }
    1075                 :            : 
    1076         [ #  # ]:          0 :         if (sta->uploaded) {
    1077                 :          0 :                 ret = drv_sta_state(local, sdata, sta, IEEE80211_STA_NONE,
    1078                 :            :                                     IEEE80211_STA_NOTEXIST);
    1079         [ #  # ]:          0 :                 WARN_ON_ONCE(ret != 0);
    1080                 :            :         }
    1081                 :            : 
    1082                 :          0 :         sta_dbg(sdata, "Removed STA %pM\n", sta->sta.addr);
    1083                 :            : 
    1084                 :          0 :         sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL);
    1085         [ #  # ]:          0 :         if (sinfo)
    1086                 :          0 :                 sta_set_sinfo(sta, sinfo, true);
    1087                 :          0 :         cfg80211_del_sta_sinfo(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL);
    1088                 :          0 :         kfree(sinfo);
    1089                 :            : 
    1090                 :          0 :         ieee80211_sta_debugfs_remove(sta);
    1091                 :            : 
    1092                 :          0 :         cleanup_single_sta(sta);
    1093                 :          0 : }
    1094                 :            : 
    1095                 :          0 : int __must_check __sta_info_destroy(struct sta_info *sta)
    1096                 :            : {
    1097                 :          0 :         int err = __sta_info_destroy_part1(sta);
    1098                 :            : 
    1099         [ #  # ]:          0 :         if (err)
    1100                 :            :                 return err;
    1101                 :            : 
    1102                 :          0 :         synchronize_net();
    1103                 :            : 
    1104                 :          0 :         __sta_info_destroy_part2(sta);
    1105                 :            : 
    1106                 :          0 :         return 0;
    1107                 :            : }
    1108                 :            : 
    1109                 :          0 : int sta_info_destroy_addr(struct ieee80211_sub_if_data *sdata, const u8 *addr)
    1110                 :            : {
    1111                 :          0 :         struct sta_info *sta;
    1112                 :          0 :         int ret;
    1113                 :            : 
    1114                 :          0 :         mutex_lock(&sdata->local->sta_mtx);
    1115                 :          0 :         sta = sta_info_get(sdata, addr);
    1116                 :          0 :         ret = __sta_info_destroy(sta);
    1117                 :          0 :         mutex_unlock(&sdata->local->sta_mtx);
    1118                 :            : 
    1119                 :          0 :         return ret;
    1120                 :            : }
    1121                 :            : 
    1122                 :          0 : int sta_info_destroy_addr_bss(struct ieee80211_sub_if_data *sdata,
    1123                 :            :                               const u8 *addr)
    1124                 :            : {
    1125                 :          0 :         struct sta_info *sta;
    1126                 :          0 :         int ret;
    1127                 :            : 
    1128                 :          0 :         mutex_lock(&sdata->local->sta_mtx);
    1129                 :          0 :         sta = sta_info_get_bss(sdata, addr);
    1130                 :          0 :         ret = __sta_info_destroy(sta);
    1131                 :          0 :         mutex_unlock(&sdata->local->sta_mtx);
    1132                 :            : 
    1133                 :          0 :         return ret;
    1134                 :            : }
    1135                 :            : 
    1136                 :          0 : static void sta_info_cleanup(struct timer_list *t)
    1137                 :            : {
    1138                 :          0 :         struct ieee80211_local *local = from_timer(local, t, sta_cleanup);
    1139                 :          0 :         struct sta_info *sta;
    1140                 :          0 :         bool timer_needed = false;
    1141                 :            : 
    1142                 :          0 :         rcu_read_lock();
    1143         [ #  # ]:          0 :         list_for_each_entry_rcu(sta, &local->sta_list, list)
    1144         [ #  # ]:          0 :                 if (sta_info_cleanup_expire_buffered(local, sta))
    1145                 :          0 :                         timer_needed = true;
    1146                 :          0 :         rcu_read_unlock();
    1147                 :            : 
    1148         [ #  # ]:          0 :         if (local->quiescing)
    1149                 :            :                 return;
    1150                 :            : 
    1151         [ #  # ]:          0 :         if (!timer_needed)
    1152                 :            :                 return;
    1153                 :            : 
    1154                 :          0 :         mod_timer(&local->sta_cleanup,
    1155                 :            :                   round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL));
    1156                 :            : }
    1157                 :            : 
    1158                 :          0 : int sta_info_init(struct ieee80211_local *local)
    1159                 :            : {
    1160                 :          0 :         int err;
    1161                 :            : 
    1162                 :          0 :         err = rhltable_init(&local->sta_hash, &sta_rht_params);
    1163         [ #  # ]:          0 :         if (err)
    1164                 :            :                 return err;
    1165                 :            : 
    1166                 :          0 :         spin_lock_init(&local->tim_lock);
    1167                 :          0 :         mutex_init(&local->sta_mtx);
    1168                 :          0 :         INIT_LIST_HEAD(&local->sta_list);
    1169                 :            : 
    1170                 :          0 :         timer_setup(&local->sta_cleanup, sta_info_cleanup, 0);
    1171                 :          0 :         return 0;
    1172                 :            : }
    1173                 :            : 
    1174                 :          0 : void sta_info_stop(struct ieee80211_local *local)
    1175                 :            : {
    1176                 :          0 :         del_timer_sync(&local->sta_cleanup);
    1177                 :          0 :         rhltable_destroy(&local->sta_hash);
    1178                 :          0 : }
    1179                 :            : 
    1180                 :            : 
    1181                 :          0 : int __sta_info_flush(struct ieee80211_sub_if_data *sdata, bool vlans)
    1182                 :            : {
    1183                 :          0 :         struct ieee80211_local *local = sdata->local;
    1184                 :          0 :         struct sta_info *sta, *tmp;
    1185                 :          0 :         LIST_HEAD(free_list);
    1186                 :          0 :         int ret = 0;
    1187                 :            : 
    1188                 :          0 :         might_sleep();
    1189                 :            : 
    1190   [ #  #  #  #  :          0 :         WARN_ON(vlans && sdata->vif.type != NL80211_IFTYPE_AP);
                   #  # ]
    1191   [ #  #  #  #  :          0 :         WARN_ON(vlans && !sdata->bss);
                   #  # ]
    1192                 :            : 
    1193                 :          0 :         mutex_lock(&local->sta_mtx);
    1194         [ #  # ]:          0 :         list_for_each_entry_safe(sta, tmp, &local->sta_list, list) {
    1195   [ #  #  #  # ]:          0 :                 if (sdata == sta->sdata ||
    1196         [ #  # ]:          0 :                     (vlans && sdata->bss == sta->sdata->bss)) {
    1197   [ #  #  #  # ]:          0 :                         if (!WARN_ON(__sta_info_destroy_part1(sta)))
    1198                 :          0 :                                 list_add(&sta->free_list, &free_list);
    1199                 :          0 :                         ret++;
    1200                 :            :                 }
    1201                 :            :         }
    1202                 :            : 
    1203         [ #  # ]:          0 :         if (!list_empty(&free_list)) {
    1204                 :          0 :                 synchronize_net();
    1205         [ #  # ]:          0 :                 list_for_each_entry_safe(sta, tmp, &free_list, free_list)
    1206                 :          0 :                         __sta_info_destroy_part2(sta);
    1207                 :            :         }
    1208                 :          0 :         mutex_unlock(&local->sta_mtx);
    1209                 :            : 
    1210                 :          0 :         return ret;
    1211                 :            : }
    1212                 :            : 
    1213                 :          0 : void ieee80211_sta_expire(struct ieee80211_sub_if_data *sdata,
    1214                 :            :                           unsigned long exp_time)
    1215                 :            : {
    1216                 :          0 :         struct ieee80211_local *local = sdata->local;
    1217                 :          0 :         struct sta_info *sta, *tmp;
    1218                 :            : 
    1219                 :          0 :         mutex_lock(&local->sta_mtx);
    1220                 :            : 
    1221         [ #  # ]:          0 :         list_for_each_entry_safe(sta, tmp, &local->sta_list, list) {
    1222                 :          0 :                 unsigned long last_active = ieee80211_sta_last_active(sta);
    1223                 :            : 
    1224         [ #  # ]:          0 :                 if (sdata != sta->sdata)
    1225                 :          0 :                         continue;
    1226                 :            : 
    1227         [ #  # ]:          0 :                 if (time_is_before_jiffies(last_active + exp_time)) {
    1228                 :          0 :                         sta_dbg(sta->sdata, "expiring inactive STA %pM\n",
    1229                 :            :                                 sta->sta.addr);
    1230                 :            : 
    1231                 :          0 :                         if (ieee80211_vif_is_mesh(&sdata->vif) &&
    1232                 :            :                             test_sta_flag(sta, WLAN_STA_PS_STA))
    1233                 :            :                                 atomic_dec(&sdata->u.mesh.ps.num_sta_ps);
    1234                 :            : 
    1235         [ #  # ]:          0 :                         WARN_ON(__sta_info_destroy(sta));
    1236                 :            :                 }
    1237                 :            :         }
    1238                 :            : 
    1239                 :          0 :         mutex_unlock(&local->sta_mtx);
    1240                 :          0 : }
    1241                 :            : 
    1242                 :          0 : struct ieee80211_sta *ieee80211_find_sta_by_ifaddr(struct ieee80211_hw *hw,
    1243                 :            :                                                    const u8 *addr,
    1244                 :            :                                                    const u8 *localaddr)
    1245                 :            : {
    1246                 :          0 :         struct ieee80211_local *local = hw_to_local(hw);
    1247                 :          0 :         struct rhlist_head *tmp;
    1248                 :          0 :         struct sta_info *sta;
    1249                 :            : 
    1250                 :            :         /*
    1251                 :            :          * Just return a random station if localaddr is NULL
    1252                 :            :          * ... first in list.
    1253                 :            :          */
    1254         [ #  # ]:          0 :         for_each_sta_info(local, addr, sta, tmp) {
    1255   [ #  #  #  # ]:          0 :                 if (localaddr &&
    1256         [ #  # ]:          0 :                     !ether_addr_equal(sta->sdata->vif.addr, localaddr))
    1257                 :          0 :                         continue;
    1258         [ #  # ]:          0 :                 if (!sta->uploaded)
    1259                 :            :                         return NULL;
    1260                 :          0 :                 return &sta->sta;
    1261                 :            :         }
    1262                 :            : 
    1263                 :            :         return NULL;
    1264                 :            : }
    1265                 :            : EXPORT_SYMBOL_GPL(ieee80211_find_sta_by_ifaddr);
    1266                 :            : 
    1267                 :          0 : struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_vif *vif,
    1268                 :            :                                          const u8 *addr)
    1269                 :            : {
    1270                 :          0 :         struct sta_info *sta;
    1271                 :            : 
    1272         [ #  # ]:          0 :         if (!vif)
    1273                 :            :                 return NULL;
    1274                 :            : 
    1275                 :          0 :         sta = sta_info_get_bss(vif_to_sdata(vif), addr);
    1276         [ #  # ]:          0 :         if (!sta)
    1277                 :            :                 return NULL;
    1278                 :            : 
    1279         [ #  # ]:          0 :         if (!sta->uploaded)
    1280                 :            :                 return NULL;
    1281                 :            : 
    1282                 :          0 :         return &sta->sta;
    1283                 :            : }
    1284                 :            : EXPORT_SYMBOL(ieee80211_find_sta);
    1285                 :            : 
    1286                 :            : /* powersave support code */
    1287                 :          0 : void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
    1288                 :            : {
    1289                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
    1290                 :          0 :         struct ieee80211_local *local = sdata->local;
    1291                 :          0 :         struct sk_buff_head pending;
    1292                 :          0 :         int filtered = 0, buffered = 0, ac, i;
    1293                 :          0 :         unsigned long flags;
    1294                 :          0 :         struct ps_data *ps;
    1295                 :            : 
    1296         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
    1297                 :          0 :                 sdata = container_of(sdata->bss, struct ieee80211_sub_if_data,
    1298                 :            :                                      u.ap);
    1299                 :            : 
    1300         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_AP)
    1301                 :          0 :                 ps = &sdata->bss->ps;
    1302                 :          0 :         else if (ieee80211_vif_is_mesh(&sdata->vif))
    1303                 :            :                 ps = &sdata->u.mesh.ps;
    1304                 :            :         else
    1305                 :          0 :                 return;
    1306                 :            : 
    1307                 :          0 :         clear_sta_flag(sta, WLAN_STA_SP);
    1308                 :            : 
    1309                 :          0 :         BUILD_BUG_ON(BITS_TO_LONGS(IEEE80211_NUM_TIDS) > 1);
    1310                 :          0 :         sta->driver_buffered_tids = 0;
    1311                 :          0 :         sta->txq_buffered_tids = 0;
    1312                 :            : 
    1313         [ #  # ]:          0 :         if (!ieee80211_hw_check(&local->hw, AP_LINK_PS))
    1314                 :          0 :                 drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta);
    1315                 :            : 
    1316         [ #  # ]:          0 :         for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
    1317   [ #  #  #  # ]:          0 :                 if (!sta->sta.txq[i] || !txq_has_queue(sta->sta.txq[i]))
    1318                 :          0 :                         continue;
    1319                 :            : 
    1320                 :          0 :                 schedule_and_wake_txq(local, to_txq_info(sta->sta.txq[i]));
    1321                 :            :         }
    1322                 :            : 
    1323                 :          0 :         skb_queue_head_init(&pending);
    1324                 :            : 
    1325                 :            :         /* sync with ieee80211_tx_h_unicast_ps_buf */
    1326                 :          0 :         spin_lock(&sta->ps_lock);
    1327                 :            :         /* Send all buffered frames to the station */
    1328         [ #  # ]:          0 :         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
    1329                 :          0 :                 int count = skb_queue_len(&pending), tmp;
    1330                 :            : 
    1331                 :          0 :                 spin_lock_irqsave(&sta->tx_filtered[ac].lock, flags);
    1332         [ #  # ]:          0 :                 skb_queue_splice_tail_init(&sta->tx_filtered[ac], &pending);
    1333                 :          0 :                 spin_unlock_irqrestore(&sta->tx_filtered[ac].lock, flags);
    1334                 :          0 :                 tmp = skb_queue_len(&pending);
    1335                 :          0 :                 filtered += tmp - count;
    1336                 :          0 :                 count = tmp;
    1337                 :            : 
    1338                 :          0 :                 spin_lock_irqsave(&sta->ps_tx_buf[ac].lock, flags);
    1339         [ #  # ]:          0 :                 skb_queue_splice_tail_init(&sta->ps_tx_buf[ac], &pending);
    1340                 :          0 :                 spin_unlock_irqrestore(&sta->ps_tx_buf[ac].lock, flags);
    1341                 :          0 :                 tmp = skb_queue_len(&pending);
    1342                 :          0 :                 buffered += tmp - count;
    1343                 :            :         }
    1344                 :            : 
    1345                 :          0 :         ieee80211_add_pending_skbs(local, &pending);
    1346                 :            : 
    1347                 :            :         /* now we're no longer in the deliver code */
    1348                 :          0 :         clear_sta_flag(sta, WLAN_STA_PS_DELIVER);
    1349                 :            : 
    1350                 :            :         /* The station might have polled and then woken up before we responded,
    1351                 :            :          * so clear these flags now to avoid them sticking around.
    1352                 :            :          */
    1353                 :          0 :         clear_sta_flag(sta, WLAN_STA_PSPOLL);
    1354                 :          0 :         clear_sta_flag(sta, WLAN_STA_UAPSD);
    1355                 :          0 :         spin_unlock(&sta->ps_lock);
    1356                 :            : 
    1357                 :          0 :         atomic_dec(&ps->num_sta_ps);
    1358                 :            : 
    1359                 :            :         /* This station just woke up and isn't aware of our SMPS state */
    1360         [ #  # ]:          0 :         if (!ieee80211_vif_is_mesh(&sdata->vif) &&
    1361                 :          0 :             !ieee80211_smps_is_restrictive(sta->known_smps_mode,
    1362                 :          0 :                                            sdata->smps_mode) &&
    1363         [ #  # ]:          0 :             sta->known_smps_mode != sdata->bss->req_smps &&
    1364         [ #  # ]:          0 :             sta_info_tx_streams(sta) != 1) {
    1365                 :          0 :                 ht_dbg(sdata,
    1366                 :            :                        "%pM just woke up and MIMO capable - update SMPS\n",
    1367                 :            :                        sta->sta.addr);
    1368                 :          0 :                 ieee80211_send_smps_action(sdata, sdata->bss->req_smps,
    1369                 :          0 :                                            sta->sta.addr,
    1370                 :            :                                            sdata->vif.bss_conf.bssid);
    1371                 :            :         }
    1372                 :            : 
    1373                 :          0 :         local->total_ps_buffered -= buffered;
    1374                 :            : 
    1375                 :          0 :         sta_info_recalc_tim(sta);
    1376                 :            : 
    1377                 :          0 :         ps_dbg(sdata,
    1378                 :            :                "STA %pM aid %d sending %d filtered/%d PS frames since STA woke up\n",
    1379                 :            :                sta->sta.addr, sta->sta.aid, filtered, buffered);
    1380                 :            : 
    1381                 :          0 :         ieee80211_check_fast_xmit(sta);
    1382                 :            : }
    1383                 :            : 
    1384                 :          0 : static void ieee80211_send_null_response(struct sta_info *sta, int tid,
    1385                 :            :                                          enum ieee80211_frame_release_type reason,
    1386                 :            :                                          bool call_driver, bool more_data)
    1387                 :            : {
    1388                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
    1389                 :          0 :         struct ieee80211_local *local = sdata->local;
    1390                 :          0 :         struct ieee80211_qos_hdr *nullfunc;
    1391                 :          0 :         struct sk_buff *skb;
    1392                 :          0 :         int size = sizeof(*nullfunc);
    1393                 :          0 :         __le16 fc;
    1394                 :          0 :         bool qos = sta->sta.wme;
    1395                 :          0 :         struct ieee80211_tx_info *info;
    1396                 :          0 :         struct ieee80211_chanctx_conf *chanctx_conf;
    1397                 :            : 
    1398                 :            :         /* Don't send NDPs when STA is connected HE */
    1399         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_STATION &&
    1400         [ #  # ]:          0 :             !(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE))
    1401                 :            :                 return;
    1402                 :            : 
    1403         [ #  # ]:          0 :         if (qos) {
    1404                 :            :                 fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
    1405                 :            :                                  IEEE80211_STYPE_QOS_NULLFUNC |
    1406                 :            :                                  IEEE80211_FCTL_FROMDS);
    1407                 :            :         } else {
    1408                 :          0 :                 size -= 2;
    1409                 :          0 :                 fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
    1410                 :            :                                  IEEE80211_STYPE_NULLFUNC |
    1411                 :            :                                  IEEE80211_FCTL_FROMDS);
    1412                 :            :         }
    1413                 :            : 
    1414                 :          0 :         skb = dev_alloc_skb(local->hw.extra_tx_headroom + size);
    1415         [ #  # ]:          0 :         if (!skb)
    1416                 :            :                 return;
    1417                 :            : 
    1418                 :          0 :         skb_reserve(skb, local->hw.extra_tx_headroom);
    1419                 :            : 
    1420                 :          0 :         nullfunc = skb_put(skb, size);
    1421                 :          0 :         nullfunc->frame_control = fc;
    1422                 :          0 :         nullfunc->duration_id = 0;
    1423                 :          0 :         memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN);
    1424                 :          0 :         memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
    1425                 :          0 :         memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN);
    1426                 :          0 :         nullfunc->seq_ctrl = 0;
    1427                 :            : 
    1428                 :          0 :         skb->priority = tid;
    1429         [ #  # ]:          0 :         skb_set_queue_mapping(skb, ieee802_1d_to_ac[tid]);
    1430         [ #  # ]:          0 :         if (qos) {
    1431                 :          0 :                 nullfunc->qos_ctrl = cpu_to_le16(tid);
    1432                 :            : 
    1433         [ #  # ]:          0 :                 if (reason == IEEE80211_FRAME_RELEASE_UAPSD) {
    1434                 :          0 :                         nullfunc->qos_ctrl |=
    1435                 :            :                                 cpu_to_le16(IEEE80211_QOS_CTL_EOSP);
    1436         [ #  # ]:          0 :                         if (more_data)
    1437                 :          0 :                                 nullfunc->frame_control |=
    1438                 :            :                                         cpu_to_le16(IEEE80211_FCTL_MOREDATA);
    1439                 :            :                 }
    1440                 :            :         }
    1441                 :            : 
    1442         [ #  # ]:          0 :         info = IEEE80211_SKB_CB(skb);
    1443                 :            : 
    1444                 :            :         /*
    1445                 :            :          * Tell TX path to send this frame even though the
    1446                 :            :          * STA may still remain is PS mode after this frame
    1447                 :            :          * exchange. Also set EOSP to indicate this packet
    1448                 :            :          * ends the poll/service period.
    1449                 :            :          */
    1450                 :          0 :         info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER |
    1451                 :            :                        IEEE80211_TX_STATUS_EOSP |
    1452                 :            :                        IEEE80211_TX_CTL_REQ_TX_STATUS;
    1453                 :            : 
    1454                 :          0 :         info->control.flags |= IEEE80211_TX_CTRL_PS_RESPONSE;
    1455                 :            : 
    1456         [ #  # ]:          0 :         if (call_driver)
    1457                 :          0 :                 drv_allow_buffered_frames(local, sta, BIT(tid), 1,
    1458                 :            :                                           reason, false);
    1459                 :            : 
    1460                 :          0 :         skb->dev = sdata->dev;
    1461                 :            : 
    1462                 :          0 :         rcu_read_lock();
    1463         [ #  # ]:          0 :         chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
    1464   [ #  #  #  # ]:          0 :         if (WARN_ON(!chanctx_conf)) {
    1465                 :          0 :                 rcu_read_unlock();
    1466                 :          0 :                 kfree_skb(skb);
    1467                 :          0 :                 return;
    1468                 :            :         }
    1469                 :            : 
    1470                 :          0 :         info->band = chanctx_conf->def.chan->band;
    1471                 :          0 :         ieee80211_xmit(sdata, sta, skb, 0);
    1472                 :          0 :         rcu_read_unlock();
    1473                 :            : }
    1474                 :            : 
    1475                 :          0 : static int find_highest_prio_tid(unsigned long tids)
    1476                 :            : {
    1477                 :            :         /* lower 3 TIDs aren't ordered perfectly */
    1478                 :          0 :         if (tids & 0xF8)
    1479                 :          0 :                 return fls(tids) - 1;
    1480                 :            :         /* TID 0 is BE just like TID 3 */
    1481   [ #  #  #  # ]:          0 :         if (tids & BIT(0))
    1482                 :            :                 return 0;
    1483                 :          0 :         return fls(tids) - 1;
    1484                 :            : }
    1485                 :            : 
    1486                 :            : /* Indicates if the MORE_DATA bit should be set in the last
    1487                 :            :  * frame obtained by ieee80211_sta_ps_get_frames.
    1488                 :            :  * Note that driver_release_tids is relevant only if
    1489                 :            :  * reason = IEEE80211_FRAME_RELEASE_PSPOLL
    1490                 :            :  */
    1491                 :            : static bool
    1492                 :          0 : ieee80211_sta_ps_more_data(struct sta_info *sta, u8 ignored_acs,
    1493                 :            :                            enum ieee80211_frame_release_type reason,
    1494                 :            :                            unsigned long driver_release_tids)
    1495                 :            : {
    1496                 :          0 :         int ac;
    1497                 :            : 
    1498                 :            :         /* If the driver has data on more than one TID then
    1499                 :            :          * certainly there's more data if we release just a
    1500                 :            :          * single frame now (from a single TID). This will
    1501                 :            :          * only happen for PS-Poll.
    1502                 :            :          */
    1503   [ #  #  #  # ]:          0 :         if (reason == IEEE80211_FRAME_RELEASE_PSPOLL &&
    1504         [ #  # ]:          0 :             hweight16(driver_release_tids) > 1)
    1505                 :            :                 return true;
    1506                 :            : 
    1507         [ #  # ]:          0 :         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
    1508         [ #  # ]:          0 :                 if (ignored_acs & ieee80211_ac_to_qos_mask[ac])
    1509                 :          0 :                         continue;
    1510                 :            : 
    1511   [ #  #  #  # ]:          0 :                 if (!skb_queue_empty(&sta->tx_filtered[ac]) ||
    1512         [ #  # ]:          0 :                     !skb_queue_empty(&sta->ps_tx_buf[ac]))
    1513                 :            :                         return true;
    1514                 :            :         }
    1515                 :            : 
    1516                 :            :         return false;
    1517                 :            : }
    1518                 :            : 
    1519                 :            : static void
    1520                 :          0 : ieee80211_sta_ps_get_frames(struct sta_info *sta, int n_frames, u8 ignored_acs,
    1521                 :            :                             enum ieee80211_frame_release_type reason,
    1522                 :            :                             struct sk_buff_head *frames,
    1523                 :            :                             unsigned long *driver_release_tids)
    1524                 :            : {
    1525                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
    1526                 :          0 :         struct ieee80211_local *local = sdata->local;
    1527                 :          0 :         int ac;
    1528                 :            : 
    1529                 :            :         /* Get response frame(s) and more data bit for the last one. */
    1530         [ #  # ]:          0 :         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
    1531                 :          0 :                 unsigned long tids;
    1532                 :            : 
    1533         [ #  # ]:          0 :                 if (ignored_acs & ieee80211_ac_to_qos_mask[ac])
    1534                 :          0 :                         continue;
    1535                 :            : 
    1536                 :          0 :                 tids = ieee80211_tids_for_ac(ac);
    1537                 :            : 
    1538                 :            :                 /* if we already have frames from software, then we can't also
    1539                 :            :                  * release from hardware queues
    1540                 :            :                  */
    1541         [ #  # ]:          0 :                 if (skb_queue_empty(frames)) {
    1542                 :          0 :                         *driver_release_tids |=
    1543                 :          0 :                                 sta->driver_buffered_tids & tids;
    1544                 :          0 :                         *driver_release_tids |= sta->txq_buffered_tids & tids;
    1545                 :            :                 }
    1546                 :            : 
    1547         [ #  # ]:          0 :                 if (!*driver_release_tids) {
    1548                 :            :                         struct sk_buff *skb;
    1549                 :            : 
    1550         [ #  # ]:          0 :                         while (n_frames > 0) {
    1551                 :          0 :                                 skb = skb_dequeue(&sta->tx_filtered[ac]);
    1552         [ #  # ]:          0 :                                 if (!skb) {
    1553                 :          0 :                                         skb = skb_dequeue(
    1554                 :            :                                                 &sta->ps_tx_buf[ac]);
    1555         [ #  # ]:          0 :                                         if (skb)
    1556                 :          0 :                                                 local->total_ps_buffered--;
    1557                 :            :                                 }
    1558         [ #  # ]:          0 :                                 if (!skb)
    1559                 :            :                                         break;
    1560                 :          0 :                                 n_frames--;
    1561                 :          0 :                                 __skb_queue_tail(frames, skb);
    1562                 :            :                         }
    1563                 :            :                 }
    1564                 :            : 
    1565                 :            :                 /* If we have more frames buffered on this AC, then abort the
    1566                 :            :                  * loop since we can't send more data from other ACs before
    1567                 :            :                  * the buffered frames from this.
    1568                 :            :                  */
    1569   [ #  #  #  # ]:          0 :                 if (!skb_queue_empty(&sta->tx_filtered[ac]) ||
    1570         [ #  # ]:          0 :                     !skb_queue_empty(&sta->ps_tx_buf[ac]))
    1571                 :            :                         break;
    1572                 :            :         }
    1573                 :          0 : }
    1574                 :            : 
    1575                 :            : static void
    1576                 :          0 : ieee80211_sta_ps_deliver_response(struct sta_info *sta,
    1577                 :            :                                   int n_frames, u8 ignored_acs,
    1578                 :            :                                   enum ieee80211_frame_release_type reason)
    1579                 :            : {
    1580                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
    1581                 :          0 :         struct ieee80211_local *local = sdata->local;
    1582                 :          0 :         unsigned long driver_release_tids = 0;
    1583                 :          0 :         struct sk_buff_head frames;
    1584                 :          0 :         bool more_data;
    1585                 :            : 
    1586                 :            :         /* Service or PS-Poll period starts */
    1587                 :          0 :         set_sta_flag(sta, WLAN_STA_SP);
    1588                 :            : 
    1589                 :          0 :         __skb_queue_head_init(&frames);
    1590                 :            : 
    1591                 :          0 :         ieee80211_sta_ps_get_frames(sta, n_frames, ignored_acs, reason,
    1592                 :            :                                     &frames, &driver_release_tids);
    1593                 :            : 
    1594                 :          0 :         more_data = ieee80211_sta_ps_more_data(sta, ignored_acs, reason, driver_release_tids);
    1595                 :            : 
    1596   [ #  #  #  # ]:          0 :         if (driver_release_tids && reason == IEEE80211_FRAME_RELEASE_PSPOLL)
    1597         [ #  # ]:          0 :                 driver_release_tids =
    1598                 :          0 :                         BIT(find_highest_prio_tid(driver_release_tids));
    1599                 :            : 
    1600   [ #  #  #  # ]:          0 :         if (skb_queue_empty(&frames) && !driver_release_tids) {
    1601                 :            :                 int tid, ac;
    1602                 :            : 
    1603                 :            :                 /*
    1604                 :            :                  * For PS-Poll, this can only happen due to a race condition
    1605                 :            :                  * when we set the TIM bit and the station notices it, but
    1606                 :            :                  * before it can poll for the frame we expire it.
    1607                 :            :                  *
    1608                 :            :                  * For uAPSD, this is said in the standard (11.2.1.5 h):
    1609                 :            :                  *      At each unscheduled SP for a non-AP STA, the AP shall
    1610                 :            :                  *      attempt to transmit at least one MSDU or MMPDU, but no
    1611                 :            :                  *      more than the value specified in the Max SP Length field
    1612                 :            :                  *      in the QoS Capability element from delivery-enabled ACs,
    1613                 :            :                  *      that are destined for the non-AP STA.
    1614                 :            :                  *
    1615                 :            :                  * Since we have no other MSDU/MMPDU, transmit a QoS null frame.
    1616                 :            :                  */
    1617                 :            : 
    1618                 :            :                 /* This will evaluate to 1, 3, 5 or 7. */
    1619         [ #  # ]:          0 :                 for (ac = IEEE80211_AC_VO; ac < IEEE80211_NUM_ACS; ac++)
    1620         [ #  # ]:          0 :                         if (!(ignored_acs & ieee80211_ac_to_qos_mask[ac]))
    1621                 :            :                                 break;
    1622                 :          0 :                 tid = 7 - 2 * ac;
    1623                 :            : 
    1624                 :          0 :                 ieee80211_send_null_response(sta, tid, reason, true, false);
    1625         [ #  # ]:          0 :         } else if (!driver_release_tids) {
    1626                 :          0 :                 struct sk_buff_head pending;
    1627                 :          0 :                 struct sk_buff *skb;
    1628                 :          0 :                 int num = 0;
    1629                 :          0 :                 u16 tids = 0;
    1630                 :          0 :                 bool need_null = false;
    1631                 :            : 
    1632                 :          0 :                 skb_queue_head_init(&pending);
    1633                 :            : 
    1634   [ #  #  #  # ]:          0 :                 while ((skb = __skb_dequeue(&frames))) {
    1635         [ #  # ]:          0 :                         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
    1636                 :          0 :                         struct ieee80211_hdr *hdr = (void *) skb->data;
    1637                 :          0 :                         u8 *qoshdr = NULL;
    1638                 :            : 
    1639                 :          0 :                         num++;
    1640                 :            : 
    1641                 :            :                         /*
    1642                 :            :                          * Tell TX path to send this frame even though the
    1643                 :            :                          * STA may still remain is PS mode after this frame
    1644                 :            :                          * exchange.
    1645                 :            :                          */
    1646                 :          0 :                         info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
    1647                 :          0 :                         info->control.flags |= IEEE80211_TX_CTRL_PS_RESPONSE;
    1648                 :            : 
    1649                 :            :                         /*
    1650                 :            :                          * Use MoreData flag to indicate whether there are
    1651                 :            :                          * more buffered frames for this STA
    1652                 :            :                          */
    1653   [ #  #  #  # ]:          0 :                         if (more_data || !skb_queue_empty(&frames))
    1654                 :          0 :                                 hdr->frame_control |=
    1655                 :            :                                         cpu_to_le16(IEEE80211_FCTL_MOREDATA);
    1656                 :            :                         else
    1657                 :          0 :                                 hdr->frame_control &=
    1658                 :            :                                         cpu_to_le16(~IEEE80211_FCTL_MOREDATA);
    1659                 :            : 
    1660   [ #  #  #  # ]:          0 :                         if (ieee80211_is_data_qos(hdr->frame_control) ||
    1661                 :            :                             ieee80211_is_qos_nullfunc(hdr->frame_control))
    1662         [ #  # ]:          0 :                                 qoshdr = ieee80211_get_qos_ctl(hdr);
    1663                 :            : 
    1664                 :          0 :                         tids |= BIT(skb->priority);
    1665                 :            : 
    1666         [ #  # ]:          0 :                         __skb_queue_tail(&pending, skb);
    1667                 :            : 
    1668                 :            :                         /* end service period after last frame or add one */
    1669         [ #  # ]:          0 :                         if (!skb_queue_empty(&frames))
    1670                 :          0 :                                 continue;
    1671                 :            : 
    1672         [ #  # ]:          0 :                         if (reason != IEEE80211_FRAME_RELEASE_UAPSD) {
    1673                 :            :                                 /* for PS-Poll, there's only one frame */
    1674                 :          0 :                                 info->flags |= IEEE80211_TX_STATUS_EOSP |
    1675                 :            :                                                IEEE80211_TX_CTL_REQ_TX_STATUS;
    1676                 :          0 :                                 break;
    1677                 :            :                         }
    1678                 :            : 
    1679                 :            :                         /* For uAPSD, things are a bit more complicated. If the
    1680                 :            :                          * last frame has a QoS header (i.e. is a QoS-data or
    1681                 :            :                          * QoS-nulldata frame) then just set the EOSP bit there
    1682                 :            :                          * and be done.
    1683                 :            :                          * If the frame doesn't have a QoS header (which means
    1684                 :            :                          * it should be a bufferable MMPDU) then we can't set
    1685                 :            :                          * the EOSP bit in the QoS header; add a QoS-nulldata
    1686                 :            :                          * frame to the list to send it after the MMPDU.
    1687                 :            :                          *
    1688                 :            :                          * Note that this code is only in the mac80211-release
    1689                 :            :                          * code path, we assume that the driver will not buffer
    1690                 :            :                          * anything but QoS-data frames, or if it does, will
    1691                 :            :                          * create the QoS-nulldata frame by itself if needed.
    1692                 :            :                          *
    1693                 :            :                          * Cf. 802.11-2012 10.2.1.10 (c).
    1694                 :            :                          */
    1695         [ #  # ]:          0 :                         if (qoshdr) {
    1696                 :          0 :                                 *qoshdr |= IEEE80211_QOS_CTL_EOSP;
    1697                 :            : 
    1698                 :          0 :                                 info->flags |= IEEE80211_TX_STATUS_EOSP |
    1699                 :            :                                                IEEE80211_TX_CTL_REQ_TX_STATUS;
    1700                 :            :                         } else {
    1701                 :            :                                 /* The standard isn't completely clear on this
    1702                 :            :                                  * as it says the more-data bit should be set
    1703                 :            :                                  * if there are more BUs. The QoS-Null frame
    1704                 :            :                                  * we're about to send isn't buffered yet, we
    1705                 :            :                                  * only create it below, but let's pretend it
    1706                 :            :                                  * was buffered just in case some clients only
    1707                 :            :                                  * expect more-data=0 when eosp=1.
    1708                 :            :                                  */
    1709                 :          0 :                                 hdr->frame_control |=
    1710                 :            :                                         cpu_to_le16(IEEE80211_FCTL_MOREDATA);
    1711                 :          0 :                                 need_null = true;
    1712                 :          0 :                                 num++;
    1713                 :            :                         }
    1714                 :            :                         break;
    1715                 :            :                 }
    1716                 :            : 
    1717                 :          0 :                 drv_allow_buffered_frames(local, sta, tids, num,
    1718                 :            :                                           reason, more_data);
    1719                 :            : 
    1720                 :          0 :                 ieee80211_add_pending_skbs(local, &pending);
    1721                 :            : 
    1722         [ #  # ]:          0 :                 if (need_null)
    1723         [ #  # ]:          0 :                         ieee80211_send_null_response(
    1724                 :            :                                 sta, find_highest_prio_tid(tids),
    1725                 :            :                                 reason, false, false);
    1726                 :            : 
    1727                 :          0 :                 sta_info_recalc_tim(sta);
    1728                 :            :         } else {
    1729                 :          0 :                 int tid;
    1730                 :            : 
    1731                 :            :                 /*
    1732                 :            :                  * We need to release a frame that is buffered somewhere in the
    1733                 :            :                  * driver ... it'll have to handle that.
    1734                 :            :                  * Note that the driver also has to check the number of frames
    1735                 :            :                  * on the TIDs we're releasing from - if there are more than
    1736                 :            :                  * n_frames it has to set the more-data bit (if we didn't ask
    1737                 :            :                  * it to set it anyway due to other buffered frames); if there
    1738                 :            :                  * are fewer than n_frames it has to make sure to adjust that
    1739                 :            :                  * to allow the service period to end properly.
    1740                 :            :                  */
    1741                 :          0 :                 drv_release_buffered_frames(local, sta, driver_release_tids,
    1742                 :            :                                             n_frames, reason, more_data);
    1743                 :            : 
    1744                 :            :                 /*
    1745                 :            :                  * Note that we don't recalculate the TIM bit here as it would
    1746                 :            :                  * most likely have no effect at all unless the driver told us
    1747                 :            :                  * that the TID(s) became empty before returning here from the
    1748                 :            :                  * release function.
    1749                 :            :                  * Either way, however, when the driver tells us that the TID(s)
    1750                 :            :                  * became empty or we find that a txq became empty, we'll do the
    1751                 :            :                  * TIM recalculation.
    1752                 :            :                  */
    1753                 :            : 
    1754         [ #  # ]:          0 :                 if (!sta->sta.txq[0])
    1755                 :          0 :                         return;
    1756                 :            : 
    1757         [ #  # ]:          0 :                 for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) {
    1758         [ #  # ]:          0 :                         if (!sta->sta.txq[tid] ||
    1759   [ #  #  #  # ]:          0 :                             !(driver_release_tids & BIT(tid)) ||
    1760                 :            :                             txq_has_queue(sta->sta.txq[tid]))
    1761                 :          0 :                                 continue;
    1762                 :            : 
    1763                 :          0 :                         sta_info_recalc_tim(sta);
    1764                 :            :                         break;
    1765                 :            :                 }
    1766                 :            :         }
    1767                 :            : }
    1768                 :            : 
    1769                 :          0 : void ieee80211_sta_ps_deliver_poll_response(struct sta_info *sta)
    1770                 :            : {
    1771                 :          0 :         u8 ignore_for_response = sta->sta.uapsd_queues;
    1772                 :            : 
    1773                 :            :         /*
    1774                 :            :          * If all ACs are delivery-enabled then we should reply
    1775                 :            :          * from any of them, if only some are enabled we reply
    1776                 :            :          * only from the non-enabled ones.
    1777                 :            :          */
    1778   [ #  #  #  # ]:          0 :         if (ignore_for_response == BIT(IEEE80211_NUM_ACS) - 1)
    1779                 :          0 :                 ignore_for_response = 0;
    1780                 :            : 
    1781                 :          0 :         ieee80211_sta_ps_deliver_response(sta, 1, ignore_for_response,
    1782                 :            :                                           IEEE80211_FRAME_RELEASE_PSPOLL);
    1783                 :          0 : }
    1784                 :            : 
    1785                 :          0 : void ieee80211_sta_ps_deliver_uapsd(struct sta_info *sta)
    1786                 :            : {
    1787                 :          0 :         int n_frames = sta->sta.max_sp;
    1788                 :          0 :         u8 delivery_enabled = sta->sta.uapsd_queues;
    1789                 :            : 
    1790                 :            :         /*
    1791                 :            :          * If we ever grow support for TSPEC this might happen if
    1792                 :            :          * the TSPEC update from hostapd comes in between a trigger
    1793                 :            :          * frame setting WLAN_STA_UAPSD in the RX path and this
    1794                 :            :          * actually getting called.
    1795                 :            :          */
    1796         [ #  # ]:          0 :         if (!delivery_enabled)
    1797                 :            :                 return;
    1798                 :            : 
    1799         [ #  # ]:          0 :         switch (sta->sta.max_sp) {
    1800                 :            :         case 1:
    1801                 :            :                 n_frames = 2;
    1802                 :            :                 break;
    1803                 :            :         case 2:
    1804                 :            :                 n_frames = 4;
    1805                 :            :                 break;
    1806                 :            :         case 3:
    1807                 :            :                 n_frames = 6;
    1808                 :            :                 break;
    1809                 :            :         case 0:
    1810                 :            :                 /* XXX: what is a good value? */
    1811                 :            :                 n_frames = 128;
    1812                 :            :                 break;
    1813                 :            :         }
    1814                 :            : 
    1815                 :          0 :         ieee80211_sta_ps_deliver_response(sta, n_frames, ~delivery_enabled,
    1816                 :            :                                           IEEE80211_FRAME_RELEASE_UAPSD);
    1817                 :            : }
    1818                 :            : 
    1819                 :          0 : void ieee80211_sta_block_awake(struct ieee80211_hw *hw,
    1820                 :            :                                struct ieee80211_sta *pubsta, bool block)
    1821                 :            : {
    1822                 :          0 :         struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
    1823                 :            : 
    1824                 :          0 :         trace_api_sta_block_awake(sta->local, pubsta, block);
    1825                 :            : 
    1826         [ #  # ]:          0 :         if (block) {
    1827                 :          0 :                 set_sta_flag(sta, WLAN_STA_PS_DRIVER);
    1828                 :          0 :                 ieee80211_clear_fast_xmit(sta);
    1829                 :          0 :                 return;
    1830                 :            :         }
    1831                 :            : 
    1832         [ #  # ]:          0 :         if (!test_sta_flag(sta, WLAN_STA_PS_DRIVER))
    1833                 :            :                 return;
    1834                 :            : 
    1835         [ #  # ]:          0 :         if (!test_sta_flag(sta, WLAN_STA_PS_STA)) {
    1836                 :          0 :                 set_sta_flag(sta, WLAN_STA_PS_DELIVER);
    1837                 :          0 :                 clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
    1838                 :          0 :                 ieee80211_queue_work(hw, &sta->drv_deliver_wk);
    1839   [ #  #  #  # ]:          0 :         } else if (test_sta_flag(sta, WLAN_STA_PSPOLL) ||
    1840                 :            :                    test_sta_flag(sta, WLAN_STA_UAPSD)) {
    1841                 :            :                 /* must be asleep in this case */
    1842                 :          0 :                 clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
    1843                 :          0 :                 ieee80211_queue_work(hw, &sta->drv_deliver_wk);
    1844                 :            :         } else {
    1845                 :          0 :                 clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
    1846                 :          0 :                 ieee80211_check_fast_xmit(sta);
    1847                 :            :         }
    1848                 :            : }
    1849                 :            : EXPORT_SYMBOL(ieee80211_sta_block_awake);
    1850                 :            : 
    1851                 :          0 : void ieee80211_sta_eosp(struct ieee80211_sta *pubsta)
    1852                 :            : {
    1853                 :          0 :         struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
    1854                 :          0 :         struct ieee80211_local *local = sta->local;
    1855                 :            : 
    1856                 :          0 :         trace_api_eosp(local, pubsta);
    1857                 :            : 
    1858                 :          0 :         clear_sta_flag(sta, WLAN_STA_SP);
    1859                 :          0 : }
    1860                 :            : EXPORT_SYMBOL(ieee80211_sta_eosp);
    1861                 :            : 
    1862                 :          0 : void ieee80211_send_eosp_nullfunc(struct ieee80211_sta *pubsta, int tid)
    1863                 :            : {
    1864                 :          0 :         struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
    1865                 :          0 :         enum ieee80211_frame_release_type reason;
    1866                 :          0 :         bool more_data;
    1867                 :            : 
    1868                 :          0 :         trace_api_send_eosp_nullfunc(sta->local, pubsta, tid);
    1869                 :            : 
    1870                 :          0 :         reason = IEEE80211_FRAME_RELEASE_UAPSD;
    1871                 :          0 :         more_data = ieee80211_sta_ps_more_data(sta, ~sta->sta.uapsd_queues,
    1872                 :            :                                                reason, 0);
    1873                 :            : 
    1874                 :          0 :         ieee80211_send_null_response(sta, tid, reason, false, more_data);
    1875                 :          0 : }
    1876                 :            : EXPORT_SYMBOL(ieee80211_send_eosp_nullfunc);
    1877                 :            : 
    1878                 :          0 : void ieee80211_sta_set_buffered(struct ieee80211_sta *pubsta,
    1879                 :            :                                 u8 tid, bool buffered)
    1880                 :            : {
    1881                 :          0 :         struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
    1882                 :            : 
    1883   [ #  #  #  # ]:          0 :         if (WARN_ON(tid >= IEEE80211_NUM_TIDS))
    1884                 :            :                 return;
    1885                 :            : 
    1886                 :          0 :         trace_api_sta_set_buffered(sta->local, pubsta, tid, buffered);
    1887                 :            : 
    1888         [ #  # ]:          0 :         if (buffered)
    1889                 :          0 :                 set_bit(tid, &sta->driver_buffered_tids);
    1890                 :            :         else
    1891                 :          0 :                 clear_bit(tid, &sta->driver_buffered_tids);
    1892                 :            : 
    1893                 :          0 :         sta_info_recalc_tim(sta);
    1894                 :            : }
    1895                 :            : EXPORT_SYMBOL(ieee80211_sta_set_buffered);
    1896                 :            : 
    1897                 :          0 : void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid,
    1898                 :            :                                     u32 tx_airtime, u32 rx_airtime)
    1899                 :            : {
    1900                 :          0 :         struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
    1901                 :          0 :         struct ieee80211_local *local = sta->sdata->local;
    1902         [ #  # ]:          0 :         u8 ac = ieee80211_ac_from_tid(tid);
    1903                 :          0 :         u32 airtime = 0;
    1904                 :            : 
    1905         [ #  # ]:          0 :         if (sta->local->airtime_flags & AIRTIME_USE_TX)
    1906                 :          0 :                 airtime += tx_airtime;
    1907         [ #  # ]:          0 :         if (sta->local->airtime_flags & AIRTIME_USE_RX)
    1908                 :          0 :                 airtime += rx_airtime;
    1909                 :            : 
    1910                 :          0 :         spin_lock_bh(&local->active_txq_lock[ac]);
    1911                 :          0 :         sta->airtime[ac].tx_airtime += tx_airtime;
    1912                 :          0 :         sta->airtime[ac].rx_airtime += rx_airtime;
    1913                 :          0 :         sta->airtime[ac].deficit -= airtime;
    1914                 :          0 :         spin_unlock_bh(&local->active_txq_lock[ac]);
    1915                 :          0 : }
    1916                 :            : EXPORT_SYMBOL(ieee80211_sta_register_airtime);
    1917                 :            : 
    1918                 :          0 : void ieee80211_sta_update_pending_airtime(struct ieee80211_local *local,
    1919                 :            :                                           struct sta_info *sta, u8 ac,
    1920                 :            :                                           u16 tx_airtime, bool tx_completed)
    1921                 :            : {
    1922                 :          0 :         int tx_pending;
    1923                 :            : 
    1924         [ #  # ]:          0 :         if (!wiphy_ext_feature_isset(local->hw.wiphy, NL80211_EXT_FEATURE_AQL))
    1925                 :            :                 return;
    1926                 :            : 
    1927         [ #  # ]:          0 :         if (!tx_completed) {
    1928         [ #  # ]:          0 :                 if (sta)
    1929                 :          0 :                         atomic_add(tx_airtime,
    1930                 :          0 :                                    &sta->airtime[ac].aql_tx_pending);
    1931                 :            : 
    1932                 :          0 :                 atomic_add(tx_airtime, &local->aql_total_pending_airtime);
    1933                 :          0 :                 return;
    1934                 :            :         }
    1935                 :            : 
    1936         [ #  # ]:          0 :         if (sta) {
    1937                 :          0 :                 tx_pending = atomic_sub_return(tx_airtime,
    1938                 :          0 :                                                &sta->airtime[ac].aql_tx_pending);
    1939   [ #  #  #  #  :          0 :                 if (WARN_ONCE(tx_pending < 0,
                   #  # ]
    1940                 :            :                               "STA %pM AC %d txq pending airtime underflow: %u, %u",
    1941                 :            :                               sta->addr, ac, tx_pending, tx_airtime))
    1942                 :          0 :                         atomic_cmpxchg(&sta->airtime[ac].aql_tx_pending,
    1943                 :            :                                        tx_pending, 0);
    1944                 :            :         }
    1945                 :            : 
    1946                 :          0 :         tx_pending = atomic_sub_return(tx_airtime,
    1947                 :            :                                        &local->aql_total_pending_airtime);
    1948   [ #  #  #  #  :          0 :         if (WARN_ONCE(tx_pending < 0,
             #  #  #  # ]
    1949                 :            :                       "Device %s AC %d pending airtime underflow: %u, %u",
    1950                 :            :                       wiphy_name(local->hw.wiphy), ac, tx_pending,
    1951                 :            :                       tx_airtime))
    1952                 :          0 :                 atomic_cmpxchg(&local->aql_total_pending_airtime,
    1953                 :            :                                tx_pending, 0);
    1954                 :            : }
    1955                 :            : 
    1956                 :          0 : int sta_info_move_state(struct sta_info *sta,
    1957                 :            :                         enum ieee80211_sta_state new_state)
    1958                 :            : {
    1959                 :          0 :         might_sleep();
    1960                 :            : 
    1961         [ #  # ]:          0 :         if (sta->sta_state == new_state)
    1962                 :            :                 return 0;
    1963                 :            : 
    1964                 :            :         /* check allowed transitions first */
    1965                 :            : 
    1966   [ #  #  #  #  :          0 :         switch (new_state) {
                      # ]
    1967                 :          0 :         case IEEE80211_STA_NONE:
    1968         [ #  # ]:          0 :                 if (sta->sta_state != IEEE80211_STA_AUTH)
    1969                 :            :                         return -EINVAL;
    1970                 :            :                 break;
    1971                 :          0 :         case IEEE80211_STA_AUTH:
    1972         [ #  # ]:          0 :                 if (sta->sta_state != IEEE80211_STA_NONE &&
    1973                 :            :                     sta->sta_state != IEEE80211_STA_ASSOC)
    1974                 :            :                         return -EINVAL;
    1975                 :            :                 break;
    1976                 :          0 :         case IEEE80211_STA_ASSOC:
    1977         [ #  # ]:          0 :                 if (sta->sta_state != IEEE80211_STA_AUTH &&
    1978                 :            :                     sta->sta_state != IEEE80211_STA_AUTHORIZED)
    1979                 :            :                         return -EINVAL;
    1980                 :            :                 break;
    1981                 :          0 :         case IEEE80211_STA_AUTHORIZED:
    1982         [ #  # ]:          0 :                 if (sta->sta_state != IEEE80211_STA_ASSOC)
    1983                 :            :                         return -EINVAL;
    1984                 :            :                 break;
    1985                 :            :         default:
    1986                 :          0 :                 WARN(1, "invalid state %d", new_state);
    1987                 :          0 :                 return -EINVAL;
    1988                 :            :         }
    1989                 :            : 
    1990                 :          0 :         sta_dbg(sta->sdata, "moving STA %pM to state %d\n",
    1991                 :            :                 sta->sta.addr, new_state);
    1992                 :            : 
    1993                 :            :         /*
    1994                 :            :          * notify the driver before the actual changes so it can
    1995                 :            :          * fail the transition
    1996                 :            :          */
    1997         [ #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_INSERTED)) {
    1998                 :          0 :                 int err = drv_sta_state(sta->local, sta->sdata, sta,
    1999                 :            :                                         sta->sta_state, new_state);
    2000         [ #  # ]:          0 :                 if (err)
    2001                 :            :                         return err;
    2002                 :            :         }
    2003                 :            : 
    2004                 :            :         /* reflect the change in all state variables */
    2005                 :            : 
    2006   [ #  #  #  #  :          0 :         switch (new_state) {
                      # ]
    2007                 :          0 :         case IEEE80211_STA_NONE:
    2008         [ #  # ]:          0 :                 if (sta->sta_state == IEEE80211_STA_AUTH)
    2009                 :          0 :                         clear_bit(WLAN_STA_AUTH, &sta->_flags);
    2010                 :            :                 break;
    2011                 :          0 :         case IEEE80211_STA_AUTH:
    2012         [ #  # ]:          0 :                 if (sta->sta_state == IEEE80211_STA_NONE) {
    2013                 :          0 :                         set_bit(WLAN_STA_AUTH, &sta->_flags);
    2014         [ #  # ]:          0 :                 } else if (sta->sta_state == IEEE80211_STA_ASSOC) {
    2015                 :          0 :                         clear_bit(WLAN_STA_ASSOC, &sta->_flags);
    2016                 :          0 :                         ieee80211_recalc_min_chandef(sta->sdata);
    2017         [ #  # ]:          0 :                         if (!sta->sta.support_p2p_ps)
    2018                 :          0 :                                 ieee80211_recalc_p2p_go_ps_allowed(sta->sdata);
    2019                 :            :                 }
    2020                 :            :                 break;
    2021                 :          0 :         case IEEE80211_STA_ASSOC:
    2022         [ #  # ]:          0 :                 if (sta->sta_state == IEEE80211_STA_AUTH) {
    2023                 :          0 :                         set_bit(WLAN_STA_ASSOC, &sta->_flags);
    2024                 :          0 :                         sta->assoc_at = ktime_get_boottime_ns();
    2025                 :          0 :                         ieee80211_recalc_min_chandef(sta->sdata);
    2026         [ #  # ]:          0 :                         if (!sta->sta.support_p2p_ps)
    2027                 :          0 :                                 ieee80211_recalc_p2p_go_ps_allowed(sta->sdata);
    2028         [ #  # ]:          0 :                 } else if (sta->sta_state == IEEE80211_STA_AUTHORIZED) {
    2029                 :          0 :                         ieee80211_vif_dec_num_mcast(sta->sdata);
    2030                 :          0 :                         clear_bit(WLAN_STA_AUTHORIZED, &sta->_flags);
    2031                 :          0 :                         ieee80211_clear_fast_xmit(sta);
    2032                 :          0 :                         ieee80211_clear_fast_rx(sta);
    2033                 :            :                 }
    2034                 :            :                 break;
    2035                 :          0 :         case IEEE80211_STA_AUTHORIZED:
    2036         [ #  # ]:          0 :                 if (sta->sta_state == IEEE80211_STA_ASSOC) {
    2037                 :          0 :                         ieee80211_vif_inc_num_mcast(sta->sdata);
    2038                 :          0 :                         set_bit(WLAN_STA_AUTHORIZED, &sta->_flags);
    2039                 :          0 :                         ieee80211_check_fast_xmit(sta);
    2040                 :          0 :                         ieee80211_check_fast_rx(sta);
    2041                 :            :                 }
    2042         [ #  # ]:          0 :                 if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
    2043                 :            :                     sta->sdata->vif.type == NL80211_IFTYPE_AP)
    2044                 :          0 :                         cfg80211_send_layer2_update(sta->sdata->dev,
    2045                 :          0 :                                                     sta->sta.addr);
    2046                 :            :                 break;
    2047                 :            :         default:
    2048                 :            :                 break;
    2049                 :            :         }
    2050                 :            : 
    2051                 :          0 :         sta->sta_state = new_state;
    2052                 :            : 
    2053                 :          0 :         return 0;
    2054                 :            : }
    2055                 :            : 
    2056                 :          0 : u8 sta_info_tx_streams(struct sta_info *sta)
    2057                 :            : {
    2058                 :          0 :         struct ieee80211_sta_ht_cap *ht_cap = &sta->sta.ht_cap;
    2059                 :          0 :         u8 rx_streams;
    2060                 :            : 
    2061         [ #  # ]:          0 :         if (!sta->sta.ht_cap.ht_supported)
    2062                 :            :                 return 1;
    2063                 :            : 
    2064         [ #  # ]:          0 :         if (sta->sta.vht_cap.vht_supported) {
    2065                 :            :                 int i;
    2066                 :            :                 u16 tx_mcs_map =
    2067                 :            :                         le16_to_cpu(sta->sta.vht_cap.vht_mcs.tx_mcs_map);
    2068                 :            : 
    2069                 :            :                 for (i = 7; i >= 0; i--)
    2070                 :            :                         if ((tx_mcs_map & (0x3 << (i * 2))) !=
    2071                 :            :                             IEEE80211_VHT_MCS_NOT_SUPPORTED)
    2072                 :            :                                 return i + 1;
    2073                 :            :         }
    2074                 :            : 
    2075         [ #  # ]:          0 :         if (ht_cap->mcs.rx_mask[3])
    2076                 :            :                 rx_streams = 4;
    2077         [ #  # ]:          0 :         else if (ht_cap->mcs.rx_mask[2])
    2078                 :            :                 rx_streams = 3;
    2079         [ #  # ]:          0 :         else if (ht_cap->mcs.rx_mask[1])
    2080                 :            :                 rx_streams = 2;
    2081                 :            :         else
    2082                 :          0 :                 rx_streams = 1;
    2083                 :            : 
    2084         [ #  # ]:          0 :         if (!(ht_cap->mcs.tx_params & IEEE80211_HT_MCS_TX_RX_DIFF))
    2085                 :            :                 return rx_streams;
    2086                 :            : 
    2087                 :          0 :         return ((ht_cap->mcs.tx_params & IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK)
    2088                 :          0 :                         >> IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT) + 1;
    2089                 :            : }
    2090                 :            : 
    2091                 :            : static struct ieee80211_sta_rx_stats *
    2092                 :          0 : sta_get_last_rx_stats(struct sta_info *sta)
    2093                 :            : {
    2094                 :          0 :         struct ieee80211_sta_rx_stats *stats = &sta->rx_stats;
    2095                 :          0 :         struct ieee80211_local *local = sta->local;
    2096                 :          0 :         int cpu;
    2097                 :            : 
    2098         [ #  # ]:          0 :         if (!ieee80211_hw_check(&local->hw, USES_RSS))
    2099                 :            :                 return stats;
    2100                 :            : 
    2101         [ #  # ]:          0 :         for_each_possible_cpu(cpu) {
    2102                 :          0 :                 struct ieee80211_sta_rx_stats *cpustats;
    2103                 :            : 
    2104                 :          0 :                 cpustats = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
    2105                 :            : 
    2106         [ #  # ]:          0 :                 if (time_after(cpustats->last_rx, stats->last_rx))
    2107                 :          0 :                         stats = cpustats;
    2108                 :            :         }
    2109                 :            : 
    2110                 :            :         return stats;
    2111                 :            : }
    2112                 :            : 
    2113                 :            : static void sta_stats_decode_rate(struct ieee80211_local *local, u32 rate,
    2114                 :            :                                   struct rate_info *rinfo)
    2115                 :            : {
    2116                 :            :         rinfo->bw = STA_STATS_GET(BW, rate);
    2117                 :            : 
    2118                 :            :         switch (STA_STATS_GET(TYPE, rate)) {
    2119                 :            :         case STA_STATS_RATE_TYPE_VHT:
    2120                 :            :                 rinfo->flags = RATE_INFO_FLAGS_VHT_MCS;
    2121                 :            :                 rinfo->mcs = STA_STATS_GET(VHT_MCS, rate);
    2122                 :            :                 rinfo->nss = STA_STATS_GET(VHT_NSS, rate);
    2123                 :            :                 if (STA_STATS_GET(SGI, rate))
    2124                 :            :                         rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
    2125                 :            :                 break;
    2126                 :            :         case STA_STATS_RATE_TYPE_HT:
    2127                 :            :                 rinfo->flags = RATE_INFO_FLAGS_MCS;
    2128                 :            :                 rinfo->mcs = STA_STATS_GET(HT_MCS, rate);
    2129                 :            :                 if (STA_STATS_GET(SGI, rate))
    2130                 :            :                         rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
    2131                 :            :                 break;
    2132                 :            :         case STA_STATS_RATE_TYPE_LEGACY: {
    2133                 :            :                 struct ieee80211_supported_band *sband;
    2134                 :            :                 u16 brate;
    2135                 :            :                 unsigned int shift;
    2136                 :            :                 int band = STA_STATS_GET(LEGACY_BAND, rate);
    2137                 :            :                 int rate_idx = STA_STATS_GET(LEGACY_IDX, rate);
    2138                 :            : 
    2139                 :            :                 sband = local->hw.wiphy->bands[band];
    2140                 :            :                 brate = sband->bitrates[rate_idx].bitrate;
    2141                 :            :                 if (rinfo->bw == RATE_INFO_BW_5)
    2142                 :            :                         shift = 2;
    2143                 :            :                 else if (rinfo->bw == RATE_INFO_BW_10)
    2144                 :            :                         shift = 1;
    2145                 :            :                 else
    2146                 :            :                         shift = 0;
    2147                 :            :                 rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift);
    2148                 :            :                 break;
    2149                 :            :                 }
    2150                 :            :         case STA_STATS_RATE_TYPE_HE:
    2151                 :            :                 rinfo->flags = RATE_INFO_FLAGS_HE_MCS;
    2152                 :            :                 rinfo->mcs = STA_STATS_GET(HE_MCS, rate);
    2153                 :            :                 rinfo->nss = STA_STATS_GET(HE_NSS, rate);
    2154                 :            :                 rinfo->he_gi = STA_STATS_GET(HE_GI, rate);
    2155                 :            :                 rinfo->he_ru_alloc = STA_STATS_GET(HE_RU, rate);
    2156                 :            :                 rinfo->he_dcm = STA_STATS_GET(HE_DCM, rate);
    2157                 :            :                 break;
    2158                 :            :         }
    2159                 :            : }
    2160                 :            : 
    2161                 :          0 : static int sta_set_rate_info_rx(struct sta_info *sta, struct rate_info *rinfo)
    2162                 :            : {
    2163                 :          0 :         u16 rate = READ_ONCE(sta_get_last_rx_stats(sta)->last_rate);
    2164                 :            : 
    2165         [ #  # ]:          0 :         if (rate == STA_STATS_RATE_INVALID)
    2166                 :            :                 return -EINVAL;
    2167                 :            : 
    2168                 :          0 :         sta_stats_decode_rate(sta->local, rate, rinfo);
    2169                 :          0 :         return 0;
    2170                 :            : }
    2171                 :            : 
    2172                 :          0 : static void sta_set_tidstats(struct sta_info *sta,
    2173                 :            :                              struct cfg80211_tid_stats *tidstats,
    2174                 :            :                              int tid)
    2175                 :            : {
    2176                 :          0 :         struct ieee80211_local *local = sta->local;
    2177                 :            : 
    2178         [ #  # ]:          0 :         if (!(tidstats->filled & BIT(NL80211_TID_STATS_RX_MSDU))) {
    2179                 :          0 :                 unsigned int start;
    2180                 :            : 
    2181                 :          0 :                 do {
    2182                 :          0 :                         start = u64_stats_fetch_begin(&sta->rx_stats.syncp);
    2183                 :          0 :                         tidstats->rx_msdu = sta->rx_stats.msdu[tid];
    2184                 :          0 :                 } while (u64_stats_fetch_retry(&sta->rx_stats.syncp, start));
    2185                 :            : 
    2186                 :          0 :                 tidstats->filled |= BIT(NL80211_TID_STATS_RX_MSDU);
    2187                 :            :         }
    2188                 :            : 
    2189         [ #  # ]:          0 :         if (!(tidstats->filled & BIT(NL80211_TID_STATS_TX_MSDU))) {
    2190                 :          0 :                 tidstats->filled |= BIT(NL80211_TID_STATS_TX_MSDU);
    2191                 :          0 :                 tidstats->tx_msdu = sta->tx_stats.msdu[tid];
    2192                 :            :         }
    2193                 :            : 
    2194   [ #  #  #  # ]:          0 :         if (!(tidstats->filled & BIT(NL80211_TID_STATS_TX_MSDU_RETRIES)) &&
    2195                 :            :             ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
    2196                 :          0 :                 tidstats->filled |= BIT(NL80211_TID_STATS_TX_MSDU_RETRIES);
    2197                 :          0 :                 tidstats->tx_msdu_retries = sta->status_stats.msdu_retries[tid];
    2198                 :            :         }
    2199                 :            : 
    2200   [ #  #  #  # ]:          0 :         if (!(tidstats->filled & BIT(NL80211_TID_STATS_TX_MSDU_FAILED)) &&
    2201                 :            :             ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
    2202                 :          0 :                 tidstats->filled |= BIT(NL80211_TID_STATS_TX_MSDU_FAILED);
    2203                 :          0 :                 tidstats->tx_msdu_failed = sta->status_stats.msdu_failed[tid];
    2204                 :            :         }
    2205                 :            : 
    2206   [ #  #  #  # ]:          0 :         if (local->ops->wake_tx_queue && tid < IEEE80211_NUM_TIDS) {
    2207                 :          0 :                 spin_lock_bh(&local->fq.lock);
    2208                 :          0 :                 rcu_read_lock();
    2209                 :            : 
    2210                 :          0 :                 tidstats->filled |= BIT(NL80211_TID_STATS_TXQ_STATS);
    2211                 :          0 :                 ieee80211_fill_txq_stats(&tidstats->txq_stats,
    2212                 :            :                                          to_txq_info(sta->sta.txq[tid]));
    2213                 :            : 
    2214                 :          0 :                 rcu_read_unlock();
    2215                 :          0 :                 spin_unlock_bh(&local->fq.lock);
    2216                 :            :         }
    2217                 :          0 : }
    2218                 :            : 
    2219                 :          0 : static inline u64 sta_get_stats_bytes(struct ieee80211_sta_rx_stats *rxstats)
    2220                 :            : {
    2221                 :          0 :         unsigned int start;
    2222                 :          0 :         u64 value;
    2223                 :            : 
    2224                 :          0 :         do {
    2225                 :          0 :                 start = u64_stats_fetch_begin(&rxstats->syncp);
    2226                 :          0 :                 value = rxstats->bytes;
    2227         [ #  # ]:          0 :         } while (u64_stats_fetch_retry(&rxstats->syncp, start));
    2228                 :            : 
    2229                 :          0 :         return value;
    2230                 :            : }
    2231                 :            : 
    2232                 :          0 : void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
    2233                 :            :                    bool tidstats)
    2234                 :            : {
    2235                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
    2236                 :          0 :         struct ieee80211_local *local = sdata->local;
    2237                 :          0 :         u32 thr = 0;
    2238                 :          0 :         int i, ac, cpu;
    2239                 :          0 :         struct ieee80211_sta_rx_stats *last_rxstats;
    2240                 :            : 
    2241                 :          0 :         last_rxstats = sta_get_last_rx_stats(sta);
    2242                 :            : 
    2243                 :          0 :         sinfo->generation = sdata->local->sta_generation;
    2244                 :            : 
    2245                 :            :         /* do before driver, so beacon filtering drivers have a
    2246                 :            :          * chance to e.g. just add the number of filtered beacons
    2247                 :            :          * (or just modify the value entirely, of course)
    2248                 :            :          */
    2249         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_STATION)
    2250                 :          0 :                 sinfo->rx_beacon = sdata->u.mgd.count_beacon_signal;
    2251                 :            : 
    2252                 :          0 :         drv_sta_statistics(local, sdata, &sta->sta, sinfo);
    2253                 :            : 
    2254                 :          0 :         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME) |
    2255                 :            :                          BIT_ULL(NL80211_STA_INFO_STA_FLAGS) |
    2256                 :            :                          BIT_ULL(NL80211_STA_INFO_BSS_PARAM) |
    2257                 :            :                          BIT_ULL(NL80211_STA_INFO_CONNECTED_TIME) |
    2258                 :            :                          BIT_ULL(NL80211_STA_INFO_ASSOC_AT_BOOTTIME) |
    2259                 :            :                          BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC);
    2260                 :            : 
    2261         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_STATION) {
    2262                 :          0 :                 sinfo->beacon_loss_count = sdata->u.mgd.beacon_loss_count;
    2263                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_LOSS);
    2264                 :            :         }
    2265                 :            : 
    2266                 :          0 :         sinfo->connected_time = ktime_get_seconds() - sta->last_connected;
    2267                 :          0 :         sinfo->assoc_at = sta->assoc_at;
    2268                 :          0 :         sinfo->inactive_time =
    2269                 :          0 :                 jiffies_to_msecs(jiffies - ieee80211_sta_last_active(sta));
    2270                 :            : 
    2271         [ #  # ]:          0 :         if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES64) |
    2272                 :            :                                BIT_ULL(NL80211_STA_INFO_TX_BYTES)))) {
    2273                 :          0 :                 sinfo->tx_bytes = 0;
    2274         [ #  # ]:          0 :                 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
    2275                 :          0 :                         sinfo->tx_bytes += sta->tx_stats.bytes[ac];
    2276                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
    2277                 :            :         }
    2278                 :            : 
    2279         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_PACKETS))) {
    2280                 :          0 :                 sinfo->tx_packets = 0;
    2281         [ #  # ]:          0 :                 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
    2282                 :          0 :                         sinfo->tx_packets += sta->tx_stats.packets[ac];
    2283                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
    2284                 :            :         }
    2285                 :            : 
    2286         [ #  # ]:          0 :         if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES64) |
    2287                 :            :                                BIT_ULL(NL80211_STA_INFO_RX_BYTES)))) {
    2288         [ #  # ]:          0 :                 sinfo->rx_bytes += sta_get_stats_bytes(&sta->rx_stats);
    2289                 :            : 
    2290         [ #  # ]:          0 :                 if (sta->pcpu_rx_stats) {
    2291         [ #  # ]:          0 :                         for_each_possible_cpu(cpu) {
    2292                 :          0 :                                 struct ieee80211_sta_rx_stats *cpurxs;
    2293                 :            : 
    2294                 :          0 :                                 cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
    2295                 :          0 :                                 sinfo->rx_bytes += sta_get_stats_bytes(cpurxs);
    2296                 :            :                         }
    2297                 :            :                 }
    2298                 :            : 
    2299                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64);
    2300                 :            :         }
    2301                 :            : 
    2302         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_PACKETS))) {
    2303                 :          0 :                 sinfo->rx_packets = sta->rx_stats.packets;
    2304         [ #  # ]:          0 :                 if (sta->pcpu_rx_stats) {
    2305         [ #  # ]:          0 :                         for_each_possible_cpu(cpu) {
    2306                 :          0 :                                 struct ieee80211_sta_rx_stats *cpurxs;
    2307                 :            : 
    2308                 :          0 :                                 cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
    2309                 :          0 :                                 sinfo->rx_packets += cpurxs->packets;
    2310                 :            :                         }
    2311                 :            :                 }
    2312                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
    2313                 :            :         }
    2314                 :            : 
    2315         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_RETRIES))) {
    2316                 :          0 :                 sinfo->tx_retries = sta->status_stats.retry_count;
    2317                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
    2318                 :            :         }
    2319                 :            : 
    2320         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_FAILED))) {
    2321                 :          0 :                 sinfo->tx_failed = sta->status_stats.retry_failed;
    2322                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
    2323                 :            :         }
    2324                 :            : 
    2325         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_DURATION))) {
    2326         [ #  # ]:          0 :                 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
    2327                 :          0 :                         sinfo->rx_duration += sta->airtime[ac].rx_airtime;
    2328                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION);
    2329                 :            :         }
    2330                 :            : 
    2331         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_DURATION))) {
    2332         [ #  # ]:          0 :                 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
    2333                 :          0 :                         sinfo->tx_duration += sta->airtime[ac].tx_airtime;
    2334                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_DURATION);
    2335                 :            :         }
    2336                 :            : 
    2337         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT))) {
    2338                 :          0 :                 sinfo->airtime_weight = sta->airtime_weight;
    2339                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT);
    2340                 :            :         }
    2341                 :            : 
    2342                 :          0 :         sinfo->rx_dropped_misc = sta->rx_stats.dropped;
    2343         [ #  # ]:          0 :         if (sta->pcpu_rx_stats) {
    2344         [ #  # ]:          0 :                 for_each_possible_cpu(cpu) {
    2345                 :          0 :                         struct ieee80211_sta_rx_stats *cpurxs;
    2346                 :            : 
    2347                 :          0 :                         cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu);
    2348                 :          0 :                         sinfo->rx_dropped_misc += cpurxs->dropped;
    2349                 :            :                 }
    2350                 :            :         }
    2351                 :            : 
    2352         [ #  # ]:          0 :         if (sdata->vif.type == NL80211_IFTYPE_STATION &&
    2353         [ #  # ]:          0 :             !(sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)) {
    2354                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BEACON_RX) |
    2355                 :            :                                  BIT_ULL(NL80211_STA_INFO_BEACON_SIGNAL_AVG);
    2356                 :          0 :                 sinfo->rx_beacon_signal_avg = ieee80211_ave_rssi(&sdata->vif);
    2357                 :            :         }
    2358                 :            : 
    2359   [ #  #  #  # ]:          0 :         if (ieee80211_hw_check(&sta->local->hw, SIGNAL_DBM) ||
    2360                 :          0 :             ieee80211_hw_check(&sta->local->hw, SIGNAL_UNSPEC)) {
    2361         [ #  # ]:          0 :                 if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL))) {
    2362                 :          0 :                         sinfo->signal = (s8)last_rxstats->last_signal;
    2363                 :          0 :                         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
    2364                 :            :                 }
    2365                 :            : 
    2366         [ #  # ]:          0 :                 if (!sta->pcpu_rx_stats &&
    2367         [ #  # ]:          0 :                     !(sinfo->filled & BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG))) {
    2368                 :          0 :                         sinfo->signal_avg =
    2369                 :          0 :                                 -ewma_signal_read(&sta->rx_stats_avg.signal);
    2370                 :          0 :                         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
    2371                 :            :                 }
    2372                 :            :         }
    2373                 :            : 
    2374                 :            :         /* for the average - if pcpu_rx_stats isn't set - rxstats must point to
    2375                 :            :          * the sta->rx_stats struct, so the check here is fine with and without
    2376                 :            :          * pcpu statistics
    2377                 :            :          */
    2378         [ #  # ]:          0 :         if (last_rxstats->chains &&
    2379         [ #  # ]:          0 :             !(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL) |
    2380                 :            :                                BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG)))) {
    2381                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
    2382         [ #  # ]:          0 :                 if (!sta->pcpu_rx_stats)
    2383                 :          0 :                         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
    2384                 :            : 
    2385                 :          0 :                 sinfo->chains = last_rxstats->chains;
    2386                 :            : 
    2387         [ #  # ]:          0 :                 for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
    2388                 :          0 :                         sinfo->chain_signal[i] =
    2389                 :          0 :                                 last_rxstats->chain_signal_last[i];
    2390                 :          0 :                         sinfo->chain_signal_avg[i] =
    2391                 :          0 :                                 -ewma_signal_read(&sta->rx_stats_avg.chain_signal[i]);
    2392                 :            :                 }
    2393                 :            :         }
    2394                 :            : 
    2395         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE))) {
    2396                 :          0 :                 sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate,
    2397                 :            :                                      &sinfo->txrate);
    2398                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
    2399                 :            :         }
    2400                 :            : 
    2401         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_RX_BITRATE))) {
    2402         [ #  # ]:          0 :                 if (sta_set_rate_info_rx(sta, &sinfo->rxrate) == 0)
    2403                 :          0 :                         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
    2404                 :            :         }
    2405                 :            : 
    2406   [ #  #  #  # ]:          0 :         if (tidstats && !cfg80211_sinfo_alloc_tid_stats(sinfo, GFP_KERNEL)) {
    2407         [ #  # ]:          0 :                 for (i = 0; i < IEEE80211_NUM_TIDS + 1; i++)
    2408                 :          0 :                         sta_set_tidstats(sta, &sinfo->pertid[i], i);
    2409                 :            :         }
    2410                 :            : 
    2411         [ #  # ]:          0 :         if (ieee80211_vif_is_mesh(&sdata->vif)) {
    2412                 :            : #ifdef CONFIG_MAC80211_MESH
    2413                 :            :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_LLID) |
    2414                 :            :                                  BIT_ULL(NL80211_STA_INFO_PLID) |
    2415                 :            :                                  BIT_ULL(NL80211_STA_INFO_PLINK_STATE) |
    2416                 :            :                                  BIT_ULL(NL80211_STA_INFO_LOCAL_PM) |
    2417                 :            :                                  BIT_ULL(NL80211_STA_INFO_PEER_PM) |
    2418                 :            :                                  BIT_ULL(NL80211_STA_INFO_NONPEER_PM) |
    2419                 :            :                                  BIT_ULL(NL80211_STA_INFO_CONNECTED_TO_GATE);
    2420                 :            : 
    2421                 :            :                 sinfo->llid = sta->mesh->llid;
    2422                 :            :                 sinfo->plid = sta->mesh->plid;
    2423                 :            :                 sinfo->plink_state = sta->mesh->plink_state;
    2424                 :            :                 if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) {
    2425                 :            :                         sinfo->filled |= BIT_ULL(NL80211_STA_INFO_T_OFFSET);
    2426                 :            :                         sinfo->t_offset = sta->mesh->t_offset;
    2427                 :            :                 }
    2428                 :            :                 sinfo->local_pm = sta->mesh->local_pm;
    2429                 :            :                 sinfo->peer_pm = sta->mesh->peer_pm;
    2430                 :            :                 sinfo->nonpeer_pm = sta->mesh->nonpeer_pm;
    2431                 :            :                 sinfo->connected_to_gate = sta->mesh->connected_to_gate;
    2432                 :            : #endif
    2433                 :          0 :         }
    2434                 :            : 
    2435                 :          0 :         sinfo->bss_param.flags = 0;
    2436         [ #  # ]:          0 :         if (sdata->vif.bss_conf.use_cts_prot)
    2437                 :          0 :                 sinfo->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT;
    2438         [ #  # ]:          0 :         if (sdata->vif.bss_conf.use_short_preamble)
    2439                 :          0 :                 sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
    2440         [ #  # ]:          0 :         if (sdata->vif.bss_conf.use_short_slot)
    2441                 :          0 :                 sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
    2442                 :          0 :         sinfo->bss_param.dtim_period = sdata->vif.bss_conf.dtim_period;
    2443                 :          0 :         sinfo->bss_param.beacon_interval = sdata->vif.bss_conf.beacon_int;
    2444                 :            : 
    2445                 :          0 :         sinfo->sta_flags.set = 0;
    2446                 :          0 :         sinfo->sta_flags.mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
    2447                 :            :                                 BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
    2448                 :            :                                 BIT(NL80211_STA_FLAG_WME) |
    2449                 :            :                                 BIT(NL80211_STA_FLAG_MFP) |
    2450                 :            :                                 BIT(NL80211_STA_FLAG_AUTHENTICATED) |
    2451                 :            :                                 BIT(NL80211_STA_FLAG_ASSOCIATED) |
    2452                 :            :                                 BIT(NL80211_STA_FLAG_TDLS_PEER);
    2453         [ #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
    2454                 :          0 :                 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHORIZED);
    2455         [ #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE))
    2456                 :          0 :                 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_SHORT_PREAMBLE);
    2457         [ #  # ]:          0 :         if (sta->sta.wme)
    2458                 :          0 :                 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_WME);
    2459         [ #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_MFP))
    2460                 :          0 :                 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_MFP);
    2461         [ #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_AUTH))
    2462                 :          0 :                 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHENTICATED);
    2463         [ #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_ASSOC))
    2464                 :          0 :                 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
    2465         [ #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_TDLS_PEER))
    2466                 :          0 :                 sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER);
    2467                 :            : 
    2468                 :          0 :         thr = sta_get_expected_throughput(sta);
    2469                 :            : 
    2470         [ #  # ]:          0 :         if (thr != 0) {
    2471                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT);
    2472                 :          0 :                 sinfo->expected_throughput = thr;
    2473                 :            :         }
    2474                 :            : 
    2475         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL)) &&
    2476         [ #  # ]:          0 :             sta->status_stats.ack_signal_filled) {
    2477                 :          0 :                 sinfo->ack_signal = sta->status_stats.last_ack_signal;
    2478                 :          0 :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);
    2479                 :            :         }
    2480                 :            : 
    2481         [ #  # ]:          0 :         if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG)) &&
    2482         [ #  # ]:          0 :             sta->status_stats.ack_signal_filled) {
    2483                 :          0 :                 sinfo->avg_ack_signal =
    2484                 :          0 :                         -(s8)ewma_avg_signal_read(
    2485                 :            :                                 &sta->status_stats.avg_ack_signal);
    2486                 :          0 :                 sinfo->filled |=
    2487                 :            :                         BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG);
    2488                 :            :         }
    2489                 :            : 
    2490                 :          0 :         if (ieee80211_vif_is_mesh(&sdata->vif)) {
    2491                 :            :                 sinfo->filled |= BIT_ULL(NL80211_STA_INFO_AIRTIME_LINK_METRIC);
    2492                 :            :                 sinfo->airtime_link_metric =
    2493                 :            :                         airtime_link_metric_get(local, sta);
    2494                 :            :         }
    2495                 :          0 : }
    2496                 :            : 
    2497                 :          0 : u32 sta_get_expected_throughput(struct sta_info *sta)
    2498                 :            : {
    2499                 :          0 :         struct ieee80211_sub_if_data *sdata = sta->sdata;
    2500                 :          0 :         struct ieee80211_local *local = sdata->local;
    2501                 :          0 :         struct rate_control_ref *ref = NULL;
    2502                 :          0 :         u32 thr = 0;
    2503                 :            : 
    2504         [ #  # ]:          0 :         if (test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
    2505                 :          0 :                 ref = local->rate_ctrl;
    2506                 :            : 
    2507                 :            :         /* check if the driver has a SW RC implementation */
    2508   [ #  #  #  # ]:          0 :         if (ref && ref->ops->get_expected_throughput)
    2509                 :          0 :                 thr = ref->ops->get_expected_throughput(sta->rate_ctrl_priv);
    2510                 :            :         else
    2511                 :          0 :                 thr = drv_get_expected_throughput(local, sta);
    2512                 :            : 
    2513                 :          0 :         return thr;
    2514                 :            : }
    2515                 :            : 
    2516                 :          0 : unsigned long ieee80211_sta_last_active(struct sta_info *sta)
    2517                 :            : {
    2518                 :          0 :         struct ieee80211_sta_rx_stats *stats = sta_get_last_rx_stats(sta);
    2519                 :            : 
    2520         [ #  # ]:          0 :         if (!sta->status_stats.last_ack ||
    2521         [ #  # ]:          0 :             time_after(stats->last_rx, sta->status_stats.last_ack))
    2522                 :          0 :                 return stats->last_rx;
    2523                 :            :         return sta->status_stats.last_ack;
    2524                 :            : }
    2525                 :            : 
    2526                 :          0 : static void sta_update_codel_params(struct sta_info *sta, u32 thr)
    2527                 :            : {
    2528                 :          0 :         if (!sta->sdata->local->ops->wake_tx_queue)
    2529                 :            :                 return;
    2530                 :            : 
    2531   [ #  #  #  # ]:          0 :         if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) {
    2532                 :          0 :                 sta->cparams.target = MS2TIME(50);
    2533                 :          0 :                 sta->cparams.interval = MS2TIME(300);
    2534                 :          0 :                 sta->cparams.ecn = false;
    2535                 :            :         } else {
    2536                 :          0 :                 sta->cparams.target = MS2TIME(20);
    2537                 :          0 :                 sta->cparams.interval = MS2TIME(100);
    2538                 :          0 :                 sta->cparams.ecn = true;
    2539                 :            :         }
    2540                 :            : }
    2541                 :            : 
    2542                 :          0 : void ieee80211_sta_set_expected_throughput(struct ieee80211_sta *pubsta,
    2543                 :            :                                            u32 thr)
    2544                 :            : {
    2545                 :          0 :         struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
    2546                 :            : 
    2547         [ #  # ]:          0 :         sta_update_codel_params(sta, thr);
    2548                 :          0 : }

Generated by: LCOV version 1.14