core.c 20.7 KB
Newer Older
1 2 3
/*
 * This is the linux wireless configuration interface.
 *
4
 * Copyright 2006-2009		Johannes Berg <johannes@sipsolutions.net>
5 6 7 8 9 10 11 12 13 14
 */

#include <linux/if.h>
#include <linux/module.h>
#include <linux/err.h>
#include <linux/list.h>
#include <linux/nl80211.h>
#include <linux/debugfs.h>
#include <linux/notifier.h>
#include <linux/device.h>
15
#include <linux/etherdevice.h>
J
Johannes Berg 已提交
16
#include <linux/rtnetlink.h>
17 18
#include <net/genetlink.h>
#include <net/cfg80211.h>
19
#include "nl80211.h"
20 21
#include "core.h"
#include "sysfs.h"
22
#include "debugfs.h"
23
#include "wext-compat.h"
24
#include "ethtool.h"
25 26 27 28 29 30 31 32 33 34 35

/* name for sysfs, %d is appended */
#define PHY_NAME "phy"

MODULE_AUTHOR("Johannes Berg");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("wireless configuration support");

/* RCU might be appropriate here since we usually
 * only read the list, and that can happen quite
 * often because we need to do it for each command */
36
LIST_HEAD(cfg80211_rdev_list);
37
int cfg80211_rdev_list_generation;
38 39

/*
40
 * This is used to protect the cfg80211_rdev_list
41 42
 */
DEFINE_MUTEX(cfg80211_mutex);
43 44 45 46

/* for debugfs */
static struct dentry *ieee80211_debugfs_dir;

47
/* requires cfg80211_mutex to be held! */
48
struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx)
49
{
50
	struct cfg80211_registered_device *result = NULL, *rdev;
51

52 53 54
	if (!wiphy_idx_valid(wiphy_idx))
		return NULL;

55 56
	assert_cfg80211_lock();

57 58 59
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		if (rdev->wiphy_idx == wiphy_idx) {
			result = rdev;
60 61 62 63 64 65 66
			break;
		}
	}

	return result;
}

67 68
int get_wiphy_idx(struct wiphy *wiphy)
{
69
	struct cfg80211_registered_device *rdev;
70 71
	if (!wiphy)
		return WIPHY_IDX_STALE;
72 73
	rdev = wiphy_to_dev(wiphy);
	return rdev->wiphy_idx;
74 75
}

76
/* requires cfg80211_rdev_mutex to be held! */
77 78
struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx)
{
79
	struct cfg80211_registered_device *rdev;
80 81 82 83 84 85

	if (!wiphy_idx_valid(wiphy_idx))
		return NULL;

	assert_cfg80211_lock();

86 87
	rdev = cfg80211_rdev_by_wiphy_idx(wiphy_idx);
	if (!rdev)
88
		return NULL;
89
	return &rdev->wiphy;
90 91
}

92
/* requires cfg80211_mutex to be held! */
93
struct cfg80211_registered_device *
94
__cfg80211_rdev_from_info(struct genl_info *info)
95 96
{
	int ifindex;
97
	struct cfg80211_registered_device *bywiphyidx = NULL, *byifidx = NULL;
98 99 100
	struct net_device *dev;
	int err = -EINVAL;

101 102
	assert_cfg80211_lock();

103
	if (info->attrs[NL80211_ATTR_WIPHY]) {
104
		bywiphyidx = cfg80211_rdev_by_wiphy_idx(
105 106 107 108 109 110
				nla_get_u32(info->attrs[NL80211_ATTR_WIPHY]));
		err = -ENODEV;
	}

	if (info->attrs[NL80211_ATTR_IFINDEX]) {
		ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
111
		dev = dev_get_by_index(genl_info_net(info), ifindex);
112 113 114 115 116 117 118 119 120
		if (dev) {
			if (dev->ieee80211_ptr)
				byifidx =
					wiphy_to_dev(dev->ieee80211_ptr->wiphy);
			dev_put(dev);
		}
		err = -ENODEV;
	}

121 122
	if (bywiphyidx && byifidx) {
		if (bywiphyidx != byifidx)
123 124
			return ERR_PTR(-EINVAL);
		else
125
			return bywiphyidx; /* == byifidx */
126
	}
127 128
	if (bywiphyidx)
		return bywiphyidx;
129 130 131 132 133 134 135 136 137 138

	if (byifidx)
		return byifidx;

	return ERR_PTR(err);
}

struct cfg80211_registered_device *
cfg80211_get_dev_from_info(struct genl_info *info)
{
139
	struct cfg80211_registered_device *rdev;
140

141
	mutex_lock(&cfg80211_mutex);
142
	rdev = __cfg80211_rdev_from_info(info);
143 144 145 146

	/* if it is not an error we grab the lock on
	 * it to assure it won't be going away while
	 * we operate on it */
147 148
	if (!IS_ERR(rdev))
		mutex_lock(&rdev->mtx);
149

150
	mutex_unlock(&cfg80211_mutex);
151

152
	return rdev;
153 154 155
}

struct cfg80211_registered_device *
156
cfg80211_get_dev_from_ifindex(struct net *net, int ifindex)
157
{
158
	struct cfg80211_registered_device *rdev = ERR_PTR(-ENODEV);
159 160
	struct net_device *dev;

161
	mutex_lock(&cfg80211_mutex);
162
	dev = dev_get_by_index(net, ifindex);
163 164 165
	if (!dev)
		goto out;
	if (dev->ieee80211_ptr) {
166 167
		rdev = wiphy_to_dev(dev->ieee80211_ptr->wiphy);
		mutex_lock(&rdev->mtx);
168
	} else
169
		rdev = ERR_PTR(-ENODEV);
170 171
	dev_put(dev);
 out:
172
	mutex_unlock(&cfg80211_mutex);
173
	return rdev;
174 175
}

176
/* requires cfg80211_mutex to be held */
177 178 179
int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
			char *newname)
{
180
	struct cfg80211_registered_device *rdev2;
181
	int wiphy_idx, taken = -1, result, digits;
182

183
	assert_cfg80211_lock();
184

185
	/* prohibit calling the thing phy%d when %d is not its number */
186 187 188
	sscanf(newname, PHY_NAME "%d%n", &wiphy_idx, &taken);
	if (taken == strlen(newname) && wiphy_idx != rdev->wiphy_idx) {
		/* count number of places needed to print wiphy_idx */
189
		digits = 1;
190
		while (wiphy_idx /= 10)
191 192 193 194 195 196
			digits++;
		/*
		 * deny the name if it is phy<idx> where <idx> is printed
		 * without leading zeroes. taken == strlen(newname) here
		 */
		if (taken == strlen(PHY_NAME) + digits)
197
			return -EINVAL;
198 199 200 201 202
	}


	/* Ignore nop renames */
	if (strcmp(newname, dev_name(&rdev->wiphy.dev)) == 0)
203
		return 0;
204 205

	/* Ensure another device does not already have this name. */
206 207
	list_for_each_entry(rdev2, &cfg80211_rdev_list, list)
		if (strcmp(newname, dev_name(&rdev2->wiphy.dev)) == 0)
208
			return -EINVAL;
209 210 211

	result = device_rename(&rdev->wiphy.dev, newname);
	if (result)
212
		return result;
213

214 215
	if (rdev->wiphy.debugfsdir &&
	    !debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
216 217 218 219 220 221
			    rdev->wiphy.debugfsdir,
			    rdev->wiphy.debugfsdir->d_parent,
			    newname))
		printk(KERN_ERR "cfg80211: failed to rename debugfs dir to %s!\n",
		       newname);

222
	nl80211_notify_dev_rename(rdev);
223

224
	return 0;
225 226
}

227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
			  struct net *net)
{
	struct wireless_dev *wdev;
	int err = 0;

	if (!rdev->wiphy.netnsok)
		return -EOPNOTSUPP;

	list_for_each_entry(wdev, &rdev->netdev_list, list) {
		wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
		err = dev_change_net_namespace(wdev->netdev, net, "wlan%d");
		if (err)
			break;
		wdev->netdev->features |= NETIF_F_NETNS_LOCAL;
	}

	if (err) {
		/* failed -- clean up to old netns */
		net = wiphy_net(&rdev->wiphy);

		list_for_each_entry_continue_reverse(wdev, &rdev->netdev_list,
						     list) {
			wdev->netdev->features &= ~NETIF_F_NETNS_LOCAL;
			err = dev_change_net_namespace(wdev->netdev, net,
							"wlan%d");
			WARN_ON(err);
			wdev->netdev->features |= NETIF_F_NETNS_LOCAL;
		}
	}

	wiphy_net_set(&rdev->wiphy, net);

	return err;
}

J
Johannes Berg 已提交
263 264
static void cfg80211_rfkill_poll(struct rfkill *rfkill, void *data)
{
265
	struct cfg80211_registered_device *rdev = data;
J
Johannes Berg 已提交
266

267
	rdev->ops->rfkill_poll(&rdev->wiphy);
J
Johannes Berg 已提交
268 269 270 271
}

static int cfg80211_rfkill_set_block(void *data, bool blocked)
{
272
	struct cfg80211_registered_device *rdev = data;
J
Johannes Berg 已提交
273 274 275 276 277 278
	struct wireless_dev *wdev;

	if (!blocked)
		return 0;

	rtnl_lock();
279
	mutex_lock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
280

281
	list_for_each_entry(wdev, &rdev->netdev_list, list)
J
Johannes Berg 已提交
282 283
		dev_close(wdev->netdev);

284
	mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
285 286 287 288 289 290 291
	rtnl_unlock();

	return 0;
}

static void cfg80211_rfkill_sync_work(struct work_struct *work)
{
292
	struct cfg80211_registered_device *rdev;
J
Johannes Berg 已提交
293

294 295
	rdev = container_of(work, struct cfg80211_registered_device, rfkill_sync);
	cfg80211_rfkill_set_block(rdev, rfkill_blocked(rdev->rfkill));
J
Johannes Berg 已提交
296 297
}

J
Johannes Berg 已提交
298 299 300 301 302 303 304 305 306 307
static void cfg80211_event_work(struct work_struct *work)
{
	struct cfg80211_registered_device *rdev;

	rdev = container_of(work, struct cfg80211_registered_device,
			    event_work);

	rtnl_lock();
	cfg80211_lock_rdev(rdev);

308
	cfg80211_process_rdev_events(rdev);
J
Johannes Berg 已提交
309 310 311 312
	cfg80211_unlock_rdev(rdev);
	rtnl_unlock();
}

313 314
/* exported functions */

315
struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
316
{
317 318
	static int wiphy_counter;

319
	struct cfg80211_registered_device *rdev;
320 321
	int alloc_size;

322 323 324 325 326 327 328
	WARN_ON(ops->add_key && (!ops->del_key || !ops->set_default_key));
	WARN_ON(ops->auth && (!ops->assoc || !ops->deauth || !ops->disassoc));
	WARN_ON(ops->connect && !ops->disconnect);
	WARN_ON(ops->join_ibss && !ops->leave_ibss);
	WARN_ON(ops->add_virtual_intf && !ops->del_virtual_intf);
	WARN_ON(ops->add_station && !ops->del_station);
	WARN_ON(ops->add_mpath && !ops->del_mpath);
329

330
	alloc_size = sizeof(*rdev) + sizeof_priv;
331

332 333
	rdev = kzalloc(alloc_size, GFP_KERNEL);
	if (!rdev)
334 335
		return NULL;

336
	rdev->ops = ops;
337

338
	mutex_lock(&cfg80211_mutex);
339

340
	rdev->wiphy_idx = wiphy_counter++;
341

342
	if (unlikely(!wiphy_idx_valid(rdev->wiphy_idx))) {
343
		wiphy_counter--;
344
		mutex_unlock(&cfg80211_mutex);
345
		/* ugh, wrapped! */
346
		kfree(rdev);
347 348 349
		return NULL;
	}

350
	mutex_unlock(&cfg80211_mutex);
351

352
	/* give it a proper name */
353 354 355 356 357 358 359 360 361
	dev_set_name(&rdev->wiphy.dev, PHY_NAME "%d", rdev->wiphy_idx);

	mutex_init(&rdev->mtx);
	mutex_init(&rdev->devlist_mtx);
	INIT_LIST_HEAD(&rdev->netdev_list);
	spin_lock_init(&rdev->bss_lock);
	INIT_LIST_HEAD(&rdev->bss_list);
	INIT_WORK(&rdev->scan_done_wk, __cfg80211_scan_done);

J
Johannes Berg 已提交
362 363 364 365
#ifdef CONFIG_CFG80211_WEXT
	rdev->wiphy.wext = &cfg80211_wext_handler;
#endif

366 367 368 369
	device_initialize(&rdev->wiphy.dev);
	rdev->wiphy.dev.class = &ieee80211_class;
	rdev->wiphy.dev.platform_data = rdev;

370 371
	rdev->wiphy.ps_default = CONFIG_CFG80211_DEFAULT_PS_VALUE;

372 373
	wiphy_net_set(&rdev->wiphy, &init_net);

374 375 376 377 378 379 380
	rdev->rfkill_ops.set_block = cfg80211_rfkill_set_block;
	rdev->rfkill = rfkill_alloc(dev_name(&rdev->wiphy.dev),
				   &rdev->wiphy.dev, RFKILL_TYPE_WLAN,
				   &rdev->rfkill_ops, rdev);

	if (!rdev->rfkill) {
		kfree(rdev);
J
Johannes Berg 已提交
381 382 383
		return NULL;
	}

384 385 386
	INIT_WORK(&rdev->rfkill_sync, cfg80211_rfkill_sync_work);
	INIT_WORK(&rdev->conn_work, cfg80211_conn_work);
	INIT_WORK(&rdev->event_work, cfg80211_event_work);
J
Johannes Berg 已提交
387

388 389
	init_waitqueue_head(&rdev->dev_wait);

390 391 392 393 394
	/*
	 * Initialize wiphy parameters to IEEE 802.11 MIB default values.
	 * Fragmentation and RTS threshold are disabled by default with the
	 * special -1 value.
	 */
395 396 397 398
	rdev->wiphy.retry_short = 7;
	rdev->wiphy.retry_long = 4;
	rdev->wiphy.frag_threshold = (u32) -1;
	rdev->wiphy.rts_threshold = (u32) -1;
399

400
	return &rdev->wiphy;
401 402 403 404 405
}
EXPORT_SYMBOL(wiphy_new);

int wiphy_register(struct wiphy *wiphy)
{
406
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
407
	int res;
408 409 410 411
	enum ieee80211_band band;
	struct ieee80211_supported_band *sband;
	bool have_band = false;
	int i;
412 413 414 415 416 417 418
	u16 ifmodes = wiphy->interface_modes;

	/* sanity check ifmodes */
	WARN_ON(!ifmodes);
	ifmodes &= ((1 << __NL80211_IFTYPE_AFTER_LAST) - 1) & ~1;
	if (WARN_ON(ifmodes != wiphy->interface_modes))
		wiphy->interface_modes = ifmodes;
419 420 421 422 423 424 425 426 427

	/* sanity check supported bands/channels */
	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
		sband = wiphy->bands[band];
		if (!sband)
			continue;

		sband->band = band;

428 429 430 431 432 433 434 435 436
		if (WARN_ON(!sband->n_channels || !sband->n_bitrates))
			return -EINVAL;

		/*
		 * Since we use a u32 for rate bitmaps in
		 * ieee80211_get_response_rate, we cannot
		 * have more than 32 legacy rates.
		 */
		if (WARN_ON(sband->n_bitrates > 32))
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
			return -EINVAL;

		for (i = 0; i < sband->n_channels; i++) {
			sband->channels[i].orig_flags =
				sband->channels[i].flags;
			sband->channels[i].orig_mag =
				sband->channels[i].max_antenna_gain;
			sband->channels[i].orig_mpwr =
				sband->channels[i].max_power;
			sband->channels[i].band = band;
		}

		have_band = true;
	}

	if (!have_band) {
		WARN_ON(1);
		return -EINVAL;
	}

	/* check and set up bitrates */
	ieee80211_set_bitrate_flags(wiphy);

460
	res = device_add(&rdev->wiphy.dev);
461
	if (res)
462
		return res;
463

464
	res = rfkill_register(rdev->rfkill);
J
Johannes Berg 已提交
465 466 467
	if (res)
		goto out_rm_dev;

468 469 470 471 472
	mutex_lock(&cfg80211_mutex);

	/* set up regulatory info */
	wiphy_update_regulatory(wiphy, NL80211_REGDOM_SET_BY_CORE);

473
	list_add(&rdev->list, &cfg80211_rdev_list);
474
	cfg80211_rdev_list_generation++;
475

476 477
	mutex_unlock(&cfg80211_mutex);

478
	/* add to debugfs */
479 480
	rdev->wiphy.debugfsdir =
		debugfs_create_dir(wiphy_name(&rdev->wiphy),
481
				   ieee80211_debugfs_dir);
482 483
	if (IS_ERR(rdev->wiphy.debugfsdir))
		rdev->wiphy.debugfsdir = NULL;
484

485 486 487 488 489 490 491 492 493 494 495
	if (wiphy->custom_regulatory) {
		struct regulatory_request request;

		request.wiphy_idx = get_wiphy_idx(wiphy);
		request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
		request.alpha2[0] = '9';
		request.alpha2[1] = '9';

		nl80211_send_reg_change_event(&request);
	}

496
	cfg80211_debugfs_rdev_add(rdev);
497

498
	return 0;
J
Johannes Berg 已提交
499 500

 out_rm_dev:
501
	device_del(&rdev->wiphy.dev);
502 503 504 505
	return res;
}
EXPORT_SYMBOL(wiphy_register);

J
Johannes Berg 已提交
506 507
void wiphy_rfkill_start_polling(struct wiphy *wiphy)
{
508
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
J
Johannes Berg 已提交
509

510
	if (!rdev->ops->rfkill_poll)
J
Johannes Berg 已提交
511
		return;
512 513
	rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
	rfkill_resume_polling(rdev->rfkill);
J
Johannes Berg 已提交
514 515 516 517 518
}
EXPORT_SYMBOL(wiphy_rfkill_start_polling);

void wiphy_rfkill_stop_polling(struct wiphy *wiphy)
{
519
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
J
Johannes Berg 已提交
520

521
	rfkill_pause_polling(rdev->rfkill);
J
Johannes Berg 已提交
522 523 524
}
EXPORT_SYMBOL(wiphy_rfkill_stop_polling);

525 526
void wiphy_unregister(struct wiphy *wiphy)
{
527
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
528

529
	rfkill_unregister(rdev->rfkill);
J
Johannes Berg 已提交
530

531
	/* protect the device list */
532
	mutex_lock(&cfg80211_mutex);
533

534 535 536 537 538 539 540 541
	wait_event(rdev->dev_wait, ({
		int __count;
		mutex_lock(&rdev->devlist_mtx);
		__count = rdev->opencount;
		mutex_unlock(&rdev->devlist_mtx);
		__count == 0;}));

	mutex_lock(&rdev->devlist_mtx);
542
	BUG_ON(!list_empty(&rdev->netdev_list));
543 544 545 546 547 548
	mutex_unlock(&rdev->devlist_mtx);

	/*
	 * First remove the hardware from everywhere, this makes
	 * it impossible to find from userspace.
	 */
549
	debugfs_remove_recursive(rdev->wiphy.debugfsdir);
550
	list_del(&rdev->list);
551 552

	/*
553
	 * Try to grab rdev->mtx. If a command is still in progress,
554 555 556 557
	 * hopefully the driver will refuse it since it's tearing
	 * down the device already. We wait for this command to complete
	 * before unlinking the item from the list.
	 * Note: as codified by the BUG_ON above we cannot get here if
558 559 560
	 * a virtual interface is still present. Hence, we can only get
	 * to lock contention here if userspace issues a command that
	 * identified the hardware by wiphy index.
561
	 */
J
Johannes Berg 已提交
562
	cfg80211_lock_rdev(rdev);
563
	/* nothing */
J
Johannes Berg 已提交
564
	cfg80211_unlock_rdev(rdev);
565

566 567 568 569
	/* If this device got a regulatory hint tell core its
	 * free to listen now to a new shiny device regulatory hint */
	reg_device_remove(wiphy);

570
	cfg80211_rdev_list_generation++;
571
	device_del(&rdev->wiphy.dev);
572

573
	mutex_unlock(&cfg80211_mutex);
J
Johannes Berg 已提交
574

575
	flush_work(&rdev->scan_done_wk);
J
Johannes Berg 已提交
576 577
	cancel_work_sync(&rdev->conn_work);
	flush_work(&rdev->event_work);
578 579 580
}
EXPORT_SYMBOL(wiphy_unregister);

581
void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
582
{
583
	struct cfg80211_internal_bss *scan, *tmp;
584 585 586 587
	rfkill_destroy(rdev->rfkill);
	mutex_destroy(&rdev->mtx);
	mutex_destroy(&rdev->devlist_mtx);
	list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
J
Johannes Berg 已提交
588
		cfg80211_put_bss(&scan->pub);
589
	kfree(rdev);
590 591 592 593 594 595 596 597
}

void wiphy_free(struct wiphy *wiphy)
{
	put_device(&wiphy->dev);
}
EXPORT_SYMBOL(wiphy_free);

J
Johannes Berg 已提交
598 599
void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
{
600
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
J
Johannes Berg 已提交
601

602 603
	if (rfkill_set_hw_state(rdev->rfkill, blocked))
		schedule_work(&rdev->rfkill_sync);
J
Johannes Berg 已提交
604 605 606
}
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state);

607 608 609 610 611 612 613 614 615 616 617 618
static void wdev_cleanup_work(struct work_struct *work)
{
	struct wireless_dev *wdev;
	struct cfg80211_registered_device *rdev;

	wdev = container_of(work, struct wireless_dev, cleanup_work);
	rdev = wiphy_to_dev(wdev->wiphy);

	cfg80211_lock_rdev(rdev);

	if (WARN_ON(rdev->scan_req && rdev->scan_req->dev == wdev->netdev)) {
		rdev->scan_req->aborted = true;
619
		___cfg80211_scan_done(rdev, true);
620 621 622 623 624 625 626 627 628 629 630 631
	}

	cfg80211_unlock_rdev(rdev);

	mutex_lock(&rdev->devlist_mtx);
	rdev->opencount--;
	mutex_unlock(&rdev->devlist_mtx);
	wake_up(&rdev->dev_wait);

	dev_put(wdev->netdev);
}

632 633 634 635
static struct device_type wiphy_type = {
	.name	= "wlan",
};

636 637 638 639 640
static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
					 unsigned long state,
					 void *ndev)
{
	struct net_device *dev = ndev;
641
	struct wireless_dev *wdev = dev->ieee80211_ptr;
642 643
	struct cfg80211_registered_device *rdev;

644
	if (!wdev)
J
Johannes Berg 已提交
645
		return NOTIFY_DONE;
646

647
	rdev = wiphy_to_dev(wdev->wiphy);
648

649
	WARN_ON(wdev->iftype == NL80211_IFTYPE_UNSPECIFIED);
J
Johannes Berg 已提交
650

651
	switch (state) {
652 653 654
	case NETDEV_POST_INIT:
		SET_NETDEV_DEVTYPE(dev, &wiphy_type);
		break;
655
	case NETDEV_REGISTER:
J
Johannes Berg 已提交
656 657 658 659 660
		/*
		 * NB: cannot take rdev->mtx here because this may be
		 * called within code protected by it when interfaces
		 * are added with nl80211.
		 */
J
Johannes Berg 已提交
661
		mutex_init(&wdev->mtx);
662
		INIT_WORK(&wdev->cleanup_work, wdev_cleanup_work);
J
Johannes Berg 已提交
663 664
		INIT_LIST_HEAD(&wdev->event_list);
		spin_lock_init(&wdev->event_lock);
665
		mutex_lock(&rdev->devlist_mtx);
666
		list_add(&wdev->list, &rdev->netdev_list);
667
		rdev->devlist_generation++;
668 669 670
		/* can only change netns with wiphy */
		dev->features |= NETIF_F_NETNS_LOCAL;

671 672 673 674 675
		if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
				      "phy80211")) {
			printk(KERN_ERR "wireless: failed to add phy80211 "
				"symlink to netdev!\n");
		}
676
		wdev->netdev = dev;
S
Samuel Ortiz 已提交
677
		wdev->sme_state = CFG80211_SME_IDLE;
J
Johannes Berg 已提交
678
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
679
#ifdef CONFIG_CFG80211_WEXT
680 681
		wdev->wext.default_key = -1;
		wdev->wext.default_mgmt_key = -1;
682
		wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
683
		wdev->wext.ps = wdev->wiphy->ps_default;
684
		wdev->wext.ps_timeout = 100;
J
Johannes Berg 已提交
685 686 687 688 689 690 691
		if (rdev->ops->set_power_mgmt)
			if (rdev->ops->set_power_mgmt(wdev->wiphy, dev,
						      wdev->wext.ps,
						      wdev->wext.ps_timeout)) {
				/* assume this means it's off */
				wdev->wext.ps = false;
			}
692
#endif
693 694
		if (!dev->ethtool_ops)
			dev->ethtool_ops = &cfg80211_ethtool_ops;
695
		break;
J
Johannes Berg 已提交
696
	case NETDEV_GOING_DOWN:
S
Samuel Ortiz 已提交
697 698 699 700 701
		switch (wdev->iftype) {
		case NL80211_IFTYPE_ADHOC:
			cfg80211_leave_ibss(rdev, dev, true);
			break;
		case NL80211_IFTYPE_STATION:
J
Johannes Berg 已提交
702
			wdev_lock(wdev);
J
Johannes Berg 已提交
703
#ifdef CONFIG_CFG80211_WEXT
704 705 706
			kfree(wdev->wext.ie);
			wdev->wext.ie = NULL;
			wdev->wext.ie_len = 0;
J
Johannes Berg 已提交
707
			wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
708
#endif
J
Johannes Berg 已提交
709 710
			__cfg80211_disconnect(rdev, dev,
					      WLAN_REASON_DEAUTH_LEAVING, true);
J
Johannes Berg 已提交
711
			cfg80211_mlme_down(rdev, dev);
J
Johannes Berg 已提交
712
			wdev_unlock(wdev);
S
Samuel Ortiz 已提交
713 714 715 716
			break;
		default:
			break;
		}
717 718
		break;
	case NETDEV_DOWN:
719 720
		dev_hold(dev);
		schedule_work(&wdev->cleanup_work);
J
Johannes Berg 已提交
721 722
		break;
	case NETDEV_UP:
723 724 725 726 727 728 729 730 731 732 733 734
		/*
		 * If we have a really quick DOWN/UP succession we may
		 * have this work still pending ... cancel it and see
		 * if it was pending, in which case we need to account
		 * for some of the work it would have done.
		 */
		if (cancel_work_sync(&wdev->cleanup_work)) {
			mutex_lock(&rdev->devlist_mtx);
			rdev->opencount--;
			mutex_unlock(&rdev->devlist_mtx);
			dev_put(dev);
		}
J
Johannes Berg 已提交
735
#ifdef CONFIG_CFG80211_WEXT
J
Johannes Berg 已提交
736
		cfg80211_lock_rdev(rdev);
737
		mutex_lock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
738
		wdev_lock(wdev);
739 740
		switch (wdev->iftype) {
		case NL80211_IFTYPE_ADHOC:
J
Johannes Berg 已提交
741
			cfg80211_ibss_wext_join(rdev, wdev);
J
Johannes Berg 已提交
742
			break;
743
		case NL80211_IFTYPE_STATION:
J
Johannes Berg 已提交
744
			cfg80211_mgd_wext_connect(rdev, wdev);
745 746
			break;
		default:
J
Johannes Berg 已提交
747
			break;
748
		}
J
Johannes Berg 已提交
749
		wdev_unlock(wdev);
750
		rdev->opencount++;
751
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
752
		cfg80211_unlock_rdev(rdev);
J
Johannes Berg 已提交
753
#endif
754
		break;
755
	case NETDEV_UNREGISTER:
J
Johannes Berg 已提交
756 757 758 759 760
		/*
		 * NB: cannot take rdev->mtx here because this may be
		 * called within code protected by it when interfaces
		 * are removed with nl80211.
		 */
761
		mutex_lock(&rdev->devlist_mtx);
762 763 764 765 766 767 768
		/*
		 * It is possible to get NETDEV_UNREGISTER
		 * multiple times. To detect that, check
		 * that the interface is still on the list
		 * of registered interfaces, and only then
		 * remove and clean it up.
		 */
769
		if (!list_empty(&wdev->list)) {
770
			sysfs_remove_link(&dev->dev.kobj, "phy80211");
771
			list_del_init(&wdev->list);
772
			rdev->devlist_generation++;
J
Johannes Berg 已提交
773
#ifdef CONFIG_CFG80211_WEXT
774
			kfree(wdev->wext.keys);
J
Johannes Berg 已提交
775
#endif
776 777
		}
		mutex_unlock(&rdev->devlist_mtx);
778
		break;
J
Johannes Berg 已提交
779
	case NETDEV_PRE_UP:
780 781
		if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
			return notifier_from_errno(-EOPNOTSUPP);
J
Johannes Berg 已提交
782 783 784
		if (rfkill_blocked(rdev->rfkill))
			return notifier_from_errno(-ERFKILL);
		break;
785 786
	}

J
Johannes Berg 已提交
787
	return NOTIFY_DONE;
788 789 790 791 792 793
}

static struct notifier_block cfg80211_netdev_notifier = {
	.notifier_call = cfg80211_netdev_notifier_call,
};

794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812
static void __net_exit cfg80211_pernet_exit(struct net *net)
{
	struct cfg80211_registered_device *rdev;

	rtnl_lock();
	mutex_lock(&cfg80211_mutex);
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		if (net_eq(wiphy_net(&rdev->wiphy), net))
			WARN_ON(cfg80211_switch_netns(rdev, &init_net));
	}
	mutex_unlock(&cfg80211_mutex);
	rtnl_unlock();
}

static struct pernet_operations cfg80211_pernet_ops = {
	.exit = cfg80211_pernet_exit,
};

static int __init cfg80211_init(void)
813
{
814 815
	int err;

816 817 818 819
	err = register_pernet_device(&cfg80211_pernet_ops);
	if (err)
		goto out_fail_pernet;

820
	err = wiphy_sysfs_init();
821 822 823 824 825 826 827
	if (err)
		goto out_fail_sysfs;

	err = register_netdevice_notifier(&cfg80211_netdev_notifier);
	if (err)
		goto out_fail_notifier;

828 829 830 831
	err = nl80211_init();
	if (err)
		goto out_fail_nl80211;

832 833
	ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);

834 835 836 837
	err = regulatory_init();
	if (err)
		goto out_fail_reg;

838 839
	return 0;

840 841
out_fail_reg:
	debugfs_remove(ieee80211_debugfs_dir);
842 843
out_fail_nl80211:
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
844 845 846
out_fail_notifier:
	wiphy_sysfs_exit();
out_fail_sysfs:
847 848
	unregister_pernet_device(&cfg80211_pernet_ops);
out_fail_pernet:
849 850
	return err;
}
851
subsys_initcall(cfg80211_init);
852 853 854 855

static void cfg80211_exit(void)
{
	debugfs_remove(ieee80211_debugfs_dir);
856
	nl80211_exit();
857 858
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
	wiphy_sysfs_exit();
859
	regulatory_exit();
860
	unregister_pernet_device(&cfg80211_pernet_ops);
861 862
}
module_exit(cfg80211_exit);