linux/net/mac80211/iface.c
<<
>>
Prefs
   1/*
   2 * Interface handling (except master interface)
   3 *
   4 * Copyright 2002-2005, Instant802 Networks, Inc.
   5 * Copyright 2005-2006, Devicescape Software, Inc.
   6 * Copyright (c) 2006 Jiri Benc <jbenc@suse.cz>
   7 * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License version 2 as
  11 * published by the Free Software Foundation.
  12 */
  13#include <linux/kernel.h>
  14#include <linux/if_arp.h>
  15#include <linux/netdevice.h>
  16#include <linux/rtnetlink.h>
  17#include <net/mac80211.h>
  18#include "ieee80211_i.h"
  19#include "sta_info.h"
  20#include "debugfs_netdev.h"
  21#include "mesh.h"
  22#include "led.h"
  23#include "driver-ops.h"
  24
  25/**
  26 * DOC: Interface list locking
  27 *
  28 * The interface list in each struct ieee80211_local is protected
  29 * three-fold:
  30 *
  31 * (1) modifications may only be done under the RTNL
  32 * (2) modifications and readers are protected against each other by
  33 *     the iflist_mtx.
  34 * (3) modifications are done in an RCU manner so atomic readers
  35 *     can traverse the list in RCU-safe blocks.
  36 *
  37 * As a consequence, reads (traversals) of the list can be protected
  38 * by either the RTNL, the iflist_mtx or RCU.
  39 */
  40
  41
  42static int ieee80211_change_mtu(struct net_device *dev, int new_mtu)
  43{
  44        int meshhdrlen;
  45        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  46
  47        meshhdrlen = (sdata->vif.type == NL80211_IFTYPE_MESH_POINT) ? 5 : 0;
  48
  49        /* FIX: what would be proper limits for MTU?
  50         * This interface uses 802.3 frames. */
  51        if (new_mtu < 256 ||
  52            new_mtu > IEEE80211_MAX_DATA_LEN - 24 - 6 - meshhdrlen) {
  53                return -EINVAL;
  54        }
  55
  56#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
  57        printk(KERN_DEBUG "%s: setting MTU %d\n", dev->name, new_mtu);
  58#endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
  59        dev->mtu = new_mtu;
  60        return 0;
  61}
  62
  63static inline int identical_mac_addr_allowed(int type1, int type2)
  64{
  65        return type1 == NL80211_IFTYPE_MONITOR ||
  66                type2 == NL80211_IFTYPE_MONITOR ||
  67                (type1 == NL80211_IFTYPE_AP && type2 == NL80211_IFTYPE_WDS) ||
  68                (type1 == NL80211_IFTYPE_WDS &&
  69                        (type2 == NL80211_IFTYPE_WDS ||
  70                         type2 == NL80211_IFTYPE_AP)) ||
  71                (type1 == NL80211_IFTYPE_AP && type2 == NL80211_IFTYPE_AP_VLAN) ||
  72                (type1 == NL80211_IFTYPE_AP_VLAN &&
  73                        (type2 == NL80211_IFTYPE_AP ||
  74                         type2 == NL80211_IFTYPE_AP_VLAN));
  75}
  76
  77static int ieee80211_open(struct net_device *dev)
  78{
  79        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  80        struct ieee80211_sub_if_data *nsdata;
  81        struct ieee80211_local *local = sdata->local;
  82        struct sta_info *sta;
  83        struct ieee80211_if_init_conf conf;
  84        u32 changed = 0;
  85        int res;
  86        u32 hw_reconf_flags = 0;
  87        u8 null_addr[ETH_ALEN] = {0};
  88
  89        /* fail early if user set an invalid address */
  90        if (compare_ether_addr(dev->dev_addr, null_addr) &&
  91            !is_valid_ether_addr(dev->dev_addr))
  92                return -EADDRNOTAVAIL;
  93
  94        /* we hold the RTNL here so can safely walk the list */
  95        list_for_each_entry(nsdata, &local->interfaces, list) {
  96                struct net_device *ndev = nsdata->dev;
  97
  98                if (ndev != dev && netif_running(ndev)) {
  99                        /*
 100                         * Allow only a single IBSS interface to be up at any
 101                         * time. This is restricted because beacon distribution
 102                         * cannot work properly if both are in the same IBSS.
 103                         *
 104                         * To remove this restriction we'd have to disallow them
 105                         * from setting the same SSID on different IBSS interfaces
 106                         * belonging to the same hardware. Then, however, we're
 107                         * faced with having to adopt two different TSF timers...
 108                         */
 109                        if (sdata->vif.type == NL80211_IFTYPE_ADHOC &&
 110                            nsdata->vif.type == NL80211_IFTYPE_ADHOC)
 111                                return -EBUSY;
 112
 113                        /*
 114                         * The remaining checks are only performed for interfaces
 115                         * with the same MAC address.
 116                         */
 117                        if (compare_ether_addr(dev->dev_addr, ndev->dev_addr))
 118                                continue;
 119
 120                        /*
 121                         * check whether it may have the same address
 122                         */
 123                        if (!identical_mac_addr_allowed(sdata->vif.type,
 124                                                        nsdata->vif.type))
 125                                return -ENOTUNIQ;
 126
 127                        /*
 128                         * can only add VLANs to enabled APs
 129                         */
 130                        if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
 131                            nsdata->vif.type == NL80211_IFTYPE_AP)
 132                                sdata->bss = &nsdata->u.ap;
 133                }
 134        }
 135
 136        switch (sdata->vif.type) {
 137        case NL80211_IFTYPE_WDS:
 138                if (!is_valid_ether_addr(sdata->u.wds.remote_addr))
 139                        return -ENOLINK;
 140                break;
 141        case NL80211_IFTYPE_AP_VLAN:
 142                if (!sdata->bss)
 143                        return -ENOLINK;
 144                list_add(&sdata->u.vlan.list, &sdata->bss->vlans);
 145                break;
 146        case NL80211_IFTYPE_AP:
 147                sdata->bss = &sdata->u.ap;
 148                break;
 149        case NL80211_IFTYPE_MESH_POINT:
 150                if (!ieee80211_vif_is_mesh(&sdata->vif))
 151                        break;
 152                /* mesh ifaces must set allmulti to forward mcast traffic */
 153                atomic_inc(&local->iff_allmultis);
 154                break;
 155        case NL80211_IFTYPE_STATION:
 156        case NL80211_IFTYPE_MONITOR:
 157        case NL80211_IFTYPE_ADHOC:
 158                /* no special treatment */
 159                break;
 160        case NL80211_IFTYPE_UNSPECIFIED:
 161        case __NL80211_IFTYPE_AFTER_LAST:
 162                /* cannot happen */
 163                WARN_ON(1);
 164                break;
 165        }
 166
 167        if (local->open_count == 0) {
 168                res = drv_start(local);
 169                if (res)
 170                        goto err_del_bss;
 171                /* we're brought up, everything changes */
 172                hw_reconf_flags = ~0;
 173                ieee80211_led_radio(local, true);
 174        }
 175
 176        /*
 177         * Check all interfaces and copy the hopefully now-present
 178         * MAC address to those that have the special null one.
 179         */
 180        list_for_each_entry(nsdata, &local->interfaces, list) {
 181                struct net_device *ndev = nsdata->dev;
 182
 183                /*
 184                 * No need to check netif_running since we do not allow
 185                 * it to start up with this invalid address.
 186                 */
 187                if (compare_ether_addr(null_addr, ndev->dev_addr) == 0)
 188                        memcpy(ndev->dev_addr,
 189                               local->hw.wiphy->perm_addr,
 190                               ETH_ALEN);
 191        }
 192
 193        /*
 194         * Validate the MAC address for this device.
 195         */
 196        if (!is_valid_ether_addr(dev->dev_addr)) {
 197                if (!local->open_count)
 198                        drv_stop(local);
 199                return -EADDRNOTAVAIL;
 200        }
 201
 202        switch (sdata->vif.type) {
 203        case NL80211_IFTYPE_AP_VLAN:
 204                /* no need to tell driver */
 205                break;
 206        case NL80211_IFTYPE_MONITOR:
 207                if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) {
 208                        local->cooked_mntrs++;
 209                        break;
 210                }
 211
 212                /* must be before the call to ieee80211_configure_filter */
 213                local->monitors++;
 214                if (local->monitors == 1) {
 215                        local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP;
 216                        hw_reconf_flags |= IEEE80211_CONF_CHANGE_RADIOTAP;
 217                }
 218
 219                if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL)
 220                        local->fif_fcsfail++;
 221                if (sdata->u.mntr_flags & MONITOR_FLAG_PLCPFAIL)
 222                        local->fif_plcpfail++;
 223                if (sdata->u.mntr_flags & MONITOR_FLAG_CONTROL) {
 224                        local->fif_control++;
 225                        local->fif_pspoll++;
 226                }
 227                if (sdata->u.mntr_flags & MONITOR_FLAG_OTHER_BSS)
 228                        local->fif_other_bss++;
 229
 230                ieee80211_configure_filter(local);
 231                break;
 232        default:
 233                conf.vif = &sdata->vif;
 234                conf.type = sdata->vif.type;
 235                conf.mac_addr = dev->dev_addr;
 236                res = drv_add_interface(local, &conf);
 237                if (res)
 238                        goto err_stop;
 239
 240                if (ieee80211_vif_is_mesh(&sdata->vif)) {
 241                        local->fif_other_bss++;
 242                        ieee80211_configure_filter(local);
 243
 244                        ieee80211_start_mesh(sdata);
 245                } else if (sdata->vif.type == NL80211_IFTYPE_AP) {
 246                        local->fif_pspoll++;
 247
 248                        ieee80211_configure_filter(local);
 249                }
 250
 251                changed |= ieee80211_reset_erp_info(sdata);
 252                ieee80211_bss_info_change_notify(sdata, changed);
 253                ieee80211_enable_keys(sdata);
 254
 255                if (sdata->vif.type == NL80211_IFTYPE_STATION)
 256                        netif_carrier_off(dev);
 257                else
 258                        netif_carrier_on(dev);
 259        }
 260
 261        if (sdata->vif.type == NL80211_IFTYPE_WDS) {
 262                /* Create STA entry for the WDS peer */
 263                sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
 264                                     GFP_KERNEL);
 265                if (!sta) {
 266                        res = -ENOMEM;
 267                        goto err_del_interface;
 268                }
 269
 270                /* no locking required since STA is not live yet */
 271                sta->flags |= WLAN_STA_AUTHORIZED;
 272
 273                res = sta_info_insert(sta);
 274                if (res) {
 275                        /* STA has been freed */
 276                        goto err_del_interface;
 277                }
 278        }
 279
 280        /*
 281         * set_multicast_list will be invoked by the networking core
 282         * which will check whether any increments here were done in
 283         * error and sync them down to the hardware as filter flags.
 284         */
 285        if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
 286                atomic_inc(&local->iff_allmultis);
 287
 288        if (sdata->flags & IEEE80211_SDATA_PROMISC)
 289                atomic_inc(&local->iff_promiscs);
 290
 291        hw_reconf_flags |= __ieee80211_recalc_idle(local);
 292
 293        local->open_count++;
 294        if (hw_reconf_flags) {
 295                ieee80211_hw_config(local, hw_reconf_flags);
 296                /*
 297                 * set default queue parameters so drivers don't
 298                 * need to initialise the hardware if the hardware
 299                 * doesn't start up with sane defaults
 300                 */
 301                ieee80211_set_wmm_default(sdata);
 302        }
 303
 304        ieee80211_recalc_ps(local, -1);
 305
 306        /*
 307         * ieee80211_sta_work is disabled while network interface
 308         * is down. Therefore, some configuration changes may not
 309         * yet be effective. Trigger execution of ieee80211_sta_work
 310         * to fix this.
 311         */
 312        if (sdata->vif.type == NL80211_IFTYPE_STATION)
 313                ieee80211_queue_work(&local->hw, &sdata->u.mgd.work);
 314
 315        netif_tx_start_all_queues(dev);
 316
 317        return 0;
 318 err_del_interface:
 319        drv_remove_interface(local, &conf);
 320 err_stop:
 321        if (!local->open_count)
 322                drv_stop(local);
 323 err_del_bss:
 324        sdata->bss = NULL;
 325        if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
 326                list_del(&sdata->u.vlan.list);
 327        return res;
 328}
 329
 330static int ieee80211_stop(struct net_device *dev)
 331{
 332        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 333        struct ieee80211_local *local = sdata->local;
 334        struct ieee80211_if_init_conf conf;
 335        struct sta_info *sta;
 336        unsigned long flags;
 337        struct sk_buff *skb, *tmp;
 338        u32 hw_reconf_flags = 0;
 339        int i;
 340
 341        /*
 342         * Stop TX on this interface first.
 343         */
 344        netif_tx_stop_all_queues(dev);
 345
 346        /*
 347         * Now delete all active aggregation sessions.
 348         */
 349        rcu_read_lock();
 350
 351        list_for_each_entry_rcu(sta, &local->sta_list, list) {
 352                if (sta->sdata == sdata)
 353                        ieee80211_sta_tear_down_BA_sessions(sta);
 354        }
 355
 356        rcu_read_unlock();
 357
 358        /*
 359         * Remove all stations associated with this interface.
 360         *
 361         * This must be done before calling ops->remove_interface()
 362         * because otherwise we can later invoke ops->sta_notify()
 363         * whenever the STAs are removed, and that invalidates driver
 364         * assumptions about always getting a vif pointer that is valid
 365         * (because if we remove a STA after ops->remove_interface()
 366         * the driver will have removed the vif info already!)
 367         *
 368         * We could relax this and only unlink the stations from the
 369         * hash table and list but keep them on a per-sdata list that
 370         * will be inserted back again when the interface is brought
 371         * up again, but I don't currently see a use case for that,
 372         * except with WDS which gets a STA entry created when it is
 373         * brought up.
 374         */
 375        sta_info_flush(local, sdata);
 376
 377        /*
 378         * Don't count this interface for promisc/allmulti while it
 379         * is down. dev_mc_unsync() will invoke set_multicast_list
 380         * on the master interface which will sync these down to the
 381         * hardware as filter flags.
 382         */
 383        if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
 384                atomic_dec(&local->iff_allmultis);
 385
 386        if (sdata->flags & IEEE80211_SDATA_PROMISC)
 387                atomic_dec(&local->iff_promiscs);
 388
 389        if (sdata->vif.type == NL80211_IFTYPE_AP)
 390                local->fif_pspoll--;
 391
 392        netif_addr_lock_bh(dev);
 393        spin_lock_bh(&local->filter_lock);
 394        __dev_addr_unsync(&local->mc_list, &local->mc_count,
 395                          &dev->mc_list, &dev->mc_count);
 396        spin_unlock_bh(&local->filter_lock);
 397        netif_addr_unlock_bh(dev);
 398
 399        ieee80211_configure_filter(local);
 400
 401        del_timer_sync(&local->dynamic_ps_timer);
 402        cancel_work_sync(&local->dynamic_ps_enable_work);
 403
 404        /* APs need special treatment */
 405        if (sdata->vif.type == NL80211_IFTYPE_AP) {
 406                struct ieee80211_sub_if_data *vlan, *tmpsdata;
 407                struct beacon_data *old_beacon = sdata->u.ap.beacon;
 408
 409                /* remove beacon */
 410                rcu_assign_pointer(sdata->u.ap.beacon, NULL);
 411                synchronize_rcu();
 412                kfree(old_beacon);
 413
 414                /* down all dependent devices, that is VLANs */
 415                list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans,
 416                                         u.vlan.list)
 417                        dev_close(vlan->dev);
 418                WARN_ON(!list_empty(&sdata->u.ap.vlans));
 419        }
 420
 421        local->open_count--;
 422
 423        switch (sdata->vif.type) {
 424        case NL80211_IFTYPE_AP_VLAN:
 425                list_del(&sdata->u.vlan.list);
 426                /* no need to tell driver */
 427                break;
 428        case NL80211_IFTYPE_MONITOR:
 429                if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) {
 430                        local->cooked_mntrs--;
 431                        break;
 432                }
 433
 434                local->monitors--;
 435                if (local->monitors == 0) {
 436                        local->hw.conf.flags &= ~IEEE80211_CONF_RADIOTAP;
 437                        hw_reconf_flags |= IEEE80211_CONF_CHANGE_RADIOTAP;
 438                }
 439
 440                if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL)
 441                        local->fif_fcsfail--;
 442                if (sdata->u.mntr_flags & MONITOR_FLAG_PLCPFAIL)
 443                        local->fif_plcpfail--;
 444                if (sdata->u.mntr_flags & MONITOR_FLAG_CONTROL) {
 445                        local->fif_pspoll--;
 446                        local->fif_control--;
 447                }
 448                if (sdata->u.mntr_flags & MONITOR_FLAG_OTHER_BSS)
 449                        local->fif_other_bss--;
 450
 451                ieee80211_configure_filter(local);
 452                break;
 453        case NL80211_IFTYPE_STATION:
 454                del_timer_sync(&sdata->u.mgd.chswitch_timer);
 455                del_timer_sync(&sdata->u.mgd.timer);
 456                del_timer_sync(&sdata->u.mgd.conn_mon_timer);
 457                del_timer_sync(&sdata->u.mgd.bcn_mon_timer);
 458                /*
 459                 * If any of the timers fired while we waited for it, it will
 460                 * have queued its work. Now the work will be running again
 461                 * but will not rearm the timer again because it checks
 462                 * whether the interface is running, which, at this point,
 463                 * it no longer is.
 464                 */
 465                cancel_work_sync(&sdata->u.mgd.work);
 466                cancel_work_sync(&sdata->u.mgd.chswitch_work);
 467                cancel_work_sync(&sdata->u.mgd.monitor_work);
 468                cancel_work_sync(&sdata->u.mgd.beacon_loss_work);
 469
 470                /*
 471                 * When we get here, the interface is marked down.
 472                 * Call synchronize_rcu() to wait for the RX path
 473                 * should it be using the interface and enqueuing
 474                 * frames at this very time on another CPU.
 475                 */
 476                synchronize_rcu();
 477                skb_queue_purge(&sdata->u.mgd.skb_queue);
 478                /* fall through */
 479        case NL80211_IFTYPE_ADHOC:
 480                if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
 481                        del_timer_sync(&sdata->u.ibss.timer);
 482                        cancel_work_sync(&sdata->u.ibss.work);
 483                        synchronize_rcu();
 484                        skb_queue_purge(&sdata->u.ibss.skb_queue);
 485                }
 486                /* fall through */
 487        case NL80211_IFTYPE_MESH_POINT:
 488                if (ieee80211_vif_is_mesh(&sdata->vif)) {
 489                        /* other_bss and allmulti are always set on mesh
 490                         * ifaces */
 491                        local->fif_other_bss--;
 492                        atomic_dec(&local->iff_allmultis);
 493
 494                        ieee80211_configure_filter(local);
 495
 496                        ieee80211_stop_mesh(sdata);
 497                }
 498                /* fall through */
 499        default:
 500                if (local->scan_sdata == sdata)
 501                        ieee80211_scan_cancel(local);
 502
 503                /*
 504                 * Disable beaconing for AP and mesh, IBSS can't
 505                 * still be joined to a network at this point.
 506                 */
 507                if (sdata->vif.type == NL80211_IFTYPE_AP ||
 508                    sdata->vif.type == NL80211_IFTYPE_MESH_POINT) {
 509                        ieee80211_bss_info_change_notify(sdata,
 510                                BSS_CHANGED_BEACON_ENABLED);
 511                }
 512
 513                conf.vif = &sdata->vif;
 514                conf.type = sdata->vif.type;
 515                conf.mac_addr = dev->dev_addr;
 516                /* disable all keys for as long as this netdev is down */
 517                ieee80211_disable_keys(sdata);
 518                drv_remove_interface(local, &conf);
 519        }
 520
 521        sdata->bss = NULL;
 522
 523        hw_reconf_flags |= __ieee80211_recalc_idle(local);
 524
 525        ieee80211_recalc_ps(local, -1);
 526
 527        if (local->open_count == 0) {
 528                ieee80211_clear_tx_pending(local);
 529                ieee80211_stop_device(local);
 530
 531                /* no reconfiguring after stop! */
 532                hw_reconf_flags = 0;
 533        }
 534
 535        /* do after stop to avoid reconfiguring when we stop anyway */
 536        if (hw_reconf_flags)
 537                ieee80211_hw_config(local, hw_reconf_flags);
 538
 539        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 540        for (i = 0; i < IEEE80211_MAX_QUEUES; i++) {
 541                skb_queue_walk_safe(&local->pending[i], skb, tmp) {
 542                        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 543                        if (info->control.vif == &sdata->vif) {
 544                                __skb_unlink(skb, &local->pending[i]);
 545                                dev_kfree_skb_irq(skb);
 546                        }
 547                }
 548        }
 549        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 550
 551        return 0;
 552}
 553
 554static void ieee80211_set_multicast_list(struct net_device *dev)
 555{
 556        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 557        struct ieee80211_local *local = sdata->local;
 558        int allmulti, promisc, sdata_allmulti, sdata_promisc;
 559
 560        allmulti = !!(dev->flags & IFF_ALLMULTI);
 561        promisc = !!(dev->flags & IFF_PROMISC);
 562        sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI);
 563        sdata_promisc = !!(sdata->flags & IEEE80211_SDATA_PROMISC);
 564
 565        if (allmulti != sdata_allmulti) {
 566                if (dev->flags & IFF_ALLMULTI)
 567                        atomic_inc(&local->iff_allmultis);
 568                else
 569                        atomic_dec(&local->iff_allmultis);
 570                sdata->flags ^= IEEE80211_SDATA_ALLMULTI;
 571        }
 572
 573        if (promisc != sdata_promisc) {
 574                if (dev->flags & IFF_PROMISC)
 575                        atomic_inc(&local->iff_promiscs);
 576                else
 577                        atomic_dec(&local->iff_promiscs);
 578                sdata->flags ^= IEEE80211_SDATA_PROMISC;
 579        }
 580        spin_lock_bh(&local->filter_lock);
 581        __dev_addr_sync(&local->mc_list, &local->mc_count,
 582                        &dev->mc_list, &dev->mc_count);
 583        spin_unlock_bh(&local->filter_lock);
 584        ieee80211_queue_work(&local->hw, &local->reconfig_filter);
 585}
 586
 587/*
 588 * Called when the netdev is removed or, by the code below, before
 589 * the interface type changes.
 590 */
 591static void ieee80211_teardown_sdata(struct net_device *dev)
 592{
 593        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 594        struct ieee80211_local *local = sdata->local;
 595        struct beacon_data *beacon;
 596        struct sk_buff *skb;
 597        int flushed;
 598        int i;
 599
 600        /* free extra data */
 601        ieee80211_free_keys(sdata);
 602
 603        ieee80211_debugfs_remove_netdev(sdata);
 604
 605        for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++)
 606                __skb_queue_purge(&sdata->fragments[i].skb_list);
 607        sdata->fragment_next = 0;
 608
 609        switch (sdata->vif.type) {
 610        case NL80211_IFTYPE_AP:
 611                beacon = sdata->u.ap.beacon;
 612                rcu_assign_pointer(sdata->u.ap.beacon, NULL);
 613                synchronize_rcu();
 614                kfree(beacon);
 615
 616                while ((skb = skb_dequeue(&sdata->u.ap.ps_bc_buf))) {
 617                        local->total_ps_buffered--;
 618                        dev_kfree_skb(skb);
 619                }
 620
 621                break;
 622        case NL80211_IFTYPE_MESH_POINT:
 623                if (ieee80211_vif_is_mesh(&sdata->vif))
 624                        mesh_rmc_free(sdata);
 625                break;
 626        case NL80211_IFTYPE_ADHOC:
 627                if (WARN_ON(sdata->u.ibss.presp))
 628                        kfree_skb(sdata->u.ibss.presp);
 629                break;
 630        case NL80211_IFTYPE_STATION:
 631        case NL80211_IFTYPE_WDS:
 632        case NL80211_IFTYPE_AP_VLAN:
 633        case NL80211_IFTYPE_MONITOR:
 634                break;
 635        case NL80211_IFTYPE_UNSPECIFIED:
 636        case __NL80211_IFTYPE_AFTER_LAST:
 637                BUG();
 638                break;
 639        }
 640
 641        flushed = sta_info_flush(local, sdata);
 642        WARN_ON(flushed);
 643}
 644
 645static const struct net_device_ops ieee80211_dataif_ops = {
 646        .ndo_open               = ieee80211_open,
 647        .ndo_stop               = ieee80211_stop,
 648        .ndo_uninit             = ieee80211_teardown_sdata,
 649        .ndo_start_xmit         = ieee80211_subif_start_xmit,
 650        .ndo_set_multicast_list = ieee80211_set_multicast_list,
 651        .ndo_change_mtu         = ieee80211_change_mtu,
 652        .ndo_set_mac_address    = eth_mac_addr,
 653};
 654
 655static const struct net_device_ops ieee80211_monitorif_ops = {
 656        .ndo_open               = ieee80211_open,
 657        .ndo_stop               = ieee80211_stop,
 658        .ndo_uninit             = ieee80211_teardown_sdata,
 659        .ndo_start_xmit         = ieee80211_monitor_start_xmit,
 660        .ndo_set_multicast_list = ieee80211_set_multicast_list,
 661        .ndo_change_mtu         = ieee80211_change_mtu,
 662        .ndo_set_mac_address    = eth_mac_addr,
 663};
 664
 665static void ieee80211_if_setup(struct net_device *dev)
 666{
 667        ether_setup(dev);
 668        dev->netdev_ops = &ieee80211_dataif_ops;
 669        dev->destructor = free_netdev;
 670}
 671
 672/*
 673 * Helper function to initialise an interface to a specific type.
 674 */
 675static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
 676                                  enum nl80211_iftype type)
 677{
 678        /* clear type-dependent union */
 679        memset(&sdata->u, 0, sizeof(sdata->u));
 680
 681        /* and set some type-dependent values */
 682        sdata->vif.type = type;
 683        sdata->dev->netdev_ops = &ieee80211_dataif_ops;
 684        sdata->wdev.iftype = type;
 685
 686        /* only monitor differs */
 687        sdata->dev->type = ARPHRD_ETHER;
 688
 689        switch (type) {
 690        case NL80211_IFTYPE_AP:
 691                skb_queue_head_init(&sdata->u.ap.ps_bc_buf);
 692                INIT_LIST_HEAD(&sdata->u.ap.vlans);
 693                break;
 694        case NL80211_IFTYPE_STATION:
 695                ieee80211_sta_setup_sdata(sdata);
 696                break;
 697        case NL80211_IFTYPE_ADHOC:
 698                ieee80211_ibss_setup_sdata(sdata);
 699                break;
 700        case NL80211_IFTYPE_MESH_POINT:
 701                if (ieee80211_vif_is_mesh(&sdata->vif))
 702                        ieee80211_mesh_init_sdata(sdata);
 703                break;
 704        case NL80211_IFTYPE_MONITOR:
 705                sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP;
 706                sdata->dev->netdev_ops = &ieee80211_monitorif_ops;
 707                sdata->u.mntr_flags = MONITOR_FLAG_CONTROL |
 708                                      MONITOR_FLAG_OTHER_BSS;
 709                break;
 710        case NL80211_IFTYPE_WDS:
 711        case NL80211_IFTYPE_AP_VLAN:
 712                break;
 713        case NL80211_IFTYPE_UNSPECIFIED:
 714        case __NL80211_IFTYPE_AFTER_LAST:
 715                BUG();
 716                break;
 717        }
 718
 719        ieee80211_debugfs_add_netdev(sdata);
 720}
 721
 722int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
 723                             enum nl80211_iftype type)
 724{
 725        ASSERT_RTNL();
 726
 727        if (type == sdata->vif.type)
 728                return 0;
 729
 730        /* Setting ad-hoc mode on non-IBSS channel is not supported. */
 731        if (sdata->local->oper_channel->flags & IEEE80211_CHAN_NO_IBSS &&
 732            type == NL80211_IFTYPE_ADHOC)
 733                return -EOPNOTSUPP;
 734
 735        /*
 736         * We could, here, on changes between IBSS/STA/MESH modes,
 737         * invoke an MLME function instead that disassociates etc.
 738         * and goes into the requested mode.
 739         */
 740
 741        if (netif_running(sdata->dev))
 742                return -EBUSY;
 743
 744        /* Purge and reset type-dependent state. */
 745        ieee80211_teardown_sdata(sdata->dev);
 746        ieee80211_setup_sdata(sdata, type);
 747
 748        /* reset some values that shouldn't be kept across type changes */
 749        sdata->vif.bss_conf.basic_rates =
 750                ieee80211_mandatory_rates(sdata->local,
 751                        sdata->local->hw.conf.channel->band);
 752        sdata->drop_unencrypted = 0;
 753
 754        return 0;
 755}
 756
 757static struct device_type wiphy_type = {
 758        .name   = "wlan",
 759};
 760
 761int ieee80211_if_add(struct ieee80211_local *local, const char *name,
 762                     struct net_device **new_dev, enum nl80211_iftype type,
 763                     struct vif_params *params)
 764{
 765        struct net_device *ndev;
 766        struct ieee80211_sub_if_data *sdata = NULL;
 767        int ret, i;
 768
 769        ASSERT_RTNL();
 770
 771        ndev = alloc_netdev(sizeof(*sdata) + local->hw.vif_data_size,
 772                            name, ieee80211_if_setup);
 773        if (!ndev)
 774                return -ENOMEM;
 775        dev_net_set(ndev, wiphy_net(local->hw.wiphy));
 776
 777        ndev->needed_headroom = local->tx_headroom +
 778                                4*6 /* four MAC addresses */
 779                                + 2 + 2 + 2 + 2 /* ctl, dur, seq, qos */
 780                                + 6 /* mesh */
 781                                + 8 /* rfc1042/bridge tunnel */
 782                                - ETH_HLEN /* ethernet hard_header_len */
 783                                + IEEE80211_ENCRYPT_HEADROOM;
 784        ndev->needed_tailroom = IEEE80211_ENCRYPT_TAILROOM;
 785
 786        ret = dev_alloc_name(ndev, ndev->name);
 787        if (ret < 0)
 788                goto fail;
 789
 790        memcpy(ndev->dev_addr, local->hw.wiphy->perm_addr, ETH_ALEN);
 791        SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy));
 792        SET_NETDEV_DEVTYPE(ndev, &wiphy_type);
 793
 794        /* don't use IEEE80211_DEV_TO_SUB_IF because it checks too much */
 795        sdata = netdev_priv(ndev);
 796        ndev->ieee80211_ptr = &sdata->wdev;
 797
 798        /* initialise type-independent data */
 799        sdata->wdev.wiphy = local->hw.wiphy;
 800        sdata->local = local;
 801        sdata->dev = ndev;
 802
 803        for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++)
 804                skb_queue_head_init(&sdata->fragments[i].skb_list);
 805
 806        INIT_LIST_HEAD(&sdata->key_list);
 807
 808        sdata->force_unicast_rateidx = -1;
 809        sdata->max_ratectrl_rateidx = -1;
 810
 811        /* setup type-dependent data */
 812        ieee80211_setup_sdata(sdata, type);
 813
 814        ret = register_netdevice(ndev);
 815        if (ret)
 816                goto fail;
 817
 818        if (ieee80211_vif_is_mesh(&sdata->vif) &&
 819            params && params->mesh_id_len)
 820                ieee80211_sdata_set_mesh_id(sdata,
 821                                            params->mesh_id_len,
 822                                            params->mesh_id);
 823
 824        mutex_lock(&local->iflist_mtx);
 825        list_add_tail_rcu(&sdata->list, &local->interfaces);
 826        mutex_unlock(&local->iflist_mtx);
 827
 828        if (new_dev)
 829                *new_dev = ndev;
 830
 831        return 0;
 832
 833 fail:
 834        free_netdev(ndev);
 835        return ret;
 836}
 837
 838void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata)
 839{
 840        ASSERT_RTNL();
 841
 842        mutex_lock(&sdata->local->iflist_mtx);
 843        list_del_rcu(&sdata->list);
 844        mutex_unlock(&sdata->local->iflist_mtx);
 845
 846        synchronize_rcu();
 847        unregister_netdevice(sdata->dev);
 848}
 849
 850/*
 851 * Remove all interfaces, may only be called at hardware unregistration
 852 * time because it doesn't do RCU-safe list removals.
 853 */
 854void ieee80211_remove_interfaces(struct ieee80211_local *local)
 855{
 856        struct ieee80211_sub_if_data *sdata, *tmp;
 857
 858        ASSERT_RTNL();
 859
 860        list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
 861                /*
 862                 * we cannot hold the iflist_mtx across unregister_netdevice,
 863                 * but we only need to hold it for list modifications to lock
 864                 * out readers since we're under the RTNL here as all other
 865                 * writers.
 866                 */
 867                mutex_lock(&local->iflist_mtx);
 868                list_del(&sdata->list);
 869                mutex_unlock(&local->iflist_mtx);
 870
 871                unregister_netdevice(sdata->dev);
 872        }
 873}
 874
 875static u32 ieee80211_idle_off(struct ieee80211_local *local,
 876                              const char *reason)
 877{
 878        if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE))
 879                return 0;
 880
 881#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
 882        printk(KERN_DEBUG "%s: device no longer idle - %s\n",
 883               wiphy_name(local->hw.wiphy), reason);
 884#endif
 885
 886        local->hw.conf.flags &= ~IEEE80211_CONF_IDLE;
 887        return IEEE80211_CONF_CHANGE_IDLE;
 888}
 889
 890static u32 ieee80211_idle_on(struct ieee80211_local *local)
 891{
 892        if (local->hw.conf.flags & IEEE80211_CONF_IDLE)
 893                return 0;
 894
 895#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
 896        printk(KERN_DEBUG "%s: device now idle\n",
 897               wiphy_name(local->hw.wiphy));
 898#endif
 899
 900        local->hw.conf.flags |= IEEE80211_CONF_IDLE;
 901        return IEEE80211_CONF_CHANGE_IDLE;
 902}
 903
 904u32 __ieee80211_recalc_idle(struct ieee80211_local *local)
 905{
 906        struct ieee80211_sub_if_data *sdata;
 907        int count = 0;
 908
 909        if (local->scanning)
 910                return ieee80211_idle_off(local, "scanning");
 911
 912        list_for_each_entry(sdata, &local->interfaces, list) {
 913                if (!netif_running(sdata->dev))
 914                        continue;
 915                /* do not count disabled managed interfaces */
 916                if (sdata->vif.type == NL80211_IFTYPE_STATION &&
 917                    !sdata->u.mgd.associated &&
 918                    list_empty(&sdata->u.mgd.work_list))
 919                        continue;
 920                /* do not count unused IBSS interfaces */
 921                if (sdata->vif.type == NL80211_IFTYPE_ADHOC &&
 922                    !sdata->u.ibss.ssid_len)
 923                        continue;
 924                /* count everything else */
 925                count++;
 926        }
 927
 928        if (!count)
 929                return ieee80211_idle_on(local);
 930        else
 931                return ieee80211_idle_off(local, "in use");
 932
 933        return 0;
 934}
 935
 936void ieee80211_recalc_idle(struct ieee80211_local *local)
 937{
 938        u32 chg;
 939
 940        mutex_lock(&local->iflist_mtx);
 941        chg = __ieee80211_recalc_idle(local);
 942        mutex_unlock(&local->iflist_mtx);
 943        if (chg)
 944                ieee80211_hw_config(local, chg);
 945}
 946