Lines Matching +full:cs +full:- +full:dev +full:- +full:assoc
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2015 Intel Mobile Communications GmbH
7 * Copyright (C) 2015-2017 Intel Deutschland GmbH
8 * Copyright (C) 2018-2020 Intel Corporation
21 #include "driver-ops.h"
32 if (params->vht_mumimo_groups) { in ieee80211_set_mu_mimo_follow()
37 memcpy(sdata->vif.bss_conf.mu_group.membership, in ieee80211_set_mu_mimo_follow()
38 params->vht_mumimo_groups, WLAN_MEMBERSHIP_LEN); in ieee80211_set_mu_mimo_follow()
39 memcpy(sdata->vif.bss_conf.mu_group.position, in ieee80211_set_mu_mimo_follow()
40 params->vht_mumimo_groups + WLAN_MEMBERSHIP_LEN, in ieee80211_set_mu_mimo_follow()
43 /* don't care about endianness - just check for 0 */ in ieee80211_set_mu_mimo_follow()
44 memcpy(&membership, params->vht_mumimo_groups, in ieee80211_set_mu_mimo_follow()
49 if (params->vht_mumimo_follow_addr) { in ieee80211_set_mu_mimo_follow()
51 is_valid_ether_addr(params->vht_mumimo_follow_addr); in ieee80211_set_mu_mimo_follow()
52 ether_addr_copy(sdata->u.mntr.mu_follow_addr, in ieee80211_set_mu_mimo_follow()
53 params->vht_mumimo_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()
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()
79 return -EBUSY; in ieee80211_set_mon_options()
82 /* also validate MU-MIMO change */ in ieee80211_set_mon_options()
83 monitor_sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_mon_options()
86 (params->vht_mumimo_groups || params->vht_mumimo_follow_addr)) in ieee80211_set_mon_options()
87 return -EOPNOTSUPP; in ieee80211_set_mon_options()
89 /* apply all changes now - no failures allowed */ in ieee80211_set_mon_options()
94 if (params->flags) { 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()
107 sdata->u.mntr.flags = params->flags; in ieee80211_set_mon_options()
150 struct net_device *dev, in ieee80211_change_iface() argument
154 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_iface()
155 struct ieee80211_local *local = sdata->local; in ieee80211_change_iface()
163 if (type == NL80211_IFTYPE_AP_VLAN && params->use_4addr == 0) { in ieee80211_change_iface()
164 RCU_INIT_POINTER(sdata->u.vlan.sta, NULL); in ieee80211_change_iface()
166 } else if (type == NL80211_IFTYPE_STATION && params->use_4addr >= 0) { in ieee80211_change_iface()
167 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_change_iface()
169 if (params->use_4addr == ifmgd->use_4addr) in ieee80211_change_iface()
172 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_change_iface()
173 if (!ifmgd->associated) in ieee80211_change_iface()
176 mutex_lock(&local->sta_mtx); 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()
180 params->use_4addr); in ieee80211_change_iface()
181 mutex_unlock(&local->sta_mtx); in ieee80211_change_iface()
183 if (params->use_4addr) in ieee80211_change_iface()
187 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_change_iface()
202 mutex_lock(&sdata->local->chanctx_mtx); in ieee80211_start_p2p_device()
204 mutex_unlock(&sdata->local->chanctx_mtx); in ieee80211_start_p2p_device()
224 mutex_lock(&sdata->local->chanctx_mtx); 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()
238 sdata->u.nan.conf = *conf; in ieee80211_start_nan()
248 drv_stop_nan(sdata->local, sdata); in ieee80211_stop_nan()
261 if (sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_nan_change_conf()
262 return -EOPNOTSUPP; in ieee80211_nan_change_conf()
265 return -ENETDOWN; in ieee80211_nan_change_conf()
267 new_conf = sdata->u.nan.conf; in ieee80211_nan_change_conf()
270 new_conf.master_pref = conf->master_pref; in ieee80211_nan_change_conf()
273 new_conf.bands = conf->bands; 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()
289 if (sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_add_nan_func()
290 return -EOPNOTSUPP; in ieee80211_add_nan_func()
293 return -ENETDOWN; 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()
305 nan_func->instance_id = ret; in ieee80211_add_nan_func()
307 WARN_ON(nan_func->instance_id == 0); 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()
313 nan_func->instance_id); in ieee80211_add_nan_func()
314 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
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()
330 if (func->cookie == cookie) in ieee80211_find_nan_func_by_cookie()
344 if (sdata->vif.type != NL80211_IFTYPE_NAN || in ieee80211_del_nan_func()
348 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_del_nan_func()
352 instance_id = func->instance_id; 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()
361 struct net_device *dev, in ieee80211_set_noack_map() argument
364 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_noack_map()
366 sdata->noack_map = noack_map; in ieee80211_set_noack_map()
376 struct ieee80211_local *local = sdata->local; in ieee80211_set_tx()
379 int ret = -EINVAL; in ieee80211_set_tx()
381 if (!wiphy_ext_feature_isset(local->hw.wiphy, in ieee80211_set_tx()
383 return -EINVAL; in ieee80211_set_tx()
388 return -EINVAL; in ieee80211_set_tx()
390 if (sta->ptk_idx == key_idx) in ieee80211_set_tx()
393 mutex_lock(&local->key_mtx); in ieee80211_set_tx()
394 key = key_mtx_dereference(local, sta->ptk[key_idx]); in ieee80211_set_tx()
396 if (key && key->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX) in ieee80211_set_tx()
399 mutex_unlock(&local->key_mtx); in ieee80211_set_tx()
403 static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev, in ieee80211_add_key() argument
407 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_key()
408 struct ieee80211_local *local = sdata->local; in ieee80211_add_key()
410 const struct ieee80211_cipher_scheme *cs = NULL; in ieee80211_add_key() local
415 return -ENETDOWN; in ieee80211_add_key()
417 if (pairwise && params->mode == NL80211_KEY_SET_TX) in ieee80211_add_key()
421 switch (params->cipher) { in ieee80211_add_key()
426 return -EINVAL; in ieee80211_add_key()
438 cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type); in ieee80211_add_key()
442 key = ieee80211_key_alloc(params->cipher, key_idx, params->key_len, in ieee80211_add_key()
443 params->key, params->seq_len, params->seq, in ieee80211_add_key()
444 cs); in ieee80211_add_key()
449 key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE; in ieee80211_add_key()
451 if (params->mode == NL80211_KEY_NO_TX) in ieee80211_add_key()
452 key->conf.flags |= IEEE80211_KEY_FLAG_NO_AUTO_TX; in ieee80211_add_key()
454 mutex_lock(&local->sta_mtx); in ieee80211_add_key()
459 * The ASSOC test makes sure the driver is ready to in ieee80211_add_key()
470 err = -ENOENT; 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()
478 key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT; in ieee80211_add_key()
484 key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT; in ieee80211_add_key()
491 if (sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE) in ieee80211_add_key()
492 key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT; in ieee80211_add_key()
510 sta->cipher_scheme = cs; in ieee80211_add_key()
515 mutex_unlock(&local->sta_mtx); in ieee80211_add_key()
520 static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev, in ieee80211_del_key() argument
523 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_key()
524 struct ieee80211_local *local = sdata->local; in ieee80211_del_key()
529 mutex_lock(&local->sta_mtx); in ieee80211_del_key()
530 mutex_lock(&local->key_mtx); in ieee80211_del_key()
533 ret = -ENOENT; in ieee80211_del_key()
540 key = key_mtx_dereference(local, sta->ptk[key_idx]); in ieee80211_del_key()
542 key = key_mtx_dereference(local, sta->gtk[key_idx]); in ieee80211_del_key()
544 key = key_mtx_dereference(local, sdata->keys[key_idx]); in ieee80211_del_key()
547 ret = -ENOENT; in ieee80211_del_key()
551 ieee80211_key_free(key, sdata->vif.type == NL80211_IFTYPE_STATION); in ieee80211_del_key()
555 mutex_unlock(&local->key_mtx); in ieee80211_del_key()
556 mutex_unlock(&local->sta_mtx); in ieee80211_del_key()
561 static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev, in ieee80211_get_key() argument
575 int err = -ENOENT; in ieee80211_get_key()
578 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_key()
588 key = rcu_dereference(sta->ptk[key_idx]); in ieee80211_get_key()
592 key = rcu_dereference(sta->gtk[key_idx]); in ieee80211_get_key()
594 key = rcu_dereference(sdata->keys[key_idx]); in ieee80211_get_key()
601 params.cipher = key->conf.cipher; in ieee80211_get_key()
603 switch (key->conf.cipher) { in ieee80211_get_key()
605 pn64 = atomic64_read(&key->conf.tx_pn); in ieee80211_get_key()
609 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && in ieee80211_get_key()
610 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { in ieee80211_get_key()
611 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
642 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && in ieee80211_get_key()
643 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { in ieee80211_get_key()
644 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
647 pn64 = atomic64_read(&key->conf.tx_pn); in ieee80211_get_key()
659 if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) in ieee80211_get_key()
661 if (WARN_ON(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) in ieee80211_get_key()
663 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
669 params.key = key->conf.key; in ieee80211_get_key()
670 params.key_len = key->conf.keylen; in ieee80211_get_key()
681 struct net_device *dev, in ieee80211_config_default_key() argument
685 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_key()
693 struct net_device *dev, in ieee80211_config_default_mgmt_key() argument
696 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_mgmt_key()
704 struct net_device *dev, in ieee80211_config_default_beacon_key() argument
707 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_beacon_key()
718 rinfo->flags = 0; in sta_set_rate_info_tx()
719 if (rate->flags & IEEE80211_TX_RC_MCS) { in sta_set_rate_info_tx()
720 rinfo->flags |= RATE_INFO_FLAGS_MCS; in sta_set_rate_info_tx()
721 rinfo->mcs = rate->idx; in sta_set_rate_info_tx()
722 } else if (rate->flags & IEEE80211_TX_RC_VHT_MCS) { in sta_set_rate_info_tx()
723 rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS; in sta_set_rate_info_tx()
724 rinfo->mcs = ieee80211_rate_get_vht_mcs(rate); in sta_set_rate_info_tx()
725 rinfo->nss = ieee80211_rate_get_vht_nss(rate); in sta_set_rate_info_tx()
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()
732 WARN_ON_ONCE(sband && !sband->bitrates); in sta_set_rate_info_tx()
733 if (sband && sband->bitrates) { in sta_set_rate_info_tx()
734 brate = sband->bitrates[rate->idx].bitrate; in sta_set_rate_info_tx()
735 rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift); in sta_set_rate_info_tx()
738 if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) in sta_set_rate_info_tx()
739 rinfo->bw = RATE_INFO_BW_40; in sta_set_rate_info_tx()
740 else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH) in sta_set_rate_info_tx()
741 rinfo->bw = RATE_INFO_BW_80; in sta_set_rate_info_tx()
742 else if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH) in sta_set_rate_info_tx()
743 rinfo->bw = RATE_INFO_BW_160; in sta_set_rate_info_tx()
745 rinfo->bw = RATE_INFO_BW_20; in sta_set_rate_info_tx()
746 if (rate->flags & IEEE80211_TX_RC_SHORT_GI) in sta_set_rate_info_tx()
747 rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; in sta_set_rate_info_tx()
750 static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev, in ieee80211_dump_station() argument
753 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_station()
754 struct ieee80211_local *local = sdata->local; in ieee80211_dump_station()
756 int ret = -ENOENT; in ieee80211_dump_station()
758 mutex_lock(&local->sta_mtx); in ieee80211_dump_station()
763 memcpy(mac, sta->sta.addr, ETH_ALEN); in ieee80211_dump_station()
767 mutex_unlock(&local->sta_mtx); in ieee80211_dump_station()
772 static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev, in ieee80211_dump_survey() argument
775 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); in ieee80211_dump_survey()
780 static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev, in ieee80211_get_station() argument
783 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_station()
784 struct ieee80211_local *local = sdata->local; in ieee80211_get_station()
786 int ret = -ENOENT; in ieee80211_get_station()
788 mutex_lock(&local->sta_mtx); in ieee80211_get_station()
796 mutex_unlock(&local->sta_mtx); in ieee80211_get_station()
808 if (cfg80211_chandef_identical(&local->monitor_chandef, chandef)) in ieee80211_set_monitor_channel()
811 mutex_lock(&local->mtx); in ieee80211_set_monitor_channel()
812 if (local->use_chanctx) { in ieee80211_set_monitor_channel()
813 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_monitor_channel()
819 } else if (local->open_count == local->monitors) { in ieee80211_set_monitor_channel()
820 local->_oper_chandef = *chandef; in ieee80211_set_monitor_channel()
825 local->monitor_chandef = *chandef; in ieee80211_set_monitor_channel()
826 mutex_unlock(&local->mtx); in ieee80211_set_monitor_channel()
842 old = sdata_dereference(sdata->u.ap.probe_resp, sdata); in ieee80211_set_probe_resp()
846 return -ENOMEM; in ieee80211_set_probe_resp()
848 new->len = resp_len; in ieee80211_set_probe_resp()
849 memcpy(new->data, resp, resp_len); in ieee80211_set_probe_resp()
852 memcpy(new->cntdwn_counter_offsets, csa->counter_offsets_presp, in ieee80211_set_probe_resp()
853 csa->n_counter_offsets_presp * in ieee80211_set_probe_resp()
854 sizeof(new->cntdwn_counter_offsets[0])); in ieee80211_set_probe_resp()
856 new->cntdwn_counter_offsets[0] = cca->counter_offset_presp; in ieee80211_set_probe_resp()
858 rcu_assign_pointer(sdata->u.ap.probe_resp, new); in ieee80211_set_probe_resp()
871 if (!params->tmpl || !params->tmpl_len) in ieee80211_set_fils_discovery()
872 return -EINVAL; in ieee80211_set_fils_discovery()
874 fd = &sdata->vif.bss_conf.fils_discovery; in ieee80211_set_fils_discovery()
875 fd->min_interval = params->min_interval; in ieee80211_set_fils_discovery()
876 fd->max_interval = params->max_interval; in ieee80211_set_fils_discovery()
878 old = sdata_dereference(sdata->u.ap.fils_discovery, sdata); in ieee80211_set_fils_discovery()
879 new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL); in ieee80211_set_fils_discovery()
881 return -ENOMEM; in ieee80211_set_fils_discovery()
882 new->len = params->tmpl_len; in ieee80211_set_fils_discovery()
883 memcpy(new->data, params->tmpl, params->tmpl_len); in ieee80211_set_fils_discovery()
884 rcu_assign_pointer(sdata->u.ap.fils_discovery, new); in ieee80211_set_fils_discovery()
898 if (!params->tmpl || !params->tmpl_len) in ieee80211_set_unsol_bcast_probe_resp()
899 return -EINVAL; in ieee80211_set_unsol_bcast_probe_resp()
901 old = sdata_dereference(sdata->u.ap.unsol_bcast_probe_resp, sdata); in ieee80211_set_unsol_bcast_probe_resp()
902 new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL); in ieee80211_set_unsol_bcast_probe_resp()
904 return -ENOMEM; in ieee80211_set_unsol_bcast_probe_resp()
905 new->len = params->tmpl_len; in ieee80211_set_unsol_bcast_probe_resp()
906 memcpy(new->data, params->tmpl, params->tmpl_len); 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()
913 params->interval; in ieee80211_set_unsol_bcast_probe_resp()
931 bss_conf = &sdata->vif.bss_conf; in ieee80211_set_ftm_responder_params()
932 old = bss_conf->ftmr_params; in ieee80211_set_ftm_responder_params()
937 return -ENOMEM; in ieee80211_set_ftm_responder_params()
941 new->lci_len = lci_len; in ieee80211_set_ftm_responder_params()
942 new->lci = pos; in ieee80211_set_ftm_responder_params()
948 new->civicloc_len = civicloc_len; in ieee80211_set_ftm_responder_params()
949 new->civicloc = pos; in ieee80211_set_ftm_responder_params()
954 bss_conf->ftmr_params = new; in ieee80211_set_ftm_responder_params()
970 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_assign_beacon()
974 if (!params->head && !old) in ieee80211_assign_beacon()
975 return -EINVAL; in ieee80211_assign_beacon()
978 if (params->head) in ieee80211_assign_beacon()
979 new_head_len = params->head_len; in ieee80211_assign_beacon()
981 new_head_len = old->head_len; in ieee80211_assign_beacon()
984 if (params->tail || !old) in ieee80211_assign_beacon()
985 /* params->tail_len will be zero for !params->tail */ in ieee80211_assign_beacon()
986 new_tail_len = params->tail_len; in ieee80211_assign_beacon()
988 new_tail_len = old->tail_len; in ieee80211_assign_beacon()
994 return -ENOMEM; in ieee80211_assign_beacon()
1002 new->head = ((u8 *) new) + sizeof(*new); in ieee80211_assign_beacon()
1003 new->tail = new->head + new_head_len; in ieee80211_assign_beacon()
1004 new->head_len = new_head_len; in ieee80211_assign_beacon()
1005 new->tail_len = new_tail_len; in ieee80211_assign_beacon()
1008 new->cntdwn_current_counter = csa->count; in ieee80211_assign_beacon()
1009 memcpy(new->cntdwn_counter_offsets, csa->counter_offsets_beacon, in ieee80211_assign_beacon()
1010 csa->n_counter_offsets_beacon * in ieee80211_assign_beacon()
1011 sizeof(new->cntdwn_counter_offsets[0])); in ieee80211_assign_beacon()
1013 new->cntdwn_current_counter = cca->count; in ieee80211_assign_beacon()
1014 new->cntdwn_counter_offsets[0] = cca->counter_offset_beacon; in ieee80211_assign_beacon()
1018 if (params->head) in ieee80211_assign_beacon()
1019 memcpy(new->head, params->head, new_head_len); in ieee80211_assign_beacon()
1021 memcpy(new->head, old->head, new_head_len); in ieee80211_assign_beacon()
1024 if (params->tail) in ieee80211_assign_beacon()
1025 memcpy(new->tail, params->tail, new_tail_len); in ieee80211_assign_beacon()
1028 memcpy(new->tail, old->tail, new_tail_len); in ieee80211_assign_beacon()
1030 err = ieee80211_set_probe_resp(sdata, params->probe_resp, in ieee80211_assign_beacon()
1031 params->probe_resp_len, csa, cca); in ieee80211_assign_beacon()
1039 if (params->ftm_responder != -1) { in ieee80211_assign_beacon()
1040 sdata->vif.bss_conf.ftm_responder = params->ftm_responder; in ieee80211_assign_beacon()
1042 params->lci, in ieee80211_assign_beacon()
1043 params->lci_len, in ieee80211_assign_beacon()
1044 params->civicloc, in ieee80211_assign_beacon()
1045 params->civicloc_len); in ieee80211_assign_beacon()
1055 rcu_assign_pointer(sdata->u.ap.beacon, new); in ieee80211_assign_beacon()
1063 static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, in ieee80211_start_ap() argument
1066 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_start_ap()
1067 struct ieee80211_local *local = sdata->local; in ieee80211_start_ap()
1080 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_start_ap()
1082 return -EALREADY; in ieee80211_start_ap()
1084 if (params->smps_mode != NL80211_SMPS_OFF) in ieee80211_start_ap()
1085 return -ENOTSUPP; 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()
1094 if (params->he_cap && params->he_oper) { 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()
1097 le32_get_bits(params->he_oper->he_oper_params, in ieee80211_start_ap()
1099 sdata->vif.bss_conf.frame_time_rts_th = in ieee80211_start_ap()
1100 le32_get_bits(params->he_oper->he_oper_params, in ieee80211_start_ap()
1104 if (params->he_bss_color.enabled) in ieee80211_start_ap()
1108 mutex_lock(&local->mtx); in ieee80211_start_ap()
1109 err = ieee80211_vif_use_channel(sdata, ¶ms->chandef, in ieee80211_start_ap()
1113 mutex_unlock(&local->mtx); 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()
1126 params->crypto.control_port_over_nl80211; in ieee80211_start_ap()
1127 sdata->control_port_no_preauth = in ieee80211_start_ap()
1128 params->crypto.control_port_no_preauth; in ieee80211_start_ap()
1129 sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local, in ieee80211_start_ap()
1130 ¶ms->crypto, 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()
1134 vlan->control_port_protocol = in ieee80211_start_ap()
1135 params->crypto.control_port_ethertype; in ieee80211_start_ap()
1136 vlan->control_port_no_encrypt = in ieee80211_start_ap()
1137 params->crypto.control_port_no_encrypt; in ieee80211_start_ap()
1138 vlan->control_port_over_nl80211 = in ieee80211_start_ap()
1139 params->crypto.control_port_over_nl80211; in ieee80211_start_ap()
1140 vlan->control_port_no_preauth = in ieee80211_start_ap()
1141 params->crypto.control_port_no_preauth; in ieee80211_start_ap()
1142 vlan->encrypt_headroom = in ieee80211_start_ap()
1143 ieee80211_cs_headroom(sdata->local, in ieee80211_start_ap()
1144 ¶ms->crypto, in ieee80211_start_ap()
1145 vlan->vif.type); 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()
1158 if (params->ssid_len) in ieee80211_start_ap()
1159 memcpy(sdata->vif.bss_conf.ssid, params->ssid, in ieee80211_start_ap()
1160 params->ssid_len); in ieee80211_start_ap()
1161 sdata->vif.bss_conf.hidden_ssid = in ieee80211_start_ap()
1162 (params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE); 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()
1167 params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK; in ieee80211_start_ap()
1168 if (params->p2p_opp_ps) 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()
1173 if (wiphy_ext_feature_isset(local->hw.wiphy, in ieee80211_start_ap()
1176 sdata->beacon_rateidx_mask[i] = in ieee80211_start_ap()
1177 params->beacon_rate.control[i].legacy; 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()
1183 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) 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, ¶ms->beacon, NULL, NULL); in ieee80211_start_ap()
1191 if (params->fils_discovery.max_interval) { in ieee80211_start_ap()
1193 ¶ms->fils_discovery); in ieee80211_start_ap()
1199 if (params->unsol_bcast_probe_resp.interval) { in ieee80211_start_ap()
1201 ¶ms->unsol_bcast_probe_resp); 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()
1220 netif_carrier_on(dev); in ieee80211_start_ap()
1221 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) in ieee80211_start_ap()
1222 netif_carrier_on(vlan->dev); in ieee80211_start_ap()
1231 static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev, in ieee80211_change_beacon() argument
1238 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_beacon()
1241 /* don't allow changing the beacon while a countdown is in place - offset in ieee80211_change_beacon()
1244 if (sdata->vif.csa_active || sdata->vif.color_change_active) in ieee80211_change_beacon()
1245 return -EBUSY; in ieee80211_change_beacon()
1247 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_change_beacon()
1249 return -ENOENT; in ieee80211_change_beacon()
1258 static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) in ieee80211_stop_ap() argument
1260 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop_ap()
1262 struct ieee80211_local *local = sdata->local; in ieee80211_stop_ap()
1271 old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_stop_ap()
1273 return -ENOENT; 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()
1278 sdata_dereference(sdata->u.ap.unsol_bcast_probe_resp, in ieee80211_stop_ap()
1282 mutex_lock(&local->mtx); in ieee80211_stop_ap()
1283 sdata->vif.csa_active = false; in ieee80211_stop_ap()
1284 if (sdata->csa_block_tx) { in ieee80211_stop_ap()
1287 sdata->csa_block_tx = false; in ieee80211_stop_ap()
1290 mutex_unlock(&local->mtx); 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()
1297 netif_carrier_off(vlan->dev); in ieee80211_stop_ap()
1298 netif_carrier_off(dev); 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()
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()
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()
1339 mutex_lock(&local->mtx); in ieee80211_stop_ap()
1342 mutex_unlock(&local->mtx); in ieee80211_stop_ap()
1412 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_apply_mesh_params()
1415 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) { in sta_apply_mesh_params()
1416 switch (params->plink_state) { in sta_apply_mesh_params()
1418 if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) in sta_apply_mesh_params()
1420 sta->mesh->plink_state = params->plink_state; in sta_apply_mesh_params()
1421 sta->mesh->aid = params->peer_aid; in sta_apply_mesh_params()
1425 sdata->u.mesh.mshcfg.power_mode); in sta_apply_mesh_params()
1427 ewma_mesh_tx_rate_avg_init(&sta->mesh->tx_rate_avg); in sta_apply_mesh_params()
1429 ewma_mesh_tx_rate_avg_add(&sta->mesh->tx_rate_avg, 10); in sta_apply_mesh_params()
1438 if (sta->mesh->plink_state == NL80211_PLINK_ESTAB) in sta_apply_mesh_params()
1440 sta->mesh->plink_state = params->plink_state; in sta_apply_mesh_params()
1452 switch (params->plink_action) { in sta_apply_mesh_params()
1464 if (params->local_pm) in sta_apply_mesh_params()
1466 params->local_pm); in sta_apply_mesh_params()
1479 struct airtime_sched_info *air_sched = &local->airtime[ac]; in sta_apply_airtime_params()
1480 struct airtime_info *air_info = &sta->airtime[ac]; in sta_apply_airtime_params()
1484 spin_lock_bh(&air_sched->lock); in sta_apply_airtime_params()
1486 if (air_info->weight == params->airtime_weight || in sta_apply_airtime_params()
1487 !sta->sta.txq[tid] || in sta_apply_airtime_params()
1491 airtime_weight_set(air_info, params->airtime_weight); in sta_apply_airtime_params()
1493 txqi = to_txq_info(sta->sta.txq[tid]); in sta_apply_airtime_params()
1494 if (RB_EMPTY_NODE(&txqi->schedule_order)) in sta_apply_airtime_params()
1500 spin_unlock_bh(&air_sched->lock); in sta_apply_airtime_params()
1510 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_apply_parameters()
1515 return -EINVAL; in sta_apply_parameters()
1517 mask = params->sta_flags_mask; in sta_apply_parameters()
1518 set = params->sta_flags_set; in sta_apply_parameters()
1520 if (ieee80211_vif_is_mesh(&sdata->vif)) { in sta_apply_parameters()
1531 * TDLS -- everything follows authorized, but in sta_apply_parameters()
1544 local->hw.queues >= IEEE80211_NUM_ACS) in sta_apply_parameters()
1545 sta->sta.wme = set & BIT(NL80211_STA_FLAG_WME); in sta_apply_parameters()
1565 sta->sta.mfp = !!(set & BIT(NL80211_STA_FLAG_MFP)); in sta_apply_parameters()
1581 !sdata->u.mgd.tdls_chan_switch_prohibited && in sta_apply_parameters()
1582 params->ext_capab_len >= 4 && in sta_apply_parameters()
1583 params->ext_capab[3] & WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH) in sta_apply_parameters()
1587 !sdata->u.mgd.tdls_wider_bw_prohibited && in sta_apply_parameters()
1588 ieee80211_hw_check(&local->hw, TDLS_WIDER_BW) && in sta_apply_parameters()
1589 params->ext_capab_len >= 8 && in sta_apply_parameters()
1590 params->ext_capab[7] & WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED) in sta_apply_parameters()
1593 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) { in sta_apply_parameters()
1594 sta->sta.uapsd_queues = params->uapsd_queues; in sta_apply_parameters()
1595 sta->sta.max_sp = params->max_sp; in sta_apply_parameters()
1599 if (params->ext_capab_len >= 8) { in sta_apply_parameters()
1600 u8 val = (params->ext_capab[7] & in sta_apply_parameters()
1604 if (params->ext_capab_len >= 9) { in sta_apply_parameters()
1605 u8 val_msb = params->ext_capab[8] & in sta_apply_parameters()
1613 sta->sta.max_amsdu_subframes = 32; in sta_apply_parameters()
1616 sta->sta.max_amsdu_subframes = 16; in sta_apply_parameters()
1619 sta->sta.max_amsdu_subframes = 8; in sta_apply_parameters()
1622 sta->sta.max_amsdu_subframes = 0; in sta_apply_parameters()
1627 * cfg80211 validates this (1-2007) and allows setting the AID in sta_apply_parameters()
1630 if (params->aid) in sta_apply_parameters()
1631 sta->sta.aid = params->aid; in sta_apply_parameters()
1641 if (params->listen_interval >= 0) in sta_apply_parameters()
1642 sta->listen_interval = params->listen_interval; in sta_apply_parameters()
1644 if (params->sta_modify_mask & STATION_PARAM_APPLY_STA_TXPOWER) { in sta_apply_parameters()
1645 sta->sta.txpwr.type = params->txpwr.type; in sta_apply_parameters()
1646 if (params->txpwr.type == NL80211_TX_POWER_LIMITED) in sta_apply_parameters()
1647 sta->sta.txpwr.power = params->txpwr.power; in sta_apply_parameters()
1653 if (params->supported_rates && params->supported_rates_len) { in sta_apply_parameters()
1654 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef, in sta_apply_parameters()
1655 sband, params->supported_rates, in sta_apply_parameters()
1656 params->supported_rates_len, in sta_apply_parameters()
1657 &sta->sta.supp_rates[sband->band]); in sta_apply_parameters()
1660 if (params->ht_capa) in sta_apply_parameters()
1662 params->ht_capa, sta); in sta_apply_parameters()
1664 /* VHT can override some HT caps such as the A-MSDU max length */ in sta_apply_parameters()
1665 if (params->vht_capa) in sta_apply_parameters()
1667 params->vht_capa, sta); in sta_apply_parameters()
1669 if (params->he_capa) in sta_apply_parameters()
1671 (void *)params->he_capa, in sta_apply_parameters()
1672 params->he_capa_len, in sta_apply_parameters()
1673 (void *)params->he_6ghz_capa, in sta_apply_parameters()
1676 if (params->opmode_notif_used) { in sta_apply_parameters()
1680 __ieee80211_vht_handle_opmode(sdata, sta, params->opmode_notif, in sta_apply_parameters()
1681 sband->band); in sta_apply_parameters()
1684 if (params->support_p2p_ps >= 0) in sta_apply_parameters()
1685 sta->sta.support_p2p_ps = params->support_p2p_ps; in sta_apply_parameters()
1687 if (ieee80211_vif_is_mesh(&sdata->vif)) in sta_apply_parameters()
1690 if (params->airtime_weight) in sta_apply_parameters()
1705 static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev, in ieee80211_add_station() argument
1714 if (params->vlan) { in ieee80211_add_station()
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()
1719 return -EINVAL; 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()
1724 return -EINVAL; in ieee80211_add_station()
1727 return -EINVAL; in ieee80211_add_station()
1729 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER) && in ieee80211_add_station()
1730 sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_add_station()
1731 !sdata->u.mgd.associated) in ieee80211_add_station()
1732 return -EINVAL; in ieee80211_add_station()
1736 return -ENOMEM; in ieee80211_add_station()
1738 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in ieee80211_add_station()
1739 sta->sta.tdls = true; in ieee80211_add_station()
1759 static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev, in ieee80211_del_station() argument
1764 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_station()
1766 if (params->mac) in ieee80211_del_station()
1767 return sta_info_destroy_addr_bss(sdata, params->mac); in ieee80211_del_station()
1774 struct net_device *dev, const u8 *mac, in ieee80211_change_station() argument
1777 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_station()
1784 mutex_lock(&local->sta_mtx); in ieee80211_change_station()
1788 err = -ENOENT; in ieee80211_change_station()
1792 switch (sdata->vif.type) { in ieee80211_change_station()
1794 if (sdata->u.mesh.user_mpm) in ieee80211_change_station()
1820 err = -EOPNOTSUPP; in ieee80211_change_station()
1828 if (params->vlan && params->vlan != sta->sdata->dev) { in ieee80211_change_station()
1829 vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); in ieee80211_change_station()
1831 if (params->vlan->ieee80211_ptr->use_4addr) { in ieee80211_change_station()
1832 if (vlansdata->u.vlan.sta) { in ieee80211_change_station()
1833 err = -EBUSY; in ieee80211_change_station()
1837 rcu_assign_pointer(vlansdata->u.vlan.sta, sta); 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()
1857 sta->sta.addr); in ieee80211_change_station()
1865 mutex_unlock(&local->sta_mtx); in ieee80211_change_station()
1867 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_change_station()
1868 params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) { in ieee80211_change_station()
1875 mutex_unlock(&local->sta_mtx); in ieee80211_change_station()
1880 static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_add_mpath() argument
1887 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_mpath()
1893 return -ENOENT; in ieee80211_add_mpath()
1908 static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_del_mpath() argument
1911 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_mpath()
1920 static int ieee80211_change_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_change_mpath() argument
1927 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mpath()
1934 return -ENOENT; in ieee80211_change_mpath()
1940 return -ENOENT; in ieee80211_change_mpath()
1952 struct sta_info *next_hop_sta = rcu_dereference(mpath->next_hop); in mpath_set_pinfo()
1955 memcpy(next_hop, next_hop_sta->sta.addr, ETH_ALEN); in mpath_set_pinfo()
1961 pinfo->generation = mpath->sdata->u.mesh.mesh_paths_generation; in mpath_set_pinfo()
1963 pinfo->filled = MPATH_INFO_FRAME_QLEN | in mpath_set_pinfo()
1973 pinfo->frame_qlen = mpath->frame_queue.qlen; in mpath_set_pinfo()
1974 pinfo->sn = mpath->sn; in mpath_set_pinfo()
1975 pinfo->metric = mpath->metric; in mpath_set_pinfo()
1976 if (time_before(jiffies, mpath->exp_time)) in mpath_set_pinfo()
1977 pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies); in mpath_set_pinfo()
1978 pinfo->discovery_timeout = in mpath_set_pinfo()
1979 jiffies_to_msecs(mpath->discovery_timeout); in mpath_set_pinfo()
1980 pinfo->discovery_retries = mpath->discovery_retries; in mpath_set_pinfo()
1981 if (mpath->flags & MESH_PATH_ACTIVE) in mpath_set_pinfo()
1982 pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE; in mpath_set_pinfo()
1983 if (mpath->flags & MESH_PATH_RESOLVING) in mpath_set_pinfo()
1984 pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING; in mpath_set_pinfo()
1985 if (mpath->flags & MESH_PATH_SN_VALID) in mpath_set_pinfo()
1986 pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID; in mpath_set_pinfo()
1987 if (mpath->flags & MESH_PATH_FIXED) in mpath_set_pinfo()
1988 pinfo->flags |= NL80211_MPATH_FLAG_FIXED; in mpath_set_pinfo()
1989 if (mpath->flags & MESH_PATH_RESOLVED) in mpath_set_pinfo()
1990 pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED; in mpath_set_pinfo()
1991 pinfo->hop_count = mpath->hop_count; in mpath_set_pinfo()
1992 pinfo->path_change_count = mpath->path_change_count; in mpath_set_pinfo()
1995 static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_get_mpath() argument
2002 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mpath()
2008 return -ENOENT; in ieee80211_get_mpath()
2010 memcpy(dst, mpath->dst, ETH_ALEN); in ieee80211_get_mpath()
2016 static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_dump_mpath() argument
2023 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_mpath()
2029 return -ENOENT; in ieee80211_dump_mpath()
2031 memcpy(dst, mpath->dst, ETH_ALEN); in ieee80211_dump_mpath()
2041 memcpy(mpp, mpath->mpp, ETH_ALEN); in mpp_set_pinfo()
2043 pinfo->generation = mpath->sdata->u.mesh.mpp_paths_generation; in mpp_set_pinfo()
2046 static int ieee80211_get_mpp(struct wiphy *wiphy, struct net_device *dev, in ieee80211_get_mpp() argument
2053 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mpp()
2059 return -ENOENT; in ieee80211_get_mpp()
2061 memcpy(dst, mpath->dst, ETH_ALEN); in ieee80211_get_mpp()
2067 static int ieee80211_dump_mpp(struct wiphy *wiphy, struct net_device *dev, in ieee80211_dump_mpp() argument
2074 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_mpp()
2080 return -ENOENT; in ieee80211_dump_mpp()
2082 memcpy(dst, mpath->dst, ETH_ALEN); in ieee80211_dump_mpp()
2089 struct net_device *dev, in ieee80211_get_mesh_config() argument
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()
2101 return (mask >> (parm-1)) & 0x1; in _chg_mesh_attr()
2115 old_ie = ifmsh->ie; in copy_mesh_setup()
2117 if (setup->ie_len) { in copy_mesh_setup()
2118 new_ie = kmemdup(setup->ie, setup->ie_len, in copy_mesh_setup()
2121 return -ENOMEM; in copy_mesh_setup()
2123 ifmsh->ie_len = setup->ie_len; in copy_mesh_setup()
2124 ifmsh->ie = new_ie; in copy_mesh_setup()
2128 ifmsh->mesh_id_len = setup->mesh_id_len; in copy_mesh_setup()
2129 memcpy(ifmsh->mesh_id, setup->mesh_id, ifmsh->mesh_id_len); in copy_mesh_setup()
2130 ifmsh->mesh_sp_id = setup->sync_method; in copy_mesh_setup()
2131 ifmsh->mesh_pp_id = setup->path_sel_proto; in copy_mesh_setup()
2132 ifmsh->mesh_pm_id = setup->path_metric; in copy_mesh_setup()
2133 ifmsh->user_mpm = setup->user_mpm; in copy_mesh_setup()
2134 ifmsh->mesh_auth_id = setup->auth_id; in copy_mesh_setup()
2135 ifmsh->security = IEEE80211_MESH_SEC_NONE; in copy_mesh_setup()
2136 ifmsh->userspace_handles_dfs = setup->userspace_handles_dfs; in copy_mesh_setup()
2137 if (setup->is_authenticated) in copy_mesh_setup()
2138 ifmsh->security |= IEEE80211_MESH_SEC_AUTHED; in copy_mesh_setup()
2139 if (setup->is_secure) in copy_mesh_setup()
2140 ifmsh->security |= IEEE80211_MESH_SEC_SECURED; in copy_mesh_setup()
2143 memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate, in copy_mesh_setup()
2144 sizeof(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()
2155 setup->beacon_rate.control[i].legacy; 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()
2165 struct net_device *dev, u32 mask, in ieee80211_update_mesh_config() argument
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()
2178 conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout; in ieee80211_update_mesh_config()
2180 conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout; in ieee80211_update_mesh_config()
2182 conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout; in ieee80211_update_mesh_config()
2184 conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks; in ieee80211_update_mesh_config()
2186 conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries; in ieee80211_update_mesh_config()
2188 conf->dot11MeshTTL = nconf->dot11MeshTTL; in ieee80211_update_mesh_config()
2190 conf->element_ttl = nconf->element_ttl; in ieee80211_update_mesh_config()
2192 if (ifmsh->user_mpm) in ieee80211_update_mesh_config()
2193 return -EBUSY; in ieee80211_update_mesh_config()
2194 conf->auto_open_plinks = nconf->auto_open_plinks; in ieee80211_update_mesh_config()
2197 conf->dot11MeshNbrOffsetMaxNeighbor = in ieee80211_update_mesh_config()
2198 nconf->dot11MeshNbrOffsetMaxNeighbor; in ieee80211_update_mesh_config()
2200 conf->dot11MeshHWMPmaxPREQretries = in ieee80211_update_mesh_config()
2201 nconf->dot11MeshHWMPmaxPREQretries; in ieee80211_update_mesh_config()
2203 conf->path_refresh_time = nconf->path_refresh_time; in ieee80211_update_mesh_config()
2205 conf->min_discovery_timeout = nconf->min_discovery_timeout; in ieee80211_update_mesh_config()
2207 conf->dot11MeshHWMPactivePathTimeout = in ieee80211_update_mesh_config()
2208 nconf->dot11MeshHWMPactivePathTimeout; in ieee80211_update_mesh_config()
2210 conf->dot11MeshHWMPpreqMinInterval = in ieee80211_update_mesh_config()
2211 nconf->dot11MeshHWMPpreqMinInterval; in ieee80211_update_mesh_config()
2213 conf->dot11MeshHWMPperrMinInterval = in ieee80211_update_mesh_config()
2214 nconf->dot11MeshHWMPperrMinInterval; in ieee80211_update_mesh_config()
2217 conf->dot11MeshHWMPnetDiameterTraversalTime = in ieee80211_update_mesh_config()
2218 nconf->dot11MeshHWMPnetDiameterTraversalTime; in ieee80211_update_mesh_config()
2220 conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode; in ieee80211_update_mesh_config()
2227 if (nconf->dot11MeshGateAnnouncementProtocol && in ieee80211_update_mesh_config()
2228 !(conf->dot11MeshHWMPRootMode > IEEE80211_ROOTMODE_ROOT)) { in ieee80211_update_mesh_config()
2229 conf->dot11MeshHWMPRootMode = IEEE80211_PROACTIVE_RANN; in ieee80211_update_mesh_config()
2232 conf->dot11MeshGateAnnouncementProtocol = in ieee80211_update_mesh_config()
2233 nconf->dot11MeshGateAnnouncementProtocol; in ieee80211_update_mesh_config()
2236 conf->dot11MeshHWMPRannInterval = in ieee80211_update_mesh_config()
2237 nconf->dot11MeshHWMPRannInterval; in ieee80211_update_mesh_config()
2239 conf->dot11MeshForwarding = nconf->dot11MeshForwarding; in ieee80211_update_mesh_config()
2244 if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM)) in ieee80211_update_mesh_config()
2245 return -ENOTSUPP; in ieee80211_update_mesh_config()
2246 conf->rssi_threshold = nconf->rssi_threshold; in ieee80211_update_mesh_config()
2249 conf->ht_opmode = nconf->ht_opmode; in ieee80211_update_mesh_config()
2250 sdata->vif.bss_conf.ht_operation_mode = nconf->ht_opmode; in ieee80211_update_mesh_config()
2254 conf->dot11MeshHWMPactivePathToRootTimeout = in ieee80211_update_mesh_config()
2255 nconf->dot11MeshHWMPactivePathToRootTimeout; in ieee80211_update_mesh_config()
2257 conf->dot11MeshHWMProotInterval = in ieee80211_update_mesh_config()
2258 nconf->dot11MeshHWMProotInterval; in ieee80211_update_mesh_config()
2260 conf->dot11MeshHWMPconfirmationInterval = in ieee80211_update_mesh_config()
2261 nconf->dot11MeshHWMPconfirmationInterval; in ieee80211_update_mesh_config()
2263 conf->power_mode = nconf->power_mode; in ieee80211_update_mesh_config()
2267 conf->dot11MeshAwakeWindowDuration = in ieee80211_update_mesh_config()
2268 nconf->dot11MeshAwakeWindowDuration; in ieee80211_update_mesh_config()
2270 conf->plink_timeout = nconf->plink_timeout; in ieee80211_update_mesh_config()
2272 conf->dot11MeshConnectedToMeshGate = in ieee80211_update_mesh_config()
2273 nconf->dot11MeshConnectedToMeshGate; in ieee80211_update_mesh_config()
2275 conf->dot11MeshNolearn = nconf->dot11MeshNolearn; in ieee80211_update_mesh_config()
2277 conf->dot11MeshConnectedToAuthServer = in ieee80211_update_mesh_config()
2278 nconf->dot11MeshConnectedToAuthServer; in ieee80211_update_mesh_config()
2283 static int ieee80211_join_mesh(struct wiphy *wiphy, struct net_device *dev, in ieee80211_join_mesh() argument
2287 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_join_mesh()
2288 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_join_mesh()
2291 memcpy(&ifmsh->mshcfg, conf, sizeof(struct mesh_config)); 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()
2312 static int ieee80211_leave_mesh(struct wiphy *wiphy, struct net_device *dev) in ieee80211_leave_mesh() argument
2314 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_leave_mesh()
2317 mutex_lock(&sdata->local->mtx); in ieee80211_leave_mesh()
2319 kfree(sdata->u.mesh.ie); in ieee80211_leave_mesh()
2320 mutex_unlock(&sdata->local->mtx); in ieee80211_leave_mesh()
2327 struct net_device *dev, in ieee80211_change_bss() argument
2330 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_bss()
2334 if (!sdata_dereference(sdata->u.ap.beacon, sdata)) in ieee80211_change_bss()
2335 return -ENOENT; in ieee80211_change_bss()
2339 return -EINVAL; in ieee80211_change_bss()
2341 if (params->use_cts_prot >= 0) { in ieee80211_change_bss()
2342 sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot; in ieee80211_change_bss()
2345 if (params->use_short_preamble >= 0) { in ieee80211_change_bss()
2346 sdata->vif.bss_conf.use_short_preamble = in ieee80211_change_bss()
2347 params->use_short_preamble; in ieee80211_change_bss()
2351 if (!sdata->vif.bss_conf.use_short_slot && in ieee80211_change_bss()
2352 (sband->band == NL80211_BAND_5GHZ || in ieee80211_change_bss()
2353 sband->band == NL80211_BAND_6GHZ)) { in ieee80211_change_bss()
2354 sdata->vif.bss_conf.use_short_slot = true; in ieee80211_change_bss()
2358 if (params->use_short_slot_time >= 0) { in ieee80211_change_bss()
2359 sdata->vif.bss_conf.use_short_slot = in ieee80211_change_bss()
2360 params->use_short_slot_time; in ieee80211_change_bss()
2364 if (params->basic_rates) { in ieee80211_change_bss()
2365 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef, in ieee80211_change_bss()
2366 wiphy->bands[sband->band], in ieee80211_change_bss()
2367 params->basic_rates, in ieee80211_change_bss()
2368 params->basic_rates_len, in ieee80211_change_bss()
2369 &sdata->vif.bss_conf.basic_rates); in ieee80211_change_bss()
2374 if (params->ap_isolate >= 0) { in ieee80211_change_bss()
2375 if (params->ap_isolate) 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()
2382 if (params->ht_opmode >= 0) { in ieee80211_change_bss()
2383 sdata->vif.bss_conf.ht_operation_mode = in ieee80211_change_bss()
2384 (u16) params->ht_opmode; in ieee80211_change_bss()
2388 if (params->p2p_ctwindow >= 0) { 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()
2392 params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK; in ieee80211_change_bss()
2396 if (params->p2p_opp_ps > 0) { in ieee80211_change_bss()
2397 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_change_bss()
2400 } else if (params->p2p_opp_ps == 0) { in ieee80211_change_bss()
2401 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &= in ieee80211_change_bss()
2412 struct net_device *dev, in ieee80211_set_txq_params() argument
2416 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_txq_params()
2419 if (!local->ops->conf_tx) in ieee80211_set_txq_params()
2420 return -EOPNOTSUPP; in ieee80211_set_txq_params()
2422 if (local->hw.queues < IEEE80211_NUM_ACS) in ieee80211_set_txq_params()
2423 return -EOPNOTSUPP; in ieee80211_set_txq_params()
2426 p.aifs = params->aifs; in ieee80211_set_txq_params()
2427 p.cw_max = params->cwmax; in ieee80211_set_txq_params()
2428 p.cw_min = params->cwmin; in ieee80211_set_txq_params()
2429 p.txop = params->txop; in ieee80211_set_txq_params()
2432 * Setting tx queue params disables u-apsd because it's only in ieee80211_set_txq_params()
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()
2441 wiphy_debug(local->hw.wiphy, in ieee80211_set_txq_params()
2443 params->ac); in ieee80211_set_txq_params()
2444 return -EINVAL; in ieee80211_set_txq_params()
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()
2500 (!(wiphy->features & NL80211_FEATURE_AP_SCAN) || in ieee80211_scan()
2501 !(req->flags & NL80211_SCAN_FLAG_AP))) in ieee80211_scan()
2502 return -EOPNOTSUPP; in ieee80211_scan()
2506 return -EOPNOTSUPP; in ieee80211_scan()
2519 struct net_device *dev, in ieee80211_sched_scan_start() argument
2522 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_sched_scan_start()
2524 if (!sdata->local->ops->sched_scan_start) in ieee80211_sched_scan_start()
2525 return -EOPNOTSUPP; in ieee80211_sched_scan_start()
2531 ieee80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev, in ieee80211_sched_scan_stop() argument
2536 if (!local->ops->sched_scan_stop) in ieee80211_sched_scan_stop()
2537 return -EOPNOTSUPP; in ieee80211_sched_scan_stop()
2542 static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev, in ieee80211_auth() argument
2545 return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req); in ieee80211_auth()
2548 static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev, in ieee80211_assoc() argument
2551 return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req); in ieee80211_assoc()
2554 static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev, in ieee80211_deauth() argument
2557 return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev), req); in ieee80211_deauth()
2560 static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev, in ieee80211_disassoc() argument
2563 return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev), req); in ieee80211_disassoc()
2566 static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, in ieee80211_join_ibss() argument
2569 return ieee80211_ibss_join(IEEE80211_DEV_TO_SUB_IF(dev), params); in ieee80211_join_ibss()
2572 static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev) in ieee80211_leave_ibss() argument
2574 return ieee80211_ibss_leave(IEEE80211_DEV_TO_SUB_IF(dev)); in ieee80211_leave_ibss()
2577 static int ieee80211_join_ocb(struct wiphy *wiphy, struct net_device *dev, in ieee80211_join_ocb() argument
2580 return ieee80211_ocb_join(IEEE80211_DEV_TO_SUB_IF(dev), setup); in ieee80211_join_ocb()
2583 static int ieee80211_leave_ocb(struct wiphy *wiphy, struct net_device *dev) in ieee80211_leave_ocb() argument
2585 return ieee80211_ocb_leave(IEEE80211_DEV_TO_SUB_IF(dev)); in ieee80211_leave_ocb()
2588 static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev, in ieee80211_set_mcast_rate() argument
2591 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_mcast_rate()
2593 memcpy(sdata->vif.bss_conf.mcast_rate, rate, in ieee80211_set_mcast_rate()
2609 err = drv_set_frag_threshold(local, wiphy->frag_threshold); in ieee80211_set_wiphy_params()
2622 wiphy->coverage_class : -1; in ieee80211_set_wiphy_params()
2630 err = drv_set_rts_threshold(local, wiphy->rts_threshold); in ieee80211_set_wiphy_params()
2637 if (wiphy->retry_short > IEEE80211_MAX_TX_RETRY) in ieee80211_set_wiphy_params()
2638 return -EINVAL; in ieee80211_set_wiphy_params()
2639 local->hw.conf.short_frame_max_tx_count = wiphy->retry_short; in ieee80211_set_wiphy_params()
2642 if (wiphy->retry_long > IEEE80211_MAX_TX_RETRY) in ieee80211_set_wiphy_params()
2643 return -EINVAL; in ieee80211_set_wiphy_params()
2644 local->hw.conf.long_frame_max_tx_count = wiphy->retry_long; in ieee80211_set_wiphy_params()
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()
2674 return -EOPNOTSUPP; in ieee80211_set_tx_power()
2679 sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_tx_power()
2685 return -EOPNOTSUPP; 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()
2702 local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_tx_power()
2708 return -EOPNOTSUPP; in ieee80211_set_tx_power()
2709 local->user_power_level = MBM_TO_DBM(mbm); in ieee80211_set_tx_power()
2713 mutex_lock(&local->iflist_mtx); 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()
2729 mutex_unlock(&local->iflist_mtx); in ieee80211_set_tx_power()
2732 sdata = rtnl_dereference(local->monitor_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()
2753 if (local->ops->get_txpower) in ieee80211_get_tx_power()
2756 if (!local->use_chanctx) in ieee80211_get_tx_power()
2757 *dbm = local->hw.conf.power_level; in ieee80211_get_tx_power()
2759 *dbm = sdata->vif.bss_conf.txpower; in ieee80211_get_tx_power()
2779 if (!local->ops->testmode_cmd) in ieee80211_testmode_cmd()
2780 return -EOPNOTSUPP; in ieee80211_testmode_cmd()
2786 if (sdata->flags & IEEE80211_SDATA_IN_DRIVER) in ieee80211_testmode_cmd()
2787 vif = &sdata->vif; in ieee80211_testmode_cmd()
2790 return local->ops->testmode_cmd(&local->hw, vif, data, len); in ieee80211_testmode_cmd()
2800 if (!local->ops->testmode_dump) in ieee80211_testmode_dump()
2801 return -EOPNOTSUPP; in ieee80211_testmode_dump()
2803 return local->ops->testmode_dump(&local->hw, skb, cb, data, len); in ieee80211_testmode_dump()
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()
2819 return -EINVAL; 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()
2861 sdata->u.mgd.req_smps = old_req; in __ieee80211_request_smps_mgd()
2868 static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, in ieee80211_set_power_mgmt() argument
2871 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_power_mgmt()
2872 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); in ieee80211_set_power_mgmt()
2874 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_set_power_mgmt()
2875 return -EOPNOTSUPP; in ieee80211_set_power_mgmt()
2877 if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS)) in ieee80211_set_power_mgmt()
2878 return -EOPNOTSUPP; in ieee80211_set_power_mgmt()
2880 if (enabled == sdata->u.mgd.powersave && in ieee80211_set_power_mgmt()
2881 timeout == local->dynamic_ps_forced_timeout) in ieee80211_set_power_mgmt()
2884 sdata->u.mgd.powersave = enabled; in ieee80211_set_power_mgmt()
2885 local->dynamic_ps_forced_timeout = timeout; in ieee80211_set_power_mgmt()
2889 __ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps); in ieee80211_set_power_mgmt()
2892 if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) in ieee80211_set_power_mgmt()
2903 struct net_device *dev, in ieee80211_set_cqm_rssi_config() argument
2906 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_cqm_rssi_config()
2907 struct ieee80211_vif *vif = &sdata->vif; in ieee80211_set_cqm_rssi_config()
2908 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; in ieee80211_set_cqm_rssi_config()
2910 if (rssi_thold == bss_conf->cqm_rssi_thold && in ieee80211_set_cqm_rssi_config()
2911 rssi_hyst == bss_conf->cqm_rssi_hyst) 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()
2916 return -EOPNOTSUPP; in ieee80211_set_cqm_rssi_config()
2918 bss_conf->cqm_rssi_thold = rssi_thold; in ieee80211_set_cqm_rssi_config()
2919 bss_conf->cqm_rssi_hyst = rssi_hyst; in ieee80211_set_cqm_rssi_config()
2920 bss_conf->cqm_rssi_low = 0; in ieee80211_set_cqm_rssi_config()
2921 bss_conf->cqm_rssi_high = 0; 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()
2933 struct net_device *dev, in ieee80211_set_cqm_rssi_range_config() argument
2936 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_cqm_rssi_range_config()
2937 struct ieee80211_vif *vif = &sdata->vif; in ieee80211_set_cqm_rssi_range_config()
2938 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; in ieee80211_set_cqm_rssi_range_config()
2940 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_set_cqm_rssi_range_config()
2941 return -EOPNOTSUPP; in ieee80211_set_cqm_rssi_range_config()
2943 bss_conf->cqm_rssi_low = rssi_low; in ieee80211_set_cqm_rssi_range_config()
2944 bss_conf->cqm_rssi_high = rssi_high; in ieee80211_set_cqm_rssi_range_config()
2945 bss_conf->cqm_rssi_thold = 0; in ieee80211_set_cqm_rssi_range_config()
2946 bss_conf->cqm_rssi_hyst = 0; 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()
2958 struct net_device *dev, in ieee80211_set_bitrate_mask() argument
2962 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_bitrate_mask()
2963 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); in ieee80211_set_bitrate_mask()
2967 return -ENETDOWN; 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()
2980 if (!(mask->control[band].legacy & basic_rates)) in ieee80211_set_bitrate_mask()
2981 return -EINVAL; in ieee80211_set_bitrate_mask()
2984 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { in ieee80211_set_bitrate_mask()
2991 struct ieee80211_supported_band *sband = wiphy->bands[i]; 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()
2996 sizeof(mask->control[i].ht_mcs)); in ieee80211_set_bitrate_mask()
2997 memcpy(sdata->rc_rateidx_vht_mcs_mask[i], in ieee80211_set_bitrate_mask()
2998 mask->control[i].vht_mcs, in ieee80211_set_bitrate_mask()
2999 sizeof(mask->control[i].vht_mcs)); 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()
3025 struct net_device *dev, in ieee80211_start_radar_detection() argument
3029 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_start_radar_detection()
3030 struct ieee80211_local *local = sdata->local; in ieee80211_start_radar_detection()
3033 mutex_lock(&local->mtx); in ieee80211_start_radar_detection()
3034 if (!list_empty(&local->roc_list) || local->scanning) { in ieee80211_start_radar_detection()
3035 err = -EBUSY; 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()
3048 ieee80211_queue_delayed_work(&sdata->local->hw, in ieee80211_start_radar_detection()
3049 &sdata->dfs_cac_timer_work, in ieee80211_start_radar_detection()
3053 mutex_unlock(&local->mtx); in ieee80211_start_radar_detection()
3058 struct net_device *dev) in ieee80211_end_cac() argument
3060 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_end_cac()
3061 struct ieee80211_local *local = sdata->local; in ieee80211_end_cac()
3063 mutex_lock(&local->mtx); in ieee80211_end_cac()
3064 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_end_cac()
3065 /* it might be waiting for the local->mtx, but then in ieee80211_end_cac()
3066 * by the time it gets it, sdata->wdev.cac_started 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()
3073 sdata->wdev.cac_started = false; in ieee80211_end_cac()
3076 mutex_unlock(&local->mtx); in ieee80211_end_cac()
3086 len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len + in cfg80211_beacon_dup()
3087 beacon->proberesp_ies_len + beacon->assocresp_ies_len + in cfg80211_beacon_dup()
3088 beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len; in cfg80211_beacon_dup()
3095 if (beacon->head_len) { in cfg80211_beacon_dup()
3096 new_beacon->head_len = beacon->head_len; in cfg80211_beacon_dup()
3097 new_beacon->head = pos; in cfg80211_beacon_dup()
3098 memcpy(pos, beacon->head, beacon->head_len); in cfg80211_beacon_dup()
3099 pos += beacon->head_len; in cfg80211_beacon_dup()
3101 if (beacon->tail_len) { in cfg80211_beacon_dup()
3102 new_beacon->tail_len = beacon->tail_len; in cfg80211_beacon_dup()
3103 new_beacon->tail = pos; in cfg80211_beacon_dup()
3104 memcpy(pos, beacon->tail, beacon->tail_len); in cfg80211_beacon_dup()
3105 pos += beacon->tail_len; in cfg80211_beacon_dup()
3107 if (beacon->beacon_ies_len) { in cfg80211_beacon_dup()
3108 new_beacon->beacon_ies_len = beacon->beacon_ies_len; in cfg80211_beacon_dup()
3109 new_beacon->beacon_ies = pos; in cfg80211_beacon_dup()
3110 memcpy(pos, beacon->beacon_ies, beacon->beacon_ies_len); in cfg80211_beacon_dup()
3111 pos += beacon->beacon_ies_len; in cfg80211_beacon_dup()
3113 if (beacon->proberesp_ies_len) { in cfg80211_beacon_dup()
3114 new_beacon->proberesp_ies_len = beacon->proberesp_ies_len; in cfg80211_beacon_dup()
3115 new_beacon->proberesp_ies = pos; in cfg80211_beacon_dup()
3116 memcpy(pos, beacon->proberesp_ies, beacon->proberesp_ies_len); in cfg80211_beacon_dup()
3117 pos += beacon->proberesp_ies_len; in cfg80211_beacon_dup()
3119 if (beacon->assocresp_ies_len) { in cfg80211_beacon_dup()
3120 new_beacon->assocresp_ies_len = beacon->assocresp_ies_len; in cfg80211_beacon_dup()
3121 new_beacon->assocresp_ies = pos; in cfg80211_beacon_dup()
3122 memcpy(pos, beacon->assocresp_ies, beacon->assocresp_ies_len); in cfg80211_beacon_dup()
3123 pos += beacon->assocresp_ies_len; in cfg80211_beacon_dup()
3125 if (beacon->probe_resp_len) { in cfg80211_beacon_dup()
3126 new_beacon->probe_resp_len = beacon->probe_resp_len; in cfg80211_beacon_dup()
3127 new_beacon->probe_resp = pos; in cfg80211_beacon_dup()
3128 memcpy(pos, beacon->probe_resp, beacon->probe_resp_len); in cfg80211_beacon_dup()
3129 pos += beacon->probe_resp_len; in cfg80211_beacon_dup()
3132 /* might copy -1, meaning no changes requested */ in cfg80211_beacon_dup()
3133 new_beacon->ftm_responder = beacon->ftm_responder; in cfg80211_beacon_dup()
3134 if (beacon->lci) { in cfg80211_beacon_dup()
3135 new_beacon->lci_len = beacon->lci_len; in cfg80211_beacon_dup()
3136 new_beacon->lci = pos; in cfg80211_beacon_dup()
3137 memcpy(pos, beacon->lci, beacon->lci_len); in cfg80211_beacon_dup()
3138 pos += beacon->lci_len; in cfg80211_beacon_dup()
3140 if (beacon->civicloc) { in cfg80211_beacon_dup()
3141 new_beacon->civicloc_len = beacon->civicloc_len; in cfg80211_beacon_dup()
3142 new_beacon->civicloc = pos; in cfg80211_beacon_dup()
3143 memcpy(pos, beacon->civicloc, beacon->civicloc_len); in cfg80211_beacon_dup()
3144 pos += beacon->civicloc_len; in cfg80211_beacon_dup()
3154 ieee80211_queue_work(&sdata->local->hw, in ieee80211_csa_finish()
3155 &sdata->csa_finalize_work); in ieee80211_csa_finish()
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()
3191 return -EINVAL; in ieee80211_set_after_csa_beacon()
3199 struct ieee80211_local *local = sdata->local; in __ieee80211_csa_finalize()
3204 lockdep_assert_held(&local->mtx); in __ieee80211_csa_finalize()
3205 lockdep_assert_held(&local->chanctx_mtx); in __ieee80211_csa_finalize()
3209 * with multi-vif. once reservation is complete it will re-schedule the in __ieee80211_csa_finalize()
3214 if (sdata->reserved_chanctx) { in __ieee80211_csa_finalize()
3216 * with multi-vif csa driver may call ieee80211_csa_finish() in __ieee80211_csa_finalize()
3220 if (sdata->reserved_ready) 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()
3228 return -EINVAL; in __ieee80211_csa_finalize()
3230 sdata->vif.csa_active = false; in __ieee80211_csa_finalize()
3238 if (sdata->csa_block_tx) { in __ieee80211_csa_finalize()
3241 sdata->csa_block_tx = false; in __ieee80211_csa_finalize()
3248 cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef); in __ieee80211_csa_finalize()
3257 cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev, in ieee80211_csa_finalize()
3267 struct ieee80211_local *local = sdata->local; in ieee80211_csa_finalize_work()
3270 mutex_lock(&local->mtx); in ieee80211_csa_finalize_work()
3271 mutex_lock(&local->chanctx_mtx); in ieee80211_csa_finalize_work()
3274 if (!sdata->vif.csa_active) in ieee80211_csa_finalize_work()
3283 mutex_unlock(&local->chanctx_mtx); in ieee80211_csa_finalize_work()
3284 mutex_unlock(&local->mtx); in ieee80211_csa_finalize_work()
3295 switch (sdata->vif.type) { in ieee80211_set_csa_beacon()
3297 sdata->u.ap.next_beacon = in ieee80211_set_csa_beacon()
3298 cfg80211_beacon_dup(¶ms->beacon_after); in ieee80211_set_csa_beacon()
3299 if (!sdata->u.ap.next_beacon) in ieee80211_set_csa_beacon()
3300 return -ENOMEM; in ieee80211_set_csa_beacon()
3318 if (params->count <= 1) in ieee80211_set_csa_beacon()
3321 if ((params->n_counter_offsets_beacon > in ieee80211_set_csa_beacon()
3323 (params->n_counter_offsets_presp > in ieee80211_set_csa_beacon()
3325 return -EINVAL; in ieee80211_set_csa_beacon()
3327 csa.counter_offsets_beacon = params->counter_offsets_beacon; in ieee80211_set_csa_beacon()
3328 csa.counter_offsets_presp = params->counter_offsets_presp; in ieee80211_set_csa_beacon()
3329 csa.n_counter_offsets_beacon = params->n_counter_offsets_beacon; in ieee80211_set_csa_beacon()
3330 csa.n_counter_offsets_presp = params->n_counter_offsets_presp; in ieee80211_set_csa_beacon()
3331 csa.count = params->count; in ieee80211_set_csa_beacon()
3333 err = ieee80211_assign_beacon(sdata, ¶ms->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()
3343 return -EINVAL; in ieee80211_set_csa_beacon()
3345 if (params->chandef.width != sdata->u.ibss.chandef.width) in ieee80211_set_csa_beacon()
3346 return -EINVAL; in ieee80211_set_csa_beacon()
3348 switch (params->chandef.width) { in ieee80211_set_csa_beacon()
3350 if (cfg80211_get_chandef_type(¶ms->chandef) != in ieee80211_set_csa_beacon()
3351 cfg80211_get_chandef_type(&sdata->u.ibss.chandef)) in ieee80211_set_csa_beacon()
3352 return -EINVAL; in ieee80211_set_csa_beacon()
3360 return -EINVAL; in ieee80211_set_csa_beacon()
3364 if (sdata->u.ibss.chandef.chan->band != in ieee80211_set_csa_beacon()
3365 params->chandef.chan->band) in ieee80211_set_csa_beacon()
3366 return -EINVAL; in ieee80211_set_csa_beacon()
3369 if (params->count > 1) { 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()
3384 return -EINVAL; in ieee80211_set_csa_beacon()
3387 if (sdata->vif.bss_conf.chandef.chan->band != in ieee80211_set_csa_beacon()
3388 params->chandef.chan->band) in ieee80211_set_csa_beacon()
3389 return -EINVAL; in ieee80211_set_csa_beacon()
3391 if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_NONE) { in ieee80211_set_csa_beacon()
3392 ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_INIT; in ieee80211_set_csa_beacon()
3393 if (!ifmsh->pre_value) in ieee80211_set_csa_beacon()
3394 ifmsh->pre_value = 1; in ieee80211_set_csa_beacon()
3396 ifmsh->pre_value++; in ieee80211_set_csa_beacon()
3400 if (params->count > 1) { in ieee80211_set_csa_beacon()
3403 ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE; in ieee80211_set_csa_beacon()
3409 if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_INIT) in ieee80211_set_csa_beacon()
3416 return -EOPNOTSUPP; in ieee80211_set_csa_beacon()
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()
3432 __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev, in __ieee80211_channel_switch() argument
3435 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in __ieee80211_channel_switch()
3436 struct ieee80211_local *local = sdata->local; in __ieee80211_channel_switch()
3444 lockdep_assert_held(&local->mtx); in __ieee80211_channel_switch()
3446 if (!list_empty(&local->roc_list) || local->scanning) in __ieee80211_channel_switch()
3447 return -EBUSY; in __ieee80211_channel_switch()
3449 if (sdata->wdev.cac_started) in __ieee80211_channel_switch()
3450 return -EBUSY; in __ieee80211_channel_switch()
3452 if (cfg80211_chandef_identical(¶ms->chandef, in __ieee80211_channel_switch()
3453 &sdata->vif.bss_conf.chandef)) in __ieee80211_channel_switch()
3454 return -EINVAL; in __ieee80211_channel_switch()
3457 if (sdata->vif.csa_active) in __ieee80211_channel_switch()
3458 return -EBUSY; in __ieee80211_channel_switch()
3460 mutex_lock(&local->chanctx_mtx); in __ieee80211_channel_switch()
3461 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in __ieee80211_channel_switch()
3462 lockdep_is_held(&local->chanctx_mtx)); in __ieee80211_channel_switch()
3464 err = -EBUSY; in __ieee80211_channel_switch()
3468 if (params->chandef.chan->freq_offset) { in __ieee80211_channel_switch()
3470 err = -EOPNOTSUPP; in __ieee80211_channel_switch()
3478 ch_switch.block_tx = params->block_tx; in __ieee80211_channel_switch()
3479 ch_switch.chandef = params->chandef; in __ieee80211_channel_switch()
3480 ch_switch.count = params->count; in __ieee80211_channel_switch()
3486 err = ieee80211_vif_reserve_chanctx(sdata, ¶ms->chandef, in __ieee80211_channel_switch()
3487 chanctx->mode, in __ieee80211_channel_switch()
3488 params->radar_required); in __ieee80211_channel_switch()
3493 err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0); in __ieee80211_channel_switch()
3500 if (sdata->vif.color_change_active) 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()
3517 cfg80211_ch_switch_started_notify(sdata->dev, &sdata->csa_chandef, in __ieee80211_channel_switch()
3518 params->count, params->block_tx); in __ieee80211_channel_switch()
3522 drv_channel_switch_beacon(sdata, ¶ms->chandef); in __ieee80211_channel_switch()
3529 mutex_unlock(&local->chanctx_mtx); in __ieee80211_channel_switch()
3533 int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev, in ieee80211_channel_switch() argument
3536 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_channel_switch()
3537 struct ieee80211_local *local = sdata->local; in ieee80211_channel_switch()
3540 mutex_lock(&local->mtx); in ieee80211_channel_switch()
3541 err = __ieee80211_channel_switch(wiphy, dev, params); in ieee80211_channel_switch()
3542 mutex_unlock(&local->mtx); in ieee80211_channel_switch()
3549 lockdep_assert_held(&local->mtx); in ieee80211_mgmt_tx_cookie()
3551 local->roc_cookie_counter++; in ieee80211_mgmt_tx_cookie()
3554 if (WARN_ON(local->roc_cookie_counter == 0)) in ieee80211_mgmt_tx_cookie()
3555 local->roc_cookie_counter++; in ieee80211_mgmt_tx_cookie()
3557 return local->roc_cookie_counter; in ieee80211_mgmt_tx_cookie()
3569 return -ENOMEM; in ieee80211_attach_ack_skb()
3571 spin_lock_irqsave(&local->ack_status_lock, spin_flags); in ieee80211_attach_ack_skb()
3572 id = idr_alloc(&local->ack_status_frames, ack_skb, in ieee80211_attach_ack_skb()
3574 spin_unlock_irqrestore(&local->ack_status_lock, spin_flags); in ieee80211_attach_ack_skb()
3578 return -ENOMEM; in ieee80211_attach_ack_skb()
3581 IEEE80211_SKB_CB(skb)->ack_frame_id = id; in ieee80211_attach_ack_skb()
3584 IEEE80211_SKB_CB(ack_skb)->ack.cookie = *cookie; in ieee80211_attach_ack_skb()
3601 (local->probe_req_reg != !!(upd->global_stypes & preq_mask)) || in ieee80211_update_mgmt_frame_registrations()
3602 (local->rx_mcast_action_reg != in ieee80211_update_mgmt_frame_registrations()
3603 !!(upd->global_mcast_stypes & action_mask)); in ieee80211_update_mgmt_frame_registrations()
3604 local->probe_req_reg = upd->global_stypes & preq_mask; in ieee80211_update_mgmt_frame_registrations()
3605 local->rx_mcast_action_reg = upd->global_mcast_stypes & action_mask; in ieee80211_update_mgmt_frame_registrations()
3607 intf_change = (sdata->vif.probe_req_reg != in ieee80211_update_mgmt_frame_registrations()
3608 !!(upd->interface_stypes & preq_mask)) || in ieee80211_update_mgmt_frame_registrations()
3609 (sdata->vif.rx_mcast_action_reg != in ieee80211_update_mgmt_frame_registrations()
3610 !!(upd->interface_mcast_stypes & action_mask)); 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()
3613 upd->interface_mcast_stypes & action_mask; in ieee80211_update_mgmt_frame_registrations()
3615 if (!local->open_count) in ieee80211_update_mgmt_frame_registrations()
3620 sdata->vif.probe_req_reg ? in ieee80211_update_mgmt_frame_registrations()
3632 if (local->started) in ieee80211_set_antenna()
3633 return -EOPNOTSUPP; in ieee80211_set_antenna()
3646 struct net_device *dev, in ieee80211_set_rekey_data() argument
3650 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_rekey_data()
3652 if (!local->ops->set_rekey_data) in ieee80211_set_rekey_data()
3653 return -EOPNOTSUPP; in ieee80211_set_rekey_data()
3660 static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev, in ieee80211_probe_client() argument
3663 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_probe_client()
3664 struct ieee80211_local *local = sdata->local; in ieee80211_probe_client()
3677 mutex_lock(&local->mtx); in ieee80211_probe_client()
3680 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_probe_client()
3682 ret = -EINVAL; in ieee80211_probe_client()
3685 band = chanctx_conf->def.chan->band; in ieee80211_probe_client()
3688 qos = sta->sta.wme; in ieee80211_probe_client()
3690 ret = -ENOLINK; in ieee80211_probe_client()
3699 size -= 2; in ieee80211_probe_client()
3705 skb = dev_alloc_skb(local->hw.extra_tx_headroom + size); in ieee80211_probe_client()
3707 ret = -ENOMEM; in ieee80211_probe_client()
3711 skb->dev = dev; in ieee80211_probe_client()
3713 skb_reserve(skb, local->hw.extra_tx_headroom); in ieee80211_probe_client()
3716 nullfunc->frame_control = fc; in ieee80211_probe_client()
3717 nullfunc->duration_id = 0; in ieee80211_probe_client()
3718 memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN); 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()
3721 nullfunc->seq_ctrl = 0; in ieee80211_probe_client()
3725 info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS | in ieee80211_probe_client()
3727 info->band = band; in ieee80211_probe_client()
3730 skb->priority = 7; in ieee80211_probe_client()
3732 nullfunc->qos_ctrl = cpu_to_le16(7); in ieee80211_probe_client()
3747 mutex_unlock(&local->mtx); in ieee80211_probe_client()
3759 int ret = -ENODATA; in ieee80211_cfg_get_channel()
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()
3766 } else if (local->open_count > 0 && in ieee80211_cfg_get_channel()
3767 local->open_count == local->monitors && in ieee80211_cfg_get_channel()
3768 sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_cfg_get_channel()
3769 if (local->use_chanctx) in ieee80211_cfg_get_channel()
3770 *chandef = local->monitor_chandef; in ieee80211_cfg_get_channel()
3772 *chandef = local->_oper_chandef; in ieee80211_cfg_get_channel()
3788 struct net_device *dev, in ieee80211_set_qos_map() argument
3791 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_qos_map()
3797 return -ENOMEM; in ieee80211_set_qos_map()
3798 memcpy(&new_qos_map->qos_map, qos_map, sizeof(*qos_map)); in ieee80211_set_qos_map()
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()
3813 struct net_device *dev, in ieee80211_set_ap_chanwidth() argument
3816 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_ap_chanwidth()
3827 static int ieee80211_add_tx_ts(struct wiphy *wiphy, struct net_device *dev, in ieee80211_add_tx_ts() argument
3831 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_tx_ts()
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()
3836 return -EOPNOTSUPP; in ieee80211_add_tx_ts()
3838 if (!(sdata->wmm_acm & BIT(up))) in ieee80211_add_tx_ts()
3839 return -EINVAL; in ieee80211_add_tx_ts()
3841 if (ifmgd->tx_tspec[ac].admitted_time) in ieee80211_add_tx_ts()
3842 return -EBUSY; in ieee80211_add_tx_ts()
3845 ifmgd->tx_tspec[ac].admitted_time = 32 * admitted_time; in ieee80211_add_tx_ts()
3846 ifmgd->tx_tspec[ac].tsid = tsid; in ieee80211_add_tx_ts()
3847 ifmgd->tx_tspec[ac].up = up; in ieee80211_add_tx_ts()
3853 static int ieee80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev, in ieee80211_del_tx_ts() argument
3856 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_tx_ts()
3857 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_del_tx_ts()
3862 struct ieee80211_sta_tx_tspec *tx_tspec = &ifmgd->tx_tspec[ac]; in ieee80211_del_tx_ts()
3865 if (!tx_tspec->admitted_time) in ieee80211_del_tx_ts()
3868 if (tx_tspec->tsid != tsid) in ieee80211_del_tx_ts()
3871 /* due to this new packets will be reassigned to non-ACM ACs */ in ieee80211_del_tx_ts()
3872 tx_tspec->up = -1; in ieee80211_del_tx_ts()
3884 tx_tspec->action = TX_TSPEC_ACTION_STOP_DOWNGRADE; in ieee80211_del_tx_ts()
3885 tx_tspec->downgraded = false; in ieee80211_del_tx_ts()
3894 return -ENOENT; in ieee80211_del_tx_ts()
3906 if (WARN_ON(vif->type != NL80211_IFTYPE_NAN)) in ieee80211_nan_func_terminated()
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()
3917 cookie = func->cookie; 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()
3936 if (WARN_ON(vif->type != NL80211_IFTYPE_NAN)) in ieee80211_nan_func_match()
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()
3946 match->cookie = func->cookie; in ieee80211_nan_func_match()
3948 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3955 struct net_device *dev, in ieee80211_set_multicast_to_unicast() argument
3958 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_to_unicast()
3960 sdata->u.ap.multicast_to_unicast = enabled; in ieee80211_set_multicast_to_unicast()
3968 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_BACKLOG_BYTES))) { in ieee80211_fill_txq_stats()
3969 txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_BYTES); in ieee80211_fill_txq_stats()
3970 txqstats->backlog_bytes = txqi->tin.backlog_bytes; in ieee80211_fill_txq_stats()
3973 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS))) { in ieee80211_fill_txq_stats()
3974 txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS); in ieee80211_fill_txq_stats()
3975 txqstats->backlog_packets = txqi->tin.backlog_packets; in ieee80211_fill_txq_stats()
3978 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_FLOWS))) { in ieee80211_fill_txq_stats()
3979 txqstats->filled |= BIT(NL80211_TXQ_STATS_FLOWS); in ieee80211_fill_txq_stats()
3980 txqstats->flows = txqi->tin.flows; in ieee80211_fill_txq_stats()
3983 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_DROPS))) { in ieee80211_fill_txq_stats()
3984 txqstats->filled |= BIT(NL80211_TXQ_STATS_DROPS); in ieee80211_fill_txq_stats()
3985 txqstats->drops = txqi->cstats.drop_count; in ieee80211_fill_txq_stats()
3988 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_ECN_MARKS))) { in ieee80211_fill_txq_stats()
3989 txqstats->filled |= BIT(NL80211_TXQ_STATS_ECN_MARKS); in ieee80211_fill_txq_stats()
3990 txqstats->ecn_marks = txqi->cstats.ecn_mark; in ieee80211_fill_txq_stats()
3993 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_OVERLIMIT))) { in ieee80211_fill_txq_stats()
3994 txqstats->filled |= BIT(NL80211_TXQ_STATS_OVERLIMIT); in ieee80211_fill_txq_stats()
3995 txqstats->overlimit = txqi->tin.overlimit; in ieee80211_fill_txq_stats()
3998 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_COLLISIONS))) { in ieee80211_fill_txq_stats()
3999 txqstats->filled |= BIT(NL80211_TXQ_STATS_COLLISIONS); in ieee80211_fill_txq_stats()
4000 txqstats->collisions = txqi->tin.collisions; in ieee80211_fill_txq_stats()
4003 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_TX_BYTES))) { in ieee80211_fill_txq_stats()
4004 txqstats->filled |= BIT(NL80211_TXQ_STATS_TX_BYTES); in ieee80211_fill_txq_stats()
4005 txqstats->tx_bytes = txqi->tin.tx_bytes; in ieee80211_fill_txq_stats()
4008 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_TX_PACKETS))) { in ieee80211_fill_txq_stats()
4009 txqstats->filled |= BIT(NL80211_TXQ_STATS_TX_PACKETS); in ieee80211_fill_txq_stats()
4010 txqstats->tx_packets = txqi->tin.tx_packets; in ieee80211_fill_txq_stats()
4022 if (!local->ops->wake_tx_queue) in ieee80211_get_txq_stats()
4025 spin_lock_bh(&local->fq.lock); 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()
4037 txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS) | in ieee80211_get_txq_stats()
4043 txqstats->backlog_packets = local->fq.backlog; in ieee80211_get_txq_stats()
4044 txqstats->backlog_bytes = local->fq.memory_usage; in ieee80211_get_txq_stats()
4045 txqstats->overlimit = local->fq.overlimit; in ieee80211_get_txq_stats()
4046 txqstats->overmemory = local->fq.overmemory; in ieee80211_get_txq_stats()
4047 txqstats->collisions = local->fq.collisions; in ieee80211_get_txq_stats()
4048 txqstats->max_flows = local->fq.flows_cnt; in ieee80211_get_txq_stats()
4053 spin_unlock_bh(&local->fq.lock); in ieee80211_get_txq_stats()
4060 struct net_device *dev, in ieee80211_get_ftm_responder_stats() argument
4064 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_ftm_responder_stats()
4070 ieee80211_start_pmsr(struct wiphy *wiphy, struct wireless_dev *dev, in ieee80211_start_pmsr() argument
4074 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev); in ieee80211_start_pmsr()
4080 ieee80211_abort_pmsr(struct wiphy *wiphy, struct wireless_dev *dev, in ieee80211_abort_pmsr() argument
4084 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev); in ieee80211_abort_pmsr()
4090 struct net_device *dev, in ieee80211_set_tid_config() argument
4093 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_tid_config()
4097 if (!sdata->local->ops->set_tid_config) in ieee80211_set_tid_config()
4098 return -EOPNOTSUPP; in ieee80211_set_tid_config()
4100 if (!tid_conf->peer) 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()
4107 return -ENOENT; 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()
4117 struct net_device *dev, in ieee80211_reset_tid_config() argument
4120 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_reset_tid_config()
4124 if (!sdata->local->ops->reset_tid_config) in ieee80211_reset_tid_config()
4125 return -EOPNOTSUPP; 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()
4133 mutex_unlock(&sdata->local->sta_mtx); in ieee80211_reset_tid_config()
4134 return -ENOENT; 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()
4148 if (!local->ops->set_sar_specs) in ieee80211_set_sar_specs()
4149 return -EOPNOTSUPP; in ieee80211_set_sar_specs()
4151 return local->ops->set_sar_specs(&local->hw, sar); in ieee80211_set_sar_specs()
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()
4175 return -EINVAL; in ieee80211_set_after_color_change_beacon()
4189 switch (sdata->vif.type) { in ieee80211_set_color_change_beacon()
4191 sdata->u.ap.next_beacon = in ieee80211_set_color_change_beacon()
4192 cfg80211_beacon_dup(¶ms->beacon_next); in ieee80211_set_color_change_beacon()
4193 if (!sdata->u.ap.next_beacon) in ieee80211_set_color_change_beacon()
4194 return -ENOMEM; in ieee80211_set_color_change_beacon()
4196 if (params->count <= 1) in ieee80211_set_color_change_beacon()
4200 params->counter_offset_beacon; in ieee80211_set_color_change_beacon()
4202 params->counter_offset_presp; in ieee80211_set_color_change_beacon()
4203 color_change.count = params->count; in ieee80211_set_color_change_beacon()
4205 err = ieee80211_assign_beacon(sdata, ¶ms->beacon_color_change, in ieee80211_set_color_change_beacon()
4208 kfree(sdata->u.ap.next_beacon); in ieee80211_set_color_change_beacon()
4214 return -EOPNOTSUPP; in ieee80211_set_color_change_beacon()
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()
4233 struct ieee80211_local *local = sdata->local; in ieee80211_color_change_finalize()
4238 lockdep_assert_held(&local->mtx); in ieee80211_color_change_finalize()
4240 sdata->vif.color_change_active = false; in ieee80211_color_change_finalize()
4244 cfg80211_color_change_aborted_notify(sdata->dev); 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()
4261 struct ieee80211_local *local = sdata->local; in ieee80211_color_change_finalize_work()
4264 mutex_lock(&local->mtx); in ieee80211_color_change_finalize_work()
4267 if (!sdata->vif.color_change_active) in ieee80211_color_change_finalize_work()
4276 mutex_unlock(&local->mtx); in ieee80211_color_change_finalize_work()
4284 ieee80211_queue_work(&sdata->local->hw, in ieee80211_color_change_finish()
4285 &sdata->color_change_finalize_work); in ieee80211_color_change_finish()
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()
4303 ieee80211_color_change(struct wiphy *wiphy, struct net_device *dev, in ieee80211_color_change() argument
4306 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_color_change()
4307 struct ieee80211_local *local = sdata->local; in ieee80211_color_change()
4313 mutex_lock(&local->mtx); in ieee80211_color_change()
4318 if (sdata->vif.color_change_active || sdata->vif.csa_active) { in ieee80211_color_change()
4319 err = -EBUSY; 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()
4339 mutex_unlock(&local->mtx); in ieee80211_color_change()
4390 .assoc = ieee80211_assoc,