Lines Matching refs:sta

69 	struct ieee80211_link_sta sta;  member
93 struct sta_info *sta) in sta_info_hash_del() argument
95 return rhltable_remove(&local->sta_hash, &sta->hash_node, in sta_info_hash_del()
117 static void __cleanup_single_sta(struct sta_info *sta) in __cleanup_single_sta() argument
121 struct ieee80211_sub_if_data *sdata = sta->sdata; in __cleanup_single_sta()
125 if (test_sta_flag(sta, WLAN_STA_PS_STA) || in __cleanup_single_sta()
126 test_sta_flag(sta, WLAN_STA_PS_DRIVER) || in __cleanup_single_sta()
127 test_sta_flag(sta, WLAN_STA_PS_DELIVER)) { in __cleanup_single_sta()
128 if (sta->sdata->vif.type == NL80211_IFTYPE_AP || in __cleanup_single_sta()
129 sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in __cleanup_single_sta()
136 clear_sta_flag(sta, WLAN_STA_PS_STA); in __cleanup_single_sta()
137 clear_sta_flag(sta, WLAN_STA_PS_DRIVER); in __cleanup_single_sta()
138 clear_sta_flag(sta, WLAN_STA_PS_DELIVER); in __cleanup_single_sta()
143 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { in __cleanup_single_sta()
146 if (!sta->sta.txq[i]) in __cleanup_single_sta()
149 txqi = to_txq_info(sta->sta.txq[i]); in __cleanup_single_sta()
155 local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); in __cleanup_single_sta()
156 ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]); in __cleanup_single_sta()
157 ieee80211_purge_tx_queue(&local->hw, &sta->tx_filtered[ac]); in __cleanup_single_sta()
161 mesh_sta_cleanup(sta); in __cleanup_single_sta()
163 cancel_work_sync(&sta->drv_deliver_wk); in __cleanup_single_sta()
172 kfree(sta->ampdu_mlme.tid_start_tx[i]); in __cleanup_single_sta()
173 tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]); in __cleanup_single_sta()
181 static void cleanup_single_sta(struct sta_info *sta) in cleanup_single_sta() argument
183 struct ieee80211_sub_if_data *sdata = sta->sdata; in cleanup_single_sta()
186 __cleanup_single_sta(sta); in cleanup_single_sta()
187 sta_info_free(local, sta); in cleanup_single_sta()
202 struct sta_info *sta; in sta_info_get() local
205 for_each_sta_info(local, addr, sta, tmp) { in sta_info_get()
206 if (sta->sdata == sdata) { in sta_info_get()
211 return sta; in sta_info_get()
227 struct sta_info *sta; in sta_info_get_bss() local
230 for_each_sta_info(local, addr, sta, tmp) { in sta_info_get_bss()
231 if (sta->sdata == sdata || in sta_info_get_bss()
232 (sta->sdata->bss && sta->sdata->bss == sdata->bss)) { in sta_info_get_bss()
237 return sta; in sta_info_get_bss()
260 struct sta_info *sta = link_sta->sta; in link_sta_info_get_bss() local
262 if (sta->sdata == sdata || in link_sta_info_get_bss()
263 (sta->sdata->bss && sta->sdata->bss == sdata->bss)) { in link_sta_info_get_bss()
286 struct sta_info *sta = link_sta->sta; in ieee80211_find_sta_by_link_addrs() local
293 return &sta->sta; in ieee80211_find_sta_by_link_addrs()
296 link = rcu_dereference(sta->sdata->link[_link_id]); in ieee80211_find_sta_by_link_addrs()
305 return &sta->sta; in ieee80211_find_sta_by_link_addrs()
316 struct sta_info *sta; in sta_info_get_by_addrs() local
318 for_each_sta_info(local, sta_addr, sta, tmp) { in sta_info_get_by_addrs()
319 if (ether_addr_equal(vif_addr, sta->sdata->vif.addr)) in sta_info_get_by_addrs()
320 return sta; in sta_info_get_by_addrs()
330 struct sta_info *sta; in sta_info_get_by_idx() local
333 list_for_each_entry_rcu(sta, &local->sta_list, list, in sta_info_get_by_idx()
335 if (sdata != sta->sdata) in sta_info_get_by_idx()
341 return sta; in sta_info_get_by_idx()
352 static void sta_remove_link(struct sta_info *sta, unsigned int link_id, in sta_remove_link() argument
358 link_sta = rcu_access_pointer(sta->link[link_id]); in sta_remove_link()
359 if (link_sta != &sta->deflink) in sta_remove_link()
360 lockdep_assert_held(&sta->local->sta_mtx); in sta_remove_link()
366 link_sta_info_hash_del(sta->local, link_sta); in sta_remove_link()
368 if (test_sta_flag(sta, WLAN_STA_INSERTED)) in sta_remove_link()
371 if (link_sta != &sta->deflink) in sta_remove_link()
374 sta->sta.valid_links &= ~BIT(link_id); in sta_remove_link()
375 RCU_INIT_POINTER(sta->link[link_id], NULL); in sta_remove_link()
376 RCU_INIT_POINTER(sta->sta.link[link_id], NULL); in sta_remove_link()
382 ieee80211_sta_recalc_aggregates(&sta->sta); in sta_remove_link()
396 void sta_info_free(struct ieee80211_local *local, struct sta_info *sta) in sta_info_free() argument
400 for (i = 0; i < ARRAY_SIZE(sta->link); i++) { in sta_info_free()
401 if (!(sta->sta.valid_links & BIT(i))) in sta_info_free()
404 sta_remove_link(sta, i, false); in sta_info_free()
415 while (sta->sta_state > IEEE80211_STA_NONE) { in sta_info_free()
418 WARN_ON_ONCE(test_sta_flag(sta, WLAN_STA_INSERTED)); in sta_info_free()
420 ret = sta_info_move_state(sta, sta->sta_state - 1); in sta_info_free()
425 if (sta->rate_ctrl) in sta_info_free()
426 rate_control_free_sta(sta); in sta_info_free()
428 sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr); in sta_info_free()
430 kfree(to_txq_info(sta->sta.txq[0])); in sta_info_free()
431 kfree(rcu_dereference_raw(sta->sta.rates)); in sta_info_free()
433 kfree(sta->mesh); in sta_info_free()
436 sta_info_free_link(&sta->deflink); in sta_info_free()
437 kfree(sta); in sta_info_free()
442 struct sta_info *sta) in sta_info_hash_add() argument
444 return rhltable_insert(&local->sta_hash, &sta->hash_node, in sta_info_hash_add()
450 struct sta_info *sta; in sta_deliver_ps_frames() local
452 sta = container_of(wk, struct sta_info, drv_deliver_wk); in sta_deliver_ps_frames()
454 if (sta->dead) in sta_deliver_ps_frames()
458 if (!test_sta_flag(sta, WLAN_STA_PS_STA)) in sta_deliver_ps_frames()
459 ieee80211_sta_ps_deliver_wakeup(sta); in sta_deliver_ps_frames()
460 else if (test_and_clear_sta_flag(sta, WLAN_STA_PSPOLL)) in sta_deliver_ps_frames()
461 ieee80211_sta_ps_deliver_poll_response(sta); in sta_deliver_ps_frames()
462 else if (test_and_clear_sta_flag(sta, WLAN_STA_UAPSD)) in sta_deliver_ps_frames()
463 ieee80211_sta_ps_deliver_uapsd(sta); in sta_deliver_ps_frames()
468 struct sta_info *sta, gfp_t gfp) in sta_prepare_rate_control() argument
473 sta->rate_ctrl = local->rate_ctrl; in sta_prepare_rate_control()
474 sta->rate_ctrl_priv = rate_control_alloc_sta(sta->rate_ctrl, in sta_prepare_rate_control()
475 sta, gfp); in sta_prepare_rate_control()
476 if (!sta->rate_ctrl_priv) in sta_prepare_rate_control()
507 static void sta_info_add_link(struct sta_info *sta, in sta_info_add_link() argument
512 link_info->sta = sta; in sta_info_add_link()
515 link_info->pub->sta = &sta->sta; in sta_info_add_link()
517 rcu_assign_pointer(sta->link[link_id], link_info); in sta_info_add_link()
518 rcu_assign_pointer(sta->sta.link[link_id], link_sta); in sta_info_add_link()
531 struct sta_info *sta; in __sta_info_alloc() local
536 sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp); in __sta_info_alloc()
537 if (!sta) in __sta_info_alloc()
540 sta->local = local; in __sta_info_alloc()
541 sta->sdata = sdata; in __sta_info_alloc()
543 if (sta_info_alloc_link(local, &sta->deflink, gfp)) in __sta_info_alloc()
547 sta_info_add_link(sta, link_id, &sta->deflink, in __sta_info_alloc()
548 &sta->sta.deflink); in __sta_info_alloc()
549 sta->sta.valid_links = BIT(link_id); in __sta_info_alloc()
551 sta_info_add_link(sta, 0, &sta->deflink, &sta->sta.deflink); in __sta_info_alloc()
554 sta->sta.cur = &sta->sta.deflink.agg; in __sta_info_alloc()
556 spin_lock_init(&sta->lock); in __sta_info_alloc()
557 spin_lock_init(&sta->ps_lock); in __sta_info_alloc()
558 INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames); in __sta_info_alloc()
559 INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); in __sta_info_alloc()
560 mutex_init(&sta->ampdu_mlme.mtx); in __sta_info_alloc()
563 sta->mesh = kzalloc(sizeof(*sta->mesh), gfp); in __sta_info_alloc()
564 if (!sta->mesh) in __sta_info_alloc()
566 sta->mesh->plink_sta = sta; in __sta_info_alloc()
567 spin_lock_init(&sta->mesh->plink_lock); in __sta_info_alloc()
569 timer_setup(&sta->mesh->plink_timer, mesh_plink_timer, in __sta_info_alloc()
571 sta->mesh->nonpeer_pm = NL80211_MESH_POWER_ACTIVE; in __sta_info_alloc()
575 memcpy(sta->addr, addr, ETH_ALEN); in __sta_info_alloc()
576 memcpy(sta->sta.addr, addr, ETH_ALEN); in __sta_info_alloc()
577 memcpy(sta->deflink.addr, link_addr, ETH_ALEN); in __sta_info_alloc()
578 memcpy(sta->sta.deflink.addr, link_addr, ETH_ALEN); in __sta_info_alloc()
579 sta->sta.max_rx_aggregation_subframes = in __sta_info_alloc()
590 BUILD_BUG_ON(ARRAY_SIZE(sta->ptk) <= INVALID_PTK_KEYIDX); in __sta_info_alloc()
591 sta->ptk_idx = INVALID_PTK_KEYIDX; in __sta_info_alloc()
594 ieee80211_init_frag_cache(&sta->frags); in __sta_info_alloc()
596 sta->sta_state = IEEE80211_STA_NONE; in __sta_info_alloc()
599 sta->amsdu_mesh_control = -1; in __sta_info_alloc()
602 sta->reserved_tid = IEEE80211_TID_UNRESERVED; in __sta_info_alloc()
604 sta->last_connected = ktime_get_seconds(); in __sta_info_alloc()
609 txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp); in __sta_info_alloc()
613 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { in __sta_info_alloc()
617 ieee80211_txq_init(sdata, sta, txq, i); in __sta_info_alloc()
620 if (sta_prepare_rate_control(local, sta, gfp)) in __sta_info_alloc()
623 sta->airtime_weight = IEEE80211_DEFAULT_AIRTIME_WEIGHT; in __sta_info_alloc()
626 skb_queue_head_init(&sta->ps_tx_buf[i]); in __sta_info_alloc()
627 skb_queue_head_init(&sta->tx_filtered[i]); in __sta_info_alloc()
628 sta->airtime[i].deficit = sta->airtime_weight; in __sta_info_alloc()
629 atomic_set(&sta->airtime[i].aql_tx_pending, 0); in __sta_info_alloc()
630 sta->airtime[i].aql_limit_low = local->aql_txq_limit_low[i]; in __sta_info_alloc()
631 sta->airtime[i].aql_limit_high = local->aql_txq_limit_high[i]; in __sta_info_alloc()
635 sta->last_seq_ctrl[i] = cpu_to_le16(USHRT_MAX); in __sta_info_alloc()
675 sta->sta.deflink.supp_rates[i] |= BIT(r); in __sta_info_alloc()
679 sta->cparams.ce_threshold = CODEL_DISABLED_THRESHOLD; in __sta_info_alloc()
680 sta->cparams.target = MS2TIME(20); in __sta_info_alloc()
681 sta->cparams.interval = MS2TIME(100); in __sta_info_alloc()
682 sta->cparams.ecn = true; in __sta_info_alloc()
683 sta->cparams.ce_threshold_selector = 0; in __sta_info_alloc()
684 sta->cparams.ce_threshold_mask = 0; in __sta_info_alloc()
686 sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr); in __sta_info_alloc()
688 return sta; in __sta_info_alloc()
691 kfree(to_txq_info(sta->sta.txq[0])); in __sta_info_alloc()
693 sta_info_free_link(&sta->deflink); in __sta_info_alloc()
695 kfree(sta->mesh); in __sta_info_alloc()
697 kfree(sta); in __sta_info_alloc()
716 static int sta_info_insert_check(struct sta_info *sta) in sta_info_insert_check() argument
718 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_info_insert_check()
728 if (WARN_ON(ether_addr_equal(sta->sta.addr, sdata->vif.addr) || in sta_info_insert_check()
729 !is_valid_ether_addr(sta->sta.addr))) in sta_info_insert_check()
739 ieee80211_find_sta_by_ifaddr(&sdata->local->hw, sta->addr, NULL)) { in sta_info_insert_check()
750 struct sta_info *sta) in sta_info_insert_drv_state() argument
755 for (state = IEEE80211_STA_NOTEXIST; state < sta->sta_state; state++) { in sta_info_insert_drv_state()
756 err = drv_sta_state(local, sdata, sta, state, state + 1); in sta_info_insert_drv_state()
767 sta->uploaded = true; in sta_info_insert_drv_state()
774 sta->sta.addr, state + 1, err); in sta_info_insert_drv_state()
780 WARN_ON(drv_sta_state(local, sdata, sta, state, state - 1)); in sta_info_insert_drv_state()
790 struct sta_info *sta; in ieee80211_recalc_p2p_go_ps_allowed() local
793 list_for_each_entry_rcu(sta, &local->sta_list, list) { in ieee80211_recalc_p2p_go_ps_allowed()
794 if (sdata != sta->sdata || in ieee80211_recalc_p2p_go_ps_allowed()
795 !test_sta_flag(sta, WLAN_STA_ASSOC)) in ieee80211_recalc_p2p_go_ps_allowed()
797 if (!sta->sta.support_p2p_ps) { in ieee80211_recalc_p2p_go_ps_allowed()
816 static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU) in sta_info_insert_finish() argument
818 struct ieee80211_local *local = sta->local; in sta_info_insert_finish()
819 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_info_insert_finish()
826 if (sta_info_get_bss(sdata, sta->sta.addr)) { in sta_info_insert_finish()
842 set_sta_flag(sta, WLAN_STA_BLOCK_BA); in sta_info_insert_finish()
845 err = sta_info_hash_add(local, sta); in sta_info_insert_finish()
849 if (sta->sta.valid_links) { in sta_info_insert_finish()
850 err = link_sta_info_hash_add(local, &sta->deflink); in sta_info_insert_finish()
852 sta_info_hash_del(local, sta); in sta_info_insert_finish()
857 list_add_tail_rcu(&sta->list, &local->sta_list); in sta_info_insert_finish()
862 if (sta->sta_state >= IEEE80211_STA_ASSOC) { in sta_info_insert_finish()
863 ieee80211_recalc_min_chandef(sta->sdata, -1); in sta_info_insert_finish()
864 if (!sta->sta.support_p2p_ps) in sta_info_insert_finish()
865 ieee80211_recalc_p2p_go_ps_allowed(sta->sdata); in sta_info_insert_finish()
869 err = sta_info_insert_drv_state(local, sdata, sta); in sta_info_insert_finish()
873 set_sta_flag(sta, WLAN_STA_INSERTED); in sta_info_insert_finish()
876 clear_sta_flag(sta, WLAN_STA_BLOCK_BA); in sta_info_insert_finish()
878 ieee80211_sta_debugfs_add(sta); in sta_info_insert_finish()
879 rate_control_add_sta_debugfs(sta); in sta_info_insert_finish()
880 if (sta->sta.valid_links) { in sta_info_insert_finish()
883 for (i = 0; i < ARRAY_SIZE(sta->link); i++) { in sta_info_insert_finish()
886 link_sta = rcu_dereference_protected(sta->link[i], in sta_info_insert_finish()
897 ieee80211_link_sta_debugfs_add(&sta->deflink); in sta_info_insert_finish()
898 ieee80211_link_sta_debugfs_drv_add(&sta->deflink); in sta_info_insert_finish()
902 cfg80211_new_sta(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL); in sta_info_insert_finish()
905 sta_dbg(sdata, "Inserted STA %pM\n", sta->sta.addr); in sta_info_insert_finish()
916 if (sta->sta.valid_links) in sta_info_insert_finish()
917 link_sta_info_hash_del(local, &sta->deflink); in sta_info_insert_finish()
918 sta_info_hash_del(local, sta); in sta_info_insert_finish()
919 list_del_rcu(&sta->list); in sta_info_insert_finish()
924 cleanup_single_sta(sta); in sta_info_insert_finish()
931 int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU) in sta_info_insert_rcu() argument
933 struct ieee80211_local *local = sta->local; in sta_info_insert_rcu()
940 err = sta_info_insert_check(sta); in sta_info_insert_rcu()
942 sta_info_free(local, sta); in sta_info_insert_rcu()
948 return sta_info_insert_finish(sta); in sta_info_insert_rcu()
951 int sta_info_insert(struct sta_info *sta) in sta_info_insert() argument
953 int err = sta_info_insert_rcu(sta); in sta_info_insert()
1005 static void __sta_info_recalc_tim(struct sta_info *sta, bool ignore_pending) in __sta_info_recalc_tim() argument
1007 struct ieee80211_local *local = sta->local; in __sta_info_recalc_tim()
1010 u8 ignore_for_tim = sta->sta.uapsd_queues; in __sta_info_recalc_tim()
1012 u16 id = sta->sta.aid; in __sta_info_recalc_tim()
1014 if (sta->sdata->vif.type == NL80211_IFTYPE_AP || in __sta_info_recalc_tim()
1015 sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in __sta_info_recalc_tim()
1016 if (WARN_ON_ONCE(!sta->sdata->bss)) in __sta_info_recalc_tim()
1019 ps = &sta->sdata->bss->ps; in __sta_info_recalc_tim()
1021 } else if (ieee80211_vif_is_mesh(&sta->sdata->vif)) { in __sta_info_recalc_tim()
1022 ps = &sta->sdata->u.mesh.ps; in __sta_info_recalc_tim()
1032 if (sta->dead) in __sta_info_recalc_tim()
1053 indicate_tim |= !skb_queue_empty(&sta->tx_filtered[ac]) || in __sta_info_recalc_tim()
1054 !skb_queue_empty(&sta->ps_tx_buf[ac]); in __sta_info_recalc_tim()
1061 sta->driver_buffered_tids & tids; in __sta_info_recalc_tim()
1063 sta->txq_buffered_tids & tids; in __sta_info_recalc_tim()
1077 if (local->ops->set_tim && !WARN_ON(sta->dead)) { in __sta_info_recalc_tim()
1079 drv_set_tim(local, &sta->sta, indicate_tim); in __sta_info_recalc_tim()
1087 void sta_info_recalc_tim(struct sta_info *sta) in sta_info_recalc_tim() argument
1089 __sta_info_recalc_tim(sta, false); in sta_info_recalc_tim()
1092 static bool sta_info_buffer_expired(struct sta_info *sta, struct sk_buff *skb) in sta_info_buffer_expired() argument
1103 timeout = (sta->listen_interval * in sta_info_buffer_expired()
1104 sta->sdata->vif.bss_conf.beacon_int * in sta_info_buffer_expired()
1113 struct sta_info *sta, int ac) in sta_info_cleanup_expire_buffered_ac() argument
1126 spin_lock_irqsave(&sta->tx_filtered[ac].lock, flags); in sta_info_cleanup_expire_buffered_ac()
1127 skb = skb_peek(&sta->tx_filtered[ac]); in sta_info_cleanup_expire_buffered_ac()
1128 if (sta_info_buffer_expired(sta, skb)) in sta_info_cleanup_expire_buffered_ac()
1129 skb = __skb_dequeue(&sta->tx_filtered[ac]); in sta_info_cleanup_expire_buffered_ac()
1132 spin_unlock_irqrestore(&sta->tx_filtered[ac].lock, flags); in sta_info_cleanup_expire_buffered_ac()
1152 spin_lock_irqsave(&sta->ps_tx_buf[ac].lock, flags); in sta_info_cleanup_expire_buffered_ac()
1153 skb = skb_peek(&sta->ps_tx_buf[ac]); in sta_info_cleanup_expire_buffered_ac()
1154 if (sta_info_buffer_expired(sta, skb)) in sta_info_cleanup_expire_buffered_ac()
1155 skb = __skb_dequeue(&sta->ps_tx_buf[ac]); in sta_info_cleanup_expire_buffered_ac()
1158 spin_unlock_irqrestore(&sta->ps_tx_buf[ac].lock, flags); in sta_info_cleanup_expire_buffered_ac()
1169 ps_dbg(sta->sdata, "Buffered frame expired (STA %pM)\n", in sta_info_cleanup_expire_buffered_ac()
1170 sta->sta.addr); in sta_info_cleanup_expire_buffered_ac()
1179 sta_info_recalc_tim(sta); in sta_info_cleanup_expire_buffered_ac()
1186 return !(skb_queue_empty(&sta->ps_tx_buf[ac]) && in sta_info_cleanup_expire_buffered_ac()
1187 skb_queue_empty(&sta->tx_filtered[ac])); in sta_info_cleanup_expire_buffered_ac()
1191 struct sta_info *sta) in sta_info_cleanup_expire_buffered() argument
1197 if (!sta->sdata->bss && in sta_info_cleanup_expire_buffered()
1198 !ieee80211_vif_is_mesh(&sta->sdata->vif)) in sta_info_cleanup_expire_buffered()
1203 sta_info_cleanup_expire_buffered_ac(local, sta, ac); in sta_info_cleanup_expire_buffered()
1208 static int __must_check __sta_info_destroy_part1(struct sta_info *sta) in __sta_info_destroy_part1() argument
1216 if (!sta) in __sta_info_destroy_part1()
1219 local = sta->local; in __sta_info_destroy_part1()
1220 sdata = sta->sdata; in __sta_info_destroy_part1()
1230 set_sta_flag(sta, WLAN_STA_BLOCK_BA); in __sta_info_destroy_part1()
1231 ieee80211_sta_tear_down_BA_sessions(sta, AGG_STOP_DESTROY_STA); in __sta_info_destroy_part1()
1238 drv_sync_rx_queues(local, sta); in __sta_info_destroy_part1()
1240 for (i = 0; i < ARRAY_SIZE(sta->link); i++) { in __sta_info_destroy_part1()
1243 if (!(sta->sta.valid_links & BIT(i))) in __sta_info_destroy_part1()
1246 link_sta = rcu_dereference_protected(sta->link[i], in __sta_info_destroy_part1()
1252 ret = sta_info_hash_del(local, sta); in __sta_info_destroy_part1()
1260 if (test_sta_flag(sta, WLAN_STA_TDLS_OFF_CHANNEL)) { in __sta_info_destroy_part1()
1261 drv_tdls_cancel_channel_switch(local, sdata, &sta->sta); in __sta_info_destroy_part1()
1262 clear_sta_flag(sta, WLAN_STA_TDLS_OFF_CHANNEL); in __sta_info_destroy_part1()
1265 list_del_rcu(&sta->list); in __sta_info_destroy_part1()
1266 sta->removed = true; in __sta_info_destroy_part1()
1268 if (sta->uploaded) in __sta_info_destroy_part1()
1269 drv_sta_pre_rcu_remove(local, sta->sdata, sta); in __sta_info_destroy_part1()
1272 rcu_access_pointer(sdata->u.vlan.sta) == sta) in __sta_info_destroy_part1()
1273 RCU_INIT_POINTER(sdata->u.vlan.sta, NULL); in __sta_info_destroy_part1()
1278 static int _sta_info_move_state(struct sta_info *sta, in _sta_info_move_state() argument
1284 if (sta->sta_state == new_state) in _sta_info_move_state()
1291 if (sta->sta_state != IEEE80211_STA_AUTH) in _sta_info_move_state()
1295 if (sta->sta_state != IEEE80211_STA_NONE && in _sta_info_move_state()
1296 sta->sta_state != IEEE80211_STA_ASSOC) in _sta_info_move_state()
1300 if (sta->sta_state != IEEE80211_STA_AUTH && in _sta_info_move_state()
1301 sta->sta_state != IEEE80211_STA_AUTHORIZED) in _sta_info_move_state()
1305 if (sta->sta_state != IEEE80211_STA_ASSOC) in _sta_info_move_state()
1313 sta_dbg(sta->sdata, "moving STA %pM to state %d\n", in _sta_info_move_state()
1314 sta->sta.addr, new_state); in _sta_info_move_state()
1319 if (test_sta_flag(sta, WLAN_STA_INSERTED)) { in _sta_info_move_state()
1320 int err = drv_sta_state(sta->local, sta->sdata, sta, in _sta_info_move_state()
1321 sta->sta_state, new_state); in _sta_info_move_state()
1330 if (sta->sta_state == IEEE80211_STA_AUTH) in _sta_info_move_state()
1331 clear_bit(WLAN_STA_AUTH, &sta->_flags); in _sta_info_move_state()
1334 if (sta->sta_state == IEEE80211_STA_NONE) { in _sta_info_move_state()
1335 set_bit(WLAN_STA_AUTH, &sta->_flags); in _sta_info_move_state()
1336 } else if (sta->sta_state == IEEE80211_STA_ASSOC) { in _sta_info_move_state()
1337 clear_bit(WLAN_STA_ASSOC, &sta->_flags); in _sta_info_move_state()
1339 ieee80211_recalc_min_chandef(sta->sdata, -1); in _sta_info_move_state()
1340 if (!sta->sta.support_p2p_ps) in _sta_info_move_state()
1341 ieee80211_recalc_p2p_go_ps_allowed(sta->sdata); in _sta_info_move_state()
1346 if (sta->sta_state == IEEE80211_STA_AUTH) { in _sta_info_move_state()
1347 set_bit(WLAN_STA_ASSOC, &sta->_flags); in _sta_info_move_state()
1348 sta->assoc_at = ktime_get_boottime_ns(); in _sta_info_move_state()
1350 ieee80211_recalc_min_chandef(sta->sdata, -1); in _sta_info_move_state()
1351 if (!sta->sta.support_p2p_ps) in _sta_info_move_state()
1352 ieee80211_recalc_p2p_go_ps_allowed(sta->sdata); in _sta_info_move_state()
1354 } else if (sta->sta_state == IEEE80211_STA_AUTHORIZED) { in _sta_info_move_state()
1355 ieee80211_vif_dec_num_mcast(sta->sdata); in _sta_info_move_state()
1356 clear_bit(WLAN_STA_AUTHORIZED, &sta->_flags); in _sta_info_move_state()
1357 ieee80211_clear_fast_xmit(sta); in _sta_info_move_state()
1358 ieee80211_clear_fast_rx(sta); in _sta_info_move_state()
1362 if (sta->sta_state == IEEE80211_STA_ASSOC) { in _sta_info_move_state()
1363 ieee80211_vif_inc_num_mcast(sta->sdata); in _sta_info_move_state()
1364 set_bit(WLAN_STA_AUTHORIZED, &sta->_flags); in _sta_info_move_state()
1365 ieee80211_check_fast_xmit(sta); in _sta_info_move_state()
1366 ieee80211_check_fast_rx(sta); in _sta_info_move_state()
1368 if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN || in _sta_info_move_state()
1369 sta->sdata->vif.type == NL80211_IFTYPE_AP) in _sta_info_move_state()
1370 cfg80211_send_layer2_update(sta->sdata->dev, in _sta_info_move_state()
1371 sta->sta.addr); in _sta_info_move_state()
1377 sta->sta_state = new_state; in _sta_info_move_state()
1382 int sta_info_move_state(struct sta_info *sta, in sta_info_move_state() argument
1385 return _sta_info_move_state(sta, new_state, true); in sta_info_move_state()
1388 static void __sta_info_destroy_part2(struct sta_info *sta, bool recalc) in __sta_info_destroy_part2() argument
1390 struct ieee80211_local *local = sta->local; in __sta_info_destroy_part2()
1391 struct ieee80211_sub_if_data *sdata = sta->sdata; in __sta_info_destroy_part2()
1403 if (sta->sta_state == IEEE80211_STA_AUTHORIZED) { in __sta_info_destroy_part2()
1404 ret = _sta_info_move_state(sta, IEEE80211_STA_ASSOC, recalc); in __sta_info_destroy_part2()
1415 drv_flush_sta(local, sta->sdata, sta); in __sta_info_destroy_part2()
1417 ieee80211_flush_queues(local, sta->sdata, false); in __sta_info_destroy_part2()
1421 ieee80211_free_sta_keys(local, sta); in __sta_info_destroy_part2()
1424 __sta_info_recalc_tim(sta, true); in __sta_info_destroy_part2()
1426 sta->dead = true; in __sta_info_destroy_part2()
1431 while (sta->sta_state > IEEE80211_STA_NONE) { in __sta_info_destroy_part2()
1432 ret = _sta_info_move_state(sta, sta->sta_state - 1, recalc); in __sta_info_destroy_part2()
1439 if (sta->uploaded) { in __sta_info_destroy_part2()
1440 ret = drv_sta_state(local, sdata, sta, IEEE80211_STA_NONE, in __sta_info_destroy_part2()
1445 sta_dbg(sdata, "Removed STA %pM\n", sta->sta.addr); in __sta_info_destroy_part2()
1449 sta_set_sinfo(sta, sinfo, true); in __sta_info_destroy_part2()
1450 cfg80211_del_sta_sinfo(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL); in __sta_info_destroy_part2()
1453 ieee80211_sta_debugfs_remove(sta); in __sta_info_destroy_part2()
1455 ieee80211_destroy_frag_cache(&sta->frags); in __sta_info_destroy_part2()
1457 cleanup_single_sta(sta); in __sta_info_destroy_part2()
1460 int __must_check __sta_info_destroy(struct sta_info *sta) in __sta_info_destroy() argument
1462 int err = __sta_info_destroy_part1(sta); in __sta_info_destroy()
1469 __sta_info_destroy_part2(sta, true); in __sta_info_destroy()
1476 struct sta_info *sta; in sta_info_destroy_addr() local
1480 sta = sta_info_get(sdata, addr); in sta_info_destroy_addr()
1481 ret = __sta_info_destroy(sta); in sta_info_destroy_addr()
1490 struct sta_info *sta; in sta_info_destroy_addr_bss() local
1494 sta = sta_info_get_bss(sdata, addr); in sta_info_destroy_addr_bss()
1495 ret = __sta_info_destroy(sta); in sta_info_destroy_addr_bss()
1504 struct sta_info *sta; in sta_info_cleanup() local
1508 list_for_each_entry_rcu(sta, &local->sta_list, list) in sta_info_cleanup()
1509 if (sta_info_cleanup_expire_buffered(local, sta)) in sta_info_cleanup()
1556 struct sta_info *sta, *tmp; in __sta_info_flush() local
1566 list_for_each_entry_safe(sta, tmp, &local->sta_list, list) { in __sta_info_flush()
1567 if (sdata == sta->sdata || in __sta_info_flush()
1568 (vlans && sdata->bss == sta->sdata->bss)) { in __sta_info_flush()
1569 if (!WARN_ON(__sta_info_destroy_part1(sta))) in __sta_info_flush()
1570 list_add(&sta->free_list, &free_list); in __sta_info_flush()
1579 list_for_each_entry_safe(sta, tmp, &free_list, free_list) { in __sta_info_flush()
1580 if (!sta->sta.support_p2p_ps) in __sta_info_flush()
1582 __sta_info_destroy_part2(sta, false); in __sta_info_flush()
1598 struct sta_info *sta, *tmp; in ieee80211_sta_expire() local
1602 list_for_each_entry_safe(sta, tmp, &local->sta_list, list) { in ieee80211_sta_expire()
1603 unsigned long last_active = ieee80211_sta_last_active(sta); in ieee80211_sta_expire()
1605 if (sdata != sta->sdata) in ieee80211_sta_expire()
1609 sta_dbg(sta->sdata, "expiring inactive STA %pM\n", in ieee80211_sta_expire()
1610 sta->sta.addr); in ieee80211_sta_expire()
1613 test_sta_flag(sta, WLAN_STA_PS_STA)) in ieee80211_sta_expire()
1616 WARN_ON(__sta_info_destroy(sta)); in ieee80211_sta_expire()
1629 struct sta_info *sta; in ieee80211_find_sta_by_ifaddr() local
1635 for_each_sta_info(local, addr, sta, tmp) { in ieee80211_find_sta_by_ifaddr()
1637 !ether_addr_equal(sta->sdata->vif.addr, localaddr)) in ieee80211_find_sta_by_ifaddr()
1639 if (!sta->uploaded) in ieee80211_find_sta_by_ifaddr()
1641 return &sta->sta; in ieee80211_find_sta_by_ifaddr()
1651 struct sta_info *sta; in ieee80211_find_sta() local
1656 sta = sta_info_get_bss(vif_to_sdata(vif), addr); in ieee80211_find_sta()
1657 if (!sta) in ieee80211_find_sta()
1660 if (!sta->uploaded) in ieee80211_find_sta()
1663 return &sta->sta; in ieee80211_find_sta()
1668 void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) in ieee80211_sta_ps_deliver_wakeup() argument
1670 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_sta_ps_deliver_wakeup()
1688 clear_sta_flag(sta, WLAN_STA_SP); in ieee80211_sta_ps_deliver_wakeup()
1691 sta->driver_buffered_tids = 0; in ieee80211_sta_ps_deliver_wakeup()
1692 sta->txq_buffered_tids = 0; in ieee80211_sta_ps_deliver_wakeup()
1695 drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta); in ieee80211_sta_ps_deliver_wakeup()
1697 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { in ieee80211_sta_ps_deliver_wakeup()
1698 if (!sta->sta.txq[i] || !txq_has_queue(sta->sta.txq[i])) in ieee80211_sta_ps_deliver_wakeup()
1701 schedule_and_wake_txq(local, to_txq_info(sta->sta.txq[i])); in ieee80211_sta_ps_deliver_wakeup()
1707 spin_lock(&sta->ps_lock); in ieee80211_sta_ps_deliver_wakeup()
1712 spin_lock_irqsave(&sta->tx_filtered[ac].lock, flags); in ieee80211_sta_ps_deliver_wakeup()
1713 skb_queue_splice_tail_init(&sta->tx_filtered[ac], &pending); in ieee80211_sta_ps_deliver_wakeup()
1714 spin_unlock_irqrestore(&sta->tx_filtered[ac].lock, flags); in ieee80211_sta_ps_deliver_wakeup()
1719 spin_lock_irqsave(&sta->ps_tx_buf[ac].lock, flags); in ieee80211_sta_ps_deliver_wakeup()
1720 skb_queue_splice_tail_init(&sta->ps_tx_buf[ac], &pending); in ieee80211_sta_ps_deliver_wakeup()
1721 spin_unlock_irqrestore(&sta->ps_tx_buf[ac].lock, flags); in ieee80211_sta_ps_deliver_wakeup()
1729 clear_sta_flag(sta, WLAN_STA_PS_DELIVER); in ieee80211_sta_ps_deliver_wakeup()
1734 clear_sta_flag(sta, WLAN_STA_PSPOLL); in ieee80211_sta_ps_deliver_wakeup()
1735 clear_sta_flag(sta, WLAN_STA_UAPSD); in ieee80211_sta_ps_deliver_wakeup()
1736 spin_unlock(&sta->ps_lock); in ieee80211_sta_ps_deliver_wakeup()
1742 sta_info_recalc_tim(sta); in ieee80211_sta_ps_deliver_wakeup()
1746 sta->sta.addr, sta->sta.aid, filtered, buffered); in ieee80211_sta_ps_deliver_wakeup()
1748 ieee80211_check_fast_xmit(sta); in ieee80211_sta_ps_deliver_wakeup()
1751 static void ieee80211_send_null_response(struct sta_info *sta, int tid, in ieee80211_send_null_response() argument
1755 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_send_null_response()
1761 bool qos = sta->sta.wme; in ieee80211_send_null_response()
1785 memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN); in ieee80211_send_null_response()
1819 drv_allow_buffered_frames(local, sta, BIT(tid), 1, in ieee80211_send_null_response()
1833 ieee80211_xmit(sdata, sta, skb); in ieee80211_send_null_response()
1854 ieee80211_sta_ps_more_data(struct sta_info *sta, u8 ignored_acs, in ieee80211_sta_ps_more_data() argument
1873 if (!skb_queue_empty(&sta->tx_filtered[ac]) || in ieee80211_sta_ps_more_data()
1874 !skb_queue_empty(&sta->ps_tx_buf[ac])) in ieee80211_sta_ps_more_data()
1882 ieee80211_sta_ps_get_frames(struct sta_info *sta, int n_frames, u8 ignored_acs, in ieee80211_sta_ps_get_frames() argument
1887 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_sta_ps_get_frames()
1905 sta->driver_buffered_tids & tids; in ieee80211_sta_ps_get_frames()
1906 *driver_release_tids |= sta->txq_buffered_tids & tids; in ieee80211_sta_ps_get_frames()
1913 skb = skb_dequeue(&sta->tx_filtered[ac]); in ieee80211_sta_ps_get_frames()
1916 &sta->ps_tx_buf[ac]); in ieee80211_sta_ps_get_frames()
1931 if (!skb_queue_empty(&sta->tx_filtered[ac]) || in ieee80211_sta_ps_get_frames()
1932 !skb_queue_empty(&sta->ps_tx_buf[ac])) in ieee80211_sta_ps_get_frames()
1938 ieee80211_sta_ps_deliver_response(struct sta_info *sta, in ieee80211_sta_ps_deliver_response() argument
1942 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_sta_ps_deliver_response()
1949 set_sta_flag(sta, WLAN_STA_SP); in ieee80211_sta_ps_deliver_response()
1953 ieee80211_sta_ps_get_frames(sta, n_frames, ignored_acs, reason, in ieee80211_sta_ps_deliver_response()
1956 more_data = ieee80211_sta_ps_more_data(sta, ignored_acs, reason, driver_release_tids); in ieee80211_sta_ps_deliver_response()
1986 ieee80211_send_null_response(sta, tid, reason, true, false); in ieee80211_sta_ps_deliver_response()
2079 drv_allow_buffered_frames(local, sta, tids, num, in ieee80211_sta_ps_deliver_response()
2086 sta, find_highest_prio_tid(tids), in ieee80211_sta_ps_deliver_response()
2089 sta_info_recalc_tim(sta); in ieee80211_sta_ps_deliver_response()
2103 drv_release_buffered_frames(local, sta, driver_release_tids, in ieee80211_sta_ps_deliver_response()
2116 for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) { in ieee80211_sta_ps_deliver_response()
2117 if (!sta->sta.txq[tid] || in ieee80211_sta_ps_deliver_response()
2119 txq_has_queue(sta->sta.txq[tid])) in ieee80211_sta_ps_deliver_response()
2122 sta_info_recalc_tim(sta); in ieee80211_sta_ps_deliver_response()
2128 void ieee80211_sta_ps_deliver_poll_response(struct sta_info *sta) in ieee80211_sta_ps_deliver_poll_response() argument
2130 u8 ignore_for_response = sta->sta.uapsd_queues; in ieee80211_sta_ps_deliver_poll_response()
2140 ieee80211_sta_ps_deliver_response(sta, 1, ignore_for_response, in ieee80211_sta_ps_deliver_poll_response()
2144 void ieee80211_sta_ps_deliver_uapsd(struct sta_info *sta) in ieee80211_sta_ps_deliver_uapsd() argument
2146 int n_frames = sta->sta.max_sp; in ieee80211_sta_ps_deliver_uapsd()
2147 u8 delivery_enabled = sta->sta.uapsd_queues; in ieee80211_sta_ps_deliver_uapsd()
2158 switch (sta->sta.max_sp) { in ieee80211_sta_ps_deliver_uapsd()
2174 ieee80211_sta_ps_deliver_response(sta, n_frames, ~delivery_enabled, in ieee80211_sta_ps_deliver_uapsd()
2181 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_sta_block_awake() local
2183 trace_api_sta_block_awake(sta->local, pubsta, block); in ieee80211_sta_block_awake()
2186 set_sta_flag(sta, WLAN_STA_PS_DRIVER); in ieee80211_sta_block_awake()
2187 ieee80211_clear_fast_xmit(sta); in ieee80211_sta_block_awake()
2191 if (!test_sta_flag(sta, WLAN_STA_PS_DRIVER)) in ieee80211_sta_block_awake()
2194 if (!test_sta_flag(sta, WLAN_STA_PS_STA)) { in ieee80211_sta_block_awake()
2195 set_sta_flag(sta, WLAN_STA_PS_DELIVER); in ieee80211_sta_block_awake()
2196 clear_sta_flag(sta, WLAN_STA_PS_DRIVER); in ieee80211_sta_block_awake()
2197 ieee80211_queue_work(hw, &sta->drv_deliver_wk); in ieee80211_sta_block_awake()
2198 } else if (test_sta_flag(sta, WLAN_STA_PSPOLL) || in ieee80211_sta_block_awake()
2199 test_sta_flag(sta, WLAN_STA_UAPSD)) { in ieee80211_sta_block_awake()
2201 clear_sta_flag(sta, WLAN_STA_PS_DRIVER); in ieee80211_sta_block_awake()
2202 ieee80211_queue_work(hw, &sta->drv_deliver_wk); in ieee80211_sta_block_awake()
2204 clear_sta_flag(sta, WLAN_STA_PS_DRIVER); in ieee80211_sta_block_awake()
2205 ieee80211_check_fast_xmit(sta); in ieee80211_sta_block_awake()
2212 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_sta_eosp() local
2213 struct ieee80211_local *local = sta->local; in ieee80211_sta_eosp()
2217 clear_sta_flag(sta, WLAN_STA_SP); in ieee80211_sta_eosp()
2223 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_send_eosp_nullfunc() local
2227 trace_api_send_eosp_nullfunc(sta->local, pubsta, tid); in ieee80211_send_eosp_nullfunc()
2230 more_data = ieee80211_sta_ps_more_data(sta, ~sta->sta.uapsd_queues, in ieee80211_send_eosp_nullfunc()
2233 ieee80211_send_null_response(sta, tid, reason, false, more_data); in ieee80211_send_eosp_nullfunc()
2240 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_sta_set_buffered() local
2245 trace_api_sta_set_buffered(sta->local, pubsta, tid, buffered); in ieee80211_sta_set_buffered()
2248 set_bit(tid, &sta->driver_buffered_tids); in ieee80211_sta_set_buffered()
2250 clear_bit(tid, &sta->driver_buffered_tids); in ieee80211_sta_set_buffered()
2252 sta_info_recalc_tim(sta); in ieee80211_sta_set_buffered()
2259 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_sta_register_airtime() local
2260 struct ieee80211_local *local = sta->sdata->local; in ieee80211_sta_register_airtime()
2265 if (sta->local->airtime_flags & AIRTIME_USE_TX) in ieee80211_sta_register_airtime()
2267 if (sta->local->airtime_flags & AIRTIME_USE_RX) in ieee80211_sta_register_airtime()
2271 sta->airtime[ac].tx_airtime += tx_airtime; in ieee80211_sta_register_airtime()
2272 sta->airtime[ac].rx_airtime += rx_airtime; in ieee80211_sta_register_airtime()
2274 diff = (u32)jiffies - sta->airtime[ac].last_active; in ieee80211_sta_register_airtime()
2276 sta->airtime[ac].deficit -= airtime; in ieee80211_sta_register_airtime()
2282 void __ieee80211_sta_recalc_aggregates(struct sta_info *sta, u16 active_links) in __ieee80211_sta_recalc_aggregates() argument
2287 if (!sta->sta.valid_links || !sta->sta.mlo) { in __ieee80211_sta_recalc_aggregates()
2288 sta->sta.cur = &sta->sta.deflink.agg; in __ieee80211_sta_recalc_aggregates()
2293 for (link_id = 0; link_id < ARRAY_SIZE((sta)->link); link_id++) { in __ieee80211_sta_recalc_aggregates()
2300 link_sta = rcu_dereference(sta->sta.link[link_id]); in __ieee80211_sta_recalc_aggregates()
2305 sta->cur = sta->sta.deflink.agg; in __ieee80211_sta_recalc_aggregates()
2310 sta->cur.max_amsdu_len = in __ieee80211_sta_recalc_aggregates()
2311 min(sta->cur.max_amsdu_len, in __ieee80211_sta_recalc_aggregates()
2313 sta->cur.max_rc_amsdu_len = in __ieee80211_sta_recalc_aggregates()
2314 min(sta->cur.max_rc_amsdu_len, in __ieee80211_sta_recalc_aggregates()
2317 for (i = 0; i < ARRAY_SIZE(sta->cur.max_tid_amsdu_len); i++) in __ieee80211_sta_recalc_aggregates()
2318 sta->cur.max_tid_amsdu_len[i] = in __ieee80211_sta_recalc_aggregates()
2319 min(sta->cur.max_tid_amsdu_len[i], in __ieee80211_sta_recalc_aggregates()
2324 sta->sta.cur = &sta->cur; in __ieee80211_sta_recalc_aggregates()
2329 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_sta_recalc_aggregates() local
2331 __ieee80211_sta_recalc_aggregates(sta, sta->sdata->vif.active_links); in ieee80211_sta_recalc_aggregates()
2336 struct sta_info *sta, u8 ac, in ieee80211_sta_update_pending_airtime() argument
2345 if (sta) in ieee80211_sta_update_pending_airtime()
2347 &sta->airtime[ac].aql_tx_pending); in ieee80211_sta_update_pending_airtime()
2354 if (sta) { in ieee80211_sta_update_pending_airtime()
2356 &sta->airtime[ac].aql_tx_pending); in ieee80211_sta_update_pending_airtime()
2358 atomic_cmpxchg(&sta->airtime[ac].aql_tx_pending, in ieee80211_sta_update_pending_airtime()
2376 sta_get_last_rx_stats(struct sta_info *sta) in sta_get_last_rx_stats() argument
2378 struct ieee80211_sta_rx_stats *stats = &sta->deflink.rx_stats; in sta_get_last_rx_stats()
2381 if (!sta->deflink.pcpu_rx_stats) in sta_get_last_rx_stats()
2387 cpustats = per_cpu_ptr(sta->deflink.pcpu_rx_stats, cpu); in sta_get_last_rx_stats()
2455 static int sta_set_rate_info_rx(struct sta_info *sta, struct rate_info *rinfo) in sta_set_rate_info_rx() argument
2457 u32 rate = READ_ONCE(sta_get_last_rx_stats(sta)->last_rate); in sta_set_rate_info_rx()
2462 sta_stats_decode_rate(sta->local, rate, rinfo); in sta_set_rate_info_rx()
2480 static void sta_set_tidstats(struct sta_info *sta, in sta_set_tidstats() argument
2484 struct ieee80211_local *local = sta->local; in sta_set_tidstats()
2488 tidstats->rx_msdu += sta_get_tidstats_msdu(&sta->deflink.rx_stats, in sta_set_tidstats()
2491 if (sta->deflink.pcpu_rx_stats) { in sta_set_tidstats()
2495 cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats, in sta_set_tidstats()
2507 tidstats->tx_msdu = sta->deflink.tx_stats.msdu[tid]; in sta_set_tidstats()
2513 tidstats->tx_msdu_retries = sta->deflink.status_stats.msdu_retries[tid]; in sta_set_tidstats()
2519 tidstats->tx_msdu_failed = sta->deflink.status_stats.msdu_failed[tid]; in sta_set_tidstats()
2528 to_txq_info(sta->sta.txq[tid])); in sta_set_tidstats()
2548 void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo, in sta_set_sinfo() argument
2551 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_set_sinfo()
2557 last_rxstats = sta_get_last_rx_stats(sta); in sta_set_sinfo()
2568 drv_sta_statistics(local, sdata, &sta->sta, sinfo); in sta_set_sinfo()
2582 sinfo->connected_time = ktime_get_seconds() - sta->last_connected; in sta_set_sinfo()
2583 sinfo->assoc_at = sta->assoc_at; in sta_set_sinfo()
2585 jiffies_to_msecs(jiffies - ieee80211_sta_last_active(sta)); in sta_set_sinfo()
2591 sinfo->tx_bytes += sta->deflink.tx_stats.bytes[ac]; in sta_set_sinfo()
2598 sinfo->tx_packets += sta->deflink.tx_stats.packets[ac]; in sta_set_sinfo()
2604 sinfo->rx_bytes += sta_get_stats_bytes(&sta->deflink.rx_stats); in sta_set_sinfo()
2606 if (sta->deflink.pcpu_rx_stats) { in sta_set_sinfo()
2610 cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats, in sta_set_sinfo()
2620 sinfo->rx_packets = sta->deflink.rx_stats.packets; in sta_set_sinfo()
2621 if (sta->deflink.pcpu_rx_stats) { in sta_set_sinfo()
2625 cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats, in sta_set_sinfo()
2634 sinfo->tx_retries = sta->deflink.status_stats.retry_count; in sta_set_sinfo()
2639 sinfo->tx_failed = sta->deflink.status_stats.retry_failed; in sta_set_sinfo()
2645 sinfo->rx_duration += sta->airtime[ac].rx_airtime; in sta_set_sinfo()
2651 sinfo->tx_duration += sta->airtime[ac].tx_airtime; in sta_set_sinfo()
2656 sinfo->airtime_weight = sta->airtime_weight; in sta_set_sinfo()
2660 sinfo->rx_dropped_misc = sta->deflink.rx_stats.dropped; in sta_set_sinfo()
2661 if (sta->deflink.pcpu_rx_stats) { in sta_set_sinfo()
2665 cpurxs = per_cpu_ptr(sta->deflink.pcpu_rx_stats, cpu); in sta_set_sinfo()
2677 if (ieee80211_hw_check(&sta->local->hw, SIGNAL_DBM) || in sta_set_sinfo()
2678 ieee80211_hw_check(&sta->local->hw, SIGNAL_UNSPEC)) { in sta_set_sinfo()
2684 if (!sta->deflink.pcpu_rx_stats && in sta_set_sinfo()
2687 -ewma_signal_read(&sta->deflink.rx_stats_avg.signal); in sta_set_sinfo()
2700 if (!sta->deflink.pcpu_rx_stats) in sta_set_sinfo()
2709 -ewma_signal_read(&sta->deflink.rx_stats_avg.chain_signal[i]); in sta_set_sinfo()
2714 !sta->sta.valid_links) { in sta_set_sinfo()
2715 sta_set_rate_info_tx(sta, &sta->deflink.tx_stats.last_rate, in sta_set_sinfo()
2721 !sta->sta.valid_links) { in sta_set_sinfo()
2722 if (sta_set_rate_info_rx(sta, &sinfo->rxrate) == 0) in sta_set_sinfo()
2728 sta_set_tidstats(sta, &sinfo->pertid[i], i); in sta_set_sinfo()
2742 sinfo->llid = sta->mesh->llid; in sta_set_sinfo()
2743 sinfo->plid = sta->mesh->plid; in sta_set_sinfo()
2744 sinfo->plink_state = sta->mesh->plink_state; in sta_set_sinfo()
2745 if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) { in sta_set_sinfo()
2747 sinfo->t_offset = sta->mesh->t_offset; in sta_set_sinfo()
2749 sinfo->local_pm = sta->mesh->local_pm; in sta_set_sinfo()
2750 sinfo->peer_pm = sta->mesh->peer_pm; in sta_set_sinfo()
2751 sinfo->nonpeer_pm = sta->mesh->nonpeer_pm; in sta_set_sinfo()
2752 sinfo->connected_to_gate = sta->mesh->connected_to_gate; in sta_set_sinfo()
2753 sinfo->connected_to_as = sta->mesh->connected_to_as; in sta_set_sinfo()
2775 if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) in sta_set_sinfo()
2777 if (test_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE)) in sta_set_sinfo()
2779 if (sta->sta.wme) in sta_set_sinfo()
2781 if (test_sta_flag(sta, WLAN_STA_MFP)) in sta_set_sinfo()
2783 if (test_sta_flag(sta, WLAN_STA_AUTH)) in sta_set_sinfo()
2785 if (test_sta_flag(sta, WLAN_STA_ASSOC)) in sta_set_sinfo()
2787 if (test_sta_flag(sta, WLAN_STA_TDLS_PEER)) in sta_set_sinfo()
2790 thr = sta_get_expected_throughput(sta); in sta_set_sinfo()
2798 sta->deflink.status_stats.ack_signal_filled) { in sta_set_sinfo()
2799 sinfo->ack_signal = sta->deflink.status_stats.last_ack_signal; in sta_set_sinfo()
2804 sta->deflink.status_stats.ack_signal_filled) { in sta_set_sinfo()
2807 &sta->deflink.status_stats.avg_ack_signal); in sta_set_sinfo()
2815 airtime_link_metric_get(local, sta); in sta_set_sinfo()
2819 u32 sta_get_expected_throughput(struct sta_info *sta) in sta_get_expected_throughput() argument
2821 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_get_expected_throughput()
2826 if (test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) in sta_get_expected_throughput()
2831 thr = ref->ops->get_expected_throughput(sta->rate_ctrl_priv); in sta_get_expected_throughput()
2833 thr = drv_get_expected_throughput(local, sta); in sta_get_expected_throughput()
2838 unsigned long ieee80211_sta_last_active(struct sta_info *sta) in ieee80211_sta_last_active() argument
2840 struct ieee80211_sta_rx_stats *stats = sta_get_last_rx_stats(sta); in ieee80211_sta_last_active()
2842 if (!sta->deflink.status_stats.last_ack || in ieee80211_sta_last_active()
2843 time_after(stats->last_rx, sta->deflink.status_stats.last_ack)) in ieee80211_sta_last_active()
2845 return sta->deflink.status_stats.last_ack; in ieee80211_sta_last_active()
2848 static void sta_update_codel_params(struct sta_info *sta, u32 thr) in sta_update_codel_params() argument
2850 if (thr && thr < STA_SLOW_THRESHOLD * sta->local->num_sta) { in sta_update_codel_params()
2851 sta->cparams.target = MS2TIME(50); in sta_update_codel_params()
2852 sta->cparams.interval = MS2TIME(300); in sta_update_codel_params()
2853 sta->cparams.ecn = false; in sta_update_codel_params()
2855 sta->cparams.target = MS2TIME(20); in sta_update_codel_params()
2856 sta->cparams.interval = MS2TIME(100); in sta_update_codel_params()
2857 sta->cparams.ecn = true; in sta_update_codel_params()
2864 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_sta_set_expected_throughput() local
2866 sta_update_codel_params(sta, thr); in ieee80211_sta_set_expected_throughput()
2869 int ieee80211_sta_allocate_link(struct sta_info *sta, unsigned int link_id) in ieee80211_sta_allocate_link() argument
2871 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_sta_allocate_link()
2878 if (WARN_ON(!sta->sta.valid_links)) in ieee80211_sta_allocate_link()
2881 if (WARN_ON(sta->sta.valid_links & BIT(link_id) || in ieee80211_sta_allocate_link()
2882 sta->link[link_id])) in ieee80211_sta_allocate_link()
2895 sta_info_add_link(sta, link_id, &alloc->info, &alloc->sta); in ieee80211_sta_allocate_link()
2902 void ieee80211_sta_free_link(struct sta_info *sta, unsigned int link_id) in ieee80211_sta_free_link() argument
2904 lockdep_assert_held(&sta->sdata->local->sta_mtx); in ieee80211_sta_free_link()
2906 sta_remove_link(sta, link_id, false); in ieee80211_sta_free_link()
2909 int ieee80211_sta_activate_link(struct sta_info *sta, unsigned int link_id) in ieee80211_sta_activate_link() argument
2911 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_sta_activate_link()
2913 u16 old_links = sta->sta.valid_links; in ieee80211_sta_activate_link()
2917 link_sta = rcu_dereference_protected(sta->link[link_id], in ieee80211_sta_activate_link()
2931 sta->sta.valid_links = new_links; in ieee80211_sta_activate_link()
2933 if (!test_sta_flag(sta, WLAN_STA_INSERTED)) in ieee80211_sta_activate_link()
2941 ieee80211_sta_recalc_aggregates(&sta->sta); in ieee80211_sta_activate_link()
2943 ret = drv_change_sta_links(sdata->local, sdata, &sta->sta, in ieee80211_sta_activate_link()
2946 sta->sta.valid_links = old_links; in ieee80211_sta_activate_link()
2947 sta_remove_link(sta, link_id, false); in ieee80211_sta_activate_link()
2957 void ieee80211_sta_remove_link(struct sta_info *sta, unsigned int link_id) in ieee80211_sta_remove_link() argument
2959 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_sta_remove_link()
2960 u16 old_links = sta->sta.valid_links; in ieee80211_sta_remove_link()
2964 sta->sta.valid_links &= ~BIT(link_id); in ieee80211_sta_remove_link()
2966 if (test_sta_flag(sta, WLAN_STA_INSERTED)) in ieee80211_sta_remove_link()
2967 drv_change_sta_links(sdata->local, sdata, &sta->sta, in ieee80211_sta_remove_link()
2968 old_links, sta->sta.valid_links); in ieee80211_sta_remove_link()
2970 sta_remove_link(sta, link_id, true); in ieee80211_sta_remove_link()
2973 void ieee80211_sta_set_max_amsdu_subframes(struct sta_info *sta, in ieee80211_sta_set_max_amsdu_subframes() argument
2979 sta->sta.max_amsdu_subframes = 0; in ieee80211_sta_set_max_amsdu_subframes()
2993 sta->sta.max_amsdu_subframes = 4 << val; in ieee80211_sta_set_max_amsdu_subframes()
2999 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in lockdep_sta_mutex_held() local
3001 return lockdep_is_held(&sta->local->sta_mtx); in lockdep_sta_mutex_held()