core.c 32.4 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
 * Copyright 2013-2014  Intel Mobile Communications GmbH
6
 * Copyright 2015	Intel Deutschland GmbH
7 8
 */

9 10
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

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

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

MODULE_AUTHOR("Johannes Berg");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("wireless configuration support");
38
MODULE_ALIAS_GENL_FAMILY(NL80211_GENL_NAME);
39

40
/* RCU-protected (and RTNL for writers) */
41
LIST_HEAD(cfg80211_rdev_list);
42
int cfg80211_rdev_list_generation;
43

44 45 46
/* for debugfs */
static struct dentry *ieee80211_debugfs_dir;

47 48 49
/* for the cleanup, scan and event works */
struct workqueue_struct *cfg80211_wq;

50 51 52 53 54
static bool cfg80211_disable_40mhz_24ghz;
module_param(cfg80211_disable_40mhz_24ghz, bool, 0644);
MODULE_PARM_DESC(cfg80211_disable_40mhz_24ghz,
		 "Disable 40MHz support in the 2.4GHz band");

55
struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx)
56
{
57
	struct cfg80211_registered_device *result = NULL, *rdev;
58

59
	ASSERT_RTNL();
60

61 62 63
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		if (rdev->wiphy_idx == wiphy_idx) {
			result = rdev;
64 65 66 67 68 69 70
			break;
		}
	}

	return result;
}

71 72
int get_wiphy_idx(struct wiphy *wiphy)
{
73
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
J
Johannes Berg 已提交
74

75
	return rdev->wiphy_idx;
76 77 78 79
}

struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx)
{
80
	struct cfg80211_registered_device *rdev;
81

82
	ASSERT_RTNL();
83

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

90 91
static int cfg80211_dev_check_name(struct cfg80211_registered_device *rdev,
				   const char *newname)
92
{
93
	struct cfg80211_registered_device *rdev2;
94
	int wiphy_idx, taken = -1, digits;
95

96
	ASSERT_RTNL();
97

98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
	/* prohibit calling the thing phy%d when %d is not its number */
	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 */
		digits = 1;
		while (wiphy_idx /= 10)
			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)
			return -EINVAL;
	}

113 114 115 116 117 118 119 120 121 122 123 124 125 126
	/* Ensure another device does not already have this name. */
	list_for_each_entry(rdev2, &cfg80211_rdev_list, list)
		if (strcmp(newname, wiphy_name(&rdev2->wiphy)) == 0)
			return -EINVAL;

	return 0;
}

int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
			char *newname)
{
	int result;

	ASSERT_RTNL();
127

128
	/* Ignore nop renames */
129
	if (strcmp(newname, wiphy_name(&rdev->wiphy)) == 0)
130
		return 0;
131

132 133 134
	result = cfg80211_dev_check_name(rdev, newname);
	if (result < 0)
		return result;
135 136 137

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

140 141
	if (rdev->wiphy.debugfsdir &&
	    !debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
142 143 144
			    rdev->wiphy.debugfsdir,
			    rdev->wiphy.debugfsdir->d_parent,
			    newname))
145
		pr_err("failed to rename debugfs dir to %s!\n", newname);
146

147
	nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);
148

149
	return 0;
150 151
}

152 153 154 155 156 157
int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
			  struct net *net)
{
	struct wireless_dev *wdev;
	int err = 0;

J
Johannes Berg 已提交
158
	if (!(rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK))
159 160
		return -EOPNOTSUPP;

161
	list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
162 163
		if (!wdev->netdev)
			continue;
164 165 166 167 168 169 170 171 172 173 174
		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);

175 176
		list_for_each_entry_continue_reverse(wdev,
						     &rdev->wiphy.wdev_list,
177
						     list) {
178 179
			if (!wdev->netdev)
				continue;
180 181 182 183 184 185
			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;
		}
186 187

		return err;
188 189 190 191
	}

	wiphy_net_set(&rdev->wiphy, net);

192 193 194 195
	err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
	WARN_ON(err);

	return 0;
196 197
}

J
Johannes Berg 已提交
198 199
static void cfg80211_rfkill_poll(struct rfkill *rfkill, void *data)
{
200
	struct cfg80211_registered_device *rdev = data;
J
Johannes Berg 已提交
201

202
	rdev_rfkill_poll(rdev);
J
Johannes Berg 已提交
203 204
}

205 206 207
void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev,
			      struct wireless_dev *wdev)
{
208
	ASSERT_RTNL();
209 210 211 212 213 214 215 216 217 218 219 220

	if (WARN_ON(wdev->iftype != NL80211_IFTYPE_P2P_DEVICE))
		return;

	if (!wdev->p2p_started)
		return;

	rdev_stop_p2p_device(rdev, wdev);
	wdev->p2p_started = false;

	rdev->opencount--;

J
Johannes Berg 已提交
221 222
	if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
		if (WARN_ON(!rdev->scan_req->notified))
223
			rdev->scan_req->info.aborted = true;
224
		___cfg80211_scan_done(rdev, false);
J
Johannes Berg 已提交
225
	}
226 227
}

228
void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy)
J
Johannes Berg 已提交
229
{
230
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
J
Johannes Berg 已提交
231 232
	struct wireless_dev *wdev;

233
	ASSERT_RTNL();
234

235
	list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
236
		if (wdev->netdev) {
237
			dev_close(wdev->netdev);
238 239 240 241 242
			continue;
		}
		/* otherwise, check iftype */
		switch (wdev->iftype) {
		case NL80211_IFTYPE_P2P_DEVICE:
243
			cfg80211_stop_p2p_device(rdev, wdev);
244 245 246 247 248
			break;
		default:
			break;
		}
	}
249 250
}
EXPORT_SYMBOL_GPL(cfg80211_shutdown_all_interfaces);
J
Johannes Berg 已提交
251

252 253 254 255 256 257 258 259 260
static int cfg80211_rfkill_set_block(void *data, bool blocked)
{
	struct cfg80211_registered_device *rdev = data;

	if (!blocked)
		return 0;

	rtnl_lock();
	cfg80211_shutdown_all_interfaces(&rdev->wiphy);
J
Johannes Berg 已提交
261 262 263 264 265 266 267
	rtnl_unlock();

	return 0;
}

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

270 271
	rdev = container_of(work, struct cfg80211_registered_device, rfkill_sync);
	cfg80211_rfkill_set_block(rdev, rfkill_blocked(rdev->rfkill));
J
Johannes Berg 已提交
272 273
}

J
Johannes Berg 已提交
274 275 276 277 278 279 280 281
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();
282
	cfg80211_process_rdev_events(rdev);
J
Johannes Berg 已提交
283 284 285
	rtnl_unlock();
}

286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302
void cfg80211_destroy_ifaces(struct cfg80211_registered_device *rdev)
{
	struct cfg80211_iface_destroy *item;

	ASSERT_RTNL();

	spin_lock_irq(&rdev->destroy_list_lock);
	while ((item = list_first_entry_or_null(&rdev->destroy_list,
						struct cfg80211_iface_destroy,
						list))) {
		struct wireless_dev *wdev, *tmp;
		u32 nlportid = item->nlportid;

		list_del(&item->list);
		kfree(item);
		spin_unlock_irq(&rdev->destroy_list_lock);

303 304
		list_for_each_entry_safe(wdev, tmp,
					 &rdev->wiphy.wdev_list, list) {
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
			if (nlportid == wdev->owner_nlportid)
				rdev_del_virtual_intf(rdev, wdev);
		}

		spin_lock_irq(&rdev->destroy_list_lock);
	}
	spin_unlock_irq(&rdev->destroy_list_lock);
}

static void cfg80211_destroy_iface_wk(struct work_struct *work)
{
	struct cfg80211_registered_device *rdev;

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

	rtnl_lock();
	cfg80211_destroy_ifaces(rdev);
	rtnl_unlock();
}

326 327 328 329 330 331 332 333 334 335 336 337 338 339
static void cfg80211_sched_scan_stop_wk(struct work_struct *work)
{
	struct cfg80211_registered_device *rdev;

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

	rtnl_lock();

	__cfg80211_stop_sched_scan(rdev, false);

	rtnl_unlock();
}

340 341
/* exported functions */

342 343
struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
			   const char *requested_name)
344
{
345
	static atomic_t wiphy_counter = ATOMIC_INIT(0);
346 347

	struct cfg80211_registered_device *rdev;
348 349
	int alloc_size;

350 351 352 353 354 355 356
	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);
357
	WARN_ON(ops->join_mesh && !ops->leave_mesh);
358 359 360 361 362 363 364 365
	WARN_ON(ops->start_p2p_device && !ops->stop_p2p_device);
	WARN_ON(ops->start_ap && !ops->stop_ap);
	WARN_ON(ops->join_ocb && !ops->leave_ocb);
	WARN_ON(ops->suspend && !ops->resume);
	WARN_ON(ops->sched_scan_start && !ops->sched_scan_stop);
	WARN_ON(ops->remain_on_channel && !ops->cancel_remain_on_channel);
	WARN_ON(ops->tdls_channel_switch && !ops->tdls_cancel_channel_switch);
	WARN_ON(ops->add_tx_ts && !ops->del_tx_ts);
366

367
	alloc_size = sizeof(*rdev) + sizeof_priv;
368

369 370
	rdev = kzalloc(alloc_size, GFP_KERNEL);
	if (!rdev)
371 372
		return NULL;

373
	rdev->ops = ops;
374

375
	rdev->wiphy_idx = atomic_inc_return(&wiphy_counter);
376

J
Johannes Berg 已提交
377
	if (unlikely(rdev->wiphy_idx < 0)) {
378
		/* ugh, wrapped! */
379
		atomic_dec(&wiphy_counter);
380
		kfree(rdev);
381 382 383
		return NULL;
	}

384 385 386
	/* atomic_inc_return makes it start at 1, make it start at 0 */
	rdev->wiphy_idx--;

387
	/* give it a proper name */
388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
	if (requested_name && requested_name[0]) {
		int rv;

		rtnl_lock();
		rv = cfg80211_dev_check_name(rdev, requested_name);

		if (rv < 0) {
			rtnl_unlock();
			goto use_default_name;
		}

		rv = dev_set_name(&rdev->wiphy.dev, "%s", requested_name);
		rtnl_unlock();
		if (rv)
			goto use_default_name;
	} else {
use_default_name:
		/* NOTE:  This is *probably* safe w/out holding rtnl because of
		 * the restrictions on phy names.  Probably this call could
		 * fail if some other part of the kernel (re)named a device
		 * phyX.  But, might should add some locking and check return
		 * value, and use a different name if this one exists?
		 */
		dev_set_name(&rdev->wiphy.dev, PHY_NAME "%d", rdev->wiphy_idx);
	}
413

414
	INIT_LIST_HEAD(&rdev->wiphy.wdev_list);
415 416
	INIT_LIST_HEAD(&rdev->beacon_registrations);
	spin_lock_init(&rdev->beacon_registrations_lock);
417 418 419
	spin_lock_init(&rdev->bss_lock);
	INIT_LIST_HEAD(&rdev->bss_list);
	INIT_WORK(&rdev->scan_done_wk, __cfg80211_scan_done);
420
	INIT_WORK(&rdev->sched_scan_results_wk, __cfg80211_sched_scan_results);
421 422 423
	INIT_LIST_HEAD(&rdev->mlme_unreg);
	spin_lock_init(&rdev->mlme_unreg_lock);
	INIT_WORK(&rdev->mlme_unreg_wk, cfg80211_mlme_unreg_wk);
424 425
	INIT_DELAYED_WORK(&rdev->dfs_update_channels_wk,
			  cfg80211_dfs_channels_update_work);
J
Johannes Berg 已提交
426 427 428 429
#ifdef CONFIG_CFG80211_WEXT
	rdev->wiphy.wext = &cfg80211_wext_handler;
#endif

430 431 432
	device_initialize(&rdev->wiphy.dev);
	rdev->wiphy.dev.class = &ieee80211_class;
	rdev->wiphy.dev.platform_data = rdev;
433
	device_enable_async_suspend(&rdev->wiphy.dev);
434

435 436 437
	INIT_LIST_HEAD(&rdev->destroy_list);
	spin_lock_init(&rdev->destroy_list_lock);
	INIT_WORK(&rdev->destroy_work, cfg80211_destroy_iface_wk);
438
	INIT_WORK(&rdev->sched_scan_stop_wk, cfg80211_sched_scan_stop_wk);
439

J
Johannes Berg 已提交
440 441 442
#ifdef CONFIG_CFG80211_DEFAULT_PS
	rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
#endif
443

444 445
	wiphy_net_set(&rdev->wiphy, &init_net);

446 447 448 449 450 451 452
	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 已提交
453 454 455
		return NULL;
	}

456 457 458
	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 已提交
459

460 461
	init_waitqueue_head(&rdev->dev_wait);

462 463 464 465 466
	/*
	 * Initialize wiphy parameters to IEEE 802.11 MIB default values.
	 * Fragmentation and RTS threshold are disabled by default with the
	 * special -1 value.
	 */
467 468 469 470
	rdev->wiphy.retry_short = 7;
	rdev->wiphy.retry_long = 4;
	rdev->wiphy.frag_threshold = (u32) -1;
	rdev->wiphy.rts_threshold = (u32) -1;
471
	rdev->wiphy.coverage_class = 0;
472

473 474
	rdev->wiphy.max_num_csa_counters = 1;

475 476 477
	rdev->wiphy.max_sched_scan_plans = 1;
	rdev->wiphy.max_sched_scan_plan_interval = U32_MAX;

478
	return &rdev->wiphy;
479
}
480
EXPORT_SYMBOL(wiphy_new_nm);
481

482 483 484 485 486 487 488 489 490 491 492
static int wiphy_verify_combinations(struct wiphy *wiphy)
{
	const struct ieee80211_iface_combination *c;
	int i, j;

	for (i = 0; i < wiphy->n_iface_combinations; i++) {
		u32 cnt = 0;
		u16 all_iftypes = 0;

		c = &wiphy->iface_combinations[i];

493 494 495 496 497
		/*
		 * Combinations with just one interface aren't real,
		 * however we make an exception for DFS.
		 */
		if (WARN_ON((c->max_interfaces < 2) && !c->radar_detect_widths))
498 499 500 501 502 503
			return -EINVAL;

		/* Need at least one channel */
		if (WARN_ON(!c->num_different_channels))
			return -EINVAL;

504 505 506 507 508 509 510 511
		/*
		 * Put a sane limit on maximum number of different
		 * channels to simplify channel accounting code.
		 */
		if (WARN_ON(c->num_different_channels >
				CFG80211_MAX_NUM_DIFFERENT_CHANNELS))
			return -EINVAL;

512 513 514 515 516
		/* DFS only works on one channel. */
		if (WARN_ON(c->radar_detect_widths &&
			    (c->num_different_channels > 1)))
			return -EINVAL;

517 518 519 520 521 522
		if (WARN_ON(!c->n_limits))
			return -EINVAL;

		for (j = 0; j < c->n_limits; j++) {
			u16 types = c->limits[j].types;

523
			/* interface types shouldn't overlap */
524 525 526 527 528 529 530 531 532 533 534
			if (WARN_ON(types & all_iftypes))
				return -EINVAL;
			all_iftypes |= types;

			if (WARN_ON(!c->limits[j].max))
				return -EINVAL;

			/* Shouldn't list software iftypes in combinations! */
			if (WARN_ON(wiphy->software_iftypes & types))
				return -EINVAL;

535 536 537 538 539
			/* Only a single P2P_DEVICE can be allowed */
			if (WARN_ON(types & BIT(NL80211_IFTYPE_P2P_DEVICE) &&
				    c->limits[j].max > 1))
				return -EINVAL;

540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
			cnt += c->limits[j].max;
			/*
			 * Don't advertise an unsupported type
			 * in a combination.
			 */
			if (WARN_ON((wiphy->interface_modes & types) != types))
				return -EINVAL;
		}

		/* You can't even choose that many! */
		if (WARN_ON(cnt < c->max_interfaces))
			return -EINVAL;
	}

	return 0;
}

557 558
int wiphy_register(struct wiphy *wiphy)
{
559
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
560
	int res;
561
	enum nl80211_band band;
562 563 564
	struct ieee80211_supported_band *sband;
	bool have_band = false;
	int i;
565 566
	u16 ifmodes = wiphy->interface_modes;

567
#ifdef CONFIG_PM
568 569 570 571 572 573 574
	if (WARN_ON(wiphy->wowlan &&
		    (wiphy->wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
		    !(wiphy->wowlan->flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY)))
		return -EINVAL;
	if (WARN_ON(wiphy->wowlan &&
		    !wiphy->wowlan->flags && !wiphy->wowlan->n_patterns &&
		    !wiphy->wowlan->tcp))
575
		return -EINVAL;
576
#endif
577 578 579 580
	if (WARN_ON((wiphy->features & NL80211_FEATURE_TDLS_CHANNEL_SWITCH) &&
		    (!rdev->ops->tdls_channel_switch ||
		     !rdev->ops->tdls_cancel_channel_switch)))
		return -EINVAL;
581

582 583 584 585 586 587 588 589 590 591 592 593 594 595
	/*
	 * if a wiphy has unsupported modes for regulatory channel enforcement,
	 * opt-out of enforcement checking
	 */
	if (wiphy->interface_modes & ~(BIT(NL80211_IFTYPE_STATION) |
				       BIT(NL80211_IFTYPE_P2P_CLIENT) |
				       BIT(NL80211_IFTYPE_AP) |
				       BIT(NL80211_IFTYPE_P2P_GO) |
				       BIT(NL80211_IFTYPE_ADHOC) |
				       BIT(NL80211_IFTYPE_P2P_DEVICE) |
				       BIT(NL80211_IFTYPE_AP_VLAN) |
				       BIT(NL80211_IFTYPE_MONITOR)))
		wiphy->regulatory_flags |= REGULATORY_IGNORE_STALE_KICKOFF;

596 597 598 599 600 601 602 603
	if (WARN_ON((wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) &&
		    (wiphy->regulatory_flags &
					(REGULATORY_CUSTOM_REG |
					 REGULATORY_STRICT_REG |
					 REGULATORY_COUNTRY_IE_FOLLOW_POWER |
					 REGULATORY_COUNTRY_IE_IGNORE))))
		return -EINVAL;

604 605 606 607 608 609 610 611
	if (WARN_ON(wiphy->coalesce &&
		    (!wiphy->coalesce->n_rules ||
		     !wiphy->coalesce->n_patterns) &&
		    (!wiphy->coalesce->pattern_min_len ||
		     wiphy->coalesce->pattern_min_len >
			wiphy->coalesce->pattern_max_len)))
		return -EINVAL;

J
Johannes Berg 已提交
612 613 614 615
	if (WARN_ON(wiphy->ap_sme_capa &&
		    !(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME)))
		return -EINVAL;

616 617 618 619 620 621 622 623 624
	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;

625 626 627 628 629
	if (WARN_ON(wiphy->max_acl_mac_addrs &&
		    (!(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME) ||
		     !rdev->ops->set_mac_acl)))
		return -EINVAL;

630 631 632 633 634 635 636
	/* assure only valid behaviours are flagged by driver
	 * hence subtract 2 as bit 0 is invalid.
	 */
	if (WARN_ON(wiphy->bss_select_support &&
		    (wiphy->bss_select_support & ~(BIT(__NL80211_BSS_SELECT_ATTR_AFTER_LAST) - 2))))
		return -EINVAL;

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

640 641
	/* sanity check ifmodes */
	WARN_ON(!ifmodes);
642
	ifmodes &= ((1 << NUM_NL80211_IFTYPES) - 1) & ~1;
643 644
	if (WARN_ON(ifmodes != wiphy->interface_modes))
		wiphy->interface_modes = ifmodes;
645

646 647 648 649
	res = wiphy_verify_combinations(wiphy);
	if (res)
		return res;

650
	/* sanity check supported bands/channels */
651
	for (band = 0; band < NUM_NL80211_BANDS; band++) {
652 653 654 655 656
		sband = wiphy->bands[band];
		if (!sband)
			continue;

		sband->band = band;
657 658 659
		if (WARN_ON(!sband->n_channels))
			return -EINVAL;
		/*
J
Johannes Berg 已提交
660
		 * on 60GHz band, there are no legacy rates, so
661 662
		 * n_bitrates is 0
		 */
663
		if (WARN_ON(band != NL80211_BAND_60GHZ &&
664
			    !sband->n_bitrates))
665 666
			return -EINVAL;

667 668 669 670 671 672
		/*
		 * Since cfg80211_disable_40mhz_24ghz is global, we can
		 * modify the sband's ht data even if the driver uses a
		 * global structure for that.
		 */
		if (cfg80211_disable_40mhz_24ghz &&
673
		    band == NL80211_BAND_2GHZ &&
674 675 676 677 678
		    sband->ht_cap.ht_supported) {
			sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
			sband->ht_cap.cap &= ~IEEE80211_HT_CAP_SGI_40;
		}

679 680 681 682 683 684
		/*
		 * 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))
685 686 687 688 689
			return -EINVAL;

		for (i = 0; i < sband->n_channels; i++) {
			sband->channels[i].orig_flags =
				sband->channels[i].flags;
690
			sband->channels[i].orig_mag = INT_MAX;
691 692 693 694 695 696 697 698 699 700 701 702 703
			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;
	}

704
#ifdef CONFIG_PM
705 706 707 708 709
	if (WARN_ON(rdev->wiphy.wowlan && rdev->wiphy.wowlan->n_patterns &&
		    (!rdev->wiphy.wowlan->pattern_min_len ||
		     rdev->wiphy.wowlan->pattern_min_len >
				rdev->wiphy.wowlan->pattern_max_len)))
		return -EINVAL;
710
#endif
J
Johannes Berg 已提交
711

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

715 716
	rdev->wiphy.features |= NL80211_FEATURE_SCAN_FLUSH;

717
	rtnl_lock();
718
	res = device_add(&rdev->wiphy.dev);
719
	if (res) {
720
		rtnl_unlock();
721 722
		return res;
	}
J
Johannes Berg 已提交
723

724
	/* set up regulatory info */
725
	wiphy_regulatory_register(wiphy);
726

J
Johannes Berg 已提交
727
	list_add_rcu(&rdev->list, &cfg80211_rdev_list);
728
	cfg80211_rdev_list_generation++;
729 730

	/* add to debugfs */
731 732
	rdev->wiphy.debugfsdir =
		debugfs_create_dir(wiphy_name(&rdev->wiphy),
733
				   ieee80211_debugfs_dir);
734 735
	if (IS_ERR(rdev->wiphy.debugfsdir))
		rdev->wiphy.debugfsdir = NULL;
736

737 738 739
	cfg80211_debugfs_rdev_add(rdev);
	nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);

740
	if (wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
741 742 743 744 745 746 747 748 749 750
		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);
	}

751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
	/* Check that nobody globally advertises any capabilities they do not
	 * advertise on all possible interface types.
	 */
	if (wiphy->extended_capabilities_len &&
	    wiphy->num_iftype_ext_capab &&
	    wiphy->iftype_ext_capab) {
		u8 supported_on_all, j;
		const struct wiphy_iftype_ext_capab *capab;

		capab = wiphy->iftype_ext_capab;
		for (j = 0; j < wiphy->extended_capabilities_len; j++) {
			if (capab[0].extended_capabilities_len > j)
				supported_on_all =
					capab[0].extended_capabilities[j];
			else
				supported_on_all = 0x00;
			for (i = 1; i < wiphy->num_iftype_ext_capab; i++) {
				if (j >= capab[i].extended_capabilities_len) {
					supported_on_all = 0x00;
					break;
				}
				supported_on_all &=
					capab[i].extended_capabilities[j];
			}
			if (WARN_ON(wiphy->extended_capabilities[j] &
				    ~supported_on_all))
				break;
		}
	}

781 782
	rdev->wiphy.registered = true;
	rtnl_unlock();
783 784 785 786 787 788 789 790 791

	res = rfkill_register(rdev->rfkill);
	if (res) {
		rfkill_destroy(rdev->rfkill);
		rdev->rfkill = NULL;
		wiphy_unregister(&rdev->wiphy);
		return res;
	}

792
	return 0;
793 794 795
}
EXPORT_SYMBOL(wiphy_register);

J
Johannes Berg 已提交
796 797
void wiphy_rfkill_start_polling(struct wiphy *wiphy)
{
798
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
J
Johannes Berg 已提交
799

800
	if (!rdev->ops->rfkill_poll)
J
Johannes Berg 已提交
801
		return;
802 803
	rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
	rfkill_resume_polling(rdev->rfkill);
J
Johannes Berg 已提交
804 805 806 807 808
}
EXPORT_SYMBOL(wiphy_rfkill_start_polling);

void wiphy_rfkill_stop_polling(struct wiphy *wiphy)
{
809
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
J
Johannes Berg 已提交
810

811
	rfkill_pause_polling(rdev->rfkill);
J
Johannes Berg 已提交
812 813 814
}
EXPORT_SYMBOL(wiphy_rfkill_stop_polling);

815 816
void wiphy_unregister(struct wiphy *wiphy)
{
817
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
818

819 820
	wait_event(rdev->dev_wait, ({
		int __count;
821
		rtnl_lock();
822
		__count = rdev->opencount;
823
		rtnl_unlock();
824
		__count == 0; }));
825

826 827
	if (rdev->rfkill)
		rfkill_unregister(rdev->rfkill);
828

829
	rtnl_lock();
830
	nl80211_notify_wiphy(rdev, NL80211_CMD_DEL_WIPHY);
831 832
	rdev->wiphy.registered = false;

833
	WARN_ON(!list_empty(&rdev->wiphy.wdev_list));
834 835 836 837 838

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

843 844 845 846 847
	/*
	 * If this device got a regulatory hint tell core its
	 * free to listen now to a new shiny device regulatory hint
	 */
	wiphy_regulatory_deregister(wiphy);
848

849
	cfg80211_rdev_list_generation++;
850
	device_del(&rdev->wiphy.dev);
851

852
	rtnl_unlock();
J
Johannes Berg 已提交
853

854
	flush_work(&rdev->scan_done_wk);
J
Johannes Berg 已提交
855 856
	cancel_work_sync(&rdev->conn_work);
	flush_work(&rdev->event_work);
857
	cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
858
	flush_work(&rdev->destroy_work);
859
	flush_work(&rdev->sched_scan_stop_wk);
860
	flush_work(&rdev->mlme_unreg_wk);
861

862 863
#ifdef CONFIG_PM
	if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup)
864
		rdev_set_wakeup(rdev, false);
865
#endif
866
	cfg80211_rdev_free_wowlan(rdev);
867
	cfg80211_rdev_free_coalesce(rdev);
868 869 870
}
EXPORT_SYMBOL(wiphy_unregister);

871
void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
872
{
873
	struct cfg80211_internal_bss *scan, *tmp;
874
	struct cfg80211_beacon_registration *reg, *treg;
875
	rfkill_destroy(rdev->rfkill);
876 877 878 879
	list_for_each_entry_safe(reg, treg, &rdev->beacon_registrations, list) {
		list_del(&reg->list);
		kfree(reg);
	}
880
	list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
881
		cfg80211_put_bss(&rdev->wiphy, &scan->pub);
882
	kfree(rdev);
883 884 885 886 887 888 889 890
}

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

J
Johannes Berg 已提交
891 892
void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
{
893
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
J
Johannes Berg 已提交
894

895 896
	if (rfkill_set_hw_state(rdev->rfkill, blocked))
		schedule_work(&rdev->rfkill_sync);
J
Johannes Berg 已提交
897 898 899
}
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state);

900 901
void cfg80211_unregister_wdev(struct wireless_dev *wdev)
{
902
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
903 904 905 906 907 908

	ASSERT_RTNL();

	if (WARN_ON(wdev->netdev))
		return;

909 910
	nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE);

911 912 913 914 915
	list_del_rcu(&wdev->list);
	rdev->devlist_generation++;

	switch (wdev->iftype) {
	case NL80211_IFTYPE_P2P_DEVICE:
916
		cfg80211_mlme_purge_registrations(wdev);
917
		cfg80211_stop_p2p_device(rdev, wdev);
918 919 920 921 922 923 924 925
		break;
	default:
		WARN_ON_ONCE(1);
		break;
	}
}
EXPORT_SYMBOL(cfg80211_unregister_wdev);

J
Johannes Berg 已提交
926
static const struct device_type wiphy_type = {
927 928 929
	.name	= "wlan",
};

930 931 932
void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
			       enum nl80211_iftype iftype, int num)
{
933
	ASSERT_RTNL();
934 935 936 937 938 939

	rdev->num_running_ifaces += num;
	if (iftype == NL80211_IFTYPE_MONITOR)
		rdev->num_running_monitor_ifaces += num;
}

940 941
void __cfg80211_leave(struct cfg80211_registered_device *rdev,
		      struct wireless_dev *wdev)
942 943
{
	struct net_device *dev = wdev->netdev;
944
	struct cfg80211_sched_scan_request *sched_scan_req;
945

946
	ASSERT_RTNL();
947
	ASSERT_WDEV_LOCK(wdev);
948

949 950
	switch (wdev->iftype) {
	case NL80211_IFTYPE_ADHOC:
951
		__cfg80211_leave_ibss(rdev, dev, true);
952 953 954
		break;
	case NL80211_IFTYPE_P2P_CLIENT:
	case NL80211_IFTYPE_STATION:
955 956
		sched_scan_req = rtnl_dereference(rdev->sched_scan_req);
		if (sched_scan_req && dev == sched_scan_req->dev)
957
			__cfg80211_stop_sched_scan(rdev, false);
958 959 960 961 962 963 964

#ifdef CONFIG_CFG80211_WEXT
		kfree(wdev->wext.ie);
		wdev->wext.ie = NULL;
		wdev->wext.ie_len = 0;
		wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
#endif
965 966
		cfg80211_disconnect(rdev, dev,
				    WLAN_REASON_DEAUTH_LEAVING, true);
967 968
		break;
	case NL80211_IFTYPE_MESH_POINT:
969
		__cfg80211_leave_mesh(rdev, dev);
970 971
		break;
	case NL80211_IFTYPE_AP:
972
	case NL80211_IFTYPE_P2P_GO:
973
		__cfg80211_stop_ap(rdev, dev, true);
974
		break;
975 976 977
	case NL80211_IFTYPE_OCB:
		__cfg80211_leave_ocb(rdev, dev);
		break;
978 979 980 981 982 983 984 985 986 987 988 989 990
	case NL80211_IFTYPE_WDS:
		/* must be handled by mac80211/driver, has no APIs */
		break;
	case NL80211_IFTYPE_P2P_DEVICE:
		/* cannot happen, has no netdev */
		break;
	case NL80211_IFTYPE_AP_VLAN:
	case NL80211_IFTYPE_MONITOR:
		/* nothing to do */
		break;
	case NL80211_IFTYPE_UNSPECIFIED:
	case NUM_NL80211_IFTYPES:
		/* invalid */
991 992 993 994
		break;
	}
}

995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
void cfg80211_leave(struct cfg80211_registered_device *rdev,
		    struct wireless_dev *wdev)
{
	wdev_lock(wdev);
	__cfg80211_leave(rdev, wdev);
	wdev_unlock(wdev);
}

void cfg80211_stop_iface(struct wiphy *wiphy, struct wireless_dev *wdev,
			 gfp_t gfp)
{
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
	struct cfg80211_event *ev;
	unsigned long flags;

	trace_cfg80211_stop_iface(wiphy, wdev);

	ev = kzalloc(sizeof(*ev), gfp);
	if (!ev)
		return;

	ev->type = EVENT_STOPPED;

	spin_lock_irqsave(&wdev->event_lock, flags);
	list_add_tail(&ev->list, &wdev->event_list);
	spin_unlock_irqrestore(&wdev->event_lock, flags);
	queue_work(cfg80211_wq, &rdev->event_work);
}
EXPORT_SYMBOL(cfg80211_stop_iface);

1025
static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
1026
					 unsigned long state, void *ptr)
1027
{
1028
	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1029
	struct wireless_dev *wdev = dev->ieee80211_ptr;
1030
	struct cfg80211_registered_device *rdev;
1031
	struct cfg80211_sched_scan_request *sched_scan_req;
1032

1033
	if (!wdev)
J
Johannes Berg 已提交
1034
		return NOTIFY_DONE;
1035

1036
	rdev = wiphy_to_rdev(wdev->wiphy);
1037

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

1040
	switch (state) {
1041 1042 1043
	case NETDEV_POST_INIT:
		SET_NETDEV_DEVTYPE(dev, &wiphy_type);
		break;
1044
	case NETDEV_REGISTER:
J
Johannes Berg 已提交
1045 1046 1047 1048 1049
		/*
		 * 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 已提交
1050 1051 1052
		mutex_init(&wdev->mtx);
		INIT_LIST_HEAD(&wdev->event_list);
		spin_lock_init(&wdev->event_lock);
1053 1054
		INIT_LIST_HEAD(&wdev->mgmt_registrations);
		spin_lock_init(&wdev->mgmt_registrations_lock);
1055

1056
		wdev->identifier = ++rdev->wdev_id;
1057
		list_add_rcu(&wdev->list, &rdev->wiphy.wdev_list);
1058
		rdev->devlist_generation++;
1059 1060 1061
		/* can only change netns with wiphy */
		dev->features |= NETIF_F_NETNS_LOCAL;

1062 1063
		if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
				      "phy80211")) {
1064
			pr_err("failed to add phy80211 symlink to netdev!\n");
1065
		}
1066
		wdev->netdev = dev;
J
Johannes Berg 已提交
1067
#ifdef CONFIG_CFG80211_WEXT
1068 1069
		wdev->wext.default_key = -1;
		wdev->wext.default_mgmt_key = -1;
1070
		wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
K
Kalle Valo 已提交
1071 1072
#endif

J
Johannes Berg 已提交
1073
		if (wdev->wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT)
K
Kalle Valo 已提交
1074
			wdev->ps = true;
J
Johannes Berg 已提交
1075
		else
K
Kalle Valo 已提交
1076
			wdev->ps = false;
1077 1078
		/* allow mac80211 to determine the timeout */
		wdev->ps_timeout = -1;
K
Kalle Valo 已提交
1079

1080
		if ((wdev->iftype == NL80211_IFTYPE_STATION ||
1081
		     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT ||
1082 1083
		     wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr)
			dev->priv_flags |= IFF_DONT_BRIDGE;
1084 1085

		nl80211_notify_iface(rdev, wdev, NL80211_CMD_NEW_INTERFACE);
1086
		break;
J
Johannes Berg 已提交
1087
	case NETDEV_GOING_DOWN:
1088
		cfg80211_leave(rdev, wdev);
1089 1090
		break;
	case NETDEV_DOWN:
1091
		cfg80211_update_iface_num(rdev, wdev->iftype, -1);
J
Johannes Berg 已提交
1092 1093
		if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
			if (WARN_ON(!rdev->scan_req->notified))
1094
				rdev->scan_req->info.aborted = true;
1095
			___cfg80211_scan_done(rdev, false);
J
Johannes Berg 已提交
1096
		}
1097

1098 1099 1100
		sched_scan_req = rtnl_dereference(rdev->sched_scan_req);
		if (WARN_ON(sched_scan_req &&
			    sched_scan_req->dev == wdev->netdev)) {
1101 1102 1103 1104 1105
			__cfg80211_stop_sched_scan(rdev, false);
		}

		rdev->opencount--;
		wake_up(&rdev->dev_wait);
J
Johannes Berg 已提交
1106 1107
		break;
	case NETDEV_UP:
1108
		cfg80211_update_iface_num(rdev, wdev->iftype, 1);
J
Johannes Berg 已提交
1109
		wdev_lock(wdev);
1110
		switch (wdev->iftype) {
1111
#ifdef CONFIG_CFG80211_WEXT
1112
		case NL80211_IFTYPE_ADHOC:
J
Johannes Berg 已提交
1113
			cfg80211_ibss_wext_join(rdev, wdev);
J
Johannes Berg 已提交
1114
			break;
1115
		case NL80211_IFTYPE_STATION:
J
Johannes Berg 已提交
1116
			cfg80211_mgd_wext_connect(rdev, wdev);
1117
			break;
1118
#endif
1119
#ifdef CONFIG_MAC80211_MESH
1120
		case NL80211_IFTYPE_MESH_POINT:
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
			{
				/* backward compat code... */
				struct mesh_setup setup;
				memcpy(&setup, &default_mesh_setup,
						sizeof(setup));
				 /* back compat only needed for mesh_id */
				setup.mesh_id = wdev->ssid;
				setup.mesh_id_len = wdev->mesh_id_up_len;
				if (wdev->mesh_id_up_len)
					__cfg80211_join_mesh(rdev, dev,
							&setup,
							&default_mesh_config);
				break;
			}
#endif
1136
		default:
J
Johannes Berg 已提交
1137
			break;
1138
		}
J
Johannes Berg 已提交
1139
		wdev_unlock(wdev);
1140
		rdev->opencount++;
1141 1142 1143 1144 1145

		/*
		 * Configure power management to the driver here so that its
		 * correctly set also after interface type changes etc.
		 */
1146 1147
		if ((wdev->iftype == NL80211_IFTYPE_STATION ||
		     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
1148
		    rdev->ops->set_power_mgmt)
1149 1150
			if (rdev_set_power_mgmt(rdev, dev, wdev->ps,
						wdev->ps_timeout)) {
1151 1152 1153
				/* assume this means it's off */
				wdev->ps = false;
			}
1154
		break;
1155
	case NETDEV_UNREGISTER:
1156 1157 1158 1159 1160 1161 1162
		/*
		 * 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.
		 */
1163
		if (!list_empty(&wdev->list)) {
1164 1165
			nl80211_notify_iface(rdev, wdev,
					     NL80211_CMD_DEL_INTERFACE);
1166
			sysfs_remove_link(&dev->dev.kobj, "phy80211");
J
Johannes Berg 已提交
1167
			list_del_rcu(&wdev->list);
1168
			rdev->devlist_generation++;
1169
			cfg80211_mlme_purge_registrations(wdev);
J
Johannes Berg 已提交
1170
#ifdef CONFIG_CFG80211_WEXT
1171
			kzfree(wdev->wext.keys);
J
Johannes Berg 已提交
1172
#endif
1173
		}
J
Johannes Berg 已提交
1174 1175 1176 1177 1178 1179 1180 1181
		/*
		 * 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);
1182 1183 1184 1185 1186
		/*
		 * Ensure that all events have been processed and
		 * freed.
		 */
		cfg80211_process_wdev_events(wdev);
1187 1188 1189 1190 1191 1192

		if (WARN_ON(wdev->current_bss)) {
			cfg80211_unhold_bss(wdev->current_bss);
			cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
			wdev->current_bss = NULL;
		}
1193
		break;
J
Johannes Berg 已提交
1194
	case NETDEV_PRE_UP:
1195 1196
		if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
			return notifier_from_errno(-EOPNOTSUPP);
1197 1198
		if (rfkill_blocked(rdev->rfkill))
			return notifier_from_errno(-ERFKILL);
J
Johannes Berg 已提交
1199
		break;
1200 1201
	default:
		return NOTIFY_DONE;
1202 1203
	}

1204 1205
	wireless_nlevent_flush();

1206
	return NOTIFY_OK;
1207 1208 1209 1210 1211 1212
}

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

1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229
static void __net_exit cfg80211_pernet_exit(struct net *net)
{
	struct cfg80211_registered_device *rdev;

	rtnl_lock();
	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));
	}
	rtnl_unlock();
}

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

static int __init cfg80211_init(void)
1230
{
1231 1232
	int err;

1233 1234 1235 1236
	err = register_pernet_device(&cfg80211_pernet_ops);
	if (err)
		goto out_fail_pernet;

1237
	err = wiphy_sysfs_init();
1238 1239 1240 1241 1242 1243 1244
	if (err)
		goto out_fail_sysfs;

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

1245 1246 1247 1248
	err = nl80211_init();
	if (err)
		goto out_fail_nl80211;

1249 1250
	ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);

1251 1252 1253 1254
	err = regulatory_init();
	if (err)
		goto out_fail_reg;

1255
	cfg80211_wq = create_singlethread_workqueue("cfg80211");
1256 1257
	if (!cfg80211_wq) {
		err = -ENOMEM;
1258
		goto out_fail_wq;
1259
	}
1260

1261 1262
	return 0;

1263 1264
out_fail_wq:
	regulatory_exit();
1265 1266
out_fail_reg:
	debugfs_remove(ieee80211_debugfs_dir);
1267
	nl80211_exit();
1268 1269
out_fail_nl80211:
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
1270 1271 1272
out_fail_notifier:
	wiphy_sysfs_exit();
out_fail_sysfs:
1273 1274
	unregister_pernet_device(&cfg80211_pernet_ops);
out_fail_pernet:
1275 1276
	return err;
}
1277
subsys_initcall(cfg80211_init);
1278

1279
static void __exit cfg80211_exit(void)
1280 1281
{
	debugfs_remove(ieee80211_debugfs_dir);
1282
	nl80211_exit();
1283 1284
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
	wiphy_sysfs_exit();
1285
	regulatory_exit();
1286
	unregister_pernet_device(&cfg80211_pernet_ops);
1287
	destroy_workqueue(cfg80211_wq);
1288 1289
}
module_exit(cfg80211_exit);