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