Lines Matching defs:sdata

175 static void run_again(struct ieee80211_sub_if_data *sdata,
178 sdata_assert_lock(sdata);
180 if (!timer_pending(&sdata->u.mgd.timer) ||
181 time_before(timeout, sdata->u.mgd.timer.expires))
182 mod_timer(&sdata->u.mgd.timer, timeout);
185 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata)
187 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)
190 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
193 mod_timer(&sdata->u.mgd.bcn_mon_timer,
194 round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout));
197 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata)
199 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
207 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
220 ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
245 if (!ieee80211_chandef_he_6ghz_oper(sdata, he_oper, eht_oper,
247 mlme_dbg(sdata,
260 sdata_info(sdata,
273 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap);
276 mlme_dbg(sdata, "HT operation missing / HT not supported\n");
297 sdata_info(sdata,
312 mlme_dbg(sdata, "40 MHz not supported\n");
321 mlme_dbg(sdata, "VHT operation missing / VHT not supported\n");
340 if (!ieee80211_chandef_vht_oper(&sdata->local->hw, vht_cap_info,
344 sdata_info(sdata,
349 } else if (!ieee80211_chandef_vht_oper(&sdata->local->hw,
354 sdata_info(sdata,
362 sdata_info(sdata,
375 sdata_info(sdata,
398 sdata_info(sdata,
406 sdata_info(sdata,
452 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef,
466 if (!he_oper || !cfg80211_chandef_usable(sdata->wdev.wiphy, chandef,
470 if (!eht_oper || !cfg80211_chandef_usable(sdata->wdev.wiphy, chandef,
475 sdata_info(sdata,
492 struct ieee80211_sub_if_data *sdata = link->sdata;
493 struct ieee80211_local *local = sdata->local;
494 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
514 !ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif)) {
521 !ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif))
538 flags = ieee80211_determine_chantype(sdata, link,
582 sdata_info(sdata,
591 sdata_info(sdata,
602 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata,
617 ieee80211_apply_htcap_overrides(sdata, &ht_cap);
677 static bool ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
683 struct ieee80211_local *local = sdata->local;
693 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap);
767 static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata,
777 he_cap = ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
794 ieee80211_ie_build_he_6ghz_cap(sdata, smps_mode, skb);
797 static void ieee80211_add_eht_ie(struct ieee80211_sub_if_data *sdata,
806 he_cap = ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
807 eht_cap = ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif);
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,
1028 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif);
1029 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1034 struct ieee80211_local *local = sdata->local;
1054 else if (sdata->u.mgd.powersave)
1132 ieee80211_add_ht_ie(sdata, skb,
1147 ieee80211_add_vht_ie(sdata, skb, sband,
1173 ieee80211_add_he_ie(sdata, skb, sband, smps_mode,
1187 ieee80211_assoc_add_ml_elem(sdata, skb, orig_capab, ext_capa,
1194 ieee80211_add_eht_ie(sdata, skb, sband);
1197 ieee80211_add_aid_request_ie(sdata, skb);
1198 ieee80211_add_s1g_capab_ie(sdata, &sband->s1g_cap, skb);
1269 static void ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata,
1274 struct ieee80211_local *local = sdata->local;
1275 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1285 if (!ieee80211_vif_is_mld(&sdata->vif))
1289 ieee80211_vif_type_p2p(&sdata->vif));
1305 memcpy(common->mld_mac_addr, sdata->vif.addr, ETH_ALEN);
1355 extra_used = ieee80211_assoc_link_elems(sdata, skb, &capab,
1377 static int ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
1379 struct ieee80211_local *local = sdata->local;
1380 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1390 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif);
1404 sdata_assert_lock(sdata);
1460 if (ieee80211_vif_is_mld(&sdata->vif)) {
1479 link = sdata_dereference(sdata->link[assoc_data->assoc_link_id], sdata);
1502 memcpy(mgmt->da, sdata->vif.cfg.ap_addr, ETH_ALEN);
1503 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
1504 memcpy(mgmt->bssid, sdata->vif.cfg.ap_addr, ETH_ALEN);
1536 offset = ieee80211_assoc_link_elems(sdata, skb, &link_capab,
1589 drv_mgd_prepare_tx(local, sdata, &info);
1595 ieee80211_tx_skb(sdata, skb);
1601 struct ieee80211_sub_if_data *sdata)
1606 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif);
1614 ieee80211_tx_skb(sdata, skb);
1618 struct ieee80211_sub_if_data *sdata,
1623 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1625 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif, -1,
1644 ieee80211_tx_skb(sdata, skb);
1648 struct ieee80211_sub_if_data *sdata)
1654 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
1667 memcpy(nullfunc->addr1, sdata->deflink.u.mgd.bssid, ETH_ALEN);
1668 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
1669 memcpy(nullfunc->addr3, sdata->deflink.u.mgd.bssid, ETH_ALEN);
1670 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN);
1674 ieee80211_tx_skb(sdata, skb);
1684 struct ieee80211_sub_if_data *sdata = link->sdata;
1685 struct ieee80211_local *local = sdata->local;
1686 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1689 if (!ieee80211_sdata_running(sdata))
1692 sdata_lock(sdata);
1720 sdata_info(sdata,
1723 wiphy_work_queue(sdata->local->hw.wiphy,
1733 sdata_info(sdata,
1735 wiphy_work_queue(sdata->local->hw.wiphy,
1742 ieee80211_sta_reset_beacon_monitor(sdata);
1743 ieee80211_sta_reset_conn_monitor(sdata);
1748 sdata_unlock(sdata);
1753 struct ieee80211_sub_if_data *sdata = link->sdata;
1754 struct ieee80211_local *local = sdata->local;
1755 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1758 sdata_assert_lock(sdata);
1763 ieee80211_wake_vif_queues(local, sdata,
1776 ret = drv_post_channel_switch(sdata);
1778 sdata_info(sdata,
1780 wiphy_work_queue(sdata->local->hw.wiphy,
1785 cfg80211_ch_switch_notify(sdata->dev, &link->reserved_chandef, 0, 0);
1790 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
1791 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1793 if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif)))
1796 trace_api_chswitch_done(sdata, success);
1798 sdata_info(sdata,
1800 wiphy_work_queue(sdata->local->hw.wiphy,
1803 wiphy_delayed_work_queue(sdata->local->hw.wiphy,
1804 &sdata->deflink.u.mgd.chswitch_work,
1813 struct ieee80211_sub_if_data *sdata = link->sdata;
1814 struct ieee80211_local *local = sdata->local;
1826 ieee80211_wake_vif_queues(local, sdata,
1834 drv_abort_channel_switch(sdata);
1843 struct ieee80211_sub_if_data *sdata = link->sdata;
1844 struct ieee80211_local *local = sdata->local;
1845 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1856 sdata_assert_lock(sdata);
1863 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band,
1885 drv_channel_switch_rx_beacon(sdata, &ch_switch);
1894 sdata_info(sdata,
1905 sdata_info(sdata,
1923 sdata_info(sdata,
1936 ieee80211_teardown_tdls_peers(sdata);
1943 sdata_info(sdata,
1952 sdata_info(sdata,
1957 if (drv_pre_channel_switch(sdata, &ch_switch)) {
1958 sdata_info(sdata,
1966 sdata_info(sdata,
1980 ieee80211_stop_vif_queues(local, sdata,
1984 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef,
1990 drv_channel_switch(local, sdata, &ch_switch);
2015 wiphy_work_queue(sdata->local->hw.wiphy,
2022 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata,
2093 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata,
2114 struct ieee80211_sub_if_data *sdata = link->sdata;
2128 sdata, channel, country_ie, country_ie_len,
2136 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco);
2153 sdata_dbg(sdata,
2163 sdata_dbg(sdata,
2169 if (__ieee80211_recalc_txpower(sdata))
2176 struct ieee80211_sub_if_data *sdata)
2193 ieee80211_send_nullfunc(local, sdata, true);
2218 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
2220 struct ieee80211_local *local = sdata->local;
2221 struct ieee80211_if_managed *mgd = &sdata->u.mgd;
2238 !sdata->deflink.u.mgd.have_beacon)
2242 sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
2253 struct ieee80211_sub_if_data *sdata, *found = NULL;
2263 list_for_each_entry(sdata, &local->interfaces, list) {
2264 if (!ieee80211_sdata_running(sdata))
2266 if (sdata->vif.type == NL80211_IFTYPE_AP) {
2274 if (sdata->vif.type != NL80211_IFTYPE_STATION)
2276 found = sdata;
2301 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata)
2303 bool ps_allowed = ieee80211_powersave_allowed(sdata);
2305 if (sdata->vif.cfg.ps != ps_allowed) {
2306 sdata->vif.cfg.ps = ps_allowed;
2307 ieee80211_vif_cfg_change_notify(sdata, BSS_CHANGED_PS);
2333 struct ieee80211_sub_if_data *sdata = local->ps_sdata;
2339 if (!sdata)
2342 ifmgd = &sdata->u.mgd;
2382 ieee80211_send_nullfunc(local, sdata, true);
2384 ieee80211_flush_queues(local, sdata, false);
2411 struct ieee80211_sub_if_data *sdata = link->sdata;
2413 mutex_lock(&sdata->local->mtx);
2414 if (sdata->wdev.cac_started) {
2416 cfg80211_cac_event(sdata->dev, &chandef,
2420 mutex_unlock(&sdata->local->mtx);
2424 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata)
2426 struct ieee80211_local *local = sdata->local;
2427 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2453 if (drv_conf_tx(local, &sdata->deflink, ac,
2454 &sdata->deflink.tx_conf[ac]))
2455 link_err(&sdata->deflink,
2472 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac)))
2483 if (drv_conf_tx(local, &sdata->deflink, ac,
2484 &sdata->deflink.tx_conf[non_acm_ac]))
2485 link_err(&sdata->deflink,
2502 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata)
2504 if (__ieee80211_sta_handle_tspec_ac_params(sdata))
2505 ieee80211_link_info_change_notify(sdata, &sdata->deflink,
2511 struct ieee80211_sub_if_data *sdata;
2513 sdata = container_of(work, struct ieee80211_sub_if_data,
2515 ieee80211_sta_handle_tspec_ac_params(sdata);
2520 struct ieee80211_sub_if_data *sdata = link->sdata;
2521 struct ieee80211_local *local = sdata->local;
2522 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2527 mlme_dbg(sdata,
2548 struct ieee80211_sub_if_data *sdata = link->sdata;
2550 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2588 sdata->wmm_acm = 0;
2598 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */
2608 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */
2618 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */
2629 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */
2659 ieee80211_regulatory_limit_wmm_params(sdata, &params[ac], ac);
2682 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata)
2684 lockdep_assert_held(&sdata->local->mtx);
2686 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL;
2687 ieee80211_run_deferred_scan(sdata->local);
2690 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata)
2692 mutex_lock(&sdata->local->mtx);
2693 __ieee80211_stop_poll(sdata);
2694 mutex_unlock(&sdata->local->mtx);
2745 struct ieee80211_sub_if_data *sdata = link->sdata;
2751 sdata->u.mgd.beacon_timeout =
2765 if (sdata->vif.p2p ||
2766 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) {
2796 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI &&
2803 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
2807 struct ieee80211_local *local = sdata->local;
2808 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg;
2812 sdata->u.mgd.associated = true;
2822 if (ieee80211_vif_is_mld(&sdata->vif) &&
2823 !(ieee80211_vif_usable_links(&sdata->vif) & BIT(link_id)))
2826 link = sdata_dereference(sdata->link[link_id], sdata);
2834 ieee80211_stop_poll(sdata);
2844 if (ieee80211_vif_is_mld(&sdata->vif)) {
2853 ieee80211_vif_usable_links(&sdata->vif)) ||
2857 link = sdata_dereference(sdata->link[link_id], sdata);
2861 ieee80211_link_info_change_notify(sdata, link,
2864 ieee80211_recalc_smps(sdata, link);
2867 ieee80211_vif_cfg_change_notify(sdata, vif_changed);
2869 ieee80211_bss_info_change_notify(sdata,
2878 if (!ieee80211_vif_is_mld(&sdata->vif))
2879 ieee80211_recalc_smps(sdata, &sdata->deflink);
2880 ieee80211_recalc_ps_vif(sdata);
2882 netif_carrier_on(sdata->dev);
2885 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
2889 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2890 struct ieee80211_local *local = sdata->local;
2897 sdata_assert_lock(sdata);
2905 ieee80211_stop_poll(sdata);
2910 sdata->deflink.u.mgd.bss = NULL;
2912 netif_carrier_off(sdata->dev);
2926 ieee80211_recalc_ps_vif(sdata);
2938 ieee80211_flush_queues(local, sdata, true);
2949 !sdata->deflink.u.mgd.have_beacon) {
2950 drv_mgd_prepare_tx(sdata->local, sdata, &info);
2953 ieee80211_send_deauth_disassoc(sdata, sdata->vif.cfg.ap_addr,
2954 sdata->vif.cfg.ap_addr, stype,
2960 ieee80211_flush_queues(local, sdata, false);
2962 drv_mgd_complete_tx(sdata->local, sdata, &info);
2965 eth_zero_addr(sdata->deflink.u.mgd.bssid);
2966 eth_zero_addr(sdata->vif.cfg.ap_addr);
2968 sdata->vif.cfg.ssid_len = 0;
2971 sta_info_flush(sdata);
2974 if (!ieee80211_vif_is_mld(&sdata->vif))
2975 changed |= ieee80211_reset_erp_info(sdata);
2979 sdata->vif.cfg.assoc = false;
2981 sdata->deflink.u.mgd.p2p_noa_index = -1;
2982 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
2983 sizeof(sdata->vif.bss_conf.p2p_noa_attr));
2995 memset(sdata->vif.bss_conf.mu_group.membership, 0,
2996 sizeof(sdata->vif.bss_conf.mu_group.membership));
2997 memset(sdata->vif.bss_conf.mu_group.position, 0,
2998 sizeof(sdata->vif.bss_conf.mu_group.position));
2999 if (!ieee80211_vif_is_mld(&sdata->vif))
3001 sdata->vif.bss_conf.mu_mimo_owner = false;
3003 sdata->deflink.ap_power_level = IEEE80211_UNSET_POWER_LEVEL;
3009 if (sdata->vif.cfg.arp_addr_cnt)
3012 sdata->vif.bss_conf.qos = false;
3013 if (!ieee80211_vif_is_mld(&sdata->vif)) {
3017 ieee80211_bss_info_change_notify(sdata, changed);
3019 ieee80211_vif_cfg_change_notify(sdata, changed);
3023 ieee80211_set_wmm_default(&sdata->deflink, false, false);
3025 del_timer_sync(&sdata->u.mgd.conn_mon_timer);
3026 del_timer_sync(&sdata->u.mgd.bcn_mon_timer);
3027 del_timer_sync(&sdata->u.mgd.timer);
3029 sdata->vif.bss_conf.dtim_period = 0;
3030 sdata->vif.bss_conf.beacon_rate = NULL;
3032 sdata->deflink.u.mgd.have_beacon = false;
3033 sdata->deflink.u.mgd.tracking_signal_avg = false;
3034 sdata->deflink.u.mgd.disable_wmm_tracking = false;
3037 sdata->deflink.u.mgd.conn_flags = 0;
3040 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) {
3043 link = sdata_dereference(sdata->link[link_id], sdata);
3049 sdata->vif.bss_conf.csa_active = false;
3050 sdata->deflink.u.mgd.csa_waiting_bcn = false;
3051 sdata->deflink.u.mgd.csa_ignored_same_chan = false;
3052 if (sdata->deflink.csa_block_tx) {
3053 ieee80211_wake_vif_queues(local, sdata,
3055 sdata->deflink.csa_block_tx = false;
3063 sdata->vif.bss_conf.pwr_reduction = 0;
3064 sdata->vif.bss_conf.tx_pwr_env_num = 0;
3065 memset(sdata->vif.bss_conf.tx_pwr_env, 0,
3066 sizeof(sdata->vif.bss_conf.tx_pwr_env));
3068 ieee80211_vif_set_links(sdata, 0, 0);
3071 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
3073 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3074 struct ieee80211_local *local = sdata->local;
3080 __ieee80211_stop_poll(sdata);
3086 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
3094 ieee80211_sta_reset_beacon_monitor(sdata);
3103 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata,
3107 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3145 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
3148 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time);
3151 !sdata->u.mgd.probe_send_count)
3155 sdata->u.mgd.probe_send_count = 0;
3157 sdata->u.mgd.nullfunc_failed = true;
3158 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work);
3161 static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata,
3168 skb = ieee80211_build_probe_req(sdata, src, dst, (u32)-1, channel,
3172 ieee80211_tx_skb(sdata, skb);
3175 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
3177 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3178 u8 *dst = sdata->vif.cfg.ap_addr;
3182 if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif)))
3203 mutex_lock(&sdata->local->sta_mtx);
3204 sta = sta_info_get(sdata, dst);
3207 mutex_unlock(&sdata->local->sta_mtx);
3210 if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) {
3212 ieee80211_send_nullfunc(sdata->local, sdata, false);
3214 ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst,
3215 sdata->vif.cfg.ssid,
3216 sdata->vif.cfg.ssid_len,
3217 sdata->deflink.u.mgd.bss->channel);
3221 run_again(sdata, ifmgd->probe_timeout);
3224 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata,
3227 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3230 if (WARN_ON_ONCE(ieee80211_vif_is_mld(&sdata->vif)))
3233 if (!ieee80211_sdata_running(sdata))
3236 sdata_lock(sdata);
3241 mutex_lock(&sdata->local->mtx);
3243 if (sdata->local->tmp_channel || sdata->local->scanning) {
3244 mutex_unlock(&sdata->local->mtx);
3248 if (sdata->local->suspending) {
3250 mutex_unlock(&sdata->local->mtx);
3251 ieee80211_reset_ap_probe(sdata);
3256 mlme_dbg_ratelimited(sdata,
3260 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL);
3279 mutex_unlock(&sdata->local->mtx);
3284 mutex_lock(&sdata->local->iflist_mtx);
3285 ieee80211_recalc_ps(sdata->local);
3286 mutex_unlock(&sdata->local->iflist_mtx);
3289 ieee80211_mgd_probe_ap_send(sdata);
3291 sdata_unlock(sdata);
3297 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3298 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3304 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION ||
3305 ieee80211_vif_is_mld(&sdata->vif)))
3308 sdata_assert_lock(sdata);
3311 cbss = sdata->deflink.u.mgd.bss;
3328 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid,
3338 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata,
3349 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len, reconnect);
3351 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len);
3353 drv_event_callback(sdata->local, sdata, &event);
3356 static void ___ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
3358 struct ieee80211_local *local = sdata->local;
3359 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3367 tx = ieee80211_vif_is_mld(&sdata->vif) ||
3368 !sdata->deflink.csa_block_tx;
3381 link_id < ARRAY_SIZE(sdata->link);
3385 link = sdata_dereference(sdata->link[link_id], sdata);
3393 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
3400 sdata->vif.bss_conf.csa_active = false;
3401 sdata->deflink.u.mgd.csa_waiting_bcn = false;
3402 if (sdata->deflink.csa_block_tx) {
3403 ieee80211_wake_vif_queues(local, sdata,
3405 sdata->deflink.csa_block_tx = false;
3409 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx,
3415 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
3417 sdata_lock(sdata);
3418 ___ieee80211_disconnect(sdata);
3419 sdata_unlock(sdata);
3425 struct ieee80211_sub_if_data *sdata =
3428 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3431 sdata_info(sdata, "Connection to AP %pM lost\n",
3432 sdata->vif.cfg.ap_addr);
3433 __ieee80211_disconnect(sdata);
3436 sdata_info(sdata,
3438 sdata->vif.cfg.ap_addr);
3439 __ieee80211_disconnect(sdata);
3443 sdata->deflink.u.mgd.beacon_loss_count++;
3444 ieee80211_mgd_probe_ap(sdata, true);
3451 struct ieee80211_sub_if_data *sdata =
3455 __ieee80211_disconnect(sdata);
3460 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3461 struct ieee80211_hw *hw = &sdata->local->hw;
3463 trace_api_beacon_loss(sdata);
3465 sdata->u.mgd.connection_loss = false;
3466 wiphy_work_queue(hw->wiphy, &sdata->u.mgd.beacon_connection_loss_work);
3472 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3473 struct ieee80211_hw *hw = &sdata->local->hw;
3475 trace_api_connection_loss(sdata);
3477 sdata->u.mgd.connection_loss = true;
3478 wiphy_work_queue(hw->wiphy, &sdata->u.mgd.beacon_connection_loss_work);
3484 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3485 struct ieee80211_hw *hw = &sdata->local->hw;
3487 trace_api_disconnect(sdata, reconnect);
3489 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
3492 sdata->u.mgd.driver_disconnect = true;
3493 sdata->u.mgd.reconnect = reconnect;
3494 wiphy_work_queue(hw->wiphy, &sdata->u.mgd.beacon_connection_loss_work);
3498 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata,
3501 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data;
3503 sdata_assert_lock(sdata);
3511 del_timer_sync(&sdata->u.mgd.timer);
3512 sta_info_destroy_addr(sdata, auth_data->ap_addr);
3515 sdata->deflink.u.mgd.conn_flags = 0;
3516 eth_zero_addr(sdata->deflink.u.mgd.bssid);
3517 ieee80211_link_info_change_notify(sdata, &sdata->deflink,
3519 sdata->u.mgd.flags = 0;
3521 mutex_lock(&sdata->local->mtx);
3522 ieee80211_link_release_channel(&sdata->deflink);
3523 ieee80211_vif_set_links(sdata, 0, 0);
3524 mutex_unlock(&sdata->local->mtx);
3527 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss);
3529 sdata->u.mgd.auth_data = NULL;
3539 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
3542 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
3544 sdata_assert_lock(sdata);
3552 del_timer_sync(&sdata->u.mgd.timer);
3553 sta_info_destroy_addr(sdata, assoc_data->ap_addr);
3555 sdata->deflink.u.mgd.conn_flags = 0;
3556 eth_zero_addr(sdata->deflink.u.mgd.bssid);
3557 ieee80211_link_info_change_notify(sdata, &sdata->deflink,
3559 sdata->u.mgd.flags = 0;
3560 sdata->vif.bss_conf.mu_mimo_owner = false;
3574 if (ieee80211_vif_is_mld(&sdata->vif))
3577 cfg80211_assoc_failure(sdata->dev, &data);
3580 mutex_lock(&sdata->local->mtx);
3581 ieee80211_link_release_channel(&sdata->deflink);
3582 ieee80211_vif_set_links(sdata, 0, 0);
3583 mutex_unlock(&sdata->local->mtx);
3587 sdata->u.mgd.assoc_data = NULL;
3590 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
3593 struct ieee80211_local *local = sdata->local;
3594 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data;
3608 drv_mgd_prepare_tx(sdata->local, sdata, &info);
3612 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0,
3620 static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata)
3622 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3627 sdata_info(sdata, "authenticated\n");
3631 run_again(sdata, ifmgd->auth_data->timeout);
3634 mutex_lock(&sdata->local->sta_mtx);
3635 sta = sta_info_get(sdata, ap_addr);
3637 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, ap_addr);
3642 sdata_info(sdata, "failed moving %pM to auth\n", ap_addr);
3648 mutex_unlock(&sdata->local->sta_mtx);
3652 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
3655 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3665 sdata_assert_lock(sdata);
3686 sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected %d)\n",
3694 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
3706 run_again(sdata, ifmgd->auth_data->timeout);
3710 sdata_info(sdata, "%pM denied authentication (status %d)\n",
3712 ieee80211_destroy_auth_data(sdata, false);
3715 drv_event_callback(sdata->local, sdata, &event);
3730 ieee80211_auth_challenge(sdata, mgmt, len);
3743 drv_event_callback(sdata->local, sdata, &event);
3747 if (!ieee80211_mark_sta_auth(sdata))
3751 sdata_info(sdata, "SAE peer confirmed\n");
3755 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
3757 drv_mgd_complete_tx(sdata->local, sdata, &info);
3817 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
3820 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3823 sdata_assert_lock(sdata);
3829 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code);
3834 ether_addr_equal(mgmt->bssid, sdata->vif.cfg.ap_addr)) {
3835 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n",
3836 sdata->vif.cfg.ap_addr, reason_code,
3839 ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
3841 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false,
3848 sdata_info(sdata,
3853 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON);
3855 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
3861 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
3864 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3867 sdata_assert_lock(sdata);
3873 !ether_addr_equal(mgmt->bssid, sdata->vif.cfg.ap_addr))
3879 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code);
3883 sdata_info(sdata, "disassociated from %pM (Reason: %u=%s)\n",
3884 sdata->vif.cfg.ap_addr, reason_code,
3887 ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
3889 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code,
3945 static bool ieee80211_twt_req_supported(struct ieee80211_sub_if_data *sdata,
3951 ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
3966 static u64 ieee80211_recalc_twt_req(struct ieee80211_sub_if_data *sdata,
3972 bool twt = ieee80211_twt_req_supported(sdata, sband, link_sta, elems);
3981 static bool ieee80211_twt_bcast_support(struct ieee80211_sub_if_data *sdata,
3987 ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
4005 struct ieee80211_sub_if_data *sdata = link->sdata;
4006 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
4008 struct ieee80211_local *local = sdata->local;
4073 sdata_info(sdata, "no SuppRates element in AssocResp\n");
4121 sdata_info(sdata,
4132 sdata_info(sdata,
4138 sdata_info(sdata,
4144 sdata_info(sdata,
4150 sdata_info(sdata,
4163 sdata_info(sdata,
4171 sdata_info(sdata,
4179 sdata_info(sdata,
4193 sdata_info(sdata,
4201 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
4227 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
4235 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband,
4250 *changed |= ieee80211_recalc_twt_req(sdata, sband, link,
4255 ieee80211_eht_cap_ie_to_sta_eht_cap(sdata, sband,
4275 ieee80211_twt_bcast_support(sdata, bss_conf, sband, link_sta);
4302 ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems->he_operation);
4303 ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems->he_spr);
4391 struct ieee80211_sub_if_data *sdata = link->sdata;
4392 struct ieee80211_local *local = sdata->local;
4398 int shift = ieee80211_vif_get_shift(&sdata->vif);
4547 ieee80211_verify_peer_he_mcs_support(struct ieee80211_sub_if_data *sdata,
4567 sdata_info(sdata,
4578 sdata_info(sdata,
4599 sdata_info(sdata,
4645 sdata_info(sdata,
4656 ieee80211_verify_sta_he_mcs_support(struct ieee80211_sub_if_data *sdata,
4661 ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
4772 ieee80211_verify_sta_eht_mcs_support(struct ieee80211_sub_if_data *sdata,
4777 ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
4779 ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif);
4817 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
4822 struct ieee80211_local *local = sdata->local;
4863 mlme_dbg(sdata, "HT not supported, disabling HT/VHT/HE/EHT\n");
4871 mlme_dbg(sdata, "VHT not supported, disabling VHT/HE/EHT\n");
4877 if (!ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif)) {
4878 mlme_dbg(sdata, "HE not supported, disabling HE and EHT\n");
4883 if (!ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif)) {
4884 mlme_dbg(sdata, "EHT not supported, disabling EHT\n");
4902 sdata_info(sdata,
4943 if (!ieee80211_verify_peer_he_mcs_support(sdata, ies, he_oper) ||
4944 !ieee80211_verify_sta_he_mcs_support(sdata, sband, he_oper))
4972 if (!ieee80211_verify_sta_eht_mcs_support(sdata, sband, eht_oper))
4984 sdata->vif.cfg.eml_cap =
4986 sdata->vif.cfg.eml_med_sync_delay =
5003 sdata_info(sdata, "80 MHz not supported, disabling VHT\n");
5010 sdata_info(sdata,
5015 ieee80211_determine_chantype(sdata, link, *conn_flags,
5035 sdata_info(sdata, "Rejecting non-HE 6/7 GHz connection");
5104 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
5109 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
5111 struct ieee80211_local *local = sdata->local;
5118 mutex_lock(&sdata->local->sta_mtx);
5123 sta = sta_info_get(sdata, assoc_data->ap_addr);
5127 if (ieee80211_vif_is_mld(&sdata->vif)) {
5143 ieee80211_vif_set_links(sdata, valid_links, dormant_links);
5154 link = sdata_dereference(sdata->link[link_id], sdata);
5158 if (ieee80211_vif_is_mld(&sdata->vif))
5190 err = ieee80211_prep_channel(sdata, link, cbss,
5223 ieee80211_vif_set_links(sdata, valid_links, dormant_links);
5244 sdata_info(sdata,
5251 if (sdata->wdev.use_4addr)
5252 drv_sta_set_4addr(local, sdata, &sta->sta, true);
5254 mutex_unlock(&sdata->local->sta_mtx);
5256 ieee80211_set_associated(sdata, assoc_data, changed);
5263 ieee80211_send_4addr_nullfunc(local, sdata);
5269 ieee80211_sta_reset_beacon_monitor(sdata);
5270 ieee80211_sta_reset_conn_monitor(sdata);
5274 eth_zero_addr(sdata->vif.cfg.ap_addr);
5275 mutex_unlock(&sdata->local->sta_mtx);
5279 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
5283 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
5307 sdata_assert_lock(sdata);
5342 fils_decrypt_assoc_resp(sdata, (u8 *)mgmt, &len, assoc_data) < 0)
5365 sdata_info(sdata,
5377 cfg80211_assoc_comeback(sdata->dev, assoc_data->ap_addr,
5382 sdata_info(sdata,
5388 run_again(sdata, assoc_data->timeout);
5393 sdata_info(sdata, "%pM denied association (code=%d)\n",
5397 drv_event_callback(sdata->local, sdata, &event);
5400 sdata_info(sdata,
5407 if (ieee80211_vif_is_mld(&sdata->vif)) {
5409 sdata_info(sdata,
5418 sdata_info(sdata,
5429 sdata_info(sdata,
5438 sdata->vif.cfg.aid = aid;
5440 if (!ieee80211_assoc_success(sdata, mgmt, elems,
5443 ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT);
5447 drv_event_callback(sdata->local, sdata, &event);
5448 sdata_info(sdata, "associated\n");
5464 link = sdata_dereference(sdata->link[link_id], sdata);
5475 if (ieee80211_vif_is_mld(&sdata->vif)) {
5476 ether_addr_copy(ap_mld_addr, sdata->vif.cfg.ap_addr);
5480 ieee80211_destroy_assoc_data(sdata,
5489 cfg80211_rx_assoc_resp(sdata->dev, &resp);
5491 drv_mgd_complete_tx(sdata->local, sdata, &info);
5495 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON);
5503 struct ieee80211_sub_if_data *sdata = link->sdata;
5504 struct ieee80211_local *local = sdata->local;
5508 sdata_assert_lock(sdata);
5526 struct ieee80211_sub_if_data *sdata = link->sdata;
5533 ifmgd = &sdata->u.mgd;
5535 sdata_assert_lock(sdata);
5544 channel = ieee80211_get_channel(sdata->local->hw.wiphy,
5549 if (!ether_addr_equal(mgmt->da, sdata->vif.addr) &&
5562 ieee80211_reset_ap_probe(sdata);
5595 struct ieee80211_sub_if_data *sdata = link->sdata;
5628 drv_event_callback(local, sdata, &event);
5634 drv_event_callback(local, sdata, &event);
5640 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) {
5650 &sdata->vif,
5657 &sdata->vif,
5674 &sdata->vif,
5681 &sdata->vif,
5740 struct ieee80211_sub_if_data *sdata =
5746 sdata_lock(sdata);
5747 if (!sdata->u.mgd.removed_links) {
5748 sdata_unlock(sdata);
5752 sdata_info(sdata,
5754 sdata->vif.valid_links, sdata->u.mgd.removed_links);
5756 new_valid_links = sdata->vif.valid_links & ~sdata->u.mgd.removed_links;
5757 if (new_valid_links == sdata->vif.valid_links) {
5758 sdata_unlock(sdata);
5763 !(new_valid_links & ~sdata->vif.dormant_links)) {
5764 sdata_info(sdata, "No valid links after reconfiguration\n");
5769 new_active_links = sdata->vif.active_links & ~sdata->u.mgd.removed_links;
5770 if (new_active_links != sdata->vif.active_links) {
5774 ~sdata->vif.dormant_links) - 1);
5776 ret = __ieee80211_set_active_links(&sdata->vif,
5779 sdata_info(sdata,
5785 new_dormant_links = sdata->vif.dormant_links & ~sdata->u.mgd.removed_links;
5787 ret = ieee80211_vif_set_links(sdata, new_valid_links,
5790 sdata_info(sdata, "Failed setting valid links\n");
5794 cfg80211_links_removed(sdata->dev, sdata->u.mgd.removed_links);
5796 ___ieee80211_disconnect(sdata);
5798 sdata->u.mgd.removed_links = 0;
5800 sdata_unlock(sdata);
5803 static void ieee80211_ml_reconfiguration(struct ieee80211_sub_if_data *sdata,
5814 if (!ieee80211_vif_is_mld(&sdata->vif) || !elems->ml_reconf)
5865 removed_links &= sdata->vif.valid_links;
5868 if (sdata->u.mgd.removed_links) {
5869 sdata->u.mgd.removed_links = 0;
5870 wiphy_delayed_work_cancel(sdata->local->hw.wiphy,
5871 &sdata->u.mgd.ml_reconf_work);
5879 sdata_dereference(sdata->vif.link_conf[link_id], sdata);
5896 sdata->u.mgd.removed_links = removed_links;
5897 wiphy_delayed_work_queue(sdata->local->hw.wiphy,
5898 &sdata->u.mgd.ml_reconf_work,
5906 struct ieee80211_sub_if_data *sdata = link->sdata;
5907 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
5908 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
5909 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg;
5913 struct ieee80211_local *local = sdata->local;
5930 sdata_assert_lock(sdata);
5933 bssid = ieee80211_get_bssid(hdr, len, sdata->vif.type);
5966 !WARN_ON(ieee80211_vif_is_mld(&sdata->vif)) &&
6002 run_again(sdata, ifmgd->assoc_data->timeout);
6017 mlme_dbg_ratelimited(sdata,
6019 ieee80211_reset_ap_probe(sdata);
6026 ieee80211_sta_reset_beacon_monitor(sdata);
6051 ieee80211_send_nullfunc(local, sdata, false);
6052 } else if (!local->pspolling && sdata->u.mgd.powersave) {
6063 ieee80211_send_pspoll(local, sdata);
6067 if (sdata->vif.p2p ||
6068 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) {
6150 ieee80211_recalc_ps_vif(sdata);
6166 sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
6183 changed |= ieee80211_recalc_twt_req(sdata, sband, link, link_sta, elems);
6191 sdata_info(sdata,
6194 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
6197 ieee80211_report_disconnect(sdata, deauth_buf,
6205 ieee80211_vht_handle_opmode(sdata, link_sta,
6220 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
6223 ieee80211_report_disconnect(sdata, deauth_buf,
6231 ieee80211_ml_reconfiguration(sdata, elems);
6233 ieee80211_link_info_change_notify(sdata, link, changed);
6238 void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata,
6241 struct ieee80211_link_data *link = &sdata->deflink;
6250 sdata_lock(sdata);
6256 sdata_unlock(sdata);
6259 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
6262 struct ieee80211_link_data *link = &sdata->deflink;
6272 sdata_lock(sdata);
6275 link = sdata_dereference(sdata->link[rx_status->link_id],
6276 sdata);
6290 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len);
6293 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len);
6296 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len);
6300 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len);
6303 if (!sdata->u.mgd.associated ||
6304 !ether_addr_equal(mgmt->bssid, sdata->vif.cfg.ap_addr))
6362 sdata_unlock(sdata);
6367 struct ieee80211_sub_if_data *sdata =
6368 from_timer(sdata, t, u.mgd.timer);
6370 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work);
6373 void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
6378 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason,
6381 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
6385 static int ieee80211_auth(struct ieee80211_sub_if_data *sdata)
6387 struct ieee80211_local *local = sdata->local;
6388 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
6397 sdata_assert_lock(sdata);
6405 sdata_info(sdata, "authentication with %pM timed out\n",
6420 drv_mgd_prepare_tx(local, sdata, &info);
6422 sdata_info(sdata, "send auth to %pM (try %d/%d)\n",
6438 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status,
6455 run_again(sdata, auth_data->timeout);
6460 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata)
6462 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
6463 struct ieee80211_local *local = sdata->local;
6466 sdata_assert_lock(sdata);
6470 sdata_info(sdata, "association with %pM timed out\n",
6483 sdata_info(sdata, "associate with %pM (try %d/%d)\n",
6486 ret = ieee80211_send_assoc(sdata);
6493 run_again(sdata, assoc_data->timeout);
6499 run_again(sdata, assoc_data->timeout);
6505 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata,
6508 struct ieee80211_local *local = sdata->local;
6510 sdata->u.mgd.status_fc = fc;
6511 sdata->u.mgd.status_acked = acked;
6512 sdata->u.mgd.status_received = true;
6514 wiphy_work_queue(local->hw.wiphy, &sdata->work);
6517 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
6519 struct ieee80211_local *local = sdata->local;
6520 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
6522 sdata_lock(sdata);
6540 run_again(sdata, ifmgd->auth_data->timeout);
6551 run_again(sdata, ifmgd->assoc_data->timeout);
6566 ieee80211_destroy_auth_data(sdata, false);
6567 } else if (ieee80211_auth(sdata)) {
6577 ieee80211_destroy_auth_data(sdata, false);
6579 cfg80211_auth_timeout(sdata->dev, ap_addr);
6580 drv_event_callback(sdata->local, sdata, &event);
6583 run_again(sdata, ifmgd->auth_data->timeout);
6588 !sdata->deflink.u.mgd.have_beacon) ||
6589 ieee80211_do_assoc(sdata)) {
6596 ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT);
6597 drv_event_callback(sdata->local, sdata, &event);
6600 run_again(sdata, ifmgd->assoc_data->timeout);
6604 u8 *bssid = sdata->deflink.u.mgd.bssid;
6614 ieee80211_reset_ap_probe(sdata);
6617 mlme_dbg(sdata,
6621 ieee80211_mgd_probe_ap_send(sdata);
6623 mlme_dbg(sdata,
6626 ieee80211_sta_connection_lost(sdata,
6631 run_again(sdata, ifmgd->probe_timeout);
6633 mlme_dbg(sdata,
6636 ieee80211_sta_connection_lost(sdata,
6639 mlme_dbg(sdata,
6643 ieee80211_mgd_probe_ap_send(sdata);
6649 mlme_dbg(sdata,
6653 ieee80211_sta_connection_lost(sdata,
6658 sdata_unlock(sdata);
6663 struct ieee80211_sub_if_data *sdata =
6664 from_timer(sdata, t, u.mgd.bcn_mon_timer);
6666 if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif)))
6669 if (sdata->vif.bss_conf.csa_active &&
6670 !sdata->deflink.u.mgd.csa_waiting_bcn)
6673 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)
6676 sdata->u.mgd.connection_loss = false;
6677 wiphy_work_queue(sdata->local->hw.wiphy,
6678 &sdata->u.mgd.beacon_connection_loss_work);
6683 struct ieee80211_sub_if_data *sdata =
6684 from_timer(sdata, t, u.mgd.conn_mon_timer);
6685 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
6686 struct ieee80211_local *local = sdata->local;
6690 if (WARN_ON(ieee80211_vif_is_mld(&sdata->vif)))
6693 if (sdata->vif.bss_conf.csa_active &&
6694 !sdata->deflink.u.mgd.csa_waiting_bcn)
6697 sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
6719 struct ieee80211_sub_if_data *sdata =
6723 ieee80211_mgd_probe_ap(sdata, false);
6726 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
6728 if (sdata->vif.type == NL80211_IFTYPE_STATION) {
6729 __ieee80211_stop_poll(sdata);
6732 if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
6733 ieee80211_queue_work(&sdata->local->hw,
6734 &sdata->u.mgd.monitor_work);
6739 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata)
6741 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
6744 sdata_lock(sdata);
6756 ieee80211_send_deauth_disassoc(sdata, ap_addr, ap_addr,
6761 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON);
6763 ieee80211_destroy_auth_data(sdata, false);
6764 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
6786 if (ifmgd->associated && !sdata->local->wowlan) {
6793 memcpy(bssid, sdata->vif.cfg.ap_addr, ETH_ALEN);
6794 ieee80211_mgd_deauth(sdata, &req);
6797 sdata_unlock(sdata);
6801 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata)
6803 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
6805 sdata_lock(sdata);
6807 sdata_unlock(sdata);
6811 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) {
6812 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME;
6813 mlme_dbg(sdata, "driver requested disconnect after resume\n");
6814 ieee80211_sta_connection_lost(sdata,
6817 sdata_unlock(sdata);
6821 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_HW_RESTART) {
6822 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_HW_RESTART;
6823 mlme_dbg(sdata, "driver requested disconnect after hardware restart\n");
6824 ieee80211_sta_connection_lost(sdata,
6827 sdata_unlock(sdata);
6831 sdata_unlock(sdata);
6841 sdata_lock(link->sdata);
6842 __ieee80211_request_smps_mgd(link->sdata, link,
6844 sdata_unlock(link->sdata);
6848 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
6850 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
6868 ifmgd->powersave = sdata->wdev.ps;
6869 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues;
6870 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len;
6879 struct ieee80211_sub_if_data *sdata = link->sdata;
6880 struct ieee80211_local *local = sdata->local;
6897 if (sdata->u.mgd.assoc_data)
6899 sdata->u.mgd.assoc_data->link[link_id].addr);
6907 struct ieee80211_sub_if_data *sdata;
6911 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
6912 if (ieee80211_sdata_running(sdata))
6913 ieee80211_restart_sta_timer(sdata);
6918 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
6923 struct ieee80211_local *local = sdata->local;
6924 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
6936 err = ieee80211_vif_set_links(sdata, BIT(link_id), 0);
6941 err = ieee80211_vif_set_links(sdata, 0, 0);
6949 link = sdata_dereference(sdata->link[link_id], sdata);
6968 have_sta = sta_info_get(sdata, ap_mld_addr);
6974 new_sta = sta_info_alloc_with_link(sdata, ap_mld_addr,
6978 new_sta = sta_info_alloc(sdata, ap_mld_addr, GFP_KERNEL);
7035 } else if (!ieee80211_hw_check(&sdata->local->hw,
7052 err = ieee80211_prep_channel(sdata, link, cbss,
7066 ieee80211_link_info_change_notify(sdata, link,
7077 sdata_info(sdata,
7092 ieee80211_link_release_channel(&sdata->deflink);
7093 ieee80211_vif_set_links(sdata, 0, 0);
7098 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
7101 struct ieee80211_local *local = sdata->local;
7102 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
7196 ieee80211_destroy_auth_data(sdata, cont_auth);
7209 ieee80211_mark_sta_auth(sdata);
7214 sdata_info(sdata,
7216 sdata->vif.cfg.ap_addr, auth_data->ap_addr);
7217 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
7221 ieee80211_report_disconnect(sdata, frame_buf,
7227 sdata_info(sdata, "authenticate with %pM\n", auth_data->ap_addr);
7230 memcpy(sdata->vif.cfg.ap_addr, auth_data->ap_addr, ETH_ALEN);
7232 err = ieee80211_prep_connection(sdata, req->bss, req->link_id,
7237 err = ieee80211_auth(sdata);
7239 sta_info_destroy_addr(sdata, auth_data->ap_addr);
7248 if (!ieee80211_vif_is_mld(&sdata->vif)) {
7249 eth_zero_addr(sdata->deflink.u.mgd.bssid);
7250 ieee80211_link_info_change_notify(sdata, &sdata->deflink,
7252 mutex_lock(&sdata->local->mtx);
7253 ieee80211_link_release_channel(&sdata->deflink);
7254 mutex_unlock(&sdata->local->mtx);
7262 ieee80211_setup_assoc_link(struct ieee80211_sub_if_data *sdata,
7268 struct ieee80211_local *local = sdata->local;
7287 link = sdata_dereference(sdata->link[link_id], sdata);
7338 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap);
7353 sdata->deflink.u.mgd.have_beacon = true;
7414 sdata_info(sdata, "associating to AP %pM with corrupt %s\n",
7419 if (sdata->u.mgd.powersave)
7430 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
7434 struct ieee80211_local *local = sdata->local;
7435 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
7438 struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg;
7451 if (sdata->u.mgd.use_4addr && req->link_id >= 0)
7477 link = sdata_dereference(sdata->link[i], sdata);
7485 memcpy(assoc_data->link[0].addr, sdata->vif.addr, ETH_ALEN);
7497 sdata_info(sdata,
7499 sdata->vif.cfg.ap_addr, assoc_data->ap_addr);
7500 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
7504 ieee80211_report_disconnect(sdata, frame_buf,
7527 ieee80211_destroy_auth_data(sdata, match);
7551 netdev_info(sdata->dev,
7562 netdev_info(sdata->dev,
7567 mlme_dbg(sdata, "HT disabled by flag, disabling HT/VHT/HE\n");
7575 mlme_dbg(sdata, "VHT disabled by flag, disabling VHT\n");
7580 mlme_dbg(sdata, "HE disabled by flag, disabling HE/EHT\n");
7637 err = ieee80211_vif_set_links(sdata, BIT(assoc_link_id), 0);
7645 link = sdata_dereference(sdata->link[assoc_link_id], sdata);
7653 conn_flags |= ieee80211_setup_assoc_link(sdata, assoc_data, req,
7658 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) &&
7661 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD;
7664 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) {
7693 sdata->control_port_protocol = req->crypto.control_port_ethertype;
7694 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt;
7695 sdata->control_port_over_nl80211 =
7697 sdata->control_port_no_preauth = req->crypto.control_port_no_preauth;
7708 err = ieee80211_prep_channel(sdata, NULL, assoc_data->link[i].bss,
7715 memcpy(sdata->vif.cfg.ap_addr, assoc_data->ap_addr, ETH_ALEN);
7717 err = ieee80211_prep_connection(sdata, cbss, req->link_id,
7725 if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC)) {
7735 sdata_info(sdata, "waiting for beacon from %pM\n",
7744 run_again(sdata, assoc_data->timeout);
7748 eth_zero_addr(sdata->deflink.u.mgd.bssid);
7749 ieee80211_link_info_change_notify(sdata, &sdata->deflink,
7757 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
7760 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
7769 sdata_info(sdata,
7774 drv_mgd_prepare_tx(sdata->local, sdata, &info);
7775 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid,
7779 ieee80211_destroy_auth_data(sdata, false);
7780 ieee80211_report_disconnect(sdata, frame_buf,
7783 drv_mgd_complete_tx(sdata->local, sdata, &info);
7789 sdata_info(sdata,
7794 drv_mgd_prepare_tx(sdata->local, sdata, &info);
7795 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid,
7799 ieee80211_destroy_assoc_data(sdata, ASSOC_ABANDON);
7800 ieee80211_report_disconnect(sdata, frame_buf,
7803 drv_mgd_complete_tx(sdata->local, sdata, &info);
7808 ether_addr_equal(sdata->vif.cfg.ap_addr, req->bssid)) {
7809 sdata_info(sdata,
7814 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
7816 ieee80211_report_disconnect(sdata, frame_buf,
7819 drv_mgd_complete_tx(sdata->local, sdata, &info);
7826 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
7831 if (!sdata->u.mgd.associated ||
7832 memcmp(sdata->vif.cfg.ap_addr, req->ap_addr, ETH_ALEN))
7835 sdata_info(sdata,
7840 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC,
7844 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
7852 wiphy_work_cancel(link->sdata->local->hw.wiphy,
7854 wiphy_delayed_work_cancel(link->sdata->local->hw.wiphy,
7858 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
7860 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
7868 wiphy_work_cancel(sdata->local->hw.wiphy,
7870 wiphy_work_cancel(sdata->local->hw.wiphy,
7873 wiphy_delayed_work_cancel(sdata->local->hw.wiphy,
7876 sdata_lock(sdata);
7878 ieee80211_destroy_assoc_data(sdata, ASSOC_TIMEOUT);
7880 ieee80211_destroy_auth_data(sdata, false);
7892 sdata_unlock(sdata);
7900 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
7902 trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level);
7904 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp);
7910 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
7912 trace_api_cqm_beacon_loss_notify(sdata->local, sdata);
7914 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp);
7918 static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata,
7922 trace_api_enable_rssi_reports(sdata, rssi_min_thold, rssi_max_thold);
7924 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
7932 sdata->u.mgd.rssi_min_thold = rssi_min_thold*16;
7933 sdata->u.mgd.rssi_max_thold = rssi_max_thold*16;
7940 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
7945 _ieee80211_enable_rssi_reports(sdata, rssi_min_thold,
7952 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
7954 _ieee80211_enable_rssi_reports(sdata, 0, 0);