• Home
  • Raw
  • Download

Lines Matching refs:sdata

101 static void run_again(struct ieee80211_sub_if_data *sdata,  in run_again()  argument
104 sdata_assert_lock(sdata); in run_again()
106 if (!timer_pending(&sdata->u.mgd.timer) || in run_again()
107 time_before(timeout, sdata->u.mgd.timer.expires)) in run_again()
108 mod_timer(&sdata->u.mgd.timer, timeout); in run_again()
111 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_beacon_monitor() argument
113 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_reset_beacon_monitor()
116 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_beacon_monitor()
119 mod_timer(&sdata->u.mgd.bcn_mon_timer, in ieee80211_sta_reset_beacon_monitor()
120 round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout)); in ieee80211_sta_reset_beacon_monitor()
123 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_conn_monitor() argument
125 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_reset_conn_monitor()
133 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_sta_reset_conn_monitor()
146 ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, in ieee80211_determine_chantype() argument
156 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_determine_chantype()
168 if (!ieee80211_chandef_he_6ghz_oper(sdata, he_oper, chandef)) in ieee80211_determine_chantype()
178 sdata_info(sdata, in ieee80211_determine_chantype()
191 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_determine_chantype()
213 sdata_info(sdata, in ieee80211_determine_chantype()
252 if (!ieee80211_chandef_vht_oper(&sdata->local->hw, vht_cap_info, in ieee80211_determine_chantype()
256 sdata_info(sdata, in ieee80211_determine_chantype()
261 } else if (!ieee80211_chandef_vht_oper(&sdata->local->hw, in ieee80211_determine_chantype()
266 sdata_info(sdata, in ieee80211_determine_chantype()
274 sdata_info(sdata, in ieee80211_determine_chantype()
287 sdata_info(sdata, in ieee80211_determine_chantype()
317 cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_determine_chantype()
332 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, in ieee80211_determine_chantype()
345 if (!he_oper || !cfg80211_chandef_usable(sdata->wdev.wiphy, chandef, in ieee80211_determine_chantype()
350 sdata_info(sdata, in ieee80211_determine_chantype()
357 static int ieee80211_config_bw(struct ieee80211_sub_if_data *sdata, in ieee80211_config_bw() argument
367 struct ieee80211_local *local = sdata->local; in ieee80211_config_bw()
368 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_config_bw()
369 struct ieee80211_channel *chan = sdata->vif.bss_conf.chandef.chan; in ieee80211_config_bw()
400 if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) { in ieee80211_config_bw()
402 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; in ieee80211_config_bw()
409 flags = ieee80211_determine_chantype(sdata, sband, chan, vht_cap_info, in ieee80211_config_bw()
430 if (cfg80211_chandef_identical(&chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_config_bw()
433 sdata_info(sdata, in ieee80211_config_bw()
448 sdata_info(sdata, in ieee80211_config_bw()
482 ret = ieee80211_vif_change_bandwidth(sdata, &chandef, changed); in ieee80211_config_bw()
484 sdata_info(sdata, in ieee80211_config_bw()
501 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
515 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
540 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_40MHZ) { in ieee80211_add_ht_ie()
575 static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
580 struct ieee80211_local *local = sdata->local; in ieee80211_add_vht_ie()
589 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
594 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_80P80MHZ) { in ieee80211_add_vht_ie()
603 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_160MHZ) { in ieee80211_add_vht_ie()
640 sdata->vif.mu_mimo_owner = true; in ieee80211_add_vht_ie()
661 static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_he_ie() argument
672 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_add_he_ie()
674 reg_cap = cfg80211_chandef_usable(sdata->wdev.wiphy, in ieee80211_add_he_ie()
696 ieee80211_ie_build_he_6ghz_cap(sdata, skb); in ieee80211_add_he_ie()
699 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
701 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
702 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
723 sdata_assert_lock(sdata); in ieee80211_send_assoc()
726 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_send_assoc()
734 shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_send_assoc()
800 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
951 ieee80211_add_ht_ie(sdata, skb, assoc_data->ap_ht_param, in ieee80211_send_assoc()
952 sband, chan, sdata->smps_mode); in ieee80211_send_assoc()
1006 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_send_assoc()
1019 ieee80211_add_he_ie(sdata, skb, sband); in ieee80211_send_assoc()
1043 ieee80211_add_aid_request_ie(sdata, skb); in ieee80211_send_assoc()
1044 ieee80211_add_s1g_capab_ie(sdata, &sband->s1g_cap, skb); in ieee80211_send_assoc()
1064 drv_mgd_prepare_tx(local, sdata, 0); in ieee80211_send_assoc()
1070 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
1074 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
1079 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
1087 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
1091 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
1096 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
1098 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif, in ieee80211_send_nullfunc()
1116 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
1120 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
1126 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
1139 memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1140 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1141 memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1142 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
1145 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
1151 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_work() local
1153 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
1154 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
1157 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
1160 sdata_lock(sdata); in ieee80211_chswitch_work()
1167 if (!sdata->vif.csa_active) in ieee80211_chswitch_work()
1177 if (sdata->reserved_chanctx) { in ieee80211_chswitch_work()
1187 if (sdata->reserved_ready) in ieee80211_chswitch_work()
1190 if (sdata->vif.bss_conf.chandef.width != in ieee80211_chswitch_work()
1191 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1202 switch (sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1220 mgd_sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_chswitch_work()
1222 local->hw.wiphy->bands[sdata->csa_chandef.chan->band]; in ieee80211_chswitch_work()
1225 if (sdata->vif.bss_conf.chandef.width > in ieee80211_chswitch_work()
1226 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1232 ret = ieee80211_vif_use_reserved_context(sdata); in ieee80211_chswitch_work()
1234 sdata_info(sdata, in ieee80211_chswitch_work()
1237 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1242 if (sdata->vif.bss_conf.chandef.width < in ieee80211_chswitch_work()
1243 sdata->csa_chandef.width) { in ieee80211_chswitch_work()
1252 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in ieee80211_chswitch_work()
1253 &sdata->csa_chandef)) { in ieee80211_chswitch_work()
1254 sdata_info(sdata, in ieee80211_chswitch_work()
1256 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_work()
1263 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_chswitch_work()
1264 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_chswitch_work()
1269 sdata_unlock(sdata); in ieee80211_chswitch_work()
1272 static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata) in ieee80211_chswitch_post_beacon() argument
1274 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_post_beacon()
1275 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_post_beacon()
1278 sdata_assert_lock(sdata); in ieee80211_chswitch_post_beacon()
1280 WARN_ON(!sdata->vif.csa_active); in ieee80211_chswitch_post_beacon()
1282 if (sdata->csa_block_tx) { in ieee80211_chswitch_post_beacon()
1283 ieee80211_wake_vif_queues(local, sdata, in ieee80211_chswitch_post_beacon()
1285 sdata->csa_block_tx = false; in ieee80211_chswitch_post_beacon()
1288 sdata->vif.csa_active = false; in ieee80211_chswitch_post_beacon()
1296 ret = drv_post_channel_switch(sdata); in ieee80211_chswitch_post_beacon()
1298 sdata_info(sdata, in ieee80211_chswitch_post_beacon()
1305 cfg80211_ch_switch_notify(sdata->dev, &sdata->reserved_chandef); in ieee80211_chswitch_post_beacon()
1310 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
1311 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
1313 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
1315 sdata_info(sdata, in ieee80211_chswitch_done()
1317 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1320 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); in ieee80211_chswitch_done()
1327 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_timer() local
1328 from_timer(sdata, t, u.mgd.chswitch_timer); in ieee80211_chswitch_timer()
1330 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work); in ieee80211_chswitch_timer()
1334 ieee80211_sta_abort_chanswitch(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_abort_chanswitch() argument
1336 struct ieee80211_local *local = sdata->local; in ieee80211_sta_abort_chanswitch()
1344 ieee80211_vif_unreserve_chanctx(sdata); in ieee80211_sta_abort_chanswitch()
1347 if (sdata->csa_block_tx) in ieee80211_sta_abort_chanswitch()
1348 ieee80211_wake_vif_queues(local, sdata, in ieee80211_sta_abort_chanswitch()
1351 sdata->csa_block_tx = false; in ieee80211_sta_abort_chanswitch()
1352 sdata->vif.csa_active = false; in ieee80211_sta_abort_chanswitch()
1356 drv_abort_channel_switch(sdata); in ieee80211_sta_abort_chanswitch()
1360 ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_process_chanswitch() argument
1365 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1366 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1376 sdata_assert_lock(sdata); in ieee80211_sta_process_chanswitch()
1386 res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band, in ieee80211_sta_process_chanswitch()
1406 if (beacon && sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) { in ieee80211_sta_process_chanswitch()
1408 ieee80211_sta_abort_chanswitch(sdata); in ieee80211_sta_process_chanswitch()
1410 drv_channel_switch_rx_beacon(sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1412 } else if (sdata->vif.csa_active || res) { in ieee80211_sta_process_chanswitch()
1419 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1435 &sdata->vif.bss_conf.chandef) && in ieee80211_sta_process_chanswitch()
1439 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1452 ieee80211_teardown_tdls_peers(sdata); in ieee80211_sta_process_chanswitch()
1456 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in ieee80211_sta_process_chanswitch()
1459 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1468 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1473 if (drv_pre_channel_switch(sdata, &ch_switch)) { in ieee80211_sta_process_chanswitch()
1474 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1479 res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1482 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1489 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1490 sdata->csa_chandef = csa_ie.chandef; in ieee80211_sta_process_chanswitch()
1491 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1494 if (sdata->csa_block_tx) in ieee80211_sta_process_chanswitch()
1495 ieee80211_stop_vif_queues(local, sdata, in ieee80211_sta_process_chanswitch()
1499 cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, in ieee80211_sta_process_chanswitch()
1504 drv_channel_switch(local, sdata, &ch_switch); in ieee80211_sta_process_chanswitch()
1524 sdata->vif.csa_active = true; in ieee80211_sta_process_chanswitch()
1525 sdata->csa_block_tx = csa_ie.mode; in ieee80211_sta_process_chanswitch()
1533 ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_find_80211h_pwr_constr() argument
1595 static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata, in ieee80211_find_cisco_dtpc() argument
1609 static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_pwr_constr() argument
1629 sdata, channel, country_ie, country_ie_len, in ieee80211_handle_pwr_constr()
1637 sdata, channel, cisco_dtpc_ie, &pwr_level_cisco); in ieee80211_handle_pwr_constr()
1651 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1654 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1657 sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1661 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1664 sdata_dbg(sdata, in ieee80211_handle_pwr_constr()
1666 pwr_level_cisco, sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1669 sdata->ap_power_level = new_ap_level; in ieee80211_handle_pwr_constr()
1670 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
1677 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
1694 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_enable_ps()
1719 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
1721 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
1741 sta = sta_info_get(sdata, mgd->bssid); in ieee80211_powersave_allowed()
1752 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
1761 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
1762 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
1764 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
1772 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
1774 found = sdata; in ieee80211_recalc_ps()
1799 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
1801 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
1803 if (sdata->vif.bss_conf.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
1804 sdata->vif.bss_conf.ps = ps_allowed; in ieee80211_recalc_ps_vif()
1805 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
1831 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
1837 if (!sdata) in ieee80211_dynamic_ps_enable_work()
1840 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
1880 ieee80211_send_nullfunc(local, sdata, true); in ieee80211_dynamic_ps_enable_work()
1882 ieee80211_flush_queues(local, sdata, false); in ieee80211_dynamic_ps_enable_work()
1905 struct ieee80211_sub_if_data *sdata = in ieee80211_dfs_cac_timer_work() local
1908 struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef; in ieee80211_dfs_cac_timer_work()
1910 mutex_lock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1911 if (sdata->wdev.cac_started) { in ieee80211_dfs_cac_timer_work()
1912 ieee80211_vif_release_channel(sdata); in ieee80211_dfs_cac_timer_work()
1913 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_dfs_cac_timer_work()
1917 mutex_unlock(&sdata->local->mtx); in ieee80211_dfs_cac_timer_work()
1921 __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in __ieee80211_sta_handle_tspec_ac_params() argument
1923 struct ieee80211_local *local = sdata->local; in __ieee80211_sta_handle_tspec_ac_params()
1924 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_sta_handle_tspec_ac_params()
1950 if (drv_conf_tx(local, sdata, ac, &sdata->tx_conf[ac])) in __ieee80211_sta_handle_tspec_ac_params()
1951 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1968 if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac))) in __ieee80211_sta_handle_tspec_ac_params()
1979 if (drv_conf_tx(local, sdata, ac, in __ieee80211_sta_handle_tspec_ac_params()
1980 &sdata->tx_conf[non_acm_ac])) in __ieee80211_sta_handle_tspec_ac_params()
1981 sdata_err(sdata, in __ieee80211_sta_handle_tspec_ac_params()
1998 void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_handle_tspec_ac_params() argument
2000 if (__ieee80211_sta_handle_tspec_ac_params(sdata)) in ieee80211_sta_handle_tspec_ac_params()
2001 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); in ieee80211_sta_handle_tspec_ac_params()
2006 struct ieee80211_sub_if_data *sdata; in ieee80211_sta_handle_tspec_ac_params_wk() local
2008 sdata = container_of(work, struct ieee80211_sub_if_data, in ieee80211_sta_handle_tspec_ac_params_wk()
2010 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_sta_handle_tspec_ac_params_wk()
2016 struct ieee80211_sub_if_data *sdata, in ieee80211_sta_wmm_params() argument
2021 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
2059 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
2069 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
2079 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
2089 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
2100 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
2112 sdata_info(sdata, in ieee80211_sta_wmm_params()
2125 sdata_info(sdata, in ieee80211_sta_wmm_params()
2130 ieee80211_regulatory_limit_wmm_params(sdata, &params[ac], ac); in ieee80211_sta_wmm_params()
2136 sdata_info(sdata, in ieee80211_sta_wmm_params()
2144 mlme_dbg(sdata, in ieee80211_sta_wmm_params()
2150 sdata->tx_conf[ac] = params[ac]; in ieee80211_sta_wmm_params()
2152 drv_conf_tx(local, sdata, ac, &params[ac])) in ieee80211_sta_wmm_params()
2153 sdata_err(sdata, in ieee80211_sta_wmm_params()
2159 sdata->vif.bss_conf.qos = true; in ieee80211_sta_wmm_params()
2163 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
2165 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
2167 sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL; in __ieee80211_stop_poll()
2168 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
2171 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
2173 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
2174 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
2175 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
2178 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_bss_capability() argument
2181 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_handle_bss_capability()
2188 sband = ieee80211_get_sband(sdata); in ieee80211_handle_bss_capability()
2223 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
2228 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
2229 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_set_associated()
2232 bss_info_changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_set_associated()
2235 sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec( in ieee80211_set_associated()
2238 sdata->u.mgd.associated = cbss; in ieee80211_set_associated()
2239 memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); in ieee80211_set_associated()
2241 ieee80211_check_rate_mask(sdata); in ieee80211_set_associated()
2243 sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE; in ieee80211_set_associated()
2245 if (sdata->vif.p2p || in ieee80211_set_associated()
2246 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_set_associated()
2260 sdata->u.mgd.p2p_noa_index = in ieee80211_set_associated()
2269 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
2273 if (sdata->u.mgd.have_beacon) { in ieee80211_set_associated()
2280 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; in ieee80211_set_associated()
2291 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_set_associated()
2299 ieee80211_bss_info_change_notify(sdata, bss_info_changed); in ieee80211_set_associated()
2305 ieee80211_recalc_smps(sdata); in ieee80211_set_associated()
2306 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
2308 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
2311 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
2315 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
2316 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
2319 sdata_assert_lock(sdata); in ieee80211_set_disassoc()
2327 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
2330 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
2344 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
2356 ieee80211_flush_queues(local, sdata, true); in ieee80211_set_disassoc()
2368 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_set_disassoc()
2370 ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, in ieee80211_set_disassoc()
2377 ieee80211_flush_queues(local, sdata, false); in ieee80211_set_disassoc()
2383 sta_info_flush(sdata); in ieee80211_set_disassoc()
2386 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
2390 sdata->vif.bss_conf.assoc = false; in ieee80211_set_disassoc()
2393 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
2394 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
2403 memset(sdata->vif.bss_conf.mu_group.membership, 0, in ieee80211_set_disassoc()
2404 sizeof(sdata->vif.bss_conf.mu_group.membership)); in ieee80211_set_disassoc()
2405 memset(sdata->vif.bss_conf.mu_group.position, 0, in ieee80211_set_disassoc()
2406 sizeof(sdata->vif.bss_conf.mu_group.position)); in ieee80211_set_disassoc()
2408 sdata->vif.mu_mimo_owner = false; in ieee80211_set_disassoc()
2410 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
2416 if (sdata->vif.bss_conf.arp_addr_cnt) in ieee80211_set_disassoc()
2419 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
2424 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
2427 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_set_disassoc()
2429 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
2430 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
2431 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
2432 del_timer_sync(&sdata->u.mgd.chswitch_timer); in ieee80211_set_disassoc()
2434 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
2435 sdata->vif.bss_conf.beacon_rate = NULL; in ieee80211_set_disassoc()
2441 ieee80211_vif_release_channel(sdata); in ieee80211_set_disassoc()
2443 sdata->vif.csa_active = false; in ieee80211_set_disassoc()
2446 if (sdata->csa_block_tx) { in ieee80211_set_disassoc()
2447 ieee80211_wake_vif_queues(local, sdata, in ieee80211_set_disassoc()
2449 sdata->csa_block_tx = false; in ieee80211_set_disassoc()
2457 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_set_disassoc()
2460 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
2462 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
2463 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
2469 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
2475 if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_reset_ap_probe()
2483 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
2492 static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_wmm_ac_notify() argument
2496 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_tx_wmm_ac_notify()
2534 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
2537 ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time); in ieee80211_sta_tx_notify()
2540 !sdata->u.mgd.probe_send_count) in ieee80211_sta_tx_notify()
2544 sdata->u.mgd.probe_send_count = 0; in ieee80211_sta_tx_notify()
2546 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
2547 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_tx_notify()
2550 static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata, in ieee80211_mlme_send_probe_req() argument
2557 skb = ieee80211_build_probe_req(sdata, src, dst, (u32)-1, channel, in ieee80211_mlme_send_probe_req()
2561 ieee80211_tx_skb(sdata, skb); in ieee80211_mlme_send_probe_req()
2564 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
2566 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
2590 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2591 sta = sta_info_get(sdata, dst); in ieee80211_mgd_probe_ap_send()
2594 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mgd_probe_ap_send()
2597 if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) { in ieee80211_mgd_probe_ap_send()
2602 ieee80211_send_nullfunc(sdata->local, sdata, false); in ieee80211_mgd_probe_ap_send()
2613 ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst, in ieee80211_mgd_probe_ap_send()
2620 run_again(sdata, ifmgd->probe_timeout); in ieee80211_mgd_probe_ap_send()
2623 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
2626 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
2629 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
2632 sdata_lock(sdata); in ieee80211_mgd_probe_ap()
2637 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2639 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
2640 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2645 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
2649 ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL); in ieee80211_mgd_probe_ap()
2668 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2673 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2674 ieee80211_recalc_ps(sdata->local); in ieee80211_mgd_probe_ap()
2675 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2678 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
2680 sdata_unlock(sdata); in ieee80211_mgd_probe_ap()
2686 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
2687 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
2693 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_ap_probereq_get()
2696 sdata_assert_lock(sdata); in ieee80211_ap_probereq_get()
2715 skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, in ieee80211_ap_probereq_get()
2725 static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata, in ieee80211_report_disconnect() argument
2736 cfg80211_tx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2738 cfg80211_rx_mlme_mgmt(sdata->dev, buf, len); in ieee80211_report_disconnect()
2740 drv_event_callback(sdata->local, sdata, &event); in ieee80211_report_disconnect()
2743 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
2745 struct ieee80211_local *local = sdata->local; in __ieee80211_disconnect()
2746 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_disconnect()
2750 sdata_lock(sdata); in __ieee80211_disconnect()
2752 sdata_unlock(sdata); in __ieee80211_disconnect()
2756 tx = !sdata->csa_block_tx; in __ieee80211_disconnect()
2763 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in __ieee80211_disconnect()
2767 sdata->vif.csa_active = false; in __ieee80211_disconnect()
2769 if (sdata->csa_block_tx) { in __ieee80211_disconnect()
2770 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_disconnect()
2772 sdata->csa_block_tx = false; in __ieee80211_disconnect()
2776 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), tx, in __ieee80211_disconnect()
2779 sdata_unlock(sdata); in __ieee80211_disconnect()
2784 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
2787 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
2793 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
2795 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
2797 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
2803 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
2807 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
2812 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
2813 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
2815 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
2817 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
2818 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
2824 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
2825 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
2827 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
2829 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
2830 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
2835 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
2838 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
2840 sdata_assert_lock(sdata); in ieee80211_destroy_auth_data()
2848 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_auth_data()
2849 sta_info_destroy_addr(sdata, auth_data->bss->bssid); in ieee80211_destroy_auth_data()
2851 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_auth_data()
2852 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_auth_data()
2853 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
2854 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2855 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_auth_data()
2856 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_auth_data()
2859 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
2861 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
2864 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
2867 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
2869 sdata_assert_lock(sdata); in ieee80211_destroy_assoc_data()
2877 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_destroy_assoc_data()
2878 sta_info_destroy_addr(sdata, assoc_data->bss->bssid); in ieee80211_destroy_assoc_data()
2880 eth_zero_addr(sdata->u.mgd.bssid); in ieee80211_destroy_assoc_data()
2881 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_assoc_data()
2882 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
2883 sdata->vif.mu_mimo_owner = false; in ieee80211_destroy_assoc_data()
2885 mutex_lock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2886 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_assoc_data()
2887 mutex_unlock(&sdata->local->mtx); in ieee80211_destroy_assoc_data()
2890 cfg80211_abandon_assoc(sdata->dev, assoc_data->bss); in ieee80211_destroy_assoc_data()
2894 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
2897 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
2900 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
2901 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
2912 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_auth_challenge()
2916 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
2924 static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mark_sta_auth() argument
2927 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mark_sta_auth()
2931 sdata_info(sdata, "authenticated\n"); in ieee80211_mark_sta_auth()
2935 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_mark_sta_auth()
2938 mutex_lock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
2939 sta = sta_info_get(sdata, bssid); in ieee80211_mark_sta_auth()
2941 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid); in ieee80211_mark_sta_auth()
2946 sdata_info(sdata, "failed moving %pM to auth\n", bssid); in ieee80211_mark_sta_auth()
2952 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_mark_sta_auth()
2956 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
2959 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
2967 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_auth()
2990 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
2998 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
3010 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_rx_mgmt_auth()
3014 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
3016 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
3019 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3034 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
3046 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_auth()
3050 if (!ieee80211_mark_sta_auth(sdata, bssid)) in ieee80211_rx_mgmt_auth()
3054 sdata_info(sdata, "SAE peer confirmed\n"); in ieee80211_rx_mgmt_auth()
3058 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_auth()
3118 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
3121 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
3124 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_deauth()
3130 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_deauth()
3138 sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_deauth()
3142 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
3144 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, in ieee80211_rx_mgmt_deauth()
3153 sdata_info(sdata, in ieee80211_rx_mgmt_deauth()
3158 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_rx_mgmt_deauth()
3160 cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len); in ieee80211_rx_mgmt_deauth()
3166 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
3169 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
3172 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_disassoc()
3184 ieee80211_tdls_handle_disconnect(sdata, mgmt->sa, reason_code); in ieee80211_rx_mgmt_disassoc()
3188 sdata_info(sdata, "disassociated from %pM (Reason: %u=%s)\n", in ieee80211_rx_mgmt_disassoc()
3192 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
3194 ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code); in ieee80211_rx_mgmt_disassoc()
3260 static int ieee80211_recalc_twt_req(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_twt_req() argument
3266 if (sdata->vif.bss_conf.twt_requester != twt) { in ieee80211_recalc_twt_req()
3267 sdata->vif.bss_conf.twt_requester = twt; in ieee80211_recalc_twt_req()
3273 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
3278 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
3279 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
3283 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_assoc_success()
3317 sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n", in ieee80211_assoc_success()
3324 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_success()
3328 sdata->vif.bss_conf.aid = aid; in ieee80211_assoc_success()
3365 sdata_info(sdata, in ieee80211_assoc_success()
3376 sdata_info(sdata, in ieee80211_assoc_success()
3382 sdata_info(sdata, in ieee80211_assoc_success()
3388 sdata_info(sdata, in ieee80211_assoc_success()
3394 sdata_info(sdata, in ieee80211_assoc_success()
3406 sdata_info(sdata, in ieee80211_assoc_success()
3414 sdata_info(sdata, in ieee80211_assoc_success()
3422 sdata_info(sdata, in ieee80211_assoc_success()
3428 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3433 sta = sta_info_get(sdata, cbss->bssid); in ieee80211_assoc_success()
3435 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3440 sband = ieee80211_get_sband(sdata); in ieee80211_assoc_success()
3442 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3449 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3450 sdata_info(sdata, in ieee80211_assoc_success()
3458 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_success()
3462 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_success()
3467 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, in ieee80211_assoc_success()
3482 changed |= ieee80211_recalc_twt_req(sdata, sta, elems); in ieee80211_assoc_success()
3522 ieee80211_he_op_ie_to_bss_conf(&sdata->vif, elems->he_operation); in ieee80211_assoc_success()
3523 ieee80211_he_spr_ie_to_bss_conf(&sdata->vif, elems->he_spr); in ieee80211_assoc_success()
3579 sdata_info(sdata, in ieee80211_assoc_success()
3583 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3588 if (sdata->wdev.use_4addr) in ieee80211_assoc_success()
3589 drv_sta_set_4addr(local, sdata, &sta->sta, true); in ieee80211_assoc_success()
3591 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
3603 ieee80211_set_wmm_default(sdata, false, false); in ieee80211_assoc_success()
3604 } else if (!ieee80211_sta_wmm_params(local, sdata, elems->wmm_param, in ieee80211_assoc_success()
3608 ieee80211_set_wmm_default(sdata, false, true); in ieee80211_assoc_success()
3635 ieee80211_set_associated(sdata, cbss, changed); in ieee80211_assoc_success()
3642 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
3648 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
3649 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_assoc_success()
3657 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
3661 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
3674 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_assoc_resp()
3702 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3708 fils_decrypt_assoc_resp(sdata, (u8 *)mgmt, &len, assoc_data) < 0) in ieee80211_rx_mgmt_assoc_resp()
3720 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
3726 run_again(sdata, assoc_data->timeout); in ieee80211_rx_mgmt_assoc_resp()
3731 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
3733 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3736 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3738 if (!ieee80211_assoc_success(sdata, cbss, mgmt, len, &elems)) { in ieee80211_rx_mgmt_assoc_resp()
3740 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_rx_mgmt_assoc_resp()
3741 cfg80211_assoc_timeout(sdata->dev, cbss); in ieee80211_rx_mgmt_assoc_resp()
3745 drv_event_callback(sdata->local, sdata, &event); in ieee80211_rx_mgmt_assoc_resp()
3746 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
3753 ieee80211_destroy_assoc_data(sdata, true, false); in ieee80211_rx_mgmt_assoc_resp()
3758 if (sdata->tx_conf[ac].uapsd) in ieee80211_rx_mgmt_assoc_resp()
3762 cfg80211_rx_assoc_resp(sdata->dev, cbss, (u8 *)mgmt, len, uapsd_queues, in ieee80211_rx_mgmt_assoc_resp()
3766 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_bss_info() argument
3770 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
3774 sdata_assert_lock(sdata); in ieee80211_rx_bss_info()
3783 sdata->vif.bss_conf.beacon_rate = bss->beacon_rate; in ieee80211_rx_bss_info()
3789 static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_probe_resp() argument
3798 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
3800 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_probe_resp()
3809 channel = ieee80211_get_channel(sdata->local->hw.wiphy, in ieee80211_rx_mgmt_probe_resp()
3814 if (!ether_addr_equal(mgmt->da, sdata->vif.addr) && in ieee80211_rx_mgmt_probe_resp()
3823 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_probe_resp()
3827 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
3854 static void ieee80211_handle_beacon_sig(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_beacon_sig() argument
3890 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3896 drv_event_callback(local, sdata, &event); in ieee80211_handle_beacon_sig()
3902 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_handle_beacon_sig()
3912 &sdata->vif, in ieee80211_handle_beacon_sig()
3919 &sdata->vif, in ieee80211_handle_beacon_sig()
3936 &sdata->vif, in ieee80211_handle_beacon_sig()
3943 &sdata->vif, in ieee80211_handle_beacon_sig()
3960 static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_beacon() argument
3964 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
3965 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
3969 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
3980 sdata_assert_lock(sdata); in ieee80211_rx_mgmt_beacon()
3983 bssid = ieee80211_get_bssid(hdr, len, sdata->vif.type); in ieee80211_rx_mgmt_beacon()
3998 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_rx_mgmt_beacon()
4019 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_beacon()
4026 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
4028 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
4030 sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count; in ieee80211_rx_mgmt_beacon()
4048 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_rx_mgmt_beacon()
4059 ieee80211_handle_beacon_sig(sdata, ifmgd, bss_conf, in ieee80211_rx_mgmt_beacon()
4063 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
4065 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_beacon()
4072 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
4094 ieee80211_send_nullfunc(local, sdata, false); in ieee80211_rx_mgmt_beacon()
4095 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
4106 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
4110 if (sdata->vif.p2p || in ieee80211_rx_mgmt_beacon()
4111 sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) { in ieee80211_rx_mgmt_beacon()
4120 if (sdata->u.mgd.p2p_noa_index != noa.index) { in ieee80211_rx_mgmt_beacon()
4122 sdata->u.mgd.p2p_noa_index = noa.index; in ieee80211_rx_mgmt_beacon()
4131 } else if (sdata->u.mgd.p2p_noa_index != -1) { in ieee80211_rx_mgmt_beacon()
4133 sdata->u.mgd.p2p_noa_index = -1; in ieee80211_rx_mgmt_beacon()
4141 ieee80211_chswitch_post_beacon(sdata); in ieee80211_rx_mgmt_beacon()
4153 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
4155 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
4157 sdata->vif.bss_conf.sync_dtim_count = elems.dtim_count; in ieee80211_rx_mgmt_beacon()
4166 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status); in ieee80211_rx_mgmt_beacon()
4168 ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, in ieee80211_rx_mgmt_beacon()
4173 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_rx_mgmt_beacon()
4193 ieee80211_recalc_ps_vif(sdata); in ieee80211_rx_mgmt_beacon()
4204 changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_rx_mgmt_beacon()
4209 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_beacon()
4211 changed |= ieee80211_recalc_twt_req(sdata, sta, &elems); in ieee80211_rx_mgmt_beacon()
4213 if (ieee80211_config_bw(sdata, sta, elems.ht_cap_elem, in ieee80211_rx_mgmt_beacon()
4218 sdata_info(sdata, in ieee80211_rx_mgmt_beacon()
4221 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
4224 ieee80211_report_disconnect(sdata, deauth_buf, in ieee80211_rx_mgmt_beacon()
4231 ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif, in ieee80211_rx_mgmt_beacon()
4235 changed |= ieee80211_handle_pwr_constr(sdata, chan, mgmt, in ieee80211_rx_mgmt_beacon()
4241 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_rx_mgmt_beacon()
4246 void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_ext() argument
4257 sdata_lock(sdata); in ieee80211_sta_rx_queued_ext()
4260 ieee80211_rx_mgmt_beacon(sdata, hdr, skb->len, rx_status); in ieee80211_sta_rx_queued_ext()
4263 sdata_unlock(sdata); in ieee80211_sta_rx_queued_ext()
4266 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
4279 sdata_lock(sdata); in ieee80211_sta_rx_queued_mgmt()
4283 ieee80211_rx_mgmt_beacon(sdata, (void *)mgmt, in ieee80211_sta_rx_queued_mgmt()
4287 ieee80211_rx_mgmt_probe_resp(sdata, skb); in ieee80211_sta_rx_queued_mgmt()
4290 ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4293 ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4296 ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4300 ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
4319 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
4346 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
4353 sdata_unlock(sdata); in ieee80211_sta_rx_queued_mgmt()
4358 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
4359 from_timer(sdata, t, u.mgd.timer); in ieee80211_sta_timer()
4361 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_timer()
4364 static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
4369 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
4372 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_sta_connection_lost()
4376 static int ieee80211_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_auth() argument
4378 struct ieee80211_local *local = sdata->local; in ieee80211_auth()
4379 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_auth()
4386 sdata_assert_lock(sdata); in ieee80211_auth()
4394 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_auth()
4410 drv_mgd_prepare_tx(local, sdata, prepare_tx_duration); in ieee80211_auth()
4412 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_auth()
4428 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_auth()
4446 run_again(sdata, auth_data->timeout); in ieee80211_auth()
4451 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
4453 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
4454 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
4456 sdata_assert_lock(sdata); in ieee80211_do_assoc()
4460 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
4472 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
4475 ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
4480 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4486 run_again(sdata, assoc_data->timeout); in ieee80211_do_assoc()
4492 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
4495 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
4497 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
4498 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
4499 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
4501 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mgd_conn_tx_status()
4504 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
4506 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
4507 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
4509 sdata_lock(sdata); in ieee80211_sta_work()
4527 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4538 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4553 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4554 } else if (ieee80211_auth(sdata)) { in ieee80211_sta_work()
4564 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
4566 cfg80211_auth_timeout(sdata->dev, bssid); in ieee80211_sta_work()
4567 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4570 run_again(sdata, ifmgd->auth_data->timeout); in ieee80211_sta_work()
4575 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
4583 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_sta_work()
4584 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_sta_work()
4585 drv_event_callback(sdata->local, sdata, &event); in ieee80211_sta_work()
4588 run_again(sdata, ifmgd->assoc_data->timeout); in ieee80211_sta_work()
4604 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
4607 mlme_dbg(sdata, in ieee80211_sta_work()
4611 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4613 mlme_dbg(sdata, in ieee80211_sta_work()
4616 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4621 run_again(sdata, ifmgd->probe_timeout); in ieee80211_sta_work()
4623 mlme_dbg(sdata, in ieee80211_sta_work()
4626 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4629 mlme_dbg(sdata, in ieee80211_sta_work()
4633 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
4639 mlme_dbg(sdata, in ieee80211_sta_work()
4643 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
4648 sdata_unlock(sdata); in ieee80211_sta_work()
4653 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
4654 from_timer(sdata, t, u.mgd.bcn_mon_timer); in ieee80211_sta_bcn_mon_timer()
4655 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_bcn_mon_timer()
4657 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_bcn_mon_timer()
4660 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_bcn_mon_timer()
4663 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
4664 ieee80211_queue_work(&sdata->local->hw, in ieee80211_sta_bcn_mon_timer()
4665 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
4670 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
4671 from_timer(sdata, t, u.mgd.conn_mon_timer); in ieee80211_sta_conn_mon_timer()
4672 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
4673 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
4677 if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn) in ieee80211_sta_conn_mon_timer()
4680 sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_sta_conn_mon_timer()
4702 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
4706 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
4709 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
4711 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
4712 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
4715 if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) in ieee80211_restart_sta_timer()
4716 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
4717 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
4722 void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_quiesce() argument
4724 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_quiesce()
4727 sdata_lock(sdata); in ieee80211_mgd_quiesce()
4739 ieee80211_send_deauth_disassoc(sdata, bssid, bssid, in ieee80211_mgd_quiesce()
4744 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_quiesce()
4746 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_quiesce()
4747 cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, in ieee80211_mgd_quiesce()
4768 if (ifmgd->associated && !sdata->local->wowlan) { in ieee80211_mgd_quiesce()
4776 ieee80211_mgd_deauth(sdata, &req); in ieee80211_mgd_quiesce()
4779 sdata_unlock(sdata); in ieee80211_mgd_quiesce()
4782 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
4784 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
4786 sdata_lock(sdata); in ieee80211_sta_restart()
4788 sdata_unlock(sdata); in ieee80211_sta_restart()
4792 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
4793 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
4794 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
4795 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
4799 sdata_unlock(sdata); in ieee80211_sta_restart()
4802 sdata_unlock(sdata); in ieee80211_sta_restart()
4807 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
4811 ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
4829 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
4830 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
4831 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
4834 if (sdata->local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS) in ieee80211_sta_setup_sdata()
4848 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
4852 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
4853 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
4854 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
4859 static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, in ieee80211_ht_vht_rx_chains() argument
4862 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ht_vht_rx_chains()
4965 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
4968 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
4969 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_channel()
5033 sdata_info(sdata, in ieee80211_prep_channel()
5086 sdata_info(sdata, in ieee80211_prep_channel()
5090 ifmgd->flags |= ieee80211_determine_chantype(sdata, sband, in ieee80211_prep_channel()
5097 sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss), in ieee80211_prep_channel()
5103 sdata_info(sdata, "Rejecting non-HE 6/7 GHz connection"); in ieee80211_prep_channel()
5108 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_prep_channel()
5116 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
5126 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
5168 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
5172 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
5173 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
5191 have_sta = sta_info_get(sdata, cbss->bssid); in ieee80211_prep_connection()
5196 new_sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL); in ieee80211_prep_connection()
5219 int shift = ieee80211_vif_get_shift(&sdata->vif); in ieee80211_prep_connection()
5245 sdata_info(sdata, in ieee80211_prep_connection()
5251 sdata_info(sdata, in ieee80211_prep_connection()
5259 sdata_info(sdata, in ieee80211_prep_connection()
5262 sdata->vif.bss_conf.basic_rates = basic_rates; in ieee80211_prep_connection()
5267 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
5269 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
5275 sdata->vif.bss_conf.beacon_int = cbss->beacon_interval; in ieee80211_prep_connection()
5279 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
5280 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
5284 &sdata->vif.bss_conf.sync_dtim_count, in ieee80211_prep_connection()
5286 } else if (!ieee80211_hw_check(&sdata->local->hw, in ieee80211_prep_connection()
5290 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
5291 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
5293 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
5295 sdata->vif.bss_conf.sync_tsf = 0; in ieee80211_prep_connection()
5296 sdata->vif.bss_conf.sync_device_ts = 0; in ieee80211_prep_connection()
5297 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
5303 err = ieee80211_prep_channel(sdata, cbss); in ieee80211_prep_connection()
5316 ieee80211_bss_info_change_notify(sdata, in ieee80211_prep_connection()
5326 sdata_info(sdata, in ieee80211_prep_connection()
5342 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
5345 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
5346 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
5435 ieee80211_destroy_auth_data(sdata, cont_auth); in ieee80211_mgd_auth()
5448 ieee80211_mark_sta_auth(sdata, req->bss->bssid); in ieee80211_mgd_auth()
5453 sdata_info(sdata, in ieee80211_mgd_auth()
5456 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
5460 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_auth()
5465 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); in ieee80211_mgd_auth()
5467 err = ieee80211_prep_connection(sdata, req->bss, cont_auth, false); in ieee80211_mgd_auth()
5471 err = ieee80211_auth(sdata); in ieee80211_mgd_auth()
5473 sta_info_destroy_addr(sdata, req->bss->bssid); in ieee80211_mgd_auth()
5483 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_auth()
5485 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_auth()
5486 ieee80211_vif_release_channel(sdata); in ieee80211_mgd_auth()
5487 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_auth()
5492 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
5497 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
5498 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
5525 sdata_info(sdata, in ieee80211_mgd_assoc()
5528 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
5532 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_assoc()
5552 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
5576 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5588 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
5628 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_mgd_assoc()
5630 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_mgd_assoc()
5632 sdata->smps_mode = ifmgd->req_smps; in ieee80211_mgd_assoc()
5654 if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
5657 sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD; in ieee80211_mgd_assoc()
5660 (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) { in ieee80211_mgd_assoc()
5689 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
5690 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
5691 sdata->control_port_over_nl80211 = in ieee80211_mgd_assoc()
5693 sdata->control_port_no_preauth = req->crypto.control_port_no_preauth; in ieee80211_mgd_assoc()
5694 sdata->encrypt_headroom = ieee80211_cs_headroom(local, &req->crypto, in ieee80211_mgd_assoc()
5695 sdata->vif.type); in ieee80211_mgd_assoc()
5711 ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap); in ieee80211_mgd_assoc()
5733 err = ieee80211_prep_connection(sdata, req->bss, true, override); in ieee80211_mgd_assoc()
5740 if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) && in ieee80211_mgd_assoc()
5746 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
5763 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; in ieee80211_mgd_assoc()
5764 sdata->vif.bss_conf.sync_device_ts = in ieee80211_mgd_assoc()
5766 sdata->vif.bss_conf.sync_dtim_count = dtim_count; in ieee80211_mgd_assoc()
5772 sdata->vif.bss_conf.profile_periodicity = elem->data[2]; in ieee80211_mgd_assoc()
5774 sdata->vif.bss_conf.profile_periodicity = 0; in ieee80211_mgd_assoc()
5780 sdata->vif.bss_conf.ema_ap = true; in ieee80211_mgd_assoc()
5782 sdata->vif.bss_conf.ema_ap = false; in ieee80211_mgd_assoc()
5789 run_again(sdata, assoc_data->timeout); in ieee80211_mgd_assoc()
5801 sdata_info(sdata, "associating with AP with corrupt %s\n", in ieee80211_mgd_assoc()
5808 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_assoc()
5815 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
5818 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
5824 sdata_info(sdata, in ieee80211_mgd_deauth()
5829 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_mgd_deauth()
5830 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
5834 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
5835 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5844 sdata_info(sdata, in ieee80211_mgd_deauth()
5849 drv_mgd_prepare_tx(sdata->local, sdata, 0); in ieee80211_mgd_deauth()
5850 ieee80211_send_deauth_disassoc(sdata, req->bssid, req->bssid, in ieee80211_mgd_deauth()
5854 ieee80211_destroy_assoc_data(sdata, false, true); in ieee80211_mgd_deauth()
5855 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5863 sdata_info(sdata, in ieee80211_mgd_deauth()
5868 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
5870 ieee80211_report_disconnect(sdata, frame_buf, in ieee80211_mgd_deauth()
5879 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
5882 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_disassoc()
5895 sdata_info(sdata, in ieee80211_mgd_disassoc()
5900 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
5904 ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true, in ieee80211_mgd_disassoc()
5910 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
5912 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
5926 sdata_lock(sdata); in ieee80211_mgd_stop()
5929 ieee80211_destroy_assoc_data(sdata, false, false); in ieee80211_mgd_stop()
5930 cfg80211_assoc_timeout(sdata->dev, bss); in ieee80211_mgd_stop()
5933 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
5945 sdata_unlock(sdata); in ieee80211_mgd_stop()
5953 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
5955 trace_api_cqm_rssi_notify(sdata, rssi_event, rssi_level); in ieee80211_cqm_rssi_notify()
5957 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, rssi_level, gfp); in ieee80211_cqm_rssi_notify()
5963 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_beacon_loss_notify() local
5965 trace_api_cqm_beacon_loss_notify(sdata->local, sdata); in ieee80211_cqm_beacon_loss_notify()
5967 cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp); in ieee80211_cqm_beacon_loss_notify()