]> git.karo-electronics.de Git - karo-tx-linux.git/blob - net/mac80211/cfg.c
ARM: dts: imx6ul: add support for Ka-Ro electronics TXUL mainboard
[karo-tx-linux.git] / net / mac80211 / cfg.c
1 /*
2  * mac80211 configuration hooks for cfg80211
3  *
4  * Copyright 2006-2010  Johannes Berg <johannes@sipsolutions.net>
5  * Copyright 2013-2015  Intel Mobile Communications GmbH
6  *
7  * This file is GPLv2 as found in COPYING.
8  */
9
10 #include <linux/ieee80211.h>
11 #include <linux/nl80211.h>
12 #include <linux/rtnetlink.h>
13 #include <linux/slab.h>
14 #include <net/net_namespace.h>
15 #include <linux/rcupdate.h>
16 #include <linux/if_ether.h>
17 #include <net/cfg80211.h>
18 #include "ieee80211_i.h"
19 #include "driver-ops.h"
20 #include "rate.h"
21 #include "mesh.h"
22 #include "wme.h"
23
24 static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy,
25                                                 const char *name,
26                                                 unsigned char name_assign_type,
27                                                 enum nl80211_iftype type,
28                                                 u32 *flags,
29                                                 struct vif_params *params)
30 {
31         struct ieee80211_local *local = wiphy_priv(wiphy);
32         struct wireless_dev *wdev;
33         struct ieee80211_sub_if_data *sdata;
34         int err;
35
36         err = ieee80211_if_add(local, name, name_assign_type, &wdev, type, params);
37         if (err)
38                 return ERR_PTR(err);
39
40         if (type == NL80211_IFTYPE_MONITOR && flags) {
41                 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
42                 sdata->u.mntr_flags = *flags;
43         }
44
45         return wdev;
46 }
47
48 static int ieee80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
49 {
50         ieee80211_if_remove(IEEE80211_WDEV_TO_SUB_IF(wdev));
51
52         return 0;
53 }
54
55 static int ieee80211_change_iface(struct wiphy *wiphy,
56                                   struct net_device *dev,
57                                   enum nl80211_iftype type, u32 *flags,
58                                   struct vif_params *params)
59 {
60         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
61         int ret;
62
63         ret = ieee80211_if_change_type(sdata, type);
64         if (ret)
65                 return ret;
66
67         if (type == NL80211_IFTYPE_AP_VLAN &&
68             params && params->use_4addr == 0)
69                 RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
70         else if (type == NL80211_IFTYPE_STATION &&
71                  params && params->use_4addr >= 0)
72                 sdata->u.mgd.use_4addr = params->use_4addr;
73
74         if (sdata->vif.type == NL80211_IFTYPE_MONITOR && flags) {
75                 struct ieee80211_local *local = sdata->local;
76
77                 if (ieee80211_sdata_running(sdata)) {
78                         u32 mask = MONITOR_FLAG_COOK_FRAMES |
79                                    MONITOR_FLAG_ACTIVE;
80
81                         /*
82                          * Prohibit MONITOR_FLAG_COOK_FRAMES and
83                          * MONITOR_FLAG_ACTIVE to be changed while the
84                          * interface is up.
85                          * Else we would need to add a lot of cruft
86                          * to update everything:
87                          *      cooked_mntrs, monitor and all fif_* counters
88                          *      reconfigure hardware
89                          */
90                         if ((*flags & mask) != (sdata->u.mntr_flags & mask))
91                                 return -EBUSY;
92
93                         ieee80211_adjust_monitor_flags(sdata, -1);
94                         sdata->u.mntr_flags = *flags;
95                         ieee80211_adjust_monitor_flags(sdata, 1);
96
97                         ieee80211_configure_filter(local);
98                 } else {
99                         /*
100                          * Because the interface is down, ieee80211_do_stop
101                          * and ieee80211_do_open take care of "everything"
102                          * mentioned in the comment above.
103                          */
104                         sdata->u.mntr_flags = *flags;
105                 }
106         }
107
108         return 0;
109 }
110
111 static int ieee80211_start_p2p_device(struct wiphy *wiphy,
112                                       struct wireless_dev *wdev)
113 {
114         struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
115         int ret;
116
117         mutex_lock(&sdata->local->chanctx_mtx);
118         ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
119         mutex_unlock(&sdata->local->chanctx_mtx);
120         if (ret < 0)
121                 return ret;
122
123         return ieee80211_do_open(wdev, true);
124 }
125
126 static void ieee80211_stop_p2p_device(struct wiphy *wiphy,
127                                       struct wireless_dev *wdev)
128 {
129         ieee80211_sdata_stop(IEEE80211_WDEV_TO_SUB_IF(wdev));
130 }
131
132 static int ieee80211_set_noack_map(struct wiphy *wiphy,
133                                   struct net_device *dev,
134                                   u16 noack_map)
135 {
136         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
137
138         sdata->noack_map = noack_map;
139
140         ieee80211_check_fast_xmit_iface(sdata);
141
142         return 0;
143 }
144
145 static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
146                              u8 key_idx, bool pairwise, const u8 *mac_addr,
147                              struct key_params *params)
148 {
149         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
150         struct ieee80211_local *local = sdata->local;
151         struct sta_info *sta = NULL;
152         const struct ieee80211_cipher_scheme *cs = NULL;
153         struct ieee80211_key *key;
154         int err;
155
156         if (!ieee80211_sdata_running(sdata))
157                 return -ENETDOWN;
158
159         /* reject WEP and TKIP keys if WEP failed to initialize */
160         switch (params->cipher) {
161         case WLAN_CIPHER_SUITE_WEP40:
162         case WLAN_CIPHER_SUITE_TKIP:
163         case WLAN_CIPHER_SUITE_WEP104:
164                 if (IS_ERR(local->wep_tx_tfm))
165                         return -EINVAL;
166                 break;
167         case WLAN_CIPHER_SUITE_CCMP:
168         case WLAN_CIPHER_SUITE_CCMP_256:
169         case WLAN_CIPHER_SUITE_AES_CMAC:
170         case WLAN_CIPHER_SUITE_BIP_CMAC_256:
171         case WLAN_CIPHER_SUITE_BIP_GMAC_128:
172         case WLAN_CIPHER_SUITE_BIP_GMAC_256:
173         case WLAN_CIPHER_SUITE_GCMP:
174         case WLAN_CIPHER_SUITE_GCMP_256:
175                 break;
176         default:
177                 cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type);
178                 break;
179         }
180
181         key = ieee80211_key_alloc(params->cipher, key_idx, params->key_len,
182                                   params->key, params->seq_len, params->seq,
183                                   cs);
184         if (IS_ERR(key))
185                 return PTR_ERR(key);
186
187         if (pairwise)
188                 key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE;
189
190         mutex_lock(&local->sta_mtx);
191
192         if (mac_addr) {
193                 if (ieee80211_vif_is_mesh(&sdata->vif))
194                         sta = sta_info_get(sdata, mac_addr);
195                 else
196                         sta = sta_info_get_bss(sdata, mac_addr);
197                 /*
198                  * The ASSOC test makes sure the driver is ready to
199                  * receive the key. When wpa_supplicant has roamed
200                  * using FT, it attempts to set the key before
201                  * association has completed, this rejects that attempt
202                  * so it will set the key again after association.
203                  *
204                  * TODO: accept the key if we have a station entry and
205                  *       add it to the device after the station.
206                  */
207                 if (!sta || !test_sta_flag(sta, WLAN_STA_ASSOC)) {
208                         ieee80211_key_free_unused(key);
209                         err = -ENOENT;
210                         goto out_unlock;
211                 }
212         }
213
214         switch (sdata->vif.type) {
215         case NL80211_IFTYPE_STATION:
216                 if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED)
217                         key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
218                 break;
219         case NL80211_IFTYPE_AP:
220         case NL80211_IFTYPE_AP_VLAN:
221                 /* Keys without a station are used for TX only */
222                 if (key->sta && test_sta_flag(key->sta, WLAN_STA_MFP))
223                         key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
224                 break;
225         case NL80211_IFTYPE_ADHOC:
226                 /* no MFP (yet) */
227                 break;
228         case NL80211_IFTYPE_MESH_POINT:
229 #ifdef CONFIG_MAC80211_MESH
230                 if (sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE)
231                         key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
232                 break;
233 #endif
234         case NL80211_IFTYPE_WDS:
235         case NL80211_IFTYPE_MONITOR:
236         case NL80211_IFTYPE_P2P_DEVICE:
237         case NL80211_IFTYPE_UNSPECIFIED:
238         case NUM_NL80211_IFTYPES:
239         case NL80211_IFTYPE_P2P_CLIENT:
240         case NL80211_IFTYPE_P2P_GO:
241         case NL80211_IFTYPE_OCB:
242                 /* shouldn't happen */
243                 WARN_ON_ONCE(1);
244                 break;
245         }
246
247         if (sta)
248                 sta->cipher_scheme = cs;
249
250         err = ieee80211_key_link(key, sdata, sta);
251
252  out_unlock:
253         mutex_unlock(&local->sta_mtx);
254
255         return err;
256 }
257
258 static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
259                              u8 key_idx, bool pairwise, const u8 *mac_addr)
260 {
261         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
262         struct ieee80211_local *local = sdata->local;
263         struct sta_info *sta;
264         struct ieee80211_key *key = NULL;
265         int ret;
266
267         mutex_lock(&local->sta_mtx);
268         mutex_lock(&local->key_mtx);
269
270         if (mac_addr) {
271                 ret = -ENOENT;
272
273                 sta = sta_info_get_bss(sdata, mac_addr);
274                 if (!sta)
275                         goto out_unlock;
276
277                 if (pairwise)
278                         key = key_mtx_dereference(local, sta->ptk[key_idx]);
279                 else
280                         key = key_mtx_dereference(local, sta->gtk[key_idx]);
281         } else
282                 key = key_mtx_dereference(local, sdata->keys[key_idx]);
283
284         if (!key) {
285                 ret = -ENOENT;
286                 goto out_unlock;
287         }
288
289         ieee80211_key_free(key, true);
290
291         ret = 0;
292  out_unlock:
293         mutex_unlock(&local->key_mtx);
294         mutex_unlock(&local->sta_mtx);
295
296         return ret;
297 }
298
299 static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
300                              u8 key_idx, bool pairwise, const u8 *mac_addr,
301                              void *cookie,
302                              void (*callback)(void *cookie,
303                                               struct key_params *params))
304 {
305         struct ieee80211_sub_if_data *sdata;
306         struct sta_info *sta = NULL;
307         u8 seq[6] = {0};
308         struct key_params params;
309         struct ieee80211_key *key = NULL;
310         u64 pn64;
311         u32 iv32;
312         u16 iv16;
313         int err = -ENOENT;
314         struct ieee80211_key_seq kseq = {};
315
316         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
317
318         rcu_read_lock();
319
320         if (mac_addr) {
321                 sta = sta_info_get_bss(sdata, mac_addr);
322                 if (!sta)
323                         goto out;
324
325                 if (pairwise && key_idx < NUM_DEFAULT_KEYS)
326                         key = rcu_dereference(sta->ptk[key_idx]);
327                 else if (!pairwise &&
328                          key_idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
329                         key = rcu_dereference(sta->gtk[key_idx]);
330         } else
331                 key = rcu_dereference(sdata->keys[key_idx]);
332
333         if (!key)
334                 goto out;
335
336         memset(&params, 0, sizeof(params));
337
338         params.cipher = key->conf.cipher;
339
340         switch (key->conf.cipher) {
341         case WLAN_CIPHER_SUITE_TKIP:
342                 iv32 = key->u.tkip.tx.iv32;
343                 iv16 = key->u.tkip.tx.iv16;
344
345                 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
346                     !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
347                         drv_get_key_seq(sdata->local, key, &kseq);
348                         iv32 = kseq.tkip.iv32;
349                         iv16 = kseq.tkip.iv16;
350                 }
351
352                 seq[0] = iv16 & 0xff;
353                 seq[1] = (iv16 >> 8) & 0xff;
354                 seq[2] = iv32 & 0xff;
355                 seq[3] = (iv32 >> 8) & 0xff;
356                 seq[4] = (iv32 >> 16) & 0xff;
357                 seq[5] = (iv32 >> 24) & 0xff;
358                 params.seq = seq;
359                 params.seq_len = 6;
360                 break;
361         case WLAN_CIPHER_SUITE_CCMP:
362         case WLAN_CIPHER_SUITE_CCMP_256:
363         case WLAN_CIPHER_SUITE_AES_CMAC:
364         case WLAN_CIPHER_SUITE_BIP_CMAC_256:
365                 BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
366                              offsetof(typeof(kseq), aes_cmac));
367         case WLAN_CIPHER_SUITE_BIP_GMAC_128:
368         case WLAN_CIPHER_SUITE_BIP_GMAC_256:
369                 BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
370                              offsetof(typeof(kseq), aes_gmac));
371         case WLAN_CIPHER_SUITE_GCMP:
372         case WLAN_CIPHER_SUITE_GCMP_256:
373                 BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
374                              offsetof(typeof(kseq), gcmp));
375
376                 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
377                     !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
378                         drv_get_key_seq(sdata->local, key, &kseq);
379                         memcpy(seq, kseq.ccmp.pn, 6);
380                 } else {
381                         pn64 = atomic64_read(&key->conf.tx_pn);
382                         seq[0] = pn64;
383                         seq[1] = pn64 >> 8;
384                         seq[2] = pn64 >> 16;
385                         seq[3] = pn64 >> 24;
386                         seq[4] = pn64 >> 32;
387                         seq[5] = pn64 >> 40;
388                 }
389                 params.seq = seq;
390                 params.seq_len = 6;
391                 break;
392         default:
393                 if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
394                         break;
395                 if (WARN_ON(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))
396                         break;
397                 drv_get_key_seq(sdata->local, key, &kseq);
398                 params.seq = kseq.hw.seq;
399                 params.seq_len = kseq.hw.seq_len;
400                 break;
401         }
402
403         params.key = key->conf.key;
404         params.key_len = key->conf.keylen;
405
406         callback(cookie, &params);
407         err = 0;
408
409  out:
410         rcu_read_unlock();
411         return err;
412 }
413
414 static int ieee80211_config_default_key(struct wiphy *wiphy,
415                                         struct net_device *dev,
416                                         u8 key_idx, bool uni,
417                                         bool multi)
418 {
419         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
420
421         ieee80211_set_default_key(sdata, key_idx, uni, multi);
422
423         return 0;
424 }
425
426 static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
427                                              struct net_device *dev,
428                                              u8 key_idx)
429 {
430         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
431
432         ieee80211_set_default_mgmt_key(sdata, key_idx);
433
434         return 0;
435 }
436
437 void sta_set_rate_info_tx(struct sta_info *sta,
438                           const struct ieee80211_tx_rate *rate,
439                           struct rate_info *rinfo)
440 {
441         rinfo->flags = 0;
442         if (rate->flags & IEEE80211_TX_RC_MCS) {
443                 rinfo->flags |= RATE_INFO_FLAGS_MCS;
444                 rinfo->mcs = rate->idx;
445         } else if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
446                 rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS;
447                 rinfo->mcs = ieee80211_rate_get_vht_mcs(rate);
448                 rinfo->nss = ieee80211_rate_get_vht_nss(rate);
449         } else {
450                 struct ieee80211_supported_band *sband;
451                 int shift = ieee80211_vif_get_shift(&sta->sdata->vif);
452                 u16 brate;
453
454                 sband = sta->local->hw.wiphy->bands[
455                                 ieee80211_get_sdata_band(sta->sdata)];
456                 brate = sband->bitrates[rate->idx].bitrate;
457                 rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift);
458         }
459         if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
460                 rinfo->bw = RATE_INFO_BW_40;
461         else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
462                 rinfo->bw = RATE_INFO_BW_80;
463         else if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
464                 rinfo->bw = RATE_INFO_BW_160;
465         else
466                 rinfo->bw = RATE_INFO_BW_20;
467         if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
468                 rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
469 }
470
471 static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
472                                   int idx, u8 *mac, struct station_info *sinfo)
473 {
474         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
475         struct ieee80211_local *local = sdata->local;
476         struct sta_info *sta;
477         int ret = -ENOENT;
478
479         mutex_lock(&local->sta_mtx);
480
481         sta = sta_info_get_by_idx(sdata, idx);
482         if (sta) {
483                 ret = 0;
484                 memcpy(mac, sta->sta.addr, ETH_ALEN);
485                 sta_set_sinfo(sta, sinfo);
486         }
487
488         mutex_unlock(&local->sta_mtx);
489
490         return ret;
491 }
492
493 static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
494                                  int idx, struct survey_info *survey)
495 {
496         struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
497
498         return drv_get_survey(local, idx, survey);
499 }
500
501 static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
502                                  const u8 *mac, struct station_info *sinfo)
503 {
504         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
505         struct ieee80211_local *local = sdata->local;
506         struct sta_info *sta;
507         int ret = -ENOENT;
508
509         mutex_lock(&local->sta_mtx);
510
511         sta = sta_info_get_bss(sdata, mac);
512         if (sta) {
513                 ret = 0;
514                 sta_set_sinfo(sta, sinfo);
515         }
516
517         mutex_unlock(&local->sta_mtx);
518
519         return ret;
520 }
521
522 static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
523                                          struct cfg80211_chan_def *chandef)
524 {
525         struct ieee80211_local *local = wiphy_priv(wiphy);
526         struct ieee80211_sub_if_data *sdata;
527         int ret = 0;
528
529         if (cfg80211_chandef_identical(&local->monitor_chandef, chandef))
530                 return 0;
531
532         mutex_lock(&local->mtx);
533         mutex_lock(&local->iflist_mtx);
534         if (local->use_chanctx) {
535                 sdata = rcu_dereference_protected(
536                                 local->monitor_sdata,
537                                 lockdep_is_held(&local->iflist_mtx));
538                 if (sdata) {
539                         ieee80211_vif_release_channel(sdata);
540                         ret = ieee80211_vif_use_channel(sdata, chandef,
541                                         IEEE80211_CHANCTX_EXCLUSIVE);
542                 }
543         } else if (local->open_count == local->monitors) {
544                 local->_oper_chandef = *chandef;
545                 ieee80211_hw_config(local, 0);
546         }
547
548         if (ret == 0)
549                 local->monitor_chandef = *chandef;
550         mutex_unlock(&local->iflist_mtx);
551         mutex_unlock(&local->mtx);
552
553         return ret;
554 }
555
556 static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
557                                     const u8 *resp, size_t resp_len,
558                                     const struct ieee80211_csa_settings *csa)
559 {
560         struct probe_resp *new, *old;
561
562         if (!resp || !resp_len)
563                 return 1;
564
565         old = sdata_dereference(sdata->u.ap.probe_resp, sdata);
566
567         new = kzalloc(sizeof(struct probe_resp) + resp_len, GFP_KERNEL);
568         if (!new)
569                 return -ENOMEM;
570
571         new->len = resp_len;
572         memcpy(new->data, resp, resp_len);
573
574         if (csa)
575                 memcpy(new->csa_counter_offsets, csa->counter_offsets_presp,
576                        csa->n_counter_offsets_presp *
577                        sizeof(new->csa_counter_offsets[0]));
578
579         rcu_assign_pointer(sdata->u.ap.probe_resp, new);
580         if (old)
581                 kfree_rcu(old, rcu_head);
582
583         return 0;
584 }
585
586 static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
587                                    struct cfg80211_beacon_data *params,
588                                    const struct ieee80211_csa_settings *csa)
589 {
590         struct beacon_data *new, *old;
591         int new_head_len, new_tail_len;
592         int size, err;
593         u32 changed = BSS_CHANGED_BEACON;
594
595         old = sdata_dereference(sdata->u.ap.beacon, sdata);
596
597
598         /* Need to have a beacon head if we don't have one yet */
599         if (!params->head && !old)
600                 return -EINVAL;
601
602         /* new or old head? */
603         if (params->head)
604                 new_head_len = params->head_len;
605         else
606                 new_head_len = old->head_len;
607
608         /* new or old tail? */
609         if (params->tail || !old)
610                 /* params->tail_len will be zero for !params->tail */
611                 new_tail_len = params->tail_len;
612         else
613                 new_tail_len = old->tail_len;
614
615         size = sizeof(*new) + new_head_len + new_tail_len;
616
617         new = kzalloc(size, GFP_KERNEL);
618         if (!new)
619                 return -ENOMEM;
620
621         /* start filling the new info now */
622
623         /*
624          * pointers go into the block we allocated,
625          * memory is | beacon_data | head | tail |
626          */
627         new->head = ((u8 *) new) + sizeof(*new);
628         new->tail = new->head + new_head_len;
629         new->head_len = new_head_len;
630         new->tail_len = new_tail_len;
631
632         if (csa) {
633                 new->csa_current_counter = csa->count;
634                 memcpy(new->csa_counter_offsets, csa->counter_offsets_beacon,
635                        csa->n_counter_offsets_beacon *
636                        sizeof(new->csa_counter_offsets[0]));
637         }
638
639         /* copy in head */
640         if (params->head)
641                 memcpy(new->head, params->head, new_head_len);
642         else
643                 memcpy(new->head, old->head, new_head_len);
644
645         /* copy in optional tail */
646         if (params->tail)
647                 memcpy(new->tail, params->tail, new_tail_len);
648         else
649                 if (old)
650                         memcpy(new->tail, old->tail, new_tail_len);
651
652         err = ieee80211_set_probe_resp(sdata, params->probe_resp,
653                                        params->probe_resp_len, csa);
654         if (err < 0)
655                 return err;
656         if (err == 0)
657                 changed |= BSS_CHANGED_AP_PROBE_RESP;
658
659         rcu_assign_pointer(sdata->u.ap.beacon, new);
660
661         if (old)
662                 kfree_rcu(old, rcu_head);
663
664         return changed;
665 }
666
667 static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
668                               struct cfg80211_ap_settings *params)
669 {
670         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
671         struct ieee80211_local *local = sdata->local;
672         struct beacon_data *old;
673         struct ieee80211_sub_if_data *vlan;
674         u32 changed = BSS_CHANGED_BEACON_INT |
675                       BSS_CHANGED_BEACON_ENABLED |
676                       BSS_CHANGED_BEACON |
677                       BSS_CHANGED_SSID |
678                       BSS_CHANGED_P2P_PS |
679                       BSS_CHANGED_TXPOWER;
680         int err;
681
682         old = sdata_dereference(sdata->u.ap.beacon, sdata);
683         if (old)
684                 return -EALREADY;
685
686         switch (params->smps_mode) {
687         case NL80211_SMPS_OFF:
688                 sdata->smps_mode = IEEE80211_SMPS_OFF;
689                 break;
690         case NL80211_SMPS_STATIC:
691                 sdata->smps_mode = IEEE80211_SMPS_STATIC;
692                 break;
693         case NL80211_SMPS_DYNAMIC:
694                 sdata->smps_mode = IEEE80211_SMPS_DYNAMIC;
695                 break;
696         default:
697                 return -EINVAL;
698         }
699         sdata->needed_rx_chains = sdata->local->rx_chains;
700
701         mutex_lock(&local->mtx);
702         err = ieee80211_vif_use_channel(sdata, &params->chandef,
703                                         IEEE80211_CHANCTX_SHARED);
704         if (!err)
705                 ieee80211_vif_copy_chanctx_to_vlans(sdata, false);
706         mutex_unlock(&local->mtx);
707         if (err)
708                 return err;
709
710         /*
711          * Apply control port protocol, this allows us to
712          * not encrypt dynamic WEP control frames.
713          */
714         sdata->control_port_protocol = params->crypto.control_port_ethertype;
715         sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt;
716         sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local,
717                                                         &params->crypto,
718                                                         sdata->vif.type);
719
720         list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) {
721                 vlan->control_port_protocol =
722                         params->crypto.control_port_ethertype;
723                 vlan->control_port_no_encrypt =
724                         params->crypto.control_port_no_encrypt;
725                 vlan->encrypt_headroom =
726                         ieee80211_cs_headroom(sdata->local,
727                                               &params->crypto,
728                                               vlan->vif.type);
729         }
730
731         sdata->vif.bss_conf.beacon_int = params->beacon_interval;
732         sdata->vif.bss_conf.dtim_period = params->dtim_period;
733         sdata->vif.bss_conf.enable_beacon = true;
734
735         sdata->vif.bss_conf.ssid_len = params->ssid_len;
736         if (params->ssid_len)
737                 memcpy(sdata->vif.bss_conf.ssid, params->ssid,
738                        params->ssid_len);
739         sdata->vif.bss_conf.hidden_ssid =
740                 (params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE);
741
742         memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
743                sizeof(sdata->vif.bss_conf.p2p_noa_attr));
744         sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow =
745                 params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
746         if (params->p2p_opp_ps)
747                 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
748                                         IEEE80211_P2P_OPPPS_ENABLE_BIT;
749
750         err = ieee80211_assign_beacon(sdata, &params->beacon, NULL);
751         if (err < 0) {
752                 ieee80211_vif_release_channel(sdata);
753                 return err;
754         }
755         changed |= err;
756
757         err = drv_start_ap(sdata->local, sdata);
758         if (err) {
759                 old = sdata_dereference(sdata->u.ap.beacon, sdata);
760
761                 if (old)
762                         kfree_rcu(old, rcu_head);
763                 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
764                 ieee80211_vif_release_channel(sdata);
765                 return err;
766         }
767
768         ieee80211_recalc_dtim(local, sdata);
769         ieee80211_bss_info_change_notify(sdata, changed);
770
771         netif_carrier_on(dev);
772         list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
773                 netif_carrier_on(vlan->dev);
774
775         return 0;
776 }
777
778 static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
779                                    struct cfg80211_beacon_data *params)
780 {
781         struct ieee80211_sub_if_data *sdata;
782         struct beacon_data *old;
783         int err;
784
785         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
786         sdata_assert_lock(sdata);
787
788         /* don't allow changing the beacon while CSA is in place - offset
789          * of channel switch counter may change
790          */
791         if (sdata->vif.csa_active)
792                 return -EBUSY;
793
794         old = sdata_dereference(sdata->u.ap.beacon, sdata);
795         if (!old)
796                 return -ENOENT;
797
798         err = ieee80211_assign_beacon(sdata, params, NULL);
799         if (err < 0)
800                 return err;
801         ieee80211_bss_info_change_notify(sdata, err);
802         return 0;
803 }
804
805 static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
806 {
807         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
808         struct ieee80211_sub_if_data *vlan;
809         struct ieee80211_local *local = sdata->local;
810         struct beacon_data *old_beacon;
811         struct probe_resp *old_probe_resp;
812         struct cfg80211_chan_def chandef;
813
814         sdata_assert_lock(sdata);
815
816         old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata);
817         if (!old_beacon)
818                 return -ENOENT;
819         old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata);
820
821         /* abort any running channel switch */
822         mutex_lock(&local->mtx);
823         sdata->vif.csa_active = false;
824         if (sdata->csa_block_tx) {
825                 ieee80211_wake_vif_queues(local, sdata,
826                                           IEEE80211_QUEUE_STOP_REASON_CSA);
827                 sdata->csa_block_tx = false;
828         }
829
830         mutex_unlock(&local->mtx);
831
832         kfree(sdata->u.ap.next_beacon);
833         sdata->u.ap.next_beacon = NULL;
834
835         /* turn off carrier for this interface and dependent VLANs */
836         list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
837                 netif_carrier_off(vlan->dev);
838         netif_carrier_off(dev);
839
840         /* remove beacon and probe response */
841         RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
842         RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL);
843         kfree_rcu(old_beacon, rcu_head);
844         if (old_probe_resp)
845                 kfree_rcu(old_probe_resp, rcu_head);
846         sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
847
848         __sta_info_flush(sdata, true);
849         ieee80211_free_keys(sdata, true);
850
851         sdata->vif.bss_conf.enable_beacon = false;
852         sdata->vif.bss_conf.ssid_len = 0;
853         clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
854         ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
855
856         if (sdata->wdev.cac_started) {
857                 chandef = sdata->vif.bss_conf.chandef;
858                 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
859                 cfg80211_cac_event(sdata->dev, &chandef,
860                                    NL80211_RADAR_CAC_ABORTED,
861                                    GFP_KERNEL);
862         }
863
864         drv_stop_ap(sdata->local, sdata);
865
866         /* free all potentially still buffered bcast frames */
867         local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf);
868         skb_queue_purge(&sdata->u.ap.ps.bc_buf);
869
870         mutex_lock(&local->mtx);
871         ieee80211_vif_copy_chanctx_to_vlans(sdata, true);
872         ieee80211_vif_release_channel(sdata);
873         mutex_unlock(&local->mtx);
874
875         return 0;
876 }
877
878 /* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
879 struct iapp_layer2_update {
880         u8 da[ETH_ALEN];        /* broadcast */
881         u8 sa[ETH_ALEN];        /* STA addr */
882         __be16 len;             /* 6 */
883         u8 dsap;                /* 0 */
884         u8 ssap;                /* 0 */
885         u8 control;
886         u8 xid_info[3];
887 } __packed;
888
889 static void ieee80211_send_layer2_update(struct sta_info *sta)
890 {
891         struct iapp_layer2_update *msg;
892         struct sk_buff *skb;
893
894         /* Send Level 2 Update Frame to update forwarding tables in layer 2
895          * bridge devices */
896
897         skb = dev_alloc_skb(sizeof(*msg));
898         if (!skb)
899                 return;
900         msg = (struct iapp_layer2_update *)skb_put(skb, sizeof(*msg));
901
902         /* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
903          * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
904
905         eth_broadcast_addr(msg->da);
906         memcpy(msg->sa, sta->sta.addr, ETH_ALEN);
907         msg->len = htons(6);
908         msg->dsap = 0;
909         msg->ssap = 0x01;       /* NULL LSAP, CR Bit: Response */
910         msg->control = 0xaf;    /* XID response lsb.1111F101.
911                                  * F=0 (no poll command; unsolicited frame) */
912         msg->xid_info[0] = 0x81;        /* XID format identifier */
913         msg->xid_info[1] = 1;   /* LLC types/classes: Type 1 LLC */
914         msg->xid_info[2] = 0;   /* XID sender's receive window size (RW) */
915
916         skb->dev = sta->sdata->dev;
917         skb->protocol = eth_type_trans(skb, sta->sdata->dev);
918         memset(skb->cb, 0, sizeof(skb->cb));
919         netif_rx_ni(skb);
920 }
921
922 static int sta_apply_auth_flags(struct ieee80211_local *local,
923                                 struct sta_info *sta,
924                                 u32 mask, u32 set)
925 {
926         int ret;
927
928         if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
929             set & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
930             !test_sta_flag(sta, WLAN_STA_AUTH)) {
931                 ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
932                 if (ret)
933                         return ret;
934         }
935
936         if (mask & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
937             set & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
938             !test_sta_flag(sta, WLAN_STA_ASSOC)) {
939                 /*
940                  * When peer becomes associated, init rate control as
941                  * well. Some drivers require rate control initialized
942                  * before drv_sta_state() is called.
943                  */
944                 if (!test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
945                         rate_control_rate_init(sta);
946
947                 ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
948                 if (ret)
949                         return ret;
950         }
951
952         if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
953                 if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
954                         ret = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
955                 else if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
956                         ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
957                 else
958                         ret = 0;
959                 if (ret)
960                         return ret;
961         }
962
963         if (mask & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
964             !(set & BIT(NL80211_STA_FLAG_ASSOCIATED)) &&
965             test_sta_flag(sta, WLAN_STA_ASSOC)) {
966                 ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
967                 if (ret)
968                         return ret;
969         }
970
971         if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
972             !(set & BIT(NL80211_STA_FLAG_AUTHENTICATED)) &&
973             test_sta_flag(sta, WLAN_STA_AUTH)) {
974                 ret = sta_info_move_state(sta, IEEE80211_STA_NONE);
975                 if (ret)
976                         return ret;
977         }
978
979         return 0;
980 }
981
982 static void sta_apply_mesh_params(struct ieee80211_local *local,
983                                   struct sta_info *sta,
984                                   struct station_parameters *params)
985 {
986 #ifdef CONFIG_MAC80211_MESH
987         struct ieee80211_sub_if_data *sdata = sta->sdata;
988         u32 changed = 0;
989
990         if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) {
991                 switch (params->plink_state) {
992                 case NL80211_PLINK_ESTAB:
993                         if (sta->mesh->plink_state != NL80211_PLINK_ESTAB)
994                                 changed = mesh_plink_inc_estab_count(sdata);
995                         sta->mesh->plink_state = params->plink_state;
996
997                         ieee80211_mps_sta_status_update(sta);
998                         changed |= ieee80211_mps_set_sta_local_pm(sta,
999                                       sdata->u.mesh.mshcfg.power_mode);
1000                         break;
1001                 case NL80211_PLINK_LISTEN:
1002                 case NL80211_PLINK_BLOCKED:
1003                 case NL80211_PLINK_OPN_SNT:
1004                 case NL80211_PLINK_OPN_RCVD:
1005                 case NL80211_PLINK_CNF_RCVD:
1006                 case NL80211_PLINK_HOLDING:
1007                         if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
1008                                 changed = mesh_plink_dec_estab_count(sdata);
1009                         sta->mesh->plink_state = params->plink_state;
1010
1011                         ieee80211_mps_sta_status_update(sta);
1012                         changed |= ieee80211_mps_set_sta_local_pm(sta,
1013                                         NL80211_MESH_POWER_UNKNOWN);
1014                         break;
1015                 default:
1016                         /*  nothing  */
1017                         break;
1018                 }
1019         }
1020
1021         switch (params->plink_action) {
1022         case NL80211_PLINK_ACTION_NO_ACTION:
1023                 /* nothing */
1024                 break;
1025         case NL80211_PLINK_ACTION_OPEN:
1026                 changed |= mesh_plink_open(sta);
1027                 break;
1028         case NL80211_PLINK_ACTION_BLOCK:
1029                 changed |= mesh_plink_block(sta);
1030                 break;
1031         }
1032
1033         if (params->local_pm)
1034                 changed |= ieee80211_mps_set_sta_local_pm(sta,
1035                                                           params->local_pm);
1036
1037         ieee80211_mbss_info_change_notify(sdata, changed);
1038 #endif
1039 }
1040
1041 static int sta_apply_parameters(struct ieee80211_local *local,
1042                                 struct sta_info *sta,
1043                                 struct station_parameters *params)
1044 {
1045         int ret = 0;
1046         struct ieee80211_supported_band *sband;
1047         struct ieee80211_sub_if_data *sdata = sta->sdata;
1048         enum ieee80211_band band = ieee80211_get_sdata_band(sdata);
1049         u32 mask, set;
1050
1051         sband = local->hw.wiphy->bands[band];
1052
1053         mask = params->sta_flags_mask;
1054         set = params->sta_flags_set;
1055
1056         if (ieee80211_vif_is_mesh(&sdata->vif)) {
1057                 /*
1058                  * In mesh mode, ASSOCIATED isn't part of the nl80211
1059                  * API but must follow AUTHENTICATED for driver state.
1060                  */
1061                 if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED))
1062                         mask |= BIT(NL80211_STA_FLAG_ASSOCIATED);
1063                 if (set & BIT(NL80211_STA_FLAG_AUTHENTICATED))
1064                         set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
1065         } else if (test_sta_flag(sta, WLAN_STA_TDLS_PEER)) {
1066                 /*
1067                  * TDLS -- everything follows authorized, but
1068                  * only becoming authorized is possible, not
1069                  * going back
1070                  */
1071                 if (set & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1072                         set |= BIT(NL80211_STA_FLAG_AUTHENTICATED) |
1073                                BIT(NL80211_STA_FLAG_ASSOCIATED);
1074                         mask |= BIT(NL80211_STA_FLAG_AUTHENTICATED) |
1075                                 BIT(NL80211_STA_FLAG_ASSOCIATED);
1076                 }
1077         }
1078
1079         if (mask & BIT(NL80211_STA_FLAG_WME) &&
1080             local->hw.queues >= IEEE80211_NUM_ACS)
1081                 sta->sta.wme = set & BIT(NL80211_STA_FLAG_WME);
1082
1083         /* auth flags will be set later for TDLS,
1084          * and for unassociated stations that move to assocaited */
1085         if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1086             !((mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) &&
1087               (set & BIT(NL80211_STA_FLAG_ASSOCIATED)))) {
1088                 ret = sta_apply_auth_flags(local, sta, mask, set);
1089                 if (ret)
1090                         return ret;
1091         }
1092
1093         if (mask & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE)) {
1094                 if (set & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE))
1095                         set_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE);
1096                 else
1097                         clear_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE);
1098         }
1099
1100         if (mask & BIT(NL80211_STA_FLAG_MFP)) {
1101                 sta->sta.mfp = !!(set & BIT(NL80211_STA_FLAG_MFP));
1102                 if (set & BIT(NL80211_STA_FLAG_MFP))
1103                         set_sta_flag(sta, WLAN_STA_MFP);
1104                 else
1105                         clear_sta_flag(sta, WLAN_STA_MFP);
1106         }
1107
1108         if (mask & BIT(NL80211_STA_FLAG_TDLS_PEER)) {
1109                 if (set & BIT(NL80211_STA_FLAG_TDLS_PEER))
1110                         set_sta_flag(sta, WLAN_STA_TDLS_PEER);
1111                 else
1112                         clear_sta_flag(sta, WLAN_STA_TDLS_PEER);
1113         }
1114
1115         /* mark TDLS channel switch support, if the AP allows it */
1116         if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1117             !sdata->u.mgd.tdls_chan_switch_prohibited &&
1118             params->ext_capab_len >= 4 &&
1119             params->ext_capab[3] & WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH)
1120                 set_sta_flag(sta, WLAN_STA_TDLS_CHAN_SWITCH);
1121
1122         if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1123             !sdata->u.mgd.tdls_wider_bw_prohibited &&
1124             ieee80211_hw_check(&local->hw, TDLS_WIDER_BW) &&
1125             params->ext_capab_len >= 8 &&
1126             params->ext_capab[7] & WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED)
1127                 set_sta_flag(sta, WLAN_STA_TDLS_WIDER_BW);
1128
1129         if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) {
1130                 sta->sta.uapsd_queues = params->uapsd_queues;
1131                 sta->sta.max_sp = params->max_sp;
1132         }
1133
1134         /* The sender might not have sent the last bit, consider it to be 0 */
1135         if (params->ext_capab_len >= 8) {
1136                 u8 val = (params->ext_capab[7] &
1137                           WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB) >> 7;
1138
1139                 /* we did get all the bits, take the MSB as well */
1140                 if (params->ext_capab_len >= 9) {
1141                         u8 val_msb = params->ext_capab[8] &
1142                                 WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB;
1143                         val_msb <<= 1;
1144                         val |= val_msb;
1145                 }
1146
1147                 switch (val) {
1148                 case 1:
1149                         sta->sta.max_amsdu_subframes = 32;
1150                         break;
1151                 case 2:
1152                         sta->sta.max_amsdu_subframes = 16;
1153                         break;
1154                 case 3:
1155                         sta->sta.max_amsdu_subframes = 8;
1156                         break;
1157                 default:
1158                         sta->sta.max_amsdu_subframes = 0;
1159                 }
1160         }
1161
1162         /*
1163          * cfg80211 validates this (1-2007) and allows setting the AID
1164          * only when creating a new station entry
1165          */
1166         if (params->aid)
1167                 sta->sta.aid = params->aid;
1168
1169         /*
1170          * Some of the following updates would be racy if called on an
1171          * existing station, via ieee80211_change_station(). However,
1172          * all such changes are rejected by cfg80211 except for updates
1173          * changing the supported rates on an existing but not yet used
1174          * TDLS peer.
1175          */
1176
1177         if (params->listen_interval >= 0)
1178                 sta->listen_interval = params->listen_interval;
1179
1180         if (params->supported_rates) {
1181                 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
1182                                          sband, params->supported_rates,
1183                                          params->supported_rates_len,
1184                                          &sta->sta.supp_rates[band]);
1185         }
1186
1187         if (params->ht_capa)
1188                 ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
1189                                                   params->ht_capa, sta);
1190
1191         /* VHT can override some HT caps such as the A-MSDU max length */
1192         if (params->vht_capa)
1193                 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
1194                                                     params->vht_capa, sta);
1195
1196         if (params->opmode_notif_used) {
1197                 /* returned value is only needed for rc update, but the
1198                  * rc isn't initialized here yet, so ignore it
1199                  */
1200                 __ieee80211_vht_handle_opmode(sdata, sta,
1201                                               params->opmode_notif, band);
1202         }
1203
1204         if (ieee80211_vif_is_mesh(&sdata->vif))
1205                 sta_apply_mesh_params(local, sta, params);
1206
1207         /* set the STA state after all sta info from usermode has been set */
1208         if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) ||
1209             set & BIT(NL80211_STA_FLAG_ASSOCIATED)) {
1210                 ret = sta_apply_auth_flags(local, sta, mask, set);
1211                 if (ret)
1212                         return ret;
1213         }
1214
1215         return 0;
1216 }
1217
1218 static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
1219                                  const u8 *mac,
1220                                  struct station_parameters *params)
1221 {
1222         struct ieee80211_local *local = wiphy_priv(wiphy);
1223         struct sta_info *sta;
1224         struct ieee80211_sub_if_data *sdata;
1225         int err;
1226         int layer2_update;
1227
1228         if (params->vlan) {
1229                 sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
1230
1231                 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
1232                     sdata->vif.type != NL80211_IFTYPE_AP)
1233                         return -EINVAL;
1234         } else
1235                 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1236
1237         if (ether_addr_equal(mac, sdata->vif.addr))
1238                 return -EINVAL;
1239
1240         if (is_multicast_ether_addr(mac))
1241                 return -EINVAL;
1242
1243         sta = sta_info_alloc(sdata, mac, GFP_KERNEL);
1244         if (!sta)
1245                 return -ENOMEM;
1246
1247         if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
1248                 sta->sta.tdls = true;
1249
1250         err = sta_apply_parameters(local, sta, params);
1251         if (err) {
1252                 sta_info_free(local, sta);
1253                 return err;
1254         }
1255
1256         /*
1257          * for TDLS and for unassociated station, rate control should be
1258          * initialized only when rates are known and station is marked
1259          * authorized/associated
1260          */
1261         if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1262             test_sta_flag(sta, WLAN_STA_ASSOC))
1263                 rate_control_rate_init(sta);
1264
1265         layer2_update = sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
1266                 sdata->vif.type == NL80211_IFTYPE_AP;
1267
1268         err = sta_info_insert_rcu(sta);
1269         if (err) {
1270                 rcu_read_unlock();
1271                 return err;
1272         }
1273
1274         if (layer2_update)
1275                 ieee80211_send_layer2_update(sta);
1276
1277         rcu_read_unlock();
1278
1279         return 0;
1280 }
1281
1282 static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
1283                                  struct station_del_parameters *params)
1284 {
1285         struct ieee80211_sub_if_data *sdata;
1286
1287         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1288
1289         if (params->mac)
1290                 return sta_info_destroy_addr_bss(sdata, params->mac);
1291
1292         sta_info_flush(sdata);
1293         return 0;
1294 }
1295
1296 static int ieee80211_change_station(struct wiphy *wiphy,
1297                                     struct net_device *dev, const u8 *mac,
1298                                     struct station_parameters *params)
1299 {
1300         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1301         struct ieee80211_local *local = wiphy_priv(wiphy);
1302         struct sta_info *sta;
1303         struct ieee80211_sub_if_data *vlansdata;
1304         enum cfg80211_station_type statype;
1305         int err;
1306
1307         mutex_lock(&local->sta_mtx);
1308
1309         sta = sta_info_get_bss(sdata, mac);
1310         if (!sta) {
1311                 err = -ENOENT;
1312                 goto out_err;
1313         }
1314
1315         switch (sdata->vif.type) {
1316         case NL80211_IFTYPE_MESH_POINT:
1317                 if (sdata->u.mesh.user_mpm)
1318                         statype = CFG80211_STA_MESH_PEER_USER;
1319                 else
1320                         statype = CFG80211_STA_MESH_PEER_KERNEL;
1321                 break;
1322         case NL80211_IFTYPE_ADHOC:
1323                 statype = CFG80211_STA_IBSS;
1324                 break;
1325         case NL80211_IFTYPE_STATION:
1326                 if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER)) {
1327                         statype = CFG80211_STA_AP_STA;
1328                         break;
1329                 }
1330                 if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
1331                         statype = CFG80211_STA_TDLS_PEER_ACTIVE;
1332                 else
1333                         statype = CFG80211_STA_TDLS_PEER_SETUP;
1334                 break;
1335         case NL80211_IFTYPE_AP:
1336         case NL80211_IFTYPE_AP_VLAN:
1337                 if (test_sta_flag(sta, WLAN_STA_ASSOC))
1338                         statype = CFG80211_STA_AP_CLIENT;
1339                 else
1340                         statype = CFG80211_STA_AP_CLIENT_UNASSOC;
1341                 break;
1342         default:
1343                 err = -EOPNOTSUPP;
1344                 goto out_err;
1345         }
1346
1347         err = cfg80211_check_station_change(wiphy, params, statype);
1348         if (err)
1349                 goto out_err;
1350
1351         if (params->vlan && params->vlan != sta->sdata->dev) {
1352                 bool prev_4addr = false;
1353                 bool new_4addr = false;
1354
1355                 vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
1356
1357                 if (params->vlan->ieee80211_ptr->use_4addr) {
1358                         if (vlansdata->u.vlan.sta) {
1359                                 err = -EBUSY;
1360                                 goto out_err;
1361                         }
1362
1363                         rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
1364                         new_4addr = true;
1365                 }
1366
1367                 if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
1368                     sta->sdata->u.vlan.sta) {
1369                         RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL);
1370                         prev_4addr = true;
1371                 }
1372
1373                 sta->sdata = vlansdata;
1374                 ieee80211_check_fast_xmit(sta);
1375
1376                 if (sta->sta_state == IEEE80211_STA_AUTHORIZED &&
1377                     prev_4addr != new_4addr) {
1378                         if (new_4addr)
1379                                 atomic_dec(&sta->sdata->bss->num_mcast_sta);
1380                         else
1381                                 atomic_inc(&sta->sdata->bss->num_mcast_sta);
1382                 }
1383
1384                 ieee80211_send_layer2_update(sta);
1385         }
1386
1387         err = sta_apply_parameters(local, sta, params);
1388         if (err)
1389                 goto out_err;
1390
1391         mutex_unlock(&local->sta_mtx);
1392
1393         if ((sdata->vif.type == NL80211_IFTYPE_AP ||
1394              sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
1395             sta->known_smps_mode != sta->sdata->bss->req_smps &&
1396             test_sta_flag(sta, WLAN_STA_AUTHORIZED) &&
1397             sta_info_tx_streams(sta) != 1) {
1398                 ht_dbg(sta->sdata,
1399                        "%pM just authorized and MIMO capable - update SMPS\n",
1400                        sta->sta.addr);
1401                 ieee80211_send_smps_action(sta->sdata,
1402                         sta->sdata->bss->req_smps,
1403                         sta->sta.addr,
1404                         sta->sdata->vif.bss_conf.bssid);
1405         }
1406
1407         if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1408             params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1409                 ieee80211_recalc_ps(local);
1410                 ieee80211_recalc_ps_vif(sdata);
1411         }
1412
1413         return 0;
1414 out_err:
1415         mutex_unlock(&local->sta_mtx);
1416         return err;
1417 }
1418
1419 #ifdef CONFIG_MAC80211_MESH
1420 static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
1421                                const u8 *dst, const u8 *next_hop)
1422 {
1423         struct ieee80211_sub_if_data *sdata;
1424         struct mesh_path *mpath;
1425         struct sta_info *sta;
1426
1427         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1428
1429         rcu_read_lock();
1430         sta = sta_info_get(sdata, next_hop);
1431         if (!sta) {
1432                 rcu_read_unlock();
1433                 return -ENOENT;
1434         }
1435
1436         mpath = mesh_path_add(sdata, dst);
1437         if (IS_ERR(mpath)) {
1438                 rcu_read_unlock();
1439                 return PTR_ERR(mpath);
1440         }
1441
1442         mesh_path_fix_nexthop(mpath, sta);
1443
1444         rcu_read_unlock();
1445         return 0;
1446 }
1447
1448 static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev,
1449                                const u8 *dst)
1450 {
1451         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1452
1453         if (dst)
1454                 return mesh_path_del(sdata, dst);
1455
1456         mesh_path_flush_by_iface(sdata);
1457         return 0;
1458 }
1459
1460 static int ieee80211_change_mpath(struct wiphy *wiphy, struct net_device *dev,
1461                                   const u8 *dst, const u8 *next_hop)
1462 {
1463         struct ieee80211_sub_if_data *sdata;
1464         struct mesh_path *mpath;
1465         struct sta_info *sta;
1466
1467         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1468
1469         rcu_read_lock();
1470
1471         sta = sta_info_get(sdata, next_hop);
1472         if (!sta) {
1473                 rcu_read_unlock();
1474                 return -ENOENT;
1475         }
1476
1477         mpath = mesh_path_lookup(sdata, dst);
1478         if (!mpath) {
1479                 rcu_read_unlock();
1480                 return -ENOENT;
1481         }
1482
1483         mesh_path_fix_nexthop(mpath, sta);
1484
1485         rcu_read_unlock();
1486         return 0;
1487 }
1488
1489 static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
1490                             struct mpath_info *pinfo)
1491 {
1492         struct sta_info *next_hop_sta = rcu_dereference(mpath->next_hop);
1493
1494         if (next_hop_sta)
1495                 memcpy(next_hop, next_hop_sta->sta.addr, ETH_ALEN);
1496         else
1497                 eth_zero_addr(next_hop);
1498
1499         memset(pinfo, 0, sizeof(*pinfo));
1500
1501         pinfo->generation = mesh_paths_generation;
1502
1503         pinfo->filled = MPATH_INFO_FRAME_QLEN |
1504                         MPATH_INFO_SN |
1505                         MPATH_INFO_METRIC |
1506                         MPATH_INFO_EXPTIME |
1507                         MPATH_INFO_DISCOVERY_TIMEOUT |
1508                         MPATH_INFO_DISCOVERY_RETRIES |
1509                         MPATH_INFO_FLAGS;
1510
1511         pinfo->frame_qlen = mpath->frame_queue.qlen;
1512         pinfo->sn = mpath->sn;
1513         pinfo->metric = mpath->metric;
1514         if (time_before(jiffies, mpath->exp_time))
1515                 pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies);
1516         pinfo->discovery_timeout =
1517                         jiffies_to_msecs(mpath->discovery_timeout);
1518         pinfo->discovery_retries = mpath->discovery_retries;
1519         if (mpath->flags & MESH_PATH_ACTIVE)
1520                 pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE;
1521         if (mpath->flags & MESH_PATH_RESOLVING)
1522                 pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
1523         if (mpath->flags & MESH_PATH_SN_VALID)
1524                 pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID;
1525         if (mpath->flags & MESH_PATH_FIXED)
1526                 pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
1527         if (mpath->flags & MESH_PATH_RESOLVED)
1528                 pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED;
1529 }
1530
1531 static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
1532                                u8 *dst, u8 *next_hop, struct mpath_info *pinfo)
1533
1534 {
1535         struct ieee80211_sub_if_data *sdata;
1536         struct mesh_path *mpath;
1537
1538         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1539
1540         rcu_read_lock();
1541         mpath = mesh_path_lookup(sdata, dst);
1542         if (!mpath) {
1543                 rcu_read_unlock();
1544                 return -ENOENT;
1545         }
1546         memcpy(dst, mpath->dst, ETH_ALEN);
1547         mpath_set_pinfo(mpath, next_hop, pinfo);
1548         rcu_read_unlock();
1549         return 0;
1550 }
1551
1552 static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
1553                                 int idx, u8 *dst, u8 *next_hop,
1554                                 struct mpath_info *pinfo)
1555 {
1556         struct ieee80211_sub_if_data *sdata;
1557         struct mesh_path *mpath;
1558
1559         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1560
1561         rcu_read_lock();
1562         mpath = mesh_path_lookup_by_idx(sdata, idx);
1563         if (!mpath) {
1564                 rcu_read_unlock();
1565                 return -ENOENT;
1566         }
1567         memcpy(dst, mpath->dst, ETH_ALEN);
1568         mpath_set_pinfo(mpath, next_hop, pinfo);
1569         rcu_read_unlock();
1570         return 0;
1571 }
1572
1573 static void mpp_set_pinfo(struct mesh_path *mpath, u8 *mpp,
1574                           struct mpath_info *pinfo)
1575 {
1576         memset(pinfo, 0, sizeof(*pinfo));
1577         memcpy(mpp, mpath->mpp, ETH_ALEN);
1578
1579         pinfo->generation = mpp_paths_generation;
1580 }
1581
1582 static int ieee80211_get_mpp(struct wiphy *wiphy, struct net_device *dev,
1583                              u8 *dst, u8 *mpp, struct mpath_info *pinfo)
1584
1585 {
1586         struct ieee80211_sub_if_data *sdata;
1587         struct mesh_path *mpath;
1588
1589         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1590
1591         rcu_read_lock();
1592         mpath = mpp_path_lookup(sdata, dst);
1593         if (!mpath) {
1594                 rcu_read_unlock();
1595                 return -ENOENT;
1596         }
1597         memcpy(dst, mpath->dst, ETH_ALEN);
1598         mpp_set_pinfo(mpath, mpp, pinfo);
1599         rcu_read_unlock();
1600         return 0;
1601 }
1602
1603 static int ieee80211_dump_mpp(struct wiphy *wiphy, struct net_device *dev,
1604                               int idx, u8 *dst, u8 *mpp,
1605                               struct mpath_info *pinfo)
1606 {
1607         struct ieee80211_sub_if_data *sdata;
1608         struct mesh_path *mpath;
1609
1610         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1611
1612         rcu_read_lock();
1613         mpath = mpp_path_lookup_by_idx(sdata, idx);
1614         if (!mpath) {
1615                 rcu_read_unlock();
1616                 return -ENOENT;
1617         }
1618         memcpy(dst, mpath->dst, ETH_ALEN);
1619         mpp_set_pinfo(mpath, mpp, pinfo);
1620         rcu_read_unlock();
1621         return 0;
1622 }
1623
1624 static int ieee80211_get_mesh_config(struct wiphy *wiphy,
1625                                 struct net_device *dev,
1626                                 struct mesh_config *conf)
1627 {
1628         struct ieee80211_sub_if_data *sdata;
1629         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1630
1631         memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config));
1632         return 0;
1633 }
1634
1635 static inline bool _chg_mesh_attr(enum nl80211_meshconf_params parm, u32 mask)
1636 {
1637         return (mask >> (parm-1)) & 0x1;
1638 }
1639
1640 static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh,
1641                 const struct mesh_setup *setup)
1642 {
1643         u8 *new_ie;
1644         const u8 *old_ie;
1645         struct ieee80211_sub_if_data *sdata = container_of(ifmsh,
1646                                         struct ieee80211_sub_if_data, u.mesh);
1647
1648         /* allocate information elements */
1649         new_ie = NULL;
1650         old_ie = ifmsh->ie;
1651
1652         if (setup->ie_len) {
1653                 new_ie = kmemdup(setup->ie, setup->ie_len,
1654                                 GFP_KERNEL);
1655                 if (!new_ie)
1656                         return -ENOMEM;
1657         }
1658         ifmsh->ie_len = setup->ie_len;
1659         ifmsh->ie = new_ie;
1660         kfree(old_ie);
1661
1662         /* now copy the rest of the setup parameters */
1663         ifmsh->mesh_id_len = setup->mesh_id_len;
1664         memcpy(ifmsh->mesh_id, setup->mesh_id, ifmsh->mesh_id_len);
1665         ifmsh->mesh_sp_id = setup->sync_method;
1666         ifmsh->mesh_pp_id = setup->path_sel_proto;
1667         ifmsh->mesh_pm_id = setup->path_metric;
1668         ifmsh->user_mpm = setup->user_mpm;
1669         ifmsh->mesh_auth_id = setup->auth_id;
1670         ifmsh->security = IEEE80211_MESH_SEC_NONE;
1671         if (setup->is_authenticated)
1672                 ifmsh->security |= IEEE80211_MESH_SEC_AUTHED;
1673         if (setup->is_secure)
1674                 ifmsh->security |= IEEE80211_MESH_SEC_SECURED;
1675
1676         /* mcast rate setting in Mesh Node */
1677         memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate,
1678                                                 sizeof(setup->mcast_rate));
1679         sdata->vif.bss_conf.basic_rates = setup->basic_rates;
1680
1681         sdata->vif.bss_conf.beacon_int = setup->beacon_interval;
1682         sdata->vif.bss_conf.dtim_period = setup->dtim_period;
1683
1684         return 0;
1685 }
1686
1687 static int ieee80211_update_mesh_config(struct wiphy *wiphy,
1688                                         struct net_device *dev, u32 mask,
1689                                         const struct mesh_config *nconf)
1690 {
1691         struct mesh_config *conf;
1692         struct ieee80211_sub_if_data *sdata;
1693         struct ieee80211_if_mesh *ifmsh;
1694
1695         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1696         ifmsh = &sdata->u.mesh;
1697
1698         /* Set the config options which we are interested in setting */
1699         conf = &(sdata->u.mesh.mshcfg);
1700         if (_chg_mesh_attr(NL80211_MESHCONF_RETRY_TIMEOUT, mask))
1701                 conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout;
1702         if (_chg_mesh_attr(NL80211_MESHCONF_CONFIRM_TIMEOUT, mask))
1703                 conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout;
1704         if (_chg_mesh_attr(NL80211_MESHCONF_HOLDING_TIMEOUT, mask))
1705                 conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout;
1706         if (_chg_mesh_attr(NL80211_MESHCONF_MAX_PEER_LINKS, mask))
1707                 conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks;
1708         if (_chg_mesh_attr(NL80211_MESHCONF_MAX_RETRIES, mask))
1709                 conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries;
1710         if (_chg_mesh_attr(NL80211_MESHCONF_TTL, mask))
1711                 conf->dot11MeshTTL = nconf->dot11MeshTTL;
1712         if (_chg_mesh_attr(NL80211_MESHCONF_ELEMENT_TTL, mask))
1713                 conf->element_ttl = nconf->element_ttl;
1714         if (_chg_mesh_attr(NL80211_MESHCONF_AUTO_OPEN_PLINKS, mask)) {
1715                 if (ifmsh->user_mpm)
1716                         return -EBUSY;
1717                 conf->auto_open_plinks = nconf->auto_open_plinks;
1718         }
1719         if (_chg_mesh_attr(NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, mask))
1720                 conf->dot11MeshNbrOffsetMaxNeighbor =
1721                         nconf->dot11MeshNbrOffsetMaxNeighbor;
1722         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, mask))
1723                 conf->dot11MeshHWMPmaxPREQretries =
1724                         nconf->dot11MeshHWMPmaxPREQretries;
1725         if (_chg_mesh_attr(NL80211_MESHCONF_PATH_REFRESH_TIME, mask))
1726                 conf->path_refresh_time = nconf->path_refresh_time;
1727         if (_chg_mesh_attr(NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, mask))
1728                 conf->min_discovery_timeout = nconf->min_discovery_timeout;
1729         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, mask))
1730                 conf->dot11MeshHWMPactivePathTimeout =
1731                         nconf->dot11MeshHWMPactivePathTimeout;
1732         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask))
1733                 conf->dot11MeshHWMPpreqMinInterval =
1734                         nconf->dot11MeshHWMPpreqMinInterval;
1735         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, mask))
1736                 conf->dot11MeshHWMPperrMinInterval =
1737                         nconf->dot11MeshHWMPperrMinInterval;
1738         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
1739                            mask))
1740                 conf->dot11MeshHWMPnetDiameterTraversalTime =
1741                         nconf->dot11MeshHWMPnetDiameterTraversalTime;
1742         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) {
1743                 conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode;
1744                 ieee80211_mesh_root_setup(ifmsh);
1745         }
1746         if (_chg_mesh_attr(NL80211_MESHCONF_GATE_ANNOUNCEMENTS, mask)) {
1747                 /* our current gate announcement implementation rides on root
1748                  * announcements, so require this ifmsh to also be a root node
1749                  * */
1750                 if (nconf->dot11MeshGateAnnouncementProtocol &&
1751                     !(conf->dot11MeshHWMPRootMode > IEEE80211_ROOTMODE_ROOT)) {
1752                         conf->dot11MeshHWMPRootMode = IEEE80211_PROACTIVE_RANN;
1753                         ieee80211_mesh_root_setup(ifmsh);
1754                 }
1755                 conf->dot11MeshGateAnnouncementProtocol =
1756                         nconf->dot11MeshGateAnnouncementProtocol;
1757         }
1758         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_RANN_INTERVAL, mask))
1759                 conf->dot11MeshHWMPRannInterval =
1760                         nconf->dot11MeshHWMPRannInterval;
1761         if (_chg_mesh_attr(NL80211_MESHCONF_FORWARDING, mask))
1762                 conf->dot11MeshForwarding = nconf->dot11MeshForwarding;
1763         if (_chg_mesh_attr(NL80211_MESHCONF_RSSI_THRESHOLD, mask)) {
1764                 /* our RSSI threshold implementation is supported only for
1765                  * devices that report signal in dBm.
1766                  */
1767                 if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM))
1768                         return -ENOTSUPP;
1769                 conf->rssi_threshold = nconf->rssi_threshold;
1770         }
1771         if (_chg_mesh_attr(NL80211_MESHCONF_HT_OPMODE, mask)) {
1772                 conf->ht_opmode = nconf->ht_opmode;
1773                 sdata->vif.bss_conf.ht_operation_mode = nconf->ht_opmode;
1774                 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT);
1775         }
1776         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, mask))
1777                 conf->dot11MeshHWMPactivePathToRootTimeout =
1778                         nconf->dot11MeshHWMPactivePathToRootTimeout;
1779         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOT_INTERVAL, mask))
1780                 conf->dot11MeshHWMProotInterval =
1781                         nconf->dot11MeshHWMProotInterval;
1782         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, mask))
1783                 conf->dot11MeshHWMPconfirmationInterval =
1784                         nconf->dot11MeshHWMPconfirmationInterval;
1785         if (_chg_mesh_attr(NL80211_MESHCONF_POWER_MODE, mask)) {
1786                 conf->power_mode = nconf->power_mode;
1787                 ieee80211_mps_local_status_update(sdata);
1788         }
1789         if (_chg_mesh_attr(NL80211_MESHCONF_AWAKE_WINDOW, mask))
1790                 conf->dot11MeshAwakeWindowDuration =
1791                         nconf->dot11MeshAwakeWindowDuration;
1792         if (_chg_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask))
1793                 conf->plink_timeout = nconf->plink_timeout;
1794         ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
1795         return 0;
1796 }
1797
1798 static int ieee80211_join_mesh(struct wiphy *wiphy, struct net_device *dev,
1799                                const struct mesh_config *conf,
1800                                const struct mesh_setup *setup)
1801 {
1802         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1803         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1804         int err;
1805
1806         memcpy(&ifmsh->mshcfg, conf, sizeof(struct mesh_config));
1807         err = copy_mesh_setup(ifmsh, setup);
1808         if (err)
1809                 return err;
1810
1811         /* can mesh use other SMPS modes? */
1812         sdata->smps_mode = IEEE80211_SMPS_OFF;
1813         sdata->needed_rx_chains = sdata->local->rx_chains;
1814
1815         mutex_lock(&sdata->local->mtx);
1816         err = ieee80211_vif_use_channel(sdata, &setup->chandef,
1817                                         IEEE80211_CHANCTX_SHARED);
1818         mutex_unlock(&sdata->local->mtx);
1819         if (err)
1820                 return err;
1821
1822         return ieee80211_start_mesh(sdata);
1823 }
1824
1825 static int ieee80211_leave_mesh(struct wiphy *wiphy, struct net_device *dev)
1826 {
1827         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1828
1829         ieee80211_stop_mesh(sdata);
1830         mutex_lock(&sdata->local->mtx);
1831         ieee80211_vif_release_channel(sdata);
1832         mutex_unlock(&sdata->local->mtx);
1833
1834         return 0;
1835 }
1836 #endif
1837
1838 static int ieee80211_change_bss(struct wiphy *wiphy,
1839                                 struct net_device *dev,
1840                                 struct bss_parameters *params)
1841 {
1842         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1843         enum ieee80211_band band;
1844         u32 changed = 0;
1845
1846         if (!sdata_dereference(sdata->u.ap.beacon, sdata))
1847                 return -ENOENT;
1848
1849         band = ieee80211_get_sdata_band(sdata);
1850
1851         if (params->use_cts_prot >= 0) {
1852                 sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
1853                 changed |= BSS_CHANGED_ERP_CTS_PROT;
1854         }
1855         if (params->use_short_preamble >= 0) {
1856                 sdata->vif.bss_conf.use_short_preamble =
1857                         params->use_short_preamble;
1858                 changed |= BSS_CHANGED_ERP_PREAMBLE;
1859         }
1860
1861         if (!sdata->vif.bss_conf.use_short_slot &&
1862             band == IEEE80211_BAND_5GHZ) {
1863                 sdata->vif.bss_conf.use_short_slot = true;
1864                 changed |= BSS_CHANGED_ERP_SLOT;
1865         }
1866
1867         if (params->use_short_slot_time >= 0) {
1868                 sdata->vif.bss_conf.use_short_slot =
1869                         params->use_short_slot_time;
1870                 changed |= BSS_CHANGED_ERP_SLOT;
1871         }
1872
1873         if (params->basic_rates) {
1874                 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
1875                                          wiphy->bands[band],
1876                                          params->basic_rates,
1877                                          params->basic_rates_len,
1878                                          &sdata->vif.bss_conf.basic_rates);
1879                 changed |= BSS_CHANGED_BASIC_RATES;
1880         }
1881
1882         if (params->ap_isolate >= 0) {
1883                 if (params->ap_isolate)
1884                         sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
1885                 else
1886                         sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
1887         }
1888
1889         if (params->ht_opmode >= 0) {
1890                 sdata->vif.bss_conf.ht_operation_mode =
1891                         (u16) params->ht_opmode;
1892                 changed |= BSS_CHANGED_HT;
1893         }
1894
1895         if (params->p2p_ctwindow >= 0) {
1896                 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
1897                                         ~IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
1898                 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
1899                         params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
1900                 changed |= BSS_CHANGED_P2P_PS;
1901         }
1902
1903         if (params->p2p_opp_ps > 0) {
1904                 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
1905                                         IEEE80211_P2P_OPPPS_ENABLE_BIT;
1906                 changed |= BSS_CHANGED_P2P_PS;
1907         } else if (params->p2p_opp_ps == 0) {
1908                 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
1909                                         ~IEEE80211_P2P_OPPPS_ENABLE_BIT;
1910                 changed |= BSS_CHANGED_P2P_PS;
1911         }
1912
1913         ieee80211_bss_info_change_notify(sdata, changed);
1914
1915         return 0;
1916 }
1917
1918 static int ieee80211_set_txq_params(struct wiphy *wiphy,
1919                                     struct net_device *dev,
1920                                     struct ieee80211_txq_params *params)
1921 {
1922         struct ieee80211_local *local = wiphy_priv(wiphy);
1923         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1924         struct ieee80211_tx_queue_params p;
1925
1926         if (!local->ops->conf_tx)
1927                 return -EOPNOTSUPP;
1928
1929         if (local->hw.queues < IEEE80211_NUM_ACS)
1930                 return -EOPNOTSUPP;
1931
1932         memset(&p, 0, sizeof(p));
1933         p.aifs = params->aifs;
1934         p.cw_max = params->cwmax;
1935         p.cw_min = params->cwmin;
1936         p.txop = params->txop;
1937
1938         /*
1939          * Setting tx queue params disables u-apsd because it's only
1940          * called in master mode.
1941          */
1942         p.uapsd = false;
1943
1944         sdata->tx_conf[params->ac] = p;
1945         if (drv_conf_tx(local, sdata, params->ac, &p)) {
1946                 wiphy_debug(local->hw.wiphy,
1947                             "failed to set TX queue parameters for AC %d\n",
1948                             params->ac);
1949                 return -EINVAL;
1950         }
1951
1952         ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
1953
1954         return 0;
1955 }
1956
1957 #ifdef CONFIG_PM
1958 static int ieee80211_suspend(struct wiphy *wiphy,
1959                              struct cfg80211_wowlan *wowlan)
1960 {
1961         return __ieee80211_suspend(wiphy_priv(wiphy), wowlan);
1962 }
1963
1964 static int ieee80211_resume(struct wiphy *wiphy)
1965 {
1966         return __ieee80211_resume(wiphy_priv(wiphy));
1967 }
1968 #else
1969 #define ieee80211_suspend NULL
1970 #define ieee80211_resume NULL
1971 #endif
1972
1973 static int ieee80211_scan(struct wiphy *wiphy,
1974                           struct cfg80211_scan_request *req)
1975 {
1976         struct ieee80211_sub_if_data *sdata;
1977
1978         sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev);
1979
1980         switch (ieee80211_vif_type_p2p(&sdata->vif)) {
1981         case NL80211_IFTYPE_STATION:
1982         case NL80211_IFTYPE_ADHOC:
1983         case NL80211_IFTYPE_MESH_POINT:
1984         case NL80211_IFTYPE_P2P_CLIENT:
1985         case NL80211_IFTYPE_P2P_DEVICE:
1986                 break;
1987         case NL80211_IFTYPE_P2P_GO:
1988                 if (sdata->local->ops->hw_scan)
1989                         break;
1990                 /*
1991                  * FIXME: implement NoA while scanning in software,
1992                  * for now fall through to allow scanning only when
1993                  * beaconing hasn't been configured yet
1994                  */
1995         case NL80211_IFTYPE_AP:
1996                 /*
1997                  * If the scan has been forced (and the driver supports
1998                  * forcing), don't care about being beaconing already.
1999                  * This will create problems to the attached stations (e.g. all
2000                  * the  frames sent while scanning on other channel will be
2001                  * lost)
2002                  */
2003                 if (sdata->u.ap.beacon &&
2004                     (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
2005                      !(req->flags & NL80211_SCAN_FLAG_AP)))
2006                         return -EOPNOTSUPP;
2007                 break;
2008         default:
2009                 return -EOPNOTSUPP;
2010         }
2011
2012         return ieee80211_request_scan(sdata, req);
2013 }
2014
2015 static void ieee80211_abort_scan(struct wiphy *wiphy, struct wireless_dev *wdev)
2016 {
2017         ieee80211_scan_cancel(wiphy_priv(wiphy));
2018 }
2019
2020 static int
2021 ieee80211_sched_scan_start(struct wiphy *wiphy,
2022                            struct net_device *dev,
2023                            struct cfg80211_sched_scan_request *req)
2024 {
2025         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2026
2027         if (!sdata->local->ops->sched_scan_start)
2028                 return -EOPNOTSUPP;
2029
2030         return ieee80211_request_sched_scan_start(sdata, req);
2031 }
2032
2033 static int
2034 ieee80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev)
2035 {
2036         struct ieee80211_local *local = wiphy_priv(wiphy);
2037
2038         if (!local->ops->sched_scan_stop)
2039                 return -EOPNOTSUPP;
2040
2041         return ieee80211_request_sched_scan_stop(local);
2042 }
2043
2044 static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
2045                           struct cfg80211_auth_request *req)
2046 {
2047         return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req);
2048 }
2049
2050 static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
2051                            struct cfg80211_assoc_request *req)
2052 {
2053         return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
2054 }
2055
2056 static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev,
2057                             struct cfg80211_deauth_request *req)
2058 {
2059         return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev), req);
2060 }
2061
2062 static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev,
2063                               struct cfg80211_disassoc_request *req)
2064 {
2065         return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
2066 }
2067
2068 static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
2069                                struct cfg80211_ibss_params *params)
2070 {
2071         return ieee80211_ibss_join(IEEE80211_DEV_TO_SUB_IF(dev), params);
2072 }
2073
2074 static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
2075 {
2076         return ieee80211_ibss_leave(IEEE80211_DEV_TO_SUB_IF(dev));
2077 }
2078
2079 static int ieee80211_join_ocb(struct wiphy *wiphy, struct net_device *dev,
2080                               struct ocb_setup *setup)
2081 {
2082         return ieee80211_ocb_join(IEEE80211_DEV_TO_SUB_IF(dev), setup);
2083 }
2084
2085 static int ieee80211_leave_ocb(struct wiphy *wiphy, struct net_device *dev)
2086 {
2087         return ieee80211_ocb_leave(IEEE80211_DEV_TO_SUB_IF(dev));
2088 }
2089
2090 static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,
2091                                     int rate[IEEE80211_NUM_BANDS])
2092 {
2093         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2094
2095         memcpy(sdata->vif.bss_conf.mcast_rate, rate,
2096                sizeof(int) * IEEE80211_NUM_BANDS);
2097
2098         return 0;
2099 }
2100
2101 static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
2102 {
2103         struct ieee80211_local *local = wiphy_priv(wiphy);
2104         int err;
2105
2106         if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
2107                 ieee80211_check_fast_xmit_all(local);
2108
2109                 err = drv_set_frag_threshold(local, wiphy->frag_threshold);
2110
2111                 if (err) {
2112                         ieee80211_check_fast_xmit_all(local);
2113                         return err;
2114                 }
2115         }
2116
2117         if ((changed & WIPHY_PARAM_COVERAGE_CLASS) ||
2118             (changed & WIPHY_PARAM_DYN_ACK)) {
2119                 s16 coverage_class;
2120
2121                 coverage_class = changed & WIPHY_PARAM_COVERAGE_CLASS ?
2122                                         wiphy->coverage_class : -1;
2123                 err = drv_set_coverage_class(local, coverage_class);
2124
2125                 if (err)
2126                         return err;
2127         }
2128
2129         if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
2130                 err = drv_set_rts_threshold(local, wiphy->rts_threshold);
2131
2132                 if (err)
2133                         return err;
2134         }
2135
2136         if (changed & WIPHY_PARAM_RETRY_SHORT) {
2137                 if (wiphy->retry_short > IEEE80211_MAX_TX_RETRY)
2138                         return -EINVAL;
2139                 local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
2140         }
2141         if (changed & WIPHY_PARAM_RETRY_LONG) {
2142                 if (wiphy->retry_long > IEEE80211_MAX_TX_RETRY)
2143                         return -EINVAL;
2144                 local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
2145         }
2146         if (changed &
2147             (WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
2148                 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
2149
2150         return 0;
2151 }
2152
2153 static int ieee80211_set_tx_power(struct wiphy *wiphy,
2154                                   struct wireless_dev *wdev,
2155                                   enum nl80211_tx_power_setting type, int mbm)
2156 {
2157         struct ieee80211_local *local = wiphy_priv(wiphy);
2158         struct ieee80211_sub_if_data *sdata;
2159         enum nl80211_tx_power_setting txp_type = type;
2160         bool update_txp_type = false;
2161
2162         if (wdev) {
2163                 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2164
2165                 switch (type) {
2166                 case NL80211_TX_POWER_AUTOMATIC:
2167                         sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
2168                         txp_type = NL80211_TX_POWER_LIMITED;
2169                         break;
2170                 case NL80211_TX_POWER_LIMITED:
2171                 case NL80211_TX_POWER_FIXED:
2172                         if (mbm < 0 || (mbm % 100))
2173                                 return -EOPNOTSUPP;
2174                         sdata->user_power_level = MBM_TO_DBM(mbm);
2175                         break;
2176                 }
2177
2178                 if (txp_type != sdata->vif.bss_conf.txpower_type) {
2179                         update_txp_type = true;
2180                         sdata->vif.bss_conf.txpower_type = txp_type;
2181                 }
2182
2183                 ieee80211_recalc_txpower(sdata, update_txp_type);
2184
2185                 return 0;
2186         }
2187
2188         switch (type) {
2189         case NL80211_TX_POWER_AUTOMATIC:
2190                 local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
2191                 txp_type = NL80211_TX_POWER_LIMITED;
2192                 break;
2193         case NL80211_TX_POWER_LIMITED:
2194         case NL80211_TX_POWER_FIXED:
2195                 if (mbm < 0 || (mbm % 100))
2196                         return -EOPNOTSUPP;
2197                 local->user_power_level = MBM_TO_DBM(mbm);
2198                 break;
2199         }
2200
2201         mutex_lock(&local->iflist_mtx);
2202         list_for_each_entry(sdata, &local->interfaces, list) {
2203                 sdata->user_power_level = local->user_power_level;
2204                 if (txp_type != sdata->vif.bss_conf.txpower_type)
2205                         update_txp_type = true;
2206                 sdata->vif.bss_conf.txpower_type = txp_type;
2207         }
2208         list_for_each_entry(sdata, &local->interfaces, list)
2209                 ieee80211_recalc_txpower(sdata, update_txp_type);
2210         mutex_unlock(&local->iflist_mtx);
2211
2212         return 0;
2213 }
2214
2215 static int ieee80211_get_tx_power(struct wiphy *wiphy,
2216                                   struct wireless_dev *wdev,
2217                                   int *dbm)
2218 {
2219         struct ieee80211_local *local = wiphy_priv(wiphy);
2220         struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2221
2222         if (local->ops->get_txpower)
2223                 return drv_get_txpower(local, sdata, dbm);
2224
2225         if (!local->use_chanctx)
2226                 *dbm = local->hw.conf.power_level;
2227         else
2228                 *dbm = sdata->vif.bss_conf.txpower;
2229
2230         return 0;
2231 }
2232
2233 static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
2234                                   const u8 *addr)
2235 {
2236         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2237
2238         memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN);
2239
2240         return 0;
2241 }
2242
2243 static void ieee80211_rfkill_poll(struct wiphy *wiphy)
2244 {
2245         struct ieee80211_local *local = wiphy_priv(wiphy);
2246
2247         drv_rfkill_poll(local);
2248 }
2249
2250 #ifdef CONFIG_NL80211_TESTMODE
2251 static int ieee80211_testmode_cmd(struct wiphy *wiphy,
2252                                   struct wireless_dev *wdev,
2253                                   void *data, int len)
2254 {
2255         struct ieee80211_local *local = wiphy_priv(wiphy);
2256         struct ieee80211_vif *vif = NULL;
2257
2258         if (!local->ops->testmode_cmd)
2259                 return -EOPNOTSUPP;
2260
2261         if (wdev) {
2262                 struct ieee80211_sub_if_data *sdata;
2263
2264                 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2265                 if (sdata->flags & IEEE80211_SDATA_IN_DRIVER)
2266                         vif = &sdata->vif;
2267         }
2268
2269         return local->ops->testmode_cmd(&local->hw, vif, data, len);
2270 }
2271
2272 static int ieee80211_testmode_dump(struct wiphy *wiphy,
2273                                    struct sk_buff *skb,
2274                                    struct netlink_callback *cb,
2275                                    void *data, int len)
2276 {
2277         struct ieee80211_local *local = wiphy_priv(wiphy);
2278
2279         if (!local->ops->testmode_dump)
2280                 return -EOPNOTSUPP;
2281
2282         return local->ops->testmode_dump(&local->hw, skb, cb, data, len);
2283 }
2284 #endif
2285
2286 int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata,
2287                                 enum ieee80211_smps_mode smps_mode)
2288 {
2289         struct sta_info *sta;
2290         enum ieee80211_smps_mode old_req;
2291
2292         if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP))
2293                 return -EINVAL;
2294
2295         if (sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
2296                 return 0;
2297
2298         old_req = sdata->u.ap.req_smps;
2299         sdata->u.ap.req_smps = smps_mode;
2300
2301         /* AUTOMATIC doesn't mean much for AP - don't allow it */
2302         if (old_req == smps_mode ||
2303             smps_mode == IEEE80211_SMPS_AUTOMATIC)
2304                 return 0;
2305
2306          /* If no associated stations, there's no need to do anything */
2307         if (!atomic_read(&sdata->u.ap.num_mcast_sta)) {
2308                 sdata->smps_mode = smps_mode;
2309                 ieee80211_queue_work(&sdata->local->hw, &sdata->recalc_smps);
2310                 return 0;
2311         }
2312
2313         ht_dbg(sdata,
2314                "SMPS %d requested in AP mode, sending Action frame to %d stations\n",
2315                smps_mode, atomic_read(&sdata->u.ap.num_mcast_sta));
2316
2317         mutex_lock(&sdata->local->sta_mtx);
2318         list_for_each_entry(sta, &sdata->local->sta_list, list) {
2319                 /*
2320                  * Only stations associated to our AP and
2321                  * associated VLANs
2322                  */
2323                 if (sta->sdata->bss != &sdata->u.ap)
2324                         continue;
2325
2326                 /* This station doesn't support MIMO - skip it */
2327                 if (sta_info_tx_streams(sta) == 1)
2328                         continue;
2329
2330                 /*
2331                  * Don't wake up a STA just to send the action frame
2332                  * unless we are getting more restrictive.
2333                  */
2334                 if (test_sta_flag(sta, WLAN_STA_PS_STA) &&
2335                     !ieee80211_smps_is_restrictive(sta->known_smps_mode,
2336                                                    smps_mode)) {
2337                         ht_dbg(sdata, "Won't send SMPS to sleeping STA %pM\n",
2338                                sta->sta.addr);
2339                         continue;
2340                 }
2341
2342                 /*
2343                  * If the STA is not authorized, wait until it gets
2344                  * authorized and the action frame will be sent then.
2345                  */
2346                 if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED))
2347                         continue;
2348
2349                 ht_dbg(sdata, "Sending SMPS to %pM\n", sta->sta.addr);
2350                 ieee80211_send_smps_action(sdata, smps_mode, sta->sta.addr,
2351                                            sdata->vif.bss_conf.bssid);
2352         }
2353         mutex_unlock(&sdata->local->sta_mtx);
2354
2355         sdata->smps_mode = smps_mode;
2356         ieee80211_queue_work(&sdata->local->hw, &sdata->recalc_smps);
2357
2358         return 0;
2359 }
2360
2361 int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
2362                                  enum ieee80211_smps_mode smps_mode)
2363 {
2364         const u8 *ap;
2365         enum ieee80211_smps_mode old_req;
2366         int err;
2367         struct sta_info *sta;
2368         bool tdls_peer_found = false;
2369
2370         lockdep_assert_held(&sdata->wdev.mtx);
2371
2372         if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION))
2373                 return -EINVAL;
2374
2375         old_req = sdata->u.mgd.req_smps;
2376         sdata->u.mgd.req_smps = smps_mode;
2377
2378         if (old_req == smps_mode &&
2379             smps_mode != IEEE80211_SMPS_AUTOMATIC)
2380                 return 0;
2381
2382         /*
2383          * If not associated, or current association is not an HT
2384          * association, there's no need to do anything, just store
2385          * the new value until we associate.
2386          */
2387         if (!sdata->u.mgd.associated ||
2388             sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
2389                 return 0;
2390
2391         ap = sdata->u.mgd.associated->bssid;
2392
2393         rcu_read_lock();
2394         list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) {
2395                 if (!sta->sta.tdls || sta->sdata != sdata || !sta->uploaded ||
2396                     !test_sta_flag(sta, WLAN_STA_AUTHORIZED))
2397                         continue;
2398
2399                 tdls_peer_found = true;
2400                 break;
2401         }
2402         rcu_read_unlock();
2403
2404         if (smps_mode == IEEE80211_SMPS_AUTOMATIC) {
2405                 if (tdls_peer_found || !sdata->u.mgd.powersave)
2406                         smps_mode = IEEE80211_SMPS_OFF;
2407                 else
2408                         smps_mode = IEEE80211_SMPS_DYNAMIC;
2409         }
2410
2411         /* send SM PS frame to AP */
2412         err = ieee80211_send_smps_action(sdata, smps_mode,
2413                                          ap, ap);
2414         if (err)
2415                 sdata->u.mgd.req_smps = old_req;
2416         else if (smps_mode != IEEE80211_SMPS_OFF && tdls_peer_found)
2417                 ieee80211_teardown_tdls_peers(sdata);
2418
2419         return err;
2420 }
2421
2422 static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
2423                                     bool enabled, int timeout)
2424 {
2425         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2426         struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
2427
2428         if (sdata->vif.type != NL80211_IFTYPE_STATION)
2429                 return -EOPNOTSUPP;
2430
2431         if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS))
2432                 return -EOPNOTSUPP;
2433
2434         if (enabled == sdata->u.mgd.powersave &&
2435             timeout == local->dynamic_ps_forced_timeout)
2436                 return 0;
2437
2438         sdata->u.mgd.powersave = enabled;
2439         local->dynamic_ps_forced_timeout = timeout;
2440
2441         /* no change, but if automatic follow powersave */
2442         sdata_lock(sdata);
2443         __ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps);
2444         sdata_unlock(sdata);
2445
2446         if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))
2447                 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
2448
2449         ieee80211_recalc_ps(local);
2450         ieee80211_recalc_ps_vif(sdata);
2451
2452         return 0;
2453 }
2454
2455 static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
2456                                          struct net_device *dev,
2457                                          s32 rssi_thold, u32 rssi_hyst)
2458 {
2459         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2460         struct ieee80211_vif *vif = &sdata->vif;
2461         struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
2462
2463         if (rssi_thold == bss_conf->cqm_rssi_thold &&
2464             rssi_hyst == bss_conf->cqm_rssi_hyst)
2465                 return 0;
2466
2467         if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER &&
2468             !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI))
2469                 return -EOPNOTSUPP;
2470
2471         bss_conf->cqm_rssi_thold = rssi_thold;
2472         bss_conf->cqm_rssi_hyst = rssi_hyst;
2473         sdata->u.mgd.last_cqm_event_signal = 0;
2474
2475         /* tell the driver upon association, unless already associated */
2476         if (sdata->u.mgd.associated &&
2477             sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)
2478                 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
2479
2480         return 0;
2481 }
2482
2483 static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
2484                                       struct net_device *dev,
2485                                       const u8 *addr,
2486                                       const struct cfg80211_bitrate_mask *mask)
2487 {
2488         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2489         struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
2490         int i, ret;
2491
2492         if (!ieee80211_sdata_running(sdata))
2493                 return -ENETDOWN;
2494
2495         if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
2496                 ret = drv_set_bitrate_mask(local, sdata, mask);
2497                 if (ret)
2498                         return ret;
2499         }
2500
2501         for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
2502                 struct ieee80211_supported_band *sband = wiphy->bands[i];
2503                 int j;
2504
2505                 sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
2506                 memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].ht_mcs,
2507                        sizeof(mask->control[i].ht_mcs));
2508                 memcpy(sdata->rc_rateidx_vht_mcs_mask[i],
2509                        mask->control[i].vht_mcs,
2510                        sizeof(mask->control[i].vht_mcs));
2511
2512                 sdata->rc_has_mcs_mask[i] = false;
2513                 sdata->rc_has_vht_mcs_mask[i] = false;
2514                 if (!sband)
2515                         continue;
2516
2517                 for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) {
2518                         if (~sdata->rc_rateidx_mcs_mask[i][j]) {
2519                                 sdata->rc_has_mcs_mask[i] = true;
2520                                 break;
2521                         }
2522                 }
2523
2524                 for (j = 0; j < NL80211_VHT_NSS_MAX; j++) {
2525                         if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) {
2526                                 sdata->rc_has_vht_mcs_mask[i] = true;
2527                                 break;
2528                         }
2529                 }
2530         }
2531
2532         return 0;
2533 }
2534
2535 static int ieee80211_start_radar_detection(struct wiphy *wiphy,
2536                                            struct net_device *dev,
2537                                            struct cfg80211_chan_def *chandef,
2538                                            u32 cac_time_ms)
2539 {
2540         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2541         struct ieee80211_local *local = sdata->local;
2542         int err;
2543
2544         mutex_lock(&local->mtx);
2545         if (!list_empty(&local->roc_list) || local->scanning) {
2546                 err = -EBUSY;
2547                 goto out_unlock;
2548         }
2549
2550         /* whatever, but channel contexts should not complain about that one */
2551         sdata->smps_mode = IEEE80211_SMPS_OFF;
2552         sdata->needed_rx_chains = local->rx_chains;
2553
2554         err = ieee80211_vif_use_channel(sdata, chandef,
2555                                         IEEE80211_CHANCTX_SHARED);
2556         if (err)
2557                 goto out_unlock;
2558
2559         ieee80211_queue_delayed_work(&sdata->local->hw,
2560                                      &sdata->dfs_cac_timer_work,
2561                                      msecs_to_jiffies(cac_time_ms));
2562
2563  out_unlock:
2564         mutex_unlock(&local->mtx);
2565         return err;
2566 }
2567
2568 static struct cfg80211_beacon_data *
2569 cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
2570 {
2571         struct cfg80211_beacon_data *new_beacon;
2572         u8 *pos;
2573         int len;
2574
2575         len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len +
2576               beacon->proberesp_ies_len + beacon->assocresp_ies_len +
2577               beacon->probe_resp_len;
2578
2579         new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL);
2580         if (!new_beacon)
2581                 return NULL;
2582
2583         pos = (u8 *)(new_beacon + 1);
2584         if (beacon->head_len) {
2585                 new_beacon->head_len = beacon->head_len;
2586                 new_beacon->head = pos;
2587                 memcpy(pos, beacon->head, beacon->head_len);
2588                 pos += beacon->head_len;
2589         }
2590         if (beacon->tail_len) {
2591                 new_beacon->tail_len = beacon->tail_len;
2592                 new_beacon->tail = pos;
2593                 memcpy(pos, beacon->tail, beacon->tail_len);
2594                 pos += beacon->tail_len;
2595         }
2596         if (beacon->beacon_ies_len) {
2597                 new_beacon->beacon_ies_len = beacon->beacon_ies_len;
2598                 new_beacon->beacon_ies = pos;
2599                 memcpy(pos, beacon->beacon_ies, beacon->beacon_ies_len);
2600                 pos += beacon->beacon_ies_len;
2601         }
2602         if (beacon->proberesp_ies_len) {
2603                 new_beacon->proberesp_ies_len = beacon->proberesp_ies_len;
2604                 new_beacon->proberesp_ies = pos;
2605                 memcpy(pos, beacon->proberesp_ies, beacon->proberesp_ies_len);
2606                 pos += beacon->proberesp_ies_len;
2607         }
2608         if (beacon->assocresp_ies_len) {
2609                 new_beacon->assocresp_ies_len = beacon->assocresp_ies_len;
2610                 new_beacon->assocresp_ies = pos;
2611                 memcpy(pos, beacon->assocresp_ies, beacon->assocresp_ies_len);
2612                 pos += beacon->assocresp_ies_len;
2613         }
2614         if (beacon->probe_resp_len) {
2615                 new_beacon->probe_resp_len = beacon->probe_resp_len;
2616                 beacon->probe_resp = pos;
2617                 memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
2618                 pos += beacon->probe_resp_len;
2619         }
2620
2621         return new_beacon;
2622 }
2623
2624 void ieee80211_csa_finish(struct ieee80211_vif *vif)
2625 {
2626         struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2627
2628         ieee80211_queue_work(&sdata->local->hw,
2629                              &sdata->csa_finalize_work);
2630 }
2631 EXPORT_SYMBOL(ieee80211_csa_finish);
2632
2633 static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
2634                                           u32 *changed)
2635 {
2636         int err;
2637
2638         switch (sdata->vif.type) {
2639         case NL80211_IFTYPE_AP:
2640                 err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
2641                                               NULL);
2642                 kfree(sdata->u.ap.next_beacon);
2643                 sdata->u.ap.next_beacon = NULL;
2644
2645                 if (err < 0)
2646                         return err;
2647                 *changed |= err;
2648                 break;
2649         case NL80211_IFTYPE_ADHOC:
2650                 err = ieee80211_ibss_finish_csa(sdata);
2651                 if (err < 0)
2652                         return err;
2653                 *changed |= err;
2654                 break;
2655 #ifdef CONFIG_MAC80211_MESH
2656         case NL80211_IFTYPE_MESH_POINT:
2657                 err = ieee80211_mesh_finish_csa(sdata);
2658                 if (err < 0)
2659                         return err;
2660                 *changed |= err;
2661                 break;
2662 #endif
2663         default:
2664                 WARN_ON(1);
2665                 return -EINVAL;
2666         }
2667
2668         return 0;
2669 }
2670
2671 static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
2672 {
2673         struct ieee80211_local *local = sdata->local;
2674         u32 changed = 0;
2675         int err;
2676
2677         sdata_assert_lock(sdata);
2678         lockdep_assert_held(&local->mtx);
2679         lockdep_assert_held(&local->chanctx_mtx);
2680
2681         /*
2682          * using reservation isn't immediate as it may be deferred until later
2683          * with multi-vif. once reservation is complete it will re-schedule the
2684          * work with no reserved_chanctx so verify chandef to check if it
2685          * completed successfully
2686          */
2687
2688         if (sdata->reserved_chanctx) {
2689                 /*
2690                  * with multi-vif csa driver may call ieee80211_csa_finish()
2691                  * many times while waiting for other interfaces to use their
2692                  * reservations
2693                  */
2694                 if (sdata->reserved_ready)
2695                         return 0;
2696
2697                 return ieee80211_vif_use_reserved_context(sdata);
2698         }
2699
2700         if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef,
2701                                         &sdata->csa_chandef))
2702                 return -EINVAL;
2703
2704         sdata->vif.csa_active = false;
2705
2706         err = ieee80211_set_after_csa_beacon(sdata, &changed);
2707         if (err)
2708                 return err;
2709
2710         ieee80211_bss_info_change_notify(sdata, changed);
2711
2712         if (sdata->csa_block_tx) {
2713                 ieee80211_wake_vif_queues(local, sdata,
2714                                           IEEE80211_QUEUE_STOP_REASON_CSA);
2715                 sdata->csa_block_tx = false;
2716         }
2717
2718         err = drv_post_channel_switch(sdata);
2719         if (err)
2720                 return err;
2721
2722         cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef);
2723
2724         return 0;
2725 }
2726
2727 static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
2728 {
2729         if (__ieee80211_csa_finalize(sdata)) {
2730                 sdata_info(sdata, "failed to finalize CSA, disconnecting\n");
2731                 cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev,
2732                                     GFP_KERNEL);
2733         }
2734 }
2735
2736 void ieee80211_csa_finalize_work(struct work_struct *work)
2737 {
2738         struct ieee80211_sub_if_data *sdata =
2739                 container_of(work, struct ieee80211_sub_if_data,
2740                              csa_finalize_work);
2741         struct ieee80211_local *local = sdata->local;
2742
2743         sdata_lock(sdata);
2744         mutex_lock(&local->mtx);
2745         mutex_lock(&local->chanctx_mtx);
2746
2747         /* AP might have been stopped while waiting for the lock. */
2748         if (!sdata->vif.csa_active)
2749                 goto unlock;
2750
2751         if (!ieee80211_sdata_running(sdata))
2752                 goto unlock;
2753
2754         ieee80211_csa_finalize(sdata);
2755
2756 unlock:
2757         mutex_unlock(&local->chanctx_mtx);
2758         mutex_unlock(&local->mtx);
2759         sdata_unlock(sdata);
2760 }
2761
2762 static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata,
2763                                     struct cfg80211_csa_settings *params,
2764                                     u32 *changed)
2765 {
2766         struct ieee80211_csa_settings csa = {};
2767         int err;
2768
2769         switch (sdata->vif.type) {
2770         case NL80211_IFTYPE_AP:
2771                 sdata->u.ap.next_beacon =
2772                         cfg80211_beacon_dup(&params->beacon_after);
2773                 if (!sdata->u.ap.next_beacon)
2774                         return -ENOMEM;
2775
2776                 /*
2777                  * With a count of 0, we don't have to wait for any
2778                  * TBTT before switching, so complete the CSA
2779                  * immediately.  In theory, with a count == 1 we
2780                  * should delay the switch until just before the next
2781                  * TBTT, but that would complicate things so we switch
2782                  * immediately too.  If we would delay the switch
2783                  * until the next TBTT, we would have to set the probe
2784                  * response here.
2785                  *
2786                  * TODO: A channel switch with count <= 1 without
2787                  * sending a CSA action frame is kind of useless,
2788                  * because the clients won't know we're changing
2789                  * channels.  The action frame must be implemented
2790                  * either here or in the userspace.
2791                  */
2792                 if (params->count <= 1)
2793                         break;
2794
2795                 if ((params->n_counter_offsets_beacon >
2796                      IEEE80211_MAX_CSA_COUNTERS_NUM) ||
2797                     (params->n_counter_offsets_presp >
2798                      IEEE80211_MAX_CSA_COUNTERS_NUM))
2799                         return -EINVAL;
2800
2801                 csa.counter_offsets_beacon = params->counter_offsets_beacon;
2802                 csa.counter_offsets_presp = params->counter_offsets_presp;
2803                 csa.n_counter_offsets_beacon = params->n_counter_offsets_beacon;
2804                 csa.n_counter_offsets_presp = params->n_counter_offsets_presp;
2805                 csa.count = params->count;
2806
2807                 err = ieee80211_assign_beacon(sdata, &params->beacon_csa, &csa);
2808                 if (err < 0) {
2809                         kfree(sdata->u.ap.next_beacon);
2810                         return err;
2811                 }
2812                 *changed |= err;
2813
2814                 break;
2815         case NL80211_IFTYPE_ADHOC:
2816                 if (!sdata->vif.bss_conf.ibss_joined)
2817                         return -EINVAL;
2818
2819                 if (params->chandef.width != sdata->u.ibss.chandef.width)
2820                         return -EINVAL;
2821
2822                 switch (params->chandef.width) {
2823                 case NL80211_CHAN_WIDTH_40:
2824                         if (cfg80211_get_chandef_type(&params->chandef) !=
2825                             cfg80211_get_chandef_type(&sdata->u.ibss.chandef))
2826                                 return -EINVAL;
2827                 case NL80211_CHAN_WIDTH_5:
2828                 case NL80211_CHAN_WIDTH_10:
2829                 case NL80211_CHAN_WIDTH_20_NOHT:
2830                 case NL80211_CHAN_WIDTH_20:
2831                         break;
2832                 default:
2833                         return -EINVAL;
2834                 }
2835
2836                 /* changes into another band are not supported */
2837                 if (sdata->u.ibss.chandef.chan->band !=
2838                     params->chandef.chan->band)
2839                         return -EINVAL;
2840
2841                 /* see comments in the NL80211_IFTYPE_AP block */
2842                 if (params->count > 1) {
2843                         err = ieee80211_ibss_csa_beacon(sdata, params);
2844                         if (err < 0)
2845                                 return err;
2846                         *changed |= err;
2847                 }
2848
2849                 ieee80211_send_action_csa(sdata, params);
2850
2851                 break;
2852 #ifdef CONFIG_MAC80211_MESH
2853         case NL80211_IFTYPE_MESH_POINT: {
2854                 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
2855
2856                 if (params->chandef.width != sdata->vif.bss_conf.chandef.width)
2857                         return -EINVAL;
2858
2859                 /* changes into another band are not supported */
2860                 if (sdata->vif.bss_conf.chandef.chan->band !=
2861                     params->chandef.chan->band)
2862                         return -EINVAL;
2863
2864                 if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_NONE) {
2865                         ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_INIT;
2866                         if (!ifmsh->pre_value)
2867                                 ifmsh->pre_value = 1;
2868                         else
2869                                 ifmsh->pre_value++;
2870                 }
2871
2872                 /* see comments in the NL80211_IFTYPE_AP block */
2873                 if (params->count > 1) {
2874                         err = ieee80211_mesh_csa_beacon(sdata, params);
2875                         if (err < 0) {
2876                                 ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE;
2877                                 return err;
2878                         }
2879                         *changed |= err;
2880                 }
2881
2882                 if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_INIT)
2883                         ieee80211_send_action_csa(sdata, params);
2884
2885                 break;
2886                 }
2887 #endif
2888         default:
2889                 return -EOPNOTSUPP;
2890         }
2891
2892         return 0;
2893 }
2894
2895 static int
2896 __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
2897                            struct cfg80211_csa_settings *params)
2898 {
2899         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2900         struct ieee80211_local *local = sdata->local;
2901         struct ieee80211_channel_switch ch_switch;
2902         struct ieee80211_chanctx_conf *conf;
2903         struct ieee80211_chanctx *chanctx;
2904         u32 changed = 0;
2905         int err;
2906
2907         sdata_assert_lock(sdata);
2908         lockdep_assert_held(&local->mtx);
2909
2910         if (!list_empty(&local->roc_list) || local->scanning)
2911                 return -EBUSY;
2912
2913         if (sdata->wdev.cac_started)
2914                 return -EBUSY;
2915
2916         if (cfg80211_chandef_identical(&params->chandef,
2917                                        &sdata->vif.bss_conf.chandef))
2918                 return -EINVAL;
2919
2920         /* don't allow another channel switch if one is already active. */
2921         if (sdata->vif.csa_active)
2922                 return -EBUSY;
2923
2924         mutex_lock(&local->chanctx_mtx);
2925         conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
2926                                          lockdep_is_held(&local->chanctx_mtx));
2927         if (!conf) {
2928                 err = -EBUSY;
2929                 goto out;
2930         }
2931
2932         chanctx = container_of(conf, struct ieee80211_chanctx, conf);
2933         if (!chanctx) {
2934                 err = -EBUSY;
2935                 goto out;
2936         }
2937
2938         ch_switch.timestamp = 0;
2939         ch_switch.device_timestamp = 0;
2940         ch_switch.block_tx = params->block_tx;
2941         ch_switch.chandef = params->chandef;
2942         ch_switch.count = params->count;
2943
2944         err = drv_pre_channel_switch(sdata, &ch_switch);
2945         if (err)
2946                 goto out;
2947
2948         err = ieee80211_vif_reserve_chanctx(sdata, &params->chandef,
2949                                             chanctx->mode,
2950                                             params->radar_required);
2951         if (err)
2952                 goto out;
2953
2954         /* if reservation is invalid then this will fail */
2955         err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0);
2956         if (err) {
2957                 ieee80211_vif_unreserve_chanctx(sdata);
2958                 goto out;
2959         }
2960
2961         err = ieee80211_set_csa_beacon(sdata, params, &changed);
2962         if (err) {
2963                 ieee80211_vif_unreserve_chanctx(sdata);
2964                 goto out;
2965         }
2966
2967         sdata->csa_chandef = params->chandef;
2968         sdata->csa_block_tx = params->block_tx;
2969         sdata->vif.csa_active = true;
2970
2971         if (sdata->csa_block_tx)
2972                 ieee80211_stop_vif_queues(local, sdata,
2973                                           IEEE80211_QUEUE_STOP_REASON_CSA);
2974
2975         cfg80211_ch_switch_started_notify(sdata->dev, &sdata->csa_chandef,
2976                                           params->count);
2977
2978         if (changed) {
2979                 ieee80211_bss_info_change_notify(sdata, changed);
2980                 drv_channel_switch_beacon(sdata, &params->chandef);
2981         } else {
2982                 /* if the beacon didn't change, we can finalize immediately */
2983                 ieee80211_csa_finalize(sdata);
2984         }
2985
2986 out:
2987         mutex_unlock(&local->chanctx_mtx);
2988         return err;
2989 }
2990
2991 int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
2992                              struct cfg80211_csa_settings *params)
2993 {
2994         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2995         struct ieee80211_local *local = sdata->local;
2996         int err;
2997
2998         mutex_lock(&local->mtx);
2999         err = __ieee80211_channel_switch(wiphy, dev, params);
3000         mutex_unlock(&local->mtx);
3001
3002         return err;
3003 }
3004
3005 u64 ieee80211_mgmt_tx_cookie(struct ieee80211_local *local)
3006 {
3007         lockdep_assert_held(&local->mtx);
3008
3009         local->roc_cookie_counter++;
3010
3011         /* wow, you wrapped 64 bits ... more likely a bug */
3012         if (WARN_ON(local->roc_cookie_counter == 0))
3013                 local->roc_cookie_counter++;
3014
3015         return local->roc_cookie_counter;
3016 }
3017
3018 int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
3019                              u64 *cookie, gfp_t gfp)
3020 {
3021         unsigned long spin_flags;
3022         struct sk_buff *ack_skb;
3023         int id;
3024
3025         ack_skb = skb_copy(skb, gfp);
3026         if (!ack_skb)
3027                 return -ENOMEM;
3028
3029         spin_lock_irqsave(&local->ack_status_lock, spin_flags);
3030         id = idr_alloc(&local->ack_status_frames, ack_skb,
3031                        1, 0x10000, GFP_ATOMIC);
3032         spin_unlock_irqrestore(&local->ack_status_lock, spin_flags);
3033
3034         if (id < 0) {
3035                 kfree_skb(ack_skb);
3036                 return -ENOMEM;
3037         }
3038
3039         IEEE80211_SKB_CB(skb)->ack_frame_id = id;
3040
3041         *cookie = ieee80211_mgmt_tx_cookie(local);
3042         IEEE80211_SKB_CB(ack_skb)->ack.cookie = *cookie;
3043
3044         return 0;
3045 }
3046
3047 static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
3048                                           struct wireless_dev *wdev,
3049                                           u16 frame_type, bool reg)
3050 {
3051         struct ieee80211_local *local = wiphy_priv(wiphy);
3052         struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3053
3054         switch (frame_type) {
3055         case IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ:
3056                 if (reg) {
3057                         local->probe_req_reg++;
3058                         sdata->vif.probe_req_reg++;
3059                 } else {
3060                         if (local->probe_req_reg)
3061                                 local->probe_req_reg--;
3062
3063                         if (sdata->vif.probe_req_reg)
3064                                 sdata->vif.probe_req_reg--;
3065                 }
3066
3067                 if (!local->open_count)
3068                         break;
3069
3070                 if (sdata->vif.probe_req_reg == 1)
3071                         drv_config_iface_filter(local, sdata, FIF_PROBE_REQ,
3072                                                 FIF_PROBE_REQ);
3073                 else if (sdata->vif.probe_req_reg == 0)
3074                         drv_config_iface_filter(local, sdata, 0,
3075                                                 FIF_PROBE_REQ);
3076
3077                 ieee80211_configure_filter(local);
3078                 break;
3079         default:
3080                 break;
3081         }
3082 }
3083
3084 static int ieee80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
3085 {
3086         struct ieee80211_local *local = wiphy_priv(wiphy);
3087
3088         if (local->started)
3089                 return -EOPNOTSUPP;
3090
3091         return drv_set_antenna(local, tx_ant, rx_ant);
3092 }
3093
3094 static int ieee80211_get_antenna(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant)
3095 {
3096         struct ieee80211_local *local = wiphy_priv(wiphy);
3097
3098         return drv_get_antenna(local, tx_ant, rx_ant);
3099 }
3100
3101 static int ieee80211_set_rekey_data(struct wiphy *wiphy,
3102                                     struct net_device *dev,
3103                                     struct cfg80211_gtk_rekey_data *data)
3104 {
3105         struct ieee80211_local *local = wiphy_priv(wiphy);
3106         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3107
3108         if (!local->ops->set_rekey_data)
3109                 return -EOPNOTSUPP;
3110
3111         drv_set_rekey_data(local, sdata, data);
3112
3113         return 0;
3114 }
3115
3116 static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
3117                                   const u8 *peer, u64 *cookie)
3118 {
3119         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3120         struct ieee80211_local *local = sdata->local;
3121         struct ieee80211_qos_hdr *nullfunc;
3122         struct sk_buff *skb;
3123         int size = sizeof(*nullfunc);
3124         __le16 fc;
3125         bool qos;
3126         struct ieee80211_tx_info *info;
3127         struct sta_info *sta;
3128         struct ieee80211_chanctx_conf *chanctx_conf;
3129         enum ieee80211_band band;
3130         int ret;
3131
3132         /* the lock is needed to assign the cookie later */
3133         mutex_lock(&local->mtx);
3134
3135         rcu_read_lock();
3136         chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3137         if (WARN_ON(!chanctx_conf)) {
3138                 ret = -EINVAL;
3139                 goto unlock;
3140         }
3141         band = chanctx_conf->def.chan->band;
3142         sta = sta_info_get_bss(sdata, peer);
3143         if (sta) {
3144                 qos = sta->sta.wme;
3145         } else {
3146                 ret = -ENOLINK;
3147                 goto unlock;
3148         }
3149
3150         if (qos) {
3151                 fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
3152                                  IEEE80211_STYPE_QOS_NULLFUNC |
3153                                  IEEE80211_FCTL_FROMDS);
3154         } else {
3155                 size -= 2;
3156                 fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
3157                                  IEEE80211_STYPE_NULLFUNC |
3158                                  IEEE80211_FCTL_FROMDS);
3159         }
3160
3161         skb = dev_alloc_skb(local->hw.extra_tx_headroom + size);
3162         if (!skb) {
3163                 ret = -ENOMEM;
3164                 goto unlock;
3165         }
3166
3167         skb->dev = dev;
3168
3169         skb_reserve(skb, local->hw.extra_tx_headroom);
3170
3171         nullfunc = (void *) skb_put(skb, size);
3172         nullfunc->frame_control = fc;
3173         nullfunc->duration_id = 0;
3174         memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN);
3175         memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
3176         memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN);
3177         nullfunc->seq_ctrl = 0;
3178
3179         info = IEEE80211_SKB_CB(skb);
3180
3181         info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS |
3182                        IEEE80211_TX_INTFL_NL80211_FRAME_TX;
3183         info->band = band;
3184
3185         skb_set_queue_mapping(skb, IEEE80211_AC_VO);
3186         skb->priority = 7;
3187         if (qos)
3188                 nullfunc->qos_ctrl = cpu_to_le16(7);
3189
3190         ret = ieee80211_attach_ack_skb(local, skb, cookie, GFP_ATOMIC);
3191         if (ret) {
3192                 kfree_skb(skb);
3193                 goto unlock;
3194         }
3195
3196         local_bh_disable();
3197         ieee80211_xmit(sdata, sta, skb);
3198         local_bh_enable();
3199
3200         ret = 0;
3201 unlock:
3202         rcu_read_unlock();
3203         mutex_unlock(&local->mtx);
3204
3205         return ret;
3206 }
3207
3208 static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
3209                                      struct wireless_dev *wdev,
3210                                      struct cfg80211_chan_def *chandef)
3211 {
3212         struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3213         struct ieee80211_local *local = wiphy_priv(wiphy);
3214         struct ieee80211_chanctx_conf *chanctx_conf;
3215         int ret = -ENODATA;
3216
3217         rcu_read_lock();
3218         chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3219         if (chanctx_conf) {
3220                 *chandef = sdata->vif.bss_conf.chandef;
3221                 ret = 0;
3222         } else if (local->open_count > 0 &&
3223                    local->open_count == local->monitors &&
3224                    sdata->vif.type == NL80211_IFTYPE_MONITOR) {
3225                 if (local->use_chanctx)
3226                         *chandef = local->monitor_chandef;
3227                 else
3228                         *chandef = local->_oper_chandef;
3229                 ret = 0;
3230         }
3231         rcu_read_unlock();
3232
3233         return ret;
3234 }
3235
3236 #ifdef CONFIG_PM
3237 static void ieee80211_set_wakeup(struct wiphy *wiphy, bool enabled)
3238 {
3239         drv_set_wakeup(wiphy_priv(wiphy), enabled);
3240 }
3241 #endif
3242
3243 static int ieee80211_set_qos_map(struct wiphy *wiphy,
3244                                  struct net_device *dev,
3245                                  struct cfg80211_qos_map *qos_map)
3246 {
3247         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3248         struct mac80211_qos_map *new_qos_map, *old_qos_map;
3249
3250         if (qos_map) {
3251                 new_qos_map = kzalloc(sizeof(*new_qos_map), GFP_KERNEL);
3252                 if (!new_qos_map)
3253                         return -ENOMEM;
3254                 memcpy(&new_qos_map->qos_map, qos_map, sizeof(*qos_map));
3255         } else {
3256                 /* A NULL qos_map was passed to disable QoS mapping */
3257                 new_qos_map = NULL;
3258         }
3259
3260         old_qos_map = sdata_dereference(sdata->qos_map, sdata);
3261         rcu_assign_pointer(sdata->qos_map, new_qos_map);
3262         if (old_qos_map)
3263                 kfree_rcu(old_qos_map, rcu_head);
3264
3265         return 0;
3266 }
3267
3268 static int ieee80211_set_ap_chanwidth(struct wiphy *wiphy,
3269                                       struct net_device *dev,
3270                                       struct cfg80211_chan_def *chandef)
3271 {
3272         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3273         int ret;
3274         u32 changed = 0;
3275
3276         ret = ieee80211_vif_change_bandwidth(sdata, chandef, &changed);
3277         if (ret == 0)
3278                 ieee80211_bss_info_change_notify(sdata, changed);
3279
3280         return ret;
3281 }
3282
3283 static int ieee80211_add_tx_ts(struct wiphy *wiphy, struct net_device *dev,
3284                                u8 tsid, const u8 *peer, u8 up,
3285                                u16 admitted_time)
3286 {
3287         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3288         struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3289         int ac = ieee802_1d_to_ac[up];
3290
3291         if (sdata->vif.type != NL80211_IFTYPE_STATION)
3292                 return -EOPNOTSUPP;
3293
3294         if (!(sdata->wmm_acm & BIT(up)))
3295                 return -EINVAL;
3296
3297         if (ifmgd->tx_tspec[ac].admitted_time)
3298                 return -EBUSY;
3299
3300         if (admitted_time) {
3301                 ifmgd->tx_tspec[ac].admitted_time = 32 * admitted_time;
3302                 ifmgd->tx_tspec[ac].tsid = tsid;
3303                 ifmgd->tx_tspec[ac].up = up;
3304         }
3305
3306         return 0;
3307 }
3308
3309 static int ieee80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev,
3310                                u8 tsid, const u8 *peer)
3311 {
3312         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3313         struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3314         struct ieee80211_local *local = wiphy_priv(wiphy);
3315         int ac;
3316
3317         for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
3318                 struct ieee80211_sta_tx_tspec *tx_tspec = &ifmgd->tx_tspec[ac];
3319
3320                 /* skip unused entries */
3321                 if (!tx_tspec->admitted_time)
3322                         continue;
3323
3324                 if (tx_tspec->tsid != tsid)
3325                         continue;
3326
3327                 /* due to this new packets will be reassigned to non-ACM ACs */
3328                 tx_tspec->up = -1;
3329
3330                 /* Make sure that all packets have been sent to avoid to
3331                  * restore the QoS params on packets that are still on the
3332                  * queues.
3333                  */
3334                 synchronize_net();
3335                 ieee80211_flush_queues(local, sdata, false);
3336
3337                 /* restore the normal QoS parameters
3338                  * (unconditionally to avoid races)
3339                  */
3340                 tx_tspec->action = TX_TSPEC_ACTION_STOP_DOWNGRADE;
3341                 tx_tspec->downgraded = false;
3342                 ieee80211_sta_handle_tspec_ac_params(sdata);
3343
3344                 /* finally clear all the data */
3345                 memset(tx_tspec, 0, sizeof(*tx_tspec));
3346
3347                 return 0;
3348         }
3349
3350         return -ENOENT;
3351 }
3352
3353 const struct cfg80211_ops mac80211_config_ops = {
3354         .add_virtual_intf = ieee80211_add_iface,
3355         .del_virtual_intf = ieee80211_del_iface,
3356         .change_virtual_intf = ieee80211_change_iface,
3357         .start_p2p_device = ieee80211_start_p2p_device,
3358         .stop_p2p_device = ieee80211_stop_p2p_device,
3359         .add_key = ieee80211_add_key,
3360         .del_key = ieee80211_del_key,
3361         .get_key = ieee80211_get_key,
3362         .set_default_key = ieee80211_config_default_key,
3363         .set_default_mgmt_key = ieee80211_config_default_mgmt_key,
3364         .start_ap = ieee80211_start_ap,
3365         .change_beacon = ieee80211_change_beacon,
3366         .stop_ap = ieee80211_stop_ap,
3367         .add_station = ieee80211_add_station,
3368         .del_station = ieee80211_del_station,
3369         .change_station = ieee80211_change_station,
3370         .get_station = ieee80211_get_station,
3371         .dump_station = ieee80211_dump_station,
3372         .dump_survey = ieee80211_dump_survey,
3373 #ifdef CONFIG_MAC80211_MESH
3374         .add_mpath = ieee80211_add_mpath,
3375         .del_mpath = ieee80211_del_mpath,
3376         .change_mpath = ieee80211_change_mpath,
3377         .get_mpath = ieee80211_get_mpath,
3378         .dump_mpath = ieee80211_dump_mpath,
3379         .get_mpp = ieee80211_get_mpp,
3380         .dump_mpp = ieee80211_dump_mpp,
3381         .update_mesh_config = ieee80211_update_mesh_config,
3382         .get_mesh_config = ieee80211_get_mesh_config,
3383         .join_mesh = ieee80211_join_mesh,
3384         .leave_mesh = ieee80211_leave_mesh,
3385 #endif
3386         .join_ocb = ieee80211_join_ocb,
3387         .leave_ocb = ieee80211_leave_ocb,
3388         .change_bss = ieee80211_change_bss,
3389         .set_txq_params = ieee80211_set_txq_params,
3390         .set_monitor_channel = ieee80211_set_monitor_channel,
3391         .suspend = ieee80211_suspend,
3392         .resume = ieee80211_resume,
3393         .scan = ieee80211_scan,
3394         .abort_scan = ieee80211_abort_scan,
3395         .sched_scan_start = ieee80211_sched_scan_start,
3396         .sched_scan_stop = ieee80211_sched_scan_stop,
3397         .auth = ieee80211_auth,
3398         .assoc = ieee80211_assoc,
3399         .deauth = ieee80211_deauth,
3400         .disassoc = ieee80211_disassoc,
3401         .join_ibss = ieee80211_join_ibss,
3402         .leave_ibss = ieee80211_leave_ibss,
3403         .set_mcast_rate = ieee80211_set_mcast_rate,
3404         .set_wiphy_params = ieee80211_set_wiphy_params,
3405         .set_tx_power = ieee80211_set_tx_power,
3406         .get_tx_power = ieee80211_get_tx_power,
3407         .set_wds_peer = ieee80211_set_wds_peer,
3408         .rfkill_poll = ieee80211_rfkill_poll,
3409         CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
3410         CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump)
3411         .set_power_mgmt = ieee80211_set_power_mgmt,
3412         .set_bitrate_mask = ieee80211_set_bitrate_mask,
3413         .remain_on_channel = ieee80211_remain_on_channel,
3414         .cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
3415         .mgmt_tx = ieee80211_mgmt_tx,
3416         .mgmt_tx_cancel_wait = ieee80211_mgmt_tx_cancel_wait,
3417         .set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
3418         .mgmt_frame_register = ieee80211_mgmt_frame_register,
3419         .set_antenna = ieee80211_set_antenna,
3420         .get_antenna = ieee80211_get_antenna,
3421         .set_rekey_data = ieee80211_set_rekey_data,
3422         .tdls_oper = ieee80211_tdls_oper,
3423         .tdls_mgmt = ieee80211_tdls_mgmt,
3424         .tdls_channel_switch = ieee80211_tdls_channel_switch,
3425         .tdls_cancel_channel_switch = ieee80211_tdls_cancel_channel_switch,
3426         .probe_client = ieee80211_probe_client,
3427         .set_noack_map = ieee80211_set_noack_map,
3428 #ifdef CONFIG_PM
3429         .set_wakeup = ieee80211_set_wakeup,
3430 #endif
3431         .get_channel = ieee80211_cfg_get_channel,
3432         .start_radar_detection = ieee80211_start_radar_detection,
3433         .channel_switch = ieee80211_channel_switch,
3434         .set_qos_map = ieee80211_set_qos_map,
3435         .set_ap_chanwidth = ieee80211_set_ap_chanwidth,
3436         .add_tx_ts = ieee80211_add_tx_ts,
3437         .del_tx_ts = ieee80211_del_tx_ts,
3438 };