core.c 23.0 KB
Newer Older
1 2 3
/*
 * This is the linux wireless configuration interface.
 *
J
Johannes Berg 已提交
4
 * Copyright 2006-2010		Johannes Berg <johannes@sipsolutions.net>
5 6 7 8 9 10
 */

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

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

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

J
Johannes Berg 已提交
35
/* RCU-protected (and cfg80211_mutex for writers) */
36
LIST_HEAD(cfg80211_rdev_list);
37
int cfg80211_rdev_list_generation;
38 39

DEFINE_MUTEX(cfg80211_mutex);
40 41 42 43

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

44 45 46
/* for the cleanup, scan and event works */
struct workqueue_struct *cfg80211_wq;

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
int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
			  struct net *net)
{
	struct wireless_dev *wdev;
	int err = 0;

J
Johannes Berg 已提交
233
	if (!(rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK))
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
		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;

J
Johannes Berg 已提交
370 371 372
#ifdef CONFIG_CFG80211_DEFAULT_PS
	rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
#endif
373

374 375
	wiphy_net_set(&rdev->wiphy, &init_net);

376 377 378 379 380 381 382
	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 已提交
383 384 385
		return NULL;
	}

386 387 388
	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 已提交
389

390 391
	init_waitqueue_head(&rdev->dev_wait);

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

403
	return &rdev->wiphy;
404 405 406 407 408
}
EXPORT_SYMBOL(wiphy_new);

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

417 418 419 420 421 422 423 424 425 426 427 428
	if (WARN_ON(wiphy->addresses && !wiphy->n_addresses))
		return -EINVAL;

	if (WARN_ON(wiphy->addresses &&
		    !is_zero_ether_addr(wiphy->perm_addr) &&
		    memcmp(wiphy->perm_addr, wiphy->addresses[0].addr,
			   ETH_ALEN)))
		return -EINVAL;

	if (wiphy->addresses)
		memcpy(wiphy->perm_addr, wiphy->addresses[0].addr, ETH_ALEN);

429 430 431 432 433
	/* 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;
434 435 436 437 438 439 440 441 442

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

		sband->band = band;

443 444 445 446 447 448 449 450 451
		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))
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474
			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);

475 476
	mutex_lock(&cfg80211_mutex);

477
	res = device_add(&rdev->wiphy.dev);
478
	if (res)
479
		goto out_unlock;
480

481
	res = rfkill_register(rdev->rfkill);
J
Johannes Berg 已提交
482 483 484
	if (res)
		goto out_rm_dev;

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

J
Johannes Berg 已提交
488
	list_add_rcu(&rdev->list, &cfg80211_rdev_list);
489
	cfg80211_rdev_list_generation++;
490 491

	/* add to debugfs */
492 493
	rdev->wiphy.debugfsdir =
		debugfs_create_dir(wiphy_name(&rdev->wiphy),
494
				   ieee80211_debugfs_dir);
495 496
	if (IS_ERR(rdev->wiphy.debugfsdir))
		rdev->wiphy.debugfsdir = NULL;
497

J
Johannes Berg 已提交
498
	if (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY) {
499 500 501 502 503 504 505 506 507 508
		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);
	}

509
	cfg80211_debugfs_rdev_add(rdev);
510
	mutex_unlock(&cfg80211_mutex);
511

512
	return 0;
J
Johannes Berg 已提交
513

514
out_rm_dev:
515
	device_del(&rdev->wiphy.dev);
516 517 518

out_unlock:
	mutex_unlock(&cfg80211_mutex);
519 520 521 522
	return res;
}
EXPORT_SYMBOL(wiphy_register);

J
Johannes Berg 已提交
523 524
void wiphy_rfkill_start_polling(struct wiphy *wiphy)
{
525
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
J
Johannes Berg 已提交
526

527
	if (!rdev->ops->rfkill_poll)
J
Johannes Berg 已提交
528
		return;
529 530
	rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
	rfkill_resume_polling(rdev->rfkill);
J
Johannes Berg 已提交
531 532 533 534 535
}
EXPORT_SYMBOL(wiphy_rfkill_start_polling);

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

538
	rfkill_pause_polling(rdev->rfkill);
J
Johannes Berg 已提交
539 540 541
}
EXPORT_SYMBOL(wiphy_rfkill_stop_polling);

542 543
void wiphy_unregister(struct wiphy *wiphy)
{
544
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
545

546
	rfkill_unregister(rdev->rfkill);
J
Johannes Berg 已提交
547

548
	/* protect the device list */
549
	mutex_lock(&cfg80211_mutex);
550

551 552 553 554 555 556 557 558
	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);
559
	BUG_ON(!list_empty(&rdev->netdev_list));
560 561 562 563 564 565
	mutex_unlock(&rdev->devlist_mtx);

	/*
	 * First remove the hardware from everywhere, this makes
	 * it impossible to find from userspace.
	 */
566
	debugfs_remove_recursive(rdev->wiphy.debugfsdir);
J
Johannes Berg 已提交
567 568
	list_del_rcu(&rdev->list);
	synchronize_rcu();
569 570

	/*
571
	 * Try to grab rdev->mtx. If a command is still in progress,
572 573 574 575
	 * 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
576 577 578
	 * 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.
579
	 */
J
Johannes Berg 已提交
580
	cfg80211_lock_rdev(rdev);
581
	/* nothing */
J
Johannes Berg 已提交
582
	cfg80211_unlock_rdev(rdev);
583

584 585 586 587
	/* 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);

588
	cfg80211_rdev_list_generation++;
589
	device_del(&rdev->wiphy.dev);
590

591
	mutex_unlock(&cfg80211_mutex);
J
Johannes Berg 已提交
592

593
	flush_work(&rdev->scan_done_wk);
J
Johannes Berg 已提交
594 595
	cancel_work_sync(&rdev->conn_work);
	flush_work(&rdev->event_work);
596 597 598
}
EXPORT_SYMBOL(wiphy_unregister);

599
void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
600
{
601
	struct cfg80211_internal_bss *scan, *tmp;
602 603 604 605
	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 已提交
606
		cfg80211_put_bss(&scan->pub);
607
	kfree(rdev);
608 609 610 611 612 613 614 615
}

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

J
Johannes Berg 已提交
616 617
void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
{
618
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
J
Johannes Berg 已提交
619

620 621
	if (rfkill_set_hw_state(rdev->rfkill, blocked))
		schedule_work(&rdev->rfkill_sync);
J
Johannes Berg 已提交
622 623 624
}
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state);

625 626 627 628 629 630 631 632 633 634 635 636
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;
637
		___cfg80211_scan_done(rdev, true);
638 639 640 641 642 643 644 645 646 647 648 649
	}

	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);
}

650 651 652 653
static struct device_type wiphy_type = {
	.name	= "wlan",
};

654 655 656 657 658
static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
					 unsigned long state,
					 void *ndev)
{
	struct net_device *dev = ndev;
659
	struct wireless_dev *wdev = dev->ieee80211_ptr;
660 661
	struct cfg80211_registered_device *rdev;

662
	if (!wdev)
J
Johannes Berg 已提交
663
		return NOTIFY_DONE;
664

665
	rdev = wiphy_to_dev(wdev->wiphy);
666

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

669
	switch (state) {
670 671 672
	case NETDEV_POST_INIT:
		SET_NETDEV_DEVTYPE(dev, &wiphy_type);
		break;
673
	case NETDEV_REGISTER:
J
Johannes Berg 已提交
674 675 676 677 678
		/*
		 * 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 已提交
679
		mutex_init(&wdev->mtx);
680
		INIT_WORK(&wdev->cleanup_work, wdev_cleanup_work);
J
Johannes Berg 已提交
681 682
		INIT_LIST_HEAD(&wdev->event_list);
		spin_lock_init(&wdev->event_lock);
683 684 685
		INIT_LIST_HEAD(&wdev->action_registrations);
		spin_lock_init(&wdev->action_registrations_lock);

686
		mutex_lock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
687
		list_add_rcu(&wdev->list, &rdev->netdev_list);
688
		rdev->devlist_generation++;
689 690 691
		/* can only change netns with wiphy */
		dev->features |= NETIF_F_NETNS_LOCAL;

692 693 694 695 696
		if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
				      "phy80211")) {
			printk(KERN_ERR "wireless: failed to add phy80211 "
				"symlink to netdev!\n");
		}
697
		wdev->netdev = dev;
S
Samuel Ortiz 已提交
698
		wdev->sme_state = CFG80211_SME_IDLE;
J
Johannes Berg 已提交
699
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
700
#ifdef CONFIG_CFG80211_WEXT
701 702
		wdev->wext.default_key = -1;
		wdev->wext.default_mgmt_key = -1;
703
		wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
K
Kalle Valo 已提交
704 705
#endif

J
Johannes Berg 已提交
706
		if (wdev->wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT)
K
Kalle Valo 已提交
707
			wdev->ps = true;
J
Johannes Berg 已提交
708
		else
K
Kalle Valo 已提交
709
			wdev->ps = false;
710 711
		/* allow mac80211 to determine the timeout */
		wdev->ps_timeout = -1;
J
Johannes Berg 已提交
712 713
		if (rdev->ops->set_power_mgmt)
			if (rdev->ops->set_power_mgmt(wdev->wiphy, dev,
K
Kalle Valo 已提交
714 715
						      wdev->ps,
						      wdev->ps_timeout)) {
J
Johannes Berg 已提交
716
				/* assume this means it's off */
K
Kalle Valo 已提交
717
				wdev->ps = false;
J
Johannes Berg 已提交
718
			}
K
Kalle Valo 已提交
719

720 721
		if (!dev->ethtool_ops)
			dev->ethtool_ops = &cfg80211_ethtool_ops;
722 723 724 725

		if ((wdev->iftype == NL80211_IFTYPE_STATION ||
		     wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr)
			dev->priv_flags |= IFF_DONT_BRIDGE;
726
		break;
J
Johannes Berg 已提交
727
	case NETDEV_GOING_DOWN:
S
Samuel Ortiz 已提交
728 729 730 731 732
		switch (wdev->iftype) {
		case NL80211_IFTYPE_ADHOC:
			cfg80211_leave_ibss(rdev, dev, true);
			break;
		case NL80211_IFTYPE_STATION:
J
Johannes Berg 已提交
733
			wdev_lock(wdev);
J
Johannes Berg 已提交
734
#ifdef CONFIG_CFG80211_WEXT
735 736 737
			kfree(wdev->wext.ie);
			wdev->wext.ie = NULL;
			wdev->wext.ie_len = 0;
J
Johannes Berg 已提交
738
			wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
739
#endif
J
Johannes Berg 已提交
740 741
			__cfg80211_disconnect(rdev, dev,
					      WLAN_REASON_DEAUTH_LEAVING, true);
J
Johannes Berg 已提交
742
			cfg80211_mlme_down(rdev, dev);
J
Johannes Berg 已提交
743
			wdev_unlock(wdev);
S
Samuel Ortiz 已提交
744 745 746 747
			break;
		default:
			break;
		}
748 749
		break;
	case NETDEV_DOWN:
750
		dev_hold(dev);
751
		queue_work(cfg80211_wq, &wdev->cleanup_work);
J
Johannes Berg 已提交
752 753
		break;
	case NETDEV_UP:
754 755 756 757 758 759 760 761 762 763 764 765
		/*
		 * 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 已提交
766
		cfg80211_lock_rdev(rdev);
767
		mutex_lock(&rdev->devlist_mtx);
768
#ifdef CONFIG_CFG80211_WEXT
J
Johannes Berg 已提交
769
		wdev_lock(wdev);
770 771
		switch (wdev->iftype) {
		case NL80211_IFTYPE_ADHOC:
J
Johannes Berg 已提交
772
			cfg80211_ibss_wext_join(rdev, wdev);
J
Johannes Berg 已提交
773
			break;
774
		case NL80211_IFTYPE_STATION:
J
Johannes Berg 已提交
775
			cfg80211_mgd_wext_connect(rdev, wdev);
776 777
			break;
		default:
J
Johannes Berg 已提交
778
			break;
779
		}
J
Johannes Berg 已提交
780
		wdev_unlock(wdev);
781
#endif
782
		rdev->opencount++;
783
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
784
		cfg80211_unlock_rdev(rdev);
785
		break;
786
	case NETDEV_UNREGISTER:
J
Johannes Berg 已提交
787 788 789 790 791
		/*
		 * NB: cannot take rdev->mtx here because this may be
		 * called within code protected by it when interfaces
		 * are removed with nl80211.
		 */
792
		mutex_lock(&rdev->devlist_mtx);
793 794 795 796 797 798 799
		/*
		 * 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.
		 */
800
		if (!list_empty(&wdev->list)) {
801
			sysfs_remove_link(&dev->dev.kobj, "phy80211");
J
Johannes Berg 已提交
802
			list_del_rcu(&wdev->list);
803
			rdev->devlist_generation++;
804
			cfg80211_mlme_purge_actions(wdev);
J
Johannes Berg 已提交
805
#ifdef CONFIG_CFG80211_WEXT
806
			kfree(wdev->wext.keys);
J
Johannes Berg 已提交
807
#endif
808 809
		}
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
810 811 812 813 814 815 816 817
		/*
		 * synchronise (so that we won't find this netdev
		 * from other code any more) and then clear the list
		 * head so that the above code can safely check for
		 * !list_empty() to avoid double-cleanup.
		 */
		synchronize_rcu();
		INIT_LIST_HEAD(&wdev->list);
818
		break;
J
Johannes Berg 已提交
819
	case NETDEV_PRE_UP:
820 821
		if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
			return notifier_from_errno(-EOPNOTSUPP);
J
Johannes Berg 已提交
822 823 824
		if (rfkill_blocked(rdev->rfkill))
			return notifier_from_errno(-ERFKILL);
		break;
825 826
	}

J
Johannes Berg 已提交
827
	return NOTIFY_DONE;
828 829 830 831 832 833
}

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

834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852
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)
853
{
854 855
	int err;

856 857 858 859
	err = register_pernet_device(&cfg80211_pernet_ops);
	if (err)
		goto out_fail_pernet;

860
	err = wiphy_sysfs_init();
861 862 863 864 865 866 867
	if (err)
		goto out_fail_sysfs;

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

868 869 870 871
	err = nl80211_init();
	if (err)
		goto out_fail_nl80211;

872 873
	ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);

874 875 876 877
	err = regulatory_init();
	if (err)
		goto out_fail_reg;

878 879 880 881
	cfg80211_wq = create_singlethread_workqueue("cfg80211");
	if (!cfg80211_wq)
		goto out_fail_wq;

882 883
	return 0;

884 885
out_fail_wq:
	regulatory_exit();
886 887
out_fail_reg:
	debugfs_remove(ieee80211_debugfs_dir);
888 889
out_fail_nl80211:
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
890 891 892
out_fail_notifier:
	wiphy_sysfs_exit();
out_fail_sysfs:
893 894
	unregister_pernet_device(&cfg80211_pernet_ops);
out_fail_pernet:
895 896
	return err;
}
897
subsys_initcall(cfg80211_init);
898

899
static void __exit cfg80211_exit(void)
900 901
{
	debugfs_remove(ieee80211_debugfs_dir);
902
	nl80211_exit();
903 904
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
	wiphy_sysfs_exit();
905
	regulatory_exit();
906
	unregister_pernet_device(&cfg80211_pernet_ops);
907
	destroy_workqueue(cfg80211_wq);
908 909
}
module_exit(cfg80211_exit);
910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958

static int ___wiphy_printk(const char *level, const struct wiphy *wiphy,
			   struct va_format *vaf)
{
	if (!wiphy)
		return printk("%s(NULL wiphy *): %pV", level, vaf);

	return printk("%s%s: %pV", level, wiphy_name(wiphy), vaf);
}

int __wiphy_printk(const char *level, const struct wiphy *wiphy,
		   const char *fmt, ...)
{
	struct va_format vaf;
	va_list args;
	int r;

	va_start(args, fmt);

	vaf.fmt = fmt;
	vaf.va = &args;

	r = ___wiphy_printk(level, wiphy, &vaf);
	va_end(args);

	return r;
}
EXPORT_SYMBOL(__wiphy_printk);

#define define_wiphy_printk_level(func, kern_level)		\
int func(const struct wiphy *wiphy, const char *fmt, ...)	\
{								\
	struct va_format vaf;					\
	va_list args;						\
	int r;							\
								\
	va_start(args, fmt);					\
								\
	vaf.fmt = fmt;						\
	vaf.va = &args;						\
								\
	r = ___wiphy_printk(kern_level, wiphy, &vaf);		\
	va_end(args);						\
								\
	return r;						\
}								\
EXPORT_SYMBOL(func);

define_wiphy_printk_level(wiphy_debug, KERN_DEBUG);