Lines Matching +full:cs +full:- +full:dev +full:- +full:assoc
4 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
5 * Copyright 2013-2015 Intel Mobile Communications GmbH
6 * Copyright (C) 2015-2017 Intel Deutschland GmbH
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()
162 params && params->use_4addr == 0) { in ieee80211_change_iface()
163 RCU_INIT_POINTER(sdata->u.vlan.sta, NULL); in ieee80211_change_iface()
166 params && params->use_4addr >= 0) { in ieee80211_change_iface()
167 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_change_iface()
170 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_change_iface()
185 mutex_lock(&sdata->local->chanctx_mtx); in ieee80211_start_p2p_device()
187 mutex_unlock(&sdata->local->chanctx_mtx); in ieee80211_start_p2p_device()
207 mutex_lock(&sdata->local->chanctx_mtx); in ieee80211_start_nan()
209 mutex_unlock(&sdata->local->chanctx_mtx); in ieee80211_start_nan()
217 ret = drv_start_nan(sdata->local, sdata, conf); in ieee80211_start_nan()
221 sdata->u.nan.conf = *conf; in ieee80211_start_nan()
231 drv_stop_nan(sdata->local, sdata); in ieee80211_stop_nan()
244 if (sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_nan_change_conf()
245 return -EOPNOTSUPP; in ieee80211_nan_change_conf()
248 return -ENETDOWN; in ieee80211_nan_change_conf()
250 new_conf = sdata->u.nan.conf; in ieee80211_nan_change_conf()
253 new_conf.master_pref = conf->master_pref; in ieee80211_nan_change_conf()
256 new_conf.bands = conf->bands; in ieee80211_nan_change_conf()
258 ret = drv_nan_change_conf(sdata->local, sdata, &new_conf, changes); in ieee80211_nan_change_conf()
260 sdata->u.nan.conf = new_conf; in ieee80211_nan_change_conf()
272 if (sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_add_nan_func()
273 return -EOPNOTSUPP; in ieee80211_add_nan_func()
276 return -ENETDOWN; in ieee80211_add_nan_func()
278 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
280 ret = idr_alloc(&sdata->u.nan.function_inst_ids, in ieee80211_add_nan_func()
281 nan_func, 1, sdata->local->hw.max_nan_de_entries + 1, in ieee80211_add_nan_func()
283 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
288 nan_func->instance_id = ret; in ieee80211_add_nan_func()
290 WARN_ON(nan_func->instance_id == 0); in ieee80211_add_nan_func()
292 ret = drv_add_nan_func(sdata->local, sdata, nan_func); in ieee80211_add_nan_func()
294 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
295 idr_remove(&sdata->u.nan.function_inst_ids, in ieee80211_add_nan_func()
296 nan_func->instance_id); in ieee80211_add_nan_func()
297 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_add_nan_func()
310 lockdep_assert_held(&sdata->u.nan.func_lock); in ieee80211_find_nan_func_by_cookie()
312 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, id) { in ieee80211_find_nan_func_by_cookie()
313 if (func->cookie == cookie) in ieee80211_find_nan_func_by_cookie()
327 if (sdata->vif.type != NL80211_IFTYPE_NAN || in ieee80211_del_nan_func()
331 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_del_nan_func()
335 instance_id = func->instance_id; in ieee80211_del_nan_func()
337 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_del_nan_func()
340 drv_del_nan_func(sdata->local, sdata, instance_id); in ieee80211_del_nan_func()
344 struct net_device *dev, in ieee80211_set_noack_map() argument
347 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_noack_map()
349 sdata->noack_map = noack_map; in ieee80211_set_noack_map()
356 static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev, in ieee80211_add_key() argument
360 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_key()
361 struct ieee80211_local *local = sdata->local; in ieee80211_add_key()
363 const struct ieee80211_cipher_scheme *cs = NULL; in ieee80211_add_key() local
368 return -ENETDOWN; in ieee80211_add_key()
371 switch (params->cipher) { in ieee80211_add_key()
375 if (IS_ERR(local->wep_tx_tfm)) in ieee80211_add_key()
376 return -EINVAL; in ieee80211_add_key()
388 cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type); in ieee80211_add_key()
392 key = ieee80211_key_alloc(params->cipher, key_idx, params->key_len, in ieee80211_add_key()
393 params->key, params->seq_len, params->seq, in ieee80211_add_key()
394 cs); in ieee80211_add_key()
399 key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE; in ieee80211_add_key()
401 mutex_lock(&local->sta_mtx); in ieee80211_add_key()
406 * The ASSOC test makes sure the driver is ready to in ieee80211_add_key()
417 err = -ENOENT; in ieee80211_add_key()
422 switch (sdata->vif.type) { in ieee80211_add_key()
424 if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED) in ieee80211_add_key()
425 key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT; in ieee80211_add_key()
431 key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT; in ieee80211_add_key()
438 if (sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE) in ieee80211_add_key()
439 key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT; in ieee80211_add_key()
457 sta->cipher_scheme = cs; in ieee80211_add_key()
462 mutex_unlock(&local->sta_mtx); in ieee80211_add_key()
467 static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev, in ieee80211_del_key() argument
470 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_key()
471 struct ieee80211_local *local = sdata->local; in ieee80211_del_key()
476 mutex_lock(&local->sta_mtx); in ieee80211_del_key()
477 mutex_lock(&local->key_mtx); in ieee80211_del_key()
480 ret = -ENOENT; in ieee80211_del_key()
487 key = key_mtx_dereference(local, sta->ptk[key_idx]); in ieee80211_del_key()
489 key = key_mtx_dereference(local, sta->gtk[key_idx]); in ieee80211_del_key()
491 key = key_mtx_dereference(local, sdata->keys[key_idx]); in ieee80211_del_key()
494 ret = -ENOENT; in ieee80211_del_key()
498 ieee80211_key_free(key, sdata->vif.type == NL80211_IFTYPE_STATION); in ieee80211_del_key()
502 mutex_unlock(&local->key_mtx); in ieee80211_del_key()
503 mutex_unlock(&local->sta_mtx); in ieee80211_del_key()
508 static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev, in ieee80211_get_key() argument
522 int err = -ENOENT; in ieee80211_get_key()
525 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_key()
535 key = rcu_dereference(sta->ptk[key_idx]); in ieee80211_get_key()
538 key = rcu_dereference(sta->gtk[key_idx]); in ieee80211_get_key()
540 key = rcu_dereference(sdata->keys[key_idx]); in ieee80211_get_key()
547 params.cipher = key->conf.cipher; in ieee80211_get_key()
549 switch (key->conf.cipher) { in ieee80211_get_key()
551 pn64 = atomic64_read(&key->conf.tx_pn); in ieee80211_get_key()
555 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && in ieee80211_get_key()
556 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { in ieee80211_get_key()
557 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
588 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE && in ieee80211_get_key()
589 !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { in ieee80211_get_key()
590 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
593 pn64 = atomic64_read(&key->conf.tx_pn); in ieee80211_get_key()
605 if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) in ieee80211_get_key()
607 if (WARN_ON(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) in ieee80211_get_key()
609 drv_get_key_seq(sdata->local, key, &kseq); in ieee80211_get_key()
615 params.key = key->conf.key; in ieee80211_get_key()
616 params.key_len = key->conf.keylen; in ieee80211_get_key()
627 struct net_device *dev, in ieee80211_config_default_key() argument
631 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_key()
639 struct net_device *dev, in ieee80211_config_default_mgmt_key() argument
642 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_config_default_mgmt_key()
653 rinfo->flags = 0; in sta_set_rate_info_tx()
654 if (rate->flags & IEEE80211_TX_RC_MCS) { in sta_set_rate_info_tx()
655 rinfo->flags |= RATE_INFO_FLAGS_MCS; in sta_set_rate_info_tx()
656 rinfo->mcs = rate->idx; in sta_set_rate_info_tx()
657 } else if (rate->flags & IEEE80211_TX_RC_VHT_MCS) { in sta_set_rate_info_tx()
658 rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS; in sta_set_rate_info_tx()
659 rinfo->mcs = ieee80211_rate_get_vht_mcs(rate); in sta_set_rate_info_tx()
660 rinfo->nss = ieee80211_rate_get_vht_nss(rate); in sta_set_rate_info_tx()
663 int shift = ieee80211_vif_get_shift(&sta->sdata->vif); in sta_set_rate_info_tx()
666 sband = ieee80211_get_sband(sta->sdata); in sta_set_rate_info_tx()
667 WARN_ON_ONCE(sband && !sband->bitrates); in sta_set_rate_info_tx()
668 if (sband && sband->bitrates) { in sta_set_rate_info_tx()
669 brate = sband->bitrates[rate->idx].bitrate; in sta_set_rate_info_tx()
670 rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift); in sta_set_rate_info_tx()
673 if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) in sta_set_rate_info_tx()
674 rinfo->bw = RATE_INFO_BW_40; in sta_set_rate_info_tx()
675 else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH) in sta_set_rate_info_tx()
676 rinfo->bw = RATE_INFO_BW_80; in sta_set_rate_info_tx()
677 else if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH) in sta_set_rate_info_tx()
678 rinfo->bw = RATE_INFO_BW_160; in sta_set_rate_info_tx()
680 rinfo->bw = RATE_INFO_BW_20; in sta_set_rate_info_tx()
681 if (rate->flags & IEEE80211_TX_RC_SHORT_GI) in sta_set_rate_info_tx()
682 rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; in sta_set_rate_info_tx()
685 static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev, in ieee80211_dump_station() argument
688 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_station()
689 struct ieee80211_local *local = sdata->local; in ieee80211_dump_station()
691 int ret = -ENOENT; in ieee80211_dump_station()
693 mutex_lock(&local->sta_mtx); in ieee80211_dump_station()
698 memcpy(mac, sta->sta.addr, ETH_ALEN); in ieee80211_dump_station()
702 mutex_unlock(&local->sta_mtx); in ieee80211_dump_station()
707 static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev, in ieee80211_dump_survey() argument
710 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); in ieee80211_dump_survey()
715 static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev, in ieee80211_get_station() argument
718 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_station()
719 struct ieee80211_local *local = sdata->local; in ieee80211_get_station()
721 int ret = -ENOENT; in ieee80211_get_station()
723 mutex_lock(&local->sta_mtx); in ieee80211_get_station()
731 mutex_unlock(&local->sta_mtx); in ieee80211_get_station()
743 if (cfg80211_chandef_identical(&local->monitor_chandef, chandef)) in ieee80211_set_monitor_channel()
746 mutex_lock(&local->mtx); in ieee80211_set_monitor_channel()
747 if (local->use_chanctx) { in ieee80211_set_monitor_channel()
748 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_monitor_channel()
754 } else if (local->open_count == local->monitors) { in ieee80211_set_monitor_channel()
755 local->_oper_chandef = *chandef; in ieee80211_set_monitor_channel()
760 local->monitor_chandef = *chandef; in ieee80211_set_monitor_channel()
761 mutex_unlock(&local->mtx); in ieee80211_set_monitor_channel()
775 old = sdata_dereference(sdata->u.ap.probe_resp, sdata); in ieee80211_set_probe_resp()
779 return -ENOMEM; in ieee80211_set_probe_resp()
781 new->len = resp_len; in ieee80211_set_probe_resp()
782 memcpy(new->data, resp, resp_len); in ieee80211_set_probe_resp()
785 memcpy(new->csa_counter_offsets, csa->counter_offsets_presp, in ieee80211_set_probe_resp()
786 csa->n_counter_offsets_presp * in ieee80211_set_probe_resp()
787 sizeof(new->csa_counter_offsets[0])); in ieee80211_set_probe_resp()
789 rcu_assign_pointer(sdata->u.ap.probe_resp, new); in ieee80211_set_probe_resp()
805 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_assign_beacon()
809 if (!params->head && !old) in ieee80211_assign_beacon()
810 return -EINVAL; in ieee80211_assign_beacon()
813 if (params->head) in ieee80211_assign_beacon()
814 new_head_len = params->head_len; in ieee80211_assign_beacon()
816 new_head_len = old->head_len; in ieee80211_assign_beacon()
819 if (params->tail || !old) in ieee80211_assign_beacon()
820 /* params->tail_len will be zero for !params->tail */ in ieee80211_assign_beacon()
821 new_tail_len = params->tail_len; in ieee80211_assign_beacon()
823 new_tail_len = old->tail_len; in ieee80211_assign_beacon()
829 return -ENOMEM; in ieee80211_assign_beacon()
837 new->head = ((u8 *) new) + sizeof(*new); in ieee80211_assign_beacon()
838 new->tail = new->head + new_head_len; in ieee80211_assign_beacon()
839 new->head_len = new_head_len; in ieee80211_assign_beacon()
840 new->tail_len = new_tail_len; in ieee80211_assign_beacon()
843 new->csa_current_counter = csa->count; in ieee80211_assign_beacon()
844 memcpy(new->csa_counter_offsets, csa->counter_offsets_beacon, in ieee80211_assign_beacon()
845 csa->n_counter_offsets_beacon * in ieee80211_assign_beacon()
846 sizeof(new->csa_counter_offsets[0])); in ieee80211_assign_beacon()
850 if (params->head) in ieee80211_assign_beacon()
851 memcpy(new->head, params->head, new_head_len); in ieee80211_assign_beacon()
853 memcpy(new->head, old->head, new_head_len); in ieee80211_assign_beacon()
856 if (params->tail) in ieee80211_assign_beacon()
857 memcpy(new->tail, params->tail, new_tail_len); in ieee80211_assign_beacon()
860 memcpy(new->tail, old->tail, new_tail_len); in ieee80211_assign_beacon()
862 err = ieee80211_set_probe_resp(sdata, params->probe_resp, in ieee80211_assign_beacon()
863 params->probe_resp_len, csa); in ieee80211_assign_beacon()
869 rcu_assign_pointer(sdata->u.ap.beacon, new); in ieee80211_assign_beacon()
877 static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, in ieee80211_start_ap() argument
880 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_start_ap()
881 struct ieee80211_local *local = sdata->local; in ieee80211_start_ap()
893 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_start_ap()
895 return -EALREADY; in ieee80211_start_ap()
897 switch (params->smps_mode) { in ieee80211_start_ap()
899 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_start_ap()
902 sdata->smps_mode = IEEE80211_SMPS_STATIC; in ieee80211_start_ap()
905 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC; in ieee80211_start_ap()
908 return -EINVAL; in ieee80211_start_ap()
910 sdata->u.ap.req_smps = sdata->smps_mode; in ieee80211_start_ap()
912 sdata->needed_rx_chains = sdata->local->rx_chains; in ieee80211_start_ap()
914 prev_beacon_int = sdata->vif.bss_conf.beacon_int; in ieee80211_start_ap()
915 sdata->vif.bss_conf.beacon_int = params->beacon_interval; in ieee80211_start_ap()
917 mutex_lock(&local->mtx); in ieee80211_start_ap()
918 err = ieee80211_vif_use_channel(sdata, ¶ms->chandef, in ieee80211_start_ap()
922 mutex_unlock(&local->mtx); in ieee80211_start_ap()
924 sdata->vif.bss_conf.beacon_int = prev_beacon_int; in ieee80211_start_ap()
932 sdata->control_port_protocol = params->crypto.control_port_ethertype; in ieee80211_start_ap()
933 sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt; in ieee80211_start_ap()
934 sdata->control_port_over_nl80211 = in ieee80211_start_ap()
935 params->crypto.control_port_over_nl80211; in ieee80211_start_ap()
936 sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local, in ieee80211_start_ap()
937 ¶ms->crypto, in ieee80211_start_ap()
938 sdata->vif.type); in ieee80211_start_ap()
940 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) { in ieee80211_start_ap()
941 vlan->control_port_protocol = in ieee80211_start_ap()
942 params->crypto.control_port_ethertype; in ieee80211_start_ap()
943 vlan->control_port_no_encrypt = in ieee80211_start_ap()
944 params->crypto.control_port_no_encrypt; in ieee80211_start_ap()
945 vlan->control_port_over_nl80211 = in ieee80211_start_ap()
946 params->crypto.control_port_over_nl80211; in ieee80211_start_ap()
947 vlan->encrypt_headroom = in ieee80211_start_ap()
948 ieee80211_cs_headroom(sdata->local, in ieee80211_start_ap()
949 ¶ms->crypto, in ieee80211_start_ap()
950 vlan->vif.type); in ieee80211_start_ap()
953 sdata->vif.bss_conf.dtim_period = params->dtim_period; in ieee80211_start_ap()
954 sdata->vif.bss_conf.enable_beacon = true; in ieee80211_start_ap()
955 sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p; in ieee80211_start_ap()
957 sdata->vif.bss_conf.ssid_len = params->ssid_len; in ieee80211_start_ap()
958 if (params->ssid_len) in ieee80211_start_ap()
959 memcpy(sdata->vif.bss_conf.ssid, params->ssid, in ieee80211_start_ap()
960 params->ssid_len); in ieee80211_start_ap()
961 sdata->vif.bss_conf.hidden_ssid = in ieee80211_start_ap()
962 (params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE); in ieee80211_start_ap()
964 memset(&sdata->vif.bss_conf.p2p_noa_attr, 0, in ieee80211_start_ap()
965 sizeof(sdata->vif.bss_conf.p2p_noa_attr)); in ieee80211_start_ap()
966 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow = in ieee80211_start_ap()
967 params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK; in ieee80211_start_ap()
968 if (params->p2p_opp_ps) in ieee80211_start_ap()
969 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_start_ap()
972 err = ieee80211_assign_beacon(sdata, ¶ms->beacon, NULL); in ieee80211_start_ap()
979 err = drv_start_ap(sdata->local, sdata); in ieee80211_start_ap()
981 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_start_ap()
985 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL); in ieee80211_start_ap()
993 netif_carrier_on(dev); in ieee80211_start_ap()
994 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) in ieee80211_start_ap()
995 netif_carrier_on(vlan->dev); in ieee80211_start_ap()
1000 static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev, in ieee80211_change_beacon() argument
1007 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_beacon()
1010 /* don't allow changing the beacon while CSA is in place - offset in ieee80211_change_beacon()
1013 if (sdata->vif.csa_active) in ieee80211_change_beacon()
1014 return -EBUSY; in ieee80211_change_beacon()
1016 old = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_change_beacon()
1018 return -ENOENT; in ieee80211_change_beacon()
1027 static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) in ieee80211_stop_ap() argument
1029 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop_ap()
1031 struct ieee80211_local *local = sdata->local; in ieee80211_stop_ap()
1038 old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata); in ieee80211_stop_ap()
1040 return -ENOENT; in ieee80211_stop_ap()
1041 old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata); in ieee80211_stop_ap()
1044 mutex_lock(&local->mtx); in ieee80211_stop_ap()
1045 sdata->vif.csa_active = false; in ieee80211_stop_ap()
1046 if (sdata->csa_block_tx) { in ieee80211_stop_ap()
1049 sdata->csa_block_tx = false; in ieee80211_stop_ap()
1052 mutex_unlock(&local->mtx); in ieee80211_stop_ap()
1054 kfree(sdata->u.ap.next_beacon); in ieee80211_stop_ap()
1055 sdata->u.ap.next_beacon = NULL; in ieee80211_stop_ap()
1058 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) in ieee80211_stop_ap()
1059 netif_carrier_off(vlan->dev); in ieee80211_stop_ap()
1060 netif_carrier_off(dev); in ieee80211_stop_ap()
1063 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL); in ieee80211_stop_ap()
1064 RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL); in ieee80211_stop_ap()
1068 sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF; in ieee80211_stop_ap()
1073 sdata->vif.bss_conf.enable_beacon = false; in ieee80211_stop_ap()
1074 sdata->vif.bss_conf.ssid_len = 0; in ieee80211_stop_ap()
1075 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state); in ieee80211_stop_ap()
1078 if (sdata->wdev.cac_started) { in ieee80211_stop_ap()
1079 chandef = sdata->vif.bss_conf.chandef; in ieee80211_stop_ap()
1080 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); in ieee80211_stop_ap()
1081 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_stop_ap()
1086 drv_stop_ap(sdata->local, sdata); in ieee80211_stop_ap()
1089 local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf); in ieee80211_stop_ap()
1090 ieee80211_purge_tx_queue(&local->hw, &sdata->u.ap.ps.bc_buf); in ieee80211_stop_ap()
1092 mutex_lock(&local->mtx); in ieee80211_stop_ap()
1095 mutex_unlock(&local->mtx); in ieee80211_stop_ap()
1165 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_apply_mesh_params()
1168 if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) { in sta_apply_mesh_params()
1169 switch (params->plink_state) { in sta_apply_mesh_params()
1171 if (sta->mesh->plink_state != NL80211_PLINK_ESTAB) in sta_apply_mesh_params()
1173 sta->mesh->plink_state = params->plink_state; in sta_apply_mesh_params()
1174 sta->mesh->aid = params->peer_aid; in sta_apply_mesh_params()
1178 sdata->u.mesh.mshcfg.power_mode); in sta_apply_mesh_params()
1186 if (sta->mesh->plink_state == NL80211_PLINK_ESTAB) in sta_apply_mesh_params()
1188 sta->mesh->plink_state = params->plink_state; in sta_apply_mesh_params()
1200 switch (params->plink_action) { in sta_apply_mesh_params()
1212 if (params->local_pm) in sta_apply_mesh_params()
1214 params->local_pm); in sta_apply_mesh_params()
1226 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_apply_parameters()
1231 return -EINVAL; in sta_apply_parameters()
1233 mask = params->sta_flags_mask; in sta_apply_parameters()
1234 set = params->sta_flags_set; in sta_apply_parameters()
1236 if (ieee80211_vif_is_mesh(&sdata->vif)) { in sta_apply_parameters()
1247 * TDLS -- everything follows authorized, but in sta_apply_parameters()
1260 local->hw.queues >= IEEE80211_NUM_ACS) in sta_apply_parameters()
1261 sta->sta.wme = set & BIT(NL80211_STA_FLAG_WME); in sta_apply_parameters()
1281 sta->sta.mfp = !!(set & BIT(NL80211_STA_FLAG_MFP)); in sta_apply_parameters()
1297 !sdata->u.mgd.tdls_chan_switch_prohibited && in sta_apply_parameters()
1298 params->ext_capab_len >= 4 && in sta_apply_parameters()
1299 params->ext_capab[3] & WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH) in sta_apply_parameters()
1303 !sdata->u.mgd.tdls_wider_bw_prohibited && in sta_apply_parameters()
1304 ieee80211_hw_check(&local->hw, TDLS_WIDER_BW) && in sta_apply_parameters()
1305 params->ext_capab_len >= 8 && in sta_apply_parameters()
1306 params->ext_capab[7] & WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED) in sta_apply_parameters()
1309 if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) { in sta_apply_parameters()
1310 sta->sta.uapsd_queues = params->uapsd_queues; in sta_apply_parameters()
1311 sta->sta.max_sp = params->max_sp; in sta_apply_parameters()
1315 if (params->ext_capab_len >= 8) { in sta_apply_parameters()
1316 u8 val = (params->ext_capab[7] & in sta_apply_parameters()
1320 if (params->ext_capab_len >= 9) { in sta_apply_parameters()
1321 u8 val_msb = params->ext_capab[8] & in sta_apply_parameters()
1329 sta->sta.max_amsdu_subframes = 32; in sta_apply_parameters()
1332 sta->sta.max_amsdu_subframes = 16; in sta_apply_parameters()
1335 sta->sta.max_amsdu_subframes = 8; in sta_apply_parameters()
1338 sta->sta.max_amsdu_subframes = 0; in sta_apply_parameters()
1343 * cfg80211 validates this (1-2007) and allows setting the AID in sta_apply_parameters()
1346 if (params->aid) in sta_apply_parameters()
1347 sta->sta.aid = params->aid; in sta_apply_parameters()
1357 if (params->listen_interval >= 0) in sta_apply_parameters()
1358 sta->listen_interval = params->listen_interval; in sta_apply_parameters()
1360 if (params->supported_rates) { in sta_apply_parameters()
1361 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef, in sta_apply_parameters()
1362 sband, params->supported_rates, in sta_apply_parameters()
1363 params->supported_rates_len, in sta_apply_parameters()
1364 &sta->sta.supp_rates[sband->band]); in sta_apply_parameters()
1367 if (params->ht_capa) in sta_apply_parameters()
1369 params->ht_capa, sta); in sta_apply_parameters()
1371 /* VHT can override some HT caps such as the A-MSDU max length */ in sta_apply_parameters()
1372 if (params->vht_capa) in sta_apply_parameters()
1374 params->vht_capa, sta); in sta_apply_parameters()
1376 if (params->he_capa) in sta_apply_parameters()
1378 (void *)params->he_capa, in sta_apply_parameters()
1379 params->he_capa_len, sta); in sta_apply_parameters()
1381 if (params->opmode_notif_used) { in sta_apply_parameters()
1385 __ieee80211_vht_handle_opmode(sdata, sta, params->opmode_notif, in sta_apply_parameters()
1386 sband->band); in sta_apply_parameters()
1389 if (params->support_p2p_ps >= 0) in sta_apply_parameters()
1390 sta->sta.support_p2p_ps = params->support_p2p_ps; in sta_apply_parameters()
1392 if (ieee80211_vif_is_mesh(&sdata->vif)) in sta_apply_parameters()
1406 static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev, in ieee80211_add_station() argument
1415 if (params->vlan) { in ieee80211_add_station()
1416 sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); in ieee80211_add_station()
1418 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_add_station()
1419 sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_add_station()
1420 return -EINVAL; in ieee80211_add_station()
1422 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_station()
1424 if (ether_addr_equal(mac, sdata->vif.addr)) in ieee80211_add_station()
1425 return -EINVAL; in ieee80211_add_station()
1428 return -EINVAL; in ieee80211_add_station()
1430 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER) && in ieee80211_add_station()
1431 sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_add_station()
1432 !sdata->u.mgd.associated) in ieee80211_add_station()
1433 return -EINVAL; in ieee80211_add_station()
1437 return -ENOMEM; in ieee80211_add_station()
1439 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) in ieee80211_add_station()
1440 sta->sta.tdls = true; in ieee80211_add_station()
1468 static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev, in ieee80211_del_station() argument
1473 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_station()
1475 if (params->mac) in ieee80211_del_station()
1476 return sta_info_destroy_addr_bss(sdata, params->mac); in ieee80211_del_station()
1483 struct net_device *dev, const u8 *mac, in ieee80211_change_station() argument
1486 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_station()
1493 mutex_lock(&local->sta_mtx); in ieee80211_change_station()
1497 err = -ENOENT; in ieee80211_change_station()
1501 switch (sdata->vif.type) { in ieee80211_change_station()
1503 if (sdata->u.mesh.user_mpm) in ieee80211_change_station()
1529 err = -EOPNOTSUPP; in ieee80211_change_station()
1537 if (params->vlan && params->vlan != sta->sdata->dev) { in ieee80211_change_station()
1538 vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); in ieee80211_change_station()
1540 if (params->vlan->ieee80211_ptr->use_4addr) { in ieee80211_change_station()
1541 if (vlansdata->u.vlan.sta) { in ieee80211_change_station()
1542 err = -EBUSY; in ieee80211_change_station()
1546 rcu_assign_pointer(vlansdata->u.vlan.sta, sta); in ieee80211_change_station()
1550 if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in ieee80211_change_station()
1551 sta->sdata->u.vlan.sta) in ieee80211_change_station()
1552 RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL); in ieee80211_change_station()
1555 ieee80211_vif_dec_num_mcast(sta->sdata); in ieee80211_change_station()
1557 sta->sdata = vlansdata; in ieee80211_change_station()
1561 ieee80211_vif_inc_num_mcast(sta->sdata); in ieee80211_change_station()
1562 cfg80211_send_layer2_update(sta->sdata->dev, in ieee80211_change_station()
1563 sta->sta.addr); in ieee80211_change_station()
1571 mutex_unlock(&local->sta_mtx); in ieee80211_change_station()
1573 if ((sdata->vif.type == NL80211_IFTYPE_AP || in ieee80211_change_station()
1574 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && in ieee80211_change_station()
1575 sta->known_smps_mode != sta->sdata->bss->req_smps && in ieee80211_change_station()
1578 ht_dbg(sta->sdata, in ieee80211_change_station()
1579 "%pM just authorized and MIMO capable - update SMPS\n", in ieee80211_change_station()
1580 sta->sta.addr); in ieee80211_change_station()
1581 ieee80211_send_smps_action(sta->sdata, in ieee80211_change_station()
1582 sta->sdata->bss->req_smps, in ieee80211_change_station()
1583 sta->sta.addr, in ieee80211_change_station()
1584 sta->sdata->vif.bss_conf.bssid); in ieee80211_change_station()
1587 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_change_station()
1588 params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) { in ieee80211_change_station()
1595 mutex_unlock(&local->sta_mtx); in ieee80211_change_station()
1600 static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_add_mpath() argument
1607 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_mpath()
1613 return -ENOENT; in ieee80211_add_mpath()
1628 static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_del_mpath() argument
1631 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_mpath()
1640 static int ieee80211_change_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_change_mpath() argument
1647 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mpath()
1654 return -ENOENT; in ieee80211_change_mpath()
1660 return -ENOENT; in ieee80211_change_mpath()
1672 struct sta_info *next_hop_sta = rcu_dereference(mpath->next_hop); in mpath_set_pinfo()
1675 memcpy(next_hop, next_hop_sta->sta.addr, ETH_ALEN); in mpath_set_pinfo()
1681 pinfo->generation = mpath->sdata->u.mesh.mesh_paths_generation; in mpath_set_pinfo()
1683 pinfo->filled = MPATH_INFO_FRAME_QLEN | in mpath_set_pinfo()
1691 pinfo->frame_qlen = mpath->frame_queue.qlen; in mpath_set_pinfo()
1692 pinfo->sn = mpath->sn; in mpath_set_pinfo()
1693 pinfo->metric = mpath->metric; in mpath_set_pinfo()
1694 if (time_before(jiffies, mpath->exp_time)) in mpath_set_pinfo()
1695 pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies); in mpath_set_pinfo()
1696 pinfo->discovery_timeout = in mpath_set_pinfo()
1697 jiffies_to_msecs(mpath->discovery_timeout); in mpath_set_pinfo()
1698 pinfo->discovery_retries = mpath->discovery_retries; in mpath_set_pinfo()
1699 if (mpath->flags & MESH_PATH_ACTIVE) in mpath_set_pinfo()
1700 pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE; in mpath_set_pinfo()
1701 if (mpath->flags & MESH_PATH_RESOLVING) in mpath_set_pinfo()
1702 pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING; in mpath_set_pinfo()
1703 if (mpath->flags & MESH_PATH_SN_VALID) in mpath_set_pinfo()
1704 pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID; in mpath_set_pinfo()
1705 if (mpath->flags & MESH_PATH_FIXED) in mpath_set_pinfo()
1706 pinfo->flags |= NL80211_MPATH_FLAG_FIXED; in mpath_set_pinfo()
1707 if (mpath->flags & MESH_PATH_RESOLVED) in mpath_set_pinfo()
1708 pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED; in mpath_set_pinfo()
1711 static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_get_mpath() argument
1718 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mpath()
1724 return -ENOENT; in ieee80211_get_mpath()
1726 memcpy(dst, mpath->dst, ETH_ALEN); in ieee80211_get_mpath()
1732 static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev, in ieee80211_dump_mpath() argument
1739 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_mpath()
1745 return -ENOENT; in ieee80211_dump_mpath()
1747 memcpy(dst, mpath->dst, ETH_ALEN); in ieee80211_dump_mpath()
1757 memcpy(mpp, mpath->mpp, ETH_ALEN); in mpp_set_pinfo()
1759 pinfo->generation = mpath->sdata->u.mesh.mpp_paths_generation; in mpp_set_pinfo()
1762 static int ieee80211_get_mpp(struct wiphy *wiphy, struct net_device *dev, in ieee80211_get_mpp() argument
1769 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mpp()
1775 return -ENOENT; in ieee80211_get_mpp()
1777 memcpy(dst, mpath->dst, ETH_ALEN); in ieee80211_get_mpp()
1783 static int ieee80211_dump_mpp(struct wiphy *wiphy, struct net_device *dev, in ieee80211_dump_mpp() argument
1790 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_dump_mpp()
1796 return -ENOENT; in ieee80211_dump_mpp()
1798 memcpy(dst, mpath->dst, ETH_ALEN); in ieee80211_dump_mpp()
1805 struct net_device *dev, in ieee80211_get_mesh_config() argument
1809 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_get_mesh_config()
1811 memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config)); in ieee80211_get_mesh_config()
1817 return (mask >> (parm-1)) & 0x1; in _chg_mesh_attr()
1830 old_ie = ifmsh->ie; in copy_mesh_setup()
1832 if (setup->ie_len) { in copy_mesh_setup()
1833 new_ie = kmemdup(setup->ie, setup->ie_len, in copy_mesh_setup()
1836 return -ENOMEM; in copy_mesh_setup()
1838 ifmsh->ie_len = setup->ie_len; in copy_mesh_setup()
1839 ifmsh->ie = new_ie; in copy_mesh_setup()
1843 ifmsh->mesh_id_len = setup->mesh_id_len; in copy_mesh_setup()
1844 memcpy(ifmsh->mesh_id, setup->mesh_id, ifmsh->mesh_id_len); in copy_mesh_setup()
1845 ifmsh->mesh_sp_id = setup->sync_method; in copy_mesh_setup()
1846 ifmsh->mesh_pp_id = setup->path_sel_proto; in copy_mesh_setup()
1847 ifmsh->mesh_pm_id = setup->path_metric; in copy_mesh_setup()
1848 ifmsh->user_mpm = setup->user_mpm; in copy_mesh_setup()
1849 ifmsh->mesh_auth_id = setup->auth_id; in copy_mesh_setup()
1850 ifmsh->security = IEEE80211_MESH_SEC_NONE; in copy_mesh_setup()
1851 ifmsh->userspace_handles_dfs = setup->userspace_handles_dfs; in copy_mesh_setup()
1852 if (setup->is_authenticated) in copy_mesh_setup()
1853 ifmsh->security |= IEEE80211_MESH_SEC_AUTHED; in copy_mesh_setup()
1854 if (setup->is_secure) in copy_mesh_setup()
1855 ifmsh->security |= IEEE80211_MESH_SEC_SECURED; in copy_mesh_setup()
1858 memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate, in copy_mesh_setup()
1859 sizeof(setup->mcast_rate)); in copy_mesh_setup()
1860 sdata->vif.bss_conf.basic_rates = setup->basic_rates; in copy_mesh_setup()
1862 sdata->vif.bss_conf.beacon_int = setup->beacon_interval; in copy_mesh_setup()
1863 sdata->vif.bss_conf.dtim_period = setup->dtim_period; in copy_mesh_setup()
1869 struct net_device *dev, u32 mask, in ieee80211_update_mesh_config() argument
1876 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_update_mesh_config()
1877 ifmsh = &sdata->u.mesh; in ieee80211_update_mesh_config()
1880 conf = &(sdata->u.mesh.mshcfg); in ieee80211_update_mesh_config()
1882 conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout; in ieee80211_update_mesh_config()
1884 conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout; in ieee80211_update_mesh_config()
1886 conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout; in ieee80211_update_mesh_config()
1888 conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks; in ieee80211_update_mesh_config()
1890 conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries; in ieee80211_update_mesh_config()
1892 conf->dot11MeshTTL = nconf->dot11MeshTTL; in ieee80211_update_mesh_config()
1894 conf->element_ttl = nconf->element_ttl; in ieee80211_update_mesh_config()
1896 if (ifmsh->user_mpm) in ieee80211_update_mesh_config()
1897 return -EBUSY; in ieee80211_update_mesh_config()
1898 conf->auto_open_plinks = nconf->auto_open_plinks; in ieee80211_update_mesh_config()
1901 conf->dot11MeshNbrOffsetMaxNeighbor = in ieee80211_update_mesh_config()
1902 nconf->dot11MeshNbrOffsetMaxNeighbor; in ieee80211_update_mesh_config()
1904 conf->dot11MeshHWMPmaxPREQretries = in ieee80211_update_mesh_config()
1905 nconf->dot11MeshHWMPmaxPREQretries; in ieee80211_update_mesh_config()
1907 conf->path_refresh_time = nconf->path_refresh_time; in ieee80211_update_mesh_config()
1909 conf->min_discovery_timeout = nconf->min_discovery_timeout; in ieee80211_update_mesh_config()
1911 conf->dot11MeshHWMPactivePathTimeout = in ieee80211_update_mesh_config()
1912 nconf->dot11MeshHWMPactivePathTimeout; in ieee80211_update_mesh_config()
1914 conf->dot11MeshHWMPpreqMinInterval = in ieee80211_update_mesh_config()
1915 nconf->dot11MeshHWMPpreqMinInterval; in ieee80211_update_mesh_config()
1917 conf->dot11MeshHWMPperrMinInterval = in ieee80211_update_mesh_config()
1918 nconf->dot11MeshHWMPperrMinInterval; in ieee80211_update_mesh_config()
1921 conf->dot11MeshHWMPnetDiameterTraversalTime = in ieee80211_update_mesh_config()
1922 nconf->dot11MeshHWMPnetDiameterTraversalTime; in ieee80211_update_mesh_config()
1924 conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode; in ieee80211_update_mesh_config()
1931 if (nconf->dot11MeshGateAnnouncementProtocol && in ieee80211_update_mesh_config()
1932 !(conf->dot11MeshHWMPRootMode > IEEE80211_ROOTMODE_ROOT)) { in ieee80211_update_mesh_config()
1933 conf->dot11MeshHWMPRootMode = IEEE80211_PROACTIVE_RANN; in ieee80211_update_mesh_config()
1936 conf->dot11MeshGateAnnouncementProtocol = in ieee80211_update_mesh_config()
1937 nconf->dot11MeshGateAnnouncementProtocol; in ieee80211_update_mesh_config()
1940 conf->dot11MeshHWMPRannInterval = in ieee80211_update_mesh_config()
1941 nconf->dot11MeshHWMPRannInterval; in ieee80211_update_mesh_config()
1943 conf->dot11MeshForwarding = nconf->dot11MeshForwarding; in ieee80211_update_mesh_config()
1948 if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM)) in ieee80211_update_mesh_config()
1949 return -ENOTSUPP; in ieee80211_update_mesh_config()
1950 conf->rssi_threshold = nconf->rssi_threshold; in ieee80211_update_mesh_config()
1953 conf->ht_opmode = nconf->ht_opmode; in ieee80211_update_mesh_config()
1954 sdata->vif.bss_conf.ht_operation_mode = nconf->ht_opmode; in ieee80211_update_mesh_config()
1958 conf->dot11MeshHWMPactivePathToRootTimeout = in ieee80211_update_mesh_config()
1959 nconf->dot11MeshHWMPactivePathToRootTimeout; in ieee80211_update_mesh_config()
1961 conf->dot11MeshHWMProotInterval = in ieee80211_update_mesh_config()
1962 nconf->dot11MeshHWMProotInterval; in ieee80211_update_mesh_config()
1964 conf->dot11MeshHWMPconfirmationInterval = in ieee80211_update_mesh_config()
1965 nconf->dot11MeshHWMPconfirmationInterval; in ieee80211_update_mesh_config()
1967 conf->power_mode = nconf->power_mode; in ieee80211_update_mesh_config()
1971 conf->dot11MeshAwakeWindowDuration = in ieee80211_update_mesh_config()
1972 nconf->dot11MeshAwakeWindowDuration; in ieee80211_update_mesh_config()
1974 conf->plink_timeout = nconf->plink_timeout; in ieee80211_update_mesh_config()
1979 static int ieee80211_join_mesh(struct wiphy *wiphy, struct net_device *dev, in ieee80211_join_mesh() argument
1983 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_join_mesh()
1984 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_join_mesh()
1987 memcpy(&ifmsh->mshcfg, conf, sizeof(struct mesh_config)); in ieee80211_join_mesh()
1992 sdata->control_port_over_nl80211 = setup->control_port_over_nl80211; in ieee80211_join_mesh()
1995 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_join_mesh()
1996 sdata->needed_rx_chains = sdata->local->rx_chains; in ieee80211_join_mesh()
1998 mutex_lock(&sdata->local->mtx); in ieee80211_join_mesh()
1999 err = ieee80211_vif_use_channel(sdata, &setup->chandef, in ieee80211_join_mesh()
2001 mutex_unlock(&sdata->local->mtx); in ieee80211_join_mesh()
2008 static int ieee80211_leave_mesh(struct wiphy *wiphy, struct net_device *dev) in ieee80211_leave_mesh() argument
2010 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_leave_mesh()
2013 mutex_lock(&sdata->local->mtx); in ieee80211_leave_mesh()
2015 kfree(sdata->u.mesh.ie); in ieee80211_leave_mesh()
2016 mutex_unlock(&sdata->local->mtx); in ieee80211_leave_mesh()
2023 struct net_device *dev, in ieee80211_change_bss() argument
2026 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_bss()
2030 if (!sdata_dereference(sdata->u.ap.beacon, sdata)) in ieee80211_change_bss()
2031 return -ENOENT; in ieee80211_change_bss()
2035 return -EINVAL; in ieee80211_change_bss()
2037 if (params->use_cts_prot >= 0) { in ieee80211_change_bss()
2038 sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot; in ieee80211_change_bss()
2041 if (params->use_short_preamble >= 0) { in ieee80211_change_bss()
2042 sdata->vif.bss_conf.use_short_preamble = in ieee80211_change_bss()
2043 params->use_short_preamble; in ieee80211_change_bss()
2047 if (!sdata->vif.bss_conf.use_short_slot && in ieee80211_change_bss()
2048 sband->band == NL80211_BAND_5GHZ) { in ieee80211_change_bss()
2049 sdata->vif.bss_conf.use_short_slot = true; in ieee80211_change_bss()
2053 if (params->use_short_slot_time >= 0) { in ieee80211_change_bss()
2054 sdata->vif.bss_conf.use_short_slot = in ieee80211_change_bss()
2055 params->use_short_slot_time; in ieee80211_change_bss()
2059 if (params->basic_rates) { in ieee80211_change_bss()
2060 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef, in ieee80211_change_bss()
2061 wiphy->bands[sband->band], in ieee80211_change_bss()
2062 params->basic_rates, in ieee80211_change_bss()
2063 params->basic_rates_len, in ieee80211_change_bss()
2064 &sdata->vif.bss_conf.basic_rates); in ieee80211_change_bss()
2069 if (params->ap_isolate >= 0) { in ieee80211_change_bss()
2070 if (params->ap_isolate) in ieee80211_change_bss()
2071 sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS; in ieee80211_change_bss()
2073 sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS; in ieee80211_change_bss()
2077 if (params->ht_opmode >= 0) { in ieee80211_change_bss()
2078 sdata->vif.bss_conf.ht_operation_mode = in ieee80211_change_bss()
2079 (u16) params->ht_opmode; in ieee80211_change_bss()
2083 if (params->p2p_ctwindow >= 0) { in ieee80211_change_bss()
2084 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &= in ieee80211_change_bss()
2086 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_change_bss()
2087 params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK; in ieee80211_change_bss()
2091 if (params->p2p_opp_ps > 0) { in ieee80211_change_bss()
2092 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |= in ieee80211_change_bss()
2095 } else if (params->p2p_opp_ps == 0) { in ieee80211_change_bss()
2096 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &= in ieee80211_change_bss()
2107 struct net_device *dev, in ieee80211_set_txq_params() argument
2111 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_txq_params()
2114 if (!local->ops->conf_tx) in ieee80211_set_txq_params()
2115 return -EOPNOTSUPP; in ieee80211_set_txq_params()
2117 if (local->hw.queues < IEEE80211_NUM_ACS) in ieee80211_set_txq_params()
2118 return -EOPNOTSUPP; in ieee80211_set_txq_params()
2121 p.aifs = params->aifs; in ieee80211_set_txq_params()
2122 p.cw_max = params->cwmax; in ieee80211_set_txq_params()
2123 p.cw_min = params->cwmin; in ieee80211_set_txq_params()
2124 p.txop = params->txop; in ieee80211_set_txq_params()
2127 * Setting tx queue params disables u-apsd because it's only in ieee80211_set_txq_params()
2132 ieee80211_regulatory_limit_wmm_params(sdata, &p, params->ac); in ieee80211_set_txq_params()
2134 sdata->tx_conf[params->ac] = p; in ieee80211_set_txq_params()
2135 if (drv_conf_tx(local, sdata, params->ac, &p)) { in ieee80211_set_txq_params()
2136 wiphy_debug(local->hw.wiphy, in ieee80211_set_txq_params()
2138 params->ac); in ieee80211_set_txq_params()
2139 return -EINVAL; in ieee80211_set_txq_params()
2168 sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev); in ieee80211_scan()
2170 switch (ieee80211_vif_type_p2p(&sdata->vif)) { in ieee80211_scan()
2178 if (sdata->local->ops->hw_scan) in ieee80211_scan()
2194 if (sdata->u.ap.beacon && in ieee80211_scan()
2195 (!(wiphy->features & NL80211_FEATURE_AP_SCAN) || in ieee80211_scan()
2196 !(req->flags & NL80211_SCAN_FLAG_AP))) in ieee80211_scan()
2197 return -EOPNOTSUPP; in ieee80211_scan()
2201 return -EOPNOTSUPP; in ieee80211_scan()
2214 struct net_device *dev, in ieee80211_sched_scan_start() argument
2217 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_sched_scan_start()
2219 if (!sdata->local->ops->sched_scan_start) in ieee80211_sched_scan_start()
2220 return -EOPNOTSUPP; in ieee80211_sched_scan_start()
2226 ieee80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev, in ieee80211_sched_scan_stop() argument
2231 if (!local->ops->sched_scan_stop) in ieee80211_sched_scan_stop()
2232 return -EOPNOTSUPP; in ieee80211_sched_scan_stop()
2237 static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev, in ieee80211_auth() argument
2240 return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req); in ieee80211_auth()
2243 static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev, in ieee80211_assoc() argument
2246 return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req); in ieee80211_assoc()
2249 static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev, in ieee80211_deauth() argument
2252 return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev), req); in ieee80211_deauth()
2255 static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev, in ieee80211_disassoc() argument
2258 return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev), req); in ieee80211_disassoc()
2261 static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev, in ieee80211_join_ibss() argument
2264 return ieee80211_ibss_join(IEEE80211_DEV_TO_SUB_IF(dev), params); in ieee80211_join_ibss()
2267 static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev) in ieee80211_leave_ibss() argument
2269 return ieee80211_ibss_leave(IEEE80211_DEV_TO_SUB_IF(dev)); in ieee80211_leave_ibss()
2272 static int ieee80211_join_ocb(struct wiphy *wiphy, struct net_device *dev, in ieee80211_join_ocb() argument
2275 return ieee80211_ocb_join(IEEE80211_DEV_TO_SUB_IF(dev), setup); in ieee80211_join_ocb()
2278 static int ieee80211_leave_ocb(struct wiphy *wiphy, struct net_device *dev) in ieee80211_leave_ocb() argument
2280 return ieee80211_ocb_leave(IEEE80211_DEV_TO_SUB_IF(dev)); in ieee80211_leave_ocb()
2283 static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev, in ieee80211_set_mcast_rate() argument
2286 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_mcast_rate()
2288 memcpy(sdata->vif.bss_conf.mcast_rate, rate, in ieee80211_set_mcast_rate()
2304 err = drv_set_frag_threshold(local, wiphy->frag_threshold); in ieee80211_set_wiphy_params()
2317 wiphy->coverage_class : -1; in ieee80211_set_wiphy_params()
2325 err = drv_set_rts_threshold(local, wiphy->rts_threshold); in ieee80211_set_wiphy_params()
2332 if (wiphy->retry_short > IEEE80211_MAX_TX_RETRY) in ieee80211_set_wiphy_params()
2333 return -EINVAL; in ieee80211_set_wiphy_params()
2334 local->hw.conf.short_frame_max_tx_count = wiphy->retry_short; in ieee80211_set_wiphy_params()
2337 if (wiphy->retry_long > IEEE80211_MAX_TX_RETRY) in ieee80211_set_wiphy_params()
2338 return -EINVAL; in ieee80211_set_wiphy_params()
2339 local->hw.conf.long_frame_max_tx_count = wiphy->retry_long; in ieee80211_set_wiphy_params()
2366 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_set_tx_power()
2367 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_tx_power()
2369 return -EOPNOTSUPP; in ieee80211_set_tx_power()
2374 sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_tx_power()
2380 return -EOPNOTSUPP; in ieee80211_set_tx_power()
2381 sdata->user_power_level = MBM_TO_DBM(mbm); in ieee80211_set_tx_power()
2385 if (txp_type != sdata->vif.bss_conf.txpower_type) { in ieee80211_set_tx_power()
2387 sdata->vif.bss_conf.txpower_type = txp_type; in ieee80211_set_tx_power()
2397 local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_set_tx_power()
2403 return -EOPNOTSUPP; in ieee80211_set_tx_power()
2404 local->user_power_level = MBM_TO_DBM(mbm); in ieee80211_set_tx_power()
2408 mutex_lock(&local->iflist_mtx); in ieee80211_set_tx_power()
2409 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_set_tx_power()
2410 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_set_tx_power()
2414 sdata->user_power_level = local->user_power_level; in ieee80211_set_tx_power()
2415 if (txp_type != sdata->vif.bss_conf.txpower_type) in ieee80211_set_tx_power()
2417 sdata->vif.bss_conf.txpower_type = txp_type; in ieee80211_set_tx_power()
2419 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_set_tx_power()
2420 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_set_tx_power()
2424 mutex_unlock(&local->iflist_mtx); in ieee80211_set_tx_power()
2427 sdata = rtnl_dereference(local->monitor_sdata); in ieee80211_set_tx_power()
2429 sdata->user_power_level = local->user_power_level; in ieee80211_set_tx_power()
2430 if (txp_type != sdata->vif.bss_conf.txpower_type) in ieee80211_set_tx_power()
2432 sdata->vif.bss_conf.txpower_type = txp_type; in ieee80211_set_tx_power()
2448 if (local->ops->get_txpower) in ieee80211_get_tx_power()
2451 if (!local->use_chanctx) in ieee80211_get_tx_power()
2452 *dbm = local->hw.conf.power_level; in ieee80211_get_tx_power()
2454 *dbm = sdata->vif.bss_conf.txpower; in ieee80211_get_tx_power()
2459 static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev, in ieee80211_set_wds_peer() argument
2462 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_wds_peer()
2464 memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN); in ieee80211_set_wds_peer()
2484 if (!local->ops->testmode_cmd) in ieee80211_testmode_cmd()
2485 return -EOPNOTSUPP; in ieee80211_testmode_cmd()
2491 if (sdata->flags & IEEE80211_SDATA_IN_DRIVER) in ieee80211_testmode_cmd()
2492 vif = &sdata->vif; in ieee80211_testmode_cmd()
2495 return local->ops->testmode_cmd(&local->hw, vif, data, len); in ieee80211_testmode_cmd()
2505 if (!local->ops->testmode_dump) in ieee80211_testmode_dump()
2506 return -EOPNOTSUPP; in ieee80211_testmode_dump()
2508 return local->ops->testmode_dump(&local->hw, skb, cb, data, len); in ieee80211_testmode_dump()
2518 if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP)) in __ieee80211_request_smps_ap()
2519 return -EINVAL; in __ieee80211_request_smps_ap()
2521 if (sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT) in __ieee80211_request_smps_ap()
2524 old_req = sdata->u.ap.req_smps; in __ieee80211_request_smps_ap()
2525 sdata->u.ap.req_smps = smps_mode; in __ieee80211_request_smps_ap()
2527 /* AUTOMATIC doesn't mean much for AP - don't allow it */ in __ieee80211_request_smps_ap()
2534 smps_mode, atomic_read(&sdata->u.ap.num_mcast_sta)); in __ieee80211_request_smps_ap()
2536 mutex_lock(&sdata->local->sta_mtx); in __ieee80211_request_smps_ap()
2537 list_for_each_entry(sta, &sdata->local->sta_list, list) { in __ieee80211_request_smps_ap()
2542 if (sta->sdata->bss != &sdata->u.ap) in __ieee80211_request_smps_ap()
2545 /* This station doesn't support MIMO - skip it */ in __ieee80211_request_smps_ap()
2554 !ieee80211_smps_is_restrictive(sta->known_smps_mode, in __ieee80211_request_smps_ap()
2557 sta->sta.addr); in __ieee80211_request_smps_ap()
2568 ht_dbg(sdata, "Sending SMPS to %pM\n", sta->sta.addr); in __ieee80211_request_smps_ap()
2569 ieee80211_send_smps_action(sdata, smps_mode, sta->sta.addr, in __ieee80211_request_smps_ap()
2570 sdata->vif.bss_conf.bssid); in __ieee80211_request_smps_ap()
2572 mutex_unlock(&sdata->local->sta_mtx); in __ieee80211_request_smps_ap()
2574 sdata->smps_mode = smps_mode; in __ieee80211_request_smps_ap()
2575 ieee80211_queue_work(&sdata->local->hw, &sdata->recalc_smps); in __ieee80211_request_smps_ap()
2589 lockdep_assert_held(&sdata->wdev.mtx); in __ieee80211_request_smps_mgd()
2591 if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION)) in __ieee80211_request_smps_mgd()
2592 return -EINVAL; in __ieee80211_request_smps_mgd()
2594 old_req = sdata->u.mgd.req_smps; in __ieee80211_request_smps_mgd()
2595 sdata->u.mgd.req_smps = smps_mode; in __ieee80211_request_smps_mgd()
2606 if (!sdata->u.mgd.associated || in __ieee80211_request_smps_mgd()
2607 sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT) in __ieee80211_request_smps_mgd()
2610 ap = sdata->u.mgd.associated->bssid; in __ieee80211_request_smps_mgd()
2613 list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) { in __ieee80211_request_smps_mgd()
2614 if (!sta->sta.tdls || sta->sdata != sdata || !sta->uploaded || in __ieee80211_request_smps_mgd()
2624 if (tdls_peer_found || !sdata->u.mgd.powersave) in __ieee80211_request_smps_mgd()
2634 sdata->u.mgd.req_smps = old_req; in __ieee80211_request_smps_mgd()
2641 static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, in ieee80211_set_power_mgmt() argument
2644 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_power_mgmt()
2645 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); in ieee80211_set_power_mgmt()
2647 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_set_power_mgmt()
2648 return -EOPNOTSUPP; in ieee80211_set_power_mgmt()
2650 if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS)) in ieee80211_set_power_mgmt()
2651 return -EOPNOTSUPP; in ieee80211_set_power_mgmt()
2653 if (enabled == sdata->u.mgd.powersave && in ieee80211_set_power_mgmt()
2654 timeout == local->dynamic_ps_forced_timeout) in ieee80211_set_power_mgmt()
2657 sdata->u.mgd.powersave = enabled; in ieee80211_set_power_mgmt()
2658 local->dynamic_ps_forced_timeout = timeout; in ieee80211_set_power_mgmt()
2662 __ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps); in ieee80211_set_power_mgmt()
2665 if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) in ieee80211_set_power_mgmt()
2676 struct net_device *dev, in ieee80211_set_cqm_rssi_config() argument
2679 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_cqm_rssi_config()
2680 struct ieee80211_vif *vif = &sdata->vif; in ieee80211_set_cqm_rssi_config()
2681 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; in ieee80211_set_cqm_rssi_config()
2683 if (rssi_thold == bss_conf->cqm_rssi_thold && in ieee80211_set_cqm_rssi_config()
2684 rssi_hyst == bss_conf->cqm_rssi_hyst) in ieee80211_set_cqm_rssi_config()
2687 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER && in ieee80211_set_cqm_rssi_config()
2688 !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) in ieee80211_set_cqm_rssi_config()
2689 return -EOPNOTSUPP; in ieee80211_set_cqm_rssi_config()
2691 bss_conf->cqm_rssi_thold = rssi_thold; in ieee80211_set_cqm_rssi_config()
2692 bss_conf->cqm_rssi_hyst = rssi_hyst; in ieee80211_set_cqm_rssi_config()
2693 bss_conf->cqm_rssi_low = 0; in ieee80211_set_cqm_rssi_config()
2694 bss_conf->cqm_rssi_high = 0; in ieee80211_set_cqm_rssi_config()
2695 sdata->u.mgd.last_cqm_event_signal = 0; in ieee80211_set_cqm_rssi_config()
2698 if (sdata->u.mgd.associated && in ieee80211_set_cqm_rssi_config()
2699 sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI) in ieee80211_set_cqm_rssi_config()
2706 struct net_device *dev, in ieee80211_set_cqm_rssi_range_config() argument
2709 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_cqm_rssi_range_config()
2710 struct ieee80211_vif *vif = &sdata->vif; in ieee80211_set_cqm_rssi_range_config()
2711 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; in ieee80211_set_cqm_rssi_range_config()
2713 if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER) in ieee80211_set_cqm_rssi_range_config()
2714 return -EOPNOTSUPP; in ieee80211_set_cqm_rssi_range_config()
2716 bss_conf->cqm_rssi_low = rssi_low; in ieee80211_set_cqm_rssi_range_config()
2717 bss_conf->cqm_rssi_high = rssi_high; in ieee80211_set_cqm_rssi_range_config()
2718 bss_conf->cqm_rssi_thold = 0; in ieee80211_set_cqm_rssi_range_config()
2719 bss_conf->cqm_rssi_hyst = 0; in ieee80211_set_cqm_rssi_range_config()
2720 sdata->u.mgd.last_cqm_event_signal = 0; in ieee80211_set_cqm_rssi_range_config()
2723 if (sdata->u.mgd.associated && in ieee80211_set_cqm_rssi_range_config()
2724 sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI) in ieee80211_set_cqm_rssi_range_config()
2731 struct net_device *dev, in ieee80211_set_bitrate_mask() argument
2735 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_bitrate_mask()
2736 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); in ieee80211_set_bitrate_mask()
2740 return -ENETDOWN; in ieee80211_set_bitrate_mask()
2748 if (rcu_access_pointer(sdata->vif.chanctx_conf) && in ieee80211_set_bitrate_mask()
2749 sdata->vif.bss_conf.chandef.chan) { in ieee80211_set_bitrate_mask()
2750 u32 basic_rates = sdata->vif.bss_conf.basic_rates; in ieee80211_set_bitrate_mask()
2751 enum nl80211_band band = sdata->vif.bss_conf.chandef.chan->band; in ieee80211_set_bitrate_mask()
2753 if (!(mask->control[band].legacy & basic_rates)) in ieee80211_set_bitrate_mask()
2754 return -EINVAL; in ieee80211_set_bitrate_mask()
2757 if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) { in ieee80211_set_bitrate_mask()
2764 struct ieee80211_supported_band *sband = wiphy->bands[i]; in ieee80211_set_bitrate_mask()
2767 sdata->rc_rateidx_mask[i] = mask->control[i].legacy; in ieee80211_set_bitrate_mask()
2768 memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].ht_mcs, in ieee80211_set_bitrate_mask()
2769 sizeof(mask->control[i].ht_mcs)); in ieee80211_set_bitrate_mask()
2770 memcpy(sdata->rc_rateidx_vht_mcs_mask[i], in ieee80211_set_bitrate_mask()
2771 mask->control[i].vht_mcs, in ieee80211_set_bitrate_mask()
2772 sizeof(mask->control[i].vht_mcs)); in ieee80211_set_bitrate_mask()
2774 sdata->rc_has_mcs_mask[i] = false; in ieee80211_set_bitrate_mask()
2775 sdata->rc_has_vht_mcs_mask[i] = false; in ieee80211_set_bitrate_mask()
2780 if (~sdata->rc_rateidx_mcs_mask[i][j]) { in ieee80211_set_bitrate_mask()
2781 sdata->rc_has_mcs_mask[i] = true; in ieee80211_set_bitrate_mask()
2787 if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) { in ieee80211_set_bitrate_mask()
2788 sdata->rc_has_vht_mcs_mask[i] = true; in ieee80211_set_bitrate_mask()
2798 struct net_device *dev, in ieee80211_start_radar_detection() argument
2802 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_start_radar_detection()
2803 struct ieee80211_local *local = sdata->local; in ieee80211_start_radar_detection()
2806 mutex_lock(&local->mtx); in ieee80211_start_radar_detection()
2807 if (!list_empty(&local->roc_list) || local->scanning) { in ieee80211_start_radar_detection()
2808 err = -EBUSY; in ieee80211_start_radar_detection()
2813 sdata->smps_mode = IEEE80211_SMPS_OFF; in ieee80211_start_radar_detection()
2814 sdata->needed_rx_chains = local->rx_chains; in ieee80211_start_radar_detection()
2821 ieee80211_queue_delayed_work(&sdata->local->hw, in ieee80211_start_radar_detection()
2822 &sdata->dfs_cac_timer_work, in ieee80211_start_radar_detection()
2826 mutex_unlock(&local->mtx); in ieee80211_start_radar_detection()
2831 struct net_device *dev) in ieee80211_end_cac() argument
2833 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_end_cac()
2834 struct ieee80211_local *local = sdata->local; in ieee80211_end_cac()
2836 mutex_lock(&local->mtx); in ieee80211_end_cac()
2837 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_end_cac()
2838 /* it might be waiting for the local->mtx, but then in ieee80211_end_cac()
2839 * by the time it gets it, sdata->wdev.cac_started in ieee80211_end_cac()
2842 cancel_delayed_work(&sdata->dfs_cac_timer_work); in ieee80211_end_cac()
2844 if (sdata->wdev.cac_started) { in ieee80211_end_cac()
2846 sdata->wdev.cac_started = false; in ieee80211_end_cac()
2849 mutex_unlock(&local->mtx); in ieee80211_end_cac()
2859 len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len + in cfg80211_beacon_dup()
2860 beacon->proberesp_ies_len + beacon->assocresp_ies_len + in cfg80211_beacon_dup()
2861 beacon->probe_resp_len; in cfg80211_beacon_dup()
2868 if (beacon->head_len) { in cfg80211_beacon_dup()
2869 new_beacon->head_len = beacon->head_len; in cfg80211_beacon_dup()
2870 new_beacon->head = pos; in cfg80211_beacon_dup()
2871 memcpy(pos, beacon->head, beacon->head_len); in cfg80211_beacon_dup()
2872 pos += beacon->head_len; in cfg80211_beacon_dup()
2874 if (beacon->tail_len) { in cfg80211_beacon_dup()
2875 new_beacon->tail_len = beacon->tail_len; in cfg80211_beacon_dup()
2876 new_beacon->tail = pos; in cfg80211_beacon_dup()
2877 memcpy(pos, beacon->tail, beacon->tail_len); in cfg80211_beacon_dup()
2878 pos += beacon->tail_len; in cfg80211_beacon_dup()
2880 if (beacon->beacon_ies_len) { in cfg80211_beacon_dup()
2881 new_beacon->beacon_ies_len = beacon->beacon_ies_len; in cfg80211_beacon_dup()
2882 new_beacon->beacon_ies = pos; in cfg80211_beacon_dup()
2883 memcpy(pos, beacon->beacon_ies, beacon->beacon_ies_len); in cfg80211_beacon_dup()
2884 pos += beacon->beacon_ies_len; in cfg80211_beacon_dup()
2886 if (beacon->proberesp_ies_len) { in cfg80211_beacon_dup()
2887 new_beacon->proberesp_ies_len = beacon->proberesp_ies_len; in cfg80211_beacon_dup()
2888 new_beacon->proberesp_ies = pos; in cfg80211_beacon_dup()
2889 memcpy(pos, beacon->proberesp_ies, beacon->proberesp_ies_len); in cfg80211_beacon_dup()
2890 pos += beacon->proberesp_ies_len; in cfg80211_beacon_dup()
2892 if (beacon->assocresp_ies_len) { in cfg80211_beacon_dup()
2893 new_beacon->assocresp_ies_len = beacon->assocresp_ies_len; in cfg80211_beacon_dup()
2894 new_beacon->assocresp_ies = pos; in cfg80211_beacon_dup()
2895 memcpy(pos, beacon->assocresp_ies, beacon->assocresp_ies_len); in cfg80211_beacon_dup()
2896 pos += beacon->assocresp_ies_len; in cfg80211_beacon_dup()
2898 if (beacon->probe_resp_len) { in cfg80211_beacon_dup()
2899 new_beacon->probe_resp_len = beacon->probe_resp_len; in cfg80211_beacon_dup()
2900 new_beacon->probe_resp = pos; in cfg80211_beacon_dup()
2901 memcpy(pos, beacon->probe_resp, beacon->probe_resp_len); in cfg80211_beacon_dup()
2902 pos += beacon->probe_resp_len; in cfg80211_beacon_dup()
2912 ieee80211_queue_work(&sdata->local->hw, in ieee80211_csa_finish()
2913 &sdata->csa_finalize_work); in ieee80211_csa_finish()
2922 switch (sdata->vif.type) { in ieee80211_set_after_csa_beacon()
2924 err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon, in ieee80211_set_after_csa_beacon()
2926 kfree(sdata->u.ap.next_beacon); in ieee80211_set_after_csa_beacon()
2927 sdata->u.ap.next_beacon = NULL; in ieee80211_set_after_csa_beacon()
2949 return -EINVAL; in ieee80211_set_after_csa_beacon()
2957 struct ieee80211_local *local = sdata->local; in __ieee80211_csa_finalize()
2962 lockdep_assert_held(&local->mtx); in __ieee80211_csa_finalize()
2963 lockdep_assert_held(&local->chanctx_mtx); in __ieee80211_csa_finalize()
2967 * with multi-vif. once reservation is complete it will re-schedule the in __ieee80211_csa_finalize()
2972 if (sdata->reserved_chanctx) { in __ieee80211_csa_finalize()
2974 * with multi-vif csa driver may call ieee80211_csa_finish() in __ieee80211_csa_finalize()
2978 if (sdata->reserved_ready) in __ieee80211_csa_finalize()
2984 if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef, in __ieee80211_csa_finalize()
2985 &sdata->csa_chandef)) in __ieee80211_csa_finalize()
2986 return -EINVAL; in __ieee80211_csa_finalize()
2988 sdata->vif.csa_active = false; in __ieee80211_csa_finalize()
2996 if (sdata->csa_block_tx) { in __ieee80211_csa_finalize()
2999 sdata->csa_block_tx = false; in __ieee80211_csa_finalize()
3006 cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef); in __ieee80211_csa_finalize()
3015 cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev, in ieee80211_csa_finalize()
3025 struct ieee80211_local *local = sdata->local; in ieee80211_csa_finalize_work()
3028 mutex_lock(&local->mtx); in ieee80211_csa_finalize_work()
3029 mutex_lock(&local->chanctx_mtx); in ieee80211_csa_finalize_work()
3032 if (!sdata->vif.csa_active) in ieee80211_csa_finalize_work()
3041 mutex_unlock(&local->chanctx_mtx); in ieee80211_csa_finalize_work()
3042 mutex_unlock(&local->mtx); in ieee80211_csa_finalize_work()
3053 switch (sdata->vif.type) { in ieee80211_set_csa_beacon()
3055 sdata->u.ap.next_beacon = in ieee80211_set_csa_beacon()
3056 cfg80211_beacon_dup(¶ms->beacon_after); in ieee80211_set_csa_beacon()
3057 if (!sdata->u.ap.next_beacon) in ieee80211_set_csa_beacon()
3058 return -ENOMEM; in ieee80211_set_csa_beacon()
3076 if (params->count <= 1) in ieee80211_set_csa_beacon()
3079 if ((params->n_counter_offsets_beacon > in ieee80211_set_csa_beacon()
3081 (params->n_counter_offsets_presp > in ieee80211_set_csa_beacon()
3083 return -EINVAL; in ieee80211_set_csa_beacon()
3085 csa.counter_offsets_beacon = params->counter_offsets_beacon; in ieee80211_set_csa_beacon()
3086 csa.counter_offsets_presp = params->counter_offsets_presp; in ieee80211_set_csa_beacon()
3087 csa.n_counter_offsets_beacon = params->n_counter_offsets_beacon; in ieee80211_set_csa_beacon()
3088 csa.n_counter_offsets_presp = params->n_counter_offsets_presp; in ieee80211_set_csa_beacon()
3089 csa.count = params->count; in ieee80211_set_csa_beacon()
3091 err = ieee80211_assign_beacon(sdata, ¶ms->beacon_csa, &csa); in ieee80211_set_csa_beacon()
3093 kfree(sdata->u.ap.next_beacon); in ieee80211_set_csa_beacon()
3100 if (!sdata->vif.bss_conf.ibss_joined) in ieee80211_set_csa_beacon()
3101 return -EINVAL; in ieee80211_set_csa_beacon()
3103 if (params->chandef.width != sdata->u.ibss.chandef.width) in ieee80211_set_csa_beacon()
3104 return -EINVAL; in ieee80211_set_csa_beacon()
3106 switch (params->chandef.width) { in ieee80211_set_csa_beacon()
3108 if (cfg80211_get_chandef_type(¶ms->chandef) != in ieee80211_set_csa_beacon()
3109 cfg80211_get_chandef_type(&sdata->u.ibss.chandef)) in ieee80211_set_csa_beacon()
3110 return -EINVAL; in ieee80211_set_csa_beacon()
3117 return -EINVAL; in ieee80211_set_csa_beacon()
3121 if (sdata->u.ibss.chandef.chan->band != in ieee80211_set_csa_beacon()
3122 params->chandef.chan->band) in ieee80211_set_csa_beacon()
3123 return -EINVAL; in ieee80211_set_csa_beacon()
3126 if (params->count > 1) { in ieee80211_set_csa_beacon()
3138 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; in ieee80211_set_csa_beacon()
3140 if (params->chandef.width != sdata->vif.bss_conf.chandef.width) in ieee80211_set_csa_beacon()
3141 return -EINVAL; in ieee80211_set_csa_beacon()
3144 if (sdata->vif.bss_conf.chandef.chan->band != in ieee80211_set_csa_beacon()
3145 params->chandef.chan->band) in ieee80211_set_csa_beacon()
3146 return -EINVAL; in ieee80211_set_csa_beacon()
3148 if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_NONE) { in ieee80211_set_csa_beacon()
3149 ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_INIT; in ieee80211_set_csa_beacon()
3150 if (!ifmsh->pre_value) in ieee80211_set_csa_beacon()
3151 ifmsh->pre_value = 1; in ieee80211_set_csa_beacon()
3153 ifmsh->pre_value++; in ieee80211_set_csa_beacon()
3157 if (params->count > 1) { in ieee80211_set_csa_beacon()
3160 ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE; in ieee80211_set_csa_beacon()
3166 if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_INIT) in ieee80211_set_csa_beacon()
3173 return -EOPNOTSUPP; in ieee80211_set_csa_beacon()
3180 __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev, in __ieee80211_channel_switch() argument
3183 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in __ieee80211_channel_switch()
3184 struct ieee80211_local *local = sdata->local; in __ieee80211_channel_switch()
3192 lockdep_assert_held(&local->mtx); in __ieee80211_channel_switch()
3194 if (!list_empty(&local->roc_list) || local->scanning) in __ieee80211_channel_switch()
3195 return -EBUSY; in __ieee80211_channel_switch()
3197 if (sdata->wdev.cac_started) in __ieee80211_channel_switch()
3198 return -EBUSY; in __ieee80211_channel_switch()
3200 if (cfg80211_chandef_identical(¶ms->chandef, in __ieee80211_channel_switch()
3201 &sdata->vif.bss_conf.chandef)) in __ieee80211_channel_switch()
3202 return -EINVAL; in __ieee80211_channel_switch()
3205 if (sdata->vif.csa_active) in __ieee80211_channel_switch()
3206 return -EBUSY; in __ieee80211_channel_switch()
3208 mutex_lock(&local->chanctx_mtx); in __ieee80211_channel_switch()
3209 conf = rcu_dereference_protected(sdata->vif.chanctx_conf, in __ieee80211_channel_switch()
3210 lockdep_is_held(&local->chanctx_mtx)); in __ieee80211_channel_switch()
3212 err = -EBUSY; in __ieee80211_channel_switch()
3220 ch_switch.block_tx = params->block_tx; in __ieee80211_channel_switch()
3221 ch_switch.chandef = params->chandef; in __ieee80211_channel_switch()
3222 ch_switch.count = params->count; in __ieee80211_channel_switch()
3228 err = ieee80211_vif_reserve_chanctx(sdata, ¶ms->chandef, in __ieee80211_channel_switch()
3229 chanctx->mode, in __ieee80211_channel_switch()
3230 params->radar_required); in __ieee80211_channel_switch()
3235 err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0); in __ieee80211_channel_switch()
3247 sdata->csa_chandef = params->chandef; in __ieee80211_channel_switch()
3248 sdata->csa_block_tx = params->block_tx; in __ieee80211_channel_switch()
3249 sdata->vif.csa_active = true; in __ieee80211_channel_switch()
3251 if (sdata->csa_block_tx) in __ieee80211_channel_switch()
3255 cfg80211_ch_switch_started_notify(sdata->dev, &sdata->csa_chandef, in __ieee80211_channel_switch()
3256 params->count); in __ieee80211_channel_switch()
3260 drv_channel_switch_beacon(sdata, ¶ms->chandef); in __ieee80211_channel_switch()
3267 mutex_unlock(&local->chanctx_mtx); in __ieee80211_channel_switch()
3271 int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev, in ieee80211_channel_switch() argument
3274 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_channel_switch()
3275 struct ieee80211_local *local = sdata->local; in ieee80211_channel_switch()
3278 mutex_lock(&local->mtx); in ieee80211_channel_switch()
3279 err = __ieee80211_channel_switch(wiphy, dev, params); in ieee80211_channel_switch()
3280 mutex_unlock(&local->mtx); in ieee80211_channel_switch()
3287 lockdep_assert_held(&local->mtx); in ieee80211_mgmt_tx_cookie()
3289 local->roc_cookie_counter++; in ieee80211_mgmt_tx_cookie()
3292 if (WARN_ON(local->roc_cookie_counter == 0)) in ieee80211_mgmt_tx_cookie()
3293 local->roc_cookie_counter++; in ieee80211_mgmt_tx_cookie()
3295 return local->roc_cookie_counter; in ieee80211_mgmt_tx_cookie()
3307 return -ENOMEM; in ieee80211_attach_ack_skb()
3309 spin_lock_irqsave(&local->ack_status_lock, spin_flags); in ieee80211_attach_ack_skb()
3310 id = idr_alloc(&local->ack_status_frames, ack_skb, in ieee80211_attach_ack_skb()
3312 spin_unlock_irqrestore(&local->ack_status_lock, spin_flags); in ieee80211_attach_ack_skb()
3316 return -ENOMEM; in ieee80211_attach_ack_skb()
3319 IEEE80211_SKB_CB(skb)->ack_frame_id = id; in ieee80211_attach_ack_skb()
3322 IEEE80211_SKB_CB(ack_skb)->ack.cookie = *cookie; in ieee80211_attach_ack_skb()
3337 local->probe_req_reg++; in ieee80211_mgmt_frame_register()
3338 sdata->vif.probe_req_reg++; in ieee80211_mgmt_frame_register()
3340 if (local->probe_req_reg) in ieee80211_mgmt_frame_register()
3341 local->probe_req_reg--; in ieee80211_mgmt_frame_register()
3343 if (sdata->vif.probe_req_reg) in ieee80211_mgmt_frame_register()
3344 sdata->vif.probe_req_reg--; in ieee80211_mgmt_frame_register()
3347 if (!local->open_count) in ieee80211_mgmt_frame_register()
3350 if (sdata->vif.probe_req_reg == 1) in ieee80211_mgmt_frame_register()
3353 else if (sdata->vif.probe_req_reg == 0) in ieee80211_mgmt_frame_register()
3368 if (local->started) in ieee80211_set_antenna()
3369 return -EOPNOTSUPP; in ieee80211_set_antenna()
3382 struct net_device *dev, in ieee80211_set_rekey_data() argument
3386 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_rekey_data()
3388 if (!local->ops->set_rekey_data) in ieee80211_set_rekey_data()
3389 return -EOPNOTSUPP; in ieee80211_set_rekey_data()
3396 static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev, in ieee80211_probe_client() argument
3399 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_probe_client()
3400 struct ieee80211_local *local = sdata->local; in ieee80211_probe_client()
3413 mutex_lock(&local->mtx); in ieee80211_probe_client()
3416 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_probe_client()
3418 ret = -EINVAL; in ieee80211_probe_client()
3421 band = chanctx_conf->def.chan->band; in ieee80211_probe_client()
3424 qos = sta->sta.wme; in ieee80211_probe_client()
3426 ret = -ENOLINK; in ieee80211_probe_client()
3435 size -= 2; in ieee80211_probe_client()
3441 skb = dev_alloc_skb(local->hw.extra_tx_headroom + size); in ieee80211_probe_client()
3443 ret = -ENOMEM; in ieee80211_probe_client()
3447 skb->dev = dev; in ieee80211_probe_client()
3449 skb_reserve(skb, local->hw.extra_tx_headroom); in ieee80211_probe_client()
3452 nullfunc->frame_control = fc; in ieee80211_probe_client()
3453 nullfunc->duration_id = 0; in ieee80211_probe_client()
3454 memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN); in ieee80211_probe_client()
3455 memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); in ieee80211_probe_client()
3456 memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN); in ieee80211_probe_client()
3457 nullfunc->seq_ctrl = 0; in ieee80211_probe_client()
3461 info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS | in ieee80211_probe_client()
3463 info->band = band; in ieee80211_probe_client()
3466 skb->priority = 7; in ieee80211_probe_client()
3468 nullfunc->qos_ctrl = cpu_to_le16(7); in ieee80211_probe_client()
3483 mutex_unlock(&local->mtx); in ieee80211_probe_client()
3495 int ret = -ENODATA; in ieee80211_cfg_get_channel()
3498 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in ieee80211_cfg_get_channel()
3500 *chandef = sdata->vif.bss_conf.chandef; in ieee80211_cfg_get_channel()
3502 } else if (local->open_count > 0 && in ieee80211_cfg_get_channel()
3503 local->open_count == local->monitors && in ieee80211_cfg_get_channel()
3504 sdata->vif.type == NL80211_IFTYPE_MONITOR) { in ieee80211_cfg_get_channel()
3505 if (local->use_chanctx) in ieee80211_cfg_get_channel()
3506 *chandef = local->monitor_chandef; in ieee80211_cfg_get_channel()
3508 *chandef = local->_oper_chandef; in ieee80211_cfg_get_channel()
3524 struct net_device *dev, in ieee80211_set_qos_map() argument
3527 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_qos_map()
3533 return -ENOMEM; in ieee80211_set_qos_map()
3534 memcpy(&new_qos_map->qos_map, qos_map, sizeof(*qos_map)); in ieee80211_set_qos_map()
3540 old_qos_map = sdata_dereference(sdata->qos_map, sdata); in ieee80211_set_qos_map()
3541 rcu_assign_pointer(sdata->qos_map, new_qos_map); in ieee80211_set_qos_map()
3549 struct net_device *dev, in ieee80211_set_ap_chanwidth() argument
3552 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_ap_chanwidth()
3563 static int ieee80211_add_tx_ts(struct wiphy *wiphy, struct net_device *dev, in ieee80211_add_tx_ts() argument
3567 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_add_tx_ts()
3568 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_add_tx_ts()
3571 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_add_tx_ts()
3572 return -EOPNOTSUPP; in ieee80211_add_tx_ts()
3574 if (!(sdata->wmm_acm & BIT(up))) in ieee80211_add_tx_ts()
3575 return -EINVAL; in ieee80211_add_tx_ts()
3577 if (ifmgd->tx_tspec[ac].admitted_time) in ieee80211_add_tx_ts()
3578 return -EBUSY; in ieee80211_add_tx_ts()
3581 ifmgd->tx_tspec[ac].admitted_time = 32 * admitted_time; in ieee80211_add_tx_ts()
3582 ifmgd->tx_tspec[ac].tsid = tsid; in ieee80211_add_tx_ts()
3583 ifmgd->tx_tspec[ac].up = up; in ieee80211_add_tx_ts()
3589 static int ieee80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev, in ieee80211_del_tx_ts() argument
3592 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_del_tx_ts()
3593 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; in ieee80211_del_tx_ts()
3598 struct ieee80211_sta_tx_tspec *tx_tspec = &ifmgd->tx_tspec[ac]; in ieee80211_del_tx_ts()
3601 if (!tx_tspec->admitted_time) in ieee80211_del_tx_ts()
3604 if (tx_tspec->tsid != tsid) in ieee80211_del_tx_ts()
3607 /* due to this new packets will be reassigned to non-ACM ACs */ in ieee80211_del_tx_ts()
3608 tx_tspec->up = -1; in ieee80211_del_tx_ts()
3620 tx_tspec->action = TX_TSPEC_ACTION_STOP_DOWNGRADE; in ieee80211_del_tx_ts()
3621 tx_tspec->downgraded = false; in ieee80211_del_tx_ts()
3630 return -ENOENT; in ieee80211_del_tx_ts()
3642 if (WARN_ON(vif->type != NL80211_IFTYPE_NAN)) in ieee80211_nan_func_terminated()
3645 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_terminated()
3647 func = idr_find(&sdata->u.nan.function_inst_ids, inst_id); in ieee80211_nan_func_terminated()
3649 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_terminated()
3653 cookie = func->cookie; in ieee80211_nan_func_terminated()
3654 idr_remove(&sdata->u.nan.function_inst_ids, inst_id); in ieee80211_nan_func_terminated()
3656 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_terminated()
3672 if (WARN_ON(vif->type != NL80211_IFTYPE_NAN)) in ieee80211_nan_func_match()
3675 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3677 func = idr_find(&sdata->u.nan.function_inst_ids, match->inst_id); in ieee80211_nan_func_match()
3679 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3682 match->cookie = func->cookie; in ieee80211_nan_func_match()
3684 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_nan_func_match()
3691 struct net_device *dev, in ieee80211_set_multicast_to_unicast() argument
3694 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_to_unicast()
3696 sdata->u.ap.multicast_to_unicast = enabled; in ieee80211_set_multicast_to_unicast()
3704 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_BACKLOG_BYTES))) { in ieee80211_fill_txq_stats()
3705 txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_BYTES); in ieee80211_fill_txq_stats()
3706 txqstats->backlog_bytes = txqi->tin.backlog_bytes; in ieee80211_fill_txq_stats()
3709 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS))) { in ieee80211_fill_txq_stats()
3710 txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS); in ieee80211_fill_txq_stats()
3711 txqstats->backlog_packets = txqi->tin.backlog_packets; in ieee80211_fill_txq_stats()
3714 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_FLOWS))) { in ieee80211_fill_txq_stats()
3715 txqstats->filled |= BIT(NL80211_TXQ_STATS_FLOWS); in ieee80211_fill_txq_stats()
3716 txqstats->flows = txqi->tin.flows; in ieee80211_fill_txq_stats()
3719 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_DROPS))) { in ieee80211_fill_txq_stats()
3720 txqstats->filled |= BIT(NL80211_TXQ_STATS_DROPS); in ieee80211_fill_txq_stats()
3721 txqstats->drops = txqi->cstats.drop_count; in ieee80211_fill_txq_stats()
3724 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_ECN_MARKS))) { in ieee80211_fill_txq_stats()
3725 txqstats->filled |= BIT(NL80211_TXQ_STATS_ECN_MARKS); in ieee80211_fill_txq_stats()
3726 txqstats->ecn_marks = txqi->cstats.ecn_mark; in ieee80211_fill_txq_stats()
3729 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_OVERLIMIT))) { in ieee80211_fill_txq_stats()
3730 txqstats->filled |= BIT(NL80211_TXQ_STATS_OVERLIMIT); in ieee80211_fill_txq_stats()
3731 txqstats->overlimit = txqi->tin.overlimit; in ieee80211_fill_txq_stats()
3734 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_COLLISIONS))) { in ieee80211_fill_txq_stats()
3735 txqstats->filled |= BIT(NL80211_TXQ_STATS_COLLISIONS); in ieee80211_fill_txq_stats()
3736 txqstats->collisions = txqi->tin.collisions; in ieee80211_fill_txq_stats()
3739 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_TX_BYTES))) { in ieee80211_fill_txq_stats()
3740 txqstats->filled |= BIT(NL80211_TXQ_STATS_TX_BYTES); in ieee80211_fill_txq_stats()
3741 txqstats->tx_bytes = txqi->tin.tx_bytes; in ieee80211_fill_txq_stats()
3744 if (!(txqstats->filled & BIT(NL80211_TXQ_STATS_TX_PACKETS))) { in ieee80211_fill_txq_stats()
3745 txqstats->filled |= BIT(NL80211_TXQ_STATS_TX_PACKETS); in ieee80211_fill_txq_stats()
3746 txqstats->tx_packets = txqi->tin.tx_packets; in ieee80211_fill_txq_stats()
3758 if (!local->ops->wake_tx_queue) in ieee80211_get_txq_stats()
3761 spin_lock_bh(&local->fq.lock); in ieee80211_get_txq_stats()
3766 if (!sdata->vif.txq) { in ieee80211_get_txq_stats()
3770 ieee80211_fill_txq_stats(txqstats, to_txq_info(sdata->vif.txq)); in ieee80211_get_txq_stats()
3773 txqstats->filled |= BIT(NL80211_TXQ_STATS_BACKLOG_PACKETS) | in ieee80211_get_txq_stats()
3779 txqstats->backlog_packets = local->fq.backlog; in ieee80211_get_txq_stats()
3780 txqstats->backlog_bytes = local->fq.memory_usage; in ieee80211_get_txq_stats()
3781 txqstats->overlimit = local->fq.overlimit; in ieee80211_get_txq_stats()
3782 txqstats->overmemory = local->fq.overmemory; in ieee80211_get_txq_stats()
3783 txqstats->collisions = local->fq.collisions; in ieee80211_get_txq_stats()
3784 txqstats->max_flows = local->fq.flows_cnt; in ieee80211_get_txq_stats()
3789 spin_unlock_bh(&local->fq.lock); in ieee80211_get_txq_stats()
3839 .assoc = ieee80211_assoc,