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