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
155 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_determine_chantype()
167 if (!ieee80211_chandef_he_6ghz_oper(sdata, he_oper, chandef)) in ieee80211_determine_chantype()
177 sdata_info(sdata, in ieee80211_determine_chantype()
190 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_determine_chantype()
212 sdata_info(sdata, in ieee80211_determine_chantype()
251 if (!ieee80211_chandef_vht_oper(&sdata->local->hw, vht_cap_info, in ieee80211_determine_chantype()
255 sdata_info(sdata, in ieee80211_determine_chantype()
260 } else if (!ieee80211_chandef_vht_oper(&sdata->local->hw, in ieee80211_determine_chantype()
265 sdata_info(sdata, in ieee80211_determine_chantype()
273 sdata_info(sdata, in ieee80211_determine_chantype()
286 sdata_info(sdata, in ieee80211_determine_chantype()
316 cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_determine_chantype()
331 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, in ieee80211_determine_chantype()
344 if (!he_oper || !cfg80211_chandef_usable(sdata->wdev.wiphy, chandef, in ieee80211_determine_chantype()
349 sdata_info(sdata, in ieee80211_determine_chantype()
356 static int ieee80211_config_bw(struct ieee80211_sub_if_data *sdata, in ieee80211_config_bw() argument
366 struct ieee80211_local *local = sdata->local; in ieee80211_config_bw()
367 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_config_bw()
368 struct ieee80211_channel *chan = sdata->vif.bss_conf.chandef.chan; in ieee80211_config_bw()
388 ieee80211_vif_type_p2p(&sdata->vif))) in ieee80211_config_bw()
400 if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) { in ieee80211_config_bw()
402 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; in ieee80211_config_bw()
409 flags = ieee80211_determine_chantype(sdata, sband, chan, vht_cap_info, in ieee80211_config_bw()
430 if (cfg80211_chandef_identical(&chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_config_bw()
433 sdata_info(sdata, in ieee80211_config_bw()
448 sdata_info(sdata, in ieee80211_config_bw()
454 ret = ieee80211_vif_change_bandwidth(sdata, &chandef, changed); in ieee80211_config_bw()
457 sdata_info(sdata, in ieee80211_config_bw()
468 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
482 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
507 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_40MHZ) { in ieee80211_add_ht_ie()
542 static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
547 struct ieee80211_local *local = sdata->local; in ieee80211_add_vht_ie()
556 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
561 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_80P80MHZ) { in ieee80211_add_vht_ie()
570 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_160MHZ) { in ieee80211_add_vht_ie()
607 sdata->vif.mu_mimo_owner = true; in ieee80211_add_vht_ie()
628 static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_he_ie() argument
639 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_add_he_ie()
641 reg_cap = cfg80211_chandef_usable(sdata->wdev.wiphy, in ieee80211_add_he_ie()
648 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_add_he_ie()
664 ieee80211_ie_build_he_6ghz_cap(sdata, skb); in ieee80211_add_he_ie()
667 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
669 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
670 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
684 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_send_assoc()
694 sdata_assert_lock(sdata); in ieee80211_send_assoc()
697 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_send_assoc()
705 shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_send_assoc()
774 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
927 ieee80211_add_ht_ie(sdata, skb, assoc_data->ap_ht_param, in ieee80211_send_assoc()
928 sband, chan, sdata->smps_mode); in ieee80211_send_assoc()
982 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_send_assoc()
995 ieee80211_add_he_ie(sdata, skb, sband); in ieee80211_send_assoc()
1019 ieee80211_add_aid_request_ie(sdata, skb); in ieee80211_send_assoc()
1020 ieee80211_add_s1g_capab_ie(sdata, &sband->s1g_cap, skb); in ieee80211_send_assoc()
1043 drv_mgd_prepare_tx(local, sdata, &info); in ieee80211_send_assoc()
1049 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
1053 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
1058 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
1066 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
1070 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
1075 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
1077 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif, in ieee80211_send_nullfunc()
1095 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
1099 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
1105 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
1118 memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1119 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1120 memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1121 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1124 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
1130 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_work() local
1132 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
1133 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
1136 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
1139 sdata_lock(sdata); in ieee80211_chswitch_work()
1146 if (!sdata->vif.csa_active) in ieee80211_chswitch_work()
1156 if (sdata->reserved_chanctx) { in ieee80211_chswitch_work()
1162 if (sdata->reserved_ready) in ieee80211_chswitch_work()
1165 ret = ieee80211_vif_use_reserved_context(sdata); in ieee80211_chswitch_work()
1167 sdata_info(sdata, in ieee80211_chswitch_work()
1170 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1178 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in ieee80211_chswitch_work()
1179 &sdata->csa_chandef)) { in ieee80211_chswitch_work()
1180 sdata_info(sdata, in ieee80211_chswitch_work()
1182 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1189 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_chswitch_work()
1190 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_chswitch_work()
1195 sdata_unlock(sdata); in ieee80211_chswitch_work()
1198 static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata) in ieee80211_chswitch_post_beacon() argument
1200 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_post_beacon()
1201 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_post_beacon()
1204 sdata_assert_lock(sdata); in ieee80211_chswitch_post_beacon()
1206 WARN_ON(!sdata->vif.csa_active); in ieee80211_chswitch_post_beacon()
1208 if (sdata->csa_block_tx) { in ieee80211_chswitch_post_beacon()
1209 ieee80211_wake_vif_queues(local, sdata, in ieee80211_chswitch_post_beacon()
1211 sdata->csa_block_tx = false; in ieee80211_chswitch_post_beacon()
1214 sdata->vif.csa_active = false; in ieee80211_chswitch_post_beacon()
1222 ret = drv_post_channel_switch(sdata); in ieee80211_chswitch_post_beacon()
1224 sdata_info(sdata, in ieee80211_chswitch_post_beacon()
1231 cfg80211_ch_switch_notify(sdata->dev, &sdata->reserved_chandef); in ieee80211_chswitch_post_beacon()
1236 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
1237 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
1239 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
1241 sdata_info(sdata, in ieee80211_chswitch_done()
1243 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1246 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); in ieee80211_chswitch_done()
1253 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_timer() local
1254 from_timer(sdata, t, u.mgd.chswitch_timer); in ieee80211_chswitch_timer()
1256 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work); in ieee80211_chswitch_timer()
1260 ieee80211_sta_abort_chanswitch(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_abort_chanswitch() argument
1262 struct ieee80211_local *local = sdata->local; in ieee80211_sta_abort_chanswitch()
1270 ieee80211_vif_unreserve_chanctx(sdata); in ieee80211_sta_abort_chanswitch()
1273 if (sdata->csa_block_tx) in ieee80211_sta_abort_chanswitch()
1274 ieee80211_wake_vif_queues(local, sdata, in ieee80211_sta_abort_chanswitch()
1277 sdata->csa_block_tx = false; in ieee80211_sta_abort_chanswitch()
1278 sdata->vif.csa_active = false; in ieee80211_sta_abort_chanswitch()
1282 drv_abort_channel_switch(sdata); in ieee80211_sta_abort_chanswitch()
1286 ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_process_chanswitch() argument
1291 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1292 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1302 sdata_assert_lock(sdata); in ieee80211_sta_process_chanswitch()
1312 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band, in ieee80211_sta_process_chanswitch()
1329 if (beacon && sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) { in ieee80211_sta_process_chanswitch()
1331 ieee80211_sta_abort_chanswitch(sdata); in ieee80211_sta_process_chanswitch()
1333 drv_channel_switch_rx_beacon(sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1335 } else if (sdata->vif.csa_active || res) { in ieee80211_sta_process_chanswitch()
1340 if (sdata->vif.bss_conf.chandef.chan->band != in ieee80211_sta_process_chanswitch()
1342 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1353 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1367 &sdata->vif.bss_conf.chandef) && in ieee80211_sta_process_chanswitch()
1371 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1384 ieee80211_teardown_tdls_peers(sdata); in ieee80211_sta_process_chanswitch()
1388 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in ieee80211_sta_process_chanswitch()
1391 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1400 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1405 if (drv_pre_channel_switch(sdata, &ch_switch)) { in ieee80211_sta_process_chanswitch()
1406 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1411 res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1414 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1421 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1422 sdata->csa_chandef = csa_ie.chandef; in ieee80211_sta_process_chanswitch()
1423 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1427 if (sdata->csa_block_tx) in ieee80211_sta_process_chanswitch()
1428 ieee80211_stop_vif_queues(local, sdata, in ieee80211_sta_process_chanswitch()
1432 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1437 drv_channel_switch(local, sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1460 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1461 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1469 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_find_80211h_pwr_constr() argument
1539 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata, in ieee80211_find_cisco_dtpc() argument
1553 static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_pwr_constr() argument
1573 sdata, channel, country_ie, country_ie_len, in ieee80211_handle_pwr_constr()
1581 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco); in ieee80211_handle_pwr_constr()
1595 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1598 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1601 sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1605 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1608 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1610 pwr_level_cisco, sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1613 sdata->ap_power_level = new_ap_level; in ieee80211_handle_pwr_constr()
1614 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
1621 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
1638 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_enable_ps()
1663 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
1665 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
1685 sta = sta_info_get(sdata, mgd->bssid); in ieee80211_powersave_allowed()
1696 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
1705 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
1706 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
1708 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
1716 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
1718 found = sdata; in ieee80211_recalc_ps()
1743 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
1745 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
1747 if (sdata->vif.bss_conf.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
1748 sdata->vif.bss_conf.ps = ps_allowed; in ieee80211_recalc_ps_vif()
1749 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
1775 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
1781 if (!sdata) in ieee80211_dynamic_ps_enable_work()
1784 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
1824 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_dynamic_ps_enable_work()
1826 ieee80211_flush_queues(local, sdata, false); in ieee80211_dynamic_ps_enable_work()
1849 struct ieee80211_sub_if_data *sdata = in ieee80211_dfs_cac_timer_work() local
1852 struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef; in ieee80211_dfs_cac_timer_work()
1854 mutex_lock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1855 if (sdata->wdev.cac_started) { in ieee80211_dfs_cac_timer_work()
1856 ieee80211_vif_release_channel(sdata); in ieee80211_dfs_cac_timer_work()
1857 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_dfs_cac_timer_work()
1861 mutex_unlock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1865 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in __ieee80211_sta_handle_tspec_ac_params() argument
1867 struct ieee80211_local *local = sdata->local; in __ieee80211_sta_handle_tspec_ac_params()
1868 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_sta_handle_tspec_ac_params()
1894 if (drv_conf_tx(local, sdata, ac, &sdata->tx_conf[ac])) in __ieee80211_sta_handle_tspec_ac_params()
1895 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1912 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac))) in __ieee80211_sta_handle_tspec_ac_params()
1923 if (drv_conf_tx(local, sdata, ac, in __ieee80211_sta_handle_tspec_ac_params()
1924 &sdata->tx_conf[non_acm_ac])) in __ieee80211_sta_handle_tspec_ac_params()
1925 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1942 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_handle_tspec_ac_params() argument
1944 if (__ieee80211_sta_handle_tspec_ac_params(sdata)) in ieee80211_sta_handle_tspec_ac_params()
1945 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); in ieee80211_sta_handle_tspec_ac_params()
1950 struct ieee80211_sub_if_data *sdata; in ieee80211_sta_handle_tspec_ac_params_wk() local
1952 sdata = container_of(work, struct ieee80211_sub_if_data, in ieee80211_sta_handle_tspec_ac_params_wk()
1954 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_sta_handle_tspec_ac_params_wk()
1960 struct ieee80211_sub_if_data *sdata, in ieee80211_sta_wmm_params() argument
1965 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
2003 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
2013 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
2023 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
2033 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
2044 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
2056 sdata_info(sdata, in ieee80211_sta_wmm_params()
2069 sdata_info(sdata, in ieee80211_sta_wmm_params()
2074 ieee80211_regulatory_limit_wmm_params(sdata, ¶ms[ac], ac); in ieee80211_sta_wmm_params()
2080 sdata_info(sdata, in ieee80211_sta_wmm_params()
2088 mlme_dbg(sdata, in ieee80211_sta_wmm_params()
2094 sdata->tx_conf[ac] = params[ac]; in ieee80211_sta_wmm_params()
2096 drv_conf_tx(local, sdata, ac, ¶ms[ac])) in ieee80211_sta_wmm_params()
2097 sdata_err(sdata, in ieee80211_sta_wmm_params()
2103 sdata->vif.bss_conf.qos = true; in ieee80211_sta_wmm_params()
2107 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
2109 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
2111 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL; in __ieee80211_stop_poll()
2112 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
2115 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
2117 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
2118 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
2119 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
2122 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_bss_capability() argument
2125 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_handle_bss_capability()
2132 sband = ieee80211_get_sband(sdata); in ieee80211_handle_bss_capability()
2167 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
2172 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
2173 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_set_associated()
2176 bss_info_changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_set_associated()
2179 sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec( in ieee80211_set_associated()
2182 sdata->u.mgd.associated = cbss; in ieee80211_set_associated()
2183 memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); in ieee80211_set_associated()
2185 ieee80211_check_rate_mask(sdata); in ieee80211_set_associated()
2187 sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE; in ieee80211_set_associated()
2189 if (sdata->vif.p2p || in ieee80211_set_associated()
2190 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_set_associated()
2204 sdata->u.mgd.p2p_noa_index = in ieee80211_set_associated()
2213 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
2217 if (sdata->u.mgd.have_beacon) { in ieee80211_set_associated()
2224 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; in ieee80211_set_associated()
2235 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_set_associated()
2243 ieee80211_bss_info_change_notify(sdata, bss_info_changed); in ieee80211_set_associated()
2249 ieee80211_recalc_smps(sdata); in ieee80211_set_associated()
2250 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
2252 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
2255 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
2259 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
2260 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
2266 sdata_assert_lock(sdata); in ieee80211_set_disassoc()
2274 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
2277 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
2291 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
2303 ieee80211_flush_queues(local, sdata, true); in ieee80211_set_disassoc()
2315 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_set_disassoc()
2318 ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, in ieee80211_set_disassoc()
2325 ieee80211_flush_queues(local, sdata, false); in ieee80211_set_disassoc()
2327 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_set_disassoc()
2332 sdata->vif.bss_conf.ssid_len = 0; in ieee80211_set_disassoc()
2335 sta_info_flush(sdata); in ieee80211_set_disassoc()
2338 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
2342 sdata->vif.bss_conf.assoc = false; in ieee80211_set_disassoc()
2345 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
2346 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
2355 memset(sdata->vif.bss_conf.mu_group.membership, 0, in ieee80211_set_disassoc()
2356 sizeof(sdata->vif.bss_conf.mu_group.membership)); in ieee80211_set_disassoc()
2357 memset(sdata->vif.bss_conf.mu_group.position, 0, in ieee80211_set_disassoc()
2358 sizeof(sdata->vif.bss_conf.mu_group.position)); in ieee80211_set_disassoc()
2360 sdata->vif.mu_mimo_owner = false; in ieee80211_set_disassoc()
2362 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
2368 if (sdata->vif.bss_conf.arp_addr_cnt) in ieee80211_set_disassoc()
2371 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
2376 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
2379 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_set_disassoc()
2381 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
2382 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
2383 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
2384 del_timer_sync(&sdata->u.mgd.chswitch_timer); in ieee80211_set_disassoc()
2386 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
2387 sdata->vif.bss_conf.beacon_rate = NULL; in ieee80211_set_disassoc()
2393 ieee80211_vif_release_channel(sdata); in ieee80211_set_disassoc()
2395 sdata->vif.csa_active = false; in ieee80211_set_disassoc()
2398 if (sdata->csa_block_tx) { in ieee80211_set_disassoc()
2399 ieee80211_wake_vif_queues(local, sdata, in ieee80211_set_disassoc()
2401 sdata->csa_block_tx = false; in ieee80211_set_disassoc()
2409 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_set_disassoc()
2412 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
2414 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
2415 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
2421 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
2427 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_reset_ap_probe()
2435 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
2444 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_wmm_ac_notify() argument
2448 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_tx_wmm_ac_notify()
2479 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
2482 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time); in ieee80211_sta_tx_notify()
2485 !sdata->u.mgd.probe_send_count) in ieee80211_sta_tx_notify()
2489 sdata->u.mgd.probe_send_count = 0; in ieee80211_sta_tx_notify()
2491 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
2492 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_tx_notify()
2495 static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata, in ieee80211_mlme_send_probe_req() argument
2502 skb = ieee80211_build_probe_req(sdata, src, dst, (u32)-1, channel, in ieee80211_mlme_send_probe_req()
2506 ieee80211_tx_skb(sdata, skb); in ieee80211_mlme_send_probe_req()
2509 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
2511 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
2535 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2536 sta = sta_info_get(sdata, dst); in ieee80211_mgd_probe_ap_send()
2539 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2542 if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { in ieee80211_mgd_probe_ap_send()
2544 ieee80211_send_nullfunc(sdata->local, sdata, false); in ieee80211_mgd_probe_ap_send()
2555 ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst, in ieee80211_mgd_probe_ap_send()
2562 run_again(sdata, ifmgd->probe_timeout); in ieee80211_mgd_probe_ap_send()
2565 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
2568 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
2571 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
2574 sdata_lock(sdata); in ieee80211_mgd_probe_ap()
2579 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2581 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
2582 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2587 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
2591 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL); in ieee80211_mgd_probe_ap()
2610 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2615 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2616 ieee80211_recalc_ps(sdata->local); in ieee80211_mgd_probe_ap()
2617 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2620 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
2622 sdata_unlock(sdata); in ieee80211_mgd_probe_ap()
2628 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
2629 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
2635 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_ap_probereq_get()
2638 sdata_assert_lock(sdata); in ieee80211_ap_probereq_get()
2657 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, in ieee80211_ap_probereq_get()
2667 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata, in ieee80211_report_disconnect() argument
2678 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len, reconnect); in ieee80211_report_disconnect()
2680 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2682 drv_event_callback(sdata->local, sdata, &event); in ieee80211_report_disconnect()
2685 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
2687 struct ieee80211_local *local = sdata->local; in __ieee80211_disconnect()
2688 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_disconnect()
2692 sdata_lock(sdata); in __ieee80211_disconnect()
2694 sdata_unlock(sdata); in __ieee80211_disconnect()
2698 tx = !sdata->csa_block_tx; in __ieee80211_disconnect()
2708 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in __ieee80211_disconnect()
2714 sdata->vif.csa_active = false; in __ieee80211_disconnect()
2716 if (sdata->csa_block_tx) { in __ieee80211_disconnect()
2717 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_disconnect()
2719 sdata->csa_block_tx = false; in __ieee80211_disconnect()
2723 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx, in __ieee80211_disconnect()
2728 sdata_unlock(sdata); in __ieee80211_disconnect()
2733 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
2736 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
2742 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
2744 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
2747 sdata_info(sdata, in ieee80211_beacon_connection_loss_work()
2750 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
2753 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
2759 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
2763 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
2768 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
2769 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
2771 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
2773 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
2774 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
2780 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
2781 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
2783 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
2785 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
2786 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
2792 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_disconnect() local
2793 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_disconnect()
2795 trace_api_disconnect(sdata, reconnect); in ieee80211_disconnect()
2797 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_disconnect()
2800 sdata->u.mgd.driver_disconnect = true; in ieee80211_disconnect()
2801 sdata->u.mgd.reconnect = reconnect; in ieee80211_disconnect()
2802 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_disconnect()
2806 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
2809 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
2811 sdata_assert_lock(sdata); in ieee80211_destroy_auth_data()
2819 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_auth_data()
2820 sta_info_destroy_addr(sdata, auth_data->bss->bssid); in ieee80211_destroy_auth_data()
2822 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_auth_data()
2823 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_auth_data()
2824 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
2825 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2826 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_auth_data()
2827 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2830 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
2832 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
2835 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
2838 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
2840 sdata_assert_lock(sdata); in ieee80211_destroy_assoc_data()
2848 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_assoc_data()
2849 sta_info_destroy_addr(sdata, assoc_data->bss->bssid); in ieee80211_destroy_assoc_data()
2851 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_assoc_data()
2852 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_assoc_data()
2853 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
2854 sdata->vif.mu_mimo_owner = false; in ieee80211_destroy_assoc_data()
2856 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2857 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_assoc_data()
2858 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2861 cfg80211_abandon_assoc(sdata->dev, assoc_data->bss); in ieee80211_destroy_assoc_data()
2865 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
2868 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
2871 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
2872 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
2886 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_auth_challenge()
2890 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
2897 static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mark_sta_auth() argument
2900 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mark_sta_auth()
2904 sdata_info(sdata, "authenticated\n"); in ieee80211_mark_sta_auth()
2908 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_mark_sta_auth()
2911 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
2912 sta = sta_info_get(sdata, bssid); in ieee80211_mark_sta_auth()
2914 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid); in ieee80211_mark_sta_auth()
2919 sdata_info(sdata, "failed moving %pM to auth\n", bssid); in ieee80211_mark_sta_auth()
2925 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
2929 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
2932 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
2943 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_auth()
2966 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
2974 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2983 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
2985 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
2988 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3003 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
3016 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3020 if (!ieee80211_mark_sta_auth(sdata, bssid)) in ieee80211_rx_mgmt_auth()
3024 sdata_info(sdata, "SAE peer confirmed\n"); in ieee80211_rx_mgmt_auth()
3028 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
3030 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_rx_mgmt_auth()
3090 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
3093 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
3096 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_deauth()
3102 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_deauth()
3110 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_deauth()
3114 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
3116 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, in ieee80211_rx_mgmt_deauth()
3125 sdata_info(sdata, in ieee80211_rx_mgmt_deauth()
3130 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_rx_mgmt_deauth()
3132 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_deauth()
3138 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
3141 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
3144 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_disassoc()
3156 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_disassoc()
3160 sdata_info(sdata, "disassociated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_disassoc()
3164 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
3166 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code, in ieee80211_rx_mgmt_disassoc()
3234 static int ieee80211_recalc_twt_req(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_twt_req() argument
3240 if (sdata->vif.bss_conf.twt_requester != twt) { in ieee80211_recalc_twt_req()
3241 sdata->vif.bss_conf.twt_requester = twt; in ieee80211_recalc_twt_req()
3247 static bool ieee80211_twt_bcast_support(struct ieee80211_sub_if_data *sdata, in ieee80211_twt_bcast_support() argument
3254 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_twt_bcast_support()
3264 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
3269 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
3270 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
3274 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_assoc_success()
3308 sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n", in ieee80211_assoc_success()
3315 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_success()
3319 sdata->vif.bss_conf.aid = aid; in ieee80211_assoc_success()
3356 sdata_info(sdata, in ieee80211_assoc_success()
3367 sdata_info(sdata, in ieee80211_assoc_success()
3373 sdata_info(sdata, in ieee80211_assoc_success()
3379 sdata_info(sdata, in ieee80211_assoc_success()
3385 sdata_info(sdata, in ieee80211_assoc_success()
3396 sdata_info(sdata, in ieee80211_assoc_success()
3404 sdata_info(sdata, in ieee80211_assoc_success()
3412 sdata_info(sdata, in ieee80211_assoc_success()
3418 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3423 sta = sta_info_get(sdata, cbss->bssid); in ieee80211_assoc_success()
3425 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3430 sband = ieee80211_get_sband(sdata); in ieee80211_assoc_success()
3432 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3439 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3440 sdata_info(sdata, in ieee80211_assoc_success()
3448 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_success()
3452 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_success()
3457 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, in ieee80211_assoc_success()
3472 changed |= ieee80211_recalc_twt_req(sdata, sta, elems); in ieee80211_assoc_success()
3480 ieee80211_twt_bcast_support(sdata, bss_conf, sband, sta); in ieee80211_assoc_success()
3507 ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems->he_operation); in ieee80211_assoc_success()
3508 ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems->he_spr); in ieee80211_assoc_success()
3558 sdata_info(sdata, in ieee80211_assoc_success()
3562 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3567 if (sdata->wdev.use_4addr) in ieee80211_assoc_success()
3568 drv_sta_set_4addr(local, sdata, &sta->sta, true); in ieee80211_assoc_success()
3570 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3582 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_assoc_success()
3583 } else if (!ieee80211_sta_wmm_params(local, sdata, elems->wmm_param, in ieee80211_assoc_success()
3587 ieee80211_set_wmm_default(sdata, false, true); in ieee80211_assoc_success()
3614 ieee80211_set_associated(sdata, cbss, changed); in ieee80211_assoc_success()
3621 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
3627 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
3628 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_assoc_success()
3636 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
3640 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
3654 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_assoc_resp()
3691 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3697 fils_decrypt_assoc_resp(sdata, (u8 *)mgmt, &len, assoc_data) < 0) in ieee80211_rx_mgmt_assoc_resp()
3709 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3715 run_again(sdata, assoc_data->timeout); in ieee80211_rx_mgmt_assoc_resp()
3720 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
3722 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3725 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3727 if (!ieee80211_assoc_success(sdata, cbss, mgmt, len, &elems)) { in ieee80211_rx_mgmt_assoc_resp()
3729 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3730 cfg80211_assoc_timeout(sdata->dev, cbss); in ieee80211_rx_mgmt_assoc_resp()
3734 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3735 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
3742 ieee80211_destroy_assoc_data(sdata, true, false); in ieee80211_rx_mgmt_assoc_resp()
3747 if (sdata->tx_conf[ac].uapsd) in ieee80211_rx_mgmt_assoc_resp()
3753 cfg80211_rx_assoc_resp(sdata->dev, cbss, (u8 *)mgmt, len, uapsd_queues, in ieee80211_rx_mgmt_assoc_resp()
3756 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_rx_mgmt_assoc_resp()
3759 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_bss_info() argument
3763 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
3767 sdata_assert_lock(sdata); in ieee80211_rx_bss_info()
3776 sdata->vif.bss_conf.beacon_rate = bss->beacon_rate; in ieee80211_rx_bss_info()
3782 static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_probe_resp() argument
3791 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
3793 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_probe_resp()
3802 channel = ieee80211_get_channel(sdata->local->hw.wiphy, in ieee80211_rx_mgmt_probe_resp()
3807 if (!ether_addr_equal(mgmt->da, sdata->vif.addr) && in ieee80211_rx_mgmt_probe_resp()
3816 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_probe_resp()
3820 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
3847 static void ieee80211_handle_beacon_sig(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_beacon_sig() argument
3883 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3889 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3895 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_handle_beacon_sig()
3905 &sdata->vif, in ieee80211_handle_beacon_sig()
3912 &sdata->vif, in ieee80211_handle_beacon_sig()
3929 &sdata->vif, in ieee80211_handle_beacon_sig()
3936 &sdata->vif, in ieee80211_handle_beacon_sig()
3953 static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_beacon() argument
3957 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
3958 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
3962 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
3973 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_beacon()
3976 bssid = ieee80211_get_bssid(hdr, len, sdata->vif.type); in ieee80211_rx_mgmt_beacon()
3991 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_rx_mgmt_beacon()
4012 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_beacon()
4019 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
4021 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
4023 sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count; in ieee80211_rx_mgmt_beacon()
4041 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_rx_mgmt_beacon()
4051 ieee80211_handle_beacon_sig(sdata, ifmgd, bss_conf, in ieee80211_rx_mgmt_beacon()
4055 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
4057 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_beacon()
4064 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
4086 ieee80211_send_nullfunc(local, sdata, false); in ieee80211_rx_mgmt_beacon()
4087 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
4098 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
4102 if (sdata->vif.p2p || in ieee80211_rx_mgmt_beacon()
4103 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_rx_mgmt_beacon()
4112 if (sdata->u.mgd.p2p_noa_index != noa.index) { in ieee80211_rx_mgmt_beacon()
4114 sdata->u.mgd.p2p_noa_index = noa.index; in ieee80211_rx_mgmt_beacon()
4123 } else if (sdata->u.mgd.p2p_noa_index != -1) { in ieee80211_rx_mgmt_beacon()
4125 sdata->u.mgd.p2p_noa_index = -1; in ieee80211_rx_mgmt_beacon()
4133 ieee80211_chswitch_post_beacon(sdata); in ieee80211_rx_mgmt_beacon()
4145 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
4147 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
4149 sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count; in ieee80211_rx_mgmt_beacon()
4158 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_beacon()
4160 ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, in ieee80211_rx_mgmt_beacon()
4165 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_rx_mgmt_beacon()
4185 ieee80211_recalc_ps_vif(sdata); in ieee80211_rx_mgmt_beacon()
4196 changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_rx_mgmt_beacon()
4201 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_beacon()
4203 changed |= ieee80211_recalc_twt_req(sdata, sta, &elems); in ieee80211_rx_mgmt_beacon()
4205 if (ieee80211_config_bw(sdata, sta, elems.ht_cap_elem, in ieee80211_rx_mgmt_beacon()
4210 sdata_info(sdata, in ieee80211_rx_mgmt_beacon()
4213 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
4216 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
4224 ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif, in ieee80211_rx_mgmt_beacon()
4228 changed |= ieee80211_handle_pwr_constr(sdata, chan, mgmt, in ieee80211_rx_mgmt_beacon()
4234 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_rx_mgmt_beacon()
4237 void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_ext() argument
4248 sdata_lock(sdata); in ieee80211_sta_rx_queued_ext()
4251 ieee80211_rx_mgmt_beacon(sdata, hdr, skb->len, rx_status); in ieee80211_sta_rx_queued_ext()
4254 sdata_unlock(sdata); in ieee80211_sta_rx_queued_ext()
4257 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
4270 sdata_lock(sdata); in ieee80211_sta_rx_queued_mgmt()
4274 ieee80211_rx_mgmt_beacon(sdata, (void *)mgmt, in ieee80211_sta_rx_queued_mgmt()
4278 ieee80211_rx_mgmt_probe_resp(sdata, skb); in ieee80211_sta_rx_queued_mgmt()
4281 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4284 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4287 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4291 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4310 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
4337 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
4344 sdata_unlock(sdata); in ieee80211_sta_rx_queued_mgmt()
4349 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
4350 from_timer(sdata, t, u.mgd.timer); in ieee80211_sta_timer()
4352 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_timer()
4355 void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
4360 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
4363 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_sta_connection_lost()
4367 static int ieee80211_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_auth() argument
4369 struct ieee80211_local *local = sdata->local; in ieee80211_auth()
4370 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_auth()
4379 sdata_assert_lock(sdata); in ieee80211_auth()
4387 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_auth()
4402 drv_mgd_prepare_tx(local, sdata, &info); in ieee80211_auth()
4404 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_auth()
4420 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_auth()
4438 run_again(sdata, auth_data->timeout); in ieee80211_auth()
4443 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
4445 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
4446 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
4448 sdata_assert_lock(sdata); in ieee80211_do_assoc()
4452 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
4464 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
4467 ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
4472 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4478 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4484 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
4487 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
4489 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
4490 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
4491 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
4493 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mgd_conn_tx_status()
4496 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
4498 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
4499 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
4501 sdata_lock(sdata); in ieee80211_sta_work()
4519 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4530 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4545 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4546 } else if (ieee80211_auth(sdata)) { in ieee80211_sta_work()
4556 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4558 cfg80211_auth_timeout(sdata->dev, bssid); in ieee80211_sta_work()
4559 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4562 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4567 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
4575 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_sta_work()
4576 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_sta_work()
4577 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4580 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4596 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
4599 mlme_dbg(sdata, in ieee80211_sta_work()
4603 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4605 mlme_dbg(sdata, in ieee80211_sta_work()
4608 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4613 run_again(sdata, ifmgd->probe_timeout); in ieee80211_sta_work()
4615 mlme_dbg(sdata, in ieee80211_sta_work()
4618 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4621 mlme_dbg(sdata, in ieee80211_sta_work()
4625 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4631 mlme_dbg(sdata, in ieee80211_sta_work()
4635 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4640 sdata_unlock(sdata); in ieee80211_sta_work()
4645 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
4646 from_timer(sdata, t, u.mgd.bcn_mon_timer); in ieee80211_sta_bcn_mon_timer()
4647 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_bcn_mon_timer()
4649 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_bcn_mon_timer()
4652 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_bcn_mon_timer()
4655 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
4656 ieee80211_queue_work(&sdata->local->hw, in ieee80211_sta_bcn_mon_timer()
4657 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
4662 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
4663 from_timer(sdata, t, u.mgd.conn_mon_timer); in ieee80211_sta_conn_mon_timer()
4664 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
4665 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
4669 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_conn_mon_timer()
4672 sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_sta_conn_mon_timer()
4694 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
4698 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
4701 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
4703 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
4704 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
4707 if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_restart_sta_timer()
4708 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
4709 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
4714 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_quiesce() argument
4716 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_quiesce()
4719 sdata_lock(sdata); in ieee80211_mgd_quiesce()
4731 ieee80211_send_deauth_disassoc(sdata, bssid, bssid, in ieee80211_mgd_quiesce()
4736 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_quiesce()
4738 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_quiesce()
4739 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, in ieee80211_mgd_quiesce()
4761 if (ifmgd->associated && !sdata->local->wowlan) { in ieee80211_mgd_quiesce()
4769 ieee80211_mgd_deauth(sdata, &req); in ieee80211_mgd_quiesce()
4772 sdata_unlock(sdata); in ieee80211_mgd_quiesce()
4775 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
4777 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
4779 sdata_lock(sdata); in ieee80211_sta_restart()
4781 sdata_unlock(sdata); in ieee80211_sta_restart()
4785 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
4786 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
4787 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
4788 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
4792 sdata_unlock(sdata); in ieee80211_sta_restart()
4795 sdata_unlock(sdata); in ieee80211_sta_restart()
4800 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
4804 ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
4822 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
4823 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
4824 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
4827 if (sdata->local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS) in ieee80211_sta_setup_sdata()
4841 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
4845 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
4846 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
4847 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
4852 static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, in ieee80211_ht_vht_rx_chains() argument
4855 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ht_vht_rx_chains()
4897 ieee80211_verify_sta_he_mcs_support(struct ieee80211_sub_if_data *sdata, in ieee80211_verify_sta_he_mcs_support() argument
4903 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_verify_sta_he_mcs_support()
4960 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
4963 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
4964 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_channel()
4998 ieee80211_vif_type_p2p(&sdata->vif))) in ieee80211_prep_channel()
5029 sdata_info(sdata, in ieee80211_prep_channel()
5056 if (!ieee80211_verify_sta_he_mcs_support(sdata, sband, he_oper)) in ieee80211_prep_channel()
5082 sdata_info(sdata, in ieee80211_prep_channel()
5086 ifmgd->flags |= ieee80211_determine_chantype(sdata, sband, in ieee80211_prep_channel()
5093 sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss), in ieee80211_prep_channel()
5099 sdata_info(sdata, "Rejecting non-HE 6/7 GHz connection"); in ieee80211_prep_channel()
5104 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_prep_channel()
5112 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
5122 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
5164 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
5168 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
5169 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
5187 have_sta = sta_info_get(sdata, cbss->bssid); in ieee80211_prep_connection()
5192 new_sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL); in ieee80211_prep_connection()
5215 int shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_prep_connection()
5241 sdata_info(sdata, in ieee80211_prep_connection()
5247 sdata_info(sdata, in ieee80211_prep_connection()
5255 sdata_info(sdata, in ieee80211_prep_connection()
5258 sdata->vif.bss_conf.basic_rates = basic_rates; in ieee80211_prep_connection()
5263 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
5265 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
5271 sdata->vif.bss_conf.beacon_int = cbss->beacon_interval; in ieee80211_prep_connection()
5275 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
5276 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
5280 &sdata->vif.bss_conf.sync_dtim_count, in ieee80211_prep_connection()
5282 } else if (!ieee80211_hw_check(&sdata->local->hw, in ieee80211_prep_connection()
5286 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
5287 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
5289 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
5291 sdata->vif.bss_conf.sync_tsf = 0; in ieee80211_prep_connection()
5292 sdata->vif.bss_conf.sync_device_ts = 0; in ieee80211_prep_connection()
5293 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
5299 err = ieee80211_prep_channel(sdata, cbss); in ieee80211_prep_connection()
5312 ieee80211_bss_info_change_notify(sdata, in ieee80211_prep_connection()
5322 sdata_info(sdata, in ieee80211_prep_connection()
5338 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
5341 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
5342 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
5431 ieee80211_destroy_auth_data(sdata, cont_auth); in ieee80211_mgd_auth()
5444 ieee80211_mark_sta_auth(sdata, req->bss->bssid); in ieee80211_mgd_auth()
5449 sdata_info(sdata, in ieee80211_mgd_auth()
5452 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
5456 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_auth()
5462 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); in ieee80211_mgd_auth()
5464 err = ieee80211_prep_connection(sdata, req->bss, cont_auth, false); in ieee80211_mgd_auth()
5468 err = ieee80211_auth(sdata); in ieee80211_mgd_auth()
5470 sta_info_destroy_addr(sdata, req->bss->bssid); in ieee80211_mgd_auth()
5480 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_auth()
5482 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_auth()
5483 ieee80211_vif_release_channel(sdata); in ieee80211_mgd_auth()
5484 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_auth()
5489 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
5494 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
5495 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
5500 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_mgd_assoc()
5525 sdata_info(sdata, in ieee80211_mgd_assoc()
5528 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
5532 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_assoc()
5553 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
5577 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5589 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5646 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
5649 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in ieee80211_mgd_assoc()
5652 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) { in ieee80211_mgd_assoc()
5681 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
5682 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
5683 sdata->control_port_over_nl80211 = in ieee80211_mgd_assoc()
5685 sdata->control_port_no_preauth = req->crypto.control_port_no_preauth; in ieee80211_mgd_assoc()
5686 sdata->encrypt_headroom = ieee80211_cs_headroom(local, &req->crypto, in ieee80211_mgd_assoc()
5687 sdata->vif.type); in ieee80211_mgd_assoc()
5703 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_mgd_assoc()
5728 err = ieee80211_prep_connection(sdata, req->bss, true, override); in ieee80211_mgd_assoc()
5734 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_mgd_assoc()
5736 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_mgd_assoc()
5738 sdata->smps_mode = ifmgd->req_smps; in ieee80211_mgd_assoc()
5744 if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) && in ieee80211_mgd_assoc()
5750 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
5767 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; in ieee80211_mgd_assoc()
5768 sdata->vif.bss_conf.sync_device_ts = in ieee80211_mgd_assoc()
5770 sdata->vif.bss_conf.sync_dtim_count = dtim_count; in ieee80211_mgd_assoc()
5776 sdata->vif.bss_conf.profile_periodicity = elem->data[2]; in ieee80211_mgd_assoc()
5778 sdata->vif.bss_conf.profile_periodicity = 0; in ieee80211_mgd_assoc()
5784 sdata->vif.bss_conf.ema_ap = true; in ieee80211_mgd_assoc()
5786 sdata->vif.bss_conf.ema_ap = false; in ieee80211_mgd_assoc()
5793 run_again(sdata, assoc_data->timeout); in ieee80211_mgd_assoc()
5805 sdata_info(sdata, "associating with AP with corrupt %s\n", in ieee80211_mgd_assoc()
5812 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_assoc()
5819 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
5822 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
5831 sdata_info(sdata, in ieee80211_mgd_deauth()
5836 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
5837 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
5841 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
5842 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5845 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
5851 sdata_info(sdata, in ieee80211_mgd_deauth()
5856 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
5857 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
5861 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_deauth()
5862 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5870 sdata_info(sdata, in ieee80211_mgd_deauth()
5875 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
5877 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5880 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
5887 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
5890 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_disassoc()
5903 sdata_info(sdata, in ieee80211_mgd_disassoc()
5908 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
5912 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_mgd_disassoc()
5918 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
5920 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
5934 sdata_lock(sdata); in ieee80211_mgd_stop()
5937 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_mgd_stop()
5938 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_mgd_stop()
5941 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
5953 sdata_unlock(sdata); in ieee80211_mgd_stop()
5961 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
5963 trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level); in ieee80211_cqm_rssi_notify()
5965 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp); in ieee80211_cqm_rssi_notify()
5971 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_beacon_loss_notify() local
5973 trace_api_cqm_beacon_loss_notify(sdata->local, sdata); in ieee80211_cqm_beacon_loss_notify()
5975 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp); in ieee80211_cqm_beacon_loss_notify()