Lines Matching refs:sdata

175 static void run_again(struct ieee80211_sub_if_data *sdata,  in run_again()  argument
178 sdata_assert_lock(sdata); in run_again()
180 if (!timer_pending(&sdata->u.mgd.timer) || in run_again()
181 time_before(timeout, sdata->u.mgd.timer.expires)) in run_again()
182 mod_timer(&sdata->u.mgd.timer, timeout); in run_again()
185 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_beacon_monitor() argument
187 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_reset_beacon_monitor()
190 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_beacon_monitor()
193 mod_timer(&sdata->u.mgd.bcn_mon_timer, in ieee80211_sta_reset_beacon_monitor()
194 round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout)); in ieee80211_sta_reset_beacon_monitor()
197 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_conn_monitor() argument
199 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_reset_conn_monitor()
207 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_conn_monitor()
220 ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, in ieee80211_determine_chantype() argument
245 if (!ieee80211_chandef_he_6ghz_oper(sdata, he_oper, eht_oper, in ieee80211_determine_chantype()
247 mlme_dbg(sdata, in ieee80211_determine_chantype()
260 sdata_info(sdata, in ieee80211_determine_chantype()
273 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_determine_chantype()
276 mlme_dbg(sdata, "HT operation missing / HT not supported\n"); in ieee80211_determine_chantype()
297 sdata_info(sdata, in ieee80211_determine_chantype()
312 mlme_dbg(sdata, "40 MHz not supported\n"); in ieee80211_determine_chantype()
321 mlme_dbg(sdata, "VHT operation missing / VHT not supported\n"); in ieee80211_determine_chantype()
340 if (!ieee80211_chandef_vht_oper(&sdata->local->hw, vht_cap_info, in ieee80211_determine_chantype()
344 sdata_info(sdata, in ieee80211_determine_chantype()
349 } else if (!ieee80211_chandef_vht_oper(&sdata->local->hw, in ieee80211_determine_chantype()
354 sdata_info(sdata, in ieee80211_determine_chantype()
362 sdata_info(sdata, in ieee80211_determine_chantype()
375 sdata_info(sdata, in ieee80211_determine_chantype()
398 sdata_info(sdata, in ieee80211_determine_chantype()
406 sdata_info(sdata, in ieee80211_determine_chantype()
452 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, in ieee80211_determine_chantype()
466 if (!he_oper || !cfg80211_chandef_usable(sdata->wdev.wiphy, chandef, in ieee80211_determine_chantype()
470 if (!eht_oper || !cfg80211_chandef_usable(sdata->wdev.wiphy, chandef, in ieee80211_determine_chantype()
475 sdata_info(sdata, in ieee80211_determine_chantype()
492 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_config_bw() local
493 struct ieee80211_local *local = sdata->local; in ieee80211_config_bw()
494 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_config_bw()
514 !ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif)) { in ieee80211_config_bw()
521 !ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif)) in ieee80211_config_bw()
538 flags = ieee80211_determine_chantype(sdata, link, in ieee80211_config_bw()
582 sdata_info(sdata, in ieee80211_config_bw()
591 sdata_info(sdata, in ieee80211_config_bw()
602 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
617 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
677 static bool ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
683 struct ieee80211_local *local = sdata->local; in ieee80211_add_vht_ie()
693 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
767 static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_he_ie() argument
777 he_cap = ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif); in ieee80211_add_he_ie()
794 ieee80211_ie_build_he_6ghz_cap(sdata, smps_mode, skb); in ieee80211_add_he_ie()
797 static void ieee80211_add_eht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_eht_ie() argument
806 he_cap = ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif); in ieee80211_add_eht_ie()
807 eht_cap = ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif); in ieee80211_add_eht_ie()
1014 static void ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata,
1019 static size_t ieee80211_assoc_link_elems(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_link_elems() argument
1028 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_assoc_link_elems()
1029 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_link_elems()
1034 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_link_elems()
1054 else if (sdata->u.mgd.powersave) in ieee80211_assoc_link_elems()
1132 ieee80211_add_ht_ie(sdata, skb, in ieee80211_assoc_link_elems()
1147 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_assoc_link_elems()
1173 ieee80211_add_he_ie(sdata, skb, sband, smps_mode, in ieee80211_assoc_link_elems()
1187 ieee80211_assoc_add_ml_elem(sdata, skb, orig_capab, ext_capa, in ieee80211_assoc_link_elems()
1194 ieee80211_add_eht_ie(sdata, skb, sband); in ieee80211_assoc_link_elems()
1197 ieee80211_add_aid_request_ie(sdata, skb); in ieee80211_assoc_link_elems()
1198 ieee80211_add_s1g_capab_ie(sdata, &sband->s1g_cap, skb); in ieee80211_assoc_link_elems()
1269 static void ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_add_ml_elem() argument
1274 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_add_ml_elem()
1275 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_add_ml_elem()
1285 if (!ieee80211_vif_is_mld(&sdata->vif)) in ieee80211_assoc_add_ml_elem()
1289 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_assoc_add_ml_elem()
1305 memcpy(common->mld_mac_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assoc_add_ml_elem()
1355 extra_used = ieee80211_assoc_link_elems(sdata, skb, &capab, in ieee80211_assoc_add_ml_elem()
1377 static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
1379 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
1380 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
1390 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_send_assoc()
1404 sdata_assert_lock(sdata); in ieee80211_send_assoc()
1460 if (ieee80211_vif_is_mld(&sdata->vif)) { in ieee80211_send_assoc()
1479 link = sdata_dereference(sdata->link[assoc_data->assoc_link_id], sdata); in ieee80211_send_assoc()
1502 memcpy(mgmt->da, sdata->vif.cfg.ap_addr, ETH_ALEN); in ieee80211_send_assoc()
1503 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
1504 memcpy(mgmt->bssid, sdata->vif.cfg.ap_addr, ETH_ALEN); in ieee80211_send_assoc()
1536 offset = ieee80211_assoc_link_elems(sdata, skb, &link_capab, in ieee80211_send_assoc()
1589 drv_mgd_prepare_tx(local, sdata, &info); in ieee80211_send_assoc()
1595 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
1601 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
1606 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
1614 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
1618 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
1623 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
1625 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif, -1, in ieee80211_send_nullfunc()
1644 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
1648 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
1654 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
1667 memcpy(nullfunc->addr1, sdata->deflink.u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1668 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1669 memcpy(nullfunc->addr3, sdata->deflink.u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1670 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1674 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
1684 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_chswitch_work() local
1685 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
1686 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
1689 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
1692 sdata_lock(sdata); in ieee80211_chswitch_work()
1720 sdata_info(sdata, in ieee80211_chswitch_work()
1723 wiphy_work_queue(sdata->local->hw.wiphy, in ieee80211_chswitch_work()
1733 sdata_info(sdata, in ieee80211_chswitch_work()
1735 wiphy_work_queue(sdata->local->hw.wiphy, in ieee80211_chswitch_work()
1742 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_chswitch_work()
1743 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_chswitch_work()
1748 sdata_unlock(sdata); in ieee80211_chswitch_work()
1753 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_chswitch_post_beacon() local
1754 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_post_beacon()
1755 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_post_beacon()
1758 sdata_assert_lock(sdata); in ieee80211_chswitch_post_beacon()
1763 ieee80211_wake_vif_queues(local, sdata, in ieee80211_chswitch_post_beacon()
1776 ret = drv_post_channel_switch(sdata); in ieee80211_chswitch_post_beacon()
1778 sdata_info(sdata, in ieee80211_chswitch_post_beacon()
1780 wiphy_work_queue(sdata->local->hw.wiphy, in ieee80211_chswitch_post_beacon()
1785 cfg80211_ch_switch_notify(sdata->dev, &link->reserved_chandef, 0, 0); in ieee80211_chswitch_post_beacon()
1790 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
1791 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
1793 if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif))) in ieee80211_chswitch_done()
1796 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
1798 sdata_info(sdata, in ieee80211_chswitch_done()
1800 wiphy_work_queue(sdata->local->hw.wiphy, in ieee80211_chswitch_done()
1803 wiphy_delayed_work_queue(sdata->local->hw.wiphy, in ieee80211_chswitch_done()
1804 &sdata->deflink.u.mgd.chswitch_work, in ieee80211_chswitch_done()
1813 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_sta_abort_chanswitch() local
1814 struct ieee80211_local *local = sdata->local; in ieee80211_sta_abort_chanswitch()
1826 ieee80211_wake_vif_queues(local, sdata, in ieee80211_sta_abort_chanswitch()
1834 drv_abort_channel_switch(sdata); in ieee80211_sta_abort_chanswitch()
1843 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_sta_process_chanswitch() local
1844 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1845 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1856 sdata_assert_lock(sdata); in ieee80211_sta_process_chanswitch()
1863 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band, in ieee80211_sta_process_chanswitch()
1885 drv_channel_switch_rx_beacon(sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1894 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1905 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1923 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1936 ieee80211_teardown_tdls_peers(sdata); in ieee80211_sta_process_chanswitch()
1943 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1952 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1957 if (drv_pre_channel_switch(sdata, &ch_switch)) { in ieee80211_sta_process_chanswitch()
1958 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1966 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1980 ieee80211_stop_vif_queues(local, sdata, in ieee80211_sta_process_chanswitch()
1984 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1990 drv_channel_switch(local, sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
2015 wiphy_work_queue(sdata->local->hw.wiphy, in ieee80211_sta_process_chanswitch()
2022 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_find_80211h_pwr_constr() argument
2093 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata, in ieee80211_find_cisco_dtpc() argument
2114 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_handle_pwr_constr() local
2128 sdata, channel, country_ie, country_ie_len, in ieee80211_handle_pwr_constr()
2136 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco); in ieee80211_handle_pwr_constr()
2153 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
2163 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
2169 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
2176 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
2193 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_enable_ps()
2218 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
2220 struct ieee80211_local *local = sdata->local; in ieee80211_powersave_allowed()
2221 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
2238 !sdata->deflink.u.mgd.have_beacon) in ieee80211_powersave_allowed()
2242 sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr); in ieee80211_powersave_allowed()
2253 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
2263 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
2264 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
2266 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
2274 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
2276 found = sdata; in ieee80211_recalc_ps()
2301 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
2303 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
2305 if (sdata->vif.cfg.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
2306 sdata->vif.cfg.ps = ps_allowed; in ieee80211_recalc_ps_vif()
2307 ieee80211_vif_cfg_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
2333 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
2339 if (!sdata) in ieee80211_dynamic_ps_enable_work()
2342 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
2382 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_dynamic_ps_enable_work()
2384 ieee80211_flush_queues(local, sdata, false); in ieee80211_dynamic_ps_enable_work()
2411 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_dfs_cac_timer_work() local
2413 mutex_lock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
2414 if (sdata->wdev.cac_started) { in ieee80211_dfs_cac_timer_work()
2416 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_dfs_cac_timer_work()
2420 mutex_unlock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
2424 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in __ieee80211_sta_handle_tspec_ac_params() argument
2426 struct ieee80211_local *local = sdata->local; in __ieee80211_sta_handle_tspec_ac_params()
2427 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_sta_handle_tspec_ac_params()
2453 if (drv_conf_tx(local, &sdata->deflink, ac, in __ieee80211_sta_handle_tspec_ac_params()
2454 &sdata->deflink.tx_conf[ac])) in __ieee80211_sta_handle_tspec_ac_params()
2455 link_err(&sdata->deflink, in __ieee80211_sta_handle_tspec_ac_params()
2472 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac))) in __ieee80211_sta_handle_tspec_ac_params()
2483 if (drv_conf_tx(local, &sdata->deflink, ac, in __ieee80211_sta_handle_tspec_ac_params()
2484 &sdata->deflink.tx_conf[non_acm_ac])) in __ieee80211_sta_handle_tspec_ac_params()
2485 link_err(&sdata->deflink, in __ieee80211_sta_handle_tspec_ac_params()
2502 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_handle_tspec_ac_params() argument
2504 if (__ieee80211_sta_handle_tspec_ac_params(sdata)) in ieee80211_sta_handle_tspec_ac_params()
2505 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_sta_handle_tspec_ac_params()
2511 struct ieee80211_sub_if_data *sdata; in ieee80211_sta_handle_tspec_ac_params_wk() local
2513 sdata = container_of(work, struct ieee80211_sub_if_data, in ieee80211_sta_handle_tspec_ac_params_wk()
2515 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_sta_handle_tspec_ac_params_wk()
2520 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_mgd_set_link_qos_params() local
2521 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_set_link_qos_params()
2522 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_set_link_qos_params()
2527 mlme_dbg(sdata, in ieee80211_mgd_set_link_qos_params()
2548 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_sta_wmm_params() local
2550 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
2588 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
2598 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
2608 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
2618 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
2629 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
2659 ieee80211_regulatory_limit_wmm_params(sdata, &params[ac], ac); in ieee80211_sta_wmm_params()
2682 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
2684 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
2686 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL; in __ieee80211_stop_poll()
2687 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
2690 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
2692 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
2693 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
2694 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
2745 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_set_associated() local
2751 sdata->u.mgd.beacon_timeout = in ieee80211_link_set_associated()
2765 if (sdata->vif.p2p || in ieee80211_link_set_associated()
2766 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_link_set_associated()
2796 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_link_set_associated()
2803 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
2807 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
2808 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg; in ieee80211_set_associated()
2812 sdata->u.mgd.associated = true; in ieee80211_set_associated()
2822 if (ieee80211_vif_is_mld(&sdata->vif) && in ieee80211_set_associated()
2823 !(ieee80211_vif_usable_links(&sdata->vif) & BIT(link_id))) in ieee80211_set_associated()
2826 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_set_associated()
2834 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
2844 if (ieee80211_vif_is_mld(&sdata->vif)) { in ieee80211_set_associated()
2853 ieee80211_vif_usable_links(&sdata->vif)) || in ieee80211_set_associated()
2857 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_set_associated()
2861 ieee80211_link_info_change_notify(sdata, link, in ieee80211_set_associated()
2864 ieee80211_recalc_smps(sdata, link); in ieee80211_set_associated()
2867 ieee80211_vif_cfg_change_notify(sdata, vif_changed); in ieee80211_set_associated()
2869 ieee80211_bss_info_change_notify(sdata, in ieee80211_set_associated()
2878 if (!ieee80211_vif_is_mld(&sdata->vif)) in ieee80211_set_associated()
2879 ieee80211_recalc_smps(sdata, &sdata->deflink); in ieee80211_set_associated()
2880 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
2882 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
2885 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
2889 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
2890 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
2897 sdata_assert_lock(sdata); in ieee80211_set_disassoc()
2905 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
2910 sdata->deflink.u.mgd.bss = NULL; in ieee80211_set_disassoc()
2912 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
2926 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
2938 ieee80211_flush_queues(local, sdata, true); in ieee80211_set_disassoc()
2949 !sdata->deflink.u.mgd.have_beacon) { in ieee80211_set_disassoc()
2950 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_set_disassoc()
2953 ieee80211_send_deauth_disassoc(sdata, sdata->vif.cfg.ap_addr, in ieee80211_set_disassoc()
2954 sdata->vif.cfg.ap_addr, stype, in ieee80211_set_disassoc()
2960 ieee80211_flush_queues(local, sdata, false); in ieee80211_set_disassoc()
2962 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_set_disassoc()
2965 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_set_disassoc()
2966 eth_zero_addr(sdata->vif.cfg.ap_addr); in ieee80211_set_disassoc()
2968 sdata->vif.cfg.ssid_len = 0; in ieee80211_set_disassoc()
2971 sta_info_flush(sdata); in ieee80211_set_disassoc()
2974 if (!ieee80211_vif_is_mld(&sdata->vif)) in ieee80211_set_disassoc()
2975 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
2979 sdata->vif.cfg.assoc = false; in ieee80211_set_disassoc()
2981 sdata->deflink.u.mgd.p2p_noa_index = -1; in ieee80211_set_disassoc()
2982 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
2983 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
2995 memset(sdata->vif.bss_conf.mu_group.membership, 0, in ieee80211_set_disassoc()
2996 sizeof(sdata->vif.bss_conf.mu_group.membership)); in ieee80211_set_disassoc()
2997 memset(sdata->vif.bss_conf.mu_group.position, 0, in ieee80211_set_disassoc()
2998 sizeof(sdata->vif.bss_conf.mu_group.position)); in ieee80211_set_disassoc()
2999 if (!ieee80211_vif_is_mld(&sdata->vif)) in ieee80211_set_disassoc()
3001 sdata->vif.bss_conf.mu_mimo_owner = false; in ieee80211_set_disassoc()
3003 sdata->deflink.ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
3009 if (sdata->vif.cfg.arp_addr_cnt) in ieee80211_set_disassoc()
3012 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
3013 if (!ieee80211_vif_is_mld(&sdata->vif)) { in ieee80211_set_disassoc()
3017 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
3019 ieee80211_vif_cfg_change_notify(sdata, changed); in ieee80211_set_disassoc()
3023 ieee80211_set_wmm_default(&sdata->deflink, false, false); in ieee80211_set_disassoc()
3025 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
3026 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
3027 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
3029 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
3030 sdata->vif.bss_conf.beacon_rate = NULL; in ieee80211_set_disassoc()
3032 sdata->deflink.u.mgd.have_beacon = false; in ieee80211_set_disassoc()
3033 sdata->deflink.u.mgd.tracking_signal_avg = false; in ieee80211_set_disassoc()
3034 sdata->deflink.u.mgd.disable_wmm_tracking = false; in ieee80211_set_disassoc()
3037 sdata->deflink.u.mgd.conn_flags = 0; in ieee80211_set_disassoc()
3040 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) { in ieee80211_set_disassoc()
3043 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_set_disassoc()
3049 sdata->vif.bss_conf.csa_active = false; in ieee80211_set_disassoc()
3050 sdata->deflink.u.mgd.csa_waiting_bcn = false; in ieee80211_set_disassoc()
3051 sdata->deflink.u.mgd.csa_ignored_same_chan = false; in ieee80211_set_disassoc()
3052 if (sdata->deflink.csa_block_tx) { in ieee80211_set_disassoc()
3053 ieee80211_wake_vif_queues(local, sdata, in ieee80211_set_disassoc()
3055 sdata->deflink.csa_block_tx = false; in ieee80211_set_disassoc()
3063 sdata->vif.bss_conf.pwr_reduction = 0; in ieee80211_set_disassoc()
3064 sdata->vif.bss_conf.tx_pwr_env_num = 0; in ieee80211_set_disassoc()
3065 memset(sdata->vif.bss_conf.tx_pwr_env, 0, in ieee80211_set_disassoc()
3066 sizeof(sdata->vif.bss_conf.tx_pwr_env)); in ieee80211_set_disassoc()
3068 ieee80211_vif_set_links(sdata, 0, 0); in ieee80211_set_disassoc()
3071 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
3073 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
3074 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
3080 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
3086 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_reset_ap_probe()
3094 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
3103 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_wmm_ac_notify() argument
3107 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_tx_wmm_ac_notify()
3145 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
3148 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time); in ieee80211_sta_tx_notify()
3151 !sdata->u.mgd.probe_send_count) in ieee80211_sta_tx_notify()
3155 sdata->u.mgd.probe_send_count = 0; in ieee80211_sta_tx_notify()
3157 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
3158 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work); in ieee80211_sta_tx_notify()
3161 static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata, in ieee80211_mlme_send_probe_req() argument
3168 skb = ieee80211_build_probe_req(sdata, src, dst, (u32)-1, channel, in ieee80211_mlme_send_probe_req()
3172 ieee80211_tx_skb(sdata, skb); in ieee80211_mlme_send_probe_req()
3175 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
3177 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
3178 u8 *dst = sdata->vif.cfg.ap_addr; in ieee80211_mgd_probe_ap_send()
3182 if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif))) in ieee80211_mgd_probe_ap_send()
3203 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
3204 sta = sta_info_get(sdata, dst); in ieee80211_mgd_probe_ap_send()
3207 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
3210 if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { in ieee80211_mgd_probe_ap_send()
3212 ieee80211_send_nullfunc(sdata->local, sdata, false); in ieee80211_mgd_probe_ap_send()
3214 ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst, in ieee80211_mgd_probe_ap_send()
3215 sdata->vif.cfg.ssid, in ieee80211_mgd_probe_ap_send()
3216 sdata->vif.cfg.ssid_len, in ieee80211_mgd_probe_ap_send()
3217 sdata->deflink.u.mgd.bss->channel); in ieee80211_mgd_probe_ap_send()
3221 run_again(sdata, ifmgd->probe_timeout); in ieee80211_mgd_probe_ap_send()
3224 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
3227 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
3230 if (WARN_ON_ONCE(ieee80211_vif_is_mld(&sdata->vif))) in ieee80211_mgd_probe_ap()
3233 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
3236 sdata_lock(sdata); in ieee80211_mgd_probe_ap()
3241 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
3243 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
3244 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
3248 if (sdata->local->suspending) { in ieee80211_mgd_probe_ap()
3250 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
3251 ieee80211_reset_ap_probe(sdata); in ieee80211_mgd_probe_ap()
3256 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
3260 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL); in ieee80211_mgd_probe_ap()
3279 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
3284 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
3285 ieee80211_recalc_ps(sdata->local); in ieee80211_mgd_probe_ap()
3286 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
3289 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
3291 sdata_unlock(sdata); in ieee80211_mgd_probe_ap()
3297 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
3298 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
3304 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION || in ieee80211_ap_probereq_get()
3305 ieee80211_vif_is_mld(&sdata->vif))) in ieee80211_ap_probereq_get()
3308 sdata_assert_lock(sdata); in ieee80211_ap_probereq_get()
3311 cbss = sdata->deflink.u.mgd.bss; in ieee80211_ap_probereq_get()
3328 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, in ieee80211_ap_probereq_get()
3338 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata, in ieee80211_report_disconnect() argument
3349 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len, reconnect); in ieee80211_report_disconnect()
3351 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
3353 drv_event_callback(sdata->local, sdata, &event); in ieee80211_report_disconnect()
3356 static void ___ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in ___ieee80211_disconnect() argument
3358 struct ieee80211_local *local = sdata->local; in ___ieee80211_disconnect()
3359 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ___ieee80211_disconnect()
3367 tx = ieee80211_vif_is_mld(&sdata->vif) || in ___ieee80211_disconnect()
3368 !sdata->deflink.csa_block_tx; in ___ieee80211_disconnect()
3381 link_id < ARRAY_SIZE(sdata->link); in ___ieee80211_disconnect()
3385 link = sdata_dereference(sdata->link[link_id], sdata); in ___ieee80211_disconnect()
3393 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ___ieee80211_disconnect()
3400 sdata->vif.bss_conf.csa_active = false; in ___ieee80211_disconnect()
3401 sdata->deflink.u.mgd.csa_waiting_bcn = false; in ___ieee80211_disconnect()
3402 if (sdata->deflink.csa_block_tx) { in ___ieee80211_disconnect()
3403 ieee80211_wake_vif_queues(local, sdata, in ___ieee80211_disconnect()
3405 sdata->deflink.csa_block_tx = false; in ___ieee80211_disconnect()
3409 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx, in ___ieee80211_disconnect()
3415 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
3417 sdata_lock(sdata); in __ieee80211_disconnect()
3418 ___ieee80211_disconnect(sdata); in __ieee80211_disconnect()
3419 sdata_unlock(sdata); in __ieee80211_disconnect()
3425 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
3428 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
3431 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
3432 sdata->vif.cfg.ap_addr); in ieee80211_beacon_connection_loss_work()
3433 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
3436 sdata_info(sdata, in ieee80211_beacon_connection_loss_work()
3438 sdata->vif.cfg.ap_addr); in ieee80211_beacon_connection_loss_work()
3439 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
3443 sdata->deflink.u.mgd.beacon_loss_count++; in ieee80211_beacon_connection_loss_work()
3444 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
3451 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
3455 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
3460 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
3461 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
3463 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
3465 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
3466 wiphy_work_queue(hw->wiphy, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
3472 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
3473 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
3475 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
3477 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
3478 wiphy_work_queue(hw->wiphy, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
3484 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_disconnect() local
3485 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_disconnect()
3487 trace_api_disconnect(sdata, reconnect); in ieee80211_disconnect()
3489 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_disconnect()
3492 sdata->u.mgd.driver_disconnect = true; in ieee80211_disconnect()
3493 sdata->u.mgd.reconnect = reconnect; in ieee80211_disconnect()
3494 wiphy_work_queue(hw->wiphy, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_disconnect()
3498 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
3501 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
3503 sdata_assert_lock(sdata); in ieee80211_destroy_auth_data()
3511 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_auth_data()
3512 sta_info_destroy_addr(sdata, auth_data->ap_addr); in ieee80211_destroy_auth_data()
3515 sdata->deflink.u.mgd.conn_flags = 0; in ieee80211_destroy_auth_data()
3516 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_destroy_auth_data()
3517 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_destroy_auth_data()
3519 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
3521 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
3522 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_destroy_auth_data()
3523 ieee80211_vif_set_links(sdata, 0, 0); in ieee80211_destroy_auth_data()
3524 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
3527 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
3529 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
3539 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
3542 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
3544 sdata_assert_lock(sdata); in ieee80211_destroy_assoc_data()
3552 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_assoc_data()
3553 sta_info_destroy_addr(sdata, assoc_data->ap_addr); in ieee80211_destroy_assoc_data()
3555 sdata->deflink.u.mgd.conn_flags = 0; in ieee80211_destroy_assoc_data()
3556 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_destroy_assoc_data()
3557 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_destroy_assoc_data()
3559 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
3560 sdata->vif.bss_conf.mu_mimo_owner = false; in ieee80211_destroy_assoc_data()
3574 if (ieee80211_vif_is_mld(&sdata->vif)) in ieee80211_destroy_assoc_data()
3577 cfg80211_assoc_failure(sdata->dev, &data); in ieee80211_destroy_assoc_data()
3580 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
3581 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_destroy_assoc_data()
3582 ieee80211_vif_set_links(sdata, 0, 0); in ieee80211_destroy_assoc_data()
3583 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
3587 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
3590 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
3593 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
3594 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
3608 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_auth_challenge()
3612 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
3620 static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_mark_sta_auth() argument
3622 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mark_sta_auth()
3627 sdata_info(sdata, "authenticated\n"); in ieee80211_mark_sta_auth()
3631 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_mark_sta_auth()
3634 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
3635 sta = sta_info_get(sdata, ap_addr); in ieee80211_mark_sta_auth()
3637 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, ap_addr); in ieee80211_mark_sta_auth()
3642 sdata_info(sdata, "failed moving %pM to auth\n", ap_addr); in ieee80211_mark_sta_auth()
3648 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
3652 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
3655 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
3665 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_auth()
3686 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
3694 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
3706 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_rx_mgmt_auth()
3710 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
3712 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
3715 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3730 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
3743 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3747 if (!ieee80211_mark_sta_auth(sdata)) in ieee80211_rx_mgmt_auth()
3751 sdata_info(sdata, "SAE peer confirmed\n"); in ieee80211_rx_mgmt_auth()
3755 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
3757 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_rx_mgmt_auth()
3817 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
3820 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
3823 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_deauth()
3829 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_deauth()
3834 ether_addr_equal(mgmt->bssid, sdata->vif.cfg.ap_addr)) { in ieee80211_rx_mgmt_deauth()
3835 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_deauth()
3836 sdata->vif.cfg.ap_addr, reason_code, in ieee80211_rx_mgmt_deauth()
3839 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
3841 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, in ieee80211_rx_mgmt_deauth()
3848 sdata_info(sdata, in ieee80211_rx_mgmt_deauth()
3853 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON); in ieee80211_rx_mgmt_deauth()
3855 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_deauth()
3861 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
3864 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
3867 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_disassoc()
3873 !ether_addr_equal(mgmt->bssid, sdata->vif.cfg.ap_addr)) in ieee80211_rx_mgmt_disassoc()
3879 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_disassoc()
3883 sdata_info(sdata, "disassociated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_disassoc()
3884 sdata->vif.cfg.ap_addr, reason_code, in ieee80211_rx_mgmt_disassoc()
3887 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
3889 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code, in ieee80211_rx_mgmt_disassoc()
3945 static bool ieee80211_twt_req_supported(struct ieee80211_sub_if_data *sdata, in ieee80211_twt_req_supported() argument
3951 ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif); in ieee80211_twt_req_supported()
3966 static u64 ieee80211_recalc_twt_req(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_twt_req() argument
3972 bool twt = ieee80211_twt_req_supported(sdata, sband, link_sta, elems); in ieee80211_recalc_twt_req()
3981 static bool ieee80211_twt_bcast_support(struct ieee80211_sub_if_data *sdata, in ieee80211_twt_bcast_support() argument
3987 ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif); in ieee80211_twt_bcast_support()
4005 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_assoc_config_link() local
4006 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_assoc_config_link()
4008 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_config_link()
4073 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_config_link()
4121 sdata_info(sdata, in ieee80211_assoc_config_link()
4132 sdata_info(sdata, in ieee80211_assoc_config_link()
4138 sdata_info(sdata, in ieee80211_assoc_config_link()
4144 sdata_info(sdata, in ieee80211_assoc_config_link()
4150 sdata_info(sdata, in ieee80211_assoc_config_link()
4163 sdata_info(sdata, in ieee80211_assoc_config_link()
4171 sdata_info(sdata, in ieee80211_assoc_config_link()
4179 sdata_info(sdata, in ieee80211_assoc_config_link()
4193 sdata_info(sdata, in ieee80211_assoc_config_link()
4201 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_config_link()
4227 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_config_link()
4235 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, in ieee80211_assoc_config_link()
4250 *changed |= ieee80211_recalc_twt_req(sdata, sband, link, in ieee80211_assoc_config_link()
4255 ieee80211_eht_cap_ie_to_sta_eht_cap(sdata, sband, in ieee80211_assoc_config_link()
4275 ieee80211_twt_bcast_support(sdata, bss_conf, sband, link_sta); in ieee80211_assoc_config_link()
4302 ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems->he_operation); in ieee80211_assoc_config_link()
4303 ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems->he_spr); in ieee80211_assoc_config_link()
4391 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_mgd_setup_link_sta() local
4392 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_setup_link_sta()
4398 int shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_mgd_setup_link_sta()
4547 ieee80211_verify_peer_he_mcs_support(struct ieee80211_sub_if_data *sdata, in ieee80211_verify_peer_he_mcs_support() argument
4567 sdata_info(sdata, in ieee80211_verify_peer_he_mcs_support()
4578 sdata_info(sdata, in ieee80211_verify_peer_he_mcs_support()
4599 sdata_info(sdata, in ieee80211_verify_peer_he_mcs_support()
4645 sdata_info(sdata, in ieee80211_verify_peer_he_mcs_support()
4656 ieee80211_verify_sta_he_mcs_support(struct ieee80211_sub_if_data *sdata, in ieee80211_verify_sta_he_mcs_support() argument
4661 ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif); in ieee80211_verify_sta_he_mcs_support()
4772 ieee80211_verify_sta_eht_mcs_support(struct ieee80211_sub_if_data *sdata, in ieee80211_verify_sta_eht_mcs_support() argument
4777 ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif); in ieee80211_verify_sta_eht_mcs_support()
4779 ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif); in ieee80211_verify_sta_eht_mcs_support()
4817 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
4822 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
4863 mlme_dbg(sdata, "HT not supported, disabling HT/VHT/HE/EHT\n"); in ieee80211_prep_channel()
4871 mlme_dbg(sdata, "VHT not supported, disabling VHT/HE/EHT\n"); in ieee80211_prep_channel()
4877 if (!ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif)) { in ieee80211_prep_channel()
4878 mlme_dbg(sdata, "HE not supported, disabling HE and EHT\n"); in ieee80211_prep_channel()
4883 if (!ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif)) { in ieee80211_prep_channel()
4884 mlme_dbg(sdata, "EHT not supported, disabling EHT\n"); in ieee80211_prep_channel()
4902 sdata_info(sdata, in ieee80211_prep_channel()
4943 if (!ieee80211_verify_peer_he_mcs_support(sdata, ies, he_oper) || in ieee80211_prep_channel()
4944 !ieee80211_verify_sta_he_mcs_support(sdata, sband, he_oper)) in ieee80211_prep_channel()
4972 if (!ieee80211_verify_sta_eht_mcs_support(sdata, sband, eht_oper)) in ieee80211_prep_channel()
4984 sdata->vif.cfg.eml_cap = in ieee80211_prep_channel()
4986 sdata->vif.cfg.eml_med_sync_delay = in ieee80211_prep_channel()
5003 sdata_info(sdata, "80 MHz not supported, disabling VHT\n"); in ieee80211_prep_channel()
5010 sdata_info(sdata, in ieee80211_prep_channel()
5015 ieee80211_determine_chantype(sdata, link, *conn_flags, in ieee80211_prep_channel()
5035 sdata_info(sdata, "Rejecting non-HE 6/7 GHz connection"); in ieee80211_prep_channel()
5104 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
5109 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
5111 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
5118 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
5123 sta = sta_info_get(sdata, assoc_data->ap_addr); in ieee80211_assoc_success()
5127 if (ieee80211_vif_is_mld(&sdata->vif)) { in ieee80211_assoc_success()
5143 ieee80211_vif_set_links(sdata, valid_links, dormant_links); in ieee80211_assoc_success()
5154 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_assoc_success()
5158 if (ieee80211_vif_is_mld(&sdata->vif)) in ieee80211_assoc_success()
5190 err = ieee80211_prep_channel(sdata, link, cbss, in ieee80211_assoc_success()
5223 ieee80211_vif_set_links(sdata, valid_links, dormant_links); in ieee80211_assoc_success()
5244 sdata_info(sdata, in ieee80211_assoc_success()
5251 if (sdata->wdev.use_4addr) in ieee80211_assoc_success()
5252 drv_sta_set_4addr(local, sdata, &sta->sta, true); in ieee80211_assoc_success()
5254 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
5256 ieee80211_set_associated(sdata, assoc_data, changed); in ieee80211_assoc_success()
5263 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
5269 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
5270 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_assoc_success()
5274 eth_zero_addr(sdata->vif.cfg.ap_addr); in ieee80211_assoc_success()
5275 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
5279 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
5283 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
5307 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_assoc_resp()
5342 fils_decrypt_assoc_resp(sdata, (u8 *)mgmt, &len, assoc_data) < 0) in ieee80211_rx_mgmt_assoc_resp()
5365 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5377 cfg80211_assoc_comeback(sdata->dev, assoc_data->ap_addr, in ieee80211_rx_mgmt_assoc_resp()
5382 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5388 run_again(sdata, assoc_data->timeout); in ieee80211_rx_mgmt_assoc_resp()
5393 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
5397 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
5400 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5407 if (ieee80211_vif_is_mld(&sdata->vif)) { in ieee80211_rx_mgmt_assoc_resp()
5409 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5418 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5429 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5438 sdata->vif.cfg.aid = aid; in ieee80211_rx_mgmt_assoc_resp()
5440 if (!ieee80211_assoc_success(sdata, mgmt, elems, in ieee80211_rx_mgmt_assoc_resp()
5443 ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT); in ieee80211_rx_mgmt_assoc_resp()
5447 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
5448 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
5464 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_rx_mgmt_assoc_resp()
5475 if (ieee80211_vif_is_mld(&sdata->vif)) { in ieee80211_rx_mgmt_assoc_resp()
5476 ether_addr_copy(ap_mld_addr, sdata->vif.cfg.ap_addr); in ieee80211_rx_mgmt_assoc_resp()
5480 ieee80211_destroy_assoc_data(sdata, in ieee80211_rx_mgmt_assoc_resp()
5489 cfg80211_rx_assoc_resp(sdata->dev, &resp); in ieee80211_rx_mgmt_assoc_resp()
5491 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_rx_mgmt_assoc_resp()
5495 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON); in ieee80211_rx_mgmt_assoc_resp()
5503 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_rx_bss_info() local
5504 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
5508 sdata_assert_lock(sdata); in ieee80211_rx_bss_info()
5526 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_rx_mgmt_probe_resp() local
5533 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
5535 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_probe_resp()
5544 channel = ieee80211_get_channel(sdata->local->hw.wiphy, in ieee80211_rx_mgmt_probe_resp()
5549 if (!ether_addr_equal(mgmt->da, sdata->vif.addr) && in ieee80211_rx_mgmt_probe_resp()
5562 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
5595 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_handle_beacon_sig() local
5628 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
5634 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
5640 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_handle_beacon_sig()
5650 &sdata->vif, in ieee80211_handle_beacon_sig()
5657 &sdata->vif, in ieee80211_handle_beacon_sig()
5674 &sdata->vif, in ieee80211_handle_beacon_sig()
5681 &sdata->vif, in ieee80211_handle_beacon_sig()
5740 struct ieee80211_sub_if_data *sdata = in ieee80211_ml_reconf_work() local
5746 sdata_lock(sdata); in ieee80211_ml_reconf_work()
5747 if (!sdata->u.mgd.removed_links) { in ieee80211_ml_reconf_work()
5748 sdata_unlock(sdata); in ieee80211_ml_reconf_work()
5752 sdata_info(sdata, in ieee80211_ml_reconf_work()
5754 sdata->vif.valid_links, sdata->u.mgd.removed_links); in ieee80211_ml_reconf_work()
5756 new_valid_links = sdata->vif.valid_links & ~sdata->u.mgd.removed_links; in ieee80211_ml_reconf_work()
5757 if (new_valid_links == sdata->vif.valid_links) { in ieee80211_ml_reconf_work()
5758 sdata_unlock(sdata); in ieee80211_ml_reconf_work()
5763 !(new_valid_links & ~sdata->vif.dormant_links)) { in ieee80211_ml_reconf_work()
5764 sdata_info(sdata, "No valid links after reconfiguration\n"); in ieee80211_ml_reconf_work()
5769 new_active_links = sdata->vif.active_links & ~sdata->u.mgd.removed_links; in ieee80211_ml_reconf_work()
5770 if (new_active_links != sdata->vif.active_links) { in ieee80211_ml_reconf_work()
5774 ~sdata->vif.dormant_links) - 1); in ieee80211_ml_reconf_work()
5776 ret = __ieee80211_set_active_links(&sdata->vif, in ieee80211_ml_reconf_work()
5779 sdata_info(sdata, in ieee80211_ml_reconf_work()
5785 new_dormant_links = sdata->vif.dormant_links & ~sdata->u.mgd.removed_links; in ieee80211_ml_reconf_work()
5787 ret = ieee80211_vif_set_links(sdata, new_valid_links, in ieee80211_ml_reconf_work()
5790 sdata_info(sdata, "Failed setting valid links\n"); in ieee80211_ml_reconf_work()
5794 cfg80211_links_removed(sdata->dev, sdata->u.mgd.removed_links); in ieee80211_ml_reconf_work()
5796 ___ieee80211_disconnect(sdata); in ieee80211_ml_reconf_work()
5798 sdata->u.mgd.removed_links = 0; in ieee80211_ml_reconf_work()
5800 sdata_unlock(sdata); in ieee80211_ml_reconf_work()
5803 static void ieee80211_ml_reconfiguration(struct ieee80211_sub_if_data *sdata, in ieee80211_ml_reconfiguration() argument
5814 if (!ieee80211_vif_is_mld(&sdata->vif) || !elems->ml_reconf) in ieee80211_ml_reconfiguration()
5865 removed_links &= sdata->vif.valid_links; in ieee80211_ml_reconfiguration()
5868 if (sdata->u.mgd.removed_links) { in ieee80211_ml_reconfiguration()
5869 sdata->u.mgd.removed_links = 0; in ieee80211_ml_reconfiguration()
5870 wiphy_delayed_work_cancel(sdata->local->hw.wiphy, in ieee80211_ml_reconfiguration()
5871 &sdata->u.mgd.ml_reconf_work); in ieee80211_ml_reconfiguration()
5879 sdata_dereference(sdata->vif.link_conf[link_id], sdata); in ieee80211_ml_reconfiguration()
5899 sdata->u.mgd.removed_links = removed_links; in ieee80211_ml_reconfiguration()
5900 wiphy_delayed_work_queue(sdata->local->hw.wiphy, in ieee80211_ml_reconfiguration()
5901 &sdata->u.mgd.ml_reconf_work, in ieee80211_ml_reconfiguration()
5909 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_rx_mgmt_beacon() local
5910 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
5911 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
5912 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg; in ieee80211_rx_mgmt_beacon()
5916 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
5933 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_beacon()
5936 bssid = ieee80211_get_bssid(hdr, len, sdata->vif.type); in ieee80211_rx_mgmt_beacon()
5969 !WARN_ON(ieee80211_vif_is_mld(&sdata->vif)) && in ieee80211_rx_mgmt_beacon()
6006 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_rx_mgmt_beacon()
6021 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
6023 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_beacon()
6030 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
6055 ieee80211_send_nullfunc(local, sdata, false); in ieee80211_rx_mgmt_beacon()
6056 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
6067 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
6071 if (sdata->vif.p2p || in ieee80211_rx_mgmt_beacon()
6072 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_rx_mgmt_beacon()
6154 ieee80211_recalc_ps_vif(sdata); in ieee80211_rx_mgmt_beacon()
6170 sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr); in ieee80211_rx_mgmt_beacon()
6187 changed |= ieee80211_recalc_twt_req(sdata, sband, link, link_sta, elems); in ieee80211_rx_mgmt_beacon()
6195 sdata_info(sdata, in ieee80211_rx_mgmt_beacon()
6198 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
6201 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
6209 ieee80211_vht_handle_opmode(sdata, link_sta, in ieee80211_rx_mgmt_beacon()
6224 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
6227 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
6235 ieee80211_ml_reconfiguration(sdata, elems); in ieee80211_rx_mgmt_beacon()
6237 ieee80211_link_info_change_notify(sdata, link, changed); in ieee80211_rx_mgmt_beacon()
6242 void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_ext() argument
6245 struct ieee80211_link_data *link = &sdata->deflink; in ieee80211_sta_rx_queued_ext()
6254 sdata_lock(sdata); in ieee80211_sta_rx_queued_ext()
6260 sdata_unlock(sdata); in ieee80211_sta_rx_queued_ext()
6263 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
6266 struct ieee80211_link_data *link = &sdata->deflink; in ieee80211_sta_rx_queued_mgmt()
6276 sdata_lock(sdata); in ieee80211_sta_rx_queued_mgmt()
6279 link = sdata_dereference(sdata->link[rx_status->link_id], in ieee80211_sta_rx_queued_mgmt()
6280 sdata); in ieee80211_sta_rx_queued_mgmt()
6294 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
6297 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
6300 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
6304 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
6307 if (!sdata->u.mgd.associated || in ieee80211_sta_rx_queued_mgmt()
6308 !ether_addr_equal(mgmt->bssid, sdata->vif.cfg.ap_addr)) in ieee80211_sta_rx_queued_mgmt()
6366 sdata_unlock(sdata); in ieee80211_sta_rx_queued_mgmt()
6371 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
6372 from_timer(sdata, t, u.mgd.timer); in ieee80211_sta_timer()
6374 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work); in ieee80211_sta_timer()
6377 void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
6382 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
6385 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_sta_connection_lost()
6389 static int ieee80211_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_auth() argument
6391 struct ieee80211_local *local = sdata->local; in ieee80211_auth()
6392 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_auth()
6401 sdata_assert_lock(sdata); in ieee80211_auth()
6409 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_auth()
6424 drv_mgd_prepare_tx(local, sdata, &info); in ieee80211_auth()
6426 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_auth()
6442 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_auth()
6459 run_again(sdata, auth_data->timeout); in ieee80211_auth()
6464 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
6466 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
6467 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
6470 sdata_assert_lock(sdata); in ieee80211_do_assoc()
6474 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
6487 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
6490 ret = ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
6497 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
6503 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
6509 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
6512 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
6514 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
6515 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
6516 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
6518 wiphy_work_queue(local->hw.wiphy, &sdata->work); in ieee80211_mgd_conn_tx_status()
6521 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
6523 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
6524 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
6526 sdata_lock(sdata); in ieee80211_sta_work()
6544 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
6555 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
6570 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
6571 } else if (ieee80211_auth(sdata)) { in ieee80211_sta_work()
6581 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
6583 cfg80211_auth_timeout(sdata->dev, ap_addr); in ieee80211_sta_work()
6584 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
6587 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
6592 !sdata->deflink.u.mgd.have_beacon) || in ieee80211_sta_work()
6593 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
6600 ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT); in ieee80211_sta_work()
6601 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
6604 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
6608 u8 *bssid = sdata->deflink.u.mgd.bssid; in ieee80211_sta_work()
6618 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
6621 mlme_dbg(sdata, in ieee80211_sta_work()
6625 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
6627 mlme_dbg(sdata, in ieee80211_sta_work()
6630 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_work()
6635 run_again(sdata, ifmgd->probe_timeout); in ieee80211_sta_work()
6637 mlme_dbg(sdata, in ieee80211_sta_work()
6640 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_work()
6643 mlme_dbg(sdata, in ieee80211_sta_work()
6647 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
6653 mlme_dbg(sdata, in ieee80211_sta_work()
6657 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_work()
6662 sdata_unlock(sdata); in ieee80211_sta_work()
6667 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
6668 from_timer(sdata, t, u.mgd.bcn_mon_timer); in ieee80211_sta_bcn_mon_timer()
6670 if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif))) in ieee80211_sta_bcn_mon_timer()
6673 if (sdata->vif.bss_conf.csa_active && in ieee80211_sta_bcn_mon_timer()
6674 !sdata->deflink.u.mgd.csa_waiting_bcn) in ieee80211_sta_bcn_mon_timer()
6677 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_bcn_mon_timer()
6680 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
6681 wiphy_work_queue(sdata->local->hw.wiphy, in ieee80211_sta_bcn_mon_timer()
6682 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
6687 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
6688 from_timer(sdata, t, u.mgd.conn_mon_timer); in ieee80211_sta_conn_mon_timer()
6689 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
6690 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
6694 if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif))) in ieee80211_sta_conn_mon_timer()
6697 if (sdata->vif.bss_conf.csa_active && in ieee80211_sta_conn_mon_timer()
6698 !sdata->deflink.u.mgd.csa_waiting_bcn) in ieee80211_sta_conn_mon_timer()
6701 sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr); in ieee80211_sta_conn_mon_timer()
6723 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
6727 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
6730 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
6732 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
6733 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
6736 if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_restart_sta_timer()
6737 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
6738 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
6743 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_quiesce() argument
6745 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_quiesce()
6748 sdata_lock(sdata); in ieee80211_mgd_quiesce()
6760 ieee80211_send_deauth_disassoc(sdata, ap_addr, ap_addr, in ieee80211_mgd_quiesce()
6765 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON); in ieee80211_mgd_quiesce()
6767 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_quiesce()
6768 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, in ieee80211_mgd_quiesce()
6790 if (ifmgd->associated && !sdata->local->wowlan) { in ieee80211_mgd_quiesce()
6797 memcpy(bssid, sdata->vif.cfg.ap_addr, ETH_ALEN); in ieee80211_mgd_quiesce()
6798 ieee80211_mgd_deauth(sdata, &req); in ieee80211_mgd_quiesce()
6801 sdata_unlock(sdata); in ieee80211_mgd_quiesce()
6805 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
6807 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
6809 sdata_lock(sdata); in ieee80211_sta_restart()
6811 sdata_unlock(sdata); in ieee80211_sta_restart()
6815 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
6816 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
6817 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
6818 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
6821 sdata_unlock(sdata); in ieee80211_sta_restart()
6825 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_HW_RESTART) { in ieee80211_sta_restart()
6826 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_HW_RESTART; in ieee80211_sta_restart()
6827 mlme_dbg(sdata, "driver requested disconnect after hardware restart\n"); in ieee80211_sta_restart()
6828 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
6831 sdata_unlock(sdata); in ieee80211_sta_restart()
6835 sdata_unlock(sdata); in ieee80211_sta_restart()
6845 sdata_lock(link->sdata); in ieee80211_request_smps_mgd_work()
6846 __ieee80211_request_smps_mgd(link->sdata, link, in ieee80211_request_smps_mgd_work()
6848 sdata_unlock(link->sdata); in ieee80211_request_smps_mgd_work()
6852 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
6854 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
6872 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
6873 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
6874 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
6883 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_mgd_setup_link() local
6884 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_setup_link()
6901 if (sdata->u.mgd.assoc_data) in ieee80211_mgd_setup_link()
6903 sdata->u.mgd.assoc_data->link[link_id].addr); in ieee80211_mgd_setup_link()
6911 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
6915 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
6916 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
6917 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
6922 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
6927 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
6928 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
6940 err = ieee80211_vif_set_links(sdata, BIT(link_id), 0); in ieee80211_prep_connection()
6945 err = ieee80211_vif_set_links(sdata, 0, 0); in ieee80211_prep_connection()
6953 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_prep_connection()
6972 have_sta = sta_info_get(sdata, ap_mld_addr); in ieee80211_prep_connection()
6978 new_sta = sta_info_alloc_with_link(sdata, ap_mld_addr, in ieee80211_prep_connection()
6982 new_sta = sta_info_alloc(sdata, ap_mld_addr, GFP_KERNEL); in ieee80211_prep_connection()
7039 } else if (!ieee80211_hw_check(&sdata->local->hw, in ieee80211_prep_connection()
7056 err = ieee80211_prep_channel(sdata, link, cbss, in ieee80211_prep_connection()
7070 ieee80211_link_info_change_notify(sdata, link, in ieee80211_prep_connection()
7081 sdata_info(sdata, in ieee80211_prep_connection()
7098 ieee80211_vif_set_links(sdata, 0, 0); in ieee80211_prep_connection()
7103 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
7106 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
7107 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
7201 ieee80211_destroy_auth_data(sdata, cont_auth); in ieee80211_mgd_auth()
7214 ieee80211_mark_sta_auth(sdata); in ieee80211_mgd_auth()
7219 sdata_info(sdata, in ieee80211_mgd_auth()
7221 sdata->vif.cfg.ap_addr, auth_data->ap_addr); in ieee80211_mgd_auth()
7222 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
7226 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_auth()
7232 sdata_info(sdata, "authenticate with %pM\n", auth_data->ap_addr); in ieee80211_mgd_auth()
7235 memcpy(sdata->vif.cfg.ap_addr, auth_data->ap_addr, ETH_ALEN); in ieee80211_mgd_auth()
7237 err = ieee80211_prep_connection(sdata, req->bss, req->link_id, in ieee80211_mgd_auth()
7242 err = ieee80211_auth(sdata); in ieee80211_mgd_auth()
7244 sta_info_destroy_addr(sdata, auth_data->ap_addr); in ieee80211_mgd_auth()
7253 if (!ieee80211_vif_is_mld(&sdata->vif)) { in ieee80211_mgd_auth()
7254 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_mgd_auth()
7255 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_mgd_auth()
7257 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_auth()
7258 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_mgd_auth()
7259 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_auth()
7267 ieee80211_setup_assoc_link(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_assoc_link() argument
7273 struct ieee80211_local *local = sdata->local; in ieee80211_setup_assoc_link()
7292 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_setup_assoc_link()
7343 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_setup_assoc_link()
7358 sdata->deflink.u.mgd.have_beacon = true; in ieee80211_setup_assoc_link()
7419 sdata_info(sdata, "associating to AP %pM with corrupt %s\n", in ieee80211_setup_assoc_link()
7424 if (sdata->u.mgd.powersave) in ieee80211_setup_assoc_link()
7435 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
7439 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
7440 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
7443 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg; in ieee80211_mgd_assoc()
7456 if (sdata->u.mgd.use_4addr && req->link_id >= 0) in ieee80211_mgd_assoc()
7482 link = sdata_dereference(sdata->link[i], sdata); in ieee80211_mgd_assoc()
7490 memcpy(assoc_data->link[0].addr, sdata->vif.addr, ETH_ALEN); in ieee80211_mgd_assoc()
7502 sdata_info(sdata, in ieee80211_mgd_assoc()
7504 sdata->vif.cfg.ap_addr, assoc_data->ap_addr); in ieee80211_mgd_assoc()
7505 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
7509 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_assoc()
7532 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
7556 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
7567 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
7572 mlme_dbg(sdata, "HT disabled by flag, disabling HT/VHT/HE\n"); in ieee80211_mgd_assoc()
7580 mlme_dbg(sdata, "VHT disabled by flag, disabling VHT\n"); in ieee80211_mgd_assoc()
7585 mlme_dbg(sdata, "HE disabled by flag, disabling HE/EHT\n"); in ieee80211_mgd_assoc()
7642 err = ieee80211_vif_set_links(sdata, BIT(assoc_link_id), 0); in ieee80211_mgd_assoc()
7650 link = sdata_dereference(sdata->link[assoc_link_id], sdata); in ieee80211_mgd_assoc()
7658 conn_flags |= ieee80211_setup_assoc_link(sdata, assoc_data, req, in ieee80211_mgd_assoc()
7663 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
7666 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in ieee80211_mgd_assoc()
7669 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) { in ieee80211_mgd_assoc()
7698 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
7699 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
7700 sdata->control_port_over_nl80211 = in ieee80211_mgd_assoc()
7702 sdata->control_port_no_preauth = req->crypto.control_port_no_preauth; in ieee80211_mgd_assoc()
7713 err = ieee80211_prep_channel(sdata, NULL, assoc_data->link[i].bss, in ieee80211_mgd_assoc()
7720 memcpy(sdata->vif.cfg.ap_addr, assoc_data->ap_addr, ETH_ALEN); in ieee80211_mgd_assoc()
7722 err = ieee80211_prep_connection(sdata, cbss, req->link_id, in ieee80211_mgd_assoc()
7730 if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC)) { in ieee80211_mgd_assoc()
7740 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
7749 run_again(sdata, assoc_data->timeout); in ieee80211_mgd_assoc()
7753 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_mgd_assoc()
7754 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_mgd_assoc()
7762 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
7765 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
7774 sdata_info(sdata, in ieee80211_mgd_deauth()
7779 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
7780 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
7784 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
7785 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
7788 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
7794 sdata_info(sdata, in ieee80211_mgd_deauth()
7799 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
7800 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
7804 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON); in ieee80211_mgd_deauth()
7805 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
7808 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
7813 ether_addr_equal(sdata->vif.cfg.ap_addr, req->bssid)) { in ieee80211_mgd_deauth()
7814 sdata_info(sdata, in ieee80211_mgd_deauth()
7819 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
7821 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
7824 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
7831 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
7836 if (!sdata->u.mgd.associated || in ieee80211_mgd_disassoc()
7837 memcmp(sdata->vif.cfg.ap_addr, req->ap_addr, ETH_ALEN)) in ieee80211_mgd_disassoc()
7840 sdata_info(sdata, in ieee80211_mgd_disassoc()
7845 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
7849 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_mgd_disassoc()
7857 wiphy_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_mgd_stop_link()
7859 wiphy_delayed_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_mgd_stop_link()
7863 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
7865 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
7873 wiphy_work_cancel(sdata->local->hw.wiphy, in ieee80211_mgd_stop()
7875 wiphy_work_cancel(sdata->local->hw.wiphy, in ieee80211_mgd_stop()
7878 wiphy_delayed_work_cancel(sdata->local->hw.wiphy, in ieee80211_mgd_stop()
7881 sdata_lock(sdata); in ieee80211_mgd_stop()
7883 ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT); in ieee80211_mgd_stop()
7885 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
7897 sdata_unlock(sdata); in ieee80211_mgd_stop()
7905 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
7907 trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level); in ieee80211_cqm_rssi_notify()
7909 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp); in ieee80211_cqm_rssi_notify()
7915 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_beacon_loss_notify() local
7917 trace_api_cqm_beacon_loss_notify(sdata->local, sdata); in ieee80211_cqm_beacon_loss_notify()
7919 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp); in ieee80211_cqm_beacon_loss_notify()
7923 static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata, in _ieee80211_enable_rssi_reports() argument
7927 trace_api_enable_rssi_reports(sdata, rssi_min_thold, rssi_max_thold); in _ieee80211_enable_rssi_reports()
7929 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in _ieee80211_enable_rssi_reports()
7937 sdata->u.mgd.rssi_min_thold = rssi_min_thold*16; in _ieee80211_enable_rssi_reports()
7938 sdata->u.mgd.rssi_max_thold = rssi_max_thold*16; in _ieee80211_enable_rssi_reports()
7945 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_enable_rssi_reports() local
7950 _ieee80211_enable_rssi_reports(sdata, rssi_min_thold, in ieee80211_enable_rssi_reports()
7957 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_disable_rssi_reports() local
7959 _ieee80211_enable_rssi_reports(sdata, 0, 0); in ieee80211_disable_rssi_reports()