Lines Matching refs:sdata

26 static void ieee80211_set_mu_mimo_follow(struct ieee80211_sub_if_data *sdata,  in ieee80211_set_mu_mimo_follow()  argument
37 memcpy(sdata->vif.bss_conf.mu_group.membership, in ieee80211_set_mu_mimo_follow()
39 memcpy(sdata->vif.bss_conf.mu_group.position, in ieee80211_set_mu_mimo_follow()
42 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_MU_GROUPS); in ieee80211_set_mu_mimo_follow()
52 ether_addr_copy(sdata->u.mntr.mu_follow_addr, in ieee80211_set_mu_mimo_follow()
56 sdata->vif.mu_mimo_owner = mu_mimo_groups || mu_mimo_follow; in ieee80211_set_mu_mimo_follow()
59 static int ieee80211_set_mon_options(struct ieee80211_sub_if_data *sdata, in ieee80211_set_mon_options() argument
62 struct ieee80211_local *local = sdata->local; in ieee80211_set_mon_options()
66 if (params->flags && ieee80211_sdata_running(sdata)) { in ieee80211_set_mon_options()
78 if ((params->flags & mask) != (sdata->u.mntr.flags & mask)) in ieee80211_set_mon_options()
95 if (ieee80211_sdata_running(sdata)) { in ieee80211_set_mon_options()
96 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_set_mon_options()
97 sdata->u.mntr.flags = params->flags; in ieee80211_set_mon_options()
98 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_set_mon_options()
107 sdata->u.mntr.flags = params->flags; in ieee80211_set_mon_options()
122 struct ieee80211_sub_if_data *sdata; in ieee80211_add_iface() local
129 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_add_iface()
132 err = ieee80211_set_mon_options(sdata, params); in ieee80211_add_iface()
134 ieee80211_if_remove(sdata); in ieee80211_add_iface()
154 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_iface() local
155 struct ieee80211_local *local = sdata->local; in ieee80211_change_iface()
159 ret = ieee80211_if_change_type(sdata, type); in ieee80211_change_iface()
164 RCU_INIT_POINTER(sdata->u.vlan.sta, NULL); in ieee80211_change_iface()
165 ieee80211_check_fast_rx_iface(sdata); in ieee80211_change_iface()
167 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_change_iface()
172 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_change_iface()
177 sta = sta_info_get(sdata, ifmgd->bssid); in ieee80211_change_iface()
179 drv_sta_set_4addr(local, sdata, &sta->sta, in ieee80211_change_iface()
184 ieee80211_send_4addr_nullfunc(local, sdata); in ieee80211_change_iface()
187 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_change_iface()
188 ret = ieee80211_set_mon_options(sdata, params); in ieee80211_change_iface()
199 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_start_p2p_device() local
202 mutex_lock(&sdata->local->chanctx_mtx); in ieee80211_start_p2p_device()
203 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_start_p2p_device()
204 mutex_unlock(&sdata->local->chanctx_mtx); in ieee80211_start_p2p_device()
221 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_start_nan() local
224 mutex_lock(&sdata->local->chanctx_mtx); in ieee80211_start_nan()
225 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_start_nan()
226 mutex_unlock(&sdata->local->chanctx_mtx); in ieee80211_start_nan()
234 ret = drv_start_nan(sdata->local, sdata, conf); in ieee80211_start_nan()
236 ieee80211_sdata_stop(sdata); in ieee80211_start_nan()
238 sdata->u.nan.conf = *conf; in ieee80211_start_nan()
246 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_stop_nan() local
248 drv_stop_nan(sdata->local, sdata); in ieee80211_stop_nan()
249 ieee80211_sdata_stop(sdata); in ieee80211_stop_nan()
257 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_nan_change_conf() local
261 if (sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_nan_change_conf()
264 if (!ieee80211_sdata_running(sdata)) in ieee80211_nan_change_conf()
267 new_conf = sdata->u.nan.conf; in ieee80211_nan_change_conf()
275 ret = drv_nan_change_conf(sdata->local, sdata, &new_conf, changes); in ieee80211_nan_change_conf()
277 sdata->u.nan.conf = new_conf; in ieee80211_nan_change_conf()
286 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_add_nan_func() local
289 if (sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_add_nan_func()
292 if (!ieee80211_sdata_running(sdata)) in ieee80211_add_nan_func()
295 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
297 ret = idr_alloc(&sdata->u.nan.function_inst_ids, in ieee80211_add_nan_func()
298 nan_func, 1, sdata->local->hw.max_nan_de_entries + 1, in ieee80211_add_nan_func()
300 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
309 ret = drv_add_nan_func(sdata->local, sdata, nan_func); in ieee80211_add_nan_func()
311 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
312 idr_remove(&sdata->u.nan.function_inst_ids, in ieee80211_add_nan_func()
314 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
321 ieee80211_find_nan_func_by_cookie(struct ieee80211_sub_if_data *sdata, in ieee80211_find_nan_func_by_cookie() argument
327 lockdep_assert_held(&sdata->u.nan.func_lock); in ieee80211_find_nan_func_by_cookie()
329 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, id) { in ieee80211_find_nan_func_by_cookie()
340 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_del_nan_func() local
344 if (sdata->vif.type != NL80211_IFTYPE_NAN || in ieee80211_del_nan_func()
345 !ieee80211_sdata_running(sdata)) in ieee80211_del_nan_func()
348 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_del_nan_func()
350 func = ieee80211_find_nan_func_by_cookie(sdata, cookie); in ieee80211_del_nan_func()
354 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_del_nan_func()
357 drv_del_nan_func(sdata->local, sdata, instance_id); in ieee80211_del_nan_func()
364 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_noack_map() local
366 sdata->noack_map = noack_map; in ieee80211_set_noack_map()
368 ieee80211_check_fast_xmit_iface(sdata); in ieee80211_set_noack_map()
373 static int ieee80211_set_tx(struct ieee80211_sub_if_data *sdata, in ieee80211_set_tx() argument
376 struct ieee80211_local *local = sdata->local; in ieee80211_set_tx()
385 sta = sta_info_get_bss(sdata, mac_addr); in ieee80211_set_tx()
407 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_key() local
408 struct ieee80211_local *local = sdata->local; in ieee80211_add_key()
414 if (!ieee80211_sdata_running(sdata)) in ieee80211_add_key()
418 return ieee80211_set_tx(sdata, mac_addr, key_idx); in ieee80211_add_key()
438 cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type); in ieee80211_add_key()
457 sta = sta_info_get_bss(sdata, mac_addr); in ieee80211_add_key()
475 switch (sdata->vif.type) { in ieee80211_add_key()
477 if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED) in ieee80211_add_key()
491 if (sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE) in ieee80211_add_key()
512 err = ieee80211_key_link(key, sdata, sta); in ieee80211_add_key()
523 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_key() local
524 struct ieee80211_local *local = sdata->local; in ieee80211_del_key()
535 sta = sta_info_get_bss(sdata, mac_addr); in ieee80211_del_key()
544 key = key_mtx_dereference(local, sdata->keys[key_idx]); in ieee80211_del_key()
551 ieee80211_key_free(key, sdata->vif.type == NL80211_IFTYPE_STATION); in ieee80211_del_key()
567 struct ieee80211_sub_if_data *sdata; in ieee80211_get_key() local
578 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_key()
583 sta = sta_info_get_bss(sdata, mac_addr); in ieee80211_get_key()
594 key = rcu_dereference(sdata->keys[key_idx]); in ieee80211_get_key()
611 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
644 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
663 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
685 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_key() local
687 ieee80211_set_default_key(sdata, key_idx, uni, multi); in ieee80211_config_default_key()
696 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_mgmt_key() local
698 ieee80211_set_default_mgmt_key(sdata, key_idx); in ieee80211_config_default_mgmt_key()
707 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_beacon_key() local
709 ieee80211_set_default_beacon_key(sdata, key_idx); in ieee80211_config_default_beacon_key()
728 int shift = ieee80211_vif_get_shift(&sta->sdata->vif); in sta_set_rate_info_tx()
731 sband = ieee80211_get_sband(sta->sdata); in sta_set_rate_info_tx()
753 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_station() local
754 struct ieee80211_local *local = sdata->local; in ieee80211_dump_station()
760 sta = sta_info_get_by_idx(sdata, idx); in ieee80211_dump_station()
783 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_station() local
784 struct ieee80211_local *local = sdata->local; in ieee80211_get_station()
790 sta = sta_info_get_bss(sdata, mac); in ieee80211_get_station()
805 struct ieee80211_sub_if_data *sdata; in ieee80211_set_monitor_channel() local
813 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_monitor_channel()
814 if (sdata) { in ieee80211_set_monitor_channel()
815 ieee80211_vif_release_channel(sdata); in ieee80211_set_monitor_channel()
816 ret = ieee80211_vif_use_channel(sdata, chandef, in ieee80211_set_monitor_channel()
832 ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_set_probe_resp() argument
842 old = sdata_dereference(sdata->u.ap.probe_resp, sdata); in ieee80211_set_probe_resp()
858 rcu_assign_pointer(sdata->u.ap.probe_resp, new); in ieee80211_set_probe_resp()
865 static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata, in ieee80211_set_fils_discovery() argument
874 fd = &sdata->vif.bss_conf.fils_discovery; in ieee80211_set_fils_discovery()
878 old = sdata_dereference(sdata->u.ap.fils_discovery, sdata); in ieee80211_set_fils_discovery()
884 rcu_assign_pointer(sdata->u.ap.fils_discovery, new); in ieee80211_set_fils_discovery()
893 ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata, in ieee80211_set_unsol_bcast_probe_resp() argument
901 old = sdata_dereference(sdata->u.ap.unsol_bcast_probe_resp, sdata); in ieee80211_set_unsol_bcast_probe_resp()
907 rcu_assign_pointer(sdata->u.ap.unsol_bcast_probe_resp, new); in ieee80211_set_unsol_bcast_probe_resp()
912 sdata->vif.bss_conf.unsol_bcast_probe_resp_interval = in ieee80211_set_unsol_bcast_probe_resp()
919 struct ieee80211_sub_if_data *sdata, in ieee80211_set_ftm_responder_params() argument
931 bss_conf = &sdata->vif.bss_conf; in ieee80211_set_ftm_responder_params()
960 static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_assign_beacon() argument
970 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_assign_beacon()
1030 err = ieee80211_set_probe_resp(sdata, params->probe_resp, in ieee80211_assign_beacon()
1040 sdata->vif.bss_conf.ftm_responder = params->ftm_responder; in ieee80211_assign_beacon()
1041 err = ieee80211_set_ftm_responder_params(sdata, in ieee80211_assign_beacon()
1055 rcu_assign_pointer(sdata->u.ap.beacon, new); in ieee80211_assign_beacon()
1066 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_start_ap() local
1067 struct ieee80211_local *local = sdata->local; in ieee80211_start_ap()
1080 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_start_ap()
1087 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_start_ap()
1089 sdata->needed_rx_chains = sdata->local->rx_chains; in ieee80211_start_ap()
1091 prev_beacon_int = sdata->vif.bss_conf.beacon_int; in ieee80211_start_ap()
1092 sdata->vif.bss_conf.beacon_int = params->beacon_interval; in ieee80211_start_ap()
1095 sdata->vif.bss_conf.he_support = true; in ieee80211_start_ap()
1096 sdata->vif.bss_conf.htc_trig_based_pkt_ext = in ieee80211_start_ap()
1099 sdata->vif.bss_conf.frame_time_rts_th = in ieee80211_start_ap()
1109 err = ieee80211_vif_use_channel(sdata, &params->chandef, in ieee80211_start_ap()
1112 ieee80211_vif_copy_chanctx_to_vlans(sdata, false); in ieee80211_start_ap()
1115 sdata->vif.bss_conf.beacon_int = prev_beacon_int; in ieee80211_start_ap()
1123 sdata->control_port_protocol = params->crypto.control_port_ethertype; in ieee80211_start_ap()
1124 sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt; in ieee80211_start_ap()
1125 sdata->control_port_over_nl80211 = in ieee80211_start_ap()
1127 sdata->control_port_no_preauth = in ieee80211_start_ap()
1129 sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local, in ieee80211_start_ap()
1131 sdata->vif.type); in ieee80211_start_ap()
1133 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) { in ieee80211_start_ap()
1143 ieee80211_cs_headroom(sdata->local, in ieee80211_start_ap()
1148 sdata->vif.bss_conf.dtim_period = params->dtim_period; in ieee80211_start_ap()
1149 sdata->vif.bss_conf.enable_beacon = true; in ieee80211_start_ap()
1150 sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p; in ieee80211_start_ap()
1151 sdata->vif.bss_conf.twt_responder = params->twt_responder; in ieee80211_start_ap()
1152 sdata->vif.bss_conf.he_obss_pd = params->he_obss_pd; in ieee80211_start_ap()
1153 sdata->vif.bss_conf.he_bss_color = params->he_bss_color; in ieee80211_start_ap()
1154 sdata->vif.bss_conf.s1g = params->chandef.chan->band == in ieee80211_start_ap()
1157 sdata->vif.bss_conf.ssid_len = params->ssid_len; in ieee80211_start_ap()
1159 memcpy(sdata->vif.bss_conf.ssid, params->ssid, in ieee80211_start_ap()
1161 sdata->vif.bss_conf.hidden_ssid = in ieee80211_start_ap()
1164 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_start_ap()
1165 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_start_ap()
1166 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow = in ieee80211_start_ap()
1169 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_start_ap()
1172 sdata->beacon_rate_set = false; in ieee80211_start_ap()
1176 sdata->beacon_rateidx_mask[i] = in ieee80211_start_ap()
1178 if (sdata->beacon_rateidx_mask[i]) in ieee80211_start_ap()
1179 sdata->beacon_rate_set = true; in ieee80211_start_ap()
1184 sdata->vif.bss_conf.beacon_tx_rate = params->beacon_rate; in ieee80211_start_ap()
1186 err = ieee80211_assign_beacon(sdata, &params->beacon, NULL, NULL); in ieee80211_start_ap()
1192 err = ieee80211_set_fils_discovery(sdata, in ieee80211_start_ap()
1200 err = ieee80211_set_unsol_bcast_probe_resp(sdata, in ieee80211_start_ap()
1207 err = drv_start_ap(sdata->local, sdata); in ieee80211_start_ap()
1209 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_start_ap()
1213 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL); in ieee80211_start_ap()
1217 ieee80211_recalc_dtim(local, sdata); in ieee80211_start_ap()
1218 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_start_ap()
1221 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) in ieee80211_start_ap()
1227 ieee80211_vif_release_channel(sdata); in ieee80211_start_ap()
1234 struct ieee80211_sub_if_data *sdata; in ieee80211_change_beacon() local
1238 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_beacon()
1239 sdata_assert_lock(sdata); in ieee80211_change_beacon()
1244 if (sdata->vif.csa_active || sdata->vif.color_change_active) in ieee80211_change_beacon()
1247 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_change_beacon()
1251 err = ieee80211_assign_beacon(sdata, params, NULL, NULL); in ieee80211_change_beacon()
1254 ieee80211_bss_info_change_notify(sdata, err); in ieee80211_change_beacon()
1260 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop_ap() local
1262 struct ieee80211_local *local = sdata->local; in ieee80211_stop_ap()
1269 sdata_assert_lock(sdata); in ieee80211_stop_ap()
1271 old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_stop_ap()
1274 old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata); in ieee80211_stop_ap()
1275 old_fils_discovery = sdata_dereference(sdata->u.ap.fils_discovery, in ieee80211_stop_ap()
1276 sdata); in ieee80211_stop_ap()
1278 sdata_dereference(sdata->u.ap.unsol_bcast_probe_resp, in ieee80211_stop_ap()
1279 sdata); in ieee80211_stop_ap()
1283 sdata->vif.csa_active = false; in ieee80211_stop_ap()
1284 if (sdata->csa_block_tx) { in ieee80211_stop_ap()
1285 ieee80211_wake_vif_queues(local, sdata, in ieee80211_stop_ap()
1287 sdata->csa_block_tx = false; in ieee80211_stop_ap()
1292 kfree(sdata->u.ap.next_beacon); in ieee80211_stop_ap()
1293 sdata->u.ap.next_beacon = NULL; in ieee80211_stop_ap()
1296 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) in ieee80211_stop_ap()
1301 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL); in ieee80211_stop_ap()
1302 RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL); in ieee80211_stop_ap()
1303 RCU_INIT_POINTER(sdata->u.ap.fils_discovery, NULL); in ieee80211_stop_ap()
1304 RCU_INIT_POINTER(sdata->u.ap.unsol_bcast_probe_resp, NULL); in ieee80211_stop_ap()
1313 kfree(sdata->vif.bss_conf.ftmr_params); in ieee80211_stop_ap()
1314 sdata->vif.bss_conf.ftmr_params = NULL; in ieee80211_stop_ap()
1316 __sta_info_flush(sdata, true); in ieee80211_stop_ap()
1317 ieee80211_free_keys(sdata, true); in ieee80211_stop_ap()
1319 sdata->vif.bss_conf.enable_beacon = false; in ieee80211_stop_ap()
1320 sdata->beacon_rate_set = false; in ieee80211_stop_ap()
1321 sdata->vif.bss_conf.ssid_len = 0; in ieee80211_stop_ap()
1322 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state); in ieee80211_stop_ap()
1323 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); in ieee80211_stop_ap()
1325 if (sdata->wdev.cac_started) { in ieee80211_stop_ap()
1326 chandef = sdata->vif.bss_conf.chandef; in ieee80211_stop_ap()
1327 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); in ieee80211_stop_ap()
1328 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_stop_ap()
1333 drv_stop_ap(sdata->local, sdata); in ieee80211_stop_ap()
1336 local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf); in ieee80211_stop_ap()
1337 ieee80211_purge_tx_queue(&local->hw, &sdata->u.ap.ps.bc_buf); in ieee80211_stop_ap()
1340 ieee80211_vif_copy_chanctx_to_vlans(sdata, true); in ieee80211_stop_ap()
1341 ieee80211_vif_release_channel(sdata); in ieee80211_stop_ap()
1412 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_apply_mesh_params() local
1419 changed = mesh_plink_inc_estab_count(sdata); in sta_apply_mesh_params()
1425 sdata->u.mesh.mshcfg.power_mode); in sta_apply_mesh_params()
1439 changed = mesh_plink_dec_estab_count(sdata); in sta_apply_mesh_params()
1468 ieee80211_mbss_info_change_notify(sdata, changed); in sta_apply_mesh_params()
1510 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_apply_parameters() local
1513 sband = ieee80211_get_sband(sdata); in sta_apply_parameters()
1520 if (ieee80211_vif_is_mesh(&sdata->vif)) { in sta_apply_parameters()
1581 !sdata->u.mgd.tdls_chan_switch_prohibited && in sta_apply_parameters()
1587 !sdata->u.mgd.tdls_wider_bw_prohibited && in sta_apply_parameters()
1648 ret = drv_sta_set_txpwr(local, sdata, sta); in sta_apply_parameters()
1654 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef, in sta_apply_parameters()
1661 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, in sta_apply_parameters()
1666 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband, in sta_apply_parameters()
1670 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband, in sta_apply_parameters()
1680 __ieee80211_vht_handle_opmode(sdata, sta, params->opmode_notif, in sta_apply_parameters()
1687 if (ieee80211_vif_is_mesh(&sdata->vif)) in sta_apply_parameters()
1711 struct ieee80211_sub_if_data *sdata; in ieee80211_add_station() local
1715 sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); in ieee80211_add_station()
1717 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_add_station()
1718 sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_add_station()
1721 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_station()
1723 if (ether_addr_equal(mac, sdata->vif.addr)) in ieee80211_add_station()
1730 sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_add_station()
1731 !sdata->u.mgd.associated) in ieee80211_add_station()
1734 sta = sta_info_alloc(sdata, mac, GFP_KERNEL); in ieee80211_add_station()
1762 struct ieee80211_sub_if_data *sdata; in ieee80211_del_station() local
1764 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_station()
1767 return sta_info_destroy_addr_bss(sdata, params->mac); in ieee80211_del_station()
1769 sta_info_flush(sdata); in ieee80211_del_station()
1777 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_station() local
1786 sta = sta_info_get_bss(sdata, mac); in ieee80211_change_station()
1792 switch (sdata->vif.type) { in ieee80211_change_station()
1794 if (sdata->u.mesh.user_mpm) in ieee80211_change_station()
1828 if (params->vlan && params->vlan != sta->sdata->dev) { in ieee80211_change_station()
1839 drv_sta_set_4addr(local, sta->sdata, &sta->sta, true); in ieee80211_change_station()
1842 if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_change_station()
1843 sta->sdata->u.vlan.sta) { in ieee80211_change_station()
1845 RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL); in ieee80211_change_station()
1849 ieee80211_vif_dec_num_mcast(sta->sdata); in ieee80211_change_station()
1851 sta->sdata = vlansdata; in ieee80211_change_station()
1855 ieee80211_vif_inc_num_mcast(sta->sdata); in ieee80211_change_station()
1856 cfg80211_send_layer2_update(sta->sdata->dev, in ieee80211_change_station()
1867 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_change_station()
1870 ieee80211_recalc_ps_vif(sdata); in ieee80211_change_station()
1883 struct ieee80211_sub_if_data *sdata; in ieee80211_add_mpath() local
1887 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_mpath()
1890 sta = sta_info_get(sdata, next_hop); in ieee80211_add_mpath()
1896 mpath = mesh_path_add(sdata, dst); in ieee80211_add_mpath()
1911 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_mpath() local
1914 return mesh_path_del(sdata, dst); in ieee80211_del_mpath()
1916 mesh_path_flush_by_iface(sdata); in ieee80211_del_mpath()
1923 struct ieee80211_sub_if_data *sdata; in ieee80211_change_mpath() local
1927 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mpath()
1931 sta = sta_info_get(sdata, next_hop); in ieee80211_change_mpath()
1937 mpath = mesh_path_lookup(sdata, dst); in ieee80211_change_mpath()
1961 pinfo->generation = mpath->sdata->u.mesh.mesh_paths_generation; in mpath_set_pinfo()
1999 struct ieee80211_sub_if_data *sdata; in ieee80211_get_mpath() local
2002 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mpath()
2005 mpath = mesh_path_lookup(sdata, dst); in ieee80211_get_mpath()
2020 struct ieee80211_sub_if_data *sdata; in ieee80211_dump_mpath() local
2023 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_mpath()
2026 mpath = mesh_path_lookup_by_idx(sdata, idx); in ieee80211_dump_mpath()
2043 pinfo->generation = mpath->sdata->u.mesh.mpp_paths_generation; in mpp_set_pinfo()
2050 struct ieee80211_sub_if_data *sdata; in ieee80211_get_mpp() local
2053 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mpp()
2056 mpath = mpp_path_lookup(sdata, dst); in ieee80211_get_mpp()
2071 struct ieee80211_sub_if_data *sdata; in ieee80211_dump_mpp() local
2074 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_mpp()
2077 mpath = mpp_path_lookup_by_idx(sdata, idx); in ieee80211_dump_mpp()
2092 struct ieee80211_sub_if_data *sdata; in ieee80211_get_mesh_config() local
2093 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mesh_config()
2095 memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config)); in ieee80211_get_mesh_config()
2109 struct ieee80211_sub_if_data *sdata = container_of(ifmsh, in copy_mesh_setup() local
2143 memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate, in copy_mesh_setup()
2145 sdata->vif.bss_conf.basic_rates = setup->basic_rates; in copy_mesh_setup()
2147 sdata->vif.bss_conf.beacon_int = setup->beacon_interval; in copy_mesh_setup()
2148 sdata->vif.bss_conf.dtim_period = setup->dtim_period; in copy_mesh_setup()
2150 sdata->beacon_rate_set = false; in copy_mesh_setup()
2151 if (wiphy_ext_feature_isset(sdata->local->hw.wiphy, in copy_mesh_setup()
2154 sdata->beacon_rateidx_mask[i] = in copy_mesh_setup()
2156 if (sdata->beacon_rateidx_mask[i]) in copy_mesh_setup()
2157 sdata->beacon_rate_set = true; in copy_mesh_setup()
2169 struct ieee80211_sub_if_data *sdata; in ieee80211_update_mesh_config() local
2172 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_update_mesh_config()
2173 ifmsh = &sdata->u.mesh; in ieee80211_update_mesh_config()
2176 conf = &(sdata->u.mesh.mshcfg); in ieee80211_update_mesh_config()
2244 if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM)) in ieee80211_update_mesh_config()
2250 sdata->vif.bss_conf.ht_operation_mode = nconf->ht_opmode; in ieee80211_update_mesh_config()
2251 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT); in ieee80211_update_mesh_config()
2264 ieee80211_mps_local_status_update(sdata); in ieee80211_update_mesh_config()
2279 ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON); in ieee80211_update_mesh_config()
2287 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_join_mesh() local
2288 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_join_mesh()
2296 sdata->control_port_over_nl80211 = setup->control_port_over_nl80211; in ieee80211_join_mesh()
2299 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_join_mesh()
2300 sdata->needed_rx_chains = sdata->local->rx_chains; in ieee80211_join_mesh()
2302 mutex_lock(&sdata->local->mtx); in ieee80211_join_mesh()
2303 err = ieee80211_vif_use_channel(sdata, &setup->chandef, in ieee80211_join_mesh()
2305 mutex_unlock(&sdata->local->mtx); in ieee80211_join_mesh()
2309 return ieee80211_start_mesh(sdata); in ieee80211_join_mesh()
2314 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_leave_mesh() local
2316 ieee80211_stop_mesh(sdata); in ieee80211_leave_mesh()
2317 mutex_lock(&sdata->local->mtx); in ieee80211_leave_mesh()
2318 ieee80211_vif_release_channel(sdata); in ieee80211_leave_mesh()
2319 kfree(sdata->u.mesh.ie); in ieee80211_leave_mesh()
2320 mutex_unlock(&sdata->local->mtx); in ieee80211_leave_mesh()
2330 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_bss() local
2334 if (!sdata_dereference(sdata->u.ap.beacon, sdata)) in ieee80211_change_bss()
2337 sband = ieee80211_get_sband(sdata); in ieee80211_change_bss()
2342 sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot; in ieee80211_change_bss()
2346 sdata->vif.bss_conf.use_short_preamble = in ieee80211_change_bss()
2351 if (!sdata->vif.bss_conf.use_short_slot && in ieee80211_change_bss()
2354 sdata->vif.bss_conf.use_short_slot = true; in ieee80211_change_bss()
2359 sdata->vif.bss_conf.use_short_slot = in ieee80211_change_bss()
2365 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef, in ieee80211_change_bss()
2369 &sdata->vif.bss_conf.basic_rates); in ieee80211_change_bss()
2371 ieee80211_check_rate_mask(sdata); in ieee80211_change_bss()
2376 sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS; in ieee80211_change_bss()
2378 sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS; in ieee80211_change_bss()
2379 ieee80211_check_fast_rx_iface(sdata); in ieee80211_change_bss()
2383 sdata->vif.bss_conf.ht_operation_mode = in ieee80211_change_bss()
2389 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &= in ieee80211_change_bss()
2391 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_change_bss()
2397 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_change_bss()
2401 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &= in ieee80211_change_bss()
2406 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_change_bss()
2416 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_txq_params() local
2437 ieee80211_regulatory_limit_wmm_params(sdata, &p, params->ac); in ieee80211_set_txq_params()
2439 sdata->tx_conf[params->ac] = p; in ieee80211_set_txq_params()
2440 if (drv_conf_tx(local, sdata, params->ac, &p)) { in ieee80211_set_txq_params()
2447 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); in ieee80211_set_txq_params()
2471 struct ieee80211_sub_if_data *sdata; in ieee80211_scan() local
2473 sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev); in ieee80211_scan()
2475 switch (ieee80211_vif_type_p2p(&sdata->vif)) { in ieee80211_scan()
2483 if (sdata->local->ops->hw_scan) in ieee80211_scan()
2499 if (sdata->u.ap.beacon && in ieee80211_scan()
2509 return ieee80211_request_scan(sdata, req); in ieee80211_scan()
2522 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_sched_scan_start() local
2524 if (!sdata->local->ops->sched_scan_start) in ieee80211_sched_scan_start()
2527 return ieee80211_request_sched_scan_start(sdata, req); in ieee80211_sched_scan_start()
2591 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_mcast_rate() local
2593 memcpy(sdata->vif.bss_conf.mcast_rate, rate, in ieee80211_set_mcast_rate()
2596 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_MCAST_RATE); in ieee80211_set_mcast_rate()
2663 struct ieee80211_sub_if_data *sdata; in ieee80211_set_tx_power() local
2669 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_set_tx_power()
2671 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_set_tx_power()
2672 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_tx_power()
2673 if (!sdata) in ieee80211_set_tx_power()
2679 sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_tx_power()
2686 sdata->user_power_level = MBM_TO_DBM(mbm); in ieee80211_set_tx_power()
2690 if (txp_type != sdata->vif.bss_conf.txpower_type) { in ieee80211_set_tx_power()
2692 sdata->vif.bss_conf.txpower_type = txp_type; in ieee80211_set_tx_power()
2695 ieee80211_recalc_txpower(sdata, update_txp_type); in ieee80211_set_tx_power()
2714 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_set_tx_power()
2715 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_set_tx_power()
2719 sdata->user_power_level = local->user_power_level; in ieee80211_set_tx_power()
2720 if (txp_type != sdata->vif.bss_conf.txpower_type) in ieee80211_set_tx_power()
2722 sdata->vif.bss_conf.txpower_type = txp_type; in ieee80211_set_tx_power()
2724 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_set_tx_power()
2725 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_set_tx_power()
2727 ieee80211_recalc_txpower(sdata, update_txp_type); in ieee80211_set_tx_power()
2732 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_tx_power()
2733 if (sdata) { in ieee80211_set_tx_power()
2734 sdata->user_power_level = local->user_power_level; in ieee80211_set_tx_power()
2735 if (txp_type != sdata->vif.bss_conf.txpower_type) in ieee80211_set_tx_power()
2737 sdata->vif.bss_conf.txpower_type = txp_type; in ieee80211_set_tx_power()
2739 ieee80211_recalc_txpower(sdata, update_txp_type); in ieee80211_set_tx_power()
2751 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_get_tx_power() local
2754 return drv_get_txpower(local, sdata, dbm); in ieee80211_get_tx_power()
2759 *dbm = sdata->vif.bss_conf.txpower; in ieee80211_get_tx_power()
2783 struct ieee80211_sub_if_data *sdata; in ieee80211_testmode_cmd() local
2785 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_testmode_cmd()
2786 if (sdata->flags & IEEE80211_SDATA_IN_DRIVER) in ieee80211_testmode_cmd()
2787 vif = &sdata->vif; in ieee80211_testmode_cmd()
2807 int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata, in __ieee80211_request_smps_mgd() argument
2816 lockdep_assert_held(&sdata->wdev.mtx); in __ieee80211_request_smps_mgd()
2818 if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION)) in __ieee80211_request_smps_mgd()
2821 old_req = sdata->u.mgd.req_smps; in __ieee80211_request_smps_mgd()
2822 sdata->u.mgd.req_smps = smps_mode; in __ieee80211_request_smps_mgd()
2833 if (!sdata->u.mgd.associated || in __ieee80211_request_smps_mgd()
2834 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT) in __ieee80211_request_smps_mgd()
2837 ap = sdata->u.mgd.associated->bssid; in __ieee80211_request_smps_mgd()
2840 list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) { in __ieee80211_request_smps_mgd()
2841 if (!sta->sta.tdls || sta->sdata != sdata || !sta->uploaded || in __ieee80211_request_smps_mgd()
2851 if (tdls_peer_found || !sdata->u.mgd.powersave) in __ieee80211_request_smps_mgd()
2858 err = ieee80211_send_smps_action(sdata, smps_mode, in __ieee80211_request_smps_mgd()
2861 sdata->u.mgd.req_smps = old_req; in __ieee80211_request_smps_mgd()
2863 ieee80211_teardown_tdls_peers(sdata); in __ieee80211_request_smps_mgd()
2871 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_power_mgmt() local
2874 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_set_power_mgmt()
2880 if (enabled == sdata->u.mgd.powersave && in ieee80211_set_power_mgmt()
2884 sdata->u.mgd.powersave = enabled; in ieee80211_set_power_mgmt()
2888 sdata_lock(sdata); in ieee80211_set_power_mgmt()
2889 __ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps); in ieee80211_set_power_mgmt()
2890 sdata_unlock(sdata); in ieee80211_set_power_mgmt()
2896 ieee80211_recalc_ps_vif(sdata); in ieee80211_set_power_mgmt()
2897 ieee80211_check_fast_rx_iface(sdata); in ieee80211_set_power_mgmt()
2906 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_cqm_rssi_config() local
2907 struct ieee80211_vif *vif = &sdata->vif; in ieee80211_set_cqm_rssi_config()
2914 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER && in ieee80211_set_cqm_rssi_config()
2915 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) in ieee80211_set_cqm_rssi_config()
2922 sdata->u.mgd.last_cqm_event_signal = 0; in ieee80211_set_cqm_rssi_config()
2925 if (sdata->u.mgd.associated && in ieee80211_set_cqm_rssi_config()
2926 sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI) in ieee80211_set_cqm_rssi_config()
2927 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM); in ieee80211_set_cqm_rssi_config()
2936 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_cqm_rssi_range_config() local
2937 struct ieee80211_vif *vif = &sdata->vif; in ieee80211_set_cqm_rssi_range_config()
2940 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_set_cqm_rssi_range_config()
2947 sdata->u.mgd.last_cqm_event_signal = 0; in ieee80211_set_cqm_rssi_range_config()
2950 if (sdata->u.mgd.associated && in ieee80211_set_cqm_rssi_range_config()
2951 sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI) in ieee80211_set_cqm_rssi_range_config()
2952 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM); in ieee80211_set_cqm_rssi_range_config()
2962 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_bitrate_mask() local
2966 if (!ieee80211_sdata_running(sdata)) in ieee80211_set_bitrate_mask()
2975 if (rcu_access_pointer(sdata->vif.chanctx_conf) && in ieee80211_set_bitrate_mask()
2976 sdata->vif.bss_conf.chandef.chan) { in ieee80211_set_bitrate_mask()
2977 u32 basic_rates = sdata->vif.bss_conf.basic_rates; in ieee80211_set_bitrate_mask()
2978 enum nl80211_band band = sdata->vif.bss_conf.chandef.chan->band; in ieee80211_set_bitrate_mask()
2985 ret = drv_set_bitrate_mask(local, sdata, mask); in ieee80211_set_bitrate_mask()
2994 sdata->rc_rateidx_mask[i] = mask->control[i].legacy; in ieee80211_set_bitrate_mask()
2995 memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].ht_mcs, in ieee80211_set_bitrate_mask()
2997 memcpy(sdata->rc_rateidx_vht_mcs_mask[i], in ieee80211_set_bitrate_mask()
3001 sdata->rc_has_mcs_mask[i] = false; in ieee80211_set_bitrate_mask()
3002 sdata->rc_has_vht_mcs_mask[i] = false; in ieee80211_set_bitrate_mask()
3007 if (sdata->rc_rateidx_mcs_mask[i][j] != 0xff) { in ieee80211_set_bitrate_mask()
3008 sdata->rc_has_mcs_mask[i] = true; in ieee80211_set_bitrate_mask()
3014 if (sdata->rc_rateidx_vht_mcs_mask[i][j] != 0xffff) { in ieee80211_set_bitrate_mask()
3015 sdata->rc_has_vht_mcs_mask[i] = true; in ieee80211_set_bitrate_mask()
3029 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_start_radar_detection() local
3030 struct ieee80211_local *local = sdata->local; in ieee80211_start_radar_detection()
3040 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_start_radar_detection()
3041 sdata->needed_rx_chains = local->rx_chains; in ieee80211_start_radar_detection()
3043 err = ieee80211_vif_use_channel(sdata, chandef, in ieee80211_start_radar_detection()
3048 ieee80211_queue_delayed_work(&sdata->local->hw, in ieee80211_start_radar_detection()
3049 &sdata->dfs_cac_timer_work, in ieee80211_start_radar_detection()
3060 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_end_cac() local
3061 struct ieee80211_local *local = sdata->local; in ieee80211_end_cac()
3064 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_end_cac()
3069 cancel_delayed_work(&sdata->dfs_cac_timer_work); in ieee80211_end_cac()
3071 if (sdata->wdev.cac_started) { in ieee80211_end_cac()
3072 ieee80211_vif_release_channel(sdata); in ieee80211_end_cac()
3073 sdata->wdev.cac_started = false; in ieee80211_end_cac()
3152 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_csa_finish() local
3154 ieee80211_queue_work(&sdata->local->hw, in ieee80211_csa_finish()
3155 &sdata->csa_finalize_work); in ieee80211_csa_finish()
3159 static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_set_after_csa_beacon() argument
3164 switch (sdata->vif.type) { in ieee80211_set_after_csa_beacon()
3166 err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon, in ieee80211_set_after_csa_beacon()
3168 kfree(sdata->u.ap.next_beacon); in ieee80211_set_after_csa_beacon()
3169 sdata->u.ap.next_beacon = NULL; in ieee80211_set_after_csa_beacon()
3176 err = ieee80211_ibss_finish_csa(sdata); in ieee80211_set_after_csa_beacon()
3183 err = ieee80211_mesh_finish_csa(sdata); in ieee80211_set_after_csa_beacon()
3197 static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata) in __ieee80211_csa_finalize() argument
3199 struct ieee80211_local *local = sdata->local; in __ieee80211_csa_finalize()
3203 sdata_assert_lock(sdata); in __ieee80211_csa_finalize()
3214 if (sdata->reserved_chanctx) { in __ieee80211_csa_finalize()
3220 if (sdata->reserved_ready) in __ieee80211_csa_finalize()
3223 return ieee80211_vif_use_reserved_context(sdata); in __ieee80211_csa_finalize()
3226 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in __ieee80211_csa_finalize()
3227 &sdata->csa_chandef)) in __ieee80211_csa_finalize()
3230 sdata->vif.csa_active = false; in __ieee80211_csa_finalize()
3232 err = ieee80211_set_after_csa_beacon(sdata, &changed); in __ieee80211_csa_finalize()
3236 ieee80211_bss_info_change_notify(sdata, changed); in __ieee80211_csa_finalize()
3238 if (sdata->csa_block_tx) { in __ieee80211_csa_finalize()
3239 ieee80211_wake_vif_queues(local, sdata, in __ieee80211_csa_finalize()
3241 sdata->csa_block_tx = false; in __ieee80211_csa_finalize()
3244 err = drv_post_channel_switch(sdata); in __ieee80211_csa_finalize()
3248 cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef); in __ieee80211_csa_finalize()
3253 static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata) in ieee80211_csa_finalize() argument
3255 if (__ieee80211_csa_finalize(sdata)) { in ieee80211_csa_finalize()
3256 sdata_info(sdata, "failed to finalize CSA, disconnecting\n"); in ieee80211_csa_finalize()
3257 cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev, in ieee80211_csa_finalize()
3264 struct ieee80211_sub_if_data *sdata = in ieee80211_csa_finalize_work() local
3267 struct ieee80211_local *local = sdata->local; in ieee80211_csa_finalize_work()
3269 sdata_lock(sdata); in ieee80211_csa_finalize_work()
3274 if (!sdata->vif.csa_active) in ieee80211_csa_finalize_work()
3277 if (!ieee80211_sdata_running(sdata)) in ieee80211_csa_finalize_work()
3280 ieee80211_csa_finalize(sdata); in ieee80211_csa_finalize_work()
3285 sdata_unlock(sdata); in ieee80211_csa_finalize_work()
3288 static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_set_csa_beacon() argument
3295 switch (sdata->vif.type) { in ieee80211_set_csa_beacon()
3297 sdata->u.ap.next_beacon = in ieee80211_set_csa_beacon()
3299 if (!sdata->u.ap.next_beacon) in ieee80211_set_csa_beacon()
3333 err = ieee80211_assign_beacon(sdata, &params->beacon_csa, &csa, NULL); in ieee80211_set_csa_beacon()
3335 kfree(sdata->u.ap.next_beacon); in ieee80211_set_csa_beacon()
3342 if (!sdata->vif.bss_conf.ibss_joined) in ieee80211_set_csa_beacon()
3345 if (params->chandef.width != sdata->u.ibss.chandef.width) in ieee80211_set_csa_beacon()
3351 cfg80211_get_chandef_type(&sdata->u.ibss.chandef)) in ieee80211_set_csa_beacon()
3364 if (sdata->u.ibss.chandef.chan->band != in ieee80211_set_csa_beacon()
3370 err = ieee80211_ibss_csa_beacon(sdata, params); in ieee80211_set_csa_beacon()
3376 ieee80211_send_action_csa(sdata, params); in ieee80211_set_csa_beacon()
3381 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_set_csa_beacon()
3383 if (params->chandef.width != sdata->vif.bss_conf.chandef.width) in ieee80211_set_csa_beacon()
3387 if (sdata->vif.bss_conf.chandef.chan->band != in ieee80211_set_csa_beacon()
3401 err = ieee80211_mesh_csa_beacon(sdata, params); in ieee80211_set_csa_beacon()
3410 ieee80211_send_action_csa(sdata, params); in ieee80211_set_csa_beacon()
3422 static void ieee80211_color_change_abort(struct ieee80211_sub_if_data *sdata) in ieee80211_color_change_abort() argument
3424 sdata->vif.color_change_active = false; in ieee80211_color_change_abort()
3425 kfree(sdata->u.ap.next_beacon); in ieee80211_color_change_abort()
3426 sdata->u.ap.next_beacon = NULL; in ieee80211_color_change_abort()
3428 cfg80211_color_change_aborted_notify(sdata->dev); in ieee80211_color_change_abort()
3435 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in __ieee80211_channel_switch() local
3436 struct ieee80211_local *local = sdata->local; in __ieee80211_channel_switch()
3443 sdata_assert_lock(sdata); in __ieee80211_channel_switch()
3449 if (sdata->wdev.cac_started) in __ieee80211_channel_switch()
3453 &sdata->vif.bss_conf.chandef)) in __ieee80211_channel_switch()
3457 if (sdata->vif.csa_active) in __ieee80211_channel_switch()
3461 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in __ieee80211_channel_switch()
3482 err = drv_pre_channel_switch(sdata, &ch_switch); in __ieee80211_channel_switch()
3486 err = ieee80211_vif_reserve_chanctx(sdata, &params->chandef, in __ieee80211_channel_switch()
3493 err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0); in __ieee80211_channel_switch()
3495 ieee80211_vif_unreserve_chanctx(sdata); in __ieee80211_channel_switch()
3500 if (sdata->vif.color_change_active) in __ieee80211_channel_switch()
3501 ieee80211_color_change_abort(sdata); in __ieee80211_channel_switch()
3503 err = ieee80211_set_csa_beacon(sdata, params, &changed); in __ieee80211_channel_switch()
3505 ieee80211_vif_unreserve_chanctx(sdata); in __ieee80211_channel_switch()
3509 sdata->csa_chandef = params->chandef; in __ieee80211_channel_switch()
3510 sdata->csa_block_tx = params->block_tx; in __ieee80211_channel_switch()
3511 sdata->vif.csa_active = true; in __ieee80211_channel_switch()
3513 if (sdata->csa_block_tx) in __ieee80211_channel_switch()
3514 ieee80211_stop_vif_queues(local, sdata, in __ieee80211_channel_switch()
3517 cfg80211_ch_switch_started_notify(sdata->dev, &sdata->csa_chandef, in __ieee80211_channel_switch()
3521 ieee80211_bss_info_change_notify(sdata, changed); in __ieee80211_channel_switch()
3522 drv_channel_switch_beacon(sdata, &params->chandef); in __ieee80211_channel_switch()
3525 ieee80211_csa_finalize(sdata); in __ieee80211_channel_switch()
3536 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_channel_switch() local
3537 struct ieee80211_local *local = sdata->local; in ieee80211_channel_switch()
3595 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_update_mgmt_frame_registrations() local
3607 intf_change = (sdata->vif.probe_req_reg != in ieee80211_update_mgmt_frame_registrations()
3609 (sdata->vif.rx_mcast_action_reg != in ieee80211_update_mgmt_frame_registrations()
3611 sdata->vif.probe_req_reg = upd->interface_stypes & preq_mask; in ieee80211_update_mgmt_frame_registrations()
3612 sdata->vif.rx_mcast_action_reg = in ieee80211_update_mgmt_frame_registrations()
3618 if (intf_change && ieee80211_sdata_running(sdata)) in ieee80211_update_mgmt_frame_registrations()
3619 drv_config_iface_filter(local, sdata, in ieee80211_update_mgmt_frame_registrations()
3620 sdata->vif.probe_req_reg ? in ieee80211_update_mgmt_frame_registrations()
3650 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_rekey_data() local
3655 drv_set_rekey_data(local, sdata, data); in ieee80211_set_rekey_data()
3663 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_probe_client() local
3664 struct ieee80211_local *local = sdata->local; in ieee80211_probe_client()
3680 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_probe_client()
3686 sta = sta_info_get_bss(sdata, peer); in ieee80211_probe_client()
3719 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_probe_client()
3720 memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN); in ieee80211_probe_client()
3741 ieee80211_xmit(sdata, sta, skb); in ieee80211_probe_client()
3756 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_cfg_get_channel() local
3762 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_cfg_get_channel()
3764 *chandef = sdata->vif.bss_conf.chandef; in ieee80211_cfg_get_channel()
3768 sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_cfg_get_channel()
3791 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_qos_map() local
3804 old_qos_map = sdata_dereference(sdata->qos_map, sdata); in ieee80211_set_qos_map()
3805 rcu_assign_pointer(sdata->qos_map, new_qos_map); in ieee80211_set_qos_map()
3816 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_ap_chanwidth() local
3820 ret = ieee80211_vif_change_bandwidth(sdata, chandef, &changed); in ieee80211_set_ap_chanwidth()
3822 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_set_ap_chanwidth()
3831 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_tx_ts() local
3832 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_add_tx_ts()
3835 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_add_tx_ts()
3838 if (!(sdata->wmm_acm & BIT(up))) in ieee80211_add_tx_ts()
3856 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_tx_ts() local
3857 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_del_tx_ts()
3879 ieee80211_flush_queues(local, sdata, false); in ieee80211_del_tx_ts()
3886 ieee80211_sta_handle_tspec_ac_params(sdata); in ieee80211_del_tx_ts()
3902 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_nan_func_terminated() local
3909 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_terminated()
3911 func = idr_find(&sdata->u.nan.function_inst_ids, inst_id); in ieee80211_nan_func_terminated()
3913 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_terminated()
3918 idr_remove(&sdata->u.nan.function_inst_ids, inst_id); in ieee80211_nan_func_terminated()
3920 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_terminated()
3933 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_nan_func_match() local
3939 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3941 func = idr_find(&sdata->u.nan.function_inst_ids, match->inst_id); in ieee80211_nan_func_match()
3943 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3948 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3958 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_to_unicast() local
3960 sdata->u.ap.multicast_to_unicast = enabled; in ieee80211_set_multicast_to_unicast()
4019 struct ieee80211_sub_if_data *sdata; in ieee80211_get_txq_stats() local
4029 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_get_txq_stats()
4030 if (!sdata->vif.txq) { in ieee80211_get_txq_stats()
4034 ieee80211_fill_txq_stats(txqstats, to_txq_info(sdata->vif.txq)); in ieee80211_get_txq_stats()
4064 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_ftm_responder_stats() local
4066 return drv_get_ftm_responder_stats(local, sdata, ftm_stats); in ieee80211_get_ftm_responder_stats()
4074 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev); in ieee80211_start_pmsr() local
4076 return drv_start_pmsr(local, sdata, request); in ieee80211_start_pmsr()
4084 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev); in ieee80211_abort_pmsr() local
4086 return drv_abort_pmsr(local, sdata, request); in ieee80211_abort_pmsr()
4093 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_tid_config() local
4097 if (!sdata->local->ops->set_tid_config) in ieee80211_set_tid_config()
4101 return drv_set_tid_config(sdata->local, sdata, NULL, tid_conf); in ieee80211_set_tid_config()
4103 mutex_lock(&sdata->local->sta_mtx); in ieee80211_set_tid_config()
4104 sta = sta_info_get_bss(sdata, tid_conf->peer); in ieee80211_set_tid_config()
4106 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_set_tid_config()
4110 ret = drv_set_tid_config(sdata->local, sdata, &sta->sta, tid_conf); in ieee80211_set_tid_config()
4111 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_set_tid_config()
4120 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_reset_tid_config() local
4124 if (!sdata->local->ops->reset_tid_config) in ieee80211_reset_tid_config()
4128 return drv_reset_tid_config(sdata->local, sdata, NULL, tids); in ieee80211_reset_tid_config()
4130 mutex_lock(&sdata->local->sta_mtx); in ieee80211_reset_tid_config()
4131 sta = sta_info_get_bss(sdata, peer); in ieee80211_reset_tid_config()
4133 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_reset_tid_config()
4137 ret = drv_reset_tid_config(sdata->local, sdata, &sta->sta, tids); in ieee80211_reset_tid_config()
4138 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_reset_tid_config()
4155 ieee80211_set_after_color_change_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_set_after_color_change_beacon() argument
4158 switch (sdata->vif.type) { in ieee80211_set_after_color_change_beacon()
4162 ret = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon, in ieee80211_set_after_color_change_beacon()
4164 kfree(sdata->u.ap.next_beacon); in ieee80211_set_after_color_change_beacon()
4165 sdata->u.ap.next_beacon = NULL; in ieee80211_set_after_color_change_beacon()
4182 ieee80211_set_color_change_beacon(struct ieee80211_sub_if_data *sdata, in ieee80211_set_color_change_beacon() argument
4189 switch (sdata->vif.type) { in ieee80211_set_color_change_beacon()
4191 sdata->u.ap.next_beacon = in ieee80211_set_color_change_beacon()
4193 if (!sdata->u.ap.next_beacon) in ieee80211_set_color_change_beacon()
4205 err = ieee80211_assign_beacon(sdata, &params->beacon_color_change, in ieee80211_set_color_change_beacon()
4208 kfree(sdata->u.ap.next_beacon); in ieee80211_set_color_change_beacon()
4221 ieee80211_color_change_bss_config_notify(struct ieee80211_sub_if_data *sdata, in ieee80211_color_change_bss_config_notify() argument
4224 sdata->vif.bss_conf.he_bss_color.color = color; in ieee80211_color_change_bss_config_notify()
4225 sdata->vif.bss_conf.he_bss_color.enabled = enable; in ieee80211_color_change_bss_config_notify()
4228 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_color_change_bss_config_notify()
4231 static int ieee80211_color_change_finalize(struct ieee80211_sub_if_data *sdata) in ieee80211_color_change_finalize() argument
4233 struct ieee80211_local *local = sdata->local; in ieee80211_color_change_finalize()
4237 sdata_assert_lock(sdata); in ieee80211_color_change_finalize()
4240 sdata->vif.color_change_active = false; in ieee80211_color_change_finalize()
4242 err = ieee80211_set_after_color_change_beacon(sdata, &changed); in ieee80211_color_change_finalize()
4244 cfg80211_color_change_aborted_notify(sdata->dev); in ieee80211_color_change_finalize()
4248 ieee80211_color_change_bss_config_notify(sdata, in ieee80211_color_change_finalize()
4249 sdata->vif.color_change_color, in ieee80211_color_change_finalize()
4251 cfg80211_color_change_notify(sdata->dev); in ieee80211_color_change_finalize()
4258 struct ieee80211_sub_if_data *sdata = in ieee80211_color_change_finalize_work() local
4261 struct ieee80211_local *local = sdata->local; in ieee80211_color_change_finalize_work()
4263 sdata_lock(sdata); in ieee80211_color_change_finalize_work()
4267 if (!sdata->vif.color_change_active) in ieee80211_color_change_finalize_work()
4270 if (!ieee80211_sdata_running(sdata)) in ieee80211_color_change_finalize_work()
4273 ieee80211_color_change_finalize(sdata); in ieee80211_color_change_finalize_work()
4277 sdata_unlock(sdata); in ieee80211_color_change_finalize_work()
4282 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_color_change_finish() local
4284 ieee80211_queue_work(&sdata->local->hw, in ieee80211_color_change_finish()
4285 &sdata->color_change_finalize_work); in ieee80211_color_change_finish()
4293 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieeee80211_obss_color_collision_notify() local
4295 if (sdata->vif.color_change_active || sdata->vif.csa_active) in ieeee80211_obss_color_collision_notify()
4298 cfg80211_obss_color_collision_notify(sdata->dev, color_bitmap); in ieeee80211_obss_color_collision_notify()
4306 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_color_change() local
4307 struct ieee80211_local *local = sdata->local; in ieee80211_color_change()
4311 sdata_assert_lock(sdata); in ieee80211_color_change()
4318 if (sdata->vif.color_change_active || sdata->vif.csa_active) { in ieee80211_color_change()
4323 err = ieee80211_set_color_change_beacon(sdata, params, &changed); in ieee80211_color_change()
4327 sdata->vif.color_change_active = true; in ieee80211_color_change()
4328 sdata->vif.color_change_color = params->color; in ieee80211_color_change()
4330 cfg80211_color_change_started_notify(sdata->dev, params->count); in ieee80211_color_change()
4333 ieee80211_color_change_bss_config_notify(sdata, 0, 0, changed); in ieee80211_color_change()
4336 ieee80211_color_change_finalize(sdata); in ieee80211_color_change()