Lines Matching refs:sdata

102 static void run_again(struct ieee80211_sub_if_data *sdata,  in run_again()  argument
105 sdata_assert_lock(sdata); in run_again()
107 if (!timer_pending(&sdata->u.mgd.timer) || in run_again()
108 time_before(timeout, sdata->u.mgd.timer.expires)) in run_again()
109 mod_timer(&sdata->u.mgd.timer, timeout); in run_again()
112 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_beacon_monitor() argument
114 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_reset_beacon_monitor()
117 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_beacon_monitor()
120 mod_timer(&sdata->u.mgd.bcn_mon_timer, in ieee80211_sta_reset_beacon_monitor()
121 round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout)); in ieee80211_sta_reset_beacon_monitor()
124 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_conn_monitor() argument
126 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_reset_conn_monitor()
134 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_conn_monitor()
147 ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, in ieee80211_determine_chantype() argument
155 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_determine_chantype()
161 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_determine_chantype()
186 sdata_info(sdata, in ieee80211_determine_chantype()
226 sdata_info(sdata, in ieee80211_determine_chantype()
233 sdata_info(sdata, in ieee80211_determine_chantype()
241 sdata_info(sdata, in ieee80211_determine_chantype()
254 sdata_info(sdata, in ieee80211_determine_chantype()
284 cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_determine_chantype()
299 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, in ieee80211_determine_chantype()
312 sdata_info(sdata, in ieee80211_determine_chantype()
319 static int ieee80211_config_bw(struct ieee80211_sub_if_data *sdata, in ieee80211_config_bw() argument
327 struct ieee80211_local *local = sdata->local; in ieee80211_config_bw()
328 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_config_bw()
329 struct ieee80211_channel *chan = sdata->vif.bss_conf.chandef.chan; in ieee80211_config_bw()
359 if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) { in ieee80211_config_bw()
361 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; in ieee80211_config_bw()
365 flags = ieee80211_determine_chantype(sdata, sband, chan, in ieee80211_config_bw()
386 if (cfg80211_chandef_identical(&chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_config_bw()
389 sdata_info(sdata, in ieee80211_config_bw()
400 sdata_info(sdata, in ieee80211_config_bw()
434 ret = ieee80211_vif_change_bandwidth(sdata, &chandef, changed); in ieee80211_config_bw()
436 sdata_info(sdata, in ieee80211_config_bw()
453 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
467 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
492 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_40MHZ) { in ieee80211_add_ht_ie()
527 static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
532 struct ieee80211_local *local = sdata->local; in ieee80211_add_vht_ie()
541 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
546 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_80P80MHZ) { in ieee80211_add_vht_ie()
555 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_160MHZ) { in ieee80211_add_vht_ie()
592 sdata->vif.mu_mimo_owner = true; in ieee80211_add_vht_ie()
613 static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_he_ie() argument
638 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
640 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
641 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
654 sdata_assert_lock(sdata); in ieee80211_send_assoc()
657 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_send_assoc()
665 shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_send_assoc()
730 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
860 ieee80211_add_ht_ie(sdata, skb, assoc_data->ap_ht_param, in ieee80211_send_assoc()
861 sband, chan, sdata->smps_mode); in ieee80211_send_assoc()
914 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_send_assoc()
918 ieee80211_add_he_ie(sdata, skb, sband); in ieee80211_send_assoc()
953 drv_mgd_prepare_tx(local, sdata, 0); in ieee80211_send_assoc()
959 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
963 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
968 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
976 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
980 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
985 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
988 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_send_nullfunc()
992 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif, in ieee80211_send_nullfunc()
1010 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
1014 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
1020 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
1024 if (!(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE)) in ieee80211_send_4addr_nullfunc()
1037 memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1038 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1039 memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1040 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1043 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
1049 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_work() local
1051 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
1052 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
1055 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
1058 sdata_lock(sdata); in ieee80211_chswitch_work()
1065 if (!sdata->vif.csa_active) in ieee80211_chswitch_work()
1075 if (sdata->reserved_chanctx) { in ieee80211_chswitch_work()
1085 if (sdata->reserved_ready) in ieee80211_chswitch_work()
1088 if (sdata->vif.bss_conf.chandef.width != in ieee80211_chswitch_work()
1089 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1100 switch (sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1118 mgd_sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_chswitch_work()
1120 local->hw.wiphy->bands[sdata->csa_chandef.chan->band]; in ieee80211_chswitch_work()
1123 if (sdata->vif.bss_conf.chandef.width > in ieee80211_chswitch_work()
1124 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1130 ret = ieee80211_vif_use_reserved_context(sdata); in ieee80211_chswitch_work()
1132 sdata_info(sdata, in ieee80211_chswitch_work()
1135 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1140 if (sdata->vif.bss_conf.chandef.width < in ieee80211_chswitch_work()
1141 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1150 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in ieee80211_chswitch_work()
1151 &sdata->csa_chandef)) { in ieee80211_chswitch_work()
1152 sdata_info(sdata, in ieee80211_chswitch_work()
1154 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1160 ifmgd->associated->channel = sdata->csa_chandef.chan; in ieee80211_chswitch_work()
1164 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_chswitch_work()
1165 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_chswitch_work()
1170 sdata_unlock(sdata); in ieee80211_chswitch_work()
1173 static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata) in ieee80211_chswitch_post_beacon() argument
1175 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_post_beacon()
1176 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_post_beacon()
1179 sdata_assert_lock(sdata); in ieee80211_chswitch_post_beacon()
1181 WARN_ON(!sdata->vif.csa_active); in ieee80211_chswitch_post_beacon()
1183 if (sdata->csa_block_tx) { in ieee80211_chswitch_post_beacon()
1184 ieee80211_wake_vif_queues(local, sdata, in ieee80211_chswitch_post_beacon()
1186 sdata->csa_block_tx = false; in ieee80211_chswitch_post_beacon()
1189 sdata->vif.csa_active = false; in ieee80211_chswitch_post_beacon()
1192 ret = drv_post_channel_switch(sdata); in ieee80211_chswitch_post_beacon()
1194 sdata_info(sdata, in ieee80211_chswitch_post_beacon()
1201 cfg80211_ch_switch_notify(sdata->dev, &sdata->reserved_chandef); in ieee80211_chswitch_post_beacon()
1206 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
1207 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
1209 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
1211 sdata_info(sdata, in ieee80211_chswitch_done()
1213 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1216 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); in ieee80211_chswitch_done()
1223 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_timer() local
1224 from_timer(sdata, t, u.mgd.chswitch_timer); in ieee80211_chswitch_timer()
1226 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work); in ieee80211_chswitch_timer()
1230 ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_process_chanswitch() argument
1235 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1236 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1245 sdata_assert_lock(sdata); in ieee80211_sta_process_chanswitch()
1254 if (sdata->vif.csa_active) in ieee80211_sta_process_chanswitch()
1258 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band, in ieee80211_sta_process_chanswitch()
1269 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1281 &sdata->vif.bss_conf.chandef)) { in ieee80211_sta_process_chanswitch()
1284 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1297 ieee80211_teardown_tdls_peers(sdata); in ieee80211_sta_process_chanswitch()
1301 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in ieee80211_sta_process_chanswitch()
1304 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1313 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1324 if (drv_pre_channel_switch(sdata, &ch_switch)) { in ieee80211_sta_process_chanswitch()
1325 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1330 res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1333 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1340 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1341 sdata->csa_chandef = csa_ie.chandef; in ieee80211_sta_process_chanswitch()
1342 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1345 if (sdata->csa_block_tx) in ieee80211_sta_process_chanswitch()
1346 ieee80211_stop_vif_queues(local, sdata, in ieee80211_sta_process_chanswitch()
1350 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1355 drv_channel_switch(local, sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1375 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1376 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1384 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_find_80211h_pwr_constr() argument
1445 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata, in ieee80211_find_cisco_dtpc() argument
1459 static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_pwr_constr() argument
1476 sdata, channel, country_ie, country_ie_len, in ieee80211_handle_pwr_constr()
1484 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco); in ieee80211_handle_pwr_constr()
1498 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1501 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1504 sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1508 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1511 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1513 pwr_level_cisco, sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1516 sdata->ap_power_level = new_ap_level; in ieee80211_handle_pwr_constr()
1517 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
1524 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
1541 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_enable_ps()
1566 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
1568 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
1588 sta = sta_info_get(sdata, mgd->bssid); in ieee80211_powersave_allowed()
1599 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
1608 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
1609 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
1611 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
1619 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
1621 found = sdata; in ieee80211_recalc_ps()
1646 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
1648 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
1650 if (sdata->vif.bss_conf.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
1651 sdata->vif.bss_conf.ps = ps_allowed; in ieee80211_recalc_ps_vif()
1652 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
1678 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
1684 if (!sdata) in ieee80211_dynamic_ps_enable_work()
1687 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
1727 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_dynamic_ps_enable_work()
1729 ieee80211_flush_queues(local, sdata, false); in ieee80211_dynamic_ps_enable_work()
1752 struct ieee80211_sub_if_data *sdata = in ieee80211_dfs_cac_timer_work() local
1755 struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef; in ieee80211_dfs_cac_timer_work()
1757 mutex_lock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1758 if (sdata->wdev.cac_started) { in ieee80211_dfs_cac_timer_work()
1759 ieee80211_vif_release_channel(sdata); in ieee80211_dfs_cac_timer_work()
1760 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_dfs_cac_timer_work()
1764 mutex_unlock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1768 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in __ieee80211_sta_handle_tspec_ac_params() argument
1770 struct ieee80211_local *local = sdata->local; in __ieee80211_sta_handle_tspec_ac_params()
1771 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_sta_handle_tspec_ac_params()
1797 if (drv_conf_tx(local, sdata, ac, &sdata->tx_conf[ac])) in __ieee80211_sta_handle_tspec_ac_params()
1798 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1815 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac))) in __ieee80211_sta_handle_tspec_ac_params()
1826 if (drv_conf_tx(local, sdata, ac, in __ieee80211_sta_handle_tspec_ac_params()
1827 &sdata->tx_conf[non_acm_ac])) in __ieee80211_sta_handle_tspec_ac_params()
1828 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1845 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_handle_tspec_ac_params() argument
1847 if (__ieee80211_sta_handle_tspec_ac_params(sdata)) in ieee80211_sta_handle_tspec_ac_params()
1848 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); in ieee80211_sta_handle_tspec_ac_params()
1853 struct ieee80211_sub_if_data *sdata; in ieee80211_sta_handle_tspec_ac_params_wk() local
1855 sdata = container_of(work, struct ieee80211_sub_if_data, in ieee80211_sta_handle_tspec_ac_params_wk()
1857 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_sta_handle_tspec_ac_params_wk()
1863 struct ieee80211_sub_if_data *sdata, in ieee80211_sta_wmm_params() argument
1868 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
1899 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
1909 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
1919 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
1929 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
1940 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
1952 sdata_info(sdata, in ieee80211_sta_wmm_params()
1965 sdata_info(sdata, in ieee80211_sta_wmm_params()
1970 ieee80211_regulatory_limit_wmm_params(sdata, &params[ac], ac); in ieee80211_sta_wmm_params()
1974 mlme_dbg(sdata, in ieee80211_sta_wmm_params()
1980 sdata->tx_conf[ac] = params[ac]; in ieee80211_sta_wmm_params()
1982 drv_conf_tx(local, sdata, ac, &params[ac])) in ieee80211_sta_wmm_params()
1983 sdata_err(sdata, in ieee80211_sta_wmm_params()
1989 sdata->vif.bss_conf.qos = true; in ieee80211_sta_wmm_params()
1993 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
1995 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
1997 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL; in __ieee80211_stop_poll()
1998 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
2001 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
2003 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
2004 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
2005 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
2008 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_bss_capability() argument
2011 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_handle_bss_capability()
2018 sband = ieee80211_get_sband(sdata); in ieee80211_handle_bss_capability()
2052 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
2057 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
2058 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_set_associated()
2061 bss_info_changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_set_associated()
2064 sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec( in ieee80211_set_associated()
2067 sdata->u.mgd.associated = cbss; in ieee80211_set_associated()
2068 memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); in ieee80211_set_associated()
2070 ieee80211_check_rate_mask(sdata); in ieee80211_set_associated()
2072 sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE; in ieee80211_set_associated()
2074 if (sdata->vif.p2p || in ieee80211_set_associated()
2075 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_set_associated()
2089 sdata->u.mgd.p2p_noa_index = in ieee80211_set_associated()
2098 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
2102 if (sdata->u.mgd.have_beacon) { in ieee80211_set_associated()
2109 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; in ieee80211_set_associated()
2120 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_set_associated()
2128 ieee80211_bss_info_change_notify(sdata, bss_info_changed); in ieee80211_set_associated()
2134 ieee80211_recalc_smps(sdata); in ieee80211_set_associated()
2135 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
2137 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
2140 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
2144 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
2145 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
2148 sdata_assert_lock(sdata); in ieee80211_set_disassoc()
2156 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
2159 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
2173 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
2185 ieee80211_flush_queues(local, sdata, true); in ieee80211_set_disassoc()
2197 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_set_disassoc()
2199 ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, stype, in ieee80211_set_disassoc()
2205 ieee80211_flush_queues(local, sdata, false); in ieee80211_set_disassoc()
2211 sta_info_flush(sdata); in ieee80211_set_disassoc()
2214 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
2218 sdata->vif.bss_conf.assoc = false; in ieee80211_set_disassoc()
2221 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
2222 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
2231 memset(sdata->vif.bss_conf.mu_group.membership, 0, in ieee80211_set_disassoc()
2232 sizeof(sdata->vif.bss_conf.mu_group.membership)); in ieee80211_set_disassoc()
2233 memset(sdata->vif.bss_conf.mu_group.position, 0, in ieee80211_set_disassoc()
2234 sizeof(sdata->vif.bss_conf.mu_group.position)); in ieee80211_set_disassoc()
2236 sdata->vif.mu_mimo_owner = false; in ieee80211_set_disassoc()
2238 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
2244 if (sdata->vif.bss_conf.arp_addr_cnt) in ieee80211_set_disassoc()
2247 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
2252 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
2255 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_set_disassoc()
2257 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
2258 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
2259 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
2260 del_timer_sync(&sdata->u.mgd.chswitch_timer); in ieee80211_set_disassoc()
2262 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
2263 sdata->vif.bss_conf.beacon_rate = NULL; in ieee80211_set_disassoc()
2269 ieee80211_vif_release_channel(sdata); in ieee80211_set_disassoc()
2271 sdata->vif.csa_active = false; in ieee80211_set_disassoc()
2274 if (sdata->csa_block_tx) { in ieee80211_set_disassoc()
2275 ieee80211_wake_vif_queues(local, sdata, in ieee80211_set_disassoc()
2277 sdata->csa_block_tx = false; in ieee80211_set_disassoc()
2285 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_set_disassoc()
2288 void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_notify() argument
2302 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_rx_notify()
2305 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
2307 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
2308 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
2314 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
2320 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_reset_ap_probe()
2328 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
2337 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_wmm_ac_notify() argument
2341 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_tx_wmm_ac_notify()
2372 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
2375 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time); in ieee80211_sta_tx_notify()
2381 sdata->u.mgd.probe_send_count > 0) { in ieee80211_sta_tx_notify()
2383 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2385 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
2386 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_tx_notify()
2391 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2394 static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata, in ieee80211_mlme_send_probe_req() argument
2401 skb = ieee80211_build_probe_req(sdata, src, dst, (u32)-1, channel, in ieee80211_mlme_send_probe_req()
2405 ieee80211_tx_skb(sdata, skb); in ieee80211_mlme_send_probe_req()
2408 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
2410 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
2434 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2435 sta = sta_info_get(sdata, dst); in ieee80211_mgd_probe_ap_send()
2438 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2441 if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { in ieee80211_mgd_probe_ap_send()
2443 ieee80211_send_nullfunc(sdata->local, sdata, false); in ieee80211_mgd_probe_ap_send()
2454 ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst, in ieee80211_mgd_probe_ap_send()
2461 run_again(sdata, ifmgd->probe_timeout); in ieee80211_mgd_probe_ap_send()
2464 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
2467 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
2470 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
2473 sdata_lock(sdata); in ieee80211_mgd_probe_ap()
2478 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2480 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
2481 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2486 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
2490 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL); in ieee80211_mgd_probe_ap()
2509 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2514 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2515 ieee80211_recalc_ps(sdata->local); in ieee80211_mgd_probe_ap()
2516 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2519 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
2521 sdata_unlock(sdata); in ieee80211_mgd_probe_ap()
2527 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
2528 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
2534 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_ap_probereq_get()
2537 sdata_assert_lock(sdata); in ieee80211_ap_probereq_get()
2555 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, in ieee80211_ap_probereq_get()
2565 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata, in ieee80211_report_disconnect() argument
2576 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2578 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2580 drv_event_callback(sdata->local, sdata, &event); in ieee80211_report_disconnect()
2583 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
2585 struct ieee80211_local *local = sdata->local; in __ieee80211_disconnect()
2586 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_disconnect()
2590 sdata_lock(sdata); in __ieee80211_disconnect()
2592 sdata_unlock(sdata); in __ieee80211_disconnect()
2596 tx = !sdata->csa_block_tx; in __ieee80211_disconnect()
2603 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in __ieee80211_disconnect()
2607 sdata->vif.csa_active = false; in __ieee80211_disconnect()
2609 if (sdata->csa_block_tx) { in __ieee80211_disconnect()
2610 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_disconnect()
2612 sdata->csa_block_tx = false; in __ieee80211_disconnect()
2616 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx, in __ieee80211_disconnect()
2619 sdata_unlock(sdata); in __ieee80211_disconnect()
2624 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
2627 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
2633 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
2635 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
2637 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
2643 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
2647 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
2652 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
2653 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
2655 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
2657 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
2658 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
2664 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
2665 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
2667 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
2669 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
2670 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
2675 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
2678 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
2680 sdata_assert_lock(sdata); in ieee80211_destroy_auth_data()
2688 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_auth_data()
2689 sta_info_destroy_addr(sdata, auth_data->bss->bssid); in ieee80211_destroy_auth_data()
2691 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_auth_data()
2692 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_auth_data()
2693 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
2694 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2695 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_auth_data()
2696 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2699 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
2701 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
2704 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
2707 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
2709 sdata_assert_lock(sdata); in ieee80211_destroy_assoc_data()
2717 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_assoc_data()
2718 sta_info_destroy_addr(sdata, assoc_data->bss->bssid); in ieee80211_destroy_assoc_data()
2720 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_assoc_data()
2721 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_assoc_data()
2722 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
2723 sdata->vif.mu_mimo_owner = false; in ieee80211_destroy_assoc_data()
2725 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2726 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_assoc_data()
2727 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2730 cfg80211_abandon_assoc(sdata->dev, assoc_data->bss); in ieee80211_destroy_assoc_data()
2734 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
2737 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
2740 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
2741 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
2751 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_auth_challenge()
2755 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
2762 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
2765 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
2774 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_auth()
2793 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
2801 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
2803 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
2804 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2807 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
2822 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
2834 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
2835 sdata_info(sdata, "authenticated\n"); in ieee80211_rx_mgmt_auth()
2839 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_rx_mgmt_auth()
2847 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2852 mutex_lock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2853 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_auth()
2855 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid); in ieee80211_rx_mgmt_auth()
2859 sdata_info(sdata, "failed moving %pM to auth\n", bssid); in ieee80211_rx_mgmt_auth()
2862 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2864 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2867 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2928 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
2931 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
2934 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_deauth()
2943 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_deauth()
2947 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
2949 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, in ieee80211_rx_mgmt_deauth()
2958 sdata_info(sdata, in ieee80211_rx_mgmt_deauth()
2963 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_rx_mgmt_deauth()
2965 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_deauth()
2971 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
2974 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
2977 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_disassoc()
2988 sdata_info(sdata, "disassociated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_disassoc()
2992 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
2994 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code); in ieee80211_rx_mgmt_disassoc()
3046 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
3050 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
3051 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
3057 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_assoc_success()
3078 sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n", in ieee80211_assoc_success()
3088 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_success()
3126 sdata_info(sdata, in ieee80211_assoc_success()
3137 sdata_info(sdata, in ieee80211_assoc_success()
3143 sdata_info(sdata, in ieee80211_assoc_success()
3149 sdata_info(sdata, in ieee80211_assoc_success()
3155 sdata_info(sdata, in ieee80211_assoc_success()
3166 sdata_info(sdata, in ieee80211_assoc_success()
3174 sdata_info(sdata, in ieee80211_assoc_success()
3180 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3185 sta = sta_info_get(sdata, cbss->bssid); in ieee80211_assoc_success()
3187 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3192 sband = ieee80211_get_sband(sdata); in ieee80211_assoc_success()
3194 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3211 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3212 sdata_info(sdata, in ieee80211_assoc_success()
3220 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_success()
3224 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_success()
3229 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, in ieee80211_assoc_success()
3306 sdata_info(sdata, in ieee80211_assoc_success()
3310 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3315 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3326 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_assoc_success()
3327 } else if (!ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_assoc_success()
3331 ieee80211_set_wmm_default(sdata, false, true); in ieee80211_assoc_success()
3359 ieee80211_set_associated(sdata, cbss, changed); in ieee80211_assoc_success()
3366 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
3372 ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt); in ieee80211_assoc_success()
3373 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
3381 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
3385 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
3398 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_assoc_resp()
3418 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3424 fils_decrypt_assoc_resp(sdata, (u8 *)mgmt, &len, assoc_data) < 0) in ieee80211_rx_mgmt_assoc_resp()
3436 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3442 run_again(sdata, assoc_data->timeout); in ieee80211_rx_mgmt_assoc_resp()
3449 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
3451 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3454 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3456 if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) { in ieee80211_rx_mgmt_assoc_resp()
3458 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3459 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_rx_mgmt_assoc_resp()
3463 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3464 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
3471 ieee80211_destroy_assoc_data(sdata, true, false); in ieee80211_rx_mgmt_assoc_resp()
3476 if (sdata->tx_conf[ac].uapsd) in ieee80211_rx_mgmt_assoc_resp()
3480 cfg80211_rx_assoc_resp(sdata->dev, bss, (u8 *)mgmt, len, uapsd_queues); in ieee80211_rx_mgmt_assoc_resp()
3483 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_bss_info() argument
3488 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
3492 sdata_assert_lock(sdata); in ieee80211_rx_bss_info()
3501 sdata->vif.bss_conf.beacon_rate = bss->beacon_rate; in ieee80211_rx_bss_info()
3507 static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_probe_resp() argument
3516 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
3518 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_probe_resp()
3520 if (!ether_addr_equal(mgmt->da, sdata->vif.addr)) in ieee80211_rx_mgmt_probe_resp()
3530 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_probe_resp()
3534 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
3561 static void ieee80211_handle_beacon_sig(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_beacon_sig() argument
3597 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3603 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3609 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_handle_beacon_sig()
3619 &sdata->vif, in ieee80211_handle_beacon_sig()
3626 &sdata->vif, in ieee80211_handle_beacon_sig()
3643 &sdata->vif, in ieee80211_handle_beacon_sig()
3650 &sdata->vif, in ieee80211_handle_beacon_sig()
3657 static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_beacon() argument
3661 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
3662 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
3665 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
3676 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_beacon()
3684 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_rx_mgmt_beacon()
3702 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_beacon()
3710 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3712 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3715 sdata->vif.bss_conf.sync_dtim_count = in ieee80211_rx_mgmt_beacon()
3718 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_rx_mgmt_beacon()
3723 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_rx_mgmt_beacon()
3733 ieee80211_handle_beacon_sig(sdata, ifmgd, bss_conf, in ieee80211_rx_mgmt_beacon()
3737 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
3739 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_beacon()
3746 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
3761 ieee80211_send_nullfunc(local, sdata, false); in ieee80211_rx_mgmt_beacon()
3762 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
3773 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
3777 if (sdata->vif.p2p || in ieee80211_rx_mgmt_beacon()
3778 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_rx_mgmt_beacon()
3787 if (sdata->u.mgd.p2p_noa_index != noa.index) { in ieee80211_rx_mgmt_beacon()
3789 sdata->u.mgd.p2p_noa_index = noa.index; in ieee80211_rx_mgmt_beacon()
3798 } else if (sdata->u.mgd.p2p_noa_index != -1) { in ieee80211_rx_mgmt_beacon()
3800 sdata->u.mgd.p2p_noa_index = -1; in ieee80211_rx_mgmt_beacon()
3808 ieee80211_chswitch_post_beacon(sdata); in ieee80211_rx_mgmt_beacon()
3819 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3821 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3824 sdata->vif.bss_conf.sync_dtim_count = in ieee80211_rx_mgmt_beacon()
3827 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_rx_mgmt_beacon()
3835 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_beacon()
3837 ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, in ieee80211_rx_mgmt_beacon()
3842 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_rx_mgmt_beacon()
3865 ieee80211_recalc_ps_vif(sdata); in ieee80211_rx_mgmt_beacon()
3874 changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_rx_mgmt_beacon()
3879 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_beacon()
3881 if (ieee80211_config_bw(sdata, sta, in ieee80211_rx_mgmt_beacon()
3886 sdata_info(sdata, in ieee80211_rx_mgmt_beacon()
3889 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
3892 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
3899 ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif, in ieee80211_rx_mgmt_beacon()
3903 changed |= ieee80211_handle_pwr_constr(sdata, chan, mgmt, in ieee80211_rx_mgmt_beacon()
3909 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_rx_mgmt_beacon()
3912 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
3925 sdata_lock(sdata); in ieee80211_sta_rx_queued_mgmt()
3929 ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, rx_status); in ieee80211_sta_rx_queued_mgmt()
3932 ieee80211_rx_mgmt_probe_resp(sdata, skb); in ieee80211_sta_rx_queued_mgmt()
3935 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3938 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3941 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3945 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3963 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
3986 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
3993 sdata_unlock(sdata); in ieee80211_sta_rx_queued_mgmt()
3998 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
3999 from_timer(sdata, t, u.mgd.timer); in ieee80211_sta_timer()
4001 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_timer()
4004 static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
4009 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
4012 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_sta_connection_lost()
4016 static int ieee80211_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_auth() argument
4018 struct ieee80211_local *local = sdata->local; in ieee80211_auth()
4019 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_auth()
4026 sdata_assert_lock(sdata); in ieee80211_auth()
4034 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_auth()
4050 drv_mgd_prepare_tx(local, sdata, prepare_tx_duration); in ieee80211_auth()
4052 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_auth()
4068 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_auth()
4086 run_again(sdata, auth_data->timeout); in ieee80211_auth()
4091 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
4093 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
4094 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
4096 sdata_assert_lock(sdata); in ieee80211_do_assoc()
4100 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
4112 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
4115 ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
4120 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4126 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4132 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
4135 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
4137 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
4138 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
4139 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
4141 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mgd_conn_tx_status()
4144 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
4146 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
4147 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
4149 sdata_lock(sdata); in ieee80211_sta_work()
4167 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4178 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4193 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4194 } else if (ieee80211_auth(sdata)) { in ieee80211_sta_work()
4204 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4206 cfg80211_auth_timeout(sdata->dev, bssid); in ieee80211_sta_work()
4207 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4210 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4215 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
4223 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_sta_work()
4224 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_sta_work()
4225 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4228 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4244 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
4247 mlme_dbg(sdata, in ieee80211_sta_work()
4251 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4253 mlme_dbg(sdata, in ieee80211_sta_work()
4256 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4261 run_again(sdata, ifmgd->probe_timeout); in ieee80211_sta_work()
4263 mlme_dbg(sdata, in ieee80211_sta_work()
4266 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4269 mlme_dbg(sdata, in ieee80211_sta_work()
4273 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4279 mlme_dbg(sdata, in ieee80211_sta_work()
4283 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4288 sdata_unlock(sdata); in ieee80211_sta_work()
4293 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
4294 from_timer(sdata, t, u.mgd.bcn_mon_timer); in ieee80211_sta_bcn_mon_timer()
4295 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_bcn_mon_timer()
4297 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_bcn_mon_timer()
4300 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
4301 ieee80211_queue_work(&sdata->local->hw, in ieee80211_sta_bcn_mon_timer()
4302 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
4307 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
4308 from_timer(sdata, t, u.mgd.conn_mon_timer); in ieee80211_sta_conn_mon_timer()
4309 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
4310 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
4312 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_conn_mon_timer()
4320 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
4324 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
4327 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
4329 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
4330 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
4333 if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_restart_sta_timer()
4334 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
4335 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
4340 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_quiesce() argument
4342 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_quiesce()
4345 sdata_lock(sdata); in ieee80211_mgd_quiesce()
4357 ieee80211_send_deauth_disassoc(sdata, bssid, in ieee80211_mgd_quiesce()
4362 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_quiesce()
4364 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_quiesce()
4365 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, in ieee80211_mgd_quiesce()
4386 if (ifmgd->associated && !sdata->local->wowlan) { in ieee80211_mgd_quiesce()
4394 ieee80211_mgd_deauth(sdata, &req); in ieee80211_mgd_quiesce()
4397 sdata_unlock(sdata); in ieee80211_mgd_quiesce()
4400 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
4402 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
4404 sdata_lock(sdata); in ieee80211_sta_restart()
4406 sdata_unlock(sdata); in ieee80211_sta_restart()
4410 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
4411 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
4412 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
4413 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
4417 sdata_unlock(sdata); in ieee80211_sta_restart()
4420 sdata_unlock(sdata); in ieee80211_sta_restart()
4425 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
4429 ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
4447 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
4448 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
4449 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
4452 if (sdata->local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS) in ieee80211_sta_setup_sdata()
4466 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
4470 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
4471 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
4472 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
4477 static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, in ieee80211_ht_vht_rx_chains() argument
4480 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ht_vht_rx_chains()
4583 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
4586 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
4587 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_channel()
4634 sdata_info(sdata, in ieee80211_prep_channel()
4679 ifmgd->flags |= ieee80211_determine_chantype(sdata, sband, in ieee80211_prep_channel()
4684 sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss), in ieee80211_prep_channel()
4690 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_prep_channel()
4698 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
4708 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
4716 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
4720 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
4721 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
4739 have_sta = sta_info_get(sdata, cbss->bssid); in ieee80211_prep_connection()
4744 new_sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL); in ieee80211_prep_connection()
4767 int shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_prep_connection()
4785 sdata_info(sdata, in ieee80211_prep_connection()
4791 sdata->vif.bss_conf.basic_rates = basic_rates; in ieee80211_prep_connection()
4796 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
4798 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
4803 sdata->vif.bss_conf.beacon_int = cbss->beacon_interval; in ieee80211_prep_connection()
4809 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
4810 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
4815 sdata->vif.bss_conf.sync_dtim_count = tim_ie[2]; in ieee80211_prep_connection()
4817 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4818 } else if (!ieee80211_hw_check(&sdata->local->hw, in ieee80211_prep_connection()
4822 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
4823 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
4825 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4827 sdata->vif.bss_conf.sync_tsf = 0; in ieee80211_prep_connection()
4828 sdata->vif.bss_conf.sync_device_ts = 0; in ieee80211_prep_connection()
4829 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4835 err = ieee80211_prep_channel(sdata, cbss); in ieee80211_prep_connection()
4848 ieee80211_bss_info_change_notify(sdata, in ieee80211_prep_connection()
4858 sdata_info(sdata, in ieee80211_prep_connection()
4874 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
4877 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
4878 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
4958 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_auth()
4966 sdata_info(sdata, in ieee80211_mgd_auth()
4969 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
4973 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_auth()
4978 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); in ieee80211_mgd_auth()
4980 err = ieee80211_prep_connection(sdata, req->bss, false, false); in ieee80211_mgd_auth()
4984 err = ieee80211_auth(sdata); in ieee80211_mgd_auth()
4986 sta_info_destroy_addr(sdata, req->bss->bssid); in ieee80211_mgd_auth()
4996 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_auth()
4998 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_auth()
4999 ieee80211_vif_release_channel(sdata); in ieee80211_mgd_auth()
5000 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_auth()
5006 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
5009 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
5010 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
5037 sdata_info(sdata, in ieee80211_mgd_assoc()
5040 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
5044 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_assoc()
5064 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
5088 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5101 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5112 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5148 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_mgd_assoc()
5150 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_mgd_assoc()
5152 sdata->smps_mode = ifmgd->req_smps; in ieee80211_mgd_assoc()
5173 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
5176 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in ieee80211_mgd_assoc()
5179 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) { in ieee80211_mgd_assoc()
5208 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
5209 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
5210 sdata->control_port_over_nl80211 = in ieee80211_mgd_assoc()
5212 sdata->encrypt_headroom = ieee80211_cs_headroom(local, &req->crypto, in ieee80211_mgd_assoc()
5213 sdata->vif.type); in ieee80211_mgd_assoc()
5229 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_mgd_assoc()
5250 err = ieee80211_prep_connection(sdata, req->bss, true, override); in ieee80211_mgd_assoc()
5257 if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) && in ieee80211_mgd_assoc()
5263 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
5285 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; in ieee80211_mgd_assoc()
5286 sdata->vif.bss_conf.sync_device_ts = in ieee80211_mgd_assoc()
5288 sdata->vif.bss_conf.sync_dtim_count = dtim_count; in ieee80211_mgd_assoc()
5296 run_again(sdata, assoc_data->timeout); in ieee80211_mgd_assoc()
5308 sdata_info(sdata, "associating with AP with corrupt %s\n", in ieee80211_mgd_assoc()
5315 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_assoc()
5322 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
5325 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
5331 sdata_info(sdata, in ieee80211_mgd_deauth()
5336 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_mgd_deauth()
5337 ieee80211_send_deauth_disassoc(sdata, req->bssid, in ieee80211_mgd_deauth()
5341 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
5342 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5351 sdata_info(sdata, in ieee80211_mgd_deauth()
5356 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_mgd_deauth()
5357 ieee80211_send_deauth_disassoc(sdata, req->bssid, in ieee80211_mgd_deauth()
5361 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_deauth()
5362 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5370 sdata_info(sdata, in ieee80211_mgd_deauth()
5375 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
5377 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5386 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
5389 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_disassoc()
5402 sdata_info(sdata, in ieee80211_mgd_disassoc()
5407 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
5411 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_mgd_disassoc()
5417 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
5419 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
5433 sdata_lock(sdata); in ieee80211_mgd_stop()
5436 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_mgd_stop()
5437 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_mgd_stop()
5440 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
5449 sdata_unlock(sdata); in ieee80211_mgd_stop()
5457 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
5459 trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level); in ieee80211_cqm_rssi_notify()
5461 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp); in ieee80211_cqm_rssi_notify()
5467 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_beacon_loss_notify() local
5469 trace_api_cqm_beacon_loss_notify(sdata->local, sdata); in ieee80211_cqm_beacon_loss_notify()
5471 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp); in ieee80211_cqm_beacon_loss_notify()