linux/net/wireless/core.c
<<
>>
Prefs
   1/*
   2 * This is the linux wireless configuration interface.
   3 *
   4 * Copyright 2006-2010          Johannes Berg <johannes@sipsolutions.net>
   5 */
   6
   7#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   8
   9#include <linux/if.h>
  10#include <linux/module.h>
  11#include <linux/err.h>
  12#include <linux/list.h>
  13#include <linux/slab.h>
  14#include <linux/nl80211.h>
  15#include <linux/debugfs.h>
  16#include <linux/notifier.h>
  17#include <linux/device.h>
  18#include <linux/etherdevice.h>
  19#include <linux/rtnetlink.h>
  20#include <linux/sched.h>
  21#include <net/genetlink.h>
  22#include <net/cfg80211.h>
  23#include "nl80211.h"
  24#include "core.h"
  25#include "sysfs.h"
  26#include "debugfs.h"
  27#include "wext-compat.h"
  28#include "ethtool.h"
  29
  30/* name for sysfs, %d is appended */
  31#define PHY_NAME "phy"
  32
  33MODULE_AUTHOR("Johannes Berg");
  34MODULE_LICENSE("GPL");
  35MODULE_DESCRIPTION("wireless configuration support");
  36
  37/* RCU-protected (and cfg80211_mutex for writers) */
  38LIST_HEAD(cfg80211_rdev_list);
  39int cfg80211_rdev_list_generation;
  40
  41DEFINE_MUTEX(cfg80211_mutex);
  42
  43/* for debugfs */
  44static struct dentry *ieee80211_debugfs_dir;
  45
  46/* for the cleanup, scan and event works */
  47struct workqueue_struct *cfg80211_wq;
  48
  49static bool cfg80211_disable_40mhz_24ghz;
  50module_param(cfg80211_disable_40mhz_24ghz, bool, 0644);
  51MODULE_PARM_DESC(cfg80211_disable_40mhz_24ghz,
  52                 "Disable 40MHz support in the 2.4GHz band");
  53
  54/* requires cfg80211_mutex to be held! */
  55struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx)
  56{
  57        struct cfg80211_registered_device *result = NULL, *rdev;
  58
  59        if (!wiphy_idx_valid(wiphy_idx))
  60                return NULL;
  61
  62        assert_cfg80211_lock();
  63
  64        list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
  65                if (rdev->wiphy_idx == wiphy_idx) {
  66                        result = rdev;
  67                        break;
  68                }
  69        }
  70
  71        return result;
  72}
  73
  74int get_wiphy_idx(struct wiphy *wiphy)
  75{
  76        struct cfg80211_registered_device *rdev;
  77        if (!wiphy)
  78                return WIPHY_IDX_STALE;
  79        rdev = wiphy_to_dev(wiphy);
  80        return rdev->wiphy_idx;
  81}
  82
  83/* requires cfg80211_rdev_mutex to be held! */
  84struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx)
  85{
  86        struct cfg80211_registered_device *rdev;
  87
  88        if (!wiphy_idx_valid(wiphy_idx))
  89                return NULL;
  90
  91        assert_cfg80211_lock();
  92
  93        rdev = cfg80211_rdev_by_wiphy_idx(wiphy_idx);
  94        if (!rdev)
  95                return NULL;
  96        return &rdev->wiphy;
  97}
  98
  99/* requires cfg80211_mutex to be held! */
 100struct cfg80211_registered_device *
 101__cfg80211_rdev_from_info(struct genl_info *info)
 102{
 103        int ifindex;
 104        struct cfg80211_registered_device *bywiphyidx = NULL, *byifidx = NULL;
 105        struct net_device *dev;
 106        int err = -EINVAL;
 107
 108        assert_cfg80211_lock();
 109
 110        if (info->attrs[NL80211_ATTR_WIPHY]) {
 111                bywiphyidx = cfg80211_rdev_by_wiphy_idx(
 112                                nla_get_u32(info->attrs[NL80211_ATTR_WIPHY]));
 113                err = -ENODEV;
 114        }
 115
 116        if (info->attrs[NL80211_ATTR_IFINDEX]) {
 117                ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
 118                dev = dev_get_by_index(genl_info_net(info), ifindex);
 119                if (dev) {
 120                        if (dev->ieee80211_ptr)
 121                                byifidx =
 122                                        wiphy_to_dev(dev->ieee80211_ptr->wiphy);
 123                        dev_put(dev);
 124                }
 125                err = -ENODEV;
 126        }
 127
 128        if (bywiphyidx && byifidx) {
 129                if (bywiphyidx != byifidx)
 130                        return ERR_PTR(-EINVAL);
 131                else
 132                        return bywiphyidx; /* == byifidx */
 133        }
 134        if (bywiphyidx)
 135                return bywiphyidx;
 136
 137        if (byifidx)
 138                return byifidx;
 139
 140        return ERR_PTR(err);
 141}
 142
 143struct cfg80211_registered_device *
 144cfg80211_get_dev_from_info(struct genl_info *info)
 145{
 146        struct cfg80211_registered_device *rdev;
 147
 148        mutex_lock(&cfg80211_mutex);
 149        rdev = __cfg80211_rdev_from_info(info);
 150
 151        /* if it is not an error we grab the lock on
 152         * it to assure it won't be going away while
 153         * we operate on it */
 154        if (!IS_ERR(rdev))
 155                mutex_lock(&rdev->mtx);
 156
 157        mutex_unlock(&cfg80211_mutex);
 158
 159        return rdev;
 160}
 161
 162struct cfg80211_registered_device *
 163cfg80211_get_dev_from_ifindex(struct net *net, int ifindex)
 164{
 165        struct cfg80211_registered_device *rdev = ERR_PTR(-ENODEV);
 166        struct net_device *dev;
 167
 168        mutex_lock(&cfg80211_mutex);
 169        dev = dev_get_by_index(net, ifindex);
 170        if (!dev)
 171                goto out;
 172        if (dev->ieee80211_ptr) {
 173                rdev = wiphy_to_dev(dev->ieee80211_ptr->wiphy);
 174                mutex_lock(&rdev->mtx);
 175        } else
 176                rdev = ERR_PTR(-ENODEV);
 177        dev_put(dev);
 178 out:
 179        mutex_unlock(&cfg80211_mutex);
 180        return rdev;
 181}
 182
 183/* requires cfg80211_mutex to be held */
 184int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
 185                        char *newname)
 186{
 187        struct cfg80211_registered_device *rdev2;
 188        int wiphy_idx, taken = -1, result, digits;
 189
 190        assert_cfg80211_lock();
 191
 192        /* prohibit calling the thing phy%d when %d is not its number */
 193        sscanf(newname, PHY_NAME "%d%n", &wiphy_idx, &taken);
 194        if (taken == strlen(newname) && wiphy_idx != rdev->wiphy_idx) {
 195                /* count number of places needed to print wiphy_idx */
 196                digits = 1;
 197                while (wiphy_idx /= 10)
 198                        digits++;
 199                /*
 200                 * deny the name if it is phy<idx> where <idx> is printed
 201                 * without leading zeroes. taken == strlen(newname) here
 202                 */
 203                if (taken == strlen(PHY_NAME) + digits)
 204                        return -EINVAL;
 205        }
 206
 207
 208        /* Ignore nop renames */
 209        if (strcmp(newname, dev_name(&rdev->wiphy.dev)) == 0)
 210                return 0;
 211
 212        /* Ensure another device does not already have this name. */
 213        list_for_each_entry(rdev2, &cfg80211_rdev_list, list)
 214                if (strcmp(newname, dev_name(&rdev2->wiphy.dev)) == 0)
 215                        return -EINVAL;
 216
 217        result = device_rename(&rdev->wiphy.dev, newname);
 218        if (result)
 219                return result;
 220
 221        if (rdev->wiphy.debugfsdir &&
 222            !debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
 223                            rdev->wiphy.debugfsdir,
 224                            rdev->wiphy.debugfsdir->d_parent,
 225                            newname))
 226                pr_err("failed to rename debugfs dir to %s!\n", newname);
 227
 228        nl80211_notify_dev_rename(rdev);
 229
 230        return 0;
 231}
 232
 233int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
 234                          struct net *net)
 235{
 236        struct wireless_dev *wdev;
 237        int err = 0;
 238
 239        if (!(rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK))
 240                return -EOPNOTSUPP;
 241
 242        list_for_each_entry(wdev, &rdev->netdev_list, list) {
 243                wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
 244                err = dev_change_net_namespace(wdev->netdev, net, "wlan%d");
 245                if (err)
 246                        break;
 247                wdev->netdev->features |= NETIF_F_NETNS_LOCAL;
 248        }
 249
 250        if (err) {
 251                /* failed -- clean up to old netns */
 252                net = wiphy_net(&rdev->wiphy);
 253
 254                list_for_each_entry_continue_reverse(wdev, &rdev->netdev_list,
 255                                                     list) {
 256                        wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
 257                        err = dev_change_net_namespace(wdev->netdev, net,
 258                                                        "wlan%d");
 259                        WARN_ON(err);
 260                        wdev->netdev->features |= NETIF_F_NETNS_LOCAL;
 261                }
 262
 263                return err;
 264        }
 265
 266        wiphy_net_set(&rdev->wiphy, net);
 267
 268        err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
 269        WARN_ON(err);
 270
 271        return 0;
 272}
 273
 274static void cfg80211_rfkill_poll(struct rfkill *rfkill, void *data)
 275{
 276        struct cfg80211_registered_device *rdev = data;
 277
 278        rdev->ops->rfkill_poll(&rdev->wiphy);
 279}
 280
 281static int cfg80211_rfkill_set_block(void *data, bool blocked)
 282{
 283        struct cfg80211_registered_device *rdev = data;
 284        struct wireless_dev *wdev;
 285
 286        if (!blocked)
 287                return 0;
 288
 289        rtnl_lock();
 290        mutex_lock(&rdev->devlist_mtx);
 291
 292        list_for_each_entry(wdev, &rdev->netdev_list, list)
 293                dev_close(wdev->netdev);
 294
 295        mutex_unlock(&rdev->devlist_mtx);
 296        rtnl_unlock();
 297
 298        return 0;
 299}
 300
 301static void cfg80211_rfkill_sync_work(struct work_struct *work)
 302{
 303        struct cfg80211_registered_device *rdev;
 304
 305        rdev = container_of(work, struct cfg80211_registered_device, rfkill_sync);
 306        cfg80211_rfkill_set_block(rdev, rfkill_blocked(rdev->rfkill));
 307}
 308
 309static void cfg80211_event_work(struct work_struct *work)
 310{
 311        struct cfg80211_registered_device *rdev;
 312
 313        rdev = container_of(work, struct cfg80211_registered_device,
 314                            event_work);
 315
 316        rtnl_lock();
 317        cfg80211_lock_rdev(rdev);
 318
 319        cfg80211_process_rdev_events(rdev);
 320        cfg80211_unlock_rdev(rdev);
 321        rtnl_unlock();
 322}
 323
 324/* exported functions */
 325
 326struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
 327{
 328        static int wiphy_counter;
 329
 330        struct cfg80211_registered_device *rdev;
 331        int alloc_size;
 332
 333        WARN_ON(ops->add_key && (!ops->del_key || !ops->set_default_key));
 334        WARN_ON(ops->auth && (!ops->assoc || !ops->deauth || !ops->disassoc));
 335        WARN_ON(ops->connect && !ops->disconnect);
 336        WARN_ON(ops->join_ibss && !ops->leave_ibss);
 337        WARN_ON(ops->add_virtual_intf && !ops->del_virtual_intf);
 338        WARN_ON(ops->add_station && !ops->del_station);
 339        WARN_ON(ops->add_mpath && !ops->del_mpath);
 340        WARN_ON(ops->join_mesh && !ops->leave_mesh);
 341
 342        alloc_size = sizeof(*rdev) + sizeof_priv;
 343
 344        rdev = kzalloc(alloc_size, GFP_KERNEL);
 345        if (!rdev)
 346                return NULL;
 347
 348        rdev->ops = ops;
 349
 350        mutex_lock(&cfg80211_mutex);
 351
 352        rdev->wiphy_idx = wiphy_counter++;
 353
 354        if (unlikely(!wiphy_idx_valid(rdev->wiphy_idx))) {
 355                wiphy_counter--;
 356                mutex_unlock(&cfg80211_mutex);
 357                /* ugh, wrapped! */
 358                kfree(rdev);
 359                return NULL;
 360        }
 361
 362        mutex_unlock(&cfg80211_mutex);
 363
 364        /* give it a proper name */
 365        dev_set_name(&rdev->wiphy.dev, PHY_NAME "%d", rdev->wiphy_idx);
 366
 367        mutex_init(&rdev->mtx);
 368        mutex_init(&rdev->devlist_mtx);
 369        mutex_init(&rdev->sched_scan_mtx);
 370        INIT_LIST_HEAD(&rdev->netdev_list);
 371        spin_lock_init(&rdev->bss_lock);
 372        INIT_LIST_HEAD(&rdev->bss_list);
 373        INIT_WORK(&rdev->scan_done_wk, __cfg80211_scan_done);
 374        INIT_WORK(&rdev->sched_scan_results_wk, __cfg80211_sched_scan_results);
 375#ifdef CONFIG_CFG80211_WEXT
 376        rdev->wiphy.wext = &cfg80211_wext_handler;
 377#endif
 378
 379        device_initialize(&rdev->wiphy.dev);
 380        rdev->wiphy.dev.class = &ieee80211_class;
 381        rdev->wiphy.dev.platform_data = rdev;
 382
 383#ifdef CONFIG_CFG80211_DEFAULT_PS
 384        rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
 385#endif
 386
 387        wiphy_net_set(&rdev->wiphy, &init_net);
 388
 389        rdev->rfkill_ops.set_block = cfg80211_rfkill_set_block;
 390        rdev->rfkill = rfkill_alloc(dev_name(&rdev->wiphy.dev),
 391                                   &rdev->wiphy.dev, RFKILL_TYPE_WLAN,
 392                                   &rdev->rfkill_ops, rdev);
 393
 394        if (!rdev->rfkill) {
 395                kfree(rdev);
 396                return NULL;
 397        }
 398
 399        INIT_WORK(&rdev->rfkill_sync, cfg80211_rfkill_sync_work);
 400        INIT_WORK(&rdev->conn_work, cfg80211_conn_work);
 401        INIT_WORK(&rdev->event_work, cfg80211_event_work);
 402
 403        init_waitqueue_head(&rdev->dev_wait);
 404
 405        /*
 406         * Initialize wiphy parameters to IEEE 802.11 MIB default values.
 407         * Fragmentation and RTS threshold are disabled by default with the
 408         * special -1 value.
 409         */
 410        rdev->wiphy.retry_short = 7;
 411        rdev->wiphy.retry_long = 4;
 412        rdev->wiphy.frag_threshold = (u32) -1;
 413        rdev->wiphy.rts_threshold = (u32) -1;
 414        rdev->wiphy.coverage_class = 0;
 415
 416        return &rdev->wiphy;
 417}
 418EXPORT_SYMBOL(wiphy_new);
 419
 420static int wiphy_verify_combinations(struct wiphy *wiphy)
 421{
 422        const struct ieee80211_iface_combination *c;
 423        int i, j;
 424
 425        /* If we have combinations enforce them */
 426        if (wiphy->n_iface_combinations)
 427                wiphy->flags |= WIPHY_FLAG_ENFORCE_COMBINATIONS;
 428
 429        for (i = 0; i < wiphy->n_iface_combinations; i++) {
 430                u32 cnt = 0;
 431                u16 all_iftypes = 0;
 432
 433                c = &wiphy->iface_combinations[i];
 434
 435                /* Combinations with just one interface aren't real */
 436                if (WARN_ON(c->max_interfaces < 2))
 437                        return -EINVAL;
 438
 439                /* Need at least one channel */
 440                if (WARN_ON(!c->num_different_channels))
 441                        return -EINVAL;
 442
 443                if (WARN_ON(!c->n_limits))
 444                        return -EINVAL;
 445
 446                for (j = 0; j < c->n_limits; j++) {
 447                        u16 types = c->limits[j].types;
 448
 449                        /*
 450                         * interface types shouldn't overlap, this is
 451                         * used in cfg80211_can_change_interface()
 452                         */
 453                        if (WARN_ON(types & all_iftypes))
 454                                return -EINVAL;
 455                        all_iftypes |= types;
 456
 457                        if (WARN_ON(!c->limits[j].max))
 458                                return -EINVAL;
 459
 460                        /* Shouldn't list software iftypes in combinations! */
 461                        if (WARN_ON(wiphy->software_iftypes & types))
 462                                return -EINVAL;
 463
 464                        cnt += c->limits[j].max;
 465                        /*
 466                         * Don't advertise an unsupported type
 467                         * in a combination.
 468                         */
 469                        if (WARN_ON((wiphy->interface_modes & types) != types))
 470                                return -EINVAL;
 471                }
 472
 473                /* You can't even choose that many! */
 474                if (WARN_ON(cnt < c->max_interfaces))
 475                        return -EINVAL;
 476        }
 477
 478        return 0;
 479}
 480
 481int wiphy_register(struct wiphy *wiphy)
 482{
 483        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
 484        int res;
 485        enum ieee80211_band band;
 486        struct ieee80211_supported_band *sband;
 487        bool have_band = false;
 488        int i;
 489        u16 ifmodes = wiphy->interface_modes;
 490
 491        if (WARN_ON(wiphy->addresses && !wiphy->n_addresses))
 492                return -EINVAL;
 493
 494        if (WARN_ON(wiphy->addresses &&
 495                    !is_zero_ether_addr(wiphy->perm_addr) &&
 496                    memcmp(wiphy->perm_addr, wiphy->addresses[0].addr,
 497                           ETH_ALEN)))
 498                return -EINVAL;
 499
 500        if (wiphy->addresses)
 501                memcpy(wiphy->perm_addr, wiphy->addresses[0].addr, ETH_ALEN);
 502
 503        /* sanity check ifmodes */
 504        WARN_ON(!ifmodes);
 505        ifmodes &= ((1 << NUM_NL80211_IFTYPES) - 1) & ~1;
 506        if (WARN_ON(ifmodes != wiphy->interface_modes))
 507                wiphy->interface_modes = ifmodes;
 508
 509        res = wiphy_verify_combinations(wiphy);
 510        if (res)
 511                return res;
 512
 513        /* sanity check supported bands/channels */
 514        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
 515                sband = wiphy->bands[band];
 516                if (!sband)
 517                        continue;
 518
 519                sband->band = band;
 520
 521                if (WARN_ON(!sband->n_channels || !sband->n_bitrates))
 522                        return -EINVAL;
 523
 524                /*
 525                 * Since cfg80211_disable_40mhz_24ghz is global, we can
 526                 * modify the sband's ht data even if the driver uses a
 527                 * global structure for that.
 528                 */
 529                if (cfg80211_disable_40mhz_24ghz &&
 530                    band == IEEE80211_BAND_2GHZ &&
 531                    sband->ht_cap.ht_supported) {
 532                        sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
 533                        sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SGI_40;
 534                }
 535
 536                /*
 537                 * Since we use a u32 for rate bitmaps in
 538                 * ieee80211_get_response_rate, we cannot
 539                 * have more than 32 legacy rates.
 540                 */
 541                if (WARN_ON(sband->n_bitrates > 32))
 542                        return -EINVAL;
 543
 544                for (i = 0; i < sband->n_channels; i++) {
 545                        sband->channels[i].orig_flags =
 546                                sband->channels[i].flags;
 547                        sband->channels[i].orig_mag =
 548                                sband->channels[i].max_antenna_gain;
 549                        sband->channels[i].orig_mpwr =
 550                                sband->channels[i].max_power;
 551                        sband->channels[i].band = band;
 552                }
 553
 554                have_band = true;
 555        }
 556
 557        if (!have_band) {
 558                WARN_ON(1);
 559                return -EINVAL;
 560        }
 561
 562        if (rdev->wiphy.wowlan.n_patterns) {
 563                if (WARN_ON(!rdev->wiphy.wowlan.pattern_min_len ||
 564                            rdev->wiphy.wowlan.pattern_min_len >
 565                            rdev->wiphy.wowlan.pattern_max_len))
 566                        return -EINVAL;
 567        }
 568
 569        /* check and set up bitrates */
 570        ieee80211_set_bitrate_flags(wiphy);
 571
 572        mutex_lock(&cfg80211_mutex);
 573
 574        res = device_add(&rdev->wiphy.dev);
 575        if (res) {
 576                mutex_unlock(&cfg80211_mutex);
 577                return res;
 578        }
 579
 580        /* set up regulatory info */
 581        wiphy_update_regulatory(wiphy, NL80211_REGDOM_SET_BY_CORE);
 582
 583        list_add_rcu(&rdev->list, &cfg80211_rdev_list);
 584        cfg80211_rdev_list_generation++;
 585
 586        /* add to debugfs */
 587        rdev->wiphy.debugfsdir =
 588                debugfs_create_dir(wiphy_name(&rdev->wiphy),
 589                                   ieee80211_debugfs_dir);
 590        if (IS_ERR(rdev->wiphy.debugfsdir))
 591                rdev->wiphy.debugfsdir = NULL;
 592
 593        if (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY) {
 594                struct regulatory_request request;
 595
 596                request.wiphy_idx = get_wiphy_idx(wiphy);
 597                request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
 598                request.alpha2[0] = '9';
 599                request.alpha2[1] = '9';
 600
 601                nl80211_send_reg_change_event(&request);
 602        }
 603
 604        cfg80211_debugfs_rdev_add(rdev);
 605        mutex_unlock(&cfg80211_mutex);
 606
 607        /*
 608         * due to a locking dependency this has to be outside of the
 609         * cfg80211_mutex lock
 610         */
 611        res = rfkill_register(rdev->rfkill);
 612        if (res)
 613                goto out_rm_dev;
 614
 615        return 0;
 616
 617out_rm_dev:
 618        device_del(&rdev->wiphy.dev);
 619        return res;
 620}
 621EXPORT_SYMBOL(wiphy_register);
 622
 623void wiphy_rfkill_start_polling(struct wiphy *wiphy)
 624{
 625        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
 626
 627        if (!rdev->ops->rfkill_poll)
 628                return;
 629        rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
 630        rfkill_resume_polling(rdev->rfkill);
 631}
 632EXPORT_SYMBOL(wiphy_rfkill_start_polling);
 633
 634void wiphy_rfkill_stop_polling(struct wiphy *wiphy)
 635{
 636        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
 637
 638        rfkill_pause_polling(rdev->rfkill);
 639}
 640EXPORT_SYMBOL(wiphy_rfkill_stop_polling);
 641
 642void wiphy_unregister(struct wiphy *wiphy)
 643{
 644        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
 645
 646        rfkill_unregister(rdev->rfkill);
 647
 648        /* protect the device list */
 649        mutex_lock(&cfg80211_mutex);
 650
 651        wait_event(rdev->dev_wait, ({
 652                int __count;
 653                mutex_lock(&rdev->devlist_mtx);
 654                __count = rdev->opencount;
 655                mutex_unlock(&rdev->devlist_mtx);
 656                __count == 0;}));
 657
 658        mutex_lock(&rdev->devlist_mtx);
 659        BUG_ON(!list_empty(&rdev->netdev_list));
 660        mutex_unlock(&rdev->devlist_mtx);
 661
 662        /*
 663         * First remove the hardware from everywhere, this makes
 664         * it impossible to find from userspace.
 665         */
 666        debugfs_remove_recursive(rdev->wiphy.debugfsdir);
 667        list_del_rcu(&rdev->list);
 668        synchronize_rcu();
 669
 670        /*
 671         * Try to grab rdev->mtx. If a command is still in progress,
 672         * hopefully the driver will refuse it since it's tearing
 673         * down the device already. We wait for this command to complete
 674         * before unlinking the item from the list.
 675         * Note: as codified by the BUG_ON above we cannot get here if
 676         * a virtual interface is still present. Hence, we can only get
 677         * to lock contention here if userspace issues a command that
 678         * identified the hardware by wiphy index.
 679         */
 680        cfg80211_lock_rdev(rdev);
 681        /* nothing */
 682        cfg80211_unlock_rdev(rdev);
 683
 684        /* If this device got a regulatory hint tell core its
 685         * free to listen now to a new shiny device regulatory hint */
 686        reg_device_remove(wiphy);
 687
 688        cfg80211_rdev_list_generation++;
 689        device_del(&rdev->wiphy.dev);
 690
 691        mutex_unlock(&cfg80211_mutex);
 692
 693        flush_work(&rdev->scan_done_wk);
 694        cancel_work_sync(&rdev->conn_work);
 695        flush_work(&rdev->event_work);
 696}
 697EXPORT_SYMBOL(wiphy_unregister);
 698
 699void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
 700{
 701        struct cfg80211_internal_bss *scan, *tmp;
 702        rfkill_destroy(rdev->rfkill);
 703        mutex_destroy(&rdev->mtx);
 704        mutex_destroy(&rdev->devlist_mtx);
 705        mutex_destroy(&rdev->sched_scan_mtx);
 706        list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
 707                cfg80211_put_bss(&scan->pub);
 708        cfg80211_rdev_free_wowlan(rdev);
 709        kfree(rdev);
 710}
 711
 712void wiphy_free(struct wiphy *wiphy)
 713{
 714        put_device(&wiphy->dev);
 715}
 716EXPORT_SYMBOL(wiphy_free);
 717
 718void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
 719{
 720        struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
 721
 722        if (rfkill_set_hw_state(rdev->rfkill, blocked))
 723                schedule_work(&rdev->rfkill_sync);
 724}
 725EXPORT_SYMBOL(wiphy_rfkill_set_hw_state);
 726
 727static void wdev_cleanup_work(struct work_struct *work)
 728{
 729        struct wireless_dev *wdev;
 730        struct cfg80211_registered_device *rdev;
 731
 732        wdev = container_of(work, struct wireless_dev, cleanup_work);
 733        rdev = wiphy_to_dev(wdev->wiphy);
 734
 735        cfg80211_lock_rdev(rdev);
 736
 737        if (WARN_ON(rdev->scan_req && rdev->scan_req->dev == wdev->netdev)) {
 738                rdev->scan_req->aborted = true;
 739                ___cfg80211_scan_done(rdev, true);
 740        }
 741
 742        cfg80211_unlock_rdev(rdev);
 743
 744        mutex_lock(&rdev->sched_scan_mtx);
 745
 746        if (WARN_ON(rdev->sched_scan_req &&
 747                    rdev->sched_scan_req->dev == wdev->netdev)) {
 748                __cfg80211_stop_sched_scan(rdev, false);
 749        }
 750
 751        mutex_unlock(&rdev->sched_scan_mtx);
 752
 753        mutex_lock(&rdev->devlist_mtx);
 754        rdev->opencount--;
 755        mutex_unlock(&rdev->devlist_mtx);
 756        wake_up(&rdev->dev_wait);
 757
 758        dev_put(wdev->netdev);
 759}
 760
 761static struct device_type wiphy_type = {
 762        .name   = "wlan",
 763};
 764
 765static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
 766                                         unsigned long state,
 767                                         void *ndev)
 768{
 769        struct net_device *dev = ndev;
 770        struct wireless_dev *wdev = dev->ieee80211_ptr;
 771        struct cfg80211_registered_device *rdev;
 772        int ret;
 773
 774        if (!wdev)
 775                return NOTIFY_DONE;
 776
 777        rdev = wiphy_to_dev(wdev->wiphy);
 778
 779        WARN_ON(wdev->iftype == NL80211_IFTYPE_UNSPECIFIED);
 780
 781        switch (state) {
 782        case NETDEV_POST_INIT:
 783                SET_NETDEV_DEVTYPE(dev, &wiphy_type);
 784                break;
 785        case NETDEV_REGISTER:
 786                /*
 787                 * NB: cannot take rdev->mtx here because this may be
 788                 * called within code protected by it when interfaces
 789                 * are added with nl80211.
 790                 */
 791                mutex_init(&wdev->mtx);
 792                INIT_WORK(&wdev->cleanup_work, wdev_cleanup_work);
 793                INIT_LIST_HEAD(&wdev->event_list);
 794                spin_lock_init(&wdev->event_lock);
 795                INIT_LIST_HEAD(&wdev->mgmt_registrations);
 796                spin_lock_init(&wdev->mgmt_registrations_lock);
 797
 798                mutex_lock(&rdev->devlist_mtx);
 799                list_add_rcu(&wdev->list, &rdev->netdev_list);
 800                rdev->devlist_generation++;
 801                /* can only change netns with wiphy */
 802                dev->features |= NETIF_F_NETNS_LOCAL;
 803
 804                if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
 805                                      "phy80211")) {
 806                        pr_err("failed to add phy80211 symlink to netdev!\n");
 807                }
 808                wdev->netdev = dev;
 809                wdev->sme_state = CFG80211_SME_IDLE;
 810                mutex_unlock(&rdev->devlist_mtx);
 811#ifdef CONFIG_CFG80211_WEXT
 812                wdev->wext.default_key = -1;
 813                wdev->wext.default_mgmt_key = -1;
 814                wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
 815#endif
 816
 817                if (wdev->wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT)
 818                        wdev->ps = true;
 819                else
 820                        wdev->ps = false;
 821                /* allow mac80211 to determine the timeout */
 822                wdev->ps_timeout = -1;
 823
 824                if (!dev->ethtool_ops)
 825                        dev->ethtool_ops = &cfg80211_ethtool_ops;
 826
 827                if ((wdev->iftype == NL80211_IFTYPE_STATION ||
 828                     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT ||
 829                     wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr)
 830                        dev->priv_flags |= IFF_DONT_BRIDGE;
 831                break;
 832        case NETDEV_GOING_DOWN:
 833                switch (wdev->iftype) {
 834                case NL80211_IFTYPE_ADHOC:
 835                        cfg80211_leave_ibss(rdev, dev, true);
 836                        break;
 837                case NL80211_IFTYPE_P2P_CLIENT:
 838                case NL80211_IFTYPE_STATION:
 839                        mutex_lock(&rdev->sched_scan_mtx);
 840                        __cfg80211_stop_sched_scan(rdev, false);
 841                        mutex_unlock(&rdev->sched_scan_mtx);
 842
 843                        wdev_lock(wdev);
 844#ifdef CONFIG_CFG80211_WEXT
 845                        kfree(wdev->wext.ie);
 846                        wdev->wext.ie = NULL;
 847                        wdev->wext.ie_len = 0;
 848                        wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
 849#endif
 850                        __cfg80211_disconnect(rdev, dev,
 851                                              WLAN_REASON_DEAUTH_LEAVING, true);
 852                        cfg80211_mlme_down(rdev, dev);
 853                        wdev_unlock(wdev);
 854                        break;
 855                case NL80211_IFTYPE_MESH_POINT:
 856                        cfg80211_leave_mesh(rdev, dev);
 857                        break;
 858                default:
 859                        break;
 860                }
 861                wdev->beacon_interval = 0;
 862                break;
 863        case NETDEV_DOWN:
 864                dev_hold(dev);
 865                queue_work(cfg80211_wq, &wdev->cleanup_work);
 866                break;
 867        case NETDEV_UP:
 868                /*
 869                 * If we have a really quick DOWN/UP succession we may
 870                 * have this work still pending ... cancel it and see
 871                 * if it was pending, in which case we need to account
 872                 * for some of the work it would have done.
 873                 */
 874                if (cancel_work_sync(&wdev->cleanup_work)) {
 875                        mutex_lock(&rdev->devlist_mtx);
 876                        rdev->opencount--;
 877                        mutex_unlock(&rdev->devlist_mtx);
 878                        dev_put(dev);
 879                }
 880                cfg80211_lock_rdev(rdev);
 881                mutex_lock(&rdev->devlist_mtx);
 882                wdev_lock(wdev);
 883                switch (wdev->iftype) {
 884#ifdef CONFIG_CFG80211_WEXT
 885                case NL80211_IFTYPE_ADHOC:
 886                        cfg80211_ibss_wext_join(rdev, wdev);
 887                        break;
 888                case NL80211_IFTYPE_STATION:
 889                        cfg80211_mgd_wext_connect(rdev, wdev);
 890                        break;
 891#endif
 892#ifdef CONFIG_MAC80211_MESH
 893                case NL80211_IFTYPE_MESH_POINT:
 894                        {
 895                                /* backward compat code... */
 896                                struct mesh_setup setup;
 897                                memcpy(&setup, &default_mesh_setup,
 898                                                sizeof(setup));
 899                                 /* back compat only needed for mesh_id */
 900                                setup.mesh_id = wdev->ssid;
 901                                setup.mesh_id_len = wdev->mesh_id_up_len;
 902                                if (wdev->mesh_id_up_len)
 903                                        __cfg80211_join_mesh(rdev, dev,
 904                                                        &setup,
 905                                                        &default_mesh_config);
 906                                break;
 907                        }
 908#endif
 909                default:
 910                        break;
 911                }
 912                wdev_unlock(wdev);
 913                rdev->opencount++;
 914                mutex_unlock(&rdev->devlist_mtx);
 915                cfg80211_unlock_rdev(rdev);
 916
 917                /*
 918                 * Configure power management to the driver here so that its
 919                 * correctly set also after interface type changes etc.
 920                 */
 921                if (wdev->iftype == NL80211_IFTYPE_STATION &&
 922                    rdev->ops->set_power_mgmt)
 923                        if (rdev->ops->set_power_mgmt(wdev->wiphy, dev,
 924                                                      wdev->ps,
 925                                                      wdev->ps_timeout)) {
 926                                /* assume this means it's off */
 927                                wdev->ps = false;
 928                        }
 929                break;
 930        case NETDEV_UNREGISTER:
 931                /*
 932                 * NB: cannot take rdev->mtx here because this may be
 933                 * called within code protected by it when interfaces
 934                 * are removed with nl80211.
 935                 */
 936                mutex_lock(&rdev->devlist_mtx);
 937                /*
 938                 * It is possible to get NETDEV_UNREGISTER
 939                 * multiple times. To detect that, check
 940                 * that the interface is still on the list
 941                 * of registered interfaces, and only then
 942                 * remove and clean it up.
 943                 */
 944                if (!list_empty(&wdev->list)) {
 945                        sysfs_remove_link(&dev->dev.kobj, "phy80211");
 946                        list_del_rcu(&wdev->list);
 947                        rdev->devlist_generation++;
 948                        cfg80211_mlme_purge_registrations(wdev);
 949#ifdef CONFIG_CFG80211_WEXT
 950                        kfree(wdev->wext.keys);
 951#endif
 952                }
 953                mutex_unlock(&rdev->devlist_mtx);
 954                /*
 955                 * synchronise (so that we won't find this netdev
 956                 * from other code any more) and then clear the list
 957                 * head so that the above code can safely check for
 958                 * !list_empty() to avoid double-cleanup.
 959                 */
 960                synchronize_rcu();
 961                INIT_LIST_HEAD(&wdev->list);
 962                break;
 963        case NETDEV_PRE_UP:
 964                if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
 965                        return notifier_from_errno(-EOPNOTSUPP);
 966                if (rfkill_blocked(rdev->rfkill))
 967                        return notifier_from_errno(-ERFKILL);
 968                ret = cfg80211_can_add_interface(rdev, wdev->iftype);
 969                if (ret)
 970                        return notifier_from_errno(ret);
 971                break;
 972        }
 973
 974        return NOTIFY_DONE;
 975}
 976
 977static struct notifier_block cfg80211_netdev_notifier = {
 978        .notifier_call = cfg80211_netdev_notifier_call,
 979};
 980
 981static void __net_exit cfg80211_pernet_exit(struct net *net)
 982{
 983        struct cfg80211_registered_device *rdev;
 984
 985        rtnl_lock();
 986        mutex_lock(&cfg80211_mutex);
 987        list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
 988                if (net_eq(wiphy_net(&rdev->wiphy), net))
 989                        WARN_ON(cfg80211_switch_netns(rdev, &init_net));
 990        }
 991        mutex_unlock(&cfg80211_mutex);
 992        rtnl_unlock();
 993}
 994
 995static struct pernet_operations cfg80211_pernet_ops = {
 996        .exit = cfg80211_pernet_exit,
 997};
 998
 999static int __init cfg80211_init(void)
1000{
1001        int err;
1002
1003        err = register_pernet_device(&cfg80211_pernet_ops);
1004        if (err)
1005                goto out_fail_pernet;
1006
1007        err = wiphy_sysfs_init();
1008        if (err)
1009                goto out_fail_sysfs;
1010
1011        err = register_netdevice_notifier(&cfg80211_netdev_notifier);
1012        if (err)
1013                goto out_fail_notifier;
1014
1015        err = nl80211_init();
1016        if (err)
1017                goto out_fail_nl80211;
1018
1019        ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);
1020
1021        err = regulatory_init();
1022        if (err)
1023                goto out_fail_reg;
1024
1025        cfg80211_wq = create_singlethread_workqueue("cfg80211");
1026        if (!cfg80211_wq)
1027                goto out_fail_wq;
1028
1029        return 0;
1030
1031out_fail_wq:
1032        regulatory_exit();
1033out_fail_reg:
1034        debugfs_remove(ieee80211_debugfs_dir);
1035out_fail_nl80211:
1036        unregister_netdevice_notifier(&cfg80211_netdev_notifier);
1037out_fail_notifier:
1038        wiphy_sysfs_exit();
1039out_fail_sysfs:
1040        unregister_pernet_device(&cfg80211_pernet_ops);
1041out_fail_pernet:
1042        return err;
1043}
1044subsys_initcall(cfg80211_init);
1045
1046static void __exit cfg80211_exit(void)
1047{
1048        debugfs_remove(ieee80211_debugfs_dir);
1049        nl80211_exit();
1050        unregister_netdevice_notifier(&cfg80211_netdev_notifier);
1051        wiphy_sysfs_exit();
1052        regulatory_exit();
1053        unregister_pernet_device(&cfg80211_pernet_ops);
1054        destroy_workqueue(cfg80211_wq);
1055}
1056module_exit(cfg80211_exit);
1057