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()
399 if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) { in ieee80211_config_bw()
401 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; in ieee80211_config_bw()
408 flags = ieee80211_determine_chantype(sdata, sband, chan, vht_cap_info, in ieee80211_config_bw()
429 if (cfg80211_chandef_identical(&chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_config_bw()
432 sdata_info(sdata, in ieee80211_config_bw()
447 sdata_info(sdata, in ieee80211_config_bw()
481 ret = ieee80211_vif_change_bandwidth(sdata, &chandef, changed); in ieee80211_config_bw()
483 sdata_info(sdata, in ieee80211_config_bw()
500 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
514 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
539 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_40MHZ) { in ieee80211_add_ht_ie()
574 static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
579 struct ieee80211_local *local = sdata->local; in ieee80211_add_vht_ie()
588 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
593 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_80P80MHZ) { in ieee80211_add_vht_ie()
602 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_160MHZ) { in ieee80211_add_vht_ie()
639 sdata->vif.mu_mimo_owner = true; in ieee80211_add_vht_ie()
660 static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_he_ie() argument
671 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_add_he_ie()
673 reg_cap = cfg80211_chandef_usable(sdata->wdev.wiphy, in ieee80211_add_he_ie()
695 ieee80211_ie_build_he_6ghz_cap(sdata, skb); in ieee80211_add_he_ie()
698 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
700 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
701 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
722 sdata_assert_lock(sdata); in ieee80211_send_assoc()
725 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_send_assoc()
733 shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_send_assoc()
799 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
950 ieee80211_add_ht_ie(sdata, skb, assoc_data->ap_ht_param, in ieee80211_send_assoc()
951 sband, chan, sdata->smps_mode); in ieee80211_send_assoc()
1005 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_send_assoc()
1018 ieee80211_add_he_ie(sdata, skb, sband); in ieee80211_send_assoc()
1042 ieee80211_add_aid_request_ie(sdata, skb); in ieee80211_send_assoc()
1043 ieee80211_add_s1g_capab_ie(sdata, &sband->s1g_cap, skb); in ieee80211_send_assoc()
1063 drv_mgd_prepare_tx(local, sdata, 0); in ieee80211_send_assoc()
1069 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
1073 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
1078 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
1086 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
1090 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
1095 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
1098 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_send_nullfunc()
1102 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif, in ieee80211_send_nullfunc()
1120 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
1124 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
1130 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
1134 if (!(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE)) in ieee80211_send_4addr_nullfunc()
1147 memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1148 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1149 memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1150 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1153 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
1159 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_work() local
1161 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
1162 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
1165 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
1168 sdata_lock(sdata); in ieee80211_chswitch_work()
1175 if (!sdata->vif.csa_active) in ieee80211_chswitch_work()
1185 if (sdata->reserved_chanctx) { in ieee80211_chswitch_work()
1195 if (sdata->reserved_ready) in ieee80211_chswitch_work()
1198 if (sdata->vif.bss_conf.chandef.width != in ieee80211_chswitch_work()
1199 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1210 switch (sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1228 mgd_sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_chswitch_work()
1230 local->hw.wiphy->bands[sdata->csa_chandef.chan->band]; in ieee80211_chswitch_work()
1233 if (sdata->vif.bss_conf.chandef.width > in ieee80211_chswitch_work()
1234 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1240 ret = ieee80211_vif_use_reserved_context(sdata); in ieee80211_chswitch_work()
1242 sdata_info(sdata, in ieee80211_chswitch_work()
1245 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1250 if (sdata->vif.bss_conf.chandef.width < in ieee80211_chswitch_work()
1251 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1260 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in ieee80211_chswitch_work()
1261 &sdata->csa_chandef)) { in ieee80211_chswitch_work()
1262 sdata_info(sdata, in ieee80211_chswitch_work()
1264 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1271 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_chswitch_work()
1272 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_chswitch_work()
1277 sdata_unlock(sdata); in ieee80211_chswitch_work()
1280 static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata) in ieee80211_chswitch_post_beacon() argument
1282 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_post_beacon()
1283 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_post_beacon()
1286 sdata_assert_lock(sdata); in ieee80211_chswitch_post_beacon()
1288 WARN_ON(!sdata->vif.csa_active); in ieee80211_chswitch_post_beacon()
1290 if (sdata->csa_block_tx) { in ieee80211_chswitch_post_beacon()
1291 ieee80211_wake_vif_queues(local, sdata, in ieee80211_chswitch_post_beacon()
1293 sdata->csa_block_tx = false; in ieee80211_chswitch_post_beacon()
1296 sdata->vif.csa_active = false; in ieee80211_chswitch_post_beacon()
1299 ret = drv_post_channel_switch(sdata); in ieee80211_chswitch_post_beacon()
1301 sdata_info(sdata, in ieee80211_chswitch_post_beacon()
1308 cfg80211_ch_switch_notify(sdata->dev, &sdata->reserved_chandef); in ieee80211_chswitch_post_beacon()
1313 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
1314 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
1316 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
1318 sdata_info(sdata, in ieee80211_chswitch_done()
1320 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1323 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); in ieee80211_chswitch_done()
1330 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_timer() local
1331 from_timer(sdata, t, u.mgd.chswitch_timer); in ieee80211_chswitch_timer()
1333 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work); in ieee80211_chswitch_timer()
1337 ieee80211_sta_abort_chanswitch(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_abort_chanswitch() argument
1339 struct ieee80211_local *local = sdata->local; in ieee80211_sta_abort_chanswitch()
1347 ieee80211_vif_unreserve_chanctx(sdata); in ieee80211_sta_abort_chanswitch()
1350 if (sdata->csa_block_tx) in ieee80211_sta_abort_chanswitch()
1351 ieee80211_wake_vif_queues(local, sdata, in ieee80211_sta_abort_chanswitch()
1354 sdata->csa_block_tx = false; in ieee80211_sta_abort_chanswitch()
1355 sdata->vif.csa_active = false; in ieee80211_sta_abort_chanswitch()
1359 drv_abort_channel_switch(sdata); in ieee80211_sta_abort_chanswitch()
1363 ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_process_chanswitch() argument
1368 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1369 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1379 sdata_assert_lock(sdata); in ieee80211_sta_process_chanswitch()
1389 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band, in ieee80211_sta_process_chanswitch()
1409 if (beacon && sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) { in ieee80211_sta_process_chanswitch()
1411 ieee80211_sta_abort_chanswitch(sdata); in ieee80211_sta_process_chanswitch()
1413 drv_channel_switch_rx_beacon(sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1415 } else if (sdata->vif.csa_active || res) { in ieee80211_sta_process_chanswitch()
1422 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1438 &sdata->vif.bss_conf.chandef) && in ieee80211_sta_process_chanswitch()
1442 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1455 ieee80211_teardown_tdls_peers(sdata); in ieee80211_sta_process_chanswitch()
1459 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in ieee80211_sta_process_chanswitch()
1462 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1471 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1476 if (drv_pre_channel_switch(sdata, &ch_switch)) { in ieee80211_sta_process_chanswitch()
1477 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1482 res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1485 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1492 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1493 sdata->csa_chandef = csa_ie.chandef; in ieee80211_sta_process_chanswitch()
1494 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1497 if (sdata->csa_block_tx) in ieee80211_sta_process_chanswitch()
1498 ieee80211_stop_vif_queues(local, sdata, in ieee80211_sta_process_chanswitch()
1502 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1507 drv_channel_switch(local, sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1527 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1528 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1536 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_find_80211h_pwr_constr() argument
1598 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata, in ieee80211_find_cisco_dtpc() argument
1612 static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_pwr_constr() argument
1632 sdata, channel, country_ie, country_ie_len, in ieee80211_handle_pwr_constr()
1640 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco); in ieee80211_handle_pwr_constr()
1654 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1657 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1660 sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1664 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1667 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1669 pwr_level_cisco, sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1672 sdata->ap_power_level = new_ap_level; in ieee80211_handle_pwr_constr()
1673 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
1680 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
1697 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_enable_ps()
1722 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
1724 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
1744 sta = sta_info_get(sdata, mgd->bssid); in ieee80211_powersave_allowed()
1755 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
1764 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
1765 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
1767 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
1775 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
1777 found = sdata; in ieee80211_recalc_ps()
1802 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
1804 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
1806 if (sdata->vif.bss_conf.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
1807 sdata->vif.bss_conf.ps = ps_allowed; in ieee80211_recalc_ps_vif()
1808 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
1834 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
1840 if (!sdata) in ieee80211_dynamic_ps_enable_work()
1843 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
1883 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_dynamic_ps_enable_work()
1885 ieee80211_flush_queues(local, sdata, false); in ieee80211_dynamic_ps_enable_work()
1908 struct ieee80211_sub_if_data *sdata = in ieee80211_dfs_cac_timer_work() local
1911 struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef; in ieee80211_dfs_cac_timer_work()
1913 mutex_lock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1914 if (sdata->wdev.cac_started) { in ieee80211_dfs_cac_timer_work()
1915 ieee80211_vif_release_channel(sdata); in ieee80211_dfs_cac_timer_work()
1916 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_dfs_cac_timer_work()
1920 mutex_unlock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1924 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in __ieee80211_sta_handle_tspec_ac_params() argument
1926 struct ieee80211_local *local = sdata->local; in __ieee80211_sta_handle_tspec_ac_params()
1927 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_sta_handle_tspec_ac_params()
1953 if (drv_conf_tx(local, sdata, ac, &sdata->tx_conf[ac])) in __ieee80211_sta_handle_tspec_ac_params()
1954 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1971 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac))) in __ieee80211_sta_handle_tspec_ac_params()
1982 if (drv_conf_tx(local, sdata, ac, in __ieee80211_sta_handle_tspec_ac_params()
1983 &sdata->tx_conf[non_acm_ac])) in __ieee80211_sta_handle_tspec_ac_params()
1984 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
2001 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_handle_tspec_ac_params() argument
2003 if (__ieee80211_sta_handle_tspec_ac_params(sdata)) in ieee80211_sta_handle_tspec_ac_params()
2004 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); in ieee80211_sta_handle_tspec_ac_params()
2009 struct ieee80211_sub_if_data *sdata; in ieee80211_sta_handle_tspec_ac_params_wk() local
2011 sdata = container_of(work, struct ieee80211_sub_if_data, in ieee80211_sta_handle_tspec_ac_params_wk()
2013 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_sta_handle_tspec_ac_params_wk()
2019 struct ieee80211_sub_if_data *sdata, in ieee80211_sta_wmm_params() argument
2024 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
2062 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
2072 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
2082 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
2092 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
2103 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
2115 sdata_info(sdata, in ieee80211_sta_wmm_params()
2128 sdata_info(sdata, in ieee80211_sta_wmm_params()
2133 ieee80211_regulatory_limit_wmm_params(sdata, ¶ms[ac], ac); in ieee80211_sta_wmm_params()
2139 sdata_info(sdata, in ieee80211_sta_wmm_params()
2147 mlme_dbg(sdata, in ieee80211_sta_wmm_params()
2153 sdata->tx_conf[ac] = params[ac]; in ieee80211_sta_wmm_params()
2155 drv_conf_tx(local, sdata, ac, ¶ms[ac])) in ieee80211_sta_wmm_params()
2156 sdata_err(sdata, in ieee80211_sta_wmm_params()
2162 sdata->vif.bss_conf.qos = true; in ieee80211_sta_wmm_params()
2166 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
2168 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
2170 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL; in __ieee80211_stop_poll()
2171 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
2174 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
2176 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
2177 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
2178 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
2181 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_bss_capability() argument
2184 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_handle_bss_capability()
2191 sband = ieee80211_get_sband(sdata); in ieee80211_handle_bss_capability()
2226 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
2231 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
2232 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_set_associated()
2235 bss_info_changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_set_associated()
2238 sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec( in ieee80211_set_associated()
2241 sdata->u.mgd.associated = cbss; in ieee80211_set_associated()
2242 memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); in ieee80211_set_associated()
2244 ieee80211_check_rate_mask(sdata); in ieee80211_set_associated()
2246 sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE; in ieee80211_set_associated()
2248 if (sdata->vif.p2p || in ieee80211_set_associated()
2249 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_set_associated()
2263 sdata->u.mgd.p2p_noa_index = in ieee80211_set_associated()
2272 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
2276 if (sdata->u.mgd.have_beacon) { in ieee80211_set_associated()
2283 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; in ieee80211_set_associated()
2294 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_set_associated()
2302 ieee80211_bss_info_change_notify(sdata, bss_info_changed); in ieee80211_set_associated()
2308 ieee80211_recalc_smps(sdata); in ieee80211_set_associated()
2309 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
2311 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
2314 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
2318 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
2319 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
2322 sdata_assert_lock(sdata); in ieee80211_set_disassoc()
2330 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
2333 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
2347 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
2359 ieee80211_flush_queues(local, sdata, true); in ieee80211_set_disassoc()
2371 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_set_disassoc()
2373 ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, in ieee80211_set_disassoc()
2380 ieee80211_flush_queues(local, sdata, false); in ieee80211_set_disassoc()
2386 sta_info_flush(sdata); in ieee80211_set_disassoc()
2389 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
2393 sdata->vif.bss_conf.assoc = false; in ieee80211_set_disassoc()
2396 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
2397 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
2406 memset(sdata->vif.bss_conf.mu_group.membership, 0, in ieee80211_set_disassoc()
2407 sizeof(sdata->vif.bss_conf.mu_group.membership)); in ieee80211_set_disassoc()
2408 memset(sdata->vif.bss_conf.mu_group.position, 0, in ieee80211_set_disassoc()
2409 sizeof(sdata->vif.bss_conf.mu_group.position)); in ieee80211_set_disassoc()
2411 sdata->vif.mu_mimo_owner = false; in ieee80211_set_disassoc()
2413 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
2419 if (sdata->vif.bss_conf.arp_addr_cnt) in ieee80211_set_disassoc()
2422 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
2427 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
2430 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_set_disassoc()
2432 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
2433 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
2434 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
2435 del_timer_sync(&sdata->u.mgd.chswitch_timer); in ieee80211_set_disassoc()
2437 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
2438 sdata->vif.bss_conf.beacon_rate = NULL; in ieee80211_set_disassoc()
2444 ieee80211_vif_release_channel(sdata); in ieee80211_set_disassoc()
2446 sdata->vif.csa_active = false; in ieee80211_set_disassoc()
2449 if (sdata->csa_block_tx) { in ieee80211_set_disassoc()
2450 ieee80211_wake_vif_queues(local, sdata, in ieee80211_set_disassoc()
2452 sdata->csa_block_tx = false; in ieee80211_set_disassoc()
2460 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_set_disassoc()
2463 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
2465 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
2466 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
2472 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
2478 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_reset_ap_probe()
2486 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
2495 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_wmm_ac_notify() argument
2499 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_tx_wmm_ac_notify()
2530 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
2533 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time); in ieee80211_sta_tx_notify()
2536 !sdata->u.mgd.probe_send_count) in ieee80211_sta_tx_notify()
2540 sdata->u.mgd.probe_send_count = 0; in ieee80211_sta_tx_notify()
2542 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
2543 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_tx_notify()
2546 static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata, in ieee80211_mlme_send_probe_req() argument
2553 skb = ieee80211_build_probe_req(sdata, src, dst, (u32)-1, channel, in ieee80211_mlme_send_probe_req()
2557 ieee80211_tx_skb(sdata, skb); in ieee80211_mlme_send_probe_req()
2560 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
2562 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
2586 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2587 sta = sta_info_get(sdata, dst); in ieee80211_mgd_probe_ap_send()
2590 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2593 if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { in ieee80211_mgd_probe_ap_send()
2598 ieee80211_send_nullfunc(sdata->local, sdata, false); in ieee80211_mgd_probe_ap_send()
2609 ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst, in ieee80211_mgd_probe_ap_send()
2616 run_again(sdata, ifmgd->probe_timeout); in ieee80211_mgd_probe_ap_send()
2619 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
2622 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
2625 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
2628 sdata_lock(sdata); in ieee80211_mgd_probe_ap()
2633 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2635 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
2636 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2641 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
2645 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL); in ieee80211_mgd_probe_ap()
2664 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2669 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2670 ieee80211_recalc_ps(sdata->local); in ieee80211_mgd_probe_ap()
2671 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2674 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
2676 sdata_unlock(sdata); in ieee80211_mgd_probe_ap()
2682 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
2683 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
2689 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_ap_probereq_get()
2692 sdata_assert_lock(sdata); in ieee80211_ap_probereq_get()
2711 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, in ieee80211_ap_probereq_get()
2721 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata, in ieee80211_report_disconnect() argument
2732 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2734 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2736 drv_event_callback(sdata->local, sdata, &event); in ieee80211_report_disconnect()
2739 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
2741 struct ieee80211_local *local = sdata->local; in __ieee80211_disconnect()
2742 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_disconnect()
2746 sdata_lock(sdata); in __ieee80211_disconnect()
2748 sdata_unlock(sdata); in __ieee80211_disconnect()
2752 tx = !sdata->csa_block_tx; in __ieee80211_disconnect()
2759 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in __ieee80211_disconnect()
2763 sdata->vif.csa_active = false; in __ieee80211_disconnect()
2765 if (sdata->csa_block_tx) { in __ieee80211_disconnect()
2766 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_disconnect()
2768 sdata->csa_block_tx = false; in __ieee80211_disconnect()
2772 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx, in __ieee80211_disconnect()
2775 sdata_unlock(sdata); in __ieee80211_disconnect()
2780 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
2783 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
2789 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
2791 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
2793 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
2799 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
2803 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
2808 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
2809 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
2811 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
2813 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
2814 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
2820 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
2821 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
2823 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
2825 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
2826 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
2831 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
2834 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
2836 sdata_assert_lock(sdata); in ieee80211_destroy_auth_data()
2844 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_auth_data()
2845 sta_info_destroy_addr(sdata, auth_data->bss->bssid); in ieee80211_destroy_auth_data()
2847 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_auth_data()
2848 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_auth_data()
2849 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
2850 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2851 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_auth_data()
2852 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2855 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
2857 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
2860 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
2863 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
2865 sdata_assert_lock(sdata); in ieee80211_destroy_assoc_data()
2873 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_assoc_data()
2874 sta_info_destroy_addr(sdata, assoc_data->bss->bssid); in ieee80211_destroy_assoc_data()
2876 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_assoc_data()
2877 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_assoc_data()
2878 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
2879 sdata->vif.mu_mimo_owner = false; in ieee80211_destroy_assoc_data()
2881 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2882 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_assoc_data()
2883 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2886 cfg80211_abandon_assoc(sdata->dev, assoc_data->bss); in ieee80211_destroy_assoc_data()
2890 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
2893 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
2896 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
2897 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
2908 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_auth_challenge()
2912 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
2919 static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mark_sta_auth() argument
2922 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mark_sta_auth()
2926 sdata_info(sdata, "authenticated\n"); in ieee80211_mark_sta_auth()
2930 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_mark_sta_auth()
2933 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
2934 sta = sta_info_get(sdata, bssid); in ieee80211_mark_sta_auth()
2936 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid); in ieee80211_mark_sta_auth()
2941 sdata_info(sdata, "failed moving %pM to auth\n", bssid); in ieee80211_mark_sta_auth()
2947 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
2951 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
2954 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
2962 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_auth()
2985 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
2993 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
3002 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
3004 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
3007 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3022 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
3034 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3038 if (!ieee80211_mark_sta_auth(sdata, bssid)) in ieee80211_rx_mgmt_auth()
3042 sdata_info(sdata, "SAE peer confirmed\n"); in ieee80211_rx_mgmt_auth()
3046 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
3106 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
3109 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
3112 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_deauth()
3118 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_deauth()
3126 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_deauth()
3130 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
3132 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, in ieee80211_rx_mgmt_deauth()
3141 sdata_info(sdata, in ieee80211_rx_mgmt_deauth()
3146 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_rx_mgmt_deauth()
3148 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_deauth()
3154 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
3157 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
3160 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_disassoc()
3172 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_disassoc()
3176 sdata_info(sdata, "disassociated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_disassoc()
3180 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
3182 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code); in ieee80211_rx_mgmt_disassoc()
3248 static int ieee80211_recalc_twt_req(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_twt_req() argument
3254 if (sdata->vif.bss_conf.twt_requester != twt) { in ieee80211_recalc_twt_req()
3255 sdata->vif.bss_conf.twt_requester = twt; in ieee80211_recalc_twt_req()
3261 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
3266 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
3267 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
3271 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_assoc_success()
3305 sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n", in ieee80211_assoc_success()
3312 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_success()
3316 sdata->vif.bss_conf.aid = aid; in ieee80211_assoc_success()
3353 sdata_info(sdata, in ieee80211_assoc_success()
3364 sdata_info(sdata, in ieee80211_assoc_success()
3370 sdata_info(sdata, in ieee80211_assoc_success()
3376 sdata_info(sdata, in ieee80211_assoc_success()
3382 sdata_info(sdata, in ieee80211_assoc_success()
3393 sdata_info(sdata, in ieee80211_assoc_success()
3401 sdata_info(sdata, in ieee80211_assoc_success()
3409 sdata_info(sdata, in ieee80211_assoc_success()
3415 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3420 sta = sta_info_get(sdata, cbss->bssid); in ieee80211_assoc_success()
3422 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3427 sband = ieee80211_get_sband(sdata); in ieee80211_assoc_success()
3429 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3436 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3437 sdata_info(sdata, in ieee80211_assoc_success()
3445 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_success()
3449 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_success()
3454 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, in ieee80211_assoc_success()
3469 changed |= ieee80211_recalc_twt_req(sdata, sta, elems); in ieee80211_assoc_success()
3509 ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems->he_operation); in ieee80211_assoc_success()
3510 ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems->he_spr); in ieee80211_assoc_success()
3560 sdata_info(sdata, in ieee80211_assoc_success()
3564 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3569 if (sdata->wdev.use_4addr) in ieee80211_assoc_success()
3570 drv_sta_set_4addr(local, sdata, &sta->sta, true); in ieee80211_assoc_success()
3572 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3584 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_assoc_success()
3585 } else if (!ieee80211_sta_wmm_params(local, sdata, elems->wmm_param, in ieee80211_assoc_success()
3589 ieee80211_set_wmm_default(sdata, false, true); in ieee80211_assoc_success()
3616 ieee80211_set_associated(sdata, cbss, changed); in ieee80211_assoc_success()
3623 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
3629 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
3630 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_assoc_success()
3638 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
3642 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
3655 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_assoc_resp()
3683 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3689 fils_decrypt_assoc_resp(sdata, (u8 *)mgmt, &len, assoc_data) < 0) in ieee80211_rx_mgmt_assoc_resp()
3701 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3707 run_again(sdata, assoc_data->timeout); in ieee80211_rx_mgmt_assoc_resp()
3712 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
3714 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3717 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3719 if (!ieee80211_assoc_success(sdata, cbss, mgmt, len, &elems)) { in ieee80211_rx_mgmt_assoc_resp()
3721 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3722 cfg80211_assoc_timeout(sdata->dev, cbss); in ieee80211_rx_mgmt_assoc_resp()
3726 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3727 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
3734 ieee80211_destroy_assoc_data(sdata, true, false); in ieee80211_rx_mgmt_assoc_resp()
3739 if (sdata->tx_conf[ac].uapsd) in ieee80211_rx_mgmt_assoc_resp()
3743 cfg80211_rx_assoc_resp(sdata->dev, cbss, (u8 *)mgmt, len, uapsd_queues, in ieee80211_rx_mgmt_assoc_resp()
3747 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_bss_info() argument
3751 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
3755 sdata_assert_lock(sdata); in ieee80211_rx_bss_info()
3764 sdata->vif.bss_conf.beacon_rate = bss->beacon_rate; in ieee80211_rx_bss_info()
3770 static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_probe_resp() argument
3779 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
3781 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_probe_resp()
3790 channel = ieee80211_get_channel(sdata->local->hw.wiphy, in ieee80211_rx_mgmt_probe_resp()
3795 if (!ether_addr_equal(mgmt->da, sdata->vif.addr) && in ieee80211_rx_mgmt_probe_resp()
3804 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_probe_resp()
3808 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
3835 static void ieee80211_handle_beacon_sig(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_beacon_sig() argument
3871 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3877 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3883 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_handle_beacon_sig()
3893 &sdata->vif, in ieee80211_handle_beacon_sig()
3900 &sdata->vif, in ieee80211_handle_beacon_sig()
3917 &sdata->vif, in ieee80211_handle_beacon_sig()
3924 &sdata->vif, in ieee80211_handle_beacon_sig()
3941 static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_beacon() argument
3945 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
3946 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
3950 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
3961 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_beacon()
3964 bssid = ieee80211_get_bssid(hdr, len, sdata->vif.type); in ieee80211_rx_mgmt_beacon()
3979 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_rx_mgmt_beacon()
4000 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_beacon()
4007 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
4009 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
4011 sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count; in ieee80211_rx_mgmt_beacon()
4025 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_rx_mgmt_beacon()
4035 ieee80211_handle_beacon_sig(sdata, ifmgd, bss_conf, in ieee80211_rx_mgmt_beacon()
4039 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
4041 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_beacon()
4048 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
4070 ieee80211_send_nullfunc(local, sdata, false); in ieee80211_rx_mgmt_beacon()
4071 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
4082 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
4086 if (sdata->vif.p2p || in ieee80211_rx_mgmt_beacon()
4087 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_rx_mgmt_beacon()
4096 if (sdata->u.mgd.p2p_noa_index != noa.index) { in ieee80211_rx_mgmt_beacon()
4098 sdata->u.mgd.p2p_noa_index = noa.index; in ieee80211_rx_mgmt_beacon()
4107 } else if (sdata->u.mgd.p2p_noa_index != -1) { in ieee80211_rx_mgmt_beacon()
4109 sdata->u.mgd.p2p_noa_index = -1; in ieee80211_rx_mgmt_beacon()
4117 ieee80211_chswitch_post_beacon(sdata); in ieee80211_rx_mgmt_beacon()
4129 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
4131 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
4133 sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count; in ieee80211_rx_mgmt_beacon()
4142 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_beacon()
4144 ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, in ieee80211_rx_mgmt_beacon()
4149 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_rx_mgmt_beacon()
4169 ieee80211_recalc_ps_vif(sdata); in ieee80211_rx_mgmt_beacon()
4180 changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_rx_mgmt_beacon()
4185 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_beacon()
4187 changed |= ieee80211_recalc_twt_req(sdata, sta, &elems); in ieee80211_rx_mgmt_beacon()
4189 if (ieee80211_config_bw(sdata, sta, elems.ht_cap_elem, in ieee80211_rx_mgmt_beacon()
4194 sdata_info(sdata, in ieee80211_rx_mgmt_beacon()
4197 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
4200 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
4207 ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif, in ieee80211_rx_mgmt_beacon()
4211 changed |= ieee80211_handle_pwr_constr(sdata, chan, mgmt, in ieee80211_rx_mgmt_beacon()
4217 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_rx_mgmt_beacon()
4220 void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_ext() argument
4231 sdata_lock(sdata); in ieee80211_sta_rx_queued_ext()
4234 ieee80211_rx_mgmt_beacon(sdata, hdr, skb->len, rx_status); in ieee80211_sta_rx_queued_ext()
4237 sdata_unlock(sdata); in ieee80211_sta_rx_queued_ext()
4240 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
4253 sdata_lock(sdata); in ieee80211_sta_rx_queued_mgmt()
4257 ieee80211_rx_mgmt_beacon(sdata, (void *)mgmt, in ieee80211_sta_rx_queued_mgmt()
4261 ieee80211_rx_mgmt_probe_resp(sdata, skb); in ieee80211_sta_rx_queued_mgmt()
4264 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4267 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4270 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4274 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4293 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
4320 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
4327 sdata_unlock(sdata); in ieee80211_sta_rx_queued_mgmt()
4332 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
4333 from_timer(sdata, t, u.mgd.timer); in ieee80211_sta_timer()
4335 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_timer()
4338 static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
4343 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
4346 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_sta_connection_lost()
4350 static int ieee80211_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_auth() argument
4352 struct ieee80211_local *local = sdata->local; in ieee80211_auth()
4353 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_auth()
4360 sdata_assert_lock(sdata); in ieee80211_auth()
4368 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_auth()
4384 drv_mgd_prepare_tx(local, sdata, prepare_tx_duration); in ieee80211_auth()
4386 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_auth()
4402 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_auth()
4420 run_again(sdata, auth_data->timeout); in ieee80211_auth()
4425 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
4427 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
4428 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
4430 sdata_assert_lock(sdata); in ieee80211_do_assoc()
4434 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
4446 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
4449 ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
4454 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4460 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4466 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
4469 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
4471 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
4472 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
4473 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
4475 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mgd_conn_tx_status()
4478 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
4480 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
4481 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
4483 sdata_lock(sdata); in ieee80211_sta_work()
4501 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4512 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4527 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4528 } else if (ieee80211_auth(sdata)) { in ieee80211_sta_work()
4538 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4540 cfg80211_auth_timeout(sdata->dev, bssid); in ieee80211_sta_work()
4541 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4544 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4549 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
4557 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_sta_work()
4558 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_sta_work()
4559 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4562 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4578 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
4581 mlme_dbg(sdata, in ieee80211_sta_work()
4585 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4587 mlme_dbg(sdata, in ieee80211_sta_work()
4590 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4595 run_again(sdata, ifmgd->probe_timeout); in ieee80211_sta_work()
4597 mlme_dbg(sdata, in ieee80211_sta_work()
4600 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4603 mlme_dbg(sdata, in ieee80211_sta_work()
4607 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4613 mlme_dbg(sdata, in ieee80211_sta_work()
4617 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4622 sdata_unlock(sdata); in ieee80211_sta_work()
4627 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
4628 from_timer(sdata, t, u.mgd.bcn_mon_timer); in ieee80211_sta_bcn_mon_timer()
4629 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_bcn_mon_timer()
4631 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_bcn_mon_timer()
4634 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_bcn_mon_timer()
4637 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
4638 ieee80211_queue_work(&sdata->local->hw, in ieee80211_sta_bcn_mon_timer()
4639 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
4644 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
4645 from_timer(sdata, t, u.mgd.conn_mon_timer); in ieee80211_sta_conn_mon_timer()
4646 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
4647 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
4651 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_conn_mon_timer()
4654 sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_sta_conn_mon_timer()
4673 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
4677 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
4680 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
4682 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
4683 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
4686 if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_restart_sta_timer()
4687 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
4688 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
4693 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_quiesce() argument
4695 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_quiesce()
4698 sdata_lock(sdata); in ieee80211_mgd_quiesce()
4710 ieee80211_send_deauth_disassoc(sdata, bssid, bssid, in ieee80211_mgd_quiesce()
4715 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_quiesce()
4717 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_quiesce()
4718 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, in ieee80211_mgd_quiesce()
4739 if (ifmgd->associated && !sdata->local->wowlan) { in ieee80211_mgd_quiesce()
4747 ieee80211_mgd_deauth(sdata, &req); in ieee80211_mgd_quiesce()
4750 sdata_unlock(sdata); in ieee80211_mgd_quiesce()
4753 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
4755 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
4757 sdata_lock(sdata); in ieee80211_sta_restart()
4759 sdata_unlock(sdata); in ieee80211_sta_restart()
4763 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
4764 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
4765 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
4766 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
4770 sdata_unlock(sdata); in ieee80211_sta_restart()
4773 sdata_unlock(sdata); in ieee80211_sta_restart()
4778 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
4782 ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
4800 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
4801 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
4802 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
4805 if (sdata->local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS) in ieee80211_sta_setup_sdata()
4819 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
4823 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
4824 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
4825 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
4830 static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, in ieee80211_ht_vht_rx_chains() argument
4833 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ht_vht_rx_chains()
4936 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
4939 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
4940 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_channel()
5004 sdata_info(sdata, in ieee80211_prep_channel()
5057 sdata_info(sdata, in ieee80211_prep_channel()
5061 ifmgd->flags |= ieee80211_determine_chantype(sdata, sband, in ieee80211_prep_channel()
5068 sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss), in ieee80211_prep_channel()
5074 sdata_info(sdata, "Rejecting non-HE 6/7 GHz connection"); in ieee80211_prep_channel()
5079 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_prep_channel()
5087 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
5097 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
5139 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
5143 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
5144 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
5162 have_sta = sta_info_get(sdata, cbss->bssid); in ieee80211_prep_connection()
5167 new_sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL); in ieee80211_prep_connection()
5190 int shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_prep_connection()
5216 sdata_info(sdata, in ieee80211_prep_connection()
5222 sdata_info(sdata, in ieee80211_prep_connection()
5230 sdata_info(sdata, in ieee80211_prep_connection()
5233 sdata->vif.bss_conf.basic_rates = basic_rates; in ieee80211_prep_connection()
5238 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
5240 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
5246 sdata->vif.bss_conf.beacon_int = cbss->beacon_interval; in ieee80211_prep_connection()
5250 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
5251 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
5255 &sdata->vif.bss_conf.sync_dtim_count, in ieee80211_prep_connection()
5257 } else if (!ieee80211_hw_check(&sdata->local->hw, in ieee80211_prep_connection()
5261 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
5262 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
5264 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
5266 sdata->vif.bss_conf.sync_tsf = 0; in ieee80211_prep_connection()
5267 sdata->vif.bss_conf.sync_device_ts = 0; in ieee80211_prep_connection()
5268 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
5274 err = ieee80211_prep_channel(sdata, cbss); in ieee80211_prep_connection()
5287 ieee80211_bss_info_change_notify(sdata, in ieee80211_prep_connection()
5297 sdata_info(sdata, in ieee80211_prep_connection()
5313 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
5316 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
5317 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
5406 ieee80211_destroy_auth_data(sdata, cont_auth); in ieee80211_mgd_auth()
5419 ieee80211_mark_sta_auth(sdata, req->bss->bssid); in ieee80211_mgd_auth()
5424 sdata_info(sdata, in ieee80211_mgd_auth()
5427 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
5431 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_auth()
5436 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); in ieee80211_mgd_auth()
5438 err = ieee80211_prep_connection(sdata, req->bss, cont_auth, false); in ieee80211_mgd_auth()
5442 err = ieee80211_auth(sdata); in ieee80211_mgd_auth()
5444 sta_info_destroy_addr(sdata, req->bss->bssid); in ieee80211_mgd_auth()
5454 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_auth()
5456 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_auth()
5457 ieee80211_vif_release_channel(sdata); in ieee80211_mgd_auth()
5458 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_auth()
5463 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
5468 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
5469 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
5496 sdata_info(sdata, in ieee80211_mgd_assoc()
5499 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
5503 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_assoc()
5523 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
5547 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5559 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5599 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_mgd_assoc()
5601 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_mgd_assoc()
5603 sdata->smps_mode = ifmgd->req_smps; in ieee80211_mgd_assoc()
5625 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
5628 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in ieee80211_mgd_assoc()
5631 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) { in ieee80211_mgd_assoc()
5660 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
5661 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
5662 sdata->control_port_over_nl80211 = in ieee80211_mgd_assoc()
5664 sdata->control_port_no_preauth = req->crypto.control_port_no_preauth; in ieee80211_mgd_assoc()
5665 sdata->encrypt_headroom = ieee80211_cs_headroom(local, &req->crypto, in ieee80211_mgd_assoc()
5666 sdata->vif.type); in ieee80211_mgd_assoc()
5682 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_mgd_assoc()
5704 err = ieee80211_prep_connection(sdata, req->bss, true, override); in ieee80211_mgd_assoc()
5711 if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) && in ieee80211_mgd_assoc()
5717 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
5734 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; in ieee80211_mgd_assoc()
5735 sdata->vif.bss_conf.sync_device_ts = in ieee80211_mgd_assoc()
5737 sdata->vif.bss_conf.sync_dtim_count = dtim_count; in ieee80211_mgd_assoc()
5743 sdata->vif.bss_conf.profile_periodicity = elem->data[2]; in ieee80211_mgd_assoc()
5749 sdata->vif.bss_conf.ema_ap = true; in ieee80211_mgd_assoc()
5756 run_again(sdata, assoc_data->timeout); in ieee80211_mgd_assoc()
5768 sdata_info(sdata, "associating with AP with corrupt %s\n", in ieee80211_mgd_assoc()
5775 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_assoc()
5782 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
5785 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
5791 sdata_info(sdata, in ieee80211_mgd_deauth()
5796 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_mgd_deauth()
5797 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
5801 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
5802 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5811 sdata_info(sdata, in ieee80211_mgd_deauth()
5816 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_mgd_deauth()
5817 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
5821 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_deauth()
5822 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5830 sdata_info(sdata, in ieee80211_mgd_deauth()
5835 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
5837 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5846 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
5849 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_disassoc()
5862 sdata_info(sdata, in ieee80211_mgd_disassoc()
5867 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
5871 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_mgd_disassoc()
5877 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
5879 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
5893 sdata_lock(sdata); in ieee80211_mgd_stop()
5896 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_mgd_stop()
5897 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_mgd_stop()
5900 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
5912 sdata_unlock(sdata); in ieee80211_mgd_stop()
5920 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
5922 trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level); in ieee80211_cqm_rssi_notify()
5924 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp); in ieee80211_cqm_rssi_notify()
5930 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_beacon_loss_notify() local
5932 trace_api_cqm_beacon_loss_notify(sdata->local, sdata); in ieee80211_cqm_beacon_loss_notify()
5934 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp); in ieee80211_cqm_beacon_loss_notify()