Lines Matching refs:sdata
99 static void run_again(struct ieee80211_sub_if_data *sdata, in run_again() argument
102 sdata_assert_lock(sdata); in run_again()
104 if (!timer_pending(&sdata->u.mgd.timer) || in run_again()
105 time_before(timeout, sdata->u.mgd.timer.expires)) in run_again()
106 mod_timer(&sdata->u.mgd.timer, timeout); in run_again()
109 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_beacon_monitor() argument
111 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_reset_beacon_monitor()
114 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_beacon_monitor()
117 mod_timer(&sdata->u.mgd.bcn_mon_timer, in ieee80211_sta_reset_beacon_monitor()
118 round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout)); in ieee80211_sta_reset_beacon_monitor()
121 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_conn_monitor() argument
123 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_reset_conn_monitor()
125 if (unlikely(!sdata->u.mgd.associated)) in ieee80211_sta_reset_conn_monitor()
130 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_conn_monitor()
133 mod_timer(&sdata->u.mgd.conn_mon_timer, in ieee80211_sta_reset_conn_monitor()
143 ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, in ieee80211_determine_chantype() argument
151 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_determine_chantype()
157 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_determine_chantype()
189 sdata_info(sdata, in ieee80211_determine_chantype()
248 sdata_info(sdata, in ieee80211_determine_chantype()
257 sdata_info(sdata, in ieee80211_determine_chantype()
270 sdata_info(sdata, in ieee80211_determine_chantype()
300 cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_determine_chantype()
315 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, in ieee80211_determine_chantype()
328 sdata_info(sdata, in ieee80211_determine_chantype()
335 static int ieee80211_config_bw(struct ieee80211_sub_if_data *sdata, in ieee80211_config_bw() argument
342 struct ieee80211_local *local = sdata->local; in ieee80211_config_bw()
343 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_config_bw()
368 if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) { in ieee80211_config_bw()
370 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; in ieee80211_config_bw()
373 chan = sdata->vif.bss_conf.chandef.chan; in ieee80211_config_bw()
377 flags = ieee80211_determine_chantype(sdata, sband, chan, in ieee80211_config_bw()
398 if (cfg80211_chandef_identical(&chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_config_bw()
401 sdata_info(sdata, in ieee80211_config_bw()
412 sdata_info(sdata, in ieee80211_config_bw()
446 ret = ieee80211_vif_change_bandwidth(sdata, &chandef, changed); in ieee80211_config_bw()
448 sdata_info(sdata, in ieee80211_config_bw()
465 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
479 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
504 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_40MHZ) { in ieee80211_add_ht_ie()
538 static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
543 struct ieee80211_local *local = sdata->local; in ieee80211_add_vht_ie()
552 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
557 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_80P80MHZ) { in ieee80211_add_vht_ie()
566 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_160MHZ) { in ieee80211_add_vht_ie()
603 sdata->flags |= IEEE80211_SDATA_MU_MIMO_OWNER; in ieee80211_add_vht_ie()
621 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
623 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
624 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
637 sdata_assert_lock(sdata); in ieee80211_send_assoc()
640 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_send_assoc()
649 shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_send_assoc()
714 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
844 ieee80211_add_ht_ie(sdata, skb, assoc_data->ap_ht_param, in ieee80211_send_assoc()
845 sband, chan, sdata->smps_mode); in ieee80211_send_assoc()
878 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_send_assoc()
910 drv_mgd_prepare_tx(local, sdata); in ieee80211_send_assoc()
916 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
920 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
925 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
933 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
937 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
942 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
944 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif); in ieee80211_send_nullfunc()
961 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
965 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
971 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
985 memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
986 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
987 memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
988 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
991 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
997 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_work() local
999 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
1000 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
1003 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
1006 sdata_lock(sdata); in ieee80211_chswitch_work()
1013 if (!sdata->vif.csa_active) in ieee80211_chswitch_work()
1023 if (sdata->reserved_chanctx) { in ieee80211_chswitch_work()
1029 if (sdata->reserved_ready) in ieee80211_chswitch_work()
1032 ret = ieee80211_vif_use_reserved_context(sdata); in ieee80211_chswitch_work()
1034 sdata_info(sdata, in ieee80211_chswitch_work()
1037 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1045 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in ieee80211_chswitch_work()
1046 &sdata->csa_chandef)) { in ieee80211_chswitch_work()
1047 sdata_info(sdata, in ieee80211_chswitch_work()
1049 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1055 ifmgd->associated->channel = sdata->csa_chandef.chan; in ieee80211_chswitch_work()
1059 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_chswitch_work()
1060 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_chswitch_work()
1065 sdata_unlock(sdata); in ieee80211_chswitch_work()
1068 static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata) in ieee80211_chswitch_post_beacon() argument
1070 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_post_beacon()
1071 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_post_beacon()
1074 sdata_assert_lock(sdata); in ieee80211_chswitch_post_beacon()
1076 WARN_ON(!sdata->vif.csa_active); in ieee80211_chswitch_post_beacon()
1078 if (sdata->csa_block_tx) { in ieee80211_chswitch_post_beacon()
1079 ieee80211_wake_vif_queues(local, sdata, in ieee80211_chswitch_post_beacon()
1081 sdata->csa_block_tx = false; in ieee80211_chswitch_post_beacon()
1084 sdata->vif.csa_active = false; in ieee80211_chswitch_post_beacon()
1087 ret = drv_post_channel_switch(sdata); in ieee80211_chswitch_post_beacon()
1089 sdata_info(sdata, in ieee80211_chswitch_post_beacon()
1096 cfg80211_ch_switch_notify(sdata->dev, &sdata->reserved_chandef); in ieee80211_chswitch_post_beacon()
1101 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
1102 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
1104 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
1106 sdata_info(sdata, in ieee80211_chswitch_done()
1108 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1111 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); in ieee80211_chswitch_done()
1118 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_timer() local
1121 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work); in ieee80211_chswitch_timer()
1125 ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_process_chanswitch() argument
1130 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1131 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1140 sdata_assert_lock(sdata); in ieee80211_sta_process_chanswitch()
1149 if (sdata->vif.csa_active) in ieee80211_sta_process_chanswitch()
1154 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band, in ieee80211_sta_process_chanswitch()
1165 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1177 &sdata->vif.bss_conf.chandef)) { in ieee80211_sta_process_chanswitch()
1180 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1193 ieee80211_teardown_tdls_peers(sdata); in ieee80211_sta_process_chanswitch()
1197 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in ieee80211_sta_process_chanswitch()
1200 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1209 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1220 if (drv_pre_channel_switch(sdata, &ch_switch)) { in ieee80211_sta_process_chanswitch()
1221 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1226 res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1229 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1236 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1237 sdata->csa_chandef = csa_ie.chandef; in ieee80211_sta_process_chanswitch()
1238 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1241 if (sdata->csa_block_tx) in ieee80211_sta_process_chanswitch()
1242 ieee80211_stop_vif_queues(local, sdata, in ieee80211_sta_process_chanswitch()
1246 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1251 drv_channel_switch(local, sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1270 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_find_80211h_pwr_constr() argument
1331 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata, in ieee80211_find_cisco_dtpc() argument
1345 static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_pwr_constr() argument
1362 sdata, channel, country_ie, country_ie_len, in ieee80211_handle_pwr_constr()
1370 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco); in ieee80211_handle_pwr_constr()
1384 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1387 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1390 sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1394 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1397 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1399 pwr_level_cisco, sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1402 sdata->ap_power_level = new_ap_level; in ieee80211_handle_pwr_constr()
1403 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
1410 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
1427 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_enable_ps()
1452 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
1454 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
1474 sta = sta_info_get(sdata, mgd->bssid); in ieee80211_powersave_allowed()
1485 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
1494 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
1495 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
1497 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
1505 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
1507 found = sdata; in ieee80211_recalc_ps()
1536 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
1538 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
1540 if (sdata->vif.bss_conf.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
1541 sdata->vif.bss_conf.ps = ps_allowed; in ieee80211_recalc_ps_vif()
1542 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
1568 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
1574 if (!sdata) in ieee80211_dynamic_ps_enable_work()
1577 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
1617 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_dynamic_ps_enable_work()
1619 ieee80211_flush_queues(local, sdata, false); in ieee80211_dynamic_ps_enable_work()
1643 struct ieee80211_sub_if_data *sdata = in ieee80211_dfs_cac_timer_work() local
1646 struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef; in ieee80211_dfs_cac_timer_work()
1648 mutex_lock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1649 if (sdata->wdev.cac_started) { in ieee80211_dfs_cac_timer_work()
1650 ieee80211_vif_release_channel(sdata); in ieee80211_dfs_cac_timer_work()
1651 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_dfs_cac_timer_work()
1655 mutex_unlock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1659 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in __ieee80211_sta_handle_tspec_ac_params() argument
1661 struct ieee80211_local *local = sdata->local; in __ieee80211_sta_handle_tspec_ac_params()
1662 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_sta_handle_tspec_ac_params()
1688 if (drv_conf_tx(local, sdata, ac, &sdata->tx_conf[ac])) in __ieee80211_sta_handle_tspec_ac_params()
1689 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1706 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac))) in __ieee80211_sta_handle_tspec_ac_params()
1713 if (drv_conf_tx(local, sdata, ac, in __ieee80211_sta_handle_tspec_ac_params()
1714 &sdata->tx_conf[non_acm_ac])) in __ieee80211_sta_handle_tspec_ac_params()
1715 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1732 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_handle_tspec_ac_params() argument
1734 if (__ieee80211_sta_handle_tspec_ac_params(sdata)) in ieee80211_sta_handle_tspec_ac_params()
1735 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); in ieee80211_sta_handle_tspec_ac_params()
1740 struct ieee80211_sub_if_data *sdata; in ieee80211_sta_handle_tspec_ac_params_wk() local
1742 sdata = container_of(work, struct ieee80211_sub_if_data, in ieee80211_sta_handle_tspec_ac_params_wk()
1744 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_sta_handle_tspec_ac_params_wk()
1749 struct ieee80211_sub_if_data *sdata, in ieee80211_sta_wmm_params() argument
1753 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
1784 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
1794 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
1801 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
1808 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
1816 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
1825 sdata_info(sdata, in ieee80211_sta_wmm_params()
1837 sdata_info(sdata, in ieee80211_sta_wmm_params()
1845 mlme_dbg(sdata, in ieee80211_sta_wmm_params()
1851 sdata->tx_conf[ac] = params[ac]; in ieee80211_sta_wmm_params()
1853 drv_conf_tx(local, sdata, ac, ¶ms[ac])) in ieee80211_sta_wmm_params()
1854 sdata_err(sdata, in ieee80211_sta_wmm_params()
1860 sdata->vif.bss_conf.qos = true; in ieee80211_sta_wmm_params()
1864 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
1866 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
1868 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL; in __ieee80211_stop_poll()
1869 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
1872 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
1874 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
1875 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
1876 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
1879 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_bss_capability() argument
1882 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_handle_bss_capability()
1897 if (ieee80211_get_sdata_band(sdata) == IEEE80211_BAND_5GHZ) in ieee80211_handle_bss_capability()
1918 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
1923 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
1924 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_set_associated()
1927 bss_info_changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_set_associated()
1930 sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec( in ieee80211_set_associated()
1933 sdata->u.mgd.associated = cbss; in ieee80211_set_associated()
1934 memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); in ieee80211_set_associated()
1936 sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE; in ieee80211_set_associated()
1938 if (sdata->vif.p2p) { in ieee80211_set_associated()
1952 sdata->u.mgd.p2p_noa_index = in ieee80211_set_associated()
1961 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
1965 if (sdata->u.mgd.have_beacon) { in ieee80211_set_associated()
1972 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; in ieee80211_set_associated()
1983 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_set_associated()
1991 ieee80211_bss_info_change_notify(sdata, bss_info_changed); in ieee80211_set_associated()
1997 ieee80211_recalc_smps(sdata); in ieee80211_set_associated()
1998 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
2000 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
2003 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
2007 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
2008 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
2011 sdata_assert_lock(sdata); in ieee80211_set_disassoc()
2019 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
2022 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
2036 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
2048 ieee80211_flush_queues(local, sdata, true); in ieee80211_set_disassoc()
2052 ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, stype, in ieee80211_set_disassoc()
2057 ieee80211_flush_queues(local, sdata, false); in ieee80211_set_disassoc()
2063 sta_info_flush(sdata); in ieee80211_set_disassoc()
2066 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
2070 sdata->vif.bss_conf.assoc = false; in ieee80211_set_disassoc()
2073 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
2074 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
2081 sdata->flags &= ~IEEE80211_SDATA_MU_MIMO_OWNER; in ieee80211_set_disassoc()
2083 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
2089 if (sdata->vif.bss_conf.arp_addr_cnt) in ieee80211_set_disassoc()
2092 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
2097 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
2100 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_set_disassoc()
2102 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
2103 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
2104 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
2105 del_timer_sync(&sdata->u.mgd.chswitch_timer); in ieee80211_set_disassoc()
2107 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
2108 sdata->vif.bss_conf.beacon_rate = NULL; in ieee80211_set_disassoc()
2114 ieee80211_vif_release_channel(sdata); in ieee80211_set_disassoc()
2116 sdata->vif.csa_active = false; in ieee80211_set_disassoc()
2119 if (sdata->csa_block_tx) { in ieee80211_set_disassoc()
2120 ieee80211_wake_vif_queues(local, sdata, in ieee80211_set_disassoc()
2122 sdata->csa_block_tx = false; in ieee80211_set_disassoc()
2130 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_set_disassoc()
2133 void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_notify() argument
2147 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_rx_notify()
2150 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
2152 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
2153 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
2159 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
2165 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_reset_ap_probe()
2173 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
2182 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_wmm_ac_notify() argument
2186 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_tx_wmm_ac_notify()
2217 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
2220 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time); in ieee80211_sta_tx_notify()
2226 sdata->u.mgd.probe_send_count > 0) { in ieee80211_sta_tx_notify()
2228 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2230 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
2231 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_tx_notify()
2236 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2239 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
2241 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
2263 if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { in ieee80211_mgd_probe_ap_send()
2265 ieee80211_send_nullfunc(sdata->local, sdata, false); in ieee80211_mgd_probe_ap_send()
2276 ieee80211_send_probe_req(sdata, sdata->vif.addr, dst, in ieee80211_mgd_probe_ap_send()
2284 run_again(sdata, ifmgd->probe_timeout); in ieee80211_mgd_probe_ap_send()
2287 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
2290 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
2293 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
2296 sdata_lock(sdata); in ieee80211_mgd_probe_ap()
2301 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2303 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
2304 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2309 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
2313 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL); in ieee80211_mgd_probe_ap()
2332 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2337 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2338 ieee80211_recalc_ps(sdata->local); in ieee80211_mgd_probe_ap()
2339 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2342 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
2344 sdata_unlock(sdata); in ieee80211_mgd_probe_ap()
2350 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
2351 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
2357 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_ap_probereq_get()
2360 sdata_assert_lock(sdata); in ieee80211_ap_probereq_get()
2378 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, in ieee80211_ap_probereq_get()
2388 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata, in ieee80211_report_disconnect() argument
2399 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2401 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2403 drv_event_callback(sdata->local, sdata, &event); in ieee80211_report_disconnect()
2406 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
2408 struct ieee80211_local *local = sdata->local; in __ieee80211_disconnect()
2409 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_disconnect()
2412 sdata_lock(sdata); in __ieee80211_disconnect()
2414 sdata_unlock(sdata); in __ieee80211_disconnect()
2418 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in __ieee80211_disconnect()
2422 sdata->vif.csa_active = false; in __ieee80211_disconnect()
2424 if (sdata->csa_block_tx) { in __ieee80211_disconnect()
2425 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_disconnect()
2427 sdata->csa_block_tx = false; in __ieee80211_disconnect()
2431 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in __ieee80211_disconnect()
2434 sdata_unlock(sdata); in __ieee80211_disconnect()
2439 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
2442 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
2448 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
2450 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
2452 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
2458 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
2462 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
2467 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
2468 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
2470 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
2472 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
2473 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
2479 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
2480 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
2482 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
2484 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
2485 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
2490 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
2493 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
2495 sdata_assert_lock(sdata); in ieee80211_destroy_auth_data()
2503 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_auth_data()
2504 sta_info_destroy_addr(sdata, auth_data->bss->bssid); in ieee80211_destroy_auth_data()
2506 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_auth_data()
2507 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_auth_data()
2508 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
2509 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2510 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_auth_data()
2511 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2514 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
2516 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
2519 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
2522 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
2524 sdata_assert_lock(sdata); in ieee80211_destroy_assoc_data()
2532 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_assoc_data()
2533 sta_info_destroy_addr(sdata, assoc_data->bss->bssid); in ieee80211_destroy_assoc_data()
2535 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_assoc_data()
2536 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_assoc_data()
2537 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
2538 sdata->flags &= ~IEEE80211_SDATA_MU_MIMO_OWNER; in ieee80211_destroy_assoc_data()
2539 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2540 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_assoc_data()
2541 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2545 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
2548 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
2551 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
2552 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
2562 drv_mgd_prepare_tx(sdata->local, sdata); in ieee80211_auth_challenge()
2566 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
2573 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
2576 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
2585 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_auth()
2604 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
2612 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
2614 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
2615 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2618 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
2630 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
2642 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
2643 sdata_info(sdata, "authenticated\n"); in ieee80211_rx_mgmt_auth()
2647 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_rx_mgmt_auth()
2655 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2660 mutex_lock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2661 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_auth()
2663 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid); in ieee80211_rx_mgmt_auth()
2667 sdata_info(sdata, "failed moving %pM to auth\n", bssid); in ieee80211_rx_mgmt_auth()
2670 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2672 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2675 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2736 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
2739 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
2742 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_deauth()
2751 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_deauth()
2755 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
2757 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, in ieee80211_rx_mgmt_deauth()
2766 sdata_info(sdata, in ieee80211_rx_mgmt_deauth()
2771 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_rx_mgmt_deauth()
2773 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_deauth()
2779 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
2782 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
2785 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_disassoc()
2796 sdata_info(sdata, "disassociated from %pM (Reason: %u)\n", in ieee80211_rx_mgmt_disassoc()
2799 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
2801 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code); in ieee80211_rx_mgmt_disassoc()
2855 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
2859 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
2860 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
2866 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_assoc_success()
2879 sdata_info(sdata, "invalid AID value 0x%x; bits 15:14 not set\n", in ieee80211_assoc_success()
2886 sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n", in ieee80211_assoc_success()
2896 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_success()
2934 sdata_info(sdata, in ieee80211_assoc_success()
2945 sdata_info(sdata, in ieee80211_assoc_success()
2951 sdata_info(sdata, in ieee80211_assoc_success()
2957 sdata_info(sdata, in ieee80211_assoc_success()
2963 sdata_info(sdata, in ieee80211_assoc_success()
2974 sdata_info(sdata, in ieee80211_assoc_success()
2982 sdata_info(sdata, in ieee80211_assoc_success()
2988 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
2993 sta = sta_info_get(sdata, cbss->bssid); in ieee80211_assoc_success()
2995 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3000 sband = local->hw.wiphy->bands[ieee80211_get_sdata_band(sdata)]; in ieee80211_assoc_success()
3004 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_success()
3008 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_success()
3048 sdata_info(sdata, in ieee80211_assoc_success()
3052 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3057 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3068 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_assoc_success()
3069 } else if (!ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_assoc_success()
3072 ieee80211_set_wmm_default(sdata, false, true); in ieee80211_assoc_success()
3088 ieee80211_set_associated(sdata, cbss, changed); in ieee80211_assoc_success()
3095 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
3101 ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt); in ieee80211_assoc_success()
3102 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
3110 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
3114 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
3127 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_assoc_resp()
3147 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3161 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3167 run_again(sdata, assoc_data->timeout); in ieee80211_rx_mgmt_assoc_resp()
3174 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
3176 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_rx_mgmt_assoc_resp()
3179 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3181 if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) { in ieee80211_rx_mgmt_assoc_resp()
3183 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_rx_mgmt_assoc_resp()
3184 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_rx_mgmt_assoc_resp()
3188 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3189 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
3196 ieee80211_destroy_assoc_data(sdata, true); in ieee80211_rx_mgmt_assoc_resp()
3201 if (sdata->tx_conf[ac].uapsd) in ieee80211_rx_mgmt_assoc_resp()
3205 cfg80211_rx_assoc_resp(sdata->dev, bss, (u8 *)mgmt, len, uapsd_queues); in ieee80211_rx_mgmt_assoc_resp()
3208 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_bss_info() argument
3213 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
3217 sdata_assert_lock(sdata); in ieee80211_rx_bss_info()
3226 sdata->vif.bss_conf.beacon_rate = bss->beacon_rate; in ieee80211_rx_bss_info()
3232 static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_probe_resp() argument
3241 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
3243 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_probe_resp()
3245 if (!ether_addr_equal(mgmt->da, sdata->vif.addr)) in ieee80211_rx_mgmt_probe_resp()
3255 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_probe_resp()
3259 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
3286 static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_beacon() argument
3290 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
3291 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
3294 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
3305 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_beacon()
3313 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_rx_mgmt_beacon()
3331 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_beacon()
3339 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3341 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3344 sdata->vif.bss_conf.sync_dtim_count = in ieee80211_rx_mgmt_beacon()
3347 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_rx_mgmt_beacon()
3352 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_rx_mgmt_beacon()
3390 drv_event_callback(local, sdata, &event); in ieee80211_rx_mgmt_beacon()
3396 drv_event_callback(local, sdata, &event); in ieee80211_rx_mgmt_beacon()
3402 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_rx_mgmt_beacon()
3412 &sdata->vif, in ieee80211_rx_mgmt_beacon()
3419 &sdata->vif, in ieee80211_rx_mgmt_beacon()
3426 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
3428 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_beacon()
3435 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
3450 ieee80211_send_nullfunc(local, sdata, false); in ieee80211_rx_mgmt_beacon()
3451 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
3462 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
3466 if (sdata->vif.p2p) { in ieee80211_rx_mgmt_beacon()
3475 if (sdata->u.mgd.p2p_noa_index != noa.index) { in ieee80211_rx_mgmt_beacon()
3477 sdata->u.mgd.p2p_noa_index = noa.index; in ieee80211_rx_mgmt_beacon()
3486 } else if (sdata->u.mgd.p2p_noa_index != -1) { in ieee80211_rx_mgmt_beacon()
3488 sdata->u.mgd.p2p_noa_index = -1; in ieee80211_rx_mgmt_beacon()
3496 ieee80211_chswitch_post_beacon(sdata); in ieee80211_rx_mgmt_beacon()
3507 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3509 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3512 sdata->vif.bss_conf.sync_dtim_count = in ieee80211_rx_mgmt_beacon()
3515 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_rx_mgmt_beacon()
3523 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_beacon()
3525 ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, in ieee80211_rx_mgmt_beacon()
3530 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_rx_mgmt_beacon()
3552 ieee80211_recalc_ps_vif(sdata); in ieee80211_rx_mgmt_beacon()
3561 changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_rx_mgmt_beacon()
3566 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_beacon()
3568 if (ieee80211_config_bw(sdata, sta, in ieee80211_rx_mgmt_beacon()
3572 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
3575 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
3582 ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif, in ieee80211_rx_mgmt_beacon()
3586 changed |= ieee80211_handle_pwr_constr(sdata, chan, mgmt, in ieee80211_rx_mgmt_beacon()
3592 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_rx_mgmt_beacon()
3595 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
3608 sdata_lock(sdata); in ieee80211_sta_rx_queued_mgmt()
3612 ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, rx_status); in ieee80211_sta_rx_queued_mgmt()
3615 ieee80211_rx_mgmt_probe_resp(sdata, skb); in ieee80211_sta_rx_queued_mgmt()
3618 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3621 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3624 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3628 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3646 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
3669 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
3676 sdata_unlock(sdata); in ieee80211_sta_rx_queued_mgmt()
3681 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
3684 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_timer()
3687 static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
3692 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
3695 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_sta_connection_lost()
3699 static int ieee80211_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_auth() argument
3701 struct ieee80211_local *local = sdata->local; in ieee80211_auth()
3702 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_auth()
3708 sdata_assert_lock(sdata); in ieee80211_auth()
3716 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_auth()
3728 drv_mgd_prepare_tx(local, sdata); in ieee80211_auth()
3730 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_auth()
3746 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_auth()
3755 run_again(sdata, auth_data->timeout); in ieee80211_auth()
3760 run_again(sdata, auth_data->timeout); in ieee80211_auth()
3766 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
3768 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
3769 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
3771 sdata_assert_lock(sdata); in ieee80211_do_assoc()
3775 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
3787 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
3790 ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
3795 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
3801 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
3807 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
3810 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
3812 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
3813 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
3814 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
3816 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mgd_conn_tx_status()
3819 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
3821 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
3822 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
3824 sdata_lock(sdata); in ieee80211_sta_work()
3835 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
3846 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
3861 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
3862 } else if (ieee80211_auth(sdata)) { in ieee80211_sta_work()
3872 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
3874 cfg80211_auth_timeout(sdata->dev, bssid); in ieee80211_sta_work()
3875 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
3878 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
3883 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
3891 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_sta_work()
3892 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_sta_work()
3893 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
3896 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
3912 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
3915 mlme_dbg(sdata, in ieee80211_sta_work()
3919 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
3921 mlme_dbg(sdata, in ieee80211_sta_work()
3924 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
3929 run_again(sdata, ifmgd->probe_timeout); in ieee80211_sta_work()
3931 mlme_dbg(sdata, in ieee80211_sta_work()
3934 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
3937 mlme_dbg(sdata, in ieee80211_sta_work()
3941 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
3950 sdata->name, in ieee80211_sta_work()
3953 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
3958 sdata_unlock(sdata); in ieee80211_sta_work()
3963 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
3965 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_bcn_mon_timer()
3967 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_bcn_mon_timer()
3970 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
3971 ieee80211_queue_work(&sdata->local->hw, in ieee80211_sta_bcn_mon_timer()
3972 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
3977 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
3979 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
3980 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
3982 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_conn_mon_timer()
3990 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
3994 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
3997 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
3999 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
4000 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
4003 if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_restart_sta_timer()
4004 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
4005 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
4010 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_quiesce() argument
4012 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_quiesce()
4015 sdata_lock(sdata); in ieee80211_mgd_quiesce()
4027 ieee80211_send_deauth_disassoc(sdata, bssid, in ieee80211_mgd_quiesce()
4032 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_mgd_quiesce()
4034 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_quiesce()
4035 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, in ieee80211_mgd_quiesce()
4056 if (ifmgd->associated && !sdata->local->wowlan) { in ieee80211_mgd_quiesce()
4064 ieee80211_mgd_deauth(sdata, &req); in ieee80211_mgd_quiesce()
4067 sdata_unlock(sdata); in ieee80211_mgd_quiesce()
4070 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
4072 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
4074 sdata_lock(sdata); in ieee80211_sta_restart()
4076 sdata_unlock(sdata); in ieee80211_sta_restart()
4080 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
4081 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
4082 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
4083 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
4087 sdata_unlock(sdata); in ieee80211_sta_restart()
4090 sdata_unlock(sdata); in ieee80211_sta_restart()
4095 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
4099 ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
4110 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
4112 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
4114 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
4116 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
4121 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
4122 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
4123 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
4126 if (sdata->local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS) in ieee80211_sta_setup_sdata()
4140 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
4144 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
4145 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
4146 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
4151 static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, in ieee80211_ht_vht_rx_chains() argument
4154 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ht_vht_rx_chains()
4195 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
4198 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
4199 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_channel()
4245 sdata_info(sdata, in ieee80211_prep_channel()
4272 ifmgd->flags |= ieee80211_determine_chantype(sdata, sband, in ieee80211_prep_channel()
4277 sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss), in ieee80211_prep_channel()
4283 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_prep_channel()
4291 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
4301 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
4309 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
4313 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
4314 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
4328 have_sta = sta_info_get(sdata, cbss->bssid); in ieee80211_prep_connection()
4333 new_sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL); in ieee80211_prep_connection()
4339 err = ieee80211_prep_channel(sdata, cbss); in ieee80211_prep_connection()
4353 int shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_prep_connection()
4357 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_prep_connection()
4382 sdata_info(sdata, in ieee80211_prep_connection()
4388 sdata->vif.bss_conf.basic_rates = basic_rates; in ieee80211_prep_connection()
4393 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
4395 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
4400 sdata->vif.bss_conf.beacon_int = cbss->beacon_interval; in ieee80211_prep_connection()
4406 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
4407 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
4412 sdata->vif.bss_conf.sync_dtim_count = tim_ie[2]; in ieee80211_prep_connection()
4414 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4415 } else if (!ieee80211_hw_check(&sdata->local->hw, in ieee80211_prep_connection()
4419 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
4420 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
4422 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4424 sdata->vif.bss_conf.sync_tsf = 0; in ieee80211_prep_connection()
4425 sdata->vif.bss_conf.sync_device_ts = 0; in ieee80211_prep_connection()
4426 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4431 ieee80211_bss_info_change_notify(sdata, in ieee80211_prep_connection()
4441 sdata_info(sdata, in ieee80211_prep_connection()
4457 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
4460 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
4461 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
4529 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_auth()
4537 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
4541 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_auth()
4546 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); in ieee80211_mgd_auth()
4548 err = ieee80211_prep_connection(sdata, req->bss, false, false); in ieee80211_mgd_auth()
4552 err = ieee80211_auth(sdata); in ieee80211_mgd_auth()
4554 sta_info_destroy_addr(sdata, req->bss->bssid); in ieee80211_mgd_auth()
4564 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_auth()
4566 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_auth()
4567 ieee80211_vif_release_channel(sdata); in ieee80211_mgd_auth()
4568 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_auth()
4574 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
4577 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
4578 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
4605 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
4609 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_assoc()
4629 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
4652 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
4665 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
4676 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
4697 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_mgd_assoc()
4699 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_mgd_assoc()
4701 sdata->smps_mode = ifmgd->req_smps; in ieee80211_mgd_assoc()
4722 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
4725 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in ieee80211_mgd_assoc()
4728 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) { in ieee80211_mgd_assoc()
4757 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
4758 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
4759 sdata->encrypt_headroom = ieee80211_cs_headroom(local, &req->crypto, in ieee80211_mgd_assoc()
4760 sdata->vif.type); in ieee80211_mgd_assoc()
4776 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_mgd_assoc()
4797 err = ieee80211_prep_connection(sdata, req->bss, true, override); in ieee80211_mgd_assoc()
4804 if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) && in ieee80211_mgd_assoc()
4810 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
4832 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; in ieee80211_mgd_assoc()
4833 sdata->vif.bss_conf.sync_device_ts = in ieee80211_mgd_assoc()
4835 sdata->vif.bss_conf.sync_dtim_count = dtim_count; in ieee80211_mgd_assoc()
4843 run_again(sdata, assoc_data->timeout); in ieee80211_mgd_assoc()
4855 sdata_info(sdata, "associating with AP with corrupt %s\n", in ieee80211_mgd_assoc()
4862 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_assoc()
4869 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
4872 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
4878 sdata_info(sdata, in ieee80211_mgd_deauth()
4883 drv_mgd_prepare_tx(sdata->local, sdata); in ieee80211_mgd_deauth()
4884 ieee80211_send_deauth_disassoc(sdata, req->bssid, in ieee80211_mgd_deauth()
4888 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
4889 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
4898 sdata_info(sdata, in ieee80211_mgd_deauth()
4903 drv_mgd_prepare_tx(sdata->local, sdata); in ieee80211_mgd_deauth()
4904 ieee80211_send_deauth_disassoc(sdata, req->bssid, in ieee80211_mgd_deauth()
4908 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_mgd_deauth()
4909 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
4917 sdata_info(sdata, in ieee80211_mgd_deauth()
4922 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
4924 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
4933 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
4936 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_disassoc()
4949 sdata_info(sdata, in ieee80211_mgd_disassoc()
4954 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
4958 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_mgd_disassoc()
4964 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
4966 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
4980 sdata_lock(sdata); in ieee80211_mgd_stop()
4983 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_mgd_stop()
4984 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_mgd_stop()
4987 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
4996 sdata_unlock(sdata); in ieee80211_mgd_stop()
5003 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
5005 trace_api_cqm_rssi_notify(sdata, rssi_event); in ieee80211_cqm_rssi_notify()
5007 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, gfp); in ieee80211_cqm_rssi_notify()
5013 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_beacon_loss_notify() local
5015 trace_api_cqm_beacon_loss_notify(sdata->local, sdata); in ieee80211_cqm_beacon_loss_notify()
5017 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp); in ieee80211_cqm_beacon_loss_notify()