Lines Matching refs:sdata
27 static void ieee80211_set_mu_mimo_follow(struct ieee80211_sub_if_data *sdata, in ieee80211_set_mu_mimo_follow() argument
38 memcpy(sdata->vif.bss_conf.mu_group.membership, in ieee80211_set_mu_mimo_follow()
40 memcpy(sdata->vif.bss_conf.mu_group.position, in ieee80211_set_mu_mimo_follow()
43 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_MU_GROUPS); in ieee80211_set_mu_mimo_follow()
53 ether_addr_copy(sdata->u.mntr.mu_follow_addr, in ieee80211_set_mu_mimo_follow()
57 sdata->vif.mu_mimo_owner = mu_mimo_groups || mu_mimo_follow; in ieee80211_set_mu_mimo_follow()
60 static int ieee80211_set_mon_options(struct ieee80211_sub_if_data *sdata, in ieee80211_set_mon_options() argument
63 struct ieee80211_local *local = sdata->local; in ieee80211_set_mon_options()
67 if (params->flags && ieee80211_sdata_running(sdata)) { in ieee80211_set_mon_options()
79 if ((params->flags & mask) != (sdata->u.mntr.flags & mask)) in ieee80211_set_mon_options()
96 if (ieee80211_sdata_running(sdata)) { in ieee80211_set_mon_options()
97 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_set_mon_options()
98 sdata->u.mntr.flags = params->flags; in ieee80211_set_mon_options()
99 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_set_mon_options()
108 sdata->u.mntr.flags = params->flags; in ieee80211_set_mon_options()
123 struct ieee80211_sub_if_data *sdata; in ieee80211_add_iface() local
130 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_add_iface()
133 err = ieee80211_set_mon_options(sdata, params); in ieee80211_add_iface()
135 ieee80211_if_remove(sdata); in ieee80211_add_iface()
155 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_iface() local
158 ret = ieee80211_if_change_type(sdata, type); in ieee80211_change_iface()
163 RCU_INIT_POINTER(sdata->u.vlan.sta, NULL); in ieee80211_change_iface()
164 ieee80211_check_fast_rx_iface(sdata); in ieee80211_change_iface()
166 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_change_iface()
169 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_change_iface()
170 ret = ieee80211_set_mon_options(sdata, params); in ieee80211_change_iface()
181 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_start_p2p_device() local
184 mutex_lock(&sdata->local->chanctx_mtx); in ieee80211_start_p2p_device()
185 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_start_p2p_device()
186 mutex_unlock(&sdata->local->chanctx_mtx); in ieee80211_start_p2p_device()
203 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_start_nan() local
206 mutex_lock(&sdata->local->chanctx_mtx); in ieee80211_start_nan()
207 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_start_nan()
208 mutex_unlock(&sdata->local->chanctx_mtx); in ieee80211_start_nan()
216 ret = drv_start_nan(sdata->local, sdata, conf); in ieee80211_start_nan()
218 ieee80211_sdata_stop(sdata); in ieee80211_start_nan()
220 sdata->u.nan.conf = *conf; in ieee80211_start_nan()
228 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_stop_nan() local
230 drv_stop_nan(sdata->local, sdata); in ieee80211_stop_nan()
231 ieee80211_sdata_stop(sdata); in ieee80211_stop_nan()
239 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_nan_change_conf() local
243 if (sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_nan_change_conf()
246 if (!ieee80211_sdata_running(sdata)) in ieee80211_nan_change_conf()
249 new_conf = sdata->u.nan.conf; in ieee80211_nan_change_conf()
257 ret = drv_nan_change_conf(sdata->local, sdata, &new_conf, changes); in ieee80211_nan_change_conf()
259 sdata->u.nan.conf = new_conf; in ieee80211_nan_change_conf()
268 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_add_nan_func() local
271 if (sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_add_nan_func()
274 if (!ieee80211_sdata_running(sdata)) in ieee80211_add_nan_func()
277 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
279 ret = idr_alloc(&sdata->u.nan.function_inst_ids, in ieee80211_add_nan_func()
280 nan_func, 1, sdata->local->hw.max_nan_de_entries + 1, in ieee80211_add_nan_func()
282 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
291 ret = drv_add_nan_func(sdata->local, sdata, nan_func); in ieee80211_add_nan_func()
293 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
294 idr_remove(&sdata->u.nan.function_inst_ids, in ieee80211_add_nan_func()
296 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
303 ieee80211_find_nan_func_by_cookie(struct ieee80211_sub_if_data *sdata, in ieee80211_find_nan_func_by_cookie() argument
309 lockdep_assert_held(&sdata->u.nan.func_lock); in ieee80211_find_nan_func_by_cookie()
311 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, id) { in ieee80211_find_nan_func_by_cookie()
322 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_del_nan_func() local
326 if (sdata->vif.type != NL80211_IFTYPE_NAN || in ieee80211_del_nan_func()
327 !ieee80211_sdata_running(sdata)) in ieee80211_del_nan_func()
330 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_del_nan_func()
332 func = ieee80211_find_nan_func_by_cookie(sdata, cookie); in ieee80211_del_nan_func()
336 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_del_nan_func()
339 drv_del_nan_func(sdata->local, sdata, instance_id); in ieee80211_del_nan_func()
346 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_noack_map() local
348 sdata->noack_map = noack_map; in ieee80211_set_noack_map()
350 ieee80211_check_fast_xmit_iface(sdata); in ieee80211_set_noack_map()
355 static int ieee80211_set_tx(struct ieee80211_sub_if_data *sdata, in ieee80211_set_tx() argument
358 struct ieee80211_local *local = sdata->local; in ieee80211_set_tx()
367 sta = sta_info_get_bss(sdata, mac_addr); in ieee80211_set_tx()
389 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_key() local
390 struct ieee80211_local *local = sdata->local; in ieee80211_add_key()
396 if (!ieee80211_sdata_running(sdata)) in ieee80211_add_key()
400 return ieee80211_set_tx(sdata, mac_addr, key_idx); in ieee80211_add_key()
419 cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type); in ieee80211_add_key()
438 sta = sta_info_get_bss(sdata, mac_addr); in ieee80211_add_key()
456 switch (sdata->vif.type) { in ieee80211_add_key()
458 if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED) in ieee80211_add_key()
472 if (sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE) in ieee80211_add_key()
493 err = ieee80211_key_link(key, sdata, sta); in ieee80211_add_key()
504 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_key() local
505 struct ieee80211_local *local = sdata->local; in ieee80211_del_key()
516 sta = sta_info_get_bss(sdata, mac_addr); in ieee80211_del_key()
525 key = key_mtx_dereference(local, sdata->keys[key_idx]); in ieee80211_del_key()
532 ieee80211_key_free(key, sdata->vif.type == NL80211_IFTYPE_STATION); in ieee80211_del_key()
548 struct ieee80211_sub_if_data *sdata; in ieee80211_get_key() local
559 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_key()
564 sta = sta_info_get_bss(sdata, mac_addr); in ieee80211_get_key()
574 key = rcu_dereference(sdata->keys[key_idx]); in ieee80211_get_key()
591 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
624 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
643 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
665 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_key() local
667 ieee80211_set_default_key(sdata, key_idx, uni, multi); in ieee80211_config_default_key()
676 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_mgmt_key() local
678 ieee80211_set_default_mgmt_key(sdata, key_idx); in ieee80211_config_default_mgmt_key()
697 int shift = ieee80211_vif_get_shift(&sta->sdata->vif); in sta_set_rate_info_tx()
700 sband = ieee80211_get_sband(sta->sdata); in sta_set_rate_info_tx()
721 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_station() local
722 struct ieee80211_local *local = sdata->local; in ieee80211_dump_station()
728 sta = sta_info_get_by_idx(sdata, idx); in ieee80211_dump_station()
751 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_station() local
752 struct ieee80211_local *local = sdata->local; in ieee80211_get_station()
758 sta = sta_info_get_bss(sdata, mac); in ieee80211_get_station()
773 struct ieee80211_sub_if_data *sdata; in ieee80211_set_monitor_channel() local
781 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_monitor_channel()
782 if (sdata) { in ieee80211_set_monitor_channel()
783 ieee80211_vif_release_channel(sdata); in ieee80211_set_monitor_channel()
784 ret = ieee80211_vif_use_channel(sdata, chandef, in ieee80211_set_monitor_channel()
799 static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_set_probe_resp() argument
808 old = sdata_dereference(sdata->u.ap.probe_resp, sdata); in ieee80211_set_probe_resp()
822 rcu_assign_pointer(sdata->u.ap.probe_resp, new); in ieee80211_set_probe_resp()
830 struct ieee80211_sub_if_data *sdata, in ieee80211_set_ftm_responder_params() argument
842 bss_conf = &sdata->vif.bss_conf; in ieee80211_set_ftm_responder_params()
871 static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_assign_beacon() argument
880 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_assign_beacon()
937 err = ieee80211_set_probe_resp(sdata, params->probe_resp, in ieee80211_assign_beacon()
947 sdata->vif.bss_conf.ftm_responder = params->ftm_responder; in ieee80211_assign_beacon()
948 err = ieee80211_set_ftm_responder_params(sdata, in ieee80211_assign_beacon()
962 rcu_assign_pointer(sdata->u.ap.beacon, new); in ieee80211_assign_beacon()
973 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_start_ap() local
974 struct ieee80211_local *local = sdata->local; in ieee80211_start_ap()
988 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_start_ap()
994 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_start_ap()
997 sdata->smps_mode = IEEE80211_SMPS_STATIC; in ieee80211_start_ap()
1000 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_start_ap()
1005 sdata->u.ap.req_smps = sdata->smps_mode; in ieee80211_start_ap()
1007 sdata->needed_rx_chains = sdata->local->rx_chains; in ieee80211_start_ap()
1009 prev_beacon_int = sdata->vif.bss_conf.beacon_int; in ieee80211_start_ap()
1010 sdata->vif.bss_conf.beacon_int = params->beacon_interval; in ieee80211_start_ap()
1013 sdata->vif.bss_conf.he_support = true; in ieee80211_start_ap()
1016 err = ieee80211_vif_use_channel(sdata, ¶ms->chandef, in ieee80211_start_ap()
1019 ieee80211_vif_copy_chanctx_to_vlans(sdata, false); in ieee80211_start_ap()
1022 sdata->vif.bss_conf.beacon_int = prev_beacon_int; in ieee80211_start_ap()
1030 sdata->control_port_protocol = params->crypto.control_port_ethertype; in ieee80211_start_ap()
1031 sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt; in ieee80211_start_ap()
1032 sdata->control_port_over_nl80211 = in ieee80211_start_ap()
1034 sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local, in ieee80211_start_ap()
1036 sdata->vif.type); in ieee80211_start_ap()
1038 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) { in ieee80211_start_ap()
1046 ieee80211_cs_headroom(sdata->local, in ieee80211_start_ap()
1051 sdata->vif.bss_conf.dtim_period = params->dtim_period; in ieee80211_start_ap()
1052 sdata->vif.bss_conf.enable_beacon = true; in ieee80211_start_ap()
1053 sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p; in ieee80211_start_ap()
1054 sdata->vif.bss_conf.twt_responder = params->twt_responder; in ieee80211_start_ap()
1055 memcpy(&sdata->vif.bss_conf.he_obss_pd, ¶ms->he_obss_pd, in ieee80211_start_ap()
1058 sdata->vif.bss_conf.ssid_len = params->ssid_len; in ieee80211_start_ap()
1060 memcpy(sdata->vif.bss_conf.ssid, params->ssid, in ieee80211_start_ap()
1062 sdata->vif.bss_conf.hidden_ssid = in ieee80211_start_ap()
1065 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_start_ap()
1066 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_start_ap()
1067 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow = in ieee80211_start_ap()
1070 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_start_ap()
1073 err = ieee80211_assign_beacon(sdata, ¶ms->beacon, NULL); in ieee80211_start_ap()
1075 ieee80211_vif_release_channel(sdata); in ieee80211_start_ap()
1080 err = drv_start_ap(sdata->local, sdata); in ieee80211_start_ap()
1082 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_start_ap()
1086 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL); in ieee80211_start_ap()
1087 ieee80211_vif_release_channel(sdata); in ieee80211_start_ap()
1091 ieee80211_recalc_dtim(local, sdata); in ieee80211_start_ap()
1092 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_start_ap()
1095 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) in ieee80211_start_ap()
1104 struct ieee80211_sub_if_data *sdata; in ieee80211_change_beacon() local
1108 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_beacon()
1109 sdata_assert_lock(sdata); in ieee80211_change_beacon()
1114 if (sdata->vif.csa_active) in ieee80211_change_beacon()
1117 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_change_beacon()
1121 err = ieee80211_assign_beacon(sdata, params, NULL); in ieee80211_change_beacon()
1124 ieee80211_bss_info_change_notify(sdata, err); in ieee80211_change_beacon()
1130 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop_ap() local
1132 struct ieee80211_local *local = sdata->local; in ieee80211_stop_ap()
1137 sdata_assert_lock(sdata); in ieee80211_stop_ap()
1139 old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_stop_ap()
1142 old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata); in ieee80211_stop_ap()
1146 sdata->vif.csa_active = false; in ieee80211_stop_ap()
1147 if (sdata->csa_block_tx) { in ieee80211_stop_ap()
1148 ieee80211_wake_vif_queues(local, sdata, in ieee80211_stop_ap()
1150 sdata->csa_block_tx = false; in ieee80211_stop_ap()
1155 kfree(sdata->u.ap.next_beacon); in ieee80211_stop_ap()
1156 sdata->u.ap.next_beacon = NULL; in ieee80211_stop_ap()
1159 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) in ieee80211_stop_ap()
1164 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL); in ieee80211_stop_ap()
1165 RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL); in ieee80211_stop_ap()
1169 sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF; in ieee80211_stop_ap()
1171 kfree(sdata->vif.bss_conf.ftmr_params); in ieee80211_stop_ap()
1172 sdata->vif.bss_conf.ftmr_params = NULL; in ieee80211_stop_ap()
1174 __sta_info_flush(sdata, true); in ieee80211_stop_ap()
1175 ieee80211_free_keys(sdata, true); in ieee80211_stop_ap()
1177 sdata->vif.bss_conf.enable_beacon = false; in ieee80211_stop_ap()
1178 sdata->vif.bss_conf.ssid_len = 0; in ieee80211_stop_ap()
1179 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state); in ieee80211_stop_ap()
1180 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); in ieee80211_stop_ap()
1182 if (sdata->wdev.cac_started) { in ieee80211_stop_ap()
1183 chandef = sdata->vif.bss_conf.chandef; in ieee80211_stop_ap()
1184 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); in ieee80211_stop_ap()
1185 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_stop_ap()
1190 drv_stop_ap(sdata->local, sdata); in ieee80211_stop_ap()
1193 local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf); in ieee80211_stop_ap()
1194 ieee80211_purge_tx_queue(&local->hw, &sdata->u.ap.ps.bc_buf); in ieee80211_stop_ap()
1197 ieee80211_vif_copy_chanctx_to_vlans(sdata, true); in ieee80211_stop_ap()
1198 ieee80211_vif_release_channel(sdata); in ieee80211_stop_ap()
1269 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_apply_mesh_params() local
1276 changed = mesh_plink_inc_estab_count(sdata); in sta_apply_mesh_params()
1282 sdata->u.mesh.mshcfg.power_mode); in sta_apply_mesh_params()
1296 changed = mesh_plink_dec_estab_count(sdata); in sta_apply_mesh_params()
1325 ieee80211_mbss_info_change_notify(sdata, changed); in sta_apply_mesh_params()
1335 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_apply_parameters() local
1338 sband = ieee80211_get_sband(sdata); in sta_apply_parameters()
1345 if (ieee80211_vif_is_mesh(&sdata->vif)) { in sta_apply_parameters()
1406 !sdata->u.mgd.tdls_chan_switch_prohibited && in sta_apply_parameters()
1412 !sdata->u.mgd.tdls_wider_bw_prohibited && in sta_apply_parameters()
1473 ret = drv_sta_set_txpwr(local, sdata, sta); in sta_apply_parameters()
1479 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef, in sta_apply_parameters()
1486 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in sta_apply_parameters()
1491 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in sta_apply_parameters()
1495 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, in sta_apply_parameters()
1503 __ieee80211_vht_handle_opmode(sdata, sta, params->opmode_notif, in sta_apply_parameters()
1510 if (ieee80211_vif_is_mesh(&sdata->vif)) in sta_apply_parameters()
1533 struct ieee80211_sub_if_data *sdata; in ieee80211_add_station() local
1537 sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); in ieee80211_add_station()
1539 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_add_station()
1540 sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_add_station()
1543 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_station()
1545 if (ether_addr_equal(mac, sdata->vif.addr)) in ieee80211_add_station()
1552 sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_add_station()
1553 !sdata->u.mgd.associated) in ieee80211_add_station()
1556 sta = sta_info_alloc(sdata, mac, GFP_KERNEL); in ieee80211_add_station()
1592 struct ieee80211_sub_if_data *sdata; in ieee80211_del_station() local
1594 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_station()
1597 return sta_info_destroy_addr_bss(sdata, params->mac); in ieee80211_del_station()
1599 sta_info_flush(sdata); in ieee80211_del_station()
1607 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_station() local
1616 sta = sta_info_get_bss(sdata, mac); in ieee80211_change_station()
1622 switch (sdata->vif.type) { in ieee80211_change_station()
1624 if (sdata->u.mesh.user_mpm) in ieee80211_change_station()
1658 if (params->vlan && params->vlan != sta->sdata->dev) { in ieee80211_change_station()
1671 if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_change_station()
1672 sta->sdata->u.vlan.sta) in ieee80211_change_station()
1673 RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL); in ieee80211_change_station()
1676 ieee80211_vif_dec_num_mcast(sta->sdata); in ieee80211_change_station()
1678 sta->sdata = vlansdata; in ieee80211_change_station()
1682 ieee80211_vif_inc_num_mcast(sta->sdata); in ieee80211_change_station()
1683 cfg80211_send_layer2_update(sta->sdata->dev, in ieee80211_change_station()
1694 if ((sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_change_station()
1695 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && in ieee80211_change_station()
1696 sta->known_smps_mode != sta->sdata->bss->req_smps && in ieee80211_change_station()
1699 ht_dbg(sta->sdata, in ieee80211_change_station()
1702 ieee80211_send_smps_action(sta->sdata, in ieee80211_change_station()
1703 sta->sdata->bss->req_smps, in ieee80211_change_station()
1705 sta->sdata->vif.bss_conf.bssid); in ieee80211_change_station()
1708 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_change_station()
1711 ieee80211_recalc_ps_vif(sdata); in ieee80211_change_station()
1724 struct ieee80211_sub_if_data *sdata; in ieee80211_add_mpath() local
1728 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_mpath()
1731 sta = sta_info_get(sdata, next_hop); in ieee80211_add_mpath()
1737 mpath = mesh_path_add(sdata, dst); in ieee80211_add_mpath()
1752 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_mpath() local
1755 return mesh_path_del(sdata, dst); in ieee80211_del_mpath()
1757 mesh_path_flush_by_iface(sdata); in ieee80211_del_mpath()
1764 struct ieee80211_sub_if_data *sdata; in ieee80211_change_mpath() local
1768 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mpath()
1772 sta = sta_info_get(sdata, next_hop); in ieee80211_change_mpath()
1778 mpath = mesh_path_lookup(sdata, dst); in ieee80211_change_mpath()
1802 pinfo->generation = mpath->sdata->u.mesh.mesh_paths_generation; in mpath_set_pinfo()
1840 struct ieee80211_sub_if_data *sdata; in ieee80211_get_mpath() local
1843 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mpath()
1846 mpath = mesh_path_lookup(sdata, dst); in ieee80211_get_mpath()
1861 struct ieee80211_sub_if_data *sdata; in ieee80211_dump_mpath() local
1864 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_mpath()
1867 mpath = mesh_path_lookup_by_idx(sdata, idx); in ieee80211_dump_mpath()
1884 pinfo->generation = mpath->sdata->u.mesh.mpp_paths_generation; in mpp_set_pinfo()
1891 struct ieee80211_sub_if_data *sdata; in ieee80211_get_mpp() local
1894 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mpp()
1897 mpath = mpp_path_lookup(sdata, dst); in ieee80211_get_mpp()
1912 struct ieee80211_sub_if_data *sdata; in ieee80211_dump_mpp() local
1915 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_mpp()
1918 mpath = mpp_path_lookup_by_idx(sdata, idx); in ieee80211_dump_mpp()
1933 struct ieee80211_sub_if_data *sdata; in ieee80211_get_mesh_config() local
1934 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mesh_config()
1936 memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config)); in ieee80211_get_mesh_config()
1950 struct ieee80211_sub_if_data *sdata = container_of(ifmsh, in copy_mesh_setup() local
1983 memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate, in copy_mesh_setup()
1985 sdata->vif.bss_conf.basic_rates = setup->basic_rates; in copy_mesh_setup()
1987 sdata->vif.bss_conf.beacon_int = setup->beacon_interval; in copy_mesh_setup()
1988 sdata->vif.bss_conf.dtim_period = setup->dtim_period; in copy_mesh_setup()
1998 struct ieee80211_sub_if_data *sdata; in ieee80211_update_mesh_config() local
2001 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_update_mesh_config()
2002 ifmsh = &sdata->u.mesh; in ieee80211_update_mesh_config()
2005 conf = &(sdata->u.mesh.mshcfg); in ieee80211_update_mesh_config()
2073 if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM)) in ieee80211_update_mesh_config()
2079 sdata->vif.bss_conf.ht_operation_mode = nconf->ht_opmode; in ieee80211_update_mesh_config()
2080 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT); in ieee80211_update_mesh_config()
2093 ieee80211_mps_local_status_update(sdata); in ieee80211_update_mesh_config()
2103 ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON); in ieee80211_update_mesh_config()
2111 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_join_mesh() local
2112 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_join_mesh()
2120 sdata->control_port_over_nl80211 = setup->control_port_over_nl80211; in ieee80211_join_mesh()
2123 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_join_mesh()
2124 sdata->needed_rx_chains = sdata->local->rx_chains; in ieee80211_join_mesh()
2126 mutex_lock(&sdata->local->mtx); in ieee80211_join_mesh()
2127 err = ieee80211_vif_use_channel(sdata, &setup->chandef, in ieee80211_join_mesh()
2129 mutex_unlock(&sdata->local->mtx); in ieee80211_join_mesh()
2133 return ieee80211_start_mesh(sdata); in ieee80211_join_mesh()
2138 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_leave_mesh() local
2140 ieee80211_stop_mesh(sdata); in ieee80211_leave_mesh()
2141 mutex_lock(&sdata->local->mtx); in ieee80211_leave_mesh()
2142 ieee80211_vif_release_channel(sdata); in ieee80211_leave_mesh()
2143 mutex_unlock(&sdata->local->mtx); in ieee80211_leave_mesh()
2153 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_bss() local
2157 if (!sdata_dereference(sdata->u.ap.beacon, sdata)) in ieee80211_change_bss()
2160 sband = ieee80211_get_sband(sdata); in ieee80211_change_bss()
2165 sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot; in ieee80211_change_bss()
2169 sdata->vif.bss_conf.use_short_preamble = in ieee80211_change_bss()
2174 if (!sdata->vif.bss_conf.use_short_slot && in ieee80211_change_bss()
2176 sdata->vif.bss_conf.use_short_slot = true; in ieee80211_change_bss()
2181 sdata->vif.bss_conf.use_short_slot = in ieee80211_change_bss()
2187 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef, in ieee80211_change_bss()
2191 &sdata->vif.bss_conf.basic_rates); in ieee80211_change_bss()
2193 ieee80211_check_rate_mask(sdata); in ieee80211_change_bss()
2198 sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS; in ieee80211_change_bss()
2200 sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS; in ieee80211_change_bss()
2201 ieee80211_check_fast_rx_iface(sdata); in ieee80211_change_bss()
2205 sdata->vif.bss_conf.ht_operation_mode = in ieee80211_change_bss()
2211 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &= in ieee80211_change_bss()
2213 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_change_bss()
2219 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_change_bss()
2223 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &= in ieee80211_change_bss()
2228 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_change_bss()
2238 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_txq_params() local
2259 ieee80211_regulatory_limit_wmm_params(sdata, &p, params->ac); in ieee80211_set_txq_params()
2261 sdata->tx_conf[params->ac] = p; in ieee80211_set_txq_params()
2262 if (drv_conf_tx(local, sdata, params->ac, &p)) { in ieee80211_set_txq_params()
2269 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); in ieee80211_set_txq_params()
2293 struct ieee80211_sub_if_data *sdata; in ieee80211_scan() local
2295 sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev); in ieee80211_scan()
2297 switch (ieee80211_vif_type_p2p(&sdata->vif)) { in ieee80211_scan()
2305 if (sdata->local->ops->hw_scan) in ieee80211_scan()
2321 if (sdata->u.ap.beacon && in ieee80211_scan()
2331 return ieee80211_request_scan(sdata, req); in ieee80211_scan()
2344 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_sched_scan_start() local
2346 if (!sdata->local->ops->sched_scan_start) in ieee80211_sched_scan_start()
2349 return ieee80211_request_sched_scan_start(sdata, req); in ieee80211_sched_scan_start()
2413 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_mcast_rate() local
2415 memcpy(sdata->vif.bss_conf.mcast_rate, rate, in ieee80211_set_mcast_rate()
2418 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_MCAST_RATE); in ieee80211_set_mcast_rate()
2485 struct ieee80211_sub_if_data *sdata; in ieee80211_set_tx_power() local
2491 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_set_tx_power()
2493 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_set_tx_power()
2494 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_tx_power()
2495 if (!sdata) in ieee80211_set_tx_power()
2501 sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_tx_power()
2508 sdata->user_power_level = MBM_TO_DBM(mbm); in ieee80211_set_tx_power()
2512 if (txp_type != sdata->vif.bss_conf.txpower_type) { in ieee80211_set_tx_power()
2514 sdata->vif.bss_conf.txpower_type = txp_type; in ieee80211_set_tx_power()
2517 ieee80211_recalc_txpower(sdata, update_txp_type); in ieee80211_set_tx_power()
2536 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_set_tx_power()
2537 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_set_tx_power()
2541 sdata->user_power_level = local->user_power_level; in ieee80211_set_tx_power()
2542 if (txp_type != sdata->vif.bss_conf.txpower_type) in ieee80211_set_tx_power()
2544 sdata->vif.bss_conf.txpower_type = txp_type; in ieee80211_set_tx_power()
2546 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_set_tx_power()
2547 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_set_tx_power()
2549 ieee80211_recalc_txpower(sdata, update_txp_type); in ieee80211_set_tx_power()
2554 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_tx_power()
2555 if (sdata) { in ieee80211_set_tx_power()
2556 sdata->user_power_level = local->user_power_level; in ieee80211_set_tx_power()
2557 if (txp_type != sdata->vif.bss_conf.txpower_type) in ieee80211_set_tx_power()
2559 sdata->vif.bss_conf.txpower_type = txp_type; in ieee80211_set_tx_power()
2561 ieee80211_recalc_txpower(sdata, update_txp_type); in ieee80211_set_tx_power()
2573 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_get_tx_power() local
2576 return drv_get_txpower(local, sdata, dbm); in ieee80211_get_tx_power()
2581 *dbm = sdata->vif.bss_conf.txpower; in ieee80211_get_tx_power()
2589 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_wds_peer() local
2591 memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN); in ieee80211_set_wds_peer()
2615 struct ieee80211_sub_if_data *sdata; in ieee80211_testmode_cmd() local
2617 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_testmode_cmd()
2618 if (sdata->flags & IEEE80211_SDATA_IN_DRIVER) in ieee80211_testmode_cmd()
2619 vif = &sdata->vif; in ieee80211_testmode_cmd()
2639 int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata, in __ieee80211_request_smps_ap() argument
2645 if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP)) in __ieee80211_request_smps_ap()
2648 if (sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT) in __ieee80211_request_smps_ap()
2651 old_req = sdata->u.ap.req_smps; in __ieee80211_request_smps_ap()
2652 sdata->u.ap.req_smps = smps_mode; in __ieee80211_request_smps_ap()
2659 ht_dbg(sdata, in __ieee80211_request_smps_ap()
2661 smps_mode, atomic_read(&sdata->u.ap.num_mcast_sta)); in __ieee80211_request_smps_ap()
2663 mutex_lock(&sdata->local->sta_mtx); in __ieee80211_request_smps_ap()
2664 list_for_each_entry(sta, &sdata->local->sta_list, list) { in __ieee80211_request_smps_ap()
2669 if (sta->sdata->bss != &sdata->u.ap) in __ieee80211_request_smps_ap()
2683 ht_dbg(sdata, "Won't send SMPS to sleeping STA %pM\n", in __ieee80211_request_smps_ap()
2695 ht_dbg(sdata, "Sending SMPS to %pM\n", sta->sta.addr); in __ieee80211_request_smps_ap()
2696 ieee80211_send_smps_action(sdata, smps_mode, sta->sta.addr, in __ieee80211_request_smps_ap()
2697 sdata->vif.bss_conf.bssid); in __ieee80211_request_smps_ap()
2699 mutex_unlock(&sdata->local->sta_mtx); in __ieee80211_request_smps_ap()
2701 sdata->smps_mode = smps_mode; in __ieee80211_request_smps_ap()
2702 ieee80211_queue_work(&sdata->local->hw, &sdata->recalc_smps); in __ieee80211_request_smps_ap()
2707 int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata, in __ieee80211_request_smps_mgd() argument
2716 lockdep_assert_held(&sdata->wdev.mtx); in __ieee80211_request_smps_mgd()
2718 if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION)) in __ieee80211_request_smps_mgd()
2721 old_req = sdata->u.mgd.req_smps; in __ieee80211_request_smps_mgd()
2722 sdata->u.mgd.req_smps = smps_mode; in __ieee80211_request_smps_mgd()
2733 if (!sdata->u.mgd.associated || in __ieee80211_request_smps_mgd()
2734 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT) in __ieee80211_request_smps_mgd()
2737 ap = sdata->u.mgd.associated->bssid; in __ieee80211_request_smps_mgd()
2740 list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) { in __ieee80211_request_smps_mgd()
2741 if (!sta->sta.tdls || sta->sdata != sdata || !sta->uploaded || in __ieee80211_request_smps_mgd()
2751 if (tdls_peer_found || !sdata->u.mgd.powersave) in __ieee80211_request_smps_mgd()
2758 err = ieee80211_send_smps_action(sdata, smps_mode, in __ieee80211_request_smps_mgd()
2761 sdata->u.mgd.req_smps = old_req; in __ieee80211_request_smps_mgd()
2763 ieee80211_teardown_tdls_peers(sdata); in __ieee80211_request_smps_mgd()
2771 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_power_mgmt() local
2774 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_set_power_mgmt()
2780 if (enabled == sdata->u.mgd.powersave && in ieee80211_set_power_mgmt()
2784 sdata->u.mgd.powersave = enabled; in ieee80211_set_power_mgmt()
2788 sdata_lock(sdata); in ieee80211_set_power_mgmt()
2789 __ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps); in ieee80211_set_power_mgmt()
2790 sdata_unlock(sdata); in ieee80211_set_power_mgmt()
2796 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_power_mgmt()
2797 ieee80211_check_fast_rx_iface(sdata); in ieee80211_set_power_mgmt()
2806 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_cqm_rssi_config() local
2807 struct ieee80211_vif *vif = &sdata->vif; in ieee80211_set_cqm_rssi_config()
2814 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER && in ieee80211_set_cqm_rssi_config()
2815 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) in ieee80211_set_cqm_rssi_config()
2822 sdata->u.mgd.last_cqm_event_signal = 0; in ieee80211_set_cqm_rssi_config()
2825 if (sdata->u.mgd.associated && in ieee80211_set_cqm_rssi_config()
2826 sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI) in ieee80211_set_cqm_rssi_config()
2827 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM); in ieee80211_set_cqm_rssi_config()
2836 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_cqm_rssi_range_config() local
2837 struct ieee80211_vif *vif = &sdata->vif; in ieee80211_set_cqm_rssi_range_config()
2840 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_set_cqm_rssi_range_config()
2847 sdata->u.mgd.last_cqm_event_signal = 0; in ieee80211_set_cqm_rssi_range_config()
2850 if (sdata->u.mgd.associated && in ieee80211_set_cqm_rssi_range_config()
2851 sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI) in ieee80211_set_cqm_rssi_range_config()
2852 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM); in ieee80211_set_cqm_rssi_range_config()
2862 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_bitrate_mask() local
2866 if (!ieee80211_sdata_running(sdata)) in ieee80211_set_bitrate_mask()
2875 if (rcu_access_pointer(sdata->vif.chanctx_conf) && in ieee80211_set_bitrate_mask()
2876 sdata->vif.bss_conf.chandef.chan) { in ieee80211_set_bitrate_mask()
2877 u32 basic_rates = sdata->vif.bss_conf.basic_rates; in ieee80211_set_bitrate_mask()
2878 enum nl80211_band band = sdata->vif.bss_conf.chandef.chan->band; in ieee80211_set_bitrate_mask()
2885 ret = drv_set_bitrate_mask(local, sdata, mask); in ieee80211_set_bitrate_mask()
2894 sdata->rc_rateidx_mask[i] = mask->control[i].legacy; in ieee80211_set_bitrate_mask()
2895 memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].ht_mcs, in ieee80211_set_bitrate_mask()
2897 memcpy(sdata->rc_rateidx_vht_mcs_mask[i], in ieee80211_set_bitrate_mask()
2901 sdata->rc_has_mcs_mask[i] = false; in ieee80211_set_bitrate_mask()
2902 sdata->rc_has_vht_mcs_mask[i] = false; in ieee80211_set_bitrate_mask()
2907 if (~sdata->rc_rateidx_mcs_mask[i][j]) { in ieee80211_set_bitrate_mask()
2908 sdata->rc_has_mcs_mask[i] = true; in ieee80211_set_bitrate_mask()
2914 if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) { in ieee80211_set_bitrate_mask()
2915 sdata->rc_has_vht_mcs_mask[i] = true; in ieee80211_set_bitrate_mask()
2929 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_start_radar_detection() local
2930 struct ieee80211_local *local = sdata->local; in ieee80211_start_radar_detection()
2940 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_start_radar_detection()
2941 sdata->needed_rx_chains = local->rx_chains; in ieee80211_start_radar_detection()
2943 err = ieee80211_vif_use_channel(sdata, chandef, in ieee80211_start_radar_detection()
2948 ieee80211_queue_delayed_work(&sdata->local->hw, in ieee80211_start_radar_detection()
2949 &sdata->dfs_cac_timer_work, in ieee80211_start_radar_detection()
3030 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_csa_finish() local
3032 ieee80211_queue_work(&sdata->local->hw, in ieee80211_csa_finish()
3033 &sdata->csa_finalize_work); in ieee80211_csa_finish()
3037 static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_set_after_csa_beacon() argument
3042 switch (sdata->vif.type) { in ieee80211_set_after_csa_beacon()
3044 err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon, in ieee80211_set_after_csa_beacon()
3046 kfree(sdata->u.ap.next_beacon); in ieee80211_set_after_csa_beacon()
3047 sdata->u.ap.next_beacon = NULL; in ieee80211_set_after_csa_beacon()
3054 err = ieee80211_ibss_finish_csa(sdata); in ieee80211_set_after_csa_beacon()
3061 err = ieee80211_mesh_finish_csa(sdata); in ieee80211_set_after_csa_beacon()
3075 static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata) in __ieee80211_csa_finalize() argument
3077 struct ieee80211_local *local = sdata->local; in __ieee80211_csa_finalize()
3081 sdata_assert_lock(sdata); in __ieee80211_csa_finalize()
3092 if (sdata->reserved_chanctx) { in __ieee80211_csa_finalize()
3098 if (sdata->reserved_ready) in __ieee80211_csa_finalize()
3101 return ieee80211_vif_use_reserved_context(sdata); in __ieee80211_csa_finalize()
3104 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in __ieee80211_csa_finalize()
3105 &sdata->csa_chandef)) in __ieee80211_csa_finalize()
3108 sdata->vif.csa_active = false; in __ieee80211_csa_finalize()
3110 err = ieee80211_set_after_csa_beacon(sdata, &changed); in __ieee80211_csa_finalize()
3114 ieee80211_bss_info_change_notify(sdata, changed); in __ieee80211_csa_finalize()
3116 if (sdata->csa_block_tx) { in __ieee80211_csa_finalize()
3117 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_csa_finalize()
3119 sdata->csa_block_tx = false; in __ieee80211_csa_finalize()
3122 err = drv_post_channel_switch(sdata); in __ieee80211_csa_finalize()
3126 cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef); in __ieee80211_csa_finalize()
3131 static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata) in ieee80211_csa_finalize() argument
3133 if (__ieee80211_csa_finalize(sdata)) { in ieee80211_csa_finalize()
3134 sdata_info(sdata, "failed to finalize CSA, disconnecting\n"); in ieee80211_csa_finalize()
3135 cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev, in ieee80211_csa_finalize()
3142 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_finalize_work() local
3145 struct ieee80211_local *local = sdata->local; in ieee80211_csa_finalize_work()
3147 sdata_lock(sdata); in ieee80211_csa_finalize_work()
3152 if (!sdata->vif.csa_active) in ieee80211_csa_finalize_work()
3155 if (!ieee80211_sdata_running(sdata)) in ieee80211_csa_finalize_work()
3158 ieee80211_csa_finalize(sdata); in ieee80211_csa_finalize_work()
3163 sdata_unlock(sdata); in ieee80211_csa_finalize_work()
3166 static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_set_csa_beacon() argument
3173 switch (sdata->vif.type) { in ieee80211_set_csa_beacon()
3175 sdata->u.ap.next_beacon = in ieee80211_set_csa_beacon()
3177 if (!sdata->u.ap.next_beacon) in ieee80211_set_csa_beacon()
3211 err = ieee80211_assign_beacon(sdata, ¶ms->beacon_csa, &csa); in ieee80211_set_csa_beacon()
3213 kfree(sdata->u.ap.next_beacon); in ieee80211_set_csa_beacon()
3220 if (!sdata->vif.bss_conf.ibss_joined) in ieee80211_set_csa_beacon()
3223 if (params->chandef.width != sdata->u.ibss.chandef.width) in ieee80211_set_csa_beacon()
3229 cfg80211_get_chandef_type(&sdata->u.ibss.chandef)) in ieee80211_set_csa_beacon()
3241 if (sdata->u.ibss.chandef.chan->band != in ieee80211_set_csa_beacon()
3247 err = ieee80211_ibss_csa_beacon(sdata, params); in ieee80211_set_csa_beacon()
3253 ieee80211_send_action_csa(sdata, params); in ieee80211_set_csa_beacon()
3258 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_set_csa_beacon()
3260 if (params->chandef.width != sdata->vif.bss_conf.chandef.width) in ieee80211_set_csa_beacon()
3264 if (sdata->vif.bss_conf.chandef.chan->band != in ieee80211_set_csa_beacon()
3278 err = ieee80211_mesh_csa_beacon(sdata, params); in ieee80211_set_csa_beacon()
3287 ieee80211_send_action_csa(sdata, params); in ieee80211_set_csa_beacon()
3303 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in __ieee80211_channel_switch() local
3304 struct ieee80211_local *local = sdata->local; in __ieee80211_channel_switch()
3311 sdata_assert_lock(sdata); in __ieee80211_channel_switch()
3317 if (sdata->wdev.cac_started) in __ieee80211_channel_switch()
3321 &sdata->vif.bss_conf.chandef)) in __ieee80211_channel_switch()
3325 if (sdata->vif.csa_active) in __ieee80211_channel_switch()
3329 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in __ieee80211_channel_switch()
3344 err = drv_pre_channel_switch(sdata, &ch_switch); in __ieee80211_channel_switch()
3348 err = ieee80211_vif_reserve_chanctx(sdata, ¶ms->chandef, in __ieee80211_channel_switch()
3355 err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0); in __ieee80211_channel_switch()
3357 ieee80211_vif_unreserve_chanctx(sdata); in __ieee80211_channel_switch()
3361 err = ieee80211_set_csa_beacon(sdata, params, &changed); in __ieee80211_channel_switch()
3363 ieee80211_vif_unreserve_chanctx(sdata); in __ieee80211_channel_switch()
3367 sdata->csa_chandef = params->chandef; in __ieee80211_channel_switch()
3368 sdata->csa_block_tx = params->block_tx; in __ieee80211_channel_switch()
3369 sdata->vif.csa_active = true; in __ieee80211_channel_switch()
3371 if (sdata->csa_block_tx) in __ieee80211_channel_switch()
3372 ieee80211_stop_vif_queues(local, sdata, in __ieee80211_channel_switch()
3375 cfg80211_ch_switch_started_notify(sdata->dev, &sdata->csa_chandef, in __ieee80211_channel_switch()
3379 ieee80211_bss_info_change_notify(sdata, changed); in __ieee80211_channel_switch()
3380 drv_channel_switch_beacon(sdata, ¶ms->chandef); in __ieee80211_channel_switch()
3383 ieee80211_csa_finalize(sdata); in __ieee80211_channel_switch()
3394 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_channel_switch() local
3395 struct ieee80211_local *local = sdata->local; in ieee80211_channel_switch()
3452 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_mgmt_frame_register() local
3458 sdata->vif.probe_req_reg++; in ieee80211_mgmt_frame_register()
3463 if (sdata->vif.probe_req_reg) in ieee80211_mgmt_frame_register()
3464 sdata->vif.probe_req_reg--; in ieee80211_mgmt_frame_register()
3470 if (sdata->vif.probe_req_reg == 1) in ieee80211_mgmt_frame_register()
3471 drv_config_iface_filter(local, sdata, FIF_PROBE_REQ, in ieee80211_mgmt_frame_register()
3473 else if (sdata->vif.probe_req_reg == 0) in ieee80211_mgmt_frame_register()
3474 drv_config_iface_filter(local, sdata, 0, in ieee80211_mgmt_frame_register()
3506 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_rekey_data() local
3511 drv_set_rekey_data(local, sdata, data); in ieee80211_set_rekey_data()
3519 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_probe_client() local
3520 struct ieee80211_local *local = sdata->local; in ieee80211_probe_client()
3536 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_probe_client()
3542 sta = sta_info_get_bss(sdata, peer); in ieee80211_probe_client()
3575 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_probe_client()
3576 memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN); in ieee80211_probe_client()
3597 ieee80211_xmit(sdata, sta, skb, 0); in ieee80211_probe_client()
3612 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_cfg_get_channel() local
3618 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_cfg_get_channel()
3620 *chandef = sdata->vif.bss_conf.chandef; in ieee80211_cfg_get_channel()
3624 sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_cfg_get_channel()
3647 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_qos_map() local
3660 old_qos_map = sdata_dereference(sdata->qos_map, sdata); in ieee80211_set_qos_map()
3661 rcu_assign_pointer(sdata->qos_map, new_qos_map); in ieee80211_set_qos_map()
3672 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_ap_chanwidth() local
3676 ret = ieee80211_vif_change_bandwidth(sdata, chandef, &changed); in ieee80211_set_ap_chanwidth()
3678 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_ap_chanwidth()
3687 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_tx_ts() local
3688 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_add_tx_ts()
3691 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_add_tx_ts()
3694 if (!(sdata->wmm_acm & BIT(up))) in ieee80211_add_tx_ts()
3712 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_tx_ts() local
3713 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_del_tx_ts()
3735 ieee80211_flush_queues(local, sdata, false); in ieee80211_del_tx_ts()
3742 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_del_tx_ts()
3758 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_nan_func_terminated() local
3765 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_terminated()
3767 func = idr_find(&sdata->u.nan.function_inst_ids, inst_id); in ieee80211_nan_func_terminated()
3769 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_terminated()
3774 idr_remove(&sdata->u.nan.function_inst_ids, inst_id); in ieee80211_nan_func_terminated()
3776 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_terminated()
3789 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_nan_func_match() local
3795 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3797 func = idr_find(&sdata->u.nan.function_inst_ids, match->inst_id); in ieee80211_nan_func_match()
3799 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3804 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3814 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_to_unicast() local
3816 sdata->u.ap.multicast_to_unicast = enabled; in ieee80211_set_multicast_to_unicast()
3875 struct ieee80211_sub_if_data *sdata; in ieee80211_get_txq_stats() local
3885 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_get_txq_stats()
3886 if (!sdata->vif.txq) { in ieee80211_get_txq_stats()
3890 ieee80211_fill_txq_stats(txqstats, to_txq_info(sdata->vif.txq)); in ieee80211_get_txq_stats()
3920 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_ftm_responder_stats() local
3922 return drv_get_ftm_responder_stats(local, sdata, ftm_stats); in ieee80211_get_ftm_responder_stats()
3930 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev); in ieee80211_start_pmsr() local
3932 return drv_start_pmsr(local, sdata, request); in ieee80211_start_pmsr()
3940 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev); in ieee80211_abort_pmsr() local
3942 return drv_abort_pmsr(local, sdata, request); in ieee80211_abort_pmsr()