Lines Matching refs:sdata
101 static void run_again(struct ieee80211_sub_if_data *sdata, in run_again() argument
104 sdata_assert_lock(sdata); in run_again()
106 if (!timer_pending(&sdata->u.mgd.timer) || in run_again()
107 time_before(timeout, sdata->u.mgd.timer.expires)) in run_again()
108 mod_timer(&sdata->u.mgd.timer, timeout); in run_again()
111 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_beacon_monitor() argument
113 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_reset_beacon_monitor()
116 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_beacon_monitor()
119 mod_timer(&sdata->u.mgd.bcn_mon_timer, in ieee80211_sta_reset_beacon_monitor()
120 round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout)); in ieee80211_sta_reset_beacon_monitor()
123 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_conn_monitor() argument
125 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_reset_conn_monitor()
133 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_conn_monitor()
146 ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, in ieee80211_determine_chantype() argument
171 if (!ieee80211_chandef_he_6ghz_oper(sdata, he_oper, eht_oper, in ieee80211_determine_chantype()
173 mlme_dbg(sdata, in ieee80211_determine_chantype()
186 sdata_info(sdata, in ieee80211_determine_chantype()
199 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_determine_chantype()
202 mlme_dbg(sdata, "HT operation missing / HT not supported\n"); in ieee80211_determine_chantype()
223 sdata_info(sdata, in ieee80211_determine_chantype()
238 mlme_dbg(sdata, "40 MHz not supported\n"); in ieee80211_determine_chantype()
247 mlme_dbg(sdata, "VHT operation missing / VHT not supported\n"); in ieee80211_determine_chantype()
266 if (!ieee80211_chandef_vht_oper(&sdata->local->hw, vht_cap_info, in ieee80211_determine_chantype()
270 sdata_info(sdata, in ieee80211_determine_chantype()
275 } else if (!ieee80211_chandef_vht_oper(&sdata->local->hw, in ieee80211_determine_chantype()
280 sdata_info(sdata, in ieee80211_determine_chantype()
288 sdata_info(sdata, in ieee80211_determine_chantype()
301 sdata_info(sdata, in ieee80211_determine_chantype()
324 sdata_info(sdata, in ieee80211_determine_chantype()
332 sdata_info(sdata, in ieee80211_determine_chantype()
378 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, in ieee80211_determine_chantype()
392 if (!he_oper || !cfg80211_chandef_usable(sdata->wdev.wiphy, chandef, in ieee80211_determine_chantype()
396 if (!eht_oper || !cfg80211_chandef_usable(sdata->wdev.wiphy, chandef, in ieee80211_determine_chantype()
401 sdata_info(sdata, in ieee80211_determine_chantype()
418 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_config_bw() local
419 struct ieee80211_local *local = sdata->local; in ieee80211_config_bw()
420 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_config_bw()
441 ieee80211_vif_type_p2p(&sdata->vif))) { in ieee80211_config_bw()
449 ieee80211_vif_type_p2p(&sdata->vif))) in ieee80211_config_bw()
466 flags = ieee80211_determine_chantype(sdata, link, in ieee80211_config_bw()
510 sdata_info(sdata, in ieee80211_config_bw()
519 sdata_info(sdata, in ieee80211_config_bw()
530 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
545 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
605 static bool ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
611 struct ieee80211_local *local = sdata->local; in ieee80211_add_vht_ie()
621 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
695 static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_he_ie() argument
706 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_add_he_ie()
723 ieee80211_ie_build_he_6ghz_cap(sdata, smps_mode, skb); in ieee80211_add_he_ie()
726 static void ieee80211_add_eht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_eht_ie() argument
736 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_add_eht_ie()
738 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_add_eht_ie()
945 static void ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata,
950 static size_t ieee80211_assoc_link_elems(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_link_elems() argument
959 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_assoc_link_elems()
960 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_link_elems()
965 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_link_elems()
985 else if (sdata->u.mgd.powersave) in ieee80211_assoc_link_elems()
1063 ieee80211_add_ht_ie(sdata, skb, in ieee80211_assoc_link_elems()
1078 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_assoc_link_elems()
1104 ieee80211_add_he_ie(sdata, skb, sband, smps_mode, in ieee80211_assoc_link_elems()
1118 ieee80211_assoc_add_ml_elem(sdata, skb, orig_capab, ext_capa, in ieee80211_assoc_link_elems()
1125 ieee80211_add_eht_ie(sdata, skb, sband); in ieee80211_assoc_link_elems()
1128 ieee80211_add_aid_request_ie(sdata, skb); in ieee80211_assoc_link_elems()
1129 ieee80211_add_s1g_capab_ie(sdata, &sband->s1g_cap, skb); in ieee80211_assoc_link_elems()
1194 static void ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_add_ml_elem() argument
1199 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_add_ml_elem()
1200 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_add_ml_elem()
1210 if (!sdata->vif.valid_links) in ieee80211_assoc_add_ml_elem()
1214 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_assoc_add_ml_elem()
1230 memcpy(common->mld_mac_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assoc_add_ml_elem()
1280 extra_used = ieee80211_assoc_link_elems(sdata, skb, &capab, in ieee80211_assoc_add_ml_elem()
1301 static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
1303 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
1304 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
1314 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_send_assoc()
1328 sdata_assert_lock(sdata); in ieee80211_send_assoc()
1384 if (sdata->vif.valid_links) { in ieee80211_send_assoc()
1403 link = sdata_dereference(sdata->link[assoc_data->assoc_link_id], sdata); in ieee80211_send_assoc()
1426 memcpy(mgmt->da, sdata->vif.cfg.ap_addr, ETH_ALEN); in ieee80211_send_assoc()
1427 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
1428 memcpy(mgmt->bssid, sdata->vif.cfg.ap_addr, ETH_ALEN); in ieee80211_send_assoc()
1460 offset = ieee80211_assoc_link_elems(sdata, skb, &link_capab, in ieee80211_send_assoc()
1513 drv_mgd_prepare_tx(local, sdata, &info); in ieee80211_send_assoc()
1519 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
1525 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
1530 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
1538 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
1542 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
1547 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
1549 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif, -1, in ieee80211_send_nullfunc()
1568 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
1572 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
1578 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
1591 memcpy(nullfunc->addr1, sdata->deflink.u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1592 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1593 memcpy(nullfunc->addr3, sdata->deflink.u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1594 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1598 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
1606 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_chswitch_work() local
1607 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
1608 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
1611 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
1614 sdata_lock(sdata); in ieee80211_chswitch_work()
1642 sdata_info(sdata, in ieee80211_chswitch_work()
1645 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1655 sdata_info(sdata, in ieee80211_chswitch_work()
1657 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1664 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_chswitch_work()
1665 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_chswitch_work()
1670 sdata_unlock(sdata); in ieee80211_chswitch_work()
1675 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_chswitch_post_beacon() local
1676 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_post_beacon()
1677 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_post_beacon()
1680 sdata_assert_lock(sdata); in ieee80211_chswitch_post_beacon()
1685 ieee80211_wake_vif_queues(local, sdata, in ieee80211_chswitch_post_beacon()
1698 ret = drv_post_channel_switch(sdata); in ieee80211_chswitch_post_beacon()
1700 sdata_info(sdata, in ieee80211_chswitch_post_beacon()
1707 cfg80211_ch_switch_notify(sdata->dev, &link->reserved_chandef, 0); in ieee80211_chswitch_post_beacon()
1712 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
1713 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
1715 if (WARN_ON(sdata->vif.valid_links)) in ieee80211_chswitch_done()
1718 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
1720 sdata_info(sdata, in ieee80211_chswitch_done()
1722 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1725 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1726 &sdata->deflink.u.mgd.chswitch_work); in ieee80211_chswitch_done()
1736 ieee80211_queue_work(&link->sdata->local->hw, in ieee80211_chswitch_timer()
1743 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_sta_abort_chanswitch() local
1744 struct ieee80211_local *local = sdata->local; in ieee80211_sta_abort_chanswitch()
1756 ieee80211_wake_vif_queues(local, sdata, in ieee80211_sta_abort_chanswitch()
1764 drv_abort_channel_switch(sdata); in ieee80211_sta_abort_chanswitch()
1773 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_sta_process_chanswitch() local
1774 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1775 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1785 sdata_assert_lock(sdata); in ieee80211_sta_process_chanswitch()
1795 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band, in ieee80211_sta_process_chanswitch()
1817 drv_channel_switch_rx_beacon(sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1826 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1837 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1855 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1868 ieee80211_teardown_tdls_peers(sdata); in ieee80211_sta_process_chanswitch()
1875 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1884 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1889 if (drv_pre_channel_switch(sdata, &ch_switch)) { in ieee80211_sta_process_chanswitch()
1890 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1898 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1912 ieee80211_stop_vif_queues(local, sdata, in ieee80211_sta_process_chanswitch()
1916 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, 0, in ieee80211_sta_process_chanswitch()
1921 drv_channel_switch(local, sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1953 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_find_80211h_pwr_constr() argument
2024 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata, in ieee80211_find_cisco_dtpc() argument
2045 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_handle_pwr_constr() local
2059 sdata, channel, country_ie, country_ie_len, in ieee80211_handle_pwr_constr()
2067 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco); in ieee80211_handle_pwr_constr()
2084 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
2094 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
2100 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
2107 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
2124 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_enable_ps()
2149 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
2151 struct ieee80211_local *local = sdata->local; in ieee80211_powersave_allowed()
2152 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
2169 !sdata->deflink.u.mgd.have_beacon) in ieee80211_powersave_allowed()
2173 sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr); in ieee80211_powersave_allowed()
2184 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
2194 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
2195 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
2197 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
2205 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
2207 found = sdata; in ieee80211_recalc_ps()
2232 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
2234 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
2236 if (sdata->vif.cfg.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
2237 sdata->vif.cfg.ps = ps_allowed; in ieee80211_recalc_ps_vif()
2238 ieee80211_vif_cfg_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
2264 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
2270 if (!sdata) in ieee80211_dynamic_ps_enable_work()
2273 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
2313 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_dynamic_ps_enable_work()
2315 ieee80211_flush_queues(local, sdata, false); in ieee80211_dynamic_ps_enable_work()
2342 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_dfs_cac_timer_work() local
2344 mutex_lock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
2345 if (sdata->wdev.cac_started) { in ieee80211_dfs_cac_timer_work()
2347 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_dfs_cac_timer_work()
2351 mutex_unlock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
2355 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in __ieee80211_sta_handle_tspec_ac_params() argument
2357 struct ieee80211_local *local = sdata->local; in __ieee80211_sta_handle_tspec_ac_params()
2358 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_sta_handle_tspec_ac_params()
2384 if (drv_conf_tx(local, &sdata->deflink, ac, in __ieee80211_sta_handle_tspec_ac_params()
2385 &sdata->deflink.tx_conf[ac])) in __ieee80211_sta_handle_tspec_ac_params()
2386 link_err(&sdata->deflink, in __ieee80211_sta_handle_tspec_ac_params()
2403 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac))) in __ieee80211_sta_handle_tspec_ac_params()
2414 if (drv_conf_tx(local, &sdata->deflink, ac, in __ieee80211_sta_handle_tspec_ac_params()
2415 &sdata->deflink.tx_conf[non_acm_ac])) in __ieee80211_sta_handle_tspec_ac_params()
2416 link_err(&sdata->deflink, in __ieee80211_sta_handle_tspec_ac_params()
2433 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_handle_tspec_ac_params() argument
2435 if (__ieee80211_sta_handle_tspec_ac_params(sdata)) in ieee80211_sta_handle_tspec_ac_params()
2436 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_sta_handle_tspec_ac_params()
2442 struct ieee80211_sub_if_data *sdata; in ieee80211_sta_handle_tspec_ac_params_wk() local
2444 sdata = container_of(work, struct ieee80211_sub_if_data, in ieee80211_sta_handle_tspec_ac_params_wk()
2446 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_sta_handle_tspec_ac_params_wk()
2451 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_mgd_set_link_qos_params() local
2452 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_set_link_qos_params()
2453 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_set_link_qos_params()
2458 mlme_dbg(sdata, in ieee80211_mgd_set_link_qos_params()
2479 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_sta_wmm_params() local
2481 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
2519 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
2529 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
2539 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
2549 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
2560 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
2572 sdata_info(sdata, in ieee80211_sta_wmm_params()
2585 sdata_info(sdata, in ieee80211_sta_wmm_params()
2590 ieee80211_regulatory_limit_wmm_params(sdata, ¶ms[ac], ac); in ieee80211_sta_wmm_params()
2596 sdata_info(sdata, in ieee80211_sta_wmm_params()
2613 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
2615 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
2617 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL; in __ieee80211_stop_poll()
2618 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
2621 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
2623 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
2624 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
2625 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
2676 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_link_set_associated() local
2682 sdata->u.mgd.beacon_timeout = in ieee80211_link_set_associated()
2696 if (sdata->vif.p2p || in ieee80211_link_set_associated()
2697 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_link_set_associated()
2735 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_link_set_associated()
2742 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
2746 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
2747 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg; in ieee80211_set_associated()
2751 sdata->u.mgd.associated = true; in ieee80211_set_associated()
2760 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_set_associated()
2768 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
2778 if (sdata->vif.valid_links) { in ieee80211_set_associated()
2788 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_set_associated()
2792 ieee80211_link_info_change_notify(sdata, link, in ieee80211_set_associated()
2795 ieee80211_recalc_smps(sdata, link); in ieee80211_set_associated()
2798 ieee80211_vif_cfg_change_notify(sdata, vif_changed); in ieee80211_set_associated()
2800 ieee80211_bss_info_change_notify(sdata, in ieee80211_set_associated()
2809 if (!sdata->vif.valid_links) in ieee80211_set_associated()
2810 ieee80211_recalc_smps(sdata, &sdata->deflink); in ieee80211_set_associated()
2811 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
2813 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
2816 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
2820 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
2821 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
2828 sdata_assert_lock(sdata); in ieee80211_set_disassoc()
2836 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
2841 sdata->deflink.u.mgd.bss = NULL; in ieee80211_set_disassoc()
2843 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
2857 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
2869 ieee80211_flush_queues(local, sdata, true); in ieee80211_set_disassoc()
2880 !sdata->deflink.u.mgd.have_beacon) { in ieee80211_set_disassoc()
2881 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_set_disassoc()
2884 ieee80211_send_deauth_disassoc(sdata, sdata->vif.cfg.ap_addr, in ieee80211_set_disassoc()
2885 sdata->vif.cfg.ap_addr, stype, in ieee80211_set_disassoc()
2891 ieee80211_flush_queues(local, sdata, false); in ieee80211_set_disassoc()
2893 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_set_disassoc()
2896 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_set_disassoc()
2897 eth_zero_addr(sdata->vif.cfg.ap_addr); in ieee80211_set_disassoc()
2899 sdata->vif.cfg.ssid_len = 0; in ieee80211_set_disassoc()
2902 sta_info_flush(sdata); in ieee80211_set_disassoc()
2905 if (!sdata->vif.valid_links) in ieee80211_set_disassoc()
2906 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
2910 sdata->vif.cfg.assoc = false; in ieee80211_set_disassoc()
2912 sdata->deflink.u.mgd.p2p_noa_index = -1; in ieee80211_set_disassoc()
2913 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
2914 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
2926 memset(sdata->vif.bss_conf.mu_group.membership, 0, in ieee80211_set_disassoc()
2927 sizeof(sdata->vif.bss_conf.mu_group.membership)); in ieee80211_set_disassoc()
2928 memset(sdata->vif.bss_conf.mu_group.position, 0, in ieee80211_set_disassoc()
2929 sizeof(sdata->vif.bss_conf.mu_group.position)); in ieee80211_set_disassoc()
2930 if (!sdata->vif.valid_links) in ieee80211_set_disassoc()
2932 sdata->vif.bss_conf.mu_mimo_owner = false; in ieee80211_set_disassoc()
2934 sdata->deflink.ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
2940 if (sdata->vif.cfg.arp_addr_cnt) in ieee80211_set_disassoc()
2943 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
2944 if (!sdata->vif.valid_links) { in ieee80211_set_disassoc()
2948 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
2950 ieee80211_vif_cfg_change_notify(sdata, changed); in ieee80211_set_disassoc()
2954 ieee80211_set_wmm_default(&sdata->deflink, false, false); in ieee80211_set_disassoc()
2956 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
2957 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
2958 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
2959 del_timer_sync(&sdata->deflink.u.mgd.chswitch_timer); in ieee80211_set_disassoc()
2961 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
2962 sdata->vif.bss_conf.beacon_rate = NULL; in ieee80211_set_disassoc()
2964 sdata->deflink.u.mgd.have_beacon = false; in ieee80211_set_disassoc()
2965 sdata->deflink.u.mgd.tracking_signal_avg = false; in ieee80211_set_disassoc()
2966 sdata->deflink.u.mgd.disable_wmm_tracking = false; in ieee80211_set_disassoc()
2969 sdata->deflink.u.mgd.conn_flags = 0; in ieee80211_set_disassoc()
2972 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) { in ieee80211_set_disassoc()
2975 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_set_disassoc()
2981 sdata->vif.bss_conf.csa_active = false; in ieee80211_set_disassoc()
2982 sdata->deflink.u.mgd.csa_waiting_bcn = false; in ieee80211_set_disassoc()
2983 sdata->deflink.u.mgd.csa_ignored_same_chan = false; in ieee80211_set_disassoc()
2984 if (sdata->deflink.csa_block_tx) { in ieee80211_set_disassoc()
2985 ieee80211_wake_vif_queues(local, sdata, in ieee80211_set_disassoc()
2987 sdata->deflink.csa_block_tx = false; in ieee80211_set_disassoc()
2995 sdata->vif.bss_conf.pwr_reduction = 0; in ieee80211_set_disassoc()
2996 sdata->vif.bss_conf.tx_pwr_env_num = 0; in ieee80211_set_disassoc()
2997 memset(sdata->vif.bss_conf.tx_pwr_env, 0, in ieee80211_set_disassoc()
2998 sizeof(sdata->vif.bss_conf.tx_pwr_env)); in ieee80211_set_disassoc()
3000 ieee80211_vif_set_links(sdata, 0); in ieee80211_set_disassoc()
3003 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
3005 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
3006 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
3012 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
3018 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_reset_ap_probe()
3026 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
3035 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_wmm_ac_notify() argument
3039 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_tx_wmm_ac_notify()
3077 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
3080 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time); in ieee80211_sta_tx_notify()
3083 !sdata->u.mgd.probe_send_count) in ieee80211_sta_tx_notify()
3087 sdata->u.mgd.probe_send_count = 0; in ieee80211_sta_tx_notify()
3089 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
3090 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_tx_notify()
3093 static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata, in ieee80211_mlme_send_probe_req() argument
3100 skb = ieee80211_build_probe_req(sdata, src, dst, (u32)-1, channel, in ieee80211_mlme_send_probe_req()
3104 ieee80211_tx_skb(sdata, skb); in ieee80211_mlme_send_probe_req()
3107 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
3109 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
3110 u8 *dst = sdata->vif.cfg.ap_addr; in ieee80211_mgd_probe_ap_send()
3114 if (WARN_ON(sdata->vif.valid_links)) in ieee80211_mgd_probe_ap_send()
3135 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
3136 sta = sta_info_get(sdata, dst); in ieee80211_mgd_probe_ap_send()
3139 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
3142 if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { in ieee80211_mgd_probe_ap_send()
3144 ieee80211_send_nullfunc(sdata->local, sdata, false); in ieee80211_mgd_probe_ap_send()
3146 ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst, in ieee80211_mgd_probe_ap_send()
3147 sdata->vif.cfg.ssid, in ieee80211_mgd_probe_ap_send()
3148 sdata->vif.cfg.ssid_len, in ieee80211_mgd_probe_ap_send()
3149 sdata->deflink.u.mgd.bss->channel); in ieee80211_mgd_probe_ap_send()
3153 run_again(sdata, ifmgd->probe_timeout); in ieee80211_mgd_probe_ap_send()
3156 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
3159 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
3162 if (WARN_ON(sdata->vif.valid_links)) in ieee80211_mgd_probe_ap()
3165 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
3168 sdata_lock(sdata); in ieee80211_mgd_probe_ap()
3173 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
3175 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
3176 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
3180 if (sdata->local->suspending) { in ieee80211_mgd_probe_ap()
3182 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
3183 ieee80211_reset_ap_probe(sdata); in ieee80211_mgd_probe_ap()
3188 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
3192 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL); in ieee80211_mgd_probe_ap()
3211 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
3216 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
3217 ieee80211_recalc_ps(sdata->local); in ieee80211_mgd_probe_ap()
3218 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
3221 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
3223 sdata_unlock(sdata); in ieee80211_mgd_probe_ap()
3229 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
3230 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
3236 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION || in ieee80211_ap_probereq_get()
3237 sdata->vif.valid_links)) in ieee80211_ap_probereq_get()
3240 sdata_assert_lock(sdata); in ieee80211_ap_probereq_get()
3243 cbss = sdata->deflink.u.mgd.bss; in ieee80211_ap_probereq_get()
3260 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, in ieee80211_ap_probereq_get()
3270 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata, in ieee80211_report_disconnect() argument
3281 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len, reconnect); in ieee80211_report_disconnect()
3283 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
3285 drv_event_callback(sdata->local, sdata, &event); in ieee80211_report_disconnect()
3288 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
3290 struct ieee80211_local *local = sdata->local; in __ieee80211_disconnect()
3291 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_disconnect()
3295 sdata_lock(sdata); in __ieee80211_disconnect()
3297 sdata_unlock(sdata); in __ieee80211_disconnect()
3302 tx = sdata->vif.valid_links || !sdata->deflink.csa_block_tx; in __ieee80211_disconnect()
3315 link_id < ARRAY_SIZE(sdata->link); in __ieee80211_disconnect()
3319 link = sdata_dereference(sdata->link[link_id], sdata); in __ieee80211_disconnect()
3327 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in __ieee80211_disconnect()
3334 sdata->vif.bss_conf.csa_active = false; in __ieee80211_disconnect()
3335 sdata->deflink.u.mgd.csa_waiting_bcn = false; in __ieee80211_disconnect()
3336 if (sdata->deflink.csa_block_tx) { in __ieee80211_disconnect()
3337 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_disconnect()
3339 sdata->deflink.csa_block_tx = false; in __ieee80211_disconnect()
3343 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx, in __ieee80211_disconnect()
3348 sdata_unlock(sdata); in __ieee80211_disconnect()
3353 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
3356 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
3359 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
3360 sdata->vif.cfg.ap_addr); in ieee80211_beacon_connection_loss_work()
3361 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
3364 sdata_info(sdata, in ieee80211_beacon_connection_loss_work()
3366 sdata->vif.cfg.ap_addr); in ieee80211_beacon_connection_loss_work()
3367 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
3371 sdata->deflink.u.mgd.beacon_loss_count++; in ieee80211_beacon_connection_loss_work()
3372 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
3378 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
3382 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
3387 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
3388 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
3390 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
3392 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
3393 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
3399 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
3400 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
3402 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
3404 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
3405 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
3411 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_disconnect() local
3412 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_disconnect()
3414 trace_api_disconnect(sdata, reconnect); in ieee80211_disconnect()
3416 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_disconnect()
3419 sdata->u.mgd.driver_disconnect = true; in ieee80211_disconnect()
3420 sdata->u.mgd.reconnect = reconnect; in ieee80211_disconnect()
3421 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_disconnect()
3425 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
3428 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
3430 sdata_assert_lock(sdata); in ieee80211_destroy_auth_data()
3438 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_auth_data()
3439 sta_info_destroy_addr(sdata, auth_data->ap_addr); in ieee80211_destroy_auth_data()
3442 sdata->deflink.u.mgd.conn_flags = 0; in ieee80211_destroy_auth_data()
3443 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_destroy_auth_data()
3444 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_destroy_auth_data()
3446 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
3448 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
3449 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_destroy_auth_data()
3450 ieee80211_vif_set_links(sdata, 0); in ieee80211_destroy_auth_data()
3451 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
3454 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
3456 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
3466 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
3469 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
3471 sdata_assert_lock(sdata); in ieee80211_destroy_assoc_data()
3479 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_assoc_data()
3480 sta_info_destroy_addr(sdata, assoc_data->ap_addr); in ieee80211_destroy_assoc_data()
3482 sdata->deflink.u.mgd.conn_flags = 0; in ieee80211_destroy_assoc_data()
3483 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_destroy_assoc_data()
3484 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_destroy_assoc_data()
3486 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
3487 sdata->vif.bss_conf.mu_mimo_owner = false; in ieee80211_destroy_assoc_data()
3501 if (sdata->vif.valid_links) in ieee80211_destroy_assoc_data()
3504 cfg80211_assoc_failure(sdata->dev, &data); in ieee80211_destroy_assoc_data()
3507 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
3508 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_destroy_assoc_data()
3509 ieee80211_vif_set_links(sdata, 0); in ieee80211_destroy_assoc_data()
3510 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
3514 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
3517 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
3520 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
3521 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
3535 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_auth_challenge()
3539 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
3547 static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_mark_sta_auth() argument
3549 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mark_sta_auth()
3554 sdata_info(sdata, "authenticated\n"); in ieee80211_mark_sta_auth()
3558 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_mark_sta_auth()
3561 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
3562 sta = sta_info_get(sdata, ap_addr); in ieee80211_mark_sta_auth()
3564 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, ap_addr); in ieee80211_mark_sta_auth()
3569 sdata_info(sdata, "failed moving %pM to auth\n", ap_addr); in ieee80211_mark_sta_auth()
3575 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
3579 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
3582 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
3592 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_auth()
3613 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
3621 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
3633 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_rx_mgmt_auth()
3637 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
3639 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
3642 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3657 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
3670 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3674 if (!ieee80211_mark_sta_auth(sdata)) in ieee80211_rx_mgmt_auth()
3678 sdata_info(sdata, "SAE peer confirmed\n"); in ieee80211_rx_mgmt_auth()
3682 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
3684 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_rx_mgmt_auth()
3744 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
3747 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
3750 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_deauth()
3756 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_deauth()
3761 ether_addr_equal(mgmt->bssid, sdata->vif.cfg.ap_addr)) { in ieee80211_rx_mgmt_deauth()
3762 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_deauth()
3763 sdata->vif.cfg.ap_addr, reason_code, in ieee80211_rx_mgmt_deauth()
3766 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
3768 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, in ieee80211_rx_mgmt_deauth()
3775 sdata_info(sdata, in ieee80211_rx_mgmt_deauth()
3780 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON); in ieee80211_rx_mgmt_deauth()
3782 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_deauth()
3788 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
3791 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
3794 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_disassoc()
3800 !ether_addr_equal(mgmt->bssid, sdata->vif.cfg.ap_addr)) in ieee80211_rx_mgmt_disassoc()
3806 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_disassoc()
3810 sdata_info(sdata, "disassociated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_disassoc()
3811 sdata->vif.cfg.ap_addr, reason_code, in ieee80211_rx_mgmt_disassoc()
3814 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
3816 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code, in ieee80211_rx_mgmt_disassoc()
3897 static bool ieee80211_twt_bcast_support(struct ieee80211_sub_if_data *sdata, in ieee80211_twt_bcast_support() argument
3904 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_twt_bcast_support()
3922 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_assoc_config_link() local
3923 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_assoc_config_link()
3925 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_config_link()
3930 .link_id = link == &sdata->deflink ? -1 : link->link_id, in ieee80211_assoc_config_link()
3949 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_config_link()
3996 sdata_info(sdata, in ieee80211_assoc_config_link()
4007 sdata_info(sdata, in ieee80211_assoc_config_link()
4013 sdata_info(sdata, in ieee80211_assoc_config_link()
4019 sdata_info(sdata, in ieee80211_assoc_config_link()
4025 sdata_info(sdata, in ieee80211_assoc_config_link()
4038 sdata_info(sdata, in ieee80211_assoc_config_link()
4046 sdata_info(sdata, in ieee80211_assoc_config_link()
4054 sdata_info(sdata, in ieee80211_assoc_config_link()
4068 sdata_info(sdata, in ieee80211_assoc_config_link()
4076 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_config_link()
4081 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_config_link()
4087 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, in ieee80211_assoc_config_link()
4106 ieee80211_eht_cap_ie_to_sta_eht_cap(sdata, sband, in ieee80211_assoc_config_link()
4125 ieee80211_twt_bcast_support(sdata, bss_conf, sband, link_sta); in ieee80211_assoc_config_link()
4152 ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems->he_operation); in ieee80211_assoc_config_link()
4153 ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems->he_spr); in ieee80211_assoc_config_link()
4241 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_mgd_setup_link_sta() local
4242 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_setup_link_sta()
4248 int shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_mgd_setup_link_sta()
4397 ieee80211_verify_peer_he_mcs_support(struct ieee80211_sub_if_data *sdata, in ieee80211_verify_peer_he_mcs_support() argument
4417 sdata_info(sdata, in ieee80211_verify_peer_he_mcs_support()
4428 sdata_info(sdata, in ieee80211_verify_peer_he_mcs_support()
4449 sdata_info(sdata, in ieee80211_verify_peer_he_mcs_support()
4495 sdata_info(sdata, in ieee80211_verify_peer_he_mcs_support()
4506 ieee80211_verify_sta_he_mcs_support(struct ieee80211_sub_if_data *sdata, in ieee80211_verify_sta_he_mcs_support() argument
4512 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_verify_sta_he_mcs_support()
4585 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
4590 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
4632 mlme_dbg(sdata, "HT not supported, disabling HT/VHT/HE/EHT\n"); in ieee80211_prep_channel()
4640 mlme_dbg(sdata, "VHT not supported, disabling VHT/HE/EHT\n"); in ieee80211_prep_channel()
4647 ieee80211_vif_type_p2p(&sdata->vif))) { in ieee80211_prep_channel()
4648 mlme_dbg(sdata, "HE not supported, disabling HE and EHT\n"); in ieee80211_prep_channel()
4654 ieee80211_vif_type_p2p(&sdata->vif))) { in ieee80211_prep_channel()
4655 mlme_dbg(sdata, "EHT not supported, disabling EHT\n"); in ieee80211_prep_channel()
4673 sdata_info(sdata, in ieee80211_prep_channel()
4714 if (!ieee80211_verify_peer_he_mcs_support(sdata, ies, he_oper) || in ieee80211_prep_channel()
4715 !ieee80211_verify_sta_he_mcs_support(sdata, sband, he_oper)) in ieee80211_prep_channel()
4755 sdata_info(sdata, "80 MHz not supported, disabling VHT\n"); in ieee80211_prep_channel()
4762 sdata_info(sdata, in ieee80211_prep_channel()
4767 ieee80211_determine_chantype(sdata, link, *conn_flags, in ieee80211_prep_channel()
4787 sdata_info(sdata, "Rejecting non-HE 6/7 GHz connection"); in ieee80211_prep_channel()
4856 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
4861 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
4863 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
4869 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
4874 sta = sta_info_get(sdata, assoc_data->ap_addr); in ieee80211_assoc_success()
4878 if (sdata->vif.valid_links) { in ieee80211_assoc_success()
4893 ieee80211_vif_set_links(sdata, valid_links); in ieee80211_assoc_success()
4903 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_assoc_success()
4907 if (sdata->vif.valid_links) in ieee80211_assoc_success()
4931 err = ieee80211_prep_channel(sdata, link, cbss, in ieee80211_assoc_success()
4976 sdata_info(sdata, in ieee80211_assoc_success()
4983 if (sdata->wdev.use_4addr) in ieee80211_assoc_success()
4984 drv_sta_set_4addr(local, sdata, &sta->sta, true); in ieee80211_assoc_success()
4986 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
4988 ieee80211_set_associated(sdata, assoc_data, changed); in ieee80211_assoc_success()
4995 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
5001 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
5002 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_assoc_success()
5006 eth_zero_addr(sdata->vif.cfg.ap_addr); in ieee80211_assoc_success()
5007 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
5011 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
5015 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
5038 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_assoc_resp()
5073 fils_decrypt_assoc_resp(sdata, (u8 *)mgmt, &len, assoc_data) < 0) in ieee80211_rx_mgmt_assoc_resp()
5096 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5108 cfg80211_assoc_comeback(sdata->dev, assoc_data->ap_addr, in ieee80211_rx_mgmt_assoc_resp()
5113 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5119 run_again(sdata, assoc_data->timeout); in ieee80211_rx_mgmt_assoc_resp()
5124 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
5128 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
5131 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5138 if (sdata->vif.valid_links) { in ieee80211_rx_mgmt_assoc_resp()
5140 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5149 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5160 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
5169 sdata->vif.cfg.aid = aid; in ieee80211_rx_mgmt_assoc_resp()
5171 if (!ieee80211_assoc_success(sdata, mgmt, elems, in ieee80211_rx_mgmt_assoc_resp()
5174 ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT); in ieee80211_rx_mgmt_assoc_resp()
5178 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
5179 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
5187 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_rx_mgmt_assoc_resp()
5202 ieee80211_destroy_assoc_data(sdata, in ieee80211_rx_mgmt_assoc_resp()
5211 if (sdata->vif.valid_links) in ieee80211_rx_mgmt_assoc_resp()
5212 resp.ap_mld_addr = sdata->vif.cfg.ap_addr; in ieee80211_rx_mgmt_assoc_resp()
5213 cfg80211_rx_assoc_resp(sdata->dev, &resp); in ieee80211_rx_mgmt_assoc_resp()
5215 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_rx_mgmt_assoc_resp()
5219 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON); in ieee80211_rx_mgmt_assoc_resp()
5227 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_rx_bss_info() local
5228 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
5232 sdata_assert_lock(sdata); in ieee80211_rx_bss_info()
5250 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_rx_mgmt_probe_resp() local
5257 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
5259 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_probe_resp()
5268 channel = ieee80211_get_channel(sdata->local->hw.wiphy, in ieee80211_rx_mgmt_probe_resp()
5273 if (!ether_addr_equal(mgmt->da, sdata->vif.addr) && in ieee80211_rx_mgmt_probe_resp()
5286 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
5319 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_handle_beacon_sig() local
5352 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
5358 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
5364 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_handle_beacon_sig()
5374 &sdata->vif, in ieee80211_handle_beacon_sig()
5381 &sdata->vif, in ieee80211_handle_beacon_sig()
5398 &sdata->vif, in ieee80211_handle_beacon_sig()
5405 &sdata->vif, in ieee80211_handle_beacon_sig()
5426 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_rx_mgmt_beacon() local
5427 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
5428 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
5429 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg; in ieee80211_rx_mgmt_beacon()
5433 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
5449 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_beacon()
5452 bssid = ieee80211_get_bssid(hdr, len, sdata->vif.type); in ieee80211_rx_mgmt_beacon()
5485 !WARN_ON(sdata->vif.valid_links) && in ieee80211_rx_mgmt_beacon()
5521 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_rx_mgmt_beacon()
5536 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
5538 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_beacon()
5545 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
5570 ieee80211_send_nullfunc(local, sdata, false); in ieee80211_rx_mgmt_beacon()
5571 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
5582 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
5586 if (sdata->vif.p2p || in ieee80211_rx_mgmt_beacon()
5587 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_rx_mgmt_beacon()
5669 ieee80211_recalc_ps_vif(sdata); in ieee80211_rx_mgmt_beacon()
5685 sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr); in ieee80211_rx_mgmt_beacon()
5705 sdata_info(sdata, in ieee80211_rx_mgmt_beacon()
5708 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
5711 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
5719 ieee80211_vht_handle_opmode(sdata, link_sta, in ieee80211_rx_mgmt_beacon()
5730 ieee80211_link_info_change_notify(sdata, link, changed); in ieee80211_rx_mgmt_beacon()
5735 void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_ext() argument
5738 struct ieee80211_link_data *link = &sdata->deflink; in ieee80211_sta_rx_queued_ext()
5747 sdata_lock(sdata); in ieee80211_sta_rx_queued_ext()
5753 sdata_unlock(sdata); in ieee80211_sta_rx_queued_ext()
5756 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
5759 struct ieee80211_link_data *link = &sdata->deflink; in ieee80211_sta_rx_queued_mgmt()
5769 sdata_lock(sdata); in ieee80211_sta_rx_queued_mgmt()
5772 link = sdata_dereference(sdata->link[rx_status->link_id], in ieee80211_sta_rx_queued_mgmt()
5773 sdata); in ieee80211_sta_rx_queued_mgmt()
5787 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
5790 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
5793 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
5797 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
5855 sdata_unlock(sdata); in ieee80211_sta_rx_queued_mgmt()
5860 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
5861 from_timer(sdata, t, u.mgd.timer); in ieee80211_sta_timer()
5863 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_timer()
5866 void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
5871 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
5874 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_sta_connection_lost()
5878 static int ieee80211_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_auth() argument
5880 struct ieee80211_local *local = sdata->local; in ieee80211_auth()
5881 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_auth()
5890 sdata_assert_lock(sdata); in ieee80211_auth()
5898 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_auth()
5913 drv_mgd_prepare_tx(local, sdata, &info); in ieee80211_auth()
5915 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_auth()
5931 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_auth()
5948 run_again(sdata, auth_data->timeout); in ieee80211_auth()
5953 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
5955 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
5956 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
5959 sdata_assert_lock(sdata); in ieee80211_do_assoc()
5963 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
5976 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
5979 ret = ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
5986 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
5992 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
5998 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
6001 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
6003 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
6004 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
6005 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
6007 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mgd_conn_tx_status()
6010 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
6012 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
6013 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
6015 sdata_lock(sdata); in ieee80211_sta_work()
6033 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
6044 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
6059 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
6060 } else if (ieee80211_auth(sdata)) { in ieee80211_sta_work()
6070 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
6072 cfg80211_auth_timeout(sdata->dev, ap_addr); in ieee80211_sta_work()
6073 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
6076 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
6081 !sdata->deflink.u.mgd.have_beacon) || in ieee80211_sta_work()
6082 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
6089 ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT); in ieee80211_sta_work()
6090 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
6093 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
6097 u8 *bssid = sdata->deflink.u.mgd.bssid; in ieee80211_sta_work()
6107 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
6110 mlme_dbg(sdata, in ieee80211_sta_work()
6114 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
6116 mlme_dbg(sdata, in ieee80211_sta_work()
6119 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_work()
6124 run_again(sdata, ifmgd->probe_timeout); in ieee80211_sta_work()
6126 mlme_dbg(sdata, in ieee80211_sta_work()
6129 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_work()
6132 mlme_dbg(sdata, in ieee80211_sta_work()
6136 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
6142 mlme_dbg(sdata, in ieee80211_sta_work()
6146 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_work()
6151 sdata_unlock(sdata); in ieee80211_sta_work()
6156 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
6157 from_timer(sdata, t, u.mgd.bcn_mon_timer); in ieee80211_sta_bcn_mon_timer()
6159 if (WARN_ON(sdata->vif.valid_links)) in ieee80211_sta_bcn_mon_timer()
6162 if (sdata->vif.bss_conf.csa_active && in ieee80211_sta_bcn_mon_timer()
6163 !sdata->deflink.u.mgd.csa_waiting_bcn) in ieee80211_sta_bcn_mon_timer()
6166 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_bcn_mon_timer()
6169 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
6170 ieee80211_queue_work(&sdata->local->hw, in ieee80211_sta_bcn_mon_timer()
6171 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
6176 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
6177 from_timer(sdata, t, u.mgd.conn_mon_timer); in ieee80211_sta_conn_mon_timer()
6178 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
6179 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
6183 if (WARN_ON(sdata->vif.valid_links)) in ieee80211_sta_conn_mon_timer()
6186 if (sdata->vif.bss_conf.csa_active && in ieee80211_sta_conn_mon_timer()
6187 !sdata->deflink.u.mgd.csa_waiting_bcn) in ieee80211_sta_conn_mon_timer()
6190 sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr); in ieee80211_sta_conn_mon_timer()
6212 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
6216 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
6219 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
6221 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
6222 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
6225 if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_restart_sta_timer()
6226 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
6227 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
6232 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_quiesce() argument
6234 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_quiesce()
6237 sdata_lock(sdata); in ieee80211_mgd_quiesce()
6249 ieee80211_send_deauth_disassoc(sdata, ap_addr, ap_addr, in ieee80211_mgd_quiesce()
6254 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON); in ieee80211_mgd_quiesce()
6256 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_quiesce()
6257 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, in ieee80211_mgd_quiesce()
6279 if (ifmgd->associated && !sdata->local->wowlan) { in ieee80211_mgd_quiesce()
6286 memcpy(bssid, sdata->vif.cfg.ap_addr, ETH_ALEN); in ieee80211_mgd_quiesce()
6287 ieee80211_mgd_deauth(sdata, &req); in ieee80211_mgd_quiesce()
6290 sdata_unlock(sdata); in ieee80211_mgd_quiesce()
6294 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
6296 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
6298 sdata_lock(sdata); in ieee80211_sta_restart()
6300 sdata_unlock(sdata); in ieee80211_sta_restart()
6304 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
6305 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
6306 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
6307 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
6310 sdata_unlock(sdata); in ieee80211_sta_restart()
6314 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_HW_RESTART) { in ieee80211_sta_restart()
6315 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_HW_RESTART; in ieee80211_sta_restart()
6316 mlme_dbg(sdata, "driver requested disconnect after hardware restart\n"); in ieee80211_sta_restart()
6317 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
6320 sdata_unlock(sdata); in ieee80211_sta_restart()
6324 sdata_unlock(sdata); in ieee80211_sta_restart()
6333 sdata_lock(link->sdata); in ieee80211_request_smps_mgd_work()
6334 __ieee80211_request_smps_mgd(link->sdata, link, in ieee80211_request_smps_mgd_work()
6336 sdata_unlock(link->sdata); in ieee80211_request_smps_mgd_work()
6340 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
6342 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
6358 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
6359 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
6360 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
6369 struct ieee80211_sub_if_data *sdata = link->sdata; in ieee80211_mgd_setup_link() local
6370 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_setup_link()
6387 if (sdata->u.mgd.assoc_data) in ieee80211_mgd_setup_link()
6389 sdata->u.mgd.assoc_data->link[link_id].addr); in ieee80211_mgd_setup_link()
6397 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
6401 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
6402 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
6403 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
6408 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
6413 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
6414 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
6426 err = ieee80211_vif_set_links(sdata, BIT(link_id)); in ieee80211_prep_connection()
6431 err = ieee80211_vif_set_links(sdata, 0); in ieee80211_prep_connection()
6439 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_prep_connection()
6458 have_sta = sta_info_get(sdata, ap_mld_addr); in ieee80211_prep_connection()
6464 new_sta = sta_info_alloc_with_link(sdata, ap_mld_addr, in ieee80211_prep_connection()
6468 new_sta = sta_info_alloc(sdata, ap_mld_addr, GFP_KERNEL); in ieee80211_prep_connection()
6525 } else if (!ieee80211_hw_check(&sdata->local->hw, in ieee80211_prep_connection()
6542 err = ieee80211_prep_channel(sdata, link, cbss, in ieee80211_prep_connection()
6556 ieee80211_link_info_change_notify(sdata, link, in ieee80211_prep_connection()
6567 sdata_info(sdata, in ieee80211_prep_connection()
6582 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_prep_connection()
6583 ieee80211_vif_set_links(sdata, 0); in ieee80211_prep_connection()
6588 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
6591 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
6592 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
6684 ieee80211_destroy_auth_data(sdata, cont_auth); in ieee80211_mgd_auth()
6697 ieee80211_mark_sta_auth(sdata); in ieee80211_mgd_auth()
6702 sdata_info(sdata, in ieee80211_mgd_auth()
6704 sdata->vif.cfg.ap_addr, auth_data->ap_addr); in ieee80211_mgd_auth()
6705 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
6709 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_auth()
6715 sdata_info(sdata, "authenticate with %pM\n", auth_data->ap_addr); in ieee80211_mgd_auth()
6718 memcpy(sdata->vif.cfg.ap_addr, auth_data->ap_addr, ETH_ALEN); in ieee80211_mgd_auth()
6720 err = ieee80211_prep_connection(sdata, req->bss, req->link_id, in ieee80211_mgd_auth()
6725 err = ieee80211_auth(sdata); in ieee80211_mgd_auth()
6727 sta_info_destroy_addr(sdata, auth_data->ap_addr); in ieee80211_mgd_auth()
6736 if (!sdata->vif.valid_links) { in ieee80211_mgd_auth()
6737 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_mgd_auth()
6738 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_mgd_auth()
6740 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_auth()
6741 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_mgd_auth()
6742 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_auth()
6750 ieee80211_setup_assoc_link(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_assoc_link() argument
6756 struct ieee80211_local *local = sdata->local; in ieee80211_setup_assoc_link()
6775 link = sdata_dereference(sdata->link[link_id], sdata); in ieee80211_setup_assoc_link()
6826 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_setup_assoc_link()
6838 sdata->deflink.u.mgd.have_beacon = true; in ieee80211_setup_assoc_link()
6874 sdata_info(sdata, "associating to AP %pM with corrupt %s\n", in ieee80211_setup_assoc_link()
6879 if (sdata->u.mgd.powersave) in ieee80211_setup_assoc_link()
6890 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
6894 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
6895 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
6898 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg; in ieee80211_mgd_assoc()
6911 if (sdata->u.mgd.use_4addr && req->link_id >= 0) in ieee80211_mgd_assoc()
6937 link = sdata_dereference(sdata->link[i], sdata); in ieee80211_mgd_assoc()
6945 memcpy(assoc_data->link[0].addr, sdata->vif.addr, ETH_ALEN); in ieee80211_mgd_assoc()
6957 sdata_info(sdata, in ieee80211_mgd_assoc()
6959 sdata->vif.cfg.ap_addr, assoc_data->ap_addr); in ieee80211_mgd_assoc()
6960 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
6964 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_assoc()
6986 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
7010 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
7021 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
7026 mlme_dbg(sdata, "HT disabled by flag, disabling HT/VHT/HE\n"); in ieee80211_mgd_assoc()
7034 mlme_dbg(sdata, "VHT disabled by flag, disabling VHT\n"); in ieee80211_mgd_assoc()
7039 mlme_dbg(sdata, "HE disabled by flag, disabling HE/EHT\n"); in ieee80211_mgd_assoc()
7095 err = ieee80211_vif_set_links(sdata, BIT(assoc_link_id)); in ieee80211_mgd_assoc()
7103 link = sdata_dereference(sdata->link[assoc_link_id], sdata); in ieee80211_mgd_assoc()
7111 conn_flags |= ieee80211_setup_assoc_link(sdata, assoc_data, req, in ieee80211_mgd_assoc()
7116 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
7119 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in ieee80211_mgd_assoc()
7122 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) { in ieee80211_mgd_assoc()
7151 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
7152 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
7153 sdata->control_port_over_nl80211 = in ieee80211_mgd_assoc()
7155 sdata->control_port_no_preauth = req->crypto.control_port_no_preauth; in ieee80211_mgd_assoc()
7166 err = ieee80211_prep_channel(sdata, NULL, assoc_data->link[i].bss, in ieee80211_mgd_assoc()
7173 memcpy(sdata->vif.cfg.ap_addr, assoc_data->ap_addr, ETH_ALEN); in ieee80211_mgd_assoc()
7175 err = ieee80211_prep_connection(sdata, cbss, req->link_id, in ieee80211_mgd_assoc()
7183 if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC)) { in ieee80211_mgd_assoc()
7194 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
7203 run_again(sdata, assoc_data->timeout); in ieee80211_mgd_assoc()
7207 eth_zero_addr(sdata->deflink.u.mgd.bssid); in ieee80211_mgd_assoc()
7208 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_mgd_assoc()
7216 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
7219 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
7228 sdata_info(sdata, in ieee80211_mgd_deauth()
7233 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
7234 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
7238 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
7239 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
7242 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
7248 sdata_info(sdata, in ieee80211_mgd_deauth()
7253 drv_mgd_prepare_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
7254 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
7258 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON); in ieee80211_mgd_deauth()
7259 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
7266 ether_addr_equal(sdata->vif.cfg.ap_addr, req->bssid)) { in ieee80211_mgd_deauth()
7267 sdata_info(sdata, in ieee80211_mgd_deauth()
7272 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
7274 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
7277 drv_mgd_complete_tx(sdata->local, sdata, &info); in ieee80211_mgd_deauth()
7284 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
7289 if (!sdata->u.mgd.associated || in ieee80211_mgd_disassoc()
7290 memcmp(sdata->vif.cfg.ap_addr, req->ap_addr, ETH_ALEN)) in ieee80211_mgd_disassoc()
7293 sdata_info(sdata, in ieee80211_mgd_disassoc()
7298 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
7302 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_mgd_disassoc()
7314 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
7316 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
7328 sdata_lock(sdata); in ieee80211_mgd_stop()
7330 ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT); in ieee80211_mgd_stop()
7332 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
7344 sdata_unlock(sdata); in ieee80211_mgd_stop()
7352 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
7354 trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level); in ieee80211_cqm_rssi_notify()
7356 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp); in ieee80211_cqm_rssi_notify()
7362 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_beacon_loss_notify() local
7364 trace_api_cqm_beacon_loss_notify(sdata->local, sdata); in ieee80211_cqm_beacon_loss_notify()
7366 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp); in ieee80211_cqm_beacon_loss_notify()
7370 static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata, in _ieee80211_enable_rssi_reports() argument
7374 trace_api_enable_rssi_reports(sdata, rssi_min_thold, rssi_max_thold); in _ieee80211_enable_rssi_reports()
7376 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in _ieee80211_enable_rssi_reports()
7384 sdata->u.mgd.rssi_min_thold = rssi_min_thold*16; in _ieee80211_enable_rssi_reports()
7385 sdata->u.mgd.rssi_max_thold = rssi_max_thold*16; in _ieee80211_enable_rssi_reports()
7392 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_enable_rssi_reports() local
7397 _ieee80211_enable_rssi_reports(sdata, rssi_min_thold, in ieee80211_enable_rssi_reports()
7404 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_disable_rssi_reports() local
7406 _ieee80211_enable_rssi_reports(sdata, 0, 0); in ieee80211_disable_rssi_reports()