Lines Matching refs:sdata

100 static void run_again(struct ieee80211_sub_if_data *sdata,  in run_again()  argument
103 sdata_assert_lock(sdata); in run_again()
105 if (!timer_pending(&sdata->u.mgd.timer) || in run_again()
106 time_before(timeout, sdata->u.mgd.timer.expires)) in run_again()
107 mod_timer(&sdata->u.mgd.timer, timeout); in run_again()
110 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_beacon_monitor() argument
112 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_reset_beacon_monitor()
115 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_beacon_monitor()
118 mod_timer(&sdata->u.mgd.bcn_mon_timer, in ieee80211_sta_reset_beacon_monitor()
119 round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout)); in ieee80211_sta_reset_beacon_monitor()
122 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_conn_monitor() argument
124 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_reset_conn_monitor()
132 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_conn_monitor()
145 ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, in ieee80211_determine_chantype() argument
153 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_determine_chantype()
159 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_determine_chantype()
184 sdata_info(sdata, in ieee80211_determine_chantype()
221 if (!ieee80211_chandef_vht_oper(&sdata->local->hw, in ieee80211_determine_chantype()
225 sdata_info(sdata, in ieee80211_determine_chantype()
230 } else if (!ieee80211_chandef_vht_oper(&sdata->local->hw, vht_oper, in ieee80211_determine_chantype()
233 sdata_info(sdata, in ieee80211_determine_chantype()
241 sdata_info(sdata, in ieee80211_determine_chantype()
254 sdata_info(sdata, in ieee80211_determine_chantype()
284 cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_determine_chantype()
299 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, in ieee80211_determine_chantype()
312 sdata_info(sdata, in ieee80211_determine_chantype()
319 static int ieee80211_config_bw(struct ieee80211_sub_if_data *sdata, in ieee80211_config_bw() argument
327 struct ieee80211_local *local = sdata->local; in ieee80211_config_bw()
328 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_config_bw()
329 struct ieee80211_channel *chan = sdata->vif.bss_conf.chandef.chan; in ieee80211_config_bw()
359 if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) { in ieee80211_config_bw()
361 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; in ieee80211_config_bw()
365 flags = ieee80211_determine_chantype(sdata, sband, chan, in ieee80211_config_bw()
386 if (cfg80211_chandef_identical(&chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_config_bw()
389 sdata_info(sdata, in ieee80211_config_bw()
400 sdata_info(sdata, in ieee80211_config_bw()
434 ret = ieee80211_vif_change_bandwidth(sdata, &chandef, changed); in ieee80211_config_bw()
436 sdata_info(sdata, in ieee80211_config_bw()
453 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
467 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
492 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_40MHZ) { in ieee80211_add_ht_ie()
527 static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
532 struct ieee80211_local *local = sdata->local; in ieee80211_add_vht_ie()
541 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
546 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_80P80MHZ) { in ieee80211_add_vht_ie()
555 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_160MHZ) { in ieee80211_add_vht_ie()
592 sdata->vif.mu_mimo_owner = true; in ieee80211_add_vht_ie()
613 static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_he_ie() argument
638 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
640 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
641 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
654 sdata_assert_lock(sdata); in ieee80211_send_assoc()
657 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_send_assoc()
665 shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_send_assoc()
730 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
876 ieee80211_add_ht_ie(sdata, skb, assoc_data->ap_ht_param, in ieee80211_send_assoc()
877 sband, chan, sdata->smps_mode); in ieee80211_send_assoc()
930 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_send_assoc()
943 ieee80211_add_he_ie(sdata, skb, sband); in ieee80211_send_assoc()
983 drv_mgd_prepare_tx(local, sdata, 0); in ieee80211_send_assoc()
989 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
993 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
998 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
1006 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
1010 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
1015 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
1018 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_send_nullfunc()
1022 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif, in ieee80211_send_nullfunc()
1040 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
1044 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
1050 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
1054 if (!(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE)) in ieee80211_send_4addr_nullfunc()
1067 memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1068 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1069 memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1070 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1073 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
1079 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_work() local
1081 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
1082 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
1085 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
1088 sdata_lock(sdata); in ieee80211_chswitch_work()
1095 if (!sdata->vif.csa_active) in ieee80211_chswitch_work()
1105 if (sdata->reserved_chanctx) { in ieee80211_chswitch_work()
1115 if (sdata->reserved_ready) in ieee80211_chswitch_work()
1118 if (sdata->vif.bss_conf.chandef.width != in ieee80211_chswitch_work()
1119 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1130 switch (sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1148 mgd_sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_chswitch_work()
1150 local->hw.wiphy->bands[sdata->csa_chandef.chan->band]; in ieee80211_chswitch_work()
1153 if (sdata->vif.bss_conf.chandef.width > in ieee80211_chswitch_work()
1154 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1160 ret = ieee80211_vif_use_reserved_context(sdata); in ieee80211_chswitch_work()
1162 sdata_info(sdata, in ieee80211_chswitch_work()
1165 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1170 if (sdata->vif.bss_conf.chandef.width < in ieee80211_chswitch_work()
1171 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1180 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in ieee80211_chswitch_work()
1181 &sdata->csa_chandef)) { in ieee80211_chswitch_work()
1182 sdata_info(sdata, in ieee80211_chswitch_work()
1184 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1191 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_chswitch_work()
1192 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_chswitch_work()
1197 sdata_unlock(sdata); in ieee80211_chswitch_work()
1200 static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata) in ieee80211_chswitch_post_beacon() argument
1202 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_post_beacon()
1203 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_post_beacon()
1206 sdata_assert_lock(sdata); in ieee80211_chswitch_post_beacon()
1208 WARN_ON(!sdata->vif.csa_active); in ieee80211_chswitch_post_beacon()
1210 if (sdata->csa_block_tx) { in ieee80211_chswitch_post_beacon()
1211 ieee80211_wake_vif_queues(local, sdata, in ieee80211_chswitch_post_beacon()
1213 sdata->csa_block_tx = false; in ieee80211_chswitch_post_beacon()
1216 sdata->vif.csa_active = false; in ieee80211_chswitch_post_beacon()
1219 ret = drv_post_channel_switch(sdata); in ieee80211_chswitch_post_beacon()
1221 sdata_info(sdata, in ieee80211_chswitch_post_beacon()
1228 cfg80211_ch_switch_notify(sdata->dev, &sdata->reserved_chandef); in ieee80211_chswitch_post_beacon()
1233 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
1234 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
1236 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
1238 sdata_info(sdata, in ieee80211_chswitch_done()
1240 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1243 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); in ieee80211_chswitch_done()
1250 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_timer() local
1251 from_timer(sdata, t, u.mgd.chswitch_timer); in ieee80211_chswitch_timer()
1253 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work); in ieee80211_chswitch_timer()
1257 ieee80211_sta_abort_chanswitch(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_abort_chanswitch() argument
1259 struct ieee80211_local *local = sdata->local; in ieee80211_sta_abort_chanswitch()
1267 ieee80211_vif_unreserve_chanctx(sdata); in ieee80211_sta_abort_chanswitch()
1270 if (sdata->csa_block_tx) in ieee80211_sta_abort_chanswitch()
1271 ieee80211_wake_vif_queues(local, sdata, in ieee80211_sta_abort_chanswitch()
1274 sdata->csa_block_tx = false; in ieee80211_sta_abort_chanswitch()
1275 sdata->vif.csa_active = false; in ieee80211_sta_abort_chanswitch()
1279 drv_abort_channel_switch(sdata); in ieee80211_sta_abort_chanswitch()
1283 ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_process_chanswitch() argument
1288 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1289 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1298 sdata_assert_lock(sdata); in ieee80211_sta_process_chanswitch()
1307 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band, in ieee80211_sta_process_chanswitch()
1326 if (beacon && sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) { in ieee80211_sta_process_chanswitch()
1328 ieee80211_sta_abort_chanswitch(sdata); in ieee80211_sta_process_chanswitch()
1330 drv_channel_switch_rx_beacon(sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1332 } else if (sdata->vif.csa_active || res) { in ieee80211_sta_process_chanswitch()
1339 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1351 &sdata->vif.bss_conf.chandef) && in ieee80211_sta_process_chanswitch()
1355 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1368 ieee80211_teardown_tdls_peers(sdata); in ieee80211_sta_process_chanswitch()
1372 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in ieee80211_sta_process_chanswitch()
1375 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1384 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1389 if (drv_pre_channel_switch(sdata, &ch_switch)) { in ieee80211_sta_process_chanswitch()
1390 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1395 res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1398 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1405 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1406 sdata->csa_chandef = csa_ie.chandef; in ieee80211_sta_process_chanswitch()
1407 sdata->csa_block_tx = ch_switch.block_tx; in ieee80211_sta_process_chanswitch()
1410 if (sdata->csa_block_tx) in ieee80211_sta_process_chanswitch()
1411 ieee80211_stop_vif_queues(local, sdata, in ieee80211_sta_process_chanswitch()
1415 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1420 drv_channel_switch(local, sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1440 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1441 sdata->csa_block_tx = ch_switch.block_tx; in ieee80211_sta_process_chanswitch()
1449 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_find_80211h_pwr_constr() argument
1510 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata, in ieee80211_find_cisco_dtpc() argument
1524 static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_pwr_constr() argument
1541 sdata, channel, country_ie, country_ie_len, in ieee80211_handle_pwr_constr()
1549 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco); in ieee80211_handle_pwr_constr()
1563 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1566 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1569 sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1573 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1576 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1578 pwr_level_cisco, sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1581 sdata->ap_power_level = new_ap_level; in ieee80211_handle_pwr_constr()
1582 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
1589 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
1606 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_enable_ps()
1631 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
1633 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
1653 sta = sta_info_get(sdata, mgd->bssid); in ieee80211_powersave_allowed()
1664 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
1673 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
1674 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
1676 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
1684 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
1686 found = sdata; in ieee80211_recalc_ps()
1711 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
1713 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
1715 if (sdata->vif.bss_conf.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
1716 sdata->vif.bss_conf.ps = ps_allowed; in ieee80211_recalc_ps_vif()
1717 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
1743 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
1749 if (!sdata) in ieee80211_dynamic_ps_enable_work()
1752 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
1792 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_dynamic_ps_enable_work()
1794 ieee80211_flush_queues(local, sdata, false); in ieee80211_dynamic_ps_enable_work()
1817 struct ieee80211_sub_if_data *sdata = in ieee80211_dfs_cac_timer_work() local
1820 struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef; in ieee80211_dfs_cac_timer_work()
1822 mutex_lock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1823 if (sdata->wdev.cac_started) { in ieee80211_dfs_cac_timer_work()
1824 ieee80211_vif_release_channel(sdata); in ieee80211_dfs_cac_timer_work()
1825 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_dfs_cac_timer_work()
1829 mutex_unlock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1833 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in __ieee80211_sta_handle_tspec_ac_params() argument
1835 struct ieee80211_local *local = sdata->local; in __ieee80211_sta_handle_tspec_ac_params()
1836 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_sta_handle_tspec_ac_params()
1862 if (drv_conf_tx(local, sdata, ac, &sdata->tx_conf[ac])) in __ieee80211_sta_handle_tspec_ac_params()
1863 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1880 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac))) in __ieee80211_sta_handle_tspec_ac_params()
1891 if (drv_conf_tx(local, sdata, ac, in __ieee80211_sta_handle_tspec_ac_params()
1892 &sdata->tx_conf[non_acm_ac])) in __ieee80211_sta_handle_tspec_ac_params()
1893 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1910 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_handle_tspec_ac_params() argument
1912 if (__ieee80211_sta_handle_tspec_ac_params(sdata)) in ieee80211_sta_handle_tspec_ac_params()
1913 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); in ieee80211_sta_handle_tspec_ac_params()
1918 struct ieee80211_sub_if_data *sdata; in ieee80211_sta_handle_tspec_ac_params_wk() local
1920 sdata = container_of(work, struct ieee80211_sub_if_data, in ieee80211_sta_handle_tspec_ac_params_wk()
1922 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_sta_handle_tspec_ac_params_wk()
1928 struct ieee80211_sub_if_data *sdata, in ieee80211_sta_wmm_params() argument
1933 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
1971 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
1981 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
1991 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
2001 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
2012 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
2024 sdata_info(sdata, in ieee80211_sta_wmm_params()
2037 sdata_info(sdata, in ieee80211_sta_wmm_params()
2042 ieee80211_regulatory_limit_wmm_params(sdata, &params[ac], ac); in ieee80211_sta_wmm_params()
2048 sdata_info(sdata, in ieee80211_sta_wmm_params()
2056 mlme_dbg(sdata, in ieee80211_sta_wmm_params()
2062 sdata->tx_conf[ac] = params[ac]; in ieee80211_sta_wmm_params()
2064 drv_conf_tx(local, sdata, ac, &params[ac])) in ieee80211_sta_wmm_params()
2065 sdata_err(sdata, in ieee80211_sta_wmm_params()
2071 sdata->vif.bss_conf.qos = true; in ieee80211_sta_wmm_params()
2075 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
2077 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
2079 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL; in __ieee80211_stop_poll()
2080 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
2083 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
2085 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
2086 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
2087 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
2090 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_bss_capability() argument
2093 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_handle_bss_capability()
2100 sband = ieee80211_get_sband(sdata); in ieee80211_handle_bss_capability()
2134 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
2139 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
2140 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_set_associated()
2143 bss_info_changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_set_associated()
2146 sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec( in ieee80211_set_associated()
2149 sdata->u.mgd.associated = cbss; in ieee80211_set_associated()
2150 memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); in ieee80211_set_associated()
2152 ieee80211_check_rate_mask(sdata); in ieee80211_set_associated()
2154 sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE; in ieee80211_set_associated()
2156 if (sdata->vif.p2p || in ieee80211_set_associated()
2157 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_set_associated()
2171 sdata->u.mgd.p2p_noa_index = in ieee80211_set_associated()
2180 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
2184 if (sdata->u.mgd.have_beacon) { in ieee80211_set_associated()
2191 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; in ieee80211_set_associated()
2202 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_set_associated()
2210 ieee80211_bss_info_change_notify(sdata, bss_info_changed); in ieee80211_set_associated()
2216 ieee80211_recalc_smps(sdata); in ieee80211_set_associated()
2217 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
2219 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
2222 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
2226 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
2227 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
2230 sdata_assert_lock(sdata); in ieee80211_set_disassoc()
2238 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
2241 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
2255 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
2267 ieee80211_flush_queues(local, sdata, true); in ieee80211_set_disassoc()
2279 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_set_disassoc()
2281 ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, in ieee80211_set_disassoc()
2288 ieee80211_flush_queues(local, sdata, false); in ieee80211_set_disassoc()
2294 sta_info_flush(sdata); in ieee80211_set_disassoc()
2297 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
2301 sdata->vif.bss_conf.assoc = false; in ieee80211_set_disassoc()
2304 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
2305 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
2314 memset(sdata->vif.bss_conf.mu_group.membership, 0, in ieee80211_set_disassoc()
2315 sizeof(sdata->vif.bss_conf.mu_group.membership)); in ieee80211_set_disassoc()
2316 memset(sdata->vif.bss_conf.mu_group.position, 0, in ieee80211_set_disassoc()
2317 sizeof(sdata->vif.bss_conf.mu_group.position)); in ieee80211_set_disassoc()
2319 sdata->vif.mu_mimo_owner = false; in ieee80211_set_disassoc()
2321 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
2327 if (sdata->vif.bss_conf.arp_addr_cnt) in ieee80211_set_disassoc()
2330 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
2335 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
2338 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_set_disassoc()
2340 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
2341 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
2342 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
2343 del_timer_sync(&sdata->u.mgd.chswitch_timer); in ieee80211_set_disassoc()
2345 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
2346 sdata->vif.bss_conf.beacon_rate = NULL; in ieee80211_set_disassoc()
2352 ieee80211_vif_release_channel(sdata); in ieee80211_set_disassoc()
2354 sdata->vif.csa_active = false; in ieee80211_set_disassoc()
2357 if (sdata->csa_block_tx) { in ieee80211_set_disassoc()
2358 ieee80211_wake_vif_queues(local, sdata, in ieee80211_set_disassoc()
2360 sdata->csa_block_tx = false; in ieee80211_set_disassoc()
2368 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_set_disassoc()
2371 void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_notify() argument
2385 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_rx_notify()
2388 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
2390 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
2391 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
2397 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
2403 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_reset_ap_probe()
2411 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
2420 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_wmm_ac_notify() argument
2424 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_tx_wmm_ac_notify()
2455 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
2458 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time); in ieee80211_sta_tx_notify()
2464 sdata->u.mgd.probe_send_count > 0) { in ieee80211_sta_tx_notify()
2466 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2468 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
2469 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_tx_notify()
2474 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2477 static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata, in ieee80211_mlme_send_probe_req() argument
2484 skb = ieee80211_build_probe_req(sdata, src, dst, (u32)-1, channel, in ieee80211_mlme_send_probe_req()
2488 ieee80211_tx_skb(sdata, skb); in ieee80211_mlme_send_probe_req()
2491 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
2493 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
2517 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2518 sta = sta_info_get(sdata, dst); in ieee80211_mgd_probe_ap_send()
2521 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2524 if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { in ieee80211_mgd_probe_ap_send()
2529 ieee80211_send_nullfunc(sdata->local, sdata, false); in ieee80211_mgd_probe_ap_send()
2540 ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst, in ieee80211_mgd_probe_ap_send()
2547 run_again(sdata, ifmgd->probe_timeout); in ieee80211_mgd_probe_ap_send()
2550 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
2553 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
2556 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
2559 sdata_lock(sdata); in ieee80211_mgd_probe_ap()
2564 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2566 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
2567 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2572 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
2576 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL); in ieee80211_mgd_probe_ap()
2595 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2600 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2601 ieee80211_recalc_ps(sdata->local); in ieee80211_mgd_probe_ap()
2602 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2605 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
2607 sdata_unlock(sdata); in ieee80211_mgd_probe_ap()
2613 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
2614 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
2620 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_ap_probereq_get()
2623 sdata_assert_lock(sdata); in ieee80211_ap_probereq_get()
2642 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, in ieee80211_ap_probereq_get()
2652 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata, in ieee80211_report_disconnect() argument
2663 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2665 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2667 drv_event_callback(sdata->local, sdata, &event); in ieee80211_report_disconnect()
2670 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
2672 struct ieee80211_local *local = sdata->local; in __ieee80211_disconnect()
2673 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_disconnect()
2677 sdata_lock(sdata); in __ieee80211_disconnect()
2679 sdata_unlock(sdata); in __ieee80211_disconnect()
2683 tx = !sdata->csa_block_tx; in __ieee80211_disconnect()
2690 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in __ieee80211_disconnect()
2694 sdata->vif.csa_active = false; in __ieee80211_disconnect()
2696 if (sdata->csa_block_tx) { in __ieee80211_disconnect()
2697 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_disconnect()
2699 sdata->csa_block_tx = false; in __ieee80211_disconnect()
2703 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx, in __ieee80211_disconnect()
2706 sdata_unlock(sdata); in __ieee80211_disconnect()
2711 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
2714 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
2720 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
2722 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
2724 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
2730 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
2734 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
2739 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
2740 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
2742 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
2744 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
2745 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
2751 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
2752 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
2754 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
2756 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
2757 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
2762 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
2765 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
2767 sdata_assert_lock(sdata); in ieee80211_destroy_auth_data()
2775 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_auth_data()
2776 sta_info_destroy_addr(sdata, auth_data->bss->bssid); in ieee80211_destroy_auth_data()
2778 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_auth_data()
2779 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_auth_data()
2780 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
2781 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2782 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_auth_data()
2783 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2786 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
2788 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
2791 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
2794 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
2796 sdata_assert_lock(sdata); in ieee80211_destroy_assoc_data()
2804 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_assoc_data()
2805 sta_info_destroy_addr(sdata, assoc_data->bss->bssid); in ieee80211_destroy_assoc_data()
2807 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_assoc_data()
2808 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_assoc_data()
2809 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
2810 sdata->vif.mu_mimo_owner = false; in ieee80211_destroy_assoc_data()
2812 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2813 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_assoc_data()
2814 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2817 cfg80211_abandon_assoc(sdata->dev, assoc_data->bss); in ieee80211_destroy_assoc_data()
2821 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
2824 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
2827 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
2828 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
2839 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_auth_challenge()
2843 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
2850 static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mark_sta_auth() argument
2853 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mark_sta_auth()
2857 sdata_info(sdata, "authenticated\n"); in ieee80211_mark_sta_auth()
2861 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_mark_sta_auth()
2864 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
2865 sta = sta_info_get(sdata, bssid); in ieee80211_mark_sta_auth()
2867 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid); in ieee80211_mark_sta_auth()
2872 sdata_info(sdata, "failed moving %pM to auth\n", bssid); in ieee80211_mark_sta_auth()
2878 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
2882 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
2885 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
2893 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_auth()
2916 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
2924 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
2926 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
2927 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2930 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
2945 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
2957 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
2961 if (!ieee80211_mark_sta_auth(sdata, bssid)) in ieee80211_rx_mgmt_auth()
2965 sdata_info(sdata, "SAE peer confirmed\n"); in ieee80211_rx_mgmt_auth()
2969 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2972 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
3033 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
3036 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
3039 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_deauth()
3045 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_deauth()
3053 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_deauth()
3057 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
3059 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, in ieee80211_rx_mgmt_deauth()
3068 sdata_info(sdata, in ieee80211_rx_mgmt_deauth()
3073 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_rx_mgmt_deauth()
3075 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_deauth()
3081 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
3084 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
3087 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_disassoc()
3099 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_disassoc()
3103 sdata_info(sdata, "disassociated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_disassoc()
3107 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
3109 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code); in ieee80211_rx_mgmt_disassoc()
3174 static int ieee80211_recalc_twt_req(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_twt_req() argument
3180 if (sdata->vif.bss_conf.twt_requester != twt) { in ieee80211_recalc_twt_req()
3181 sdata->vif.bss_conf.twt_requester = twt; in ieee80211_recalc_twt_req()
3187 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
3191 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
3192 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
3198 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_assoc_success()
3219 sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n", in ieee80211_assoc_success()
3230 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_success()
3270 sdata_info(sdata, in ieee80211_assoc_success()
3281 sdata_info(sdata, in ieee80211_assoc_success()
3287 sdata_info(sdata, in ieee80211_assoc_success()
3293 sdata_info(sdata, in ieee80211_assoc_success()
3299 sdata_info(sdata, in ieee80211_assoc_success()
3310 sdata_info(sdata, in ieee80211_assoc_success()
3318 sdata_info(sdata, in ieee80211_assoc_success()
3324 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3329 sta = sta_info_get(sdata, cbss->bssid); in ieee80211_assoc_success()
3331 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3336 sband = ieee80211_get_sband(sdata); in ieee80211_assoc_success()
3338 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3345 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3346 sdata_info(sdata, in ieee80211_assoc_success()
3354 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_success()
3358 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_success()
3363 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, in ieee80211_assoc_success()
3369 changed |= ieee80211_recalc_twt_req(sdata, sta, &elems); in ieee80211_assoc_success()
3399 ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems.he_operation); in ieee80211_assoc_success()
3400 ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems.he_spr); in ieee80211_assoc_success()
3449 sdata_info(sdata, in ieee80211_assoc_success()
3453 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3458 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3470 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_assoc_success()
3471 } else if (!ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_assoc_success()
3475 ieee80211_set_wmm_default(sdata, false, true); in ieee80211_assoc_success()
3503 ieee80211_set_associated(sdata, cbss, changed); in ieee80211_assoc_success()
3510 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
3516 ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt); in ieee80211_assoc_success()
3517 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
3525 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
3529 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
3542 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_assoc_resp()
3562 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3568 fils_decrypt_assoc_resp(sdata, (u8 *)mgmt, &len, assoc_data) < 0) in ieee80211_rx_mgmt_assoc_resp()
3581 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3587 run_again(sdata, assoc_data->timeout); in ieee80211_rx_mgmt_assoc_resp()
3594 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
3596 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3599 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3601 if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) { in ieee80211_rx_mgmt_assoc_resp()
3603 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3604 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_rx_mgmt_assoc_resp()
3608 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3609 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
3616 ieee80211_destroy_assoc_data(sdata, true, false); in ieee80211_rx_mgmt_assoc_resp()
3621 if (sdata->tx_conf[ac].uapsd) in ieee80211_rx_mgmt_assoc_resp()
3625 cfg80211_rx_assoc_resp(sdata->dev, bss, (u8 *)mgmt, len, uapsd_queues, in ieee80211_rx_mgmt_assoc_resp()
3629 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_bss_info() argument
3633 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
3637 sdata_assert_lock(sdata); in ieee80211_rx_bss_info()
3645 sdata->vif.bss_conf.beacon_rate = bss->beacon_rate; in ieee80211_rx_bss_info()
3651 static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_probe_resp() argument
3659 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
3661 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_probe_resp()
3663 if (!ether_addr_equal(mgmt->da, sdata->vif.addr)) in ieee80211_rx_mgmt_probe_resp()
3670 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_probe_resp()
3674 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
3701 static void ieee80211_handle_beacon_sig(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_beacon_sig() argument
3737 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3743 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3749 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_handle_beacon_sig()
3759 &sdata->vif, in ieee80211_handle_beacon_sig()
3766 &sdata->vif, in ieee80211_handle_beacon_sig()
3783 &sdata->vif, in ieee80211_handle_beacon_sig()
3790 &sdata->vif, in ieee80211_handle_beacon_sig()
3807 static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_beacon() argument
3811 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
3812 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
3815 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
3826 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_beacon()
3834 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_rx_mgmt_beacon()
3854 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_beacon()
3861 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3863 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3865 sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count; in ieee80211_rx_mgmt_beacon()
3879 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_rx_mgmt_beacon()
3889 ieee80211_handle_beacon_sig(sdata, ifmgd, bss_conf, in ieee80211_rx_mgmt_beacon()
3893 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
3895 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_beacon()
3902 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
3918 ieee80211_send_nullfunc(local, sdata, false); in ieee80211_rx_mgmt_beacon()
3919 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
3930 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
3934 if (sdata->vif.p2p || in ieee80211_rx_mgmt_beacon()
3935 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_rx_mgmt_beacon()
3944 if (sdata->u.mgd.p2p_noa_index != noa.index) { in ieee80211_rx_mgmt_beacon()
3946 sdata->u.mgd.p2p_noa_index = noa.index; in ieee80211_rx_mgmt_beacon()
3955 } else if (sdata->u.mgd.p2p_noa_index != -1) { in ieee80211_rx_mgmt_beacon()
3957 sdata->u.mgd.p2p_noa_index = -1; in ieee80211_rx_mgmt_beacon()
3965 ieee80211_chswitch_post_beacon(sdata); in ieee80211_rx_mgmt_beacon()
3976 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3978 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3980 sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count; in ieee80211_rx_mgmt_beacon()
3988 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_beacon()
3990 ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, in ieee80211_rx_mgmt_beacon()
3995 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_rx_mgmt_beacon()
4015 ieee80211_recalc_ps_vif(sdata); in ieee80211_rx_mgmt_beacon()
4024 changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_rx_mgmt_beacon()
4029 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_beacon()
4031 changed |= ieee80211_recalc_twt_req(sdata, sta, &elems); in ieee80211_rx_mgmt_beacon()
4033 if (ieee80211_config_bw(sdata, sta, in ieee80211_rx_mgmt_beacon()
4038 sdata_info(sdata, in ieee80211_rx_mgmt_beacon()
4041 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
4044 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
4051 ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif, in ieee80211_rx_mgmt_beacon()
4055 changed |= ieee80211_handle_pwr_constr(sdata, chan, mgmt, in ieee80211_rx_mgmt_beacon()
4061 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_rx_mgmt_beacon()
4064 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
4077 sdata_lock(sdata); in ieee80211_sta_rx_queued_mgmt()
4081 ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, rx_status); in ieee80211_sta_rx_queued_mgmt()
4084 ieee80211_rx_mgmt_probe_resp(sdata, skb); in ieee80211_sta_rx_queued_mgmt()
4087 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4090 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4093 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4097 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4116 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
4143 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
4150 sdata_unlock(sdata); in ieee80211_sta_rx_queued_mgmt()
4155 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
4156 from_timer(sdata, t, u.mgd.timer); in ieee80211_sta_timer()
4158 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_timer()
4161 static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
4166 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
4169 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_sta_connection_lost()
4173 static int ieee80211_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_auth() argument
4175 struct ieee80211_local *local = sdata->local; in ieee80211_auth()
4176 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_auth()
4183 sdata_assert_lock(sdata); in ieee80211_auth()
4191 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_auth()
4207 drv_mgd_prepare_tx(local, sdata, prepare_tx_duration); in ieee80211_auth()
4209 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_auth()
4225 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_auth()
4243 run_again(sdata, auth_data->timeout); in ieee80211_auth()
4248 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
4250 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
4251 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
4253 sdata_assert_lock(sdata); in ieee80211_do_assoc()
4257 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
4269 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
4272 ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
4277 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4283 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4289 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
4292 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
4294 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
4295 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
4296 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
4298 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mgd_conn_tx_status()
4301 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
4303 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
4304 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
4306 sdata_lock(sdata); in ieee80211_sta_work()
4324 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4335 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4350 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4351 } else if (ieee80211_auth(sdata)) { in ieee80211_sta_work()
4361 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4363 cfg80211_auth_timeout(sdata->dev, bssid); in ieee80211_sta_work()
4364 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4367 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4372 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
4380 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_sta_work()
4381 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_sta_work()
4382 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4385 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4401 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
4404 mlme_dbg(sdata, in ieee80211_sta_work()
4408 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4410 mlme_dbg(sdata, in ieee80211_sta_work()
4413 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4418 run_again(sdata, ifmgd->probe_timeout); in ieee80211_sta_work()
4420 mlme_dbg(sdata, in ieee80211_sta_work()
4423 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4426 mlme_dbg(sdata, in ieee80211_sta_work()
4430 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4436 mlme_dbg(sdata, in ieee80211_sta_work()
4440 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4445 sdata_unlock(sdata); in ieee80211_sta_work()
4450 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
4451 from_timer(sdata, t, u.mgd.bcn_mon_timer); in ieee80211_sta_bcn_mon_timer()
4452 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_bcn_mon_timer()
4454 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_bcn_mon_timer()
4457 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
4458 ieee80211_queue_work(&sdata->local->hw, in ieee80211_sta_bcn_mon_timer()
4459 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
4464 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
4465 from_timer(sdata, t, u.mgd.conn_mon_timer); in ieee80211_sta_conn_mon_timer()
4466 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
4467 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
4469 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_conn_mon_timer()
4477 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
4481 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
4484 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
4486 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
4487 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
4490 if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_restart_sta_timer()
4491 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
4492 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
4497 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_quiesce() argument
4499 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_quiesce()
4502 sdata_lock(sdata); in ieee80211_mgd_quiesce()
4514 ieee80211_send_deauth_disassoc(sdata, bssid, bssid, in ieee80211_mgd_quiesce()
4519 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_quiesce()
4521 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_quiesce()
4522 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, in ieee80211_mgd_quiesce()
4543 if (ifmgd->associated && !sdata->local->wowlan) { in ieee80211_mgd_quiesce()
4551 ieee80211_mgd_deauth(sdata, &req); in ieee80211_mgd_quiesce()
4554 sdata_unlock(sdata); in ieee80211_mgd_quiesce()
4557 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
4559 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
4561 sdata_lock(sdata); in ieee80211_sta_restart()
4563 sdata_unlock(sdata); in ieee80211_sta_restart()
4567 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
4568 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
4569 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
4570 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
4574 sdata_unlock(sdata); in ieee80211_sta_restart()
4577 sdata_unlock(sdata); in ieee80211_sta_restart()
4582 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
4586 ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
4604 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
4605 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
4606 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
4609 if (sdata->local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS) in ieee80211_sta_setup_sdata()
4623 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
4627 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
4628 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
4629 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
4634 static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, in ieee80211_ht_vht_rx_chains() argument
4637 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ht_vht_rx_chains()
4740 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
4743 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
4744 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_channel()
4791 sdata_info(sdata, in ieee80211_prep_channel()
4838 ifmgd->flags |= ieee80211_determine_chantype(sdata, sband, in ieee80211_prep_channel()
4843 sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss), in ieee80211_prep_channel()
4849 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_prep_channel()
4857 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
4867 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
4909 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
4913 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
4914 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
4932 have_sta = sta_info_get(sdata, cbss->bssid); in ieee80211_prep_connection()
4937 new_sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL); in ieee80211_prep_connection()
4960 int shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_prep_connection()
4978 sdata_info(sdata, in ieee80211_prep_connection()
4986 sdata_info(sdata, in ieee80211_prep_connection()
4989 sdata->vif.bss_conf.basic_rates = basic_rates; in ieee80211_prep_connection()
4994 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
4996 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
5001 sdata->vif.bss_conf.beacon_int = cbss->beacon_interval; in ieee80211_prep_connection()
5005 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
5006 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
5010 &sdata->vif.bss_conf.sync_dtim_count, in ieee80211_prep_connection()
5012 } else if (!ieee80211_hw_check(&sdata->local->hw, in ieee80211_prep_connection()
5016 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
5017 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
5019 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
5021 sdata->vif.bss_conf.sync_tsf = 0; in ieee80211_prep_connection()
5022 sdata->vif.bss_conf.sync_device_ts = 0; in ieee80211_prep_connection()
5023 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
5029 err = ieee80211_prep_channel(sdata, cbss); in ieee80211_prep_connection()
5042 ieee80211_bss_info_change_notify(sdata, in ieee80211_prep_connection()
5052 sdata_info(sdata, in ieee80211_prep_connection()
5068 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
5071 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
5072 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
5161 ieee80211_destroy_auth_data(sdata, cont_auth); in ieee80211_mgd_auth()
5174 ieee80211_mark_sta_auth(sdata, req->bss->bssid); in ieee80211_mgd_auth()
5179 sdata_info(sdata, in ieee80211_mgd_auth()
5182 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
5186 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_auth()
5191 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); in ieee80211_mgd_auth()
5193 err = ieee80211_prep_connection(sdata, req->bss, cont_auth, false); in ieee80211_mgd_auth()
5197 err = ieee80211_auth(sdata); in ieee80211_mgd_auth()
5199 sta_info_destroy_addr(sdata, req->bss->bssid); in ieee80211_mgd_auth()
5209 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_auth()
5211 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_auth()
5212 ieee80211_vif_release_channel(sdata); in ieee80211_mgd_auth()
5213 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_auth()
5218 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
5221 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
5222 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
5249 sdata_info(sdata, in ieee80211_mgd_assoc()
5252 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
5256 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_assoc()
5276 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
5300 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5313 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5324 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5360 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_mgd_assoc()
5362 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_mgd_assoc()
5364 sdata->smps_mode = ifmgd->req_smps; in ieee80211_mgd_assoc()
5385 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
5388 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in ieee80211_mgd_assoc()
5391 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) { in ieee80211_mgd_assoc()
5420 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
5421 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
5422 sdata->control_port_over_nl80211 = in ieee80211_mgd_assoc()
5424 sdata->encrypt_headroom = ieee80211_cs_headroom(local, &req->crypto, in ieee80211_mgd_assoc()
5425 sdata->vif.type); in ieee80211_mgd_assoc()
5441 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_mgd_assoc()
5462 err = ieee80211_prep_connection(sdata, req->bss, true, override); in ieee80211_mgd_assoc()
5469 if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) && in ieee80211_mgd_assoc()
5475 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
5492 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; in ieee80211_mgd_assoc()
5493 sdata->vif.bss_conf.sync_device_ts = in ieee80211_mgd_assoc()
5495 sdata->vif.bss_conf.sync_dtim_count = dtim_count; in ieee80211_mgd_assoc()
5501 sdata->vif.bss_conf.profile_periodicity = ie[4]; in ieee80211_mgd_assoc()
5507 sdata->vif.bss_conf.ema_ap = true; in ieee80211_mgd_assoc()
5514 run_again(sdata, assoc_data->timeout); in ieee80211_mgd_assoc()
5526 sdata_info(sdata, "associating with AP with corrupt %s\n", in ieee80211_mgd_assoc()
5533 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_assoc()
5540 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
5543 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
5549 sdata_info(sdata, in ieee80211_mgd_deauth()
5554 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_mgd_deauth()
5555 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
5559 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
5560 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5569 sdata_info(sdata, in ieee80211_mgd_deauth()
5574 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_mgd_deauth()
5575 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
5579 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_deauth()
5580 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5588 sdata_info(sdata, in ieee80211_mgd_deauth()
5593 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
5595 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5604 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
5607 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_disassoc()
5620 sdata_info(sdata, in ieee80211_mgd_disassoc()
5625 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
5629 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_mgd_disassoc()
5635 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
5637 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
5651 sdata_lock(sdata); in ieee80211_mgd_stop()
5654 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_mgd_stop()
5655 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_mgd_stop()
5658 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
5670 sdata_unlock(sdata); in ieee80211_mgd_stop()
5678 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
5680 trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level); in ieee80211_cqm_rssi_notify()
5682 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp); in ieee80211_cqm_rssi_notify()
5688 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_beacon_loss_notify() local
5690 trace_api_cqm_beacon_loss_notify(sdata->local, sdata); in ieee80211_cqm_beacon_loss_notify()
5692 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp); in ieee80211_cqm_beacon_loss_notify()