Lines Matching refs:sdata
106 static void run_again(struct ieee80211_sub_if_data *sdata, in run_again() argument
109 sdata_assert_lock(sdata); in run_again()
111 if (!timer_pending(&sdata->u.mgd.timer) || in run_again()
112 time_before(timeout, sdata->u.mgd.timer.expires)) in run_again()
113 mod_timer(&sdata->u.mgd.timer, timeout); in run_again()
116 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_beacon_monitor() argument
118 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_reset_beacon_monitor()
121 if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) in ieee80211_sta_reset_beacon_monitor()
124 mod_timer(&sdata->u.mgd.bcn_mon_timer, in ieee80211_sta_reset_beacon_monitor()
125 round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout)); in ieee80211_sta_reset_beacon_monitor()
128 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_conn_monitor() argument
130 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_reset_conn_monitor()
132 if (unlikely(!sdata->u.mgd.associated)) in ieee80211_sta_reset_conn_monitor()
137 if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) in ieee80211_sta_reset_conn_monitor()
140 mod_timer(&sdata->u.mgd.conn_mon_timer, in ieee80211_sta_reset_conn_monitor()
150 ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, in ieee80211_determine_chantype() argument
158 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_determine_chantype()
164 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_determine_chantype()
196 sdata_info(sdata, in ieee80211_determine_chantype()
255 sdata_info(sdata, in ieee80211_determine_chantype()
264 sdata_info(sdata, in ieee80211_determine_chantype()
277 sdata_info(sdata, in ieee80211_determine_chantype()
307 cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_determine_chantype()
322 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, in ieee80211_determine_chantype()
335 sdata_info(sdata, in ieee80211_determine_chantype()
342 static int ieee80211_config_bw(struct ieee80211_sub_if_data *sdata, in ieee80211_config_bw() argument
349 struct ieee80211_local *local = sdata->local; in ieee80211_config_bw()
350 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_config_bw()
375 if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) { in ieee80211_config_bw()
377 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; in ieee80211_config_bw()
380 chan = sdata->vif.bss_conf.chandef.chan; in ieee80211_config_bw()
384 flags = ieee80211_determine_chantype(sdata, sband, chan, in ieee80211_config_bw()
405 if (cfg80211_chandef_identical(&chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_config_bw()
408 sdata_info(sdata, in ieee80211_config_bw()
419 sdata_info(sdata, in ieee80211_config_bw()
453 ret = ieee80211_vif_change_bandwidth(sdata, &chandef, changed); in ieee80211_config_bw()
455 sdata_info(sdata, in ieee80211_config_bw()
472 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
486 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
511 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_40MHZ) { in ieee80211_add_ht_ie()
541 static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
554 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
559 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_80P80MHZ) { in ieee80211_add_vht_ie()
568 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_160MHZ) { in ieee80211_add_vht_ie()
596 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
598 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
599 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
612 sdata_assert_lock(sdata); in ieee80211_send_assoc()
615 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_send_assoc()
624 shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_send_assoc()
691 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
821 ieee80211_add_ht_ie(sdata, skb, assoc_data->ap_ht_param, in ieee80211_send_assoc()
822 sband, chan, sdata->smps_mode); in ieee80211_send_assoc()
855 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_send_assoc()
887 drv_mgd_prepare_tx(local, sdata); in ieee80211_send_assoc()
893 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
897 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
902 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
910 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
914 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
919 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
921 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif); in ieee80211_send_nullfunc()
938 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
942 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
948 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
962 memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
963 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
964 memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
965 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
968 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
974 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_work() local
976 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
977 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
980 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
983 sdata_lock(sdata); in ieee80211_chswitch_work()
990 if (!sdata->vif.csa_active) in ieee80211_chswitch_work()
1000 if (sdata->reserved_chanctx) { in ieee80211_chswitch_work()
1006 if (sdata->reserved_ready) in ieee80211_chswitch_work()
1009 ret = ieee80211_vif_use_reserved_context(sdata); in ieee80211_chswitch_work()
1011 sdata_info(sdata, in ieee80211_chswitch_work()
1014 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1022 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in ieee80211_chswitch_work()
1023 &sdata->csa_chandef)) { in ieee80211_chswitch_work()
1024 sdata_info(sdata, in ieee80211_chswitch_work()
1026 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1032 ifmgd->associated->channel = sdata->csa_chandef.chan; in ieee80211_chswitch_work()
1036 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_chswitch_work()
1037 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_chswitch_work()
1042 sdata_unlock(sdata); in ieee80211_chswitch_work()
1045 static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata) in ieee80211_chswitch_post_beacon() argument
1047 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_post_beacon()
1048 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_post_beacon()
1051 sdata_assert_lock(sdata); in ieee80211_chswitch_post_beacon()
1053 WARN_ON(!sdata->vif.csa_active); in ieee80211_chswitch_post_beacon()
1055 if (sdata->csa_block_tx) { in ieee80211_chswitch_post_beacon()
1056 ieee80211_wake_vif_queues(local, sdata, in ieee80211_chswitch_post_beacon()
1058 sdata->csa_block_tx = false; in ieee80211_chswitch_post_beacon()
1061 sdata->vif.csa_active = false; in ieee80211_chswitch_post_beacon()
1064 ret = drv_post_channel_switch(sdata); in ieee80211_chswitch_post_beacon()
1066 sdata_info(sdata, in ieee80211_chswitch_post_beacon()
1073 cfg80211_ch_switch_notify(sdata->dev, &sdata->reserved_chandef); in ieee80211_chswitch_post_beacon()
1078 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
1079 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
1081 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
1083 sdata_info(sdata, in ieee80211_chswitch_done()
1085 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1088 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); in ieee80211_chswitch_done()
1095 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_timer() local
1098 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work); in ieee80211_chswitch_timer()
1102 ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_process_chanswitch() argument
1107 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1108 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1117 sdata_assert_lock(sdata); in ieee80211_sta_process_chanswitch()
1126 if (sdata->vif.csa_active) in ieee80211_sta_process_chanswitch()
1131 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band, in ieee80211_sta_process_chanswitch()
1142 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1154 &sdata->vif.bss_conf.chandef)) { in ieee80211_sta_process_chanswitch()
1157 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1166 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in ieee80211_sta_process_chanswitch()
1169 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1178 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1189 if (drv_pre_channel_switch(sdata, &ch_switch)) { in ieee80211_sta_process_chanswitch()
1190 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1195 res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1198 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1205 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1206 sdata->csa_chandef = csa_ie.chandef; in ieee80211_sta_process_chanswitch()
1207 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1210 if (sdata->csa_block_tx) in ieee80211_sta_process_chanswitch()
1211 ieee80211_stop_vif_queues(local, sdata, in ieee80211_sta_process_chanswitch()
1215 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1220 drv_channel_switch(local, sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1239 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_find_80211h_pwr_constr() argument
1300 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata, in ieee80211_find_cisco_dtpc() argument
1314 static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_pwr_constr() argument
1331 sdata, channel, country_ie, country_ie_len, in ieee80211_handle_pwr_constr()
1339 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco); in ieee80211_handle_pwr_constr()
1351 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1354 sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1357 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1359 pwr_level_cisco, sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1363 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1366 sdata->ap_power_level = new_ap_level; in ieee80211_handle_pwr_constr()
1367 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
1374 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
1391 ieee80211_send_nullfunc(local, sdata, 1); in ieee80211_enable_ps()
1416 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
1418 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
1438 sta = sta_info_get(sdata, mgd->bssid); in ieee80211_powersave_allowed()
1449 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
1458 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
1459 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
1461 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
1469 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
1471 found = sdata; in ieee80211_recalc_ps()
1525 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
1527 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
1529 if (sdata->vif.bss_conf.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
1530 sdata->vif.bss_conf.ps = ps_allowed; in ieee80211_recalc_ps_vif()
1531 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
1557 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
1563 if (!sdata) in ieee80211_dynamic_ps_enable_work()
1566 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
1606 ieee80211_send_nullfunc(local, sdata, 1); in ieee80211_dynamic_ps_enable_work()
1608 ieee80211_flush_queues(local, sdata, false); in ieee80211_dynamic_ps_enable_work()
1632 struct ieee80211_sub_if_data *sdata = in ieee80211_dfs_cac_timer_work() local
1635 struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef; in ieee80211_dfs_cac_timer_work()
1637 mutex_lock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1638 if (sdata->wdev.cac_started) { in ieee80211_dfs_cac_timer_work()
1639 ieee80211_vif_release_channel(sdata); in ieee80211_dfs_cac_timer_work()
1640 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_dfs_cac_timer_work()
1644 mutex_unlock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1648 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in __ieee80211_sta_handle_tspec_ac_params() argument
1650 struct ieee80211_local *local = sdata->local; in __ieee80211_sta_handle_tspec_ac_params()
1651 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_sta_handle_tspec_ac_params()
1677 if (drv_conf_tx(local, sdata, ac, &sdata->tx_conf[ac])) in __ieee80211_sta_handle_tspec_ac_params()
1678 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1695 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac))) in __ieee80211_sta_handle_tspec_ac_params()
1702 if (drv_conf_tx(local, sdata, ac, in __ieee80211_sta_handle_tspec_ac_params()
1703 &sdata->tx_conf[non_acm_ac])) in __ieee80211_sta_handle_tspec_ac_params()
1704 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1721 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_handle_tspec_ac_params() argument
1723 if (__ieee80211_sta_handle_tspec_ac_params(sdata)) in ieee80211_sta_handle_tspec_ac_params()
1724 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); in ieee80211_sta_handle_tspec_ac_params()
1729 struct ieee80211_sub_if_data *sdata; in ieee80211_sta_handle_tspec_ac_params_wk() local
1731 sdata = container_of(work, struct ieee80211_sub_if_data, in ieee80211_sta_handle_tspec_ac_params_wk()
1733 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_sta_handle_tspec_ac_params_wk()
1738 struct ieee80211_sub_if_data *sdata, in ieee80211_sta_wmm_params() argument
1742 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
1773 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
1784 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
1791 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
1798 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
1806 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
1819 mlme_dbg(sdata, in ieee80211_sta_wmm_params()
1825 sdata->tx_conf[queue] = params; in ieee80211_sta_wmm_params()
1827 drv_conf_tx(local, sdata, queue, ¶ms)) in ieee80211_sta_wmm_params()
1828 sdata_err(sdata, in ieee80211_sta_wmm_params()
1834 sdata->vif.bss_conf.qos = true; in ieee80211_sta_wmm_params()
1838 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
1840 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
1842 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL; in __ieee80211_stop_poll()
1843 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
1846 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
1848 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
1849 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
1850 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
1853 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_bss_capability() argument
1856 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_handle_bss_capability()
1871 if (ieee80211_get_sdata_band(sdata) == IEEE80211_BAND_5GHZ) in ieee80211_handle_bss_capability()
1892 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
1897 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
1898 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_set_associated()
1901 bss_info_changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_set_associated()
1904 sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec( in ieee80211_set_associated()
1907 sdata->u.mgd.associated = cbss; in ieee80211_set_associated()
1908 memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); in ieee80211_set_associated()
1910 sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE; in ieee80211_set_associated()
1912 if (sdata->vif.p2p) { in ieee80211_set_associated()
1926 sdata->u.mgd.p2p_noa_index = in ieee80211_set_associated()
1935 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
1939 if (sdata->u.mgd.have_beacon) { in ieee80211_set_associated()
1946 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; in ieee80211_set_associated()
1957 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_set_associated()
1965 ieee80211_bss_info_change_notify(sdata, bss_info_changed); in ieee80211_set_associated()
1971 ieee80211_recalc_smps(sdata); in ieee80211_set_associated()
1972 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
1974 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
1977 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
1981 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
1982 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
1985 sdata_assert_lock(sdata); in ieee80211_set_disassoc()
1993 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
1996 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
2010 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
2022 ieee80211_flush_queues(local, sdata, true); in ieee80211_set_disassoc()
2026 ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, stype, in ieee80211_set_disassoc()
2031 ieee80211_flush_queues(local, sdata, false); in ieee80211_set_disassoc()
2037 sta_info_flush(sdata); in ieee80211_set_disassoc()
2040 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
2044 sdata->vif.bss_conf.assoc = false; in ieee80211_set_disassoc()
2047 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
2048 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
2056 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
2062 if (sdata->vif.bss_conf.arp_addr_cnt) in ieee80211_set_disassoc()
2065 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
2070 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
2073 ieee80211_set_wmm_default(sdata, false); in ieee80211_set_disassoc()
2075 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
2076 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
2077 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
2078 del_timer_sync(&sdata->u.mgd.chswitch_timer); in ieee80211_set_disassoc()
2080 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
2081 sdata->vif.bss_conf.beacon_rate = NULL; in ieee80211_set_disassoc()
2087 ieee80211_vif_release_channel(sdata); in ieee80211_set_disassoc()
2089 sdata->vif.csa_active = false; in ieee80211_set_disassoc()
2092 if (sdata->csa_block_tx) { in ieee80211_set_disassoc()
2093 ieee80211_wake_vif_queues(local, sdata, in ieee80211_set_disassoc()
2095 sdata->csa_block_tx = false; in ieee80211_set_disassoc()
2103 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_set_disassoc()
2106 void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_notify() argument
2120 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_rx_notify()
2123 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
2125 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
2126 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
2132 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
2138 if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) in ieee80211_reset_ap_probe()
2146 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
2155 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_wmm_ac_notify() argument
2159 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_tx_wmm_ac_notify()
2190 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
2193 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time); in ieee80211_sta_tx_notify()
2199 sdata->u.mgd.probe_send_count > 0) { in ieee80211_sta_tx_notify()
2201 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2203 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
2204 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_tx_notify()
2209 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2212 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
2214 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
2236 if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { in ieee80211_mgd_probe_ap_send()
2238 ieee80211_send_nullfunc(sdata->local, sdata, 0); in ieee80211_mgd_probe_ap_send()
2249 ieee80211_send_probe_req(sdata, sdata->vif.addr, dst, in ieee80211_mgd_probe_ap_send()
2257 run_again(sdata, ifmgd->probe_timeout); in ieee80211_mgd_probe_ap_send()
2260 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
2263 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
2266 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
2269 sdata_lock(sdata); in ieee80211_mgd_probe_ap()
2274 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2276 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
2277 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2282 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
2286 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL); in ieee80211_mgd_probe_ap()
2305 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2310 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2311 ieee80211_recalc_ps(sdata->local, -1); in ieee80211_mgd_probe_ap()
2312 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2315 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
2317 sdata_unlock(sdata); in ieee80211_mgd_probe_ap()
2323 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
2324 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
2330 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_ap_probereq_get()
2333 sdata_assert_lock(sdata); in ieee80211_ap_probereq_get()
2351 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, in ieee80211_ap_probereq_get()
2361 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata, in ieee80211_report_disconnect() argument
2372 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2374 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2376 drv_event_callback(sdata->local, sdata, &event); in ieee80211_report_disconnect()
2379 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
2381 struct ieee80211_local *local = sdata->local; in __ieee80211_disconnect()
2382 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_disconnect()
2385 sdata_lock(sdata); in __ieee80211_disconnect()
2387 sdata_unlock(sdata); in __ieee80211_disconnect()
2391 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in __ieee80211_disconnect()
2395 sdata->vif.csa_active = false; in __ieee80211_disconnect()
2397 if (sdata->csa_block_tx) { in __ieee80211_disconnect()
2398 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_disconnect()
2400 sdata->csa_block_tx = false; in __ieee80211_disconnect()
2404 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in __ieee80211_disconnect()
2407 sdata_unlock(sdata); in __ieee80211_disconnect()
2412 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
2415 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
2420 sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_beacon_connection_loss_work()
2427 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
2429 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
2431 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
2437 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
2441 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
2446 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
2447 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
2449 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
2451 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
2452 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
2458 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
2459 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
2461 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
2463 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
2464 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
2469 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
2472 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
2474 sdata_assert_lock(sdata); in ieee80211_destroy_auth_data()
2482 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_auth_data()
2483 sta_info_destroy_addr(sdata, auth_data->bss->bssid); in ieee80211_destroy_auth_data()
2485 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_auth_data()
2486 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_auth_data()
2487 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
2488 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2489 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_auth_data()
2490 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2493 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
2495 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
2498 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
2501 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
2502 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
2512 drv_mgd_prepare_tx(sdata->local, sdata); in ieee80211_auth_challenge()
2516 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
2523 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
2526 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
2535 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_auth()
2554 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
2562 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
2564 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
2565 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2568 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
2580 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
2592 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
2593 sdata_info(sdata, "authenticated\n"); in ieee80211_rx_mgmt_auth()
2597 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_rx_mgmt_auth()
2605 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2610 mutex_lock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2611 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_auth()
2613 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid); in ieee80211_rx_mgmt_auth()
2617 sdata_info(sdata, "failed moving %pM to auth\n", bssid); in ieee80211_rx_mgmt_auth()
2620 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2622 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
2625 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2686 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
2689 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
2693 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_deauth()
2706 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_deauth()
2709 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
2711 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code); in ieee80211_rx_mgmt_deauth()
2715 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
2718 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
2721 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_disassoc()
2732 sdata_info(sdata, "disassociated from %pM (Reason: %u)\n", in ieee80211_rx_mgmt_disassoc()
2735 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
2737 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code); in ieee80211_rx_mgmt_disassoc()
2791 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
2794 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
2796 sdata_assert_lock(sdata); in ieee80211_destroy_assoc_data()
2804 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_assoc_data()
2805 sta_info_destroy_addr(sdata, assoc_data->bss->bssid); in ieee80211_destroy_assoc_data()
2807 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_assoc_data()
2808 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_assoc_data()
2809 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
2810 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2811 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_assoc_data()
2812 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2816 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
2819 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
2823 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
2824 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
2830 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_assoc_success()
2843 sdata_info(sdata, "invalid AID value 0x%x; bits 15:14 not set\n", in ieee80211_assoc_success()
2850 sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n", in ieee80211_assoc_success()
2860 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_success()
2898 sdata_info(sdata, in ieee80211_assoc_success()
2909 sdata_info(sdata, in ieee80211_assoc_success()
2915 sdata_info(sdata, in ieee80211_assoc_success()
2921 sdata_info(sdata, in ieee80211_assoc_success()
2927 sdata_info(sdata, in ieee80211_assoc_success()
2938 sdata_info(sdata, in ieee80211_assoc_success()
2946 sdata_info(sdata, in ieee80211_assoc_success()
2952 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
2957 sta = sta_info_get(sdata, cbss->bssid); in ieee80211_assoc_success()
2959 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
2964 sband = local->hw.wiphy->bands[ieee80211_get_sdata_band(sdata)]; in ieee80211_assoc_success()
2968 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_success()
2972 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_success()
3012 sdata_info(sdata, in ieee80211_assoc_success()
3016 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3021 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3032 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_assoc_success()
3035 ieee80211_set_wmm_default(sdata, false); in ieee80211_assoc_success()
3042 ieee80211_set_associated(sdata, cbss, changed); in ieee80211_assoc_success()
3049 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
3055 ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt); in ieee80211_assoc_success()
3056 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
3064 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
3068 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
3081 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_assoc_resp()
3101 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3115 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3121 run_again(sdata, assoc_data->timeout); in ieee80211_rx_mgmt_assoc_resp()
3128 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
3130 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_rx_mgmt_assoc_resp()
3133 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3135 if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) { in ieee80211_rx_mgmt_assoc_resp()
3137 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_rx_mgmt_assoc_resp()
3138 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_rx_mgmt_assoc_resp()
3142 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3143 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
3150 ieee80211_destroy_assoc_data(sdata, true); in ieee80211_rx_mgmt_assoc_resp()
3155 if (sdata->tx_conf[ac].uapsd) in ieee80211_rx_mgmt_assoc_resp()
3159 cfg80211_rx_assoc_resp(sdata->dev, bss, (u8 *)mgmt, len, uapsd_queues); in ieee80211_rx_mgmt_assoc_resp()
3162 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_bss_info() argument
3167 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
3171 sdata_assert_lock(sdata); in ieee80211_rx_bss_info()
3180 sdata->vif.bss_conf.beacon_rate = bss->beacon_rate; in ieee80211_rx_bss_info()
3186 static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_probe_resp() argument
3195 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
3197 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_probe_resp()
3199 if (!ether_addr_equal(mgmt->da, sdata->vif.addr)) in ieee80211_rx_mgmt_probe_resp()
3209 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_probe_resp()
3213 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
3218 sdata_info(sdata, "direct probe responded\n"); in ieee80211_rx_mgmt_probe_resp()
3222 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_rx_mgmt_probe_resp()
3250 static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_beacon() argument
3254 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
3255 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
3258 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
3269 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_beacon()
3277 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_rx_mgmt_beacon()
3295 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_beacon()
3303 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3305 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3308 sdata->vif.bss_conf.sync_dtim_count = in ieee80211_rx_mgmt_beacon()
3311 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_rx_mgmt_beacon()
3316 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_rx_mgmt_beacon()
3357 drv_event_callback(local, sdata, &event); in ieee80211_rx_mgmt_beacon()
3363 drv_event_callback(local, sdata, &event); in ieee80211_rx_mgmt_beacon()
3369 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_rx_mgmt_beacon()
3378 &sdata->vif, in ieee80211_rx_mgmt_beacon()
3385 &sdata->vif, in ieee80211_rx_mgmt_beacon()
3392 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
3394 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_beacon()
3401 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
3419 ieee80211_send_nullfunc(local, sdata, 0); in ieee80211_rx_mgmt_beacon()
3420 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
3431 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
3436 if (sdata->vif.p2p) { in ieee80211_rx_mgmt_beacon()
3445 if (sdata->u.mgd.p2p_noa_index != noa.index) { in ieee80211_rx_mgmt_beacon()
3447 sdata->u.mgd.p2p_noa_index = noa.index; in ieee80211_rx_mgmt_beacon()
3456 } else if (sdata->u.mgd.p2p_noa_index != -1) { in ieee80211_rx_mgmt_beacon()
3458 sdata->u.mgd.p2p_noa_index = -1; in ieee80211_rx_mgmt_beacon()
3466 ieee80211_chswitch_post_beacon(sdata); in ieee80211_rx_mgmt_beacon()
3477 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3479 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3482 sdata->vif.bss_conf.sync_dtim_count = in ieee80211_rx_mgmt_beacon()
3485 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_rx_mgmt_beacon()
3493 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_beacon()
3495 ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, in ieee80211_rx_mgmt_beacon()
3500 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_rx_mgmt_beacon()
3522 ieee80211_recalc_ps_vif(sdata); in ieee80211_rx_mgmt_beacon()
3531 changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_rx_mgmt_beacon()
3536 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_beacon()
3538 if (ieee80211_config_bw(sdata, sta, in ieee80211_rx_mgmt_beacon()
3542 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
3545 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
3552 ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif, in ieee80211_rx_mgmt_beacon()
3556 changed |= ieee80211_handle_pwr_constr(sdata, chan, mgmt, in ieee80211_rx_mgmt_beacon()
3562 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_rx_mgmt_beacon()
3565 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
3578 sdata_lock(sdata); in ieee80211_sta_rx_queued_mgmt()
3582 ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, rx_status); in ieee80211_sta_rx_queued_mgmt()
3585 ieee80211_rx_mgmt_probe_resp(sdata, skb); in ieee80211_sta_rx_queued_mgmt()
3588 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3591 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3594 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3598 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3616 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
3639 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
3646 sdata_unlock(sdata); in ieee80211_sta_rx_queued_mgmt()
3651 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
3654 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_timer()
3657 static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
3662 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
3665 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_sta_connection_lost()
3669 static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_probe_auth() argument
3671 struct ieee80211_local *local = sdata->local; in ieee80211_probe_auth()
3672 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_probe_auth()
3676 sdata_assert_lock(sdata); in ieee80211_probe_auth()
3684 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_probe_auth()
3696 drv_mgd_prepare_tx(local, sdata); in ieee80211_probe_auth()
3702 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_probe_auth()
3718 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_probe_auth()
3726 sdata_info(sdata, "direct probe to %pM (try %d/%i)\n", in ieee80211_probe_auth()
3740 ieee80211_send_probe_req(sdata, sdata->vif.addr, NULL, in ieee80211_probe_auth()
3750 run_again(sdata, auth_data->timeout); in ieee80211_probe_auth()
3755 run_again(sdata, auth_data->timeout); in ieee80211_probe_auth()
3761 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
3763 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
3764 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
3766 sdata_assert_lock(sdata); in ieee80211_do_assoc()
3770 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
3782 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
3785 ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
3790 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
3796 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
3802 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
3805 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
3807 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
3808 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
3809 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
3811 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mgd_conn_tx_status()
3814 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
3816 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
3817 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
3819 sdata_lock(sdata); in ieee80211_sta_work()
3831 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
3842 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
3857 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
3858 } else if (ieee80211_probe_auth(sdata)) { in ieee80211_sta_work()
3868 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
3870 cfg80211_auth_timeout(sdata->dev, bssid); in ieee80211_sta_work()
3871 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
3874 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
3879 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
3887 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_sta_work()
3888 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_sta_work()
3889 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
3892 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
3908 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
3911 mlme_dbg(sdata, in ieee80211_sta_work()
3915 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
3917 mlme_dbg(sdata, in ieee80211_sta_work()
3920 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
3925 run_again(sdata, ifmgd->probe_timeout); in ieee80211_sta_work()
3927 mlme_dbg(sdata, in ieee80211_sta_work()
3930 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
3933 mlme_dbg(sdata, in ieee80211_sta_work()
3937 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
3946 sdata->name, in ieee80211_sta_work()
3949 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
3954 sdata_unlock(sdata); in ieee80211_sta_work()
3959 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
3961 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_bcn_mon_timer()
3963 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_bcn_mon_timer()
3966 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
3967 ieee80211_queue_work(&sdata->local->hw, in ieee80211_sta_bcn_mon_timer()
3968 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
3973 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
3975 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
3976 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
3978 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_conn_mon_timer()
3986 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
3990 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
3993 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
3997 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
3998 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
4001 flags = sdata->local->hw.flags; in ieee80211_restart_sta_timer()
4003 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
4004 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
4009 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_quiesce() argument
4011 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_quiesce()
4014 sdata_lock(sdata); in ieee80211_mgd_quiesce()
4026 ieee80211_send_deauth_disassoc(sdata, bssid, in ieee80211_mgd_quiesce()
4031 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_mgd_quiesce()
4033 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_quiesce()
4034 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, in ieee80211_mgd_quiesce()
4055 if (ifmgd->associated && !sdata->local->wowlan) { in ieee80211_mgd_quiesce()
4063 ieee80211_mgd_deauth(sdata, &req); in ieee80211_mgd_quiesce()
4066 sdata_unlock(sdata); in ieee80211_mgd_quiesce()
4069 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
4071 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
4073 sdata_lock(sdata); in ieee80211_sta_restart()
4075 sdata_unlock(sdata); in ieee80211_sta_restart()
4079 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
4080 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
4081 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
4082 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
4086 sdata_unlock(sdata); in ieee80211_sta_restart()
4089 sdata_unlock(sdata); in ieee80211_sta_restart()
4094 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
4098 ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
4109 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
4111 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
4113 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
4115 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
4120 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
4121 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
4122 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
4125 if (sdata->local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS) in ieee80211_sta_setup_sdata()
4139 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
4143 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
4144 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
4145 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
4165 static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, in ieee80211_ht_vht_rx_chains() argument
4168 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ht_vht_rx_chains()
4209 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
4212 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
4213 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_channel()
4257 sdata_info(sdata, in ieee80211_prep_channel()
4270 ifmgd->flags |= ieee80211_determine_chantype(sdata, sband, in ieee80211_prep_channel()
4275 sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss), in ieee80211_prep_channel()
4281 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_prep_channel()
4289 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
4299 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
4307 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
4310 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
4311 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
4326 have_sta = sta_info_get(sdata, cbss->bssid); in ieee80211_prep_connection()
4331 new_sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL); in ieee80211_prep_connection()
4337 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_prep_connection()
4344 err = ieee80211_prep_channel(sdata, cbss); in ieee80211_prep_connection()
4358 int shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_prep_connection()
4362 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_prep_connection()
4387 sdata_info(sdata, in ieee80211_prep_connection()
4393 sdata->vif.bss_conf.basic_rates = basic_rates; in ieee80211_prep_connection()
4398 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
4400 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
4405 sdata->vif.bss_conf.beacon_int = cbss->beacon_interval; in ieee80211_prep_connection()
4411 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
4412 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
4417 sdata->vif.bss_conf.sync_dtim_count = tim_ie[2]; in ieee80211_prep_connection()
4419 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4424 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
4425 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
4427 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4429 sdata->vif.bss_conf.sync_tsf = 0; in ieee80211_prep_connection()
4430 sdata->vif.bss_conf.sync_device_ts = 0; in ieee80211_prep_connection()
4431 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4436 ieee80211_bss_info_change_notify(sdata, in ieee80211_prep_connection()
4446 sdata_info(sdata, in ieee80211_prep_connection()
4462 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
4465 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
4466 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
4534 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_auth()
4542 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
4546 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_auth()
4551 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); in ieee80211_mgd_auth()
4553 err = ieee80211_prep_connection(sdata, req->bss, false); in ieee80211_mgd_auth()
4557 err = ieee80211_probe_auth(sdata); in ieee80211_mgd_auth()
4559 sta_info_destroy_addr(sdata, req->bss->bssid); in ieee80211_mgd_auth()
4569 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_auth()
4576 static bool ieee80211_usable_wmm_params(struct ieee80211_sub_if_data *sdata, in ieee80211_usable_wmm_params() argument
4598 sdata_info(sdata, in ieee80211_usable_wmm_params()
4604 sdata_info(sdata, in ieee80211_usable_wmm_params()
4614 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
4617 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
4618 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
4644 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
4648 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_assoc()
4668 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
4703 if (!wp || !ieee80211_usable_wmm_params(sdata, wp + 2, in ieee80211_mgd_assoc()
4724 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
4745 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
4756 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
4777 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_mgd_assoc()
4779 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_mgd_assoc()
4781 sdata->smps_mode = ifmgd->req_smps; in ieee80211_mgd_assoc()
4802 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
4805 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in ieee80211_mgd_assoc()
4808 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) { in ieee80211_mgd_assoc()
4837 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
4838 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
4839 sdata->encrypt_headroom = ieee80211_cs_headroom(local, &req->crypto, in ieee80211_mgd_assoc()
4840 sdata->vif.type); in ieee80211_mgd_assoc()
4848 err = ieee80211_prep_connection(sdata, req->bss, true); in ieee80211_mgd_assoc()
4855 if (sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC && in ieee80211_mgd_assoc()
4861 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
4883 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; in ieee80211_mgd_assoc()
4884 sdata->vif.bss_conf.sync_device_ts = in ieee80211_mgd_assoc()
4886 sdata->vif.bss_conf.sync_dtim_count = dtim_count; in ieee80211_mgd_assoc()
4894 run_again(sdata, assoc_data->timeout); in ieee80211_mgd_assoc()
4906 sdata_info(sdata, "associating with AP with corrupt %s\n", in ieee80211_mgd_assoc()
4913 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_assoc()
4920 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
4923 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
4929 sdata_info(sdata, in ieee80211_mgd_deauth()
4934 drv_mgd_prepare_tx(sdata->local, sdata); in ieee80211_mgd_deauth()
4935 ieee80211_send_deauth_disassoc(sdata, req->bssid, in ieee80211_mgd_deauth()
4939 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
4940 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
4949 sdata_info(sdata, in ieee80211_mgd_deauth()
4954 drv_mgd_prepare_tx(sdata->local, sdata); in ieee80211_mgd_deauth()
4955 ieee80211_send_deauth_disassoc(sdata, req->bssid, in ieee80211_mgd_deauth()
4959 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_mgd_deauth()
4960 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
4968 sdata_info(sdata, in ieee80211_mgd_deauth()
4973 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
4975 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
4984 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
4987 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_disassoc()
5000 sdata_info(sdata, in ieee80211_mgd_disassoc()
5005 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
5009 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_mgd_disassoc()
5015 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
5017 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
5031 sdata_lock(sdata); in ieee80211_mgd_stop()
5034 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_mgd_stop()
5035 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_mgd_stop()
5038 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
5047 sdata_unlock(sdata); in ieee80211_mgd_stop()
5054 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
5056 trace_api_cqm_rssi_notify(sdata, rssi_event); in ieee80211_cqm_rssi_notify()
5058 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, gfp); in ieee80211_cqm_rssi_notify()
5064 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_beacon_loss_notify() local
5066 trace_api_cqm_beacon_loss_notify(sdata->local, sdata); in ieee80211_cqm_beacon_loss_notify()
5068 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp); in ieee80211_cqm_beacon_loss_notify()