OSDN Git Service

cfg80211: make wdev_list accessible to drivers
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / net / wireless / core.c
1 /*
2  * This is the linux wireless configuration interface.
3  *
4  * Copyright 2006-2010          Johannes Berg <johannes@sipsolutions.net>
5  * Copyright 2013-2014  Intel Mobile Communications GmbH
6  * Copyright 2015       Intel Deutschland GmbH
7  */
8
9 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10
11 #include <linux/if.h>
12 #include <linux/module.h>
13 #include <linux/err.h>
14 #include <linux/list.h>
15 #include <linux/slab.h>
16 #include <linux/nl80211.h>
17 #include <linux/debugfs.h>
18 #include <linux/notifier.h>
19 #include <linux/device.h>
20 #include <linux/etherdevice.h>
21 #include <linux/rtnetlink.h>
22 #include <linux/sched.h>
23 #include <net/genetlink.h>
24 #include <net/cfg80211.h>
25 #include "nl80211.h"
26 #include "core.h"
27 #include "sysfs.h"
28 #include "debugfs.h"
29 #include "wext-compat.h"
30 #include "rdev-ops.h"
31
32 /* name for sysfs, %d is appended */
33 #define PHY_NAME "phy"
34
35 MODULE_AUTHOR("Johannes Berg");
36 MODULE_LICENSE("GPL");
37 MODULE_DESCRIPTION("wireless configuration support");
38 MODULE_ALIAS_GENL_FAMILY(NL80211_GENL_NAME);
39
40 /* RCU-protected (and RTNL for writers) */
41 LIST_HEAD(cfg80211_rdev_list);
42 int cfg80211_rdev_list_generation;
43
44 /* for debugfs */
45 static struct dentry *ieee80211_debugfs_dir;
46
47 /* for the cleanup, scan and event works */
48 struct workqueue_struct *cfg80211_wq;
49
50 static bool cfg80211_disable_40mhz_24ghz;
51 module_param(cfg80211_disable_40mhz_24ghz, bool, 0644);
52 MODULE_PARM_DESC(cfg80211_disable_40mhz_24ghz,
53                  "Disable 40MHz support in the 2.4GHz band");
54
55 struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx)
56 {
57         struct cfg80211_registered_device *result = NULL, *rdev;
58
59         ASSERT_RTNL();
60
61         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
62                 if (rdev->wiphy_idx == wiphy_idx) {
63                         result = rdev;
64                         break;
65                 }
66         }
67
68         return result;
69 }
70
71 int get_wiphy_idx(struct wiphy *wiphy)
72 {
73         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
74
75         return rdev->wiphy_idx;
76 }
77
78 struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx)
79 {
80         struct cfg80211_registered_device *rdev;
81
82         ASSERT_RTNL();
83
84         rdev = cfg80211_rdev_by_wiphy_idx(wiphy_idx);
85         if (!rdev)
86                 return NULL;
87         return &rdev->wiphy;
88 }
89
90 static int cfg80211_dev_check_name(struct cfg80211_registered_device *rdev,
91                                    const char *newname)
92 {
93         struct cfg80211_registered_device *rdev2;
94         int wiphy_idx, taken = -1, digits;
95
96         ASSERT_RTNL();
97
98         /* prohibit calling the thing phy%d when %d is not its number */
99         sscanf(newname, PHY_NAME "%d%n", &wiphy_idx, &taken);
100         if (taken == strlen(newname) && wiphy_idx != rdev->wiphy_idx) {
101                 /* count number of places needed to print wiphy_idx */
102                 digits = 1;
103                 while (wiphy_idx /= 10)
104                         digits++;
105                 /*
106                  * deny the name if it is phy<idx> where <idx> is printed
107                  * without leading zeroes. taken == strlen(newname) here
108                  */
109                 if (taken == strlen(PHY_NAME) + digits)
110                         return -EINVAL;
111         }
112
113         /* Ensure another device does not already have this name. */
114         list_for_each_entry(rdev2, &cfg80211_rdev_list, list)
115                 if (strcmp(newname, wiphy_name(&rdev2->wiphy)) == 0)
116                         return -EINVAL;
117
118         return 0;
119 }
120
121 int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
122                         char *newname)
123 {
124         int result;
125
126         ASSERT_RTNL();
127
128         /* Ignore nop renames */
129         if (strcmp(newname, wiphy_name(&rdev->wiphy)) == 0)
130                 return 0;
131
132         result = cfg80211_dev_check_name(rdev, newname);
133         if (result < 0)
134                 return result;
135
136         result = device_rename(&rdev->wiphy.dev, newname);
137         if (result)
138                 return result;
139
140         if (rdev->wiphy.debugfsdir &&
141             !debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
142                             rdev->wiphy.debugfsdir,
143                             rdev->wiphy.debugfsdir->d_parent,
144                             newname))
145                 pr_err("failed to rename debugfs dir to %s!\n", newname);
146
147         nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);
148
149         return 0;
150 }
151
152 int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
153                           struct net *net)
154 {
155         struct wireless_dev *wdev;
156         int err = 0;
157
158         if (!(rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK))
159                 return -EOPNOTSUPP;
160
161         list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
162                 if (!wdev->netdev)
163                         continue;
164                 wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
165                 err = dev_change_net_namespace(wdev->netdev, net, "wlan%d");
166                 if (err)
167                         break;
168                 wdev->netdev->features |= NETIF_F_NETNS_LOCAL;
169         }
170
171         if (err) {
172                 /* failed -- clean up to old netns */
173                 net = wiphy_net(&rdev->wiphy);
174
175                 list_for_each_entry_continue_reverse(wdev,
176                                                      &rdev->wiphy.wdev_list,
177                                                      list) {
178                         if (!wdev->netdev)
179                                 continue;
180                         wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
181                         err = dev_change_net_namespace(wdev->netdev, net,
182                                                         "wlan%d");
183                         WARN_ON(err);
184                         wdev->netdev->features |= NETIF_F_NETNS_LOCAL;
185                 }
186
187                 return err;
188         }
189
190         wiphy_net_set(&rdev->wiphy, net);
191
192         err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
193         WARN_ON(err);
194
195         return 0;
196 }
197
198 static void cfg80211_rfkill_poll(struct rfkill *rfkill, void *data)
199 {
200         struct cfg80211_registered_device *rdev = data;
201
202         rdev_rfkill_poll(rdev);
203 }
204
205 void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev,
206                               struct wireless_dev *wdev)
207 {
208         ASSERT_RTNL();
209
210         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_P2P_DEVICE))
211                 return;
212
213         if (!wdev->p2p_started)
214                 return;
215
216         rdev_stop_p2p_device(rdev, wdev);
217         wdev->p2p_started = false;
218
219         rdev->opencount--;
220
221         if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
222                 if (WARN_ON(!rdev->scan_req->notified))
223                         rdev->scan_req->aborted = true;
224                 ___cfg80211_scan_done(rdev, false);
225         }
226 }
227
228 void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy)
229 {
230         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
231         struct wireless_dev *wdev;
232
233         ASSERT_RTNL();
234
235         list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
236                 if (wdev->netdev) {
237                         dev_close(wdev->netdev);
238                         continue;
239                 }
240                 /* otherwise, check iftype */
241                 switch (wdev->iftype) {
242                 case NL80211_IFTYPE_P2P_DEVICE:
243                         cfg80211_stop_p2p_device(rdev, wdev);
244                         break;
245                 default:
246                         break;
247                 }
248         }
249 }
250 EXPORT_SYMBOL_GPL(cfg80211_shutdown_all_interfaces);
251
252 static int cfg80211_rfkill_set_block(void *data, bool blocked)
253 {
254         struct cfg80211_registered_device *rdev = data;
255
256         if (!blocked)
257                 return 0;
258
259         rtnl_lock();
260         cfg80211_shutdown_all_interfaces(&rdev->wiphy);
261         rtnl_unlock();
262
263         return 0;
264 }
265
266 static void cfg80211_rfkill_sync_work(struct work_struct *work)
267 {
268         struct cfg80211_registered_device *rdev;
269
270         rdev = container_of(work, struct cfg80211_registered_device, rfkill_sync);
271         cfg80211_rfkill_set_block(rdev, rfkill_blocked(rdev->rfkill));
272 }
273
274 static void cfg80211_event_work(struct work_struct *work)
275 {
276         struct cfg80211_registered_device *rdev;
277
278         rdev = container_of(work, struct cfg80211_registered_device,
279                             event_work);
280
281         rtnl_lock();
282         cfg80211_process_rdev_events(rdev);
283         rtnl_unlock();
284 }
285
286 void cfg80211_destroy_ifaces(struct cfg80211_registered_device *rdev)
287 {
288         struct cfg80211_iface_destroy *item;
289
290         ASSERT_RTNL();
291
292         spin_lock_irq(&rdev->destroy_list_lock);
293         while ((item = list_first_entry_or_null(&rdev->destroy_list,
294                                                 struct cfg80211_iface_destroy,
295                                                 list))) {
296                 struct wireless_dev *wdev, *tmp;
297                 u32 nlportid = item->nlportid;
298
299                 list_del(&item->list);
300                 kfree(item);
301                 spin_unlock_irq(&rdev->destroy_list_lock);
302
303                 list_for_each_entry_safe(wdev, tmp,
304                                          &rdev->wiphy.wdev_list, list) {
305                         if (nlportid == wdev->owner_nlportid)
306                                 rdev_del_virtual_intf(rdev, wdev);
307                 }
308
309                 spin_lock_irq(&rdev->destroy_list_lock);
310         }
311         spin_unlock_irq(&rdev->destroy_list_lock);
312 }
313
314 static void cfg80211_destroy_iface_wk(struct work_struct *work)
315 {
316         struct cfg80211_registered_device *rdev;
317
318         rdev = container_of(work, struct cfg80211_registered_device,
319                             destroy_work);
320
321         rtnl_lock();
322         cfg80211_destroy_ifaces(rdev);
323         rtnl_unlock();
324 }
325
326 static void cfg80211_sched_scan_stop_wk(struct work_struct *work)
327 {
328         struct cfg80211_registered_device *rdev;
329
330         rdev = container_of(work, struct cfg80211_registered_device,
331                            sched_scan_stop_wk);
332
333         rtnl_lock();
334
335         __cfg80211_stop_sched_scan(rdev, false);
336
337         rtnl_unlock();
338 }
339
340 /* exported functions */
341
342 struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
343                            const char *requested_name)
344 {
345         static atomic_t wiphy_counter = ATOMIC_INIT(0);
346
347         struct cfg80211_registered_device *rdev;
348         int alloc_size;
349
350         WARN_ON(ops->add_key && (!ops->del_key || !ops->set_default_key));
351         WARN_ON(ops->auth && (!ops->assoc || !ops->deauth || !ops->disassoc));
352         WARN_ON(ops->connect && !ops->disconnect);
353         WARN_ON(ops->join_ibss && !ops->leave_ibss);
354         WARN_ON(ops->add_virtual_intf && !ops->del_virtual_intf);
355         WARN_ON(ops->add_station && !ops->del_station);
356         WARN_ON(ops->add_mpath && !ops->del_mpath);
357         WARN_ON(ops->join_mesh && !ops->leave_mesh);
358
359         alloc_size = sizeof(*rdev) + sizeof_priv;
360
361         rdev = kzalloc(alloc_size, GFP_KERNEL);
362         if (!rdev)
363                 return NULL;
364
365         rdev->ops = ops;
366
367         rdev->wiphy_idx = atomic_inc_return(&wiphy_counter);
368
369         if (unlikely(rdev->wiphy_idx < 0)) {
370                 /* ugh, wrapped! */
371                 atomic_dec(&wiphy_counter);
372                 kfree(rdev);
373                 return NULL;
374         }
375
376         /* atomic_inc_return makes it start at 1, make it start at 0 */
377         rdev->wiphy_idx--;
378
379         /* give it a proper name */
380         if (requested_name && requested_name[0]) {
381                 int rv;
382
383                 rtnl_lock();
384                 rv = cfg80211_dev_check_name(rdev, requested_name);
385
386                 if (rv < 0) {
387                         rtnl_unlock();
388                         goto use_default_name;
389                 }
390
391                 rv = dev_set_name(&rdev->wiphy.dev, "%s", requested_name);
392                 rtnl_unlock();
393                 if (rv)
394                         goto use_default_name;
395         } else {
396 use_default_name:
397                 /* NOTE:  This is *probably* safe w/out holding rtnl because of
398                  * the restrictions on phy names.  Probably this call could
399                  * fail if some other part of the kernel (re)named a device
400                  * phyX.  But, might should add some locking and check return
401                  * value, and use a different name if this one exists?
402                  */
403                 dev_set_name(&rdev->wiphy.dev, PHY_NAME "%d", rdev->wiphy_idx);
404         }
405
406         INIT_LIST_HEAD(&rdev->wiphy.wdev_list);
407         INIT_LIST_HEAD(&rdev->beacon_registrations);
408         spin_lock_init(&rdev->beacon_registrations_lock);
409         spin_lock_init(&rdev->bss_lock);
410         INIT_LIST_HEAD(&rdev->bss_list);
411         INIT_WORK(&rdev->scan_done_wk, __cfg80211_scan_done);
412         INIT_WORK(&rdev->sched_scan_results_wk, __cfg80211_sched_scan_results);
413         INIT_LIST_HEAD(&rdev->mlme_unreg);
414         spin_lock_init(&rdev->mlme_unreg_lock);
415         INIT_WORK(&rdev->mlme_unreg_wk, cfg80211_mlme_unreg_wk);
416         INIT_DELAYED_WORK(&rdev->dfs_update_channels_wk,
417                           cfg80211_dfs_channels_update_work);
418 #ifdef CONFIG_CFG80211_WEXT
419         rdev->wiphy.wext = &cfg80211_wext_handler;
420 #endif
421
422         device_initialize(&rdev->wiphy.dev);
423         rdev->wiphy.dev.class = &ieee80211_class;
424         rdev->wiphy.dev.platform_data = rdev;
425         device_enable_async_suspend(&rdev->wiphy.dev);
426
427         INIT_LIST_HEAD(&rdev->destroy_list);
428         spin_lock_init(&rdev->destroy_list_lock);
429         INIT_WORK(&rdev->destroy_work, cfg80211_destroy_iface_wk);
430         INIT_WORK(&rdev->sched_scan_stop_wk, cfg80211_sched_scan_stop_wk);
431
432 #ifdef CONFIG_CFG80211_DEFAULT_PS
433         rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
434 #endif
435
436         wiphy_net_set(&rdev->wiphy, &init_net);
437
438         rdev->rfkill_ops.set_block = cfg80211_rfkill_set_block;
439         rdev->rfkill = rfkill_alloc(dev_name(&rdev->wiphy.dev),
440                                    &rdev->wiphy.dev, RFKILL_TYPE_WLAN,
441                                    &rdev->rfkill_ops, rdev);
442
443         if (!rdev->rfkill) {
444                 kfree(rdev);
445                 return NULL;
446         }
447
448         INIT_WORK(&rdev->rfkill_sync, cfg80211_rfkill_sync_work);
449         INIT_WORK(&rdev->conn_work, cfg80211_conn_work);
450         INIT_WORK(&rdev->event_work, cfg80211_event_work);
451
452         init_waitqueue_head(&rdev->dev_wait);
453
454         /*
455          * Initialize wiphy parameters to IEEE 802.11 MIB default values.
456          * Fragmentation and RTS threshold are disabled by default with the
457          * special -1 value.
458          */
459         rdev->wiphy.retry_short = 7;
460         rdev->wiphy.retry_long = 4;
461         rdev->wiphy.frag_threshold = (u32) -1;
462         rdev->wiphy.rts_threshold = (u32) -1;
463         rdev->wiphy.coverage_class = 0;
464
465         rdev->wiphy.max_num_csa_counters = 1;
466
467         rdev->wiphy.max_sched_scan_plans = 1;
468         rdev->wiphy.max_sched_scan_plan_interval = U32_MAX;
469
470         return &rdev->wiphy;
471 }
472 EXPORT_SYMBOL(wiphy_new_nm);
473
474 static int wiphy_verify_combinations(struct wiphy *wiphy)
475 {
476         const struct ieee80211_iface_combination *c;
477         int i, j;
478
479         for (i = 0; i < wiphy->n_iface_combinations; i++) {
480                 u32 cnt = 0;
481                 u16 all_iftypes = 0;
482
483                 c = &wiphy->iface_combinations[i];
484
485                 /*
486                  * Combinations with just one interface aren't real,
487                  * however we make an exception for DFS.
488                  */
489                 if (WARN_ON((c->max_interfaces < 2) && !c->radar_detect_widths))
490                         return -EINVAL;
491
492                 /* Need at least one channel */
493                 if (WARN_ON(!c->num_different_channels))
494                         return -EINVAL;
495
496                 /*
497                  * Put a sane limit on maximum number of different
498                  * channels to simplify channel accounting code.
499                  */
500                 if (WARN_ON(c->num_different_channels >
501                                 CFG80211_MAX_NUM_DIFFERENT_CHANNELS))
502                         return -EINVAL;
503
504                 /* DFS only works on one channel. */
505                 if (WARN_ON(c->radar_detect_widths &&
506                             (c->num_different_channels > 1)))
507                         return -EINVAL;
508
509                 if (WARN_ON(!c->n_limits))
510                         return -EINVAL;
511
512                 for (j = 0; j < c->n_limits; j++) {
513                         u16 types = c->limits[j].types;
514
515                         /* interface types shouldn't overlap */
516                         if (WARN_ON(types & all_iftypes))
517                                 return -EINVAL;
518                         all_iftypes |= types;
519
520                         if (WARN_ON(!c->limits[j].max))
521                                 return -EINVAL;
522
523                         /* Shouldn't list software iftypes in combinations! */
524                         if (WARN_ON(wiphy->software_iftypes & types))
525                                 return -EINVAL;
526
527                         /* Only a single P2P_DEVICE can be allowed */
528                         if (WARN_ON(types & BIT(NL80211_IFTYPE_P2P_DEVICE) &&
529                                     c->limits[j].max > 1))
530                                 return -EINVAL;
531
532                         cnt += c->limits[j].max;
533                         /*
534                          * Don't advertise an unsupported type
535                          * in a combination.
536                          */
537                         if (WARN_ON((wiphy->interface_modes & types) != types))
538                                 return -EINVAL;
539                 }
540
541                 /* You can't even choose that many! */
542                 if (WARN_ON(cnt < c->max_interfaces))
543                         return -EINVAL;
544         }
545
546         return 0;
547 }
548
549 int wiphy_register(struct wiphy *wiphy)
550 {
551         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
552         int res;
553         enum ieee80211_band band;
554         struct ieee80211_supported_band *sband;
555         bool have_band = false;
556         int i;
557         u16 ifmodes = wiphy->interface_modes;
558
559 #ifdef CONFIG_PM
560         if (WARN_ON(wiphy->wowlan &&
561                     (wiphy->wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
562                     !(wiphy->wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY)))
563                 return -EINVAL;
564         if (WARN_ON(wiphy->wowlan &&
565                     !wiphy->wowlan->flags && !wiphy->wowlan->n_patterns &&
566                     !wiphy->wowlan->tcp))
567                 return -EINVAL;
568 #endif
569         if (WARN_ON((wiphy->features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH) &&
570                     (!rdev->ops->tdls_channel_switch ||
571                      !rdev->ops->tdls_cancel_channel_switch)))
572                 return -EINVAL;
573
574         /*
575          * if a wiphy has unsupported modes for regulatory channel enforcement,
576          * opt-out of enforcement checking
577          */
578         if (wiphy->interface_modes & ~(BIT(NL80211_IFTYPE_STATION) |
579                                        BIT(NL80211_IFTYPE_P2P_CLIENT) |
580                                        BIT(NL80211_IFTYPE_AP) |
581                                        BIT(NL80211_IFTYPE_P2P_GO) |
582                                        BIT(NL80211_IFTYPE_ADHOC) |
583                                        BIT(NL80211_IFTYPE_P2P_DEVICE) |
584                                        BIT(NL80211_IFTYPE_AP_VLAN) |
585                                        BIT(NL80211_IFTYPE_MONITOR)))
586                 wiphy->regulatory_flags |= REGULATORY_IGNORE_STALE_KICKOFF;
587
588         if (WARN_ON((wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) &&
589                     (wiphy->regulatory_flags &
590                                         (REGULATORY_CUSTOM_REG |
591                                          REGULATORY_STRICT_REG |
592                                          REGULATORY_COUNTRY_IE_FOLLOW_POWER |
593                                          REGULATORY_COUNTRY_IE_IGNORE))))
594                 return -EINVAL;
595
596         if (WARN_ON(wiphy->coalesce &&
597                     (!wiphy->coalesce->n_rules ||
598                      !wiphy->coalesce->n_patterns) &&
599                     (!wiphy->coalesce->pattern_min_len ||
600                      wiphy->coalesce->pattern_min_len >
601                         wiphy->coalesce->pattern_max_len)))
602                 return -EINVAL;
603
604         if (WARN_ON(wiphy->ap_sme_capa &&
605                     !(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME)))
606                 return -EINVAL;
607
608         if (WARN_ON(wiphy->addresses && !wiphy->n_addresses))
609                 return -EINVAL;
610
611         if (WARN_ON(wiphy->addresses &&
612                     !is_zero_ether_addr(wiphy->perm_addr) &&
613                     memcmp(wiphy->perm_addr, wiphy->addresses[0].addr,
614                            ETH_ALEN)))
615                 return -EINVAL;
616
617         if (WARN_ON(wiphy->max_acl_mac_addrs &&
618                     (!(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME) ||
619                      !rdev->ops->set_mac_acl)))
620                 return -EINVAL;
621
622         if (wiphy->addresses)
623                 memcpy(wiphy->perm_addr, wiphy->addresses[0].addr, ETH_ALEN);
624
625         /* sanity check ifmodes */
626         WARN_ON(!ifmodes);
627         ifmodes &= ((1 << NUM_NL80211_IFTYPES) - 1) & ~1;
628         if (WARN_ON(ifmodes != wiphy->interface_modes))
629                 wiphy->interface_modes = ifmodes;
630
631         res = wiphy_verify_combinations(wiphy);
632         if (res)
633                 return res;
634
635         /* sanity check supported bands/channels */
636         for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
637                 sband = wiphy->bands[band];
638                 if (!sband)
639                         continue;
640
641                 sband->band = band;
642                 if (WARN_ON(!sband->n_channels))
643                         return -EINVAL;
644                 /*
645                  * on 60GHz band, there are no legacy rates, so
646                  * n_bitrates is 0
647                  */
648                 if (WARN_ON(band != IEEE80211_BAND_60GHZ &&
649                             !sband->n_bitrates))
650                         return -EINVAL;
651
652                 /*
653                  * Since cfg80211_disable_40mhz_24ghz is global, we can
654                  * modify the sband's ht data even if the driver uses a
655                  * global structure for that.
656                  */
657                 if (cfg80211_disable_40mhz_24ghz &&
658                     band == IEEE80211_BAND_2GHZ &&
659                     sband->ht_cap.ht_supported) {
660                         sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
661                         sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SGI_40;
662                 }
663
664                 /*
665                  * Since we use a u32 for rate bitmaps in
666                  * ieee80211_get_response_rate, we cannot
667                  * have more than 32 legacy rates.
668                  */
669                 if (WARN_ON(sband->n_bitrates > 32))
670                         return -EINVAL;
671
672                 for (i = 0; i < sband->n_channels; i++) {
673                         sband->channels[i].orig_flags =
674                                 sband->channels[i].flags;
675                         sband->channels[i].orig_mag = INT_MAX;
676                         sband->channels[i].orig_mpwr =
677                                 sband->channels[i].max_power;
678                         sband->channels[i].band = band;
679                 }
680
681                 have_band = true;
682         }
683
684         if (!have_band) {
685                 WARN_ON(1);
686                 return -EINVAL;
687         }
688
689 #ifdef CONFIG_PM
690         if (WARN_ON(rdev->wiphy.wowlan && rdev->wiphy.wowlan->n_patterns &&
691                     (!rdev->wiphy.wowlan->pattern_min_len ||
692                      rdev->wiphy.wowlan->pattern_min_len >
693                                 rdev->wiphy.wowlan->pattern_max_len)))
694                 return -EINVAL;
695 #endif
696
697         /* check and set up bitrates */
698         ieee80211_set_bitrate_flags(wiphy);
699
700         rdev->wiphy.features |= NL80211_FEATURE_SCAN_FLUSH;
701
702         rtnl_lock();
703         res = device_add(&rdev->wiphy.dev);
704         if (res) {
705                 rtnl_unlock();
706                 return res;
707         }
708
709         /* set up regulatory info */
710         wiphy_regulatory_register(wiphy);
711
712         list_add_rcu(&rdev->list, &cfg80211_rdev_list);
713         cfg80211_rdev_list_generation++;
714
715         /* add to debugfs */
716         rdev->wiphy.debugfsdir =
717                 debugfs_create_dir(wiphy_name(&rdev->wiphy),
718                                    ieee80211_debugfs_dir);
719         if (IS_ERR(rdev->wiphy.debugfsdir))
720                 rdev->wiphy.debugfsdir = NULL;
721
722         cfg80211_debugfs_rdev_add(rdev);
723         nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);
724
725         if (wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
726                 struct regulatory_request request;
727
728                 request.wiphy_idx = get_wiphy_idx(wiphy);
729                 request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
730                 request.alpha2[0] = '9';
731                 request.alpha2[1] = '9';
732
733                 nl80211_send_reg_change_event(&request);
734         }
735
736         /* Check that nobody globally advertises any capabilities they do not
737          * advertise on all possible interface types.
738          */
739         if (wiphy->extended_capabilities_len &&
740             wiphy->num_iftype_ext_capab &&
741             wiphy->iftype_ext_capab) {
742                 u8 supported_on_all, j;
743                 const struct wiphy_iftype_ext_capab *capab;
744
745                 capab = wiphy->iftype_ext_capab;
746                 for (j = 0; j < wiphy->extended_capabilities_len; j++) {
747                         if (capab[0].extended_capabilities_len > j)
748                                 supported_on_all =
749                                         capab[0].extended_capabilities[j];
750                         else
751                                 supported_on_all = 0x00;
752                         for (i = 1; i < wiphy->num_iftype_ext_capab; i++) {
753                                 if (j >= capab[i].extended_capabilities_len) {
754                                         supported_on_all = 0x00;
755                                         break;
756                                 }
757                                 supported_on_all &=
758                                         capab[i].extended_capabilities[j];
759                         }
760                         if (WARN_ON(wiphy->extended_capabilities[j] &
761                                     ~supported_on_all))
762                                 break;
763                 }
764         }
765
766         rdev->wiphy.registered = true;
767         rtnl_unlock();
768
769         res = rfkill_register(rdev->rfkill);
770         if (res) {
771                 rfkill_destroy(rdev->rfkill);
772                 rdev->rfkill = NULL;
773                 wiphy_unregister(&rdev->wiphy);
774                 return res;
775         }
776
777         return 0;
778 }
779 EXPORT_SYMBOL(wiphy_register);
780
781 void wiphy_rfkill_start_polling(struct wiphy *wiphy)
782 {
783         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
784
785         if (!rdev->ops->rfkill_poll)
786                 return;
787         rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
788         rfkill_resume_polling(rdev->rfkill);
789 }
790 EXPORT_SYMBOL(wiphy_rfkill_start_polling);
791
792 void wiphy_rfkill_stop_polling(struct wiphy *wiphy)
793 {
794         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
795
796         rfkill_pause_polling(rdev->rfkill);
797 }
798 EXPORT_SYMBOL(wiphy_rfkill_stop_polling);
799
800 void wiphy_unregister(struct wiphy *wiphy)
801 {
802         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
803
804         wait_event(rdev->dev_wait, ({
805                 int __count;
806                 rtnl_lock();
807                 __count = rdev->opencount;
808                 rtnl_unlock();
809                 __count == 0; }));
810
811         if (rdev->rfkill)
812                 rfkill_unregister(rdev->rfkill);
813
814         rtnl_lock();
815         nl80211_notify_wiphy(rdev, NL80211_CMD_DEL_WIPHY);
816         rdev->wiphy.registered = false;
817
818         WARN_ON(!list_empty(&rdev->wiphy.wdev_list));
819
820         /*
821          * First remove the hardware from everywhere, this makes
822          * it impossible to find from userspace.
823          */
824         debugfs_remove_recursive(rdev->wiphy.debugfsdir);
825         list_del_rcu(&rdev->list);
826         synchronize_rcu();
827
828         /*
829          * If this device got a regulatory hint tell core its
830          * free to listen now to a new shiny device regulatory hint
831          */
832         wiphy_regulatory_deregister(wiphy);
833
834         cfg80211_rdev_list_generation++;
835         device_del(&rdev->wiphy.dev);
836
837         rtnl_unlock();
838
839         flush_work(&rdev->scan_done_wk);
840         cancel_work_sync(&rdev->conn_work);
841         flush_work(&rdev->event_work);
842         cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
843         flush_work(&rdev->destroy_work);
844         flush_work(&rdev->sched_scan_stop_wk);
845         flush_work(&rdev->mlme_unreg_wk);
846
847 #ifdef CONFIG_PM
848         if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup)
849                 rdev_set_wakeup(rdev, false);
850 #endif
851         cfg80211_rdev_free_wowlan(rdev);
852         cfg80211_rdev_free_coalesce(rdev);
853 }
854 EXPORT_SYMBOL(wiphy_unregister);
855
856 void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
857 {
858         struct cfg80211_internal_bss *scan, *tmp;
859         struct cfg80211_beacon_registration *reg, *treg;
860         rfkill_destroy(rdev->rfkill);
861         list_for_each_entry_safe(reg, treg, &rdev->beacon_registrations, list) {
862                 list_del(&reg->list);
863                 kfree(reg);
864         }
865         list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
866                 cfg80211_put_bss(&rdev->wiphy, &scan->pub);
867         kfree(rdev);
868 }
869
870 void wiphy_free(struct wiphy *wiphy)
871 {
872         put_device(&wiphy->dev);
873 }
874 EXPORT_SYMBOL(wiphy_free);
875
876 void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
877 {
878         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
879
880         if (rfkill_set_hw_state(rdev->rfkill, blocked))
881                 schedule_work(&rdev->rfkill_sync);
882 }
883 EXPORT_SYMBOL(wiphy_rfkill_set_hw_state);
884
885 void cfg80211_unregister_wdev(struct wireless_dev *wdev)
886 {
887         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
888
889         ASSERT_RTNL();
890
891         if (WARN_ON(wdev->netdev))
892                 return;
893
894         list_del_rcu(&wdev->list);
895         rdev->devlist_generation++;
896
897         switch (wdev->iftype) {
898         case NL80211_IFTYPE_P2P_DEVICE:
899                 cfg80211_mlme_purge_registrations(wdev);
900                 cfg80211_stop_p2p_device(rdev, wdev);
901                 break;
902         default:
903                 WARN_ON_ONCE(1);
904                 break;
905         }
906 }
907 EXPORT_SYMBOL(cfg80211_unregister_wdev);
908
909 static const struct device_type wiphy_type = {
910         .name   = "wlan",
911 };
912
913 void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
914                                enum nl80211_iftype iftype, int num)
915 {
916         ASSERT_RTNL();
917
918         rdev->num_running_ifaces += num;
919         if (iftype == NL80211_IFTYPE_MONITOR)
920                 rdev->num_running_monitor_ifaces += num;
921 }
922
923 static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
924                                          unsigned long state, void *ptr)
925 {
926         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
927         struct wireless_dev *wdev = dev->ieee80211_ptr;
928         struct cfg80211_registered_device *rdev;
929         struct cfg80211_sched_scan_request *sched_scan_req;
930
931         if (!wdev)
932                 return NOTIFY_DONE;
933
934         rdev = wiphy_to_rdev(wdev->wiphy);
935
936         WARN_ON(wdev->iftype == NL80211_IFTYPE_UNSPECIFIED);
937
938         switch (state) {
939         case NETDEV_POST_INIT:
940                 SET_NETDEV_DEVTYPE(dev, &wiphy_type);
941                 break;
942         case NETDEV_REGISTER:
943                 /*
944                  * NB: cannot take rdev->mtx here because this may be
945                  * called within code protected by it when interfaces
946                  * are added with nl80211.
947                  */
948                 mutex_init(&wdev->mtx);
949                 INIT_LIST_HEAD(&wdev->event_list);
950                 spin_lock_init(&wdev->event_lock);
951                 INIT_LIST_HEAD(&wdev->mgmt_registrations);
952                 spin_lock_init(&wdev->mgmt_registrations_lock);
953
954                 wdev->identifier = ++rdev->wdev_id;
955                 list_add_rcu(&wdev->list, &rdev->wiphy.wdev_list);
956                 rdev->devlist_generation++;
957                 /* can only change netns with wiphy */
958                 dev->features |= NETIF_F_NETNS_LOCAL;
959
960                 if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
961                                       "phy80211")) {
962                         pr_err("failed to add phy80211 symlink to netdev!\n");
963                 }
964                 wdev->netdev = dev;
965 #ifdef CONFIG_CFG80211_WEXT
966                 wdev->wext.default_key = -1;
967                 wdev->wext.default_mgmt_key = -1;
968                 wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
969 #endif
970
971                 if (wdev->wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT)
972                         wdev->ps = true;
973                 else
974                         wdev->ps = false;
975                 /* allow mac80211 to determine the timeout */
976                 wdev->ps_timeout = -1;
977
978                 if ((wdev->iftype == NL80211_IFTYPE_STATION ||
979                      wdev->iftype == NL80211_IFTYPE_P2P_CLIENT ||
980                      wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr)
981                         dev->priv_flags |= IFF_DONT_BRIDGE;
982                 break;
983         case NETDEV_GOING_DOWN:
984                 switch (wdev->iftype) {
985                 case NL80211_IFTYPE_ADHOC:
986                         cfg80211_leave_ibss(rdev, dev, true);
987                         break;
988                 case NL80211_IFTYPE_P2P_CLIENT:
989                 case NL80211_IFTYPE_STATION:
990                         ASSERT_RTNL();
991                         sched_scan_req = rtnl_dereference(rdev->sched_scan_req);
992                         if (sched_scan_req && dev == sched_scan_req->dev)
993                                 __cfg80211_stop_sched_scan(rdev, false);
994
995                         wdev_lock(wdev);
996 #ifdef CONFIG_CFG80211_WEXT
997                         kfree(wdev->wext.ie);
998                         wdev->wext.ie = NULL;
999                         wdev->wext.ie_len = 0;
1000                         wdev->wext.connect.auth_type =
1001                                                 NL80211_AUTHTYPE_AUTOMATIC;
1002 #endif
1003                         cfg80211_disconnect(rdev, dev,
1004                                         WLAN_REASON_DEAUTH_LEAVING, true);
1005                         cfg80211_mlme_down(rdev, dev);
1006                         wdev_unlock(wdev);
1007                         break;
1008                 case NL80211_IFTYPE_MESH_POINT:
1009                         cfg80211_leave_mesh(rdev, dev);
1010                         break;
1011                 case NL80211_IFTYPE_AP:
1012                         cfg80211_stop_ap(rdev, dev, false);
1013                         break;
1014                 default:
1015                         break;
1016                 }
1017                 wdev->beacon_interval = 0;
1018                 break;
1019         case NETDEV_DOWN:
1020                 cfg80211_update_iface_num(rdev, wdev->iftype, -1);
1021                 if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
1022                         if (WARN_ON(!rdev->scan_req->notified))
1023                                 rdev->scan_req->aborted = true;
1024                         ___cfg80211_scan_done(rdev, false);
1025                 }
1026
1027                 sched_scan_req = rtnl_dereference(rdev->sched_scan_req);
1028                 if (WARN_ON(sched_scan_req &&
1029                             sched_scan_req->dev == wdev->netdev)) {
1030                         __cfg80211_stop_sched_scan(rdev, false);
1031                 }
1032
1033                 rdev->opencount--;
1034                 wake_up(&rdev->dev_wait);
1035                 break;
1036         case NETDEV_UP:
1037                 cfg80211_update_iface_num(rdev, wdev->iftype, 1);
1038                 wdev_lock(wdev);
1039                 switch (wdev->iftype) {
1040 #ifdef CONFIG_CFG80211_WEXT
1041                 case NL80211_IFTYPE_ADHOC:
1042                         cfg80211_ibss_wext_join(rdev, wdev);
1043                         break;
1044                 case NL80211_IFTYPE_STATION:
1045                         cfg80211_mgd_wext_connect(rdev, wdev);
1046                         break;
1047 #endif
1048 #ifdef CONFIG_MAC80211_MESH
1049                 case NL80211_IFTYPE_MESH_POINT:
1050                         {
1051                                 /* backward compat code... */
1052                                 struct mesh_setup setup;
1053                                 memcpy(&setup, &default_mesh_setup,
1054                                                 sizeof(setup));
1055                                  /* back compat only needed for mesh_id */
1056                                 setup.mesh_id = wdev->ssid;
1057                                 setup.mesh_id_len = wdev->mesh_id_up_len;
1058                                 if (wdev->mesh_id_up_len)
1059                                         __cfg80211_join_mesh(rdev, dev,
1060                                                         &setup,
1061                                                         &default_mesh_config);
1062                                 break;
1063                         }
1064 #endif
1065                 default:
1066                         break;
1067                 }
1068                 wdev_unlock(wdev);
1069                 rdev->opencount++;
1070
1071                 /*
1072                  * Configure power management to the driver here so that its
1073                  * correctly set also after interface type changes etc.
1074                  */
1075                 if ((wdev->iftype == NL80211_IFTYPE_STATION ||
1076                      wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
1077                     rdev->ops->set_power_mgmt)
1078                         if (rdev_set_power_mgmt(rdev, dev, wdev->ps,
1079                                                 wdev->ps_timeout)) {
1080                                 /* assume this means it's off */
1081                                 wdev->ps = false;
1082                         }
1083                 break;
1084         case NETDEV_UNREGISTER:
1085                 /*
1086                  * It is possible to get NETDEV_UNREGISTER
1087                  * multiple times. To detect that, check
1088                  * that the interface is still on the list
1089                  * of registered interfaces, and only then
1090                  * remove and clean it up.
1091                  */
1092                 if (!list_empty(&wdev->list)) {
1093                         sysfs_remove_link(&dev->dev.kobj, "phy80211");
1094                         list_del_rcu(&wdev->list);
1095                         rdev->devlist_generation++;
1096                         cfg80211_mlme_purge_registrations(wdev);
1097 #ifdef CONFIG_CFG80211_WEXT
1098                         kzfree(wdev->wext.keys);
1099 #endif
1100                 }
1101                 /*
1102                  * synchronise (so that we won't find this netdev
1103                  * from other code any more) and then clear the list
1104                  * head so that the above code can safely check for
1105                  * !list_empty() to avoid double-cleanup.
1106                  */
1107                 synchronize_rcu();
1108                 INIT_LIST_HEAD(&wdev->list);
1109                 /*
1110                  * Ensure that all events have been processed and
1111                  * freed.
1112                  */
1113                 cfg80211_process_wdev_events(wdev);
1114
1115                 if (WARN_ON(wdev->current_bss)) {
1116                         cfg80211_unhold_bss(wdev->current_bss);
1117                         cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
1118                         wdev->current_bss = NULL;
1119                 }
1120                 break;
1121         case NETDEV_PRE_UP:
1122                 if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
1123                         return notifier_from_errno(-EOPNOTSUPP);
1124                 if (rfkill_blocked(rdev->rfkill))
1125                         return notifier_from_errno(-ERFKILL);
1126                 break;
1127         default:
1128                 return NOTIFY_DONE;
1129         }
1130
1131         wireless_nlevent_flush();
1132
1133         return NOTIFY_OK;
1134 }
1135
1136 static struct notifier_block cfg80211_netdev_notifier = {
1137         .notifier_call = cfg80211_netdev_notifier_call,
1138 };
1139
1140 static void __net_exit cfg80211_pernet_exit(struct net *net)
1141 {
1142         struct cfg80211_registered_device *rdev;
1143
1144         rtnl_lock();
1145         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
1146                 if (net_eq(wiphy_net(&rdev->wiphy), net))
1147                         WARN_ON(cfg80211_switch_netns(rdev, &init_net));
1148         }
1149         rtnl_unlock();
1150 }
1151
1152 static struct pernet_operations cfg80211_pernet_ops = {
1153         .exit = cfg80211_pernet_exit,
1154 };
1155
1156 static int __init cfg80211_init(void)
1157 {
1158         int err;
1159
1160         err = register_pernet_device(&cfg80211_pernet_ops);
1161         if (err)
1162                 goto out_fail_pernet;
1163
1164         err = wiphy_sysfs_init();
1165         if (err)
1166                 goto out_fail_sysfs;
1167
1168         err = register_netdevice_notifier(&cfg80211_netdev_notifier);
1169         if (err)
1170                 goto out_fail_notifier;
1171
1172         err = nl80211_init();
1173         if (err)
1174                 goto out_fail_nl80211;
1175
1176         ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);
1177
1178         err = regulatory_init();
1179         if (err)
1180                 goto out_fail_reg;
1181
1182         cfg80211_wq = create_singlethread_workqueue("cfg80211");
1183         if (!cfg80211_wq) {
1184                 err = -ENOMEM;
1185                 goto out_fail_wq;
1186         }
1187
1188         return 0;
1189
1190 out_fail_wq:
1191         regulatory_exit();
1192 out_fail_reg:
1193         debugfs_remove(ieee80211_debugfs_dir);
1194         nl80211_exit();
1195 out_fail_nl80211:
1196         unregister_netdevice_notifier(&cfg80211_netdev_notifier);
1197 out_fail_notifier:
1198         wiphy_sysfs_exit();
1199 out_fail_sysfs:
1200         unregister_pernet_device(&cfg80211_pernet_ops);
1201 out_fail_pernet:
1202         return err;
1203 }
1204 subsys_initcall(cfg80211_init);
1205
1206 static void __exit cfg80211_exit(void)
1207 {
1208         debugfs_remove(ieee80211_debugfs_dir);
1209         nl80211_exit();
1210         unregister_netdevice_notifier(&cfg80211_netdev_notifier);
1211         wiphy_sysfs_exit();
1212         regulatory_exit();
1213         unregister_pernet_device(&cfg80211_pernet_ops);
1214         destroy_workqueue(cfg80211_wq);
1215 }
1216 module_exit(cfg80211_exit);