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