mac80211: fix handling of 4-address-mode in ieee80211_change_iface
[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 <net/net_namespace.h>
13 #include <linux/rcupdate.h>
14 #include <net/cfg80211.h>
15 #include "ieee80211_i.h"
16 #include "driver-ops.h"
17 #include "cfg.h"
18 #include "rate.h"
19 #include "mesh.h"
20
21 static bool nl80211_type_check(enum nl80211_iftype type)
22 {
23         switch (type) {
24         case NL80211_IFTYPE_ADHOC:
25         case NL80211_IFTYPE_STATION:
26         case NL80211_IFTYPE_MONITOR:
27 #ifdef CONFIG_MAC80211_MESH
28         case NL80211_IFTYPE_MESH_POINT:
29 #endif
30         case NL80211_IFTYPE_AP:
31         case NL80211_IFTYPE_AP_VLAN:
32         case NL80211_IFTYPE_WDS:
33                 return true;
34         default:
35                 return false;
36         }
37 }
38
39 static bool nl80211_params_check(enum nl80211_iftype type,
40                                  struct vif_params *params)
41 {
42         if (!nl80211_type_check(type))
43                 return false;
44
45         return true;
46 }
47
48 static int ieee80211_add_iface(struct wiphy *wiphy, char *name,
49                                enum nl80211_iftype type, u32 *flags,
50                                struct vif_params *params)
51 {
52         struct ieee80211_local *local = wiphy_priv(wiphy);
53         struct net_device *dev;
54         struct ieee80211_sub_if_data *sdata;
55         int err;
56
57         if (!nl80211_params_check(type, params))
58                 return -EINVAL;
59
60         err = ieee80211_if_add(local, name, &dev, type, params);
61         if (err || type != NL80211_IFTYPE_MONITOR || !flags)
62                 return err;
63
64         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
65         sdata->u.mntr_flags = *flags;
66         return 0;
67 }
68
69 static int ieee80211_del_iface(struct wiphy *wiphy, struct net_device *dev)
70 {
71         ieee80211_if_remove(IEEE80211_DEV_TO_SUB_IF(dev));
72
73         return 0;
74 }
75
76 static int ieee80211_change_iface(struct wiphy *wiphy,
77                                   struct net_device *dev,
78                                   enum nl80211_iftype type, u32 *flags,
79                                   struct vif_params *params)
80 {
81         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
82         int ret;
83
84         if (ieee80211_sdata_running(sdata))
85                 return -EBUSY;
86
87         if (!nl80211_params_check(type, params))
88                 return -EINVAL;
89
90         ret = ieee80211_if_change_type(sdata, type);
91         if (ret)
92                 return ret;
93
94         if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
95                 ieee80211_sdata_set_mesh_id(sdata,
96                                             params->mesh_id_len,
97                                             params->mesh_id);
98
99         if (type == NL80211_IFTYPE_AP_VLAN &&
100             params && params->use_4addr == 0)
101                 rcu_assign_pointer(sdata->u.vlan.sta, NULL);
102         else if (type == NL80211_IFTYPE_STATION &&
103                  params && params->use_4addr >= 0)
104                 sdata->u.mgd.use_4addr = params->use_4addr;
105
106         if (sdata->vif.type == NL80211_IFTYPE_MONITOR && flags)
107                 sdata->u.mntr_flags = *flags;
108
109         return 0;
110 }
111
112 static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
113                              u8 key_idx, const u8 *mac_addr,
114                              struct key_params *params)
115 {
116         struct ieee80211_sub_if_data *sdata;
117         struct sta_info *sta = NULL;
118         enum ieee80211_key_alg alg;
119         struct ieee80211_key *key;
120         int err;
121
122         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
123
124         switch (params->cipher) {
125         case WLAN_CIPHER_SUITE_WEP40:
126         case WLAN_CIPHER_SUITE_WEP104:
127                 alg = ALG_WEP;
128                 break;
129         case WLAN_CIPHER_SUITE_TKIP:
130                 alg = ALG_TKIP;
131                 break;
132         case WLAN_CIPHER_SUITE_CCMP:
133                 alg = ALG_CCMP;
134                 break;
135         case WLAN_CIPHER_SUITE_AES_CMAC:
136                 alg = ALG_AES_CMAC;
137                 break;
138         default:
139                 return -EINVAL;
140         }
141
142         key = ieee80211_key_alloc(alg, key_idx, params->key_len, params->key,
143                                   params->seq_len, params->seq);
144         if (!key)
145                 return -ENOMEM;
146
147         rcu_read_lock();
148
149         if (mac_addr) {
150                 sta = sta_info_get_bss(sdata, mac_addr);
151                 if (!sta) {
152                         ieee80211_key_free(key);
153                         err = -ENOENT;
154                         goto out_unlock;
155                 }
156         }
157
158         ieee80211_key_link(key, sdata, sta);
159
160         err = 0;
161  out_unlock:
162         rcu_read_unlock();
163
164         return err;
165 }
166
167 static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
168                              u8 key_idx, const u8 *mac_addr)
169 {
170         struct ieee80211_sub_if_data *sdata;
171         struct sta_info *sta;
172         int ret;
173
174         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
175
176         rcu_read_lock();
177
178         if (mac_addr) {
179                 ret = -ENOENT;
180
181                 sta = sta_info_get_bss(sdata, mac_addr);
182                 if (!sta)
183                         goto out_unlock;
184
185                 if (sta->key) {
186                         ieee80211_key_free(sta->key);
187                         WARN_ON(sta->key);
188                         ret = 0;
189                 }
190
191                 goto out_unlock;
192         }
193
194         if (!sdata->keys[key_idx]) {
195                 ret = -ENOENT;
196                 goto out_unlock;
197         }
198
199         ieee80211_key_free(sdata->keys[key_idx]);
200         WARN_ON(sdata->keys[key_idx]);
201
202         ret = 0;
203  out_unlock:
204         rcu_read_unlock();
205
206         return ret;
207 }
208
209 static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
210                              u8 key_idx, const u8 *mac_addr, void *cookie,
211                              void (*callback)(void *cookie,
212                                               struct key_params *params))
213 {
214         struct ieee80211_sub_if_data *sdata;
215         struct sta_info *sta = NULL;
216         u8 seq[6] = {0};
217         struct key_params params;
218         struct ieee80211_key *key;
219         u32 iv32;
220         u16 iv16;
221         int err = -ENOENT;
222
223         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
224
225         rcu_read_lock();
226
227         if (mac_addr) {
228                 sta = sta_info_get_bss(sdata, mac_addr);
229                 if (!sta)
230                         goto out;
231
232                 key = sta->key;
233         } else
234                 key = sdata->keys[key_idx];
235
236         if (!key)
237                 goto out;
238
239         memset(&params, 0, sizeof(params));
240
241         switch (key->conf.alg) {
242         case ALG_TKIP:
243                 params.cipher = WLAN_CIPHER_SUITE_TKIP;
244
245                 iv32 = key->u.tkip.tx.iv32;
246                 iv16 = key->u.tkip.tx.iv16;
247
248                 if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
249                         drv_get_tkip_seq(sdata->local,
250                                          key->conf.hw_key_idx,
251                                          &iv32, &iv16);
252
253                 seq[0] = iv16 & 0xff;
254                 seq[1] = (iv16 >> 8) & 0xff;
255                 seq[2] = iv32 & 0xff;
256                 seq[3] = (iv32 >> 8) & 0xff;
257                 seq[4] = (iv32 >> 16) & 0xff;
258                 seq[5] = (iv32 >> 24) & 0xff;
259                 params.seq = seq;
260                 params.seq_len = 6;
261                 break;
262         case ALG_CCMP:
263                 params.cipher = WLAN_CIPHER_SUITE_CCMP;
264                 seq[0] = key->u.ccmp.tx_pn[5];
265                 seq[1] = key->u.ccmp.tx_pn[4];
266                 seq[2] = key->u.ccmp.tx_pn[3];
267                 seq[3] = key->u.ccmp.tx_pn[2];
268                 seq[4] = key->u.ccmp.tx_pn[1];
269                 seq[5] = key->u.ccmp.tx_pn[0];
270                 params.seq = seq;
271                 params.seq_len = 6;
272                 break;
273         case ALG_WEP:
274                 if (key->conf.keylen == 5)
275                         params.cipher = WLAN_CIPHER_SUITE_WEP40;
276                 else
277                         params.cipher = WLAN_CIPHER_SUITE_WEP104;
278                 break;
279         case ALG_AES_CMAC:
280                 params.cipher = WLAN_CIPHER_SUITE_AES_CMAC;
281                 seq[0] = key->u.aes_cmac.tx_pn[5];
282                 seq[1] = key->u.aes_cmac.tx_pn[4];
283                 seq[2] = key->u.aes_cmac.tx_pn[3];
284                 seq[3] = key->u.aes_cmac.tx_pn[2];
285                 seq[4] = key->u.aes_cmac.tx_pn[1];
286                 seq[5] = key->u.aes_cmac.tx_pn[0];
287                 params.seq = seq;
288                 params.seq_len = 6;
289                 break;
290         }
291
292         params.key = key->conf.key;
293         params.key_len = key->conf.keylen;
294
295         callback(cookie, &params);
296         err = 0;
297
298  out:
299         rcu_read_unlock();
300         return err;
301 }
302
303 static int ieee80211_config_default_key(struct wiphy *wiphy,
304                                         struct net_device *dev,
305                                         u8 key_idx)
306 {
307         struct ieee80211_sub_if_data *sdata;
308
309         rcu_read_lock();
310
311         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
312         ieee80211_set_default_key(sdata, key_idx);
313
314         rcu_read_unlock();
315
316         return 0;
317 }
318
319 static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
320                                              struct net_device *dev,
321                                              u8 key_idx)
322 {
323         struct ieee80211_sub_if_data *sdata;
324
325         rcu_read_lock();
326
327         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
328         ieee80211_set_default_mgmt_key(sdata, key_idx);
329
330         rcu_read_unlock();
331
332         return 0;
333 }
334
335 static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
336 {
337         struct ieee80211_sub_if_data *sdata = sta->sdata;
338
339         sinfo->generation = sdata->local->sta_generation;
340
341         sinfo->filled = STATION_INFO_INACTIVE_TIME |
342                         STATION_INFO_RX_BYTES |
343                         STATION_INFO_TX_BYTES |
344                         STATION_INFO_RX_PACKETS |
345                         STATION_INFO_TX_PACKETS |
346                         STATION_INFO_TX_BITRATE;
347
348         sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx);
349         sinfo->rx_bytes = sta->rx_bytes;
350         sinfo->tx_bytes = sta->tx_bytes;
351         sinfo->rx_packets = sta->rx_packets;
352         sinfo->tx_packets = sta->tx_packets;
353
354         if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
355             (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
356                 sinfo->filled |= STATION_INFO_SIGNAL;
357                 sinfo->signal = (s8)sta->last_signal;
358         }
359
360         sinfo->txrate.flags = 0;
361         if (sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS)
362                 sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
363         if (sta->last_tx_rate.flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
364                 sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
365         if (sta->last_tx_rate.flags & IEEE80211_TX_RC_SHORT_GI)
366                 sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
367
368         if (!(sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS)) {
369                 struct ieee80211_supported_band *sband;
370                 sband = sta->local->hw.wiphy->bands[
371                                 sta->local->hw.conf.channel->band];
372                 sinfo->txrate.legacy =
373                         sband->bitrates[sta->last_tx_rate.idx].bitrate;
374         } else
375                 sinfo->txrate.mcs = sta->last_tx_rate.idx;
376
377         if (ieee80211_vif_is_mesh(&sdata->vif)) {
378 #ifdef CONFIG_MAC80211_MESH
379                 sinfo->filled |= STATION_INFO_LLID |
380                                  STATION_INFO_PLID |
381                                  STATION_INFO_PLINK_STATE;
382
383                 sinfo->llid = le16_to_cpu(sta->llid);
384                 sinfo->plid = le16_to_cpu(sta->plid);
385                 sinfo->plink_state = sta->plink_state;
386 #endif
387         }
388 }
389
390
391 static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
392                                  int idx, u8 *mac, struct station_info *sinfo)
393 {
394         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
395         struct sta_info *sta;
396         int ret = -ENOENT;
397
398         rcu_read_lock();
399
400         sta = sta_info_get_by_idx(sdata, idx);
401         if (sta) {
402                 ret = 0;
403                 memcpy(mac, sta->sta.addr, ETH_ALEN);
404                 sta_set_sinfo(sta, sinfo);
405         }
406
407         rcu_read_unlock();
408
409         return ret;
410 }
411
412 static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
413                                  int idx, struct survey_info *survey)
414 {
415         struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
416
417         if (!local->ops->get_survey)
418                 return -EOPNOTSUPP;
419
420         return drv_get_survey(local, idx, survey);
421 }
422
423 static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
424                                  u8 *mac, struct station_info *sinfo)
425 {
426         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
427         struct sta_info *sta;
428         int ret = -ENOENT;
429
430         rcu_read_lock();
431
432         sta = sta_info_get_bss(sdata, mac);
433         if (sta) {
434                 ret = 0;
435                 sta_set_sinfo(sta, sinfo);
436         }
437
438         rcu_read_unlock();
439
440         return ret;
441 }
442
443 /*
444  * This handles both adding a beacon and setting new beacon info
445  */
446 static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
447                                    struct beacon_parameters *params)
448 {
449         struct beacon_data *new, *old;
450         int new_head_len, new_tail_len;
451         int size;
452         int err = -EINVAL;
453
454         old = sdata->u.ap.beacon;
455
456         /* head must not be zero-length */
457         if (params->head && !params->head_len)
458                 return -EINVAL;
459
460         /*
461          * This is a kludge. beacon interval should really be part
462          * of the beacon information.
463          */
464         if (params->interval &&
465             (sdata->vif.bss_conf.beacon_int != params->interval)) {
466                 sdata->vif.bss_conf.beacon_int = params->interval;
467                 ieee80211_bss_info_change_notify(sdata,
468                                                  BSS_CHANGED_BEACON_INT);
469         }
470
471         /* Need to have a beacon head if we don't have one yet */
472         if (!params->head && !old)
473                 return err;
474
475         /* sorry, no way to start beaconing without dtim period */
476         if (!params->dtim_period && !old)
477                 return err;
478
479         /* new or old head? */
480         if (params->head)
481                 new_head_len = params->head_len;
482         else
483                 new_head_len = old->head_len;
484
485         /* new or old tail? */
486         if (params->tail || !old)
487                 /* params->tail_len will be zero for !params->tail */
488                 new_tail_len = params->tail_len;
489         else
490                 new_tail_len = old->tail_len;
491
492         size = sizeof(*new) + new_head_len + new_tail_len;
493
494         new = kzalloc(size, GFP_KERNEL);
495         if (!new)
496                 return -ENOMEM;
497
498         /* start filling the new info now */
499
500         /* new or old dtim period? */
501         if (params->dtim_period)
502                 new->dtim_period = params->dtim_period;
503         else
504                 new->dtim_period = old->dtim_period;
505
506         /*
507          * pointers go into the block we allocated,
508          * memory is | beacon_data | head | tail |
509          */
510         new->head = ((u8 *) new) + sizeof(*new);
511         new->tail = new->head + new_head_len;
512         new->head_len = new_head_len;
513         new->tail_len = new_tail_len;
514
515         /* copy in head */
516         if (params->head)
517                 memcpy(new->head, params->head, new_head_len);
518         else
519                 memcpy(new->head, old->head, new_head_len);
520
521         /* copy in optional tail */
522         if (params->tail)
523                 memcpy(new->tail, params->tail, new_tail_len);
524         else
525                 if (old)
526                         memcpy(new->tail, old->tail, new_tail_len);
527
528         sdata->vif.bss_conf.dtim_period = new->dtim_period;
529
530         rcu_assign_pointer(sdata->u.ap.beacon, new);
531
532         synchronize_rcu();
533
534         kfree(old);
535
536         ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
537                                                 BSS_CHANGED_BEACON);
538         return 0;
539 }
540
541 static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
542                                 struct beacon_parameters *params)
543 {
544         struct ieee80211_sub_if_data *sdata;
545         struct beacon_data *old;
546
547         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
548
549         old = sdata->u.ap.beacon;
550
551         if (old)
552                 return -EALREADY;
553
554         return ieee80211_config_beacon(sdata, params);
555 }
556
557 static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
558                                 struct beacon_parameters *params)
559 {
560         struct ieee80211_sub_if_data *sdata;
561         struct beacon_data *old;
562
563         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
564
565         old = sdata->u.ap.beacon;
566
567         if (!old)
568                 return -ENOENT;
569
570         return ieee80211_config_beacon(sdata, params);
571 }
572
573 static int ieee80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
574 {
575         struct ieee80211_sub_if_data *sdata;
576         struct beacon_data *old;
577
578         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
579
580         old = sdata->u.ap.beacon;
581
582         if (!old)
583                 return -ENOENT;
584
585         rcu_assign_pointer(sdata->u.ap.beacon, NULL);
586         synchronize_rcu();
587         kfree(old);
588
589         ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
590         return 0;
591 }
592
593 /* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
594 struct iapp_layer2_update {
595         u8 da[ETH_ALEN];        /* broadcast */
596         u8 sa[ETH_ALEN];        /* STA addr */
597         __be16 len;             /* 6 */
598         u8 dsap;                /* 0 */
599         u8 ssap;                /* 0 */
600         u8 control;
601         u8 xid_info[3];
602 } __attribute__ ((packed));
603
604 static void ieee80211_send_layer2_update(struct sta_info *sta)
605 {
606         struct iapp_layer2_update *msg;
607         struct sk_buff *skb;
608
609         /* Send Level 2 Update Frame to update forwarding tables in layer 2
610          * bridge devices */
611
612         skb = dev_alloc_skb(sizeof(*msg));
613         if (!skb)
614                 return;
615         msg = (struct iapp_layer2_update *)skb_put(skb, sizeof(*msg));
616
617         /* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
618          * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
619
620         memset(msg->da, 0xff, ETH_ALEN);
621         memcpy(msg->sa, sta->sta.addr, ETH_ALEN);
622         msg->len = htons(6);
623         msg->dsap = 0;
624         msg->ssap = 0x01;       /* NULL LSAP, CR Bit: Response */
625         msg->control = 0xaf;    /* XID response lsb.1111F101.
626                                  * F=0 (no poll command; unsolicited frame) */
627         msg->xid_info[0] = 0x81;        /* XID format identifier */
628         msg->xid_info[1] = 1;   /* LLC types/classes: Type 1 LLC */
629         msg->xid_info[2] = 0;   /* XID sender's receive window size (RW) */
630
631         skb->dev = sta->sdata->dev;
632         skb->protocol = eth_type_trans(skb, sta->sdata->dev);
633         memset(skb->cb, 0, sizeof(skb->cb));
634         netif_rx(skb);
635 }
636
637 static void sta_apply_parameters(struct ieee80211_local *local,
638                                  struct sta_info *sta,
639                                  struct station_parameters *params)
640 {
641         u32 rates;
642         int i, j;
643         struct ieee80211_supported_band *sband;
644         struct ieee80211_sub_if_data *sdata = sta->sdata;
645         u32 mask, set;
646
647         sband = local->hw.wiphy->bands[local->oper_channel->band];
648
649         spin_lock_bh(&sta->lock);
650         mask = params->sta_flags_mask;
651         set = params->sta_flags_set;
652
653         if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
654                 sta->flags &= ~WLAN_STA_AUTHORIZED;
655                 if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
656                         sta->flags |= WLAN_STA_AUTHORIZED;
657         }
658
659         if (mask & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE)) {
660                 sta->flags &= ~WLAN_STA_SHORT_PREAMBLE;
661                 if (set & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE))
662                         sta->flags |= WLAN_STA_SHORT_PREAMBLE;
663         }
664
665         if (mask & BIT(NL80211_STA_FLAG_WME)) {
666                 sta->flags &= ~WLAN_STA_WME;
667                 if (set & BIT(NL80211_STA_FLAG_WME))
668                         sta->flags |= WLAN_STA_WME;
669         }
670
671         if (mask & BIT(NL80211_STA_FLAG_MFP)) {
672                 sta->flags &= ~WLAN_STA_MFP;
673                 if (set & BIT(NL80211_STA_FLAG_MFP))
674                         sta->flags |= WLAN_STA_MFP;
675         }
676         spin_unlock_bh(&sta->lock);
677
678         /*
679          * cfg80211 validates this (1-2007) and allows setting the AID
680          * only when creating a new station entry
681          */
682         if (params->aid)
683                 sta->sta.aid = params->aid;
684
685         /*
686          * FIXME: updating the following information is racy when this
687          *        function is called from ieee80211_change_station().
688          *        However, all this information should be static so
689          *        maybe we should just reject attemps to change it.
690          */
691
692         if (params->listen_interval >= 0)
693                 sta->listen_interval = params->listen_interval;
694
695         if (params->supported_rates) {
696                 rates = 0;
697
698                 for (i = 0; i < params->supported_rates_len; i++) {
699                         int rate = (params->supported_rates[i] & 0x7f) * 5;
700                         for (j = 0; j < sband->n_bitrates; j++) {
701                                 if (sband->bitrates[j].bitrate == rate)
702                                         rates |= BIT(j);
703                         }
704                 }
705                 sta->sta.supp_rates[local->oper_channel->band] = rates;
706         }
707
708         if (params->ht_capa)
709                 ieee80211_ht_cap_ie_to_sta_ht_cap(sband,
710                                                   params->ht_capa,
711                                                   &sta->sta.ht_cap);
712
713         if (ieee80211_vif_is_mesh(&sdata->vif) && params->plink_action) {
714                 switch (params->plink_action) {
715                 case PLINK_ACTION_OPEN:
716                         mesh_plink_open(sta);
717                         break;
718                 case PLINK_ACTION_BLOCK:
719                         mesh_plink_block(sta);
720                         break;
721                 }
722         }
723 }
724
725 static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
726                                  u8 *mac, struct station_parameters *params)
727 {
728         struct ieee80211_local *local = wiphy_priv(wiphy);
729         struct sta_info *sta;
730         struct ieee80211_sub_if_data *sdata;
731         int err;
732         int layer2_update;
733
734         if (params->vlan) {
735                 sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
736
737                 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
738                     sdata->vif.type != NL80211_IFTYPE_AP)
739                         return -EINVAL;
740         } else
741                 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
742
743         if (compare_ether_addr(mac, sdata->vif.addr) == 0)
744                 return -EINVAL;
745
746         if (is_multicast_ether_addr(mac))
747                 return -EINVAL;
748
749         sta = sta_info_alloc(sdata, mac, GFP_KERNEL);
750         if (!sta)
751                 return -ENOMEM;
752
753         sta->flags = WLAN_STA_AUTH | WLAN_STA_ASSOC;
754
755         sta_apply_parameters(local, sta, params);
756
757         rate_control_rate_init(sta);
758
759         layer2_update = sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
760                 sdata->vif.type == NL80211_IFTYPE_AP;
761
762         err = sta_info_insert_rcu(sta);
763         if (err) {
764                 rcu_read_unlock();
765                 return err;
766         }
767
768         if (layer2_update)
769                 ieee80211_send_layer2_update(sta);
770
771         rcu_read_unlock();
772
773         return 0;
774 }
775
776 static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
777                                  u8 *mac)
778 {
779         struct ieee80211_local *local = wiphy_priv(wiphy);
780         struct ieee80211_sub_if_data *sdata;
781
782         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
783
784         if (mac)
785                 return sta_info_destroy_addr_bss(sdata, mac);
786
787         sta_info_flush(local, sdata);
788         return 0;
789 }
790
791 static int ieee80211_change_station(struct wiphy *wiphy,
792                                     struct net_device *dev,
793                                     u8 *mac,
794                                     struct station_parameters *params)
795 {
796         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
797         struct ieee80211_local *local = wiphy_priv(wiphy);
798         struct sta_info *sta;
799         struct ieee80211_sub_if_data *vlansdata;
800
801         rcu_read_lock();
802
803         sta = sta_info_get_bss(sdata, mac);
804         if (!sta) {
805                 rcu_read_unlock();
806                 return -ENOENT;
807         }
808
809         if (params->vlan && params->vlan != sta->sdata->dev) {
810                 vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
811
812                 if (vlansdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
813                     vlansdata->vif.type != NL80211_IFTYPE_AP) {
814                         rcu_read_unlock();
815                         return -EINVAL;
816                 }
817
818                 if (params->vlan->ieee80211_ptr->use_4addr) {
819                         if (vlansdata->u.vlan.sta) {
820                                 rcu_read_unlock();
821                                 return -EBUSY;
822                         }
823
824                         rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
825                 }
826
827                 sta->sdata = vlansdata;
828                 ieee80211_send_layer2_update(sta);
829         }
830
831         sta_apply_parameters(local, sta, params);
832
833         rcu_read_unlock();
834
835         return 0;
836 }
837
838 #ifdef CONFIG_MAC80211_MESH
839 static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
840                                  u8 *dst, u8 *next_hop)
841 {
842         struct ieee80211_sub_if_data *sdata;
843         struct mesh_path *mpath;
844         struct sta_info *sta;
845         int err;
846
847         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
848
849         rcu_read_lock();
850         sta = sta_info_get(sdata, next_hop);
851         if (!sta) {
852                 rcu_read_unlock();
853                 return -ENOENT;
854         }
855
856         err = mesh_path_add(dst, sdata);
857         if (err) {
858                 rcu_read_unlock();
859                 return err;
860         }
861
862         mpath = mesh_path_lookup(dst, sdata);
863         if (!mpath) {
864                 rcu_read_unlock();
865                 return -ENXIO;
866         }
867         mesh_path_fix_nexthop(mpath, sta);
868
869         rcu_read_unlock();
870         return 0;
871 }
872
873 static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev,
874                                  u8 *dst)
875 {
876         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
877
878         if (dst)
879                 return mesh_path_del(dst, sdata);
880
881         mesh_path_flush(sdata);
882         return 0;
883 }
884
885 static int ieee80211_change_mpath(struct wiphy *wiphy,
886                                     struct net_device *dev,
887                                     u8 *dst, u8 *next_hop)
888 {
889         struct ieee80211_sub_if_data *sdata;
890         struct mesh_path *mpath;
891         struct sta_info *sta;
892
893         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
894
895         rcu_read_lock();
896
897         sta = sta_info_get(sdata, next_hop);
898         if (!sta) {
899                 rcu_read_unlock();
900                 return -ENOENT;
901         }
902
903         mpath = mesh_path_lookup(dst, sdata);
904         if (!mpath) {
905                 rcu_read_unlock();
906                 return -ENOENT;
907         }
908
909         mesh_path_fix_nexthop(mpath, sta);
910
911         rcu_read_unlock();
912         return 0;
913 }
914
915 static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
916                             struct mpath_info *pinfo)
917 {
918         if (mpath->next_hop)
919                 memcpy(next_hop, mpath->next_hop->sta.addr, ETH_ALEN);
920         else
921                 memset(next_hop, 0, ETH_ALEN);
922
923         pinfo->generation = mesh_paths_generation;
924
925         pinfo->filled = MPATH_INFO_FRAME_QLEN |
926                         MPATH_INFO_SN |
927                         MPATH_INFO_METRIC |
928                         MPATH_INFO_EXPTIME |
929                         MPATH_INFO_DISCOVERY_TIMEOUT |
930                         MPATH_INFO_DISCOVERY_RETRIES |
931                         MPATH_INFO_FLAGS;
932
933         pinfo->frame_qlen = mpath->frame_queue.qlen;
934         pinfo->sn = mpath->sn;
935         pinfo->metric = mpath->metric;
936         if (time_before(jiffies, mpath->exp_time))
937                 pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies);
938         pinfo->discovery_timeout =
939                         jiffies_to_msecs(mpath->discovery_timeout);
940         pinfo->discovery_retries = mpath->discovery_retries;
941         pinfo->flags = 0;
942         if (mpath->flags & MESH_PATH_ACTIVE)
943                 pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE;
944         if (mpath->flags & MESH_PATH_RESOLVING)
945                 pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
946         if (mpath->flags & MESH_PATH_SN_VALID)
947                 pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID;
948         if (mpath->flags & MESH_PATH_FIXED)
949                 pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
950         if (mpath->flags & MESH_PATH_RESOLVING)
951                 pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
952
953         pinfo->flags = mpath->flags;
954 }
955
956 static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
957                                u8 *dst, u8 *next_hop, struct mpath_info *pinfo)
958
959 {
960         struct ieee80211_sub_if_data *sdata;
961         struct mesh_path *mpath;
962
963         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
964
965         rcu_read_lock();
966         mpath = mesh_path_lookup(dst, sdata);
967         if (!mpath) {
968                 rcu_read_unlock();
969                 return -ENOENT;
970         }
971         memcpy(dst, mpath->dst, ETH_ALEN);
972         mpath_set_pinfo(mpath, next_hop, pinfo);
973         rcu_read_unlock();
974         return 0;
975 }
976
977 static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
978                                  int idx, u8 *dst, u8 *next_hop,
979                                  struct mpath_info *pinfo)
980 {
981         struct ieee80211_sub_if_data *sdata;
982         struct mesh_path *mpath;
983
984         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
985
986         rcu_read_lock();
987         mpath = mesh_path_lookup_by_idx(idx, sdata);
988         if (!mpath) {
989                 rcu_read_unlock();
990                 return -ENOENT;
991         }
992         memcpy(dst, mpath->dst, ETH_ALEN);
993         mpath_set_pinfo(mpath, next_hop, pinfo);
994         rcu_read_unlock();
995         return 0;
996 }
997
998 static int ieee80211_get_mesh_params(struct wiphy *wiphy,
999                                 struct net_device *dev,
1000                                 struct mesh_config *conf)
1001 {
1002         struct ieee80211_sub_if_data *sdata;
1003         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1004
1005         memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config));
1006         return 0;
1007 }
1008
1009 static inline bool _chg_mesh_attr(enum nl80211_meshconf_params parm, u32 mask)
1010 {
1011         return (mask >> (parm-1)) & 0x1;
1012 }
1013
1014 static int ieee80211_set_mesh_params(struct wiphy *wiphy,
1015                                 struct net_device *dev,
1016                                 const struct mesh_config *nconf, u32 mask)
1017 {
1018         struct mesh_config *conf;
1019         struct ieee80211_sub_if_data *sdata;
1020         struct ieee80211_if_mesh *ifmsh;
1021
1022         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1023         ifmsh = &sdata->u.mesh;
1024
1025         /* Set the config options which we are interested in setting */
1026         conf = &(sdata->u.mesh.mshcfg);
1027         if (_chg_mesh_attr(NL80211_MESHCONF_RETRY_TIMEOUT, mask))
1028                 conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout;
1029         if (_chg_mesh_attr(NL80211_MESHCONF_CONFIRM_TIMEOUT, mask))
1030                 conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout;
1031         if (_chg_mesh_attr(NL80211_MESHCONF_HOLDING_TIMEOUT, mask))
1032                 conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout;
1033         if (_chg_mesh_attr(NL80211_MESHCONF_MAX_PEER_LINKS, mask))
1034                 conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks;
1035         if (_chg_mesh_attr(NL80211_MESHCONF_MAX_RETRIES, mask))
1036                 conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries;
1037         if (_chg_mesh_attr(NL80211_MESHCONF_TTL, mask))
1038                 conf->dot11MeshTTL = nconf->dot11MeshTTL;
1039         if (_chg_mesh_attr(NL80211_MESHCONF_AUTO_OPEN_PLINKS, mask))
1040                 conf->auto_open_plinks = nconf->auto_open_plinks;
1041         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, mask))
1042                 conf->dot11MeshHWMPmaxPREQretries =
1043                         nconf->dot11MeshHWMPmaxPREQretries;
1044         if (_chg_mesh_attr(NL80211_MESHCONF_PATH_REFRESH_TIME, mask))
1045                 conf->path_refresh_time = nconf->path_refresh_time;
1046         if (_chg_mesh_attr(NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, mask))
1047                 conf->min_discovery_timeout = nconf->min_discovery_timeout;
1048         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, mask))
1049                 conf->dot11MeshHWMPactivePathTimeout =
1050                         nconf->dot11MeshHWMPactivePathTimeout;
1051         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask))
1052                 conf->dot11MeshHWMPpreqMinInterval =
1053                         nconf->dot11MeshHWMPpreqMinInterval;
1054         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
1055                            mask))
1056                 conf->dot11MeshHWMPnetDiameterTraversalTime =
1057                         nconf->dot11MeshHWMPnetDiameterTraversalTime;
1058         if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) {
1059                 conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode;
1060                 ieee80211_mesh_root_setup(ifmsh);
1061         }
1062         return 0;
1063 }
1064
1065 #endif
1066
1067 static int ieee80211_change_bss(struct wiphy *wiphy,
1068                                 struct net_device *dev,
1069                                 struct bss_parameters *params)
1070 {
1071         struct ieee80211_sub_if_data *sdata;
1072         u32 changed = 0;
1073
1074         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1075
1076         if (params->use_cts_prot >= 0) {
1077                 sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
1078                 changed |= BSS_CHANGED_ERP_CTS_PROT;
1079         }
1080         if (params->use_short_preamble >= 0) {
1081                 sdata->vif.bss_conf.use_short_preamble =
1082                         params->use_short_preamble;
1083                 changed |= BSS_CHANGED_ERP_PREAMBLE;
1084         }
1085
1086         if (!sdata->vif.bss_conf.use_short_slot &&
1087             sdata->local->hw.conf.channel->band == IEEE80211_BAND_5GHZ) {
1088                 sdata->vif.bss_conf.use_short_slot = true;
1089                 changed |= BSS_CHANGED_ERP_SLOT;
1090         }
1091
1092         if (params->use_short_slot_time >= 0) {
1093                 sdata->vif.bss_conf.use_short_slot =
1094                         params->use_short_slot_time;
1095                 changed |= BSS_CHANGED_ERP_SLOT;
1096         }
1097
1098         if (params->basic_rates) {
1099                 int i, j;
1100                 u32 rates = 0;
1101                 struct ieee80211_local *local = wiphy_priv(wiphy);
1102                 struct ieee80211_supported_band *sband =
1103                         wiphy->bands[local->oper_channel->band];
1104
1105                 for (i = 0; i < params->basic_rates_len; i++) {
1106                         int rate = (params->basic_rates[i] & 0x7f) * 5;
1107                         for (j = 0; j < sband->n_bitrates; j++) {
1108                                 if (sband->bitrates[j].bitrate == rate)
1109                                         rates |= BIT(j);
1110                         }
1111                 }
1112                 sdata->vif.bss_conf.basic_rates = rates;
1113                 changed |= BSS_CHANGED_BASIC_RATES;
1114         }
1115
1116         ieee80211_bss_info_change_notify(sdata, changed);
1117
1118         return 0;
1119 }
1120
1121 static int ieee80211_set_txq_params(struct wiphy *wiphy,
1122                                     struct ieee80211_txq_params *params)
1123 {
1124         struct ieee80211_local *local = wiphy_priv(wiphy);
1125         struct ieee80211_tx_queue_params p;
1126
1127         if (!local->ops->conf_tx)
1128                 return -EOPNOTSUPP;
1129
1130         memset(&p, 0, sizeof(p));
1131         p.aifs = params->aifs;
1132         p.cw_max = params->cwmax;
1133         p.cw_min = params->cwmin;
1134         p.txop = params->txop;
1135
1136         /*
1137          * Setting tx queue params disables u-apsd because it's only
1138          * called in master mode.
1139          */
1140         p.uapsd = false;
1141
1142         if (drv_conf_tx(local, params->queue, &p)) {
1143                 printk(KERN_DEBUG "%s: failed to set TX queue "
1144                        "parameters for queue %d\n",
1145                        wiphy_name(local->hw.wiphy), params->queue);
1146                 return -EINVAL;
1147         }
1148
1149         /* enable WMM or activate new settings */
1150         local->hw.conf.flags |= IEEE80211_CONF_QOS;
1151         drv_config(local, IEEE80211_CONF_CHANGE_QOS);
1152
1153         return 0;
1154 }
1155
1156 static int ieee80211_set_channel(struct wiphy *wiphy,
1157                                  struct ieee80211_channel *chan,
1158                                  enum nl80211_channel_type channel_type)
1159 {
1160         struct ieee80211_local *local = wiphy_priv(wiphy);
1161
1162         local->oper_channel = chan;
1163         local->oper_channel_type = channel_type;
1164
1165         return ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
1166 }
1167
1168 #ifdef CONFIG_PM
1169 static int ieee80211_suspend(struct wiphy *wiphy)
1170 {
1171         return __ieee80211_suspend(wiphy_priv(wiphy));
1172 }
1173
1174 static int ieee80211_resume(struct wiphy *wiphy)
1175 {
1176         return __ieee80211_resume(wiphy_priv(wiphy));
1177 }
1178 #else
1179 #define ieee80211_suspend NULL
1180 #define ieee80211_resume NULL
1181 #endif
1182
1183 static int ieee80211_scan(struct wiphy *wiphy,
1184                           struct net_device *dev,
1185                           struct cfg80211_scan_request *req)
1186 {
1187         struct ieee80211_sub_if_data *sdata;
1188
1189         sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1190
1191         if (sdata->vif.type != NL80211_IFTYPE_STATION &&
1192             sdata->vif.type != NL80211_IFTYPE_ADHOC &&
1193             sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
1194             (sdata->vif.type != NL80211_IFTYPE_AP || sdata->u.ap.beacon))
1195                 return -EOPNOTSUPP;
1196
1197         return ieee80211_request_scan(sdata, req);
1198 }
1199
1200 static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
1201                           struct cfg80211_auth_request *req)
1202 {
1203         return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req);
1204 }
1205
1206 static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
1207                            struct cfg80211_assoc_request *req)
1208 {
1209         return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
1210 }
1211
1212 static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev,
1213                             struct cfg80211_deauth_request *req,
1214                             void *cookie)
1215 {
1216         return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev),
1217                                     req, cookie);
1218 }
1219
1220 static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev,
1221                               struct cfg80211_disassoc_request *req,
1222                               void *cookie)
1223 {
1224         return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev),
1225                                       req, cookie);
1226 }
1227
1228 static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
1229                                struct cfg80211_ibss_params *params)
1230 {
1231         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1232
1233         return ieee80211_ibss_join(sdata, params);
1234 }
1235
1236 static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
1237 {
1238         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1239
1240         return ieee80211_ibss_leave(sdata);
1241 }
1242
1243 static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
1244 {
1245         struct ieee80211_local *local = wiphy_priv(wiphy);
1246         int err;
1247
1248         if (changed & WIPHY_PARAM_COVERAGE_CLASS) {
1249                 err = drv_set_coverage_class(local, wiphy->coverage_class);
1250
1251                 if (err)
1252                         return err;
1253         }
1254
1255         if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
1256                 err = drv_set_rts_threshold(local, wiphy->rts_threshold);
1257
1258                 if (err)
1259                         return err;
1260         }
1261
1262         if (changed & WIPHY_PARAM_RETRY_SHORT)
1263                 local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
1264         if (changed & WIPHY_PARAM_RETRY_LONG)
1265                 local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
1266         if (changed &
1267             (WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
1268                 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
1269
1270         return 0;
1271 }
1272
1273 static int ieee80211_set_tx_power(struct wiphy *wiphy,
1274                                   enum tx_power_setting type, int dbm)
1275 {
1276         struct ieee80211_local *local = wiphy_priv(wiphy);
1277         struct ieee80211_channel *chan = local->hw.conf.channel;
1278         u32 changes = 0;
1279
1280         switch (type) {
1281         case TX_POWER_AUTOMATIC:
1282                 local->user_power_level = -1;
1283                 break;
1284         case TX_POWER_LIMITED:
1285                 if (dbm < 0)
1286                         return -EINVAL;
1287                 local->user_power_level = dbm;
1288                 break;
1289         case TX_POWER_FIXED:
1290                 if (dbm < 0)
1291                         return -EINVAL;
1292                 /* TODO: move to cfg80211 when it knows the channel */
1293                 if (dbm > chan->max_power)
1294                         return -EINVAL;
1295                 local->user_power_level = dbm;
1296                 break;
1297         }
1298
1299         ieee80211_hw_config(local, changes);
1300
1301         return 0;
1302 }
1303
1304 static int ieee80211_get_tx_power(struct wiphy *wiphy, int *dbm)
1305 {
1306         struct ieee80211_local *local = wiphy_priv(wiphy);
1307
1308         *dbm = local->hw.conf.power_level;
1309
1310         return 0;
1311 }
1312
1313 static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
1314                                   u8 *addr)
1315 {
1316         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1317
1318         memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN);
1319
1320         return 0;
1321 }
1322
1323 static void ieee80211_rfkill_poll(struct wiphy *wiphy)
1324 {
1325         struct ieee80211_local *local = wiphy_priv(wiphy);
1326
1327         drv_rfkill_poll(local);
1328 }
1329
1330 #ifdef CONFIG_NL80211_TESTMODE
1331 static int ieee80211_testmode_cmd(struct wiphy *wiphy, void *data, int len)
1332 {
1333         struct ieee80211_local *local = wiphy_priv(wiphy);
1334
1335         if (!local->ops->testmode_cmd)
1336                 return -EOPNOTSUPP;
1337
1338         return local->ops->testmode_cmd(&local->hw, data, len);
1339 }
1340 #endif
1341
1342 int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
1343                              enum ieee80211_smps_mode smps_mode)
1344 {
1345         const u8 *ap;
1346         enum ieee80211_smps_mode old_req;
1347         int err;
1348
1349         old_req = sdata->u.mgd.req_smps;
1350         sdata->u.mgd.req_smps = smps_mode;
1351
1352         if (old_req == smps_mode &&
1353             smps_mode != IEEE80211_SMPS_AUTOMATIC)
1354                 return 0;
1355
1356         /*
1357          * If not associated, or current association is not an HT
1358          * association, there's no need to send an action frame.
1359          */
1360         if (!sdata->u.mgd.associated ||
1361             sdata->local->oper_channel_type == NL80211_CHAN_NO_HT) {
1362                 mutex_lock(&sdata->local->iflist_mtx);
1363                 ieee80211_recalc_smps(sdata->local, sdata);
1364                 mutex_unlock(&sdata->local->iflist_mtx);
1365                 return 0;
1366         }
1367
1368         ap = sdata->u.mgd.associated->bssid;
1369
1370         if (smps_mode == IEEE80211_SMPS_AUTOMATIC) {
1371                 if (sdata->u.mgd.powersave)
1372                         smps_mode = IEEE80211_SMPS_DYNAMIC;
1373                 else
1374                         smps_mode = IEEE80211_SMPS_OFF;
1375         }
1376
1377         /* send SM PS frame to AP */
1378         err = ieee80211_send_smps_action(sdata, smps_mode,
1379                                          ap, ap);
1380         if (err)
1381                 sdata->u.mgd.req_smps = old_req;
1382
1383         return err;
1384 }
1385
1386 static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
1387                                     bool enabled, int timeout)
1388 {
1389         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1390         struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1391         struct ieee80211_conf *conf = &local->hw.conf;
1392
1393         if (sdata->vif.type != NL80211_IFTYPE_STATION)
1394                 return -EOPNOTSUPP;
1395
1396         if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
1397                 return -EOPNOTSUPP;
1398
1399         if (enabled == sdata->u.mgd.powersave &&
1400             timeout == conf->dynamic_ps_timeout)
1401                 return 0;
1402
1403         sdata->u.mgd.powersave = enabled;
1404         conf->dynamic_ps_timeout = timeout;
1405
1406         /* no change, but if automatic follow powersave */
1407         mutex_lock(&sdata->u.mgd.mtx);
1408         __ieee80211_request_smps(sdata, sdata->u.mgd.req_smps);
1409         mutex_unlock(&sdata->u.mgd.mtx);
1410
1411         if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)
1412                 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1413
1414         ieee80211_recalc_ps(local, -1);
1415
1416         return 0;
1417 }
1418
1419 static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
1420                                          struct net_device *dev,
1421                                          s32 rssi_thold, u32 rssi_hyst)
1422 {
1423         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1424         struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1425         struct ieee80211_vif *vif = &sdata->vif;
1426         struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
1427
1428         if (rssi_thold == bss_conf->cqm_rssi_thold &&
1429             rssi_hyst == bss_conf->cqm_rssi_hyst)
1430                 return 0;
1431
1432         bss_conf->cqm_rssi_thold = rssi_thold;
1433         bss_conf->cqm_rssi_hyst = rssi_hyst;
1434
1435         if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_CQM_RSSI)) {
1436                 if (sdata->vif.type != NL80211_IFTYPE_STATION)
1437                         return -EOPNOTSUPP;
1438                 return 0;
1439         }
1440
1441         /* tell the driver upon association, unless already associated */
1442         if (sdata->u.mgd.associated)
1443                 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
1444
1445         return 0;
1446 }
1447
1448 static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
1449                                       struct net_device *dev,
1450                                       const u8 *addr,
1451                                       const struct cfg80211_bitrate_mask *mask)
1452 {
1453         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1454         struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1455         int i;
1456
1457         /*
1458          * This _could_ be supported by providing a hook for
1459          * drivers for this function, but at this point it
1460          * doesn't seem worth bothering.
1461          */
1462         if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
1463                 return -EOPNOTSUPP;
1464
1465
1466         for (i = 0; i < IEEE80211_NUM_BANDS; i++)
1467                 sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
1468
1469         return 0;
1470 }
1471
1472 static int ieee80211_remain_on_channel(struct wiphy *wiphy,
1473                                        struct net_device *dev,
1474                                        struct ieee80211_channel *chan,
1475                                        enum nl80211_channel_type channel_type,
1476                                        unsigned int duration,
1477                                        u64 *cookie)
1478 {
1479         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1480
1481         return ieee80211_wk_remain_on_channel(sdata, chan, channel_type,
1482                                               duration, cookie);
1483 }
1484
1485 static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
1486                                               struct net_device *dev,
1487                                               u64 cookie)
1488 {
1489         struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1490
1491         return ieee80211_wk_cancel_remain_on_channel(sdata, cookie);
1492 }
1493
1494 static int ieee80211_action(struct wiphy *wiphy, struct net_device *dev,
1495                             struct ieee80211_channel *chan,
1496                             enum nl80211_channel_type channel_type,
1497                             const u8 *buf, size_t len, u64 *cookie)
1498 {
1499         return ieee80211_mgd_action(IEEE80211_DEV_TO_SUB_IF(dev), chan,
1500                                     channel_type, buf, len, cookie);
1501 }
1502
1503 struct cfg80211_ops mac80211_config_ops = {
1504         .add_virtual_intf = ieee80211_add_iface,
1505         .del_virtual_intf = ieee80211_del_iface,
1506         .change_virtual_intf = ieee80211_change_iface,
1507         .add_key = ieee80211_add_key,
1508         .del_key = ieee80211_del_key,
1509         .get_key = ieee80211_get_key,
1510         .set_default_key = ieee80211_config_default_key,
1511         .set_default_mgmt_key = ieee80211_config_default_mgmt_key,
1512         .add_beacon = ieee80211_add_beacon,
1513         .set_beacon = ieee80211_set_beacon,
1514         .del_beacon = ieee80211_del_beacon,
1515         .add_station = ieee80211_add_station,
1516         .del_station = ieee80211_del_station,
1517         .change_station = ieee80211_change_station,
1518         .get_station = ieee80211_get_station,
1519         .dump_station = ieee80211_dump_station,
1520         .dump_survey = ieee80211_dump_survey,
1521 #ifdef CONFIG_MAC80211_MESH
1522         .add_mpath = ieee80211_add_mpath,
1523         .del_mpath = ieee80211_del_mpath,
1524         .change_mpath = ieee80211_change_mpath,
1525         .get_mpath = ieee80211_get_mpath,
1526         .dump_mpath = ieee80211_dump_mpath,
1527         .set_mesh_params = ieee80211_set_mesh_params,
1528         .get_mesh_params = ieee80211_get_mesh_params,
1529 #endif
1530         .change_bss = ieee80211_change_bss,
1531         .set_txq_params = ieee80211_set_txq_params,
1532         .set_channel = ieee80211_set_channel,
1533         .suspend = ieee80211_suspend,
1534         .resume = ieee80211_resume,
1535         .scan = ieee80211_scan,
1536         .auth = ieee80211_auth,
1537         .assoc = ieee80211_assoc,
1538         .deauth = ieee80211_deauth,
1539         .disassoc = ieee80211_disassoc,
1540         .join_ibss = ieee80211_join_ibss,
1541         .leave_ibss = ieee80211_leave_ibss,
1542         .set_wiphy_params = ieee80211_set_wiphy_params,
1543         .set_tx_power = ieee80211_set_tx_power,
1544         .get_tx_power = ieee80211_get_tx_power,
1545         .set_wds_peer = ieee80211_set_wds_peer,
1546         .rfkill_poll = ieee80211_rfkill_poll,
1547         CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
1548         .set_power_mgmt = ieee80211_set_power_mgmt,
1549         .set_bitrate_mask = ieee80211_set_bitrate_mask,
1550         .remain_on_channel = ieee80211_remain_on_channel,
1551         .cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
1552         .action = ieee80211_action,
1553         .set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
1554 };