Lines Matching refs:sdata
147 void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_beacon_monitor() argument
149 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_sta_reset_beacon_monitor()
152 if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) in ieee80211_sta_reset_beacon_monitor()
155 mod_timer(&sdata->u.mgd.bcn_mon_timer, in ieee80211_sta_reset_beacon_monitor()
156 round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout)); in ieee80211_sta_reset_beacon_monitor()
159 void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_reset_conn_monitor() argument
161 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_reset_conn_monitor()
163 if (unlikely(!sdata->u.mgd.associated)) in ieee80211_sta_reset_conn_monitor()
166 if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) in ieee80211_sta_reset_conn_monitor()
169 mod_timer(&sdata->u.mgd.conn_mon_timer, in ieee80211_sta_reset_conn_monitor()
235 ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, in ieee80211_determine_chantype() argument
269 sdata_info(sdata, in ieee80211_determine_chantype()
327 sdata_info(sdata, in ieee80211_determine_chantype()
336 sdata_info(sdata, in ieee80211_determine_chantype()
349 sdata_info(sdata, in ieee80211_determine_chantype()
364 while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, in ieee80211_determine_chantype()
376 sdata_info(sdata, in ieee80211_determine_chantype()
383 static int ieee80211_config_bw(struct ieee80211_sub_if_data *sdata, in ieee80211_config_bw() argument
389 struct ieee80211_local *local = sdata->local; in ieee80211_config_bw()
390 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_config_bw()
410 chan = sdata->vif.bss_conf.chandef.chan; in ieee80211_config_bw()
414 flags = ieee80211_determine_chantype(sdata, sband, chan, ht_oper, in ieee80211_config_bw()
434 if (cfg80211_chandef_identical(&chandef, &sdata->vif.bss_conf.chandef)) in ieee80211_config_bw()
437 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()
499 if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) { in ieee80211_config_bw()
501 sdata->vif.bss_conf.ht_operation_mode = ht_opmode; in ieee80211_config_bw()
530 static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_ht_ie() argument
544 ieee80211_apply_htcap_overrides(sdata, &ht_cap); in ieee80211_add_ht_ie()
569 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_40MHZ) { in ieee80211_add_ht_ie()
599 static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata, in ieee80211_add_vht_ie() argument
611 ieee80211_apply_vhtcap_overrides(sdata, &vht_cap); in ieee80211_add_vht_ie()
616 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_80P80MHZ) { in ieee80211_add_vht_ie()
621 if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_160MHZ) { in ieee80211_add_vht_ie()
639 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_send_assoc() argument
641 struct ieee80211_local *local = sdata->local; in ieee80211_send_assoc()
642 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_assoc()
658 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_send_assoc()
722 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); in ieee80211_send_assoc()
828 ieee80211_add_ht_ie(sdata, skb, assoc_data->ap_ht_param, in ieee80211_send_assoc()
829 sband, chan, sdata->smps_mode); in ieee80211_send_assoc()
832 ieee80211_add_vht_ie(sdata, skb, sband, in ieee80211_send_assoc()
873 drv_mgd_prepare_tx(local, sdata); in ieee80211_send_assoc()
879 ieee80211_tx_skb(sdata, skb); in ieee80211_send_assoc()
883 struct ieee80211_sub_if_data *sdata) in ieee80211_send_pspoll() argument
888 skb = ieee80211_pspoll_get(&local->hw, &sdata->vif); in ieee80211_send_pspoll()
896 ieee80211_tx_skb(sdata, skb); in ieee80211_send_pspoll()
900 struct ieee80211_sub_if_data *sdata, in ieee80211_send_nullfunc() argument
905 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_send_nullfunc()
907 skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif); in ieee80211_send_nullfunc()
921 ieee80211_tx_skb(sdata, skb); in ieee80211_send_nullfunc()
925 struct ieee80211_sub_if_data *sdata) in ieee80211_send_4addr_nullfunc() argument
931 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_send_4addr_nullfunc()
945 memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
946 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
947 memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
948 memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN); in ieee80211_send_4addr_nullfunc()
951 ieee80211_tx_skb(sdata, skb); in ieee80211_send_4addr_nullfunc()
957 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_work() local
959 struct ieee80211_local *local = sdata->local; in ieee80211_chswitch_work()
960 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_work()
962 if (!ieee80211_sdata_running(sdata)) in ieee80211_chswitch_work()
993 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_chswitch_done() local
994 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_chswitch_done()
996 trace_api_chswitch_done(sdata, success); in ieee80211_chswitch_done()
998 sdata_info(sdata, in ieee80211_chswitch_done()
1000 ieee80211_queue_work(&sdata->local->hw, in ieee80211_chswitch_done()
1003 ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work); in ieee80211_chswitch_done()
1010 struct ieee80211_sub_if_data *sdata = in ieee80211_chswitch_timer() local
1013 ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work); in ieee80211_chswitch_timer()
1017 ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_process_chanswitch() argument
1021 struct ieee80211_local *local = sdata->local; in ieee80211_sta_process_chanswitch()
1022 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_process_chanswitch()
1070 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1092 new_chan = ieee80211_get_channel(sdata->local->hw.wiphy, new_freq); in ieee80211_sta_process_chanswitch()
1094 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1183 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1195 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1208 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1216 if (WARN_ON(!rcu_access_pointer(sdata->vif.chanctx_conf))) { in ieee80211_sta_process_chanswitch()
1220 chanctx = container_of(rcu_access_pointer(sdata->vif.chanctx_conf), in ieee80211_sta_process_chanswitch()
1223 sdata_info(sdata, in ieee80211_sta_process_chanswitch()
1260 static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_pwr_constr() argument
1317 if (sdata->ap_power_level == new_ap_level) in ieee80211_handle_pwr_constr()
1320 sdata_info(sdata, in ieee80211_handle_pwr_constr()
1323 sdata->u.mgd.bssid); in ieee80211_handle_pwr_constr()
1324 sdata->ap_power_level = new_ap_level; in ieee80211_handle_pwr_constr()
1325 if (__ieee80211_recalc_txpower(sdata)) in ieee80211_handle_pwr_constr()
1332 struct ieee80211_sub_if_data *sdata) in ieee80211_enable_ps() argument
1349 ieee80211_send_nullfunc(local, sdata, 1); in ieee80211_enable_ps()
1374 static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) in ieee80211_powersave_allowed() argument
1376 struct ieee80211_if_managed *mgd = &sdata->u.mgd; in ieee80211_powersave_allowed()
1394 sta = sta_info_get(sdata, mgd->bssid); in ieee80211_powersave_allowed()
1405 struct ieee80211_sub_if_data *sdata, *found = NULL; in ieee80211_recalc_ps() local
1414 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_ps()
1415 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_ps()
1417 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_recalc_ps()
1425 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_recalc_ps()
1427 found = sdata; in ieee80211_recalc_ps()
1481 void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_ps_vif() argument
1483 bool ps_allowed = ieee80211_powersave_allowed(sdata); in ieee80211_recalc_ps_vif()
1485 if (sdata->vif.bss_conf.ps != ps_allowed) { in ieee80211_recalc_ps_vif()
1486 sdata->vif.bss_conf.ps = ps_allowed; in ieee80211_recalc_ps_vif()
1487 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS); in ieee80211_recalc_ps_vif()
1512 struct ieee80211_sub_if_data *sdata = local->ps_sdata; in ieee80211_dynamic_ps_enable_work() local
1518 if (!sdata) in ieee80211_dynamic_ps_enable_work()
1521 ifmgd = &sdata->u.mgd; in ieee80211_dynamic_ps_enable_work()
1561 ieee80211_send_nullfunc(local, sdata, 1); in ieee80211_dynamic_ps_enable_work()
1563 ieee80211_flush_queues(local, sdata); in ieee80211_dynamic_ps_enable_work()
1590 struct ieee80211_sub_if_data *sdata = in ieee80211_dfs_cac_timer_work() local
1594 ieee80211_vif_release_channel(sdata); in ieee80211_dfs_cac_timer_work()
1596 cfg80211_cac_event(sdata->dev, NL80211_RADAR_CAC_FINISHED, GFP_KERNEL); in ieee80211_dfs_cac_timer_work()
1601 struct ieee80211_sub_if_data *sdata, in ieee80211_sta_wmm_params() argument
1605 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_wmm_params()
1636 sdata->wmm_acm = 0; in ieee80211_sta_wmm_params()
1647 sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */ in ieee80211_sta_wmm_params()
1654 sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */ in ieee80211_sta_wmm_params()
1661 sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */ in ieee80211_sta_wmm_params()
1669 sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */ in ieee80211_sta_wmm_params()
1682 mlme_dbg(sdata, in ieee80211_sta_wmm_params()
1687 sdata->tx_conf[queue] = params; in ieee80211_sta_wmm_params()
1688 if (drv_conf_tx(local, sdata, queue, ¶ms)) in ieee80211_sta_wmm_params()
1689 sdata_err(sdata, in ieee80211_sta_wmm_params()
1695 sdata->vif.bss_conf.qos = true; in ieee80211_sta_wmm_params()
1699 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in __ieee80211_stop_poll() argument
1701 lockdep_assert_held(&sdata->local->mtx); in __ieee80211_stop_poll()
1703 sdata->u.mgd.flags &= ~(IEEE80211_STA_CONNECTION_POLL | in __ieee80211_stop_poll()
1705 ieee80211_run_deferred_scan(sdata->local); in __ieee80211_stop_poll()
1708 static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_poll() argument
1710 mutex_lock(&sdata->local->mtx); in ieee80211_stop_poll()
1711 __ieee80211_stop_poll(sdata); in ieee80211_stop_poll()
1712 mutex_unlock(&sdata->local->mtx); in ieee80211_stop_poll()
1715 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata, in ieee80211_handle_bss_capability() argument
1718 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_handle_bss_capability()
1733 if (ieee80211_get_sdata_band(sdata) == IEEE80211_BAND_5GHZ) in ieee80211_handle_bss_capability()
1754 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, in ieee80211_set_associated() argument
1759 struct ieee80211_local *local = sdata->local; in ieee80211_set_associated()
1760 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_set_associated()
1763 bss_info_changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_set_associated()
1766 sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec( in ieee80211_set_associated()
1769 sdata->u.mgd.associated = cbss; in ieee80211_set_associated()
1770 memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); in ieee80211_set_associated()
1772 sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE; in ieee80211_set_associated()
1774 if (sdata->vif.p2p) { in ieee80211_set_associated()
1788 sdata->u.mgd.p2p_noa_index = in ieee80211_set_associated()
1797 ieee80211_stop_poll(sdata); in ieee80211_set_associated()
1801 if (sdata->u.mgd.assoc_data->have_beacon) { in ieee80211_set_associated()
1808 bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1; in ieee80211_set_associated()
1817 if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI && in ieee80211_set_associated()
1825 ieee80211_bss_info_change_notify(sdata, bss_info_changed); in ieee80211_set_associated()
1831 ieee80211_recalc_smps(sdata); in ieee80211_set_associated()
1832 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_associated()
1834 netif_carrier_on(sdata->dev); in ieee80211_set_associated()
1837 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_set_disassoc() argument
1841 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_set_disassoc()
1842 struct ieee80211_local *local = sdata->local; in ieee80211_set_disassoc()
1853 ieee80211_stop_poll(sdata); in ieee80211_set_disassoc()
1856 netif_carrier_off(sdata->dev); in ieee80211_set_disassoc()
1870 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_disassoc()
1874 ieee80211_flush_queues(local, sdata); in ieee80211_set_disassoc()
1878 ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, stype, in ieee80211_set_disassoc()
1883 ieee80211_flush_queues(local, sdata); in ieee80211_set_disassoc()
1889 sta_info_flush_defer(sdata); in ieee80211_set_disassoc()
1892 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_set_disassoc()
1896 sdata->vif.bss_conf.assoc = false; in ieee80211_set_disassoc()
1899 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_set_disassoc()
1900 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_set_disassoc()
1908 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_disassoc()
1914 if (sdata->vif.bss_conf.arp_addr_cnt) in ieee80211_set_disassoc()
1917 sdata->vif.bss_conf.qos = false; in ieee80211_set_disassoc()
1922 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_disassoc()
1925 ieee80211_set_wmm_default(sdata, false); in ieee80211_set_disassoc()
1927 del_timer_sync(&sdata->u.mgd.conn_mon_timer); in ieee80211_set_disassoc()
1928 del_timer_sync(&sdata->u.mgd.bcn_mon_timer); in ieee80211_set_disassoc()
1929 del_timer_sync(&sdata->u.mgd.timer); in ieee80211_set_disassoc()
1930 del_timer_sync(&sdata->u.mgd.chswitch_timer); in ieee80211_set_disassoc()
1932 sdata->vif.bss_conf.dtim_period = 0; in ieee80211_set_disassoc()
1935 ieee80211_vif_release_channel(sdata); in ieee80211_set_disassoc()
1938 void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_notify() argument
1952 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_rx_notify()
1955 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata) in ieee80211_reset_ap_probe() argument
1957 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_reset_ap_probe()
1958 struct ieee80211_local *local = sdata->local; in ieee80211_reset_ap_probe()
1967 __ieee80211_stop_poll(sdata); in ieee80211_reset_ap_probe()
1973 if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) in ieee80211_reset_ap_probe()
1981 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_reset_ap_probe()
1990 void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_tx_notify() argument
1997 sdata->u.mgd.probe_send_count > 0) { in ieee80211_sta_tx_notify()
1999 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2001 sdata->u.mgd.nullfunc_failed = true; in ieee80211_sta_tx_notify()
2002 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_tx_notify()
2007 ieee80211_sta_reset_conn_monitor(sdata); in ieee80211_sta_tx_notify()
2010 static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_probe_ap_send() argument
2012 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap_send()
2034 if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) { in ieee80211_mgd_probe_ap_send()
2036 ieee80211_send_nullfunc(sdata->local, sdata, 0); in ieee80211_mgd_probe_ap_send()
2047 ieee80211_send_probe_req(sdata, dst, ssid + 2, ssid_len, NULL, in ieee80211_mgd_probe_ap_send()
2055 if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) in ieee80211_mgd_probe_ap_send()
2056 ieee80211_flush_queues(sdata->local, sdata); in ieee80211_mgd_probe_ap_send()
2059 static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_probe_ap() argument
2062 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_probe_ap()
2065 if (!ieee80211_sdata_running(sdata)) in ieee80211_mgd_probe_ap()
2073 mutex_lock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2075 if (sdata->local->tmp_channel || sdata->local->scanning) { in ieee80211_mgd_probe_ap()
2076 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2081 mlme_dbg_ratelimited(sdata, in ieee80211_mgd_probe_ap()
2085 ieee80211_cqm_rssi_notify(&sdata->vif, in ieee80211_mgd_probe_ap()
2110 mutex_unlock(&sdata->local->mtx); in ieee80211_mgd_probe_ap()
2115 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2116 ieee80211_recalc_ps(sdata->local, -1); in ieee80211_mgd_probe_ap()
2117 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_mgd_probe_ap()
2120 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_mgd_probe_ap()
2128 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_ap_probereq_get() local
2129 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ap_probereq_get()
2135 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) in ieee80211_ap_probereq_get()
2156 skb = ieee80211_build_probe_req(sdata, cbss->bssid, in ieee80211_ap_probereq_get()
2166 static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) in __ieee80211_disconnect() argument
2168 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in __ieee80211_disconnect()
2177 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in __ieee80211_disconnect()
2181 ieee80211_wake_queues_by_reason(&sdata->local->hw, in __ieee80211_disconnect()
2190 cfg80211_send_deauth(sdata->dev, frame_buf, IEEE80211_DEAUTH_FRAME_LEN); in __ieee80211_disconnect()
2195 struct ieee80211_sub_if_data *sdata = in ieee80211_beacon_connection_loss_work() local
2198 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_beacon_connection_loss_work()
2203 sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_beacon_connection_loss_work()
2210 sdata_info(sdata, "Connection to AP %pM lost\n", in ieee80211_beacon_connection_loss_work()
2212 __ieee80211_disconnect(sdata); in ieee80211_beacon_connection_loss_work()
2214 ieee80211_mgd_probe_ap(sdata, true); in ieee80211_beacon_connection_loss_work()
2220 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_connection_drop_work() local
2224 __ieee80211_disconnect(sdata); in ieee80211_csa_connection_drop_work()
2229 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_beacon_loss() local
2230 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_beacon_loss()
2232 trace_api_beacon_loss(sdata); in ieee80211_beacon_loss()
2234 sdata->u.mgd.connection_loss = false; in ieee80211_beacon_loss()
2235 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_beacon_loss()
2241 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_connection_loss() local
2242 struct ieee80211_hw *hw = &sdata->local->hw; in ieee80211_connection_loss()
2244 trace_api_connection_loss(sdata); in ieee80211_connection_loss()
2246 sdata->u.mgd.connection_loss = true; in ieee80211_connection_loss()
2247 ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_connection_loss()
2252 static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_auth_data() argument
2255 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_destroy_auth_data()
2257 lockdep_assert_held(&sdata->u.mgd.mtx); in ieee80211_destroy_auth_data()
2260 sta_info_destroy_addr(sdata, auth_data->bss->bssid); in ieee80211_destroy_auth_data()
2262 memset(sdata->u.mgd.bssid, 0, ETH_ALEN); in ieee80211_destroy_auth_data()
2263 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_auth_data()
2264 sdata->u.mgd.flags = 0; in ieee80211_destroy_auth_data()
2265 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_auth_data()
2268 cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss); in ieee80211_destroy_auth_data()
2270 sdata->u.mgd.auth_data = NULL; in ieee80211_destroy_auth_data()
2273 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, in ieee80211_auth_challenge() argument
2276 struct ieee80211_local *local = sdata->local; in ieee80211_auth_challenge()
2277 struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data; in ieee80211_auth_challenge()
2287 drv_mgd_prepare_tx(sdata->local, sdata); in ieee80211_auth_challenge()
2291 ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0, in ieee80211_auth_challenge()
2299 ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_auth() argument
2302 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_auth()
2326 …sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected… in ieee80211_rx_mgmt_auth()
2334 sdata_info(sdata, "%pM denied authentication (status %d)\n", in ieee80211_rx_mgmt_auth()
2336 ieee80211_destroy_auth_data(sdata, false); in ieee80211_rx_mgmt_auth()
2348 ieee80211_auth_challenge(sdata, mgmt, len); in ieee80211_rx_mgmt_auth()
2359 sdata_info(sdata, "authenticated\n"); in ieee80211_rx_mgmt_auth()
2375 mutex_lock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2376 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_auth()
2378 WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid); in ieee80211_rx_mgmt_auth()
2382 sdata_info(sdata, "failed moving %pM to auth\n", bssid); in ieee80211_rx_mgmt_auth()
2385 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2389 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_rx_mgmt_auth()
2396 ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_deauth() argument
2399 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_deauth()
2416 sdata_info(sdata, "deauthenticated from %pM (Reason: %u)\n", in ieee80211_rx_mgmt_deauth()
2419 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_deauth()
2426 ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_disassoc() argument
2429 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_disassoc()
2443 sdata_info(sdata, "disassociated from %pM (Reason: %u)\n", in ieee80211_rx_mgmt_disassoc()
2446 ieee80211_set_disassoc(sdata, 0, 0, false, NULL); in ieee80211_rx_mgmt_disassoc()
2493 static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata, in ieee80211_destroy_assoc_data() argument
2496 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_destroy_assoc_data()
2498 lockdep_assert_held(&sdata->u.mgd.mtx); in ieee80211_destroy_assoc_data()
2501 sta_info_destroy_addr(sdata, assoc_data->bss->bssid); in ieee80211_destroy_assoc_data()
2503 memset(sdata->u.mgd.bssid, 0, ETH_ALEN); in ieee80211_destroy_assoc_data()
2504 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_destroy_assoc_data()
2505 sdata->u.mgd.flags = 0; in ieee80211_destroy_assoc_data()
2506 ieee80211_vif_release_channel(sdata); in ieee80211_destroy_assoc_data()
2510 sdata->u.mgd.assoc_data = NULL; in ieee80211_destroy_assoc_data()
2513 static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, in ieee80211_assoc_success() argument
2517 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_assoc_success()
2518 struct ieee80211_local *local = sdata->local; in ieee80211_assoc_success()
2524 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_assoc_success()
2537 sdata_info(sdata, "invalid AID value 0x%x; bits 15:14 not set\n", in ieee80211_assoc_success()
2544 sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n", in ieee80211_assoc_success()
2554 sdata_info(sdata, "no SuppRates element in AssocResp\n"); in ieee80211_assoc_success()
2589 sdata_info(sdata, in ieee80211_assoc_success()
2600 sdata_info(sdata, in ieee80211_assoc_success()
2606 sdata_info(sdata, in ieee80211_assoc_success()
2612 sdata_info(sdata, in ieee80211_assoc_success()
2618 sdata_info(sdata, in ieee80211_assoc_success()
2629 sdata_info(sdata, in ieee80211_assoc_success()
2637 sdata_info(sdata, in ieee80211_assoc_success()
2643 mutex_lock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
2648 sta = sta_info_get(sdata, cbss->bssid); in ieee80211_assoc_success()
2650 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
2655 sband = local->hw.wiphy->bands[ieee80211_get_sdata_band(sdata)]; in ieee80211_assoc_success()
2659 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in ieee80211_assoc_success()
2663 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in ieee80211_assoc_success()
2700 sdata_info(sdata, in ieee80211_assoc_success()
2704 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
2709 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_assoc_success()
2720 ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_assoc_success()
2723 ieee80211_set_wmm_default(sdata, false); in ieee80211_assoc_success()
2730 ieee80211_set_associated(sdata, cbss, changed); in ieee80211_assoc_success()
2737 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_assoc_success()
2743 ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt); in ieee80211_assoc_success()
2744 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_assoc_success()
2753 ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_assoc_resp() argument
2757 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_assoc_resp()
2784 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
2798 sdata_info(sdata, in ieee80211_rx_mgmt_assoc_resp()
2811 sdata_info(sdata, "%pM denied association (code=%d)\n", in ieee80211_rx_mgmt_assoc_resp()
2813 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_rx_mgmt_assoc_resp()
2815 if (!ieee80211_assoc_success(sdata, *bss, mgmt, len)) { in ieee80211_rx_mgmt_assoc_resp()
2817 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_rx_mgmt_assoc_resp()
2818 cfg80211_put_bss(sdata->local->hw.wiphy, *bss); in ieee80211_rx_mgmt_assoc_resp()
2821 sdata_info(sdata, "associated\n"); in ieee80211_rx_mgmt_assoc_resp()
2828 ieee80211_destroy_assoc_data(sdata, true); in ieee80211_rx_mgmt_assoc_resp()
2834 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_bss_info() argument
2839 struct ieee80211_local *local = sdata->local; in ieee80211_rx_bss_info()
2845 lockdep_assert_held(&sdata->u.mgd.mtx); in ieee80211_rx_bss_info()
2847 if ((sdata->u.mgd.associated && in ieee80211_rx_bss_info()
2848 ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) || in ieee80211_rx_bss_info()
2849 (sdata->u.mgd.assoc_data && in ieee80211_rx_bss_info()
2851 sdata->u.mgd.assoc_data->bss->bssid))) { in ieee80211_rx_bss_info()
2853 need_ps = sdata->u.mgd.associated && !sdata->u.mgd.dtim_period; in ieee80211_rx_bss_info()
2857 sdata->u.mgd.dtim_period = tim_ie->dtim_period; in ieee80211_rx_bss_info()
2877 if (!sdata->u.mgd.associated || in ieee80211_rx_bss_info()
2878 !ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) in ieee80211_rx_bss_info()
2887 ieee80211_sta_process_chanswitch(sdata, rx_status->mactime, in ieee80211_rx_bss_info()
2893 static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_probe_resp() argument
2902 ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_probe_resp()
2906 if (!ether_addr_equal(mgmt->da, sdata->vif.addr)) in ieee80211_rx_mgmt_probe_resp()
2916 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_probe_resp()
2920 ieee80211_reset_ap_probe(sdata); in ieee80211_rx_mgmt_probe_resp()
2925 sdata_info(sdata, "direct probe responded\n"); in ieee80211_rx_mgmt_probe_resp()
2955 ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_rx_mgmt_beacon() argument
2959 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_rx_mgmt_beacon()
2960 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; in ieee80211_rx_mgmt_beacon()
2963 struct ieee80211_local *local = sdata->local; in ieee80211_rx_mgmt_beacon()
2981 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_rx_mgmt_beacon()
2999 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_beacon()
3003 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3005 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3008 sdata->vif.bss_conf.sync_dtim_count = in ieee80211_rx_mgmt_beacon()
3011 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_rx_mgmt_beacon()
3053 drv_rssi_callback(local, sdata, RSSI_EVENT_HIGH); in ieee80211_rx_mgmt_beacon()
3058 drv_rssi_callback(local, sdata, RSSI_EVENT_LOW); in ieee80211_rx_mgmt_beacon()
3064 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) { in ieee80211_rx_mgmt_beacon()
3073 &sdata->vif, in ieee80211_rx_mgmt_beacon()
3080 &sdata->vif, in ieee80211_rx_mgmt_beacon()
3087 mlme_dbg_ratelimited(sdata, in ieee80211_rx_mgmt_beacon()
3103 ieee80211_sta_reset_beacon_monitor(sdata); in ieee80211_rx_mgmt_beacon()
3121 ieee80211_send_nullfunc(local, sdata, 0); in ieee80211_rx_mgmt_beacon()
3122 } else if (!local->pspolling && sdata->u.mgd.powersave) { in ieee80211_rx_mgmt_beacon()
3133 ieee80211_send_pspoll(local, sdata); in ieee80211_rx_mgmt_beacon()
3138 if (sdata->vif.p2p) { in ieee80211_rx_mgmt_beacon()
3147 if (sdata->u.mgd.p2p_noa_index != noa.index) { in ieee80211_rx_mgmt_beacon()
3149 sdata->u.mgd.p2p_noa_index = noa.index; in ieee80211_rx_mgmt_beacon()
3158 } else if (sdata->u.mgd.p2p_noa_index != -1) { in ieee80211_rx_mgmt_beacon()
3160 sdata->u.mgd.p2p_noa_index = -1; in ieee80211_rx_mgmt_beacon()
3172 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems); in ieee80211_rx_mgmt_beacon()
3174 if (ieee80211_sta_wmm_params(local, sdata, elems.wmm_param, in ieee80211_rx_mgmt_beacon()
3190 sdata->vif.bss_conf.sync_tsf = in ieee80211_rx_mgmt_beacon()
3192 sdata->vif.bss_conf.sync_device_ts = in ieee80211_rx_mgmt_beacon()
3195 sdata->vif.bss_conf.sync_dtim_count = in ieee80211_rx_mgmt_beacon()
3198 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_rx_mgmt_beacon()
3210 changed |= ieee80211_handle_bss_capability(sdata, in ieee80211_rx_mgmt_beacon()
3215 sta = sta_info_get(sdata, bssid); in ieee80211_rx_mgmt_beacon()
3217 if (ieee80211_config_bw(sdata, sta, elems.ht_operation, in ieee80211_rx_mgmt_beacon()
3220 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_rx_mgmt_beacon()
3227 ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif, in ieee80211_rx_mgmt_beacon()
3234 changed |= ieee80211_handle_pwr_constr(sdata, chan, in ieee80211_rx_mgmt_beacon()
3239 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_rx_mgmt_beacon()
3244 void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_rx_queued_mgmt() argument
3247 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_rx_queued_mgmt()
3265 rma = ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, in ieee80211_sta_rx_queued_mgmt()
3269 ieee80211_rx_mgmt_probe_resp(sdata, skb); in ieee80211_sta_rx_queued_mgmt()
3272 rma = ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3275 rma = ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3278 rma = ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3282 rma = ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len, &bss); in ieee80211_sta_rx_queued_mgmt()
3300 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
3322 ieee80211_sta_process_chanswitch(sdata, in ieee80211_sta_rx_queued_mgmt()
3335 cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3338 cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3341 cfg80211_send_rx_auth(sdata->dev, (u8 *)mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3344 cfg80211_send_rx_assoc(sdata->dev, bss, (u8 *)mgmt, skb->len); in ieee80211_sta_rx_queued_mgmt()
3347 cfg80211_send_assoc_timeout(sdata->dev, mgmt->bssid); in ieee80211_sta_rx_queued_mgmt()
3350 cfg80211_send_deauth(sdata->dev, deauth_buf, in ieee80211_sta_rx_queued_mgmt()
3360 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_timer() local
3363 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_sta_timer()
3366 static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata, in ieee80211_sta_connection_lost() argument
3369 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_connection_lost()
3372 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason, in ieee80211_sta_connection_lost()
3380 cfg80211_send_deauth(sdata->dev, frame_buf, IEEE80211_DEAUTH_FRAME_LEN); in ieee80211_sta_connection_lost()
3385 static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata) in ieee80211_probe_auth() argument
3387 struct ieee80211_local *local = sdata->local; in ieee80211_probe_auth()
3388 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_probe_auth()
3400 sdata_info(sdata, "authentication with %pM timed out\n", in ieee80211_probe_auth()
3412 drv_mgd_prepare_tx(local, sdata); in ieee80211_probe_auth()
3418 sdata_info(sdata, "send auth to %pM (try %d/%d)\n", in ieee80211_probe_auth()
3434 ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, in ieee80211_probe_auth()
3442 sdata_info(sdata, "direct probe to %pM (try %d/%i)\n", in ieee80211_probe_auth()
3456 ieee80211_send_probe_req(sdata, NULL, ssidie + 2, ssidie[1], in ieee80211_probe_auth()
3473 static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata) in ieee80211_do_assoc() argument
3475 struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data; in ieee80211_do_assoc()
3476 struct ieee80211_local *local = sdata->local; in ieee80211_do_assoc()
3478 lockdep_assert_held(&sdata->u.mgd.mtx); in ieee80211_do_assoc()
3482 sdata_info(sdata, "association with %pM timed out\n", in ieee80211_do_assoc()
3494 sdata_info(sdata, "associate with %pM (try %d/%d)\n", in ieee80211_do_assoc()
3497 ieee80211_send_assoc(sdata); in ieee80211_do_assoc()
3502 run_again(&sdata->u.mgd, assoc_data->timeout); in ieee80211_do_assoc()
3510 void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_conn_tx_status() argument
3513 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_conn_tx_status()
3515 sdata->u.mgd.status_fc = fc; in ieee80211_mgd_conn_tx_status()
3516 sdata->u.mgd.status_acked = acked; in ieee80211_mgd_conn_tx_status()
3517 sdata->u.mgd.status_received = true; in ieee80211_mgd_conn_tx_status()
3519 ieee80211_queue_work(&local->hw, &sdata->work); in ieee80211_mgd_conn_tx_status()
3522 void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_work() argument
3524 struct ieee80211_local *local = sdata->local; in ieee80211_sta_work()
3525 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_work()
3565 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
3566 } else if (ieee80211_probe_auth(sdata)) { in ieee80211_sta_work()
3571 ieee80211_destroy_auth_data(sdata, false); in ieee80211_sta_work()
3574 cfg80211_send_auth_timeout(sdata->dev, bssid); in ieee80211_sta_work()
3584 ieee80211_do_assoc(sdata)) { in ieee80211_sta_work()
3589 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_sta_work()
3592 cfg80211_send_assoc_timeout(sdata->dev, bssid); in ieee80211_sta_work()
3613 ieee80211_reset_ap_probe(sdata); in ieee80211_sta_work()
3616 mlme_dbg(sdata, in ieee80211_sta_work()
3620 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
3622 mlme_dbg(sdata, in ieee80211_sta_work()
3625 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
3632 mlme_dbg(sdata, in ieee80211_sta_work()
3635 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
3638 mlme_dbg(sdata, in ieee80211_sta_work()
3642 ieee80211_mgd_probe_ap_send(sdata); in ieee80211_sta_work()
3651 sdata->name, in ieee80211_sta_work()
3654 ieee80211_sta_connection_lost(sdata, bssid, in ieee80211_sta_work()
3664 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_bcn_mon_timer() local
3666 struct ieee80211_local *local = sdata->local; in ieee80211_sta_bcn_mon_timer()
3671 sdata->u.mgd.connection_loss = false; in ieee80211_sta_bcn_mon_timer()
3672 ieee80211_queue_work(&sdata->local->hw, in ieee80211_sta_bcn_mon_timer()
3673 &sdata->u.mgd.beacon_connection_loss_work); in ieee80211_sta_bcn_mon_timer()
3678 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_conn_mon_timer() local
3680 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_conn_mon_timer()
3681 struct ieee80211_local *local = sdata->local; in ieee80211_sta_conn_mon_timer()
3691 struct ieee80211_sub_if_data *sdata = in ieee80211_sta_monitor_work() local
3695 ieee80211_mgd_probe_ap(sdata, false); in ieee80211_sta_monitor_work()
3698 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata) in ieee80211_restart_sta_timer() argument
3702 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_restart_sta_timer()
3703 __ieee80211_stop_poll(sdata); in ieee80211_restart_sta_timer()
3706 flags = sdata->local->hw.flags; in ieee80211_restart_sta_timer()
3708 ieee80211_queue_work(&sdata->local->hw, in ieee80211_restart_sta_timer()
3709 &sdata->u.mgd.monitor_work); in ieee80211_restart_sta_timer()
3711 ieee80211_queue_work(&sdata->local->hw, &sdata->work); in ieee80211_restart_sta_timer()
3716 void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_restart() argument
3718 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_sta_restart()
3726 if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { in ieee80211_sta_restart()
3727 sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; in ieee80211_sta_restart()
3728 mlme_dbg(sdata, "driver requested disconnect after resume\n"); in ieee80211_sta_restart()
3729 ieee80211_sta_connection_lost(sdata, in ieee80211_sta_restart()
3741 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_sta_setup_sdata() argument
3745 ifmgd = &sdata->u.mgd; in ieee80211_sta_setup_sdata()
3754 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
3756 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
3758 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
3760 (unsigned long) sdata); in ieee80211_sta_setup_sdata()
3763 ifmgd->powersave = sdata->wdev.ps; in ieee80211_sta_setup_sdata()
3764 ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues; in ieee80211_sta_setup_sdata()
3765 ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len; in ieee80211_sta_setup_sdata()
3770 if (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS) in ieee80211_sta_setup_sdata()
3779 struct ieee80211_sub_if_data *sdata; in ieee80211_mlme_notify_scan_completed() local
3783 list_for_each_entry_rcu(sdata, &local->interfaces, list) { in ieee80211_mlme_notify_scan_completed()
3784 if (ieee80211_sdata_running(sdata)) in ieee80211_mlme_notify_scan_completed()
3785 ieee80211_restart_sta_timer(sdata); in ieee80211_mlme_notify_scan_completed()
3805 static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata, in ieee80211_ht_vht_rx_chains() argument
3808 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_ht_vht_rx_chains()
3849 static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_channel() argument
3852 struct ieee80211_local *local = sdata->local; in ieee80211_prep_channel()
3853 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_channel()
3893 sdata_info(sdata, in ieee80211_prep_channel()
3906 ifmgd->flags |= ieee80211_determine_chantype(sdata, sband, in ieee80211_prep_channel()
3911 sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss), in ieee80211_prep_channel()
3917 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_prep_channel()
3924 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
3928 ret = ieee80211_vif_use_channel(sdata, &chandef, in ieee80211_prep_channel()
3934 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, in ieee80211_prep_connection() argument
3937 struct ieee80211_local *local = sdata->local; in ieee80211_prep_connection()
3938 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_prep_connection()
3949 have_sta = sta_info_get(sdata, cbss->bssid); in ieee80211_prep_connection()
3954 new_sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL); in ieee80211_prep_connection()
3968 err = ieee80211_prep_channel(sdata, cbss); in ieee80211_prep_connection()
3989 sdata_info(sdata, in ieee80211_prep_connection()
3995 sdata->vif.bss_conf.basic_rates = basic_rates; in ieee80211_prep_connection()
4000 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
4002 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE; in ieee80211_prep_connection()
4007 sdata->vif.bss_conf.beacon_int = cbss->beacon_interval; in ieee80211_prep_connection()
4013 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
4014 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
4019 sdata->vif.bss_conf.sync_dtim_count = tim_ie[2]; in ieee80211_prep_connection()
4021 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4026 sdata->vif.bss_conf.sync_tsf = ies->tsf; in ieee80211_prep_connection()
4027 sdata->vif.bss_conf.sync_device_ts = in ieee80211_prep_connection()
4029 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4031 sdata->vif.bss_conf.sync_tsf = 0; in ieee80211_prep_connection()
4032 sdata->vif.bss_conf.sync_device_ts = 0; in ieee80211_prep_connection()
4033 sdata->vif.bss_conf.sync_dtim_count = 0; in ieee80211_prep_connection()
4038 ieee80211_bss_info_change_notify(sdata, in ieee80211_prep_connection()
4048 sdata_info(sdata, in ieee80211_prep_connection()
4060 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_auth() argument
4063 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_auth()
4064 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_auth()
4134 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_auth()
4142 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_auth()
4146 __cfg80211_send_deauth(sdata->dev, frame_buf, in ieee80211_mgd_auth()
4150 sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid); in ieee80211_mgd_auth()
4152 err = ieee80211_prep_connection(sdata, req->bss, false); in ieee80211_mgd_auth()
4156 err = ieee80211_probe_auth(sdata); in ieee80211_mgd_auth()
4158 sta_info_destroy_addr(sdata, req->bss->bssid); in ieee80211_mgd_auth()
4169 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_auth()
4179 int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_assoc() argument
4182 struct ieee80211_local *local = sdata->local; in ieee80211_mgd_assoc()
4183 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_assoc()
4211 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_assoc()
4215 __cfg80211_send_deauth(sdata->dev, frame_buf, in ieee80211_mgd_assoc()
4234 ieee80211_destroy_auth_data(sdata, match); in ieee80211_mgd_assoc()
4254 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
4273 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
4282 netdev_info(sdata->dev, in ieee80211_mgd_assoc()
4303 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_mgd_assoc()
4305 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_mgd_assoc()
4307 sdata->smps_mode = ifmgd->req_smps; in ieee80211_mgd_assoc()
4331 (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD) && in ieee80211_mgd_assoc()
4332 sdata->wmm_acm != 0xff) { in ieee80211_mgd_assoc()
4356 sdata->control_port_protocol = req->crypto.control_port_ethertype; in ieee80211_mgd_assoc()
4357 sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt; in ieee80211_mgd_assoc()
4364 err = ieee80211_prep_connection(sdata, req->bss, true); in ieee80211_mgd_assoc()
4371 if (sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC && in ieee80211_mgd_assoc()
4377 sdata_info(sdata, "waiting for beacon from %pM\n", in ieee80211_mgd_assoc()
4399 sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf; in ieee80211_mgd_assoc()
4400 sdata->vif.bss_conf.sync_device_ts = in ieee80211_mgd_assoc()
4402 sdata->vif.bss_conf.sync_dtim_count = dtim_count; in ieee80211_mgd_assoc()
4422 sdata_info(sdata, "associating with AP with corrupt %s\n", in ieee80211_mgd_assoc()
4430 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); in ieee80211_mgd_assoc()
4440 int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_deauth() argument
4443 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_deauth()
4450 sdata_info(sdata, in ieee80211_mgd_deauth()
4455 drv_mgd_prepare_tx(sdata->local, sdata); in ieee80211_mgd_deauth()
4456 ieee80211_send_deauth_disassoc(sdata, req->bssid, in ieee80211_mgd_deauth()
4460 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_deauth()
4469 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, in ieee80211_mgd_deauth()
4477 __cfg80211_send_deauth(sdata->dev, frame_buf, in ieee80211_mgd_deauth()
4483 int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, in ieee80211_mgd_disassoc() argument
4486 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_disassoc()
4503 sdata_info(sdata, in ieee80211_mgd_disassoc()
4508 ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC, in ieee80211_mgd_disassoc()
4513 __cfg80211_send_disassoc(sdata->dev, frame_buf, in ieee80211_mgd_disassoc()
4519 void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_mgd_stop() argument
4521 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_mgd_stop()
4536 ieee80211_destroy_assoc_data(sdata, false); in ieee80211_mgd_stop()
4538 ieee80211_destroy_auth_data(sdata, false); in ieee80211_mgd_stop()
4547 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_cqm_rssi_notify() local
4549 trace_api_cqm_rssi_notify(sdata, rssi_event); in ieee80211_cqm_rssi_notify()
4551 cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, gfp); in ieee80211_cqm_rssi_notify()