core.c 27.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
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

9 10 11 12
#include <linux/if.h>
#include <linux/module.h>
#include <linux/err.h>
#include <linux/list.h>
13
#include <linux/slab.h>
14 15 16 17
#include <linux/nl80211.h>
#include <linux/debugfs.h>
#include <linux/notifier.h>
#include <linux/device.h>
18
#include <linux/etherdevice.h>
J
Johannes Berg 已提交
19
#include <linux/rtnetlink.h>
20
#include <linux/sched.h>
21 22
#include <net/genetlink.h>
#include <net/cfg80211.h>
23
#include "nl80211.h"
24 25
#include "core.h"
#include "sysfs.h"
26
#include "debugfs.h"
27
#include "wext-compat.h"
28
#include "ethtool.h"
29
#include "rdev-ops.h"
30 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");

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

DEFINE_MUTEX(cfg80211_mutex);
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
/* requires cfg80211_mutex to be held! */
56
struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx)
57
{
58
	struct cfg80211_registered_device *result = NULL, *rdev;
59

60 61 62
	if (!wiphy_idx_valid(wiphy_idx))
		return NULL;

63 64
	assert_cfg80211_lock();

65 66 67
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		if (rdev->wiphy_idx == wiphy_idx) {
			result = rdev;
68 69 70 71 72 73 74
			break;
		}
	}

	return result;
}

75 76
int get_wiphy_idx(struct wiphy *wiphy)
{
77
	struct cfg80211_registered_device *rdev;
78 79
	if (!wiphy)
		return WIPHY_IDX_STALE;
80 81
	rdev = wiphy_to_dev(wiphy);
	return rdev->wiphy_idx;
82 83
}

84
/* requires cfg80211_rdev_mutex to be held! */
85 86
struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx)
{
87
	struct cfg80211_registered_device *rdev;
88 89 90 91 92 93

	if (!wiphy_idx_valid(wiphy_idx))
		return NULL;

	assert_cfg80211_lock();

94 95
	rdev = cfg80211_rdev_by_wiphy_idx(wiphy_idx);
	if (!rdev)
96
		return NULL;
97
	return &rdev->wiphy;
98 99
}

100
struct cfg80211_registered_device *
101
cfg80211_get_dev_from_ifindex(struct net *net, int ifindex)
102
{
103
	struct cfg80211_registered_device *rdev = ERR_PTR(-ENODEV);
104 105
	struct net_device *dev;

106
	mutex_lock(&cfg80211_mutex);
107
	dev = dev_get_by_index(net, ifindex);
108 109 110
	if (!dev)
		goto out;
	if (dev->ieee80211_ptr) {
111 112
		rdev = wiphy_to_dev(dev->ieee80211_ptr->wiphy);
		mutex_lock(&rdev->mtx);
113
	} else
114
		rdev = ERR_PTR(-ENODEV);
115 116
	dev_put(dev);
 out:
117
	mutex_unlock(&cfg80211_mutex);
118
	return rdev;
119 120
}

121
/* requires cfg80211_mutex to be held */
122 123 124
int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
			char *newname)
{
125
	struct cfg80211_registered_device *rdev2;
126
	int wiphy_idx, taken = -1, result, digits;
127

128
	assert_cfg80211_lock();
129

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
	/* 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;
	}


146 147
	/* Ignore nop renames */
	if (strcmp(newname, dev_name(&rdev->wiphy.dev)) == 0)
148
		return 0;
149 150

	/* Ensure another device does not already have this name. */
151 152
	list_for_each_entry(rdev2, &cfg80211_rdev_list, list)
		if (strcmp(newname, dev_name(&rdev2->wiphy.dev)) == 0)
153
			return -EINVAL;
154 155 156

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

159 160
	if (rdev->wiphy.debugfsdir &&
	    !debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
161 162 163
			    rdev->wiphy.debugfsdir,
			    rdev->wiphy.debugfsdir->d_parent,
			    newname))
164
		pr_err("failed to rename debugfs dir to %s!\n", newname);
165

166
	nl80211_notify_dev_rename(rdev);
167

168
	return 0;
169 170
}

171 172 173 174 175 176
int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
			  struct net *net)
{
	struct wireless_dev *wdev;
	int err = 0;

J
Johannes Berg 已提交
177
	if (!(rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK))
178 179
		return -EOPNOTSUPP;

180
	list_for_each_entry(wdev, &rdev->wdev_list, list) {
181 182
		if (!wdev->netdev)
			continue;
183 184 185 186 187 188 189 190 191 192 193
		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);

194
		list_for_each_entry_continue_reverse(wdev, &rdev->wdev_list,
195
						     list) {
196 197
			if (!wdev->netdev)
				continue;
198 199 200 201 202 203
			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;
		}
204 205

		return err;
206 207 208 209
	}

	wiphy_net_set(&rdev->wiphy, net);

210 211 212 213
	err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
	WARN_ON(err);

	return 0;
214 215
}

J
Johannes Berg 已提交
216 217
static void cfg80211_rfkill_poll(struct rfkill *rfkill, void *data)
{
218
	struct cfg80211_registered_device *rdev = data;
J
Johannes Berg 已提交
219

220
	rdev_rfkill_poll(rdev);
J
Johannes Berg 已提交
221 222 223 224
}

static int cfg80211_rfkill_set_block(void *data, bool blocked)
{
225
	struct cfg80211_registered_device *rdev = data;
J
Johannes Berg 已提交
226 227 228 229 230 231
	struct wireless_dev *wdev;

	if (!blocked)
		return 0;

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

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

253
	mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
254 255 256 257 258 259 260
	rtnl_unlock();

	return 0;
}

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

263 264
	rdev = container_of(work, struct cfg80211_registered_device, rfkill_sync);
	cfg80211_rfkill_set_block(rdev, rfkill_blocked(rdev->rfkill));
J
Johannes Berg 已提交
265 266
}

J
Johannes Berg 已提交
267 268 269 270 271 272 273 274 275 276
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);

277
	cfg80211_process_rdev_events(rdev);
J
Johannes Berg 已提交
278 279 280 281
	cfg80211_unlock_rdev(rdev);
	rtnl_unlock();
}

282 283
/* exported functions */

284
struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
285
{
286
	static int wiphy_counter;
287 288

	struct cfg80211_registered_device *rdev;
289 290
	int alloc_size;

291 292 293 294 295 296 297
	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);
298
	WARN_ON(ops->join_mesh && !ops->leave_mesh);
299

300
	alloc_size = sizeof(*rdev) + sizeof_priv;
301

302 303
	rdev = kzalloc(alloc_size, GFP_KERNEL);
	if (!rdev)
304 305
		return NULL;

306
	rdev->ops = ops;
307

308
	mutex_lock(&cfg80211_mutex);
309

310
	rdev->wiphy_idx = wiphy_counter++;
311

312
	if (unlikely(!wiphy_idx_valid(rdev->wiphy_idx))) {
313
		wiphy_counter--;
314
		mutex_unlock(&cfg80211_mutex);
315
		/* ugh, wrapped! */
316
		kfree(rdev);
317 318 319
		return NULL;
	}

320
	mutex_unlock(&cfg80211_mutex);
321

322 323 324
	/* give it a proper name */
	dev_set_name(&rdev->wiphy.dev, PHY_NAME "%d", rdev->wiphy_idx);

325 326
	mutex_init(&rdev->mtx);
	mutex_init(&rdev->devlist_mtx);
327
	mutex_init(&rdev->sched_scan_mtx);
328
	INIT_LIST_HEAD(&rdev->wdev_list);
329 330 331
	spin_lock_init(&rdev->bss_lock);
	INIT_LIST_HEAD(&rdev->bss_list);
	INIT_WORK(&rdev->scan_done_wk, __cfg80211_scan_done);
332
	INIT_WORK(&rdev->sched_scan_results_wk, __cfg80211_sched_scan_results);
J
Johannes Berg 已提交
333 334 335 336
#ifdef CONFIG_CFG80211_WEXT
	rdev->wiphy.wext = &cfg80211_wext_handler;
#endif

337 338 339 340
	device_initialize(&rdev->wiphy.dev);
	rdev->wiphy.dev.class = &ieee80211_class;
	rdev->wiphy.dev.platform_data = rdev;

J
Johannes Berg 已提交
341 342 343
#ifdef CONFIG_CFG80211_DEFAULT_PS
	rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
#endif
344

345 346
	wiphy_net_set(&rdev->wiphy, &init_net);

347 348 349 350 351 352 353
	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 已提交
354 355 356
		return NULL;
	}

357 358 359
	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 已提交
360

361 362
	init_waitqueue_head(&rdev->dev_wait);

363 364 365 366 367
	/*
	 * Initialize wiphy parameters to IEEE 802.11 MIB default values.
	 * Fragmentation and RTS threshold are disabled by default with the
	 * special -1 value.
	 */
368 369 370 371
	rdev->wiphy.retry_short = 7;
	rdev->wiphy.retry_long = 4;
	rdev->wiphy.frag_threshold = (u32) -1;
	rdev->wiphy.rts_threshold = (u32) -1;
372
	rdev->wiphy.coverage_class = 0;
373

374 375
	rdev->wiphy.features = NL80211_FEATURE_SCAN_FLUSH;

376
	return &rdev->wiphy;
377 378 379
}
EXPORT_SYMBOL(wiphy_new);

380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
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];

		/* Combinations with just one interface aren't real */
		if (WARN_ON(c->max_interfaces < 2))
			return -EINVAL;

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

399 400 401 402 403 404 405 406
		/*
		 * 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;

407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
		if (WARN_ON(!c->n_limits))
			return -EINVAL;

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

			/*
			 * interface types shouldn't overlap, this is
			 * used in cfg80211_can_change_interface()
			 */
			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;

428 429 430 431 432
			/* Only a single P2P_DEVICE can be allowed */
			if (WARN_ON(types & BIT(NL80211_IFTYPE_P2P_DEVICE) &&
				    c->limits[j].max > 1))
				return -EINVAL;

433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449
			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;
}

450 451
int wiphy_register(struct wiphy *wiphy)
{
452
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
453
	int res;
454 455 456 457
	enum ieee80211_band band;
	struct ieee80211_supported_band *sband;
	bool have_band = false;
	int i;
458 459
	u16 ifmodes = wiphy->interface_modes;

460
#ifdef CONFIG_PM
461 462 463
	if (WARN_ON((wiphy->wowlan.flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
		    !(wiphy->wowlan.flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY)))
		return -EINVAL;
464
#endif
465

J
Johannes Berg 已提交
466 467 468 469
	if (WARN_ON(wiphy->ap_sme_capa &&
		    !(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME)))
		return -EINVAL;

470 471 472 473 474 475 476 477 478 479 480 481
	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);

482 483
	/* sanity check ifmodes */
	WARN_ON(!ifmodes);
484
	ifmodes &= ((1 << NUM_NL80211_IFTYPES) - 1) & ~1;
485 486
	if (WARN_ON(ifmodes != wiphy->interface_modes))
		wiphy->interface_modes = ifmodes;
487

488 489 490 491
	res = wiphy_verify_combinations(wiphy);
	if (res)
		return res;

492 493 494 495 496 497 498
	/* sanity check supported bands/channels */
	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
		sband = wiphy->bands[band];
		if (!sband)
			continue;

		sband->band = band;
499 500 501 502 503 504 505 506
		if (WARN_ON(!sband->n_channels))
			return -EINVAL;
		/*
		 * on 60gHz band, there are no legacy rates, so
		 * n_bitrates is 0
		 */
		if (WARN_ON(band != IEEE80211_BAND_60GHZ &&
			    !sband->n_bitrates))
507 508
			return -EINVAL;

509 510 511 512 513 514 515 516 517 518 519 520
		/*
		 * 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 &&
		    band == IEEE80211_BAND_2GHZ &&
		    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;
		}

521 522 523 524 525 526
		/*
		 * 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))
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546
			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;
	}

547
#ifdef CONFIG_PM
J
Johannes Berg 已提交
548 549 550 551 552 553
	if (rdev->wiphy.wowlan.n_patterns) {
		if (WARN_ON(!rdev->wiphy.wowlan.pattern_min_len ||
			    rdev->wiphy.wowlan.pattern_min_len >
			    rdev->wiphy.wowlan.pattern_max_len))
			return -EINVAL;
	}
554
#endif
J
Johannes Berg 已提交
555

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

559 560
	mutex_lock(&cfg80211_mutex);

561
	res = device_add(&rdev->wiphy.dev);
562 563 564 565
	if (res) {
		mutex_unlock(&cfg80211_mutex);
		return res;
	}
J
Johannes Berg 已提交
566

567
	/* set up regulatory info */
568
	wiphy_regulatory_register(wiphy);
569

J
Johannes Berg 已提交
570
	list_add_rcu(&rdev->list, &cfg80211_rdev_list);
571
	cfg80211_rdev_list_generation++;
572 573

	/* add to debugfs */
574 575
	rdev->wiphy.debugfsdir =
		debugfs_create_dir(wiphy_name(&rdev->wiphy),
576
				   ieee80211_debugfs_dir);
577 578
	if (IS_ERR(rdev->wiphy.debugfsdir))
		rdev->wiphy.debugfsdir = NULL;
579

J
Johannes Berg 已提交
580
	if (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY) {
581 582 583 584 585 586 587 588 589 590
		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);
	}

591
	cfg80211_debugfs_rdev_add(rdev);
592
	mutex_unlock(&cfg80211_mutex);
593

594 595 596 597 598 599 600 601
	/*
	 * due to a locking dependency this has to be outside of the
	 * cfg80211_mutex lock
	 */
	res = rfkill_register(rdev->rfkill);
	if (res)
		goto out_rm_dev;

602 603 604
	rtnl_lock();
	rdev->wiphy.registered = true;
	rtnl_unlock();
605
	return 0;
J
Johannes Berg 已提交
606

607
out_rm_dev:
608
	device_del(&rdev->wiphy.dev);
609 610 611 612
	return res;
}
EXPORT_SYMBOL(wiphy_register);

J
Johannes Berg 已提交
613 614
void wiphy_rfkill_start_polling(struct wiphy *wiphy)
{
615
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
J
Johannes Berg 已提交
616

617
	if (!rdev->ops->rfkill_poll)
J
Johannes Berg 已提交
618
		return;
619 620
	rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
	rfkill_resume_polling(rdev->rfkill);
J
Johannes Berg 已提交
621 622 623 624 625
}
EXPORT_SYMBOL(wiphy_rfkill_start_polling);

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

628
	rfkill_pause_polling(rdev->rfkill);
J
Johannes Berg 已提交
629 630 631
}
EXPORT_SYMBOL(wiphy_rfkill_stop_polling);

632 633
void wiphy_unregister(struct wiphy *wiphy)
{
634
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
635

636 637 638 639
	rtnl_lock();
	rdev->wiphy.registered = false;
	rtnl_unlock();

640
	rfkill_unregister(rdev->rfkill);
J
Johannes Berg 已提交
641

642
	/* protect the device list */
643
	mutex_lock(&cfg80211_mutex);
644

645 646 647 648 649
	wait_event(rdev->dev_wait, ({
		int __count;
		mutex_lock(&rdev->devlist_mtx);
		__count = rdev->opencount;
		mutex_unlock(&rdev->devlist_mtx);
650
		__count == 0; }));
651 652

	mutex_lock(&rdev->devlist_mtx);
653
	BUG_ON(!list_empty(&rdev->wdev_list));
654 655 656 657 658 659
	mutex_unlock(&rdev->devlist_mtx);

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

	/*
665
	 * Try to grab rdev->mtx. If a command is still in progress,
666 667 668 669
	 * 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
670 671 672
	 * 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.
673
	 */
J
Johannes Berg 已提交
674
	cfg80211_lock_rdev(rdev);
675
	/* nothing */
J
Johannes Berg 已提交
676
	cfg80211_unlock_rdev(rdev);
677

678 679 680 681 682
	/*
	 * 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);
683

684
	cfg80211_rdev_list_generation++;
685
	device_del(&rdev->wiphy.dev);
686

687
	mutex_unlock(&cfg80211_mutex);
J
Johannes Berg 已提交
688

689
	flush_work(&rdev->scan_done_wk);
J
Johannes Berg 已提交
690 691
	cancel_work_sync(&rdev->conn_work);
	flush_work(&rdev->event_work);
692 693

	if (rdev->wowlan && rdev->ops->set_wakeup)
694
		rdev_set_wakeup(rdev, false);
695
	cfg80211_rdev_free_wowlan(rdev);
696 697 698
}
EXPORT_SYMBOL(wiphy_unregister);

699
void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
700
{
701
	struct cfg80211_internal_bss *scan, *tmp;
702 703 704
	rfkill_destroy(rdev->rfkill);
	mutex_destroy(&rdev->mtx);
	mutex_destroy(&rdev->devlist_mtx);
705
	mutex_destroy(&rdev->sched_scan_mtx);
706
	list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
J
Johannes Berg 已提交
707
		cfg80211_put_bss(&scan->pub);
708
	kfree(rdev);
709 710 711 712 713 714 715 716
}

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

J
Johannes Berg 已提交
717 718
void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
{
719
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
J
Johannes Berg 已提交
720

721 722
	if (rfkill_set_hw_state(rdev->rfkill, blocked))
		schedule_work(&rdev->rfkill_sync);
J
Johannes Berg 已提交
723 724 725
}
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state);

726 727 728 729 730 731 732 733 734 735
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);

J
Johannes Berg 已提交
736
	if (WARN_ON(rdev->scan_req && rdev->scan_req->wdev == wdev)) {
737
		rdev->scan_req->aborted = true;
738
		___cfg80211_scan_done(rdev, true);
739 740
	}

741 742 743 744
	cfg80211_unlock_rdev(rdev);

	mutex_lock(&rdev->sched_scan_mtx);

745 746 747 748 749
	if (WARN_ON(rdev->sched_scan_req &&
		    rdev->sched_scan_req->dev == wdev->netdev)) {
		__cfg80211_stop_sched_scan(rdev, false);
	}

750
	mutex_unlock(&rdev->sched_scan_mtx);
751 752 753 754 755 756 757 758 759

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

	dev_put(wdev->netdev);
}

760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
void cfg80211_unregister_wdev(struct wireless_dev *wdev)
{
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);

	ASSERT_RTNL();

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

	mutex_lock(&rdev->devlist_mtx);
	list_del_rcu(&wdev->list);
	rdev->devlist_generation++;

	switch (wdev->iftype) {
	case NL80211_IFTYPE_P2P_DEVICE:
		if (!wdev->p2p_started)
			break;
		rdev->ops->stop_p2p_device(&rdev->wiphy, wdev);
		wdev->p2p_started = false;
		rdev->opencount--;
		break;
	default:
		WARN_ON_ONCE(1);
		break;
	}
	mutex_unlock(&rdev->devlist_mtx);
}
EXPORT_SYMBOL(cfg80211_unregister_wdev);

789 790 791 792
static struct device_type wiphy_type = {
	.name	= "wlan",
};

793 794 795
void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
			       enum nl80211_iftype iftype, int num)
{
796
	ASSERT_RTNL();
797 798 799 800 801 802

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

803
static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
804 805 806 807
					 unsigned long state,
					 void *ndev)
{
	struct net_device *dev = ndev;
808
	struct wireless_dev *wdev = dev->ieee80211_ptr;
809
	struct cfg80211_registered_device *rdev;
810
	int ret;
811

812
	if (!wdev)
J
Johannes Berg 已提交
813
		return NOTIFY_DONE;
814

815
	rdev = wiphy_to_dev(wdev->wiphy);
816

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

819
	switch (state) {
820 821 822
	case NETDEV_POST_INIT:
		SET_NETDEV_DEVTYPE(dev, &wiphy_type);
		break;
823
	case NETDEV_REGISTER:
J
Johannes Berg 已提交
824 825 826 827 828
		/*
		 * 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 已提交
829
		mutex_init(&wdev->mtx);
830
		INIT_WORK(&wdev->cleanup_work, wdev_cleanup_work);
J
Johannes Berg 已提交
831 832
		INIT_LIST_HEAD(&wdev->event_list);
		spin_lock_init(&wdev->event_lock);
833 834
		INIT_LIST_HEAD(&wdev->mgmt_registrations);
		spin_lock_init(&wdev->mgmt_registrations_lock);
835

836
		mutex_lock(&rdev->devlist_mtx);
837 838
		wdev->identifier = ++rdev->wdev_id;
		list_add_rcu(&wdev->list, &rdev->wdev_list);
839
		rdev->devlist_generation++;
840 841 842
		/* can only change netns with wiphy */
		dev->features |= NETIF_F_NETNS_LOCAL;

843 844
		if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
				      "phy80211")) {
845
			pr_err("failed to add phy80211 symlink to netdev!\n");
846
		}
847
		wdev->netdev = dev;
S
Samuel Ortiz 已提交
848
		wdev->sme_state = CFG80211_SME_IDLE;
J
Johannes Berg 已提交
849
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
850
#ifdef CONFIG_CFG80211_WEXT
851 852
		wdev->wext.default_key = -1;
		wdev->wext.default_mgmt_key = -1;
853
		wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
K
Kalle Valo 已提交
854 855
#endif

J
Johannes Berg 已提交
856
		if (wdev->wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT)
K
Kalle Valo 已提交
857
			wdev->ps = true;
J
Johannes Berg 已提交
858
		else
K
Kalle Valo 已提交
859
			wdev->ps = false;
860 861
		/* allow mac80211 to determine the timeout */
		wdev->ps_timeout = -1;
K
Kalle Valo 已提交
862

863 864
		if (!dev->ethtool_ops)
			dev->ethtool_ops = &cfg80211_ethtool_ops;
865 866

		if ((wdev->iftype == NL80211_IFTYPE_STATION ||
867
		     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT ||
868 869
		     wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr)
			dev->priv_flags |= IFF_DONT_BRIDGE;
870
		break;
J
Johannes Berg 已提交
871
	case NETDEV_GOING_DOWN:
S
Samuel Ortiz 已提交
872 873 874 875
		switch (wdev->iftype) {
		case NL80211_IFTYPE_ADHOC:
			cfg80211_leave_ibss(rdev, dev, true);
			break;
876
		case NL80211_IFTYPE_P2P_CLIENT:
S
Samuel Ortiz 已提交
877
		case NL80211_IFTYPE_STATION:
878
			mutex_lock(&rdev->sched_scan_mtx);
879
			__cfg80211_stop_sched_scan(rdev, false);
880
			mutex_unlock(&rdev->sched_scan_mtx);
881

J
Johannes Berg 已提交
882
			wdev_lock(wdev);
J
Johannes Berg 已提交
883
#ifdef CONFIG_CFG80211_WEXT
884 885 886
			kfree(wdev->wext.ie);
			wdev->wext.ie = NULL;
			wdev->wext.ie_len = 0;
J
Johannes Berg 已提交
887
			wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
888
#endif
J
Johannes Berg 已提交
889 890
			__cfg80211_disconnect(rdev, dev,
					      WLAN_REASON_DEAUTH_LEAVING, true);
J
Johannes Berg 已提交
891
			cfg80211_mlme_down(rdev, dev);
J
Johannes Berg 已提交
892
			wdev_unlock(wdev);
S
Samuel Ortiz 已提交
893
			break;
894 895 896
		case NL80211_IFTYPE_MESH_POINT:
			cfg80211_leave_mesh(rdev, dev);
			break;
897 898 899
		case NL80211_IFTYPE_AP:
			cfg80211_stop_ap(rdev, dev);
			break;
S
Samuel Ortiz 已提交
900 901 902
		default:
			break;
		}
903
		wdev->beacon_interval = 0;
904 905
		break;
	case NETDEV_DOWN:
906
		cfg80211_update_iface_num(rdev, wdev->iftype, -1);
907
		dev_hold(dev);
908
		queue_work(cfg80211_wq, &wdev->cleanup_work);
J
Johannes Berg 已提交
909 910
		break;
	case NETDEV_UP:
911 912 913 914 915 916 917 918 919 920 921 922
		/*
		 * 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);
		}
923
		cfg80211_update_iface_num(rdev, wdev->iftype, 1);
J
Johannes Berg 已提交
924
		cfg80211_lock_rdev(rdev);
925
		mutex_lock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
926
		wdev_lock(wdev);
927
		switch (wdev->iftype) {
928
#ifdef CONFIG_CFG80211_WEXT
929
		case NL80211_IFTYPE_ADHOC:
J
Johannes Berg 已提交
930
			cfg80211_ibss_wext_join(rdev, wdev);
J
Johannes Berg 已提交
931
			break;
932
		case NL80211_IFTYPE_STATION:
J
Johannes Berg 已提交
933
			cfg80211_mgd_wext_connect(rdev, wdev);
934
			break;
935
#endif
936
#ifdef CONFIG_MAC80211_MESH
937
		case NL80211_IFTYPE_MESH_POINT:
938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
			{
				/* 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
953
		default:
J
Johannes Berg 已提交
954
			break;
955
		}
J
Johannes Berg 已提交
956
		wdev_unlock(wdev);
957
		rdev->opencount++;
958
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
959
		cfg80211_unlock_rdev(rdev);
960 961 962 963 964

		/*
		 * Configure power management to the driver here so that its
		 * correctly set also after interface type changes etc.
		 */
965 966
		if ((wdev->iftype == NL80211_IFTYPE_STATION ||
		     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
967
		    rdev->ops->set_power_mgmt)
968 969
			if (rdev_set_power_mgmt(rdev, dev, wdev->ps,
						wdev->ps_timeout)) {
970 971 972
				/* assume this means it's off */
				wdev->ps = false;
			}
973
		break;
974
	case NETDEV_UNREGISTER:
J
Johannes Berg 已提交
975 976 977 978 979
		/*
		 * NB: cannot take rdev->mtx here because this may be
		 * called within code protected by it when interfaces
		 * are removed with nl80211.
		 */
980
		mutex_lock(&rdev->devlist_mtx);
981 982 983 984 985 986 987
		/*
		 * 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.
		 */
988
		if (!list_empty(&wdev->list)) {
989
			sysfs_remove_link(&dev->dev.kobj, "phy80211");
J
Johannes Berg 已提交
990
			list_del_rcu(&wdev->list);
991
			rdev->devlist_generation++;
992
			cfg80211_mlme_purge_registrations(wdev);
J
Johannes Berg 已提交
993
#ifdef CONFIG_CFG80211_WEXT
994
			kfree(wdev->wext.keys);
J
Johannes Berg 已提交
995
#endif
996 997
		}
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
998 999 1000 1001 1002 1003 1004 1005
		/*
		 * 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);
1006 1007 1008 1009 1010
		/*
		 * Ensure that all events have been processed and
		 * freed.
		 */
		cfg80211_process_wdev_events(wdev);
1011
		break;
J
Johannes Berg 已提交
1012
	case NETDEV_PRE_UP:
1013 1014
		if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
			return notifier_from_errno(-EOPNOTSUPP);
J
Johannes Berg 已提交
1015 1016
		if (rfkill_blocked(rdev->rfkill))
			return notifier_from_errno(-ERFKILL);
1017
		mutex_lock(&rdev->devlist_mtx);
1018
		ret = cfg80211_can_add_interface(rdev, wdev->iftype);
1019
		mutex_unlock(&rdev->devlist_mtx);
1020 1021
		if (ret)
			return notifier_from_errno(ret);
J
Johannes Berg 已提交
1022
		break;
1023 1024
	}

J
Johannes Berg 已提交
1025
	return NOTIFY_DONE;
1026 1027 1028 1029 1030 1031
}

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

1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050
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)
1051
{
1052 1053
	int err;

1054 1055 1056 1057
	err = register_pernet_device(&cfg80211_pernet_ops);
	if (err)
		goto out_fail_pernet;

1058
	err = wiphy_sysfs_init();
1059 1060 1061 1062 1063 1064 1065
	if (err)
		goto out_fail_sysfs;

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

1066 1067 1068 1069
	err = nl80211_init();
	if (err)
		goto out_fail_nl80211;

1070 1071
	ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);

1072 1073 1074 1075
	err = regulatory_init();
	if (err)
		goto out_fail_reg;

1076 1077 1078 1079
	cfg80211_wq = create_singlethread_workqueue("cfg80211");
	if (!cfg80211_wq)
		goto out_fail_wq;

1080 1081
	return 0;

1082 1083
out_fail_wq:
	regulatory_exit();
1084 1085
out_fail_reg:
	debugfs_remove(ieee80211_debugfs_dir);
1086 1087
out_fail_nl80211:
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
1088 1089 1090
out_fail_notifier:
	wiphy_sysfs_exit();
out_fail_sysfs:
1091 1092
	unregister_pernet_device(&cfg80211_pernet_ops);
out_fail_pernet:
1093 1094
	return err;
}
1095
subsys_initcall(cfg80211_init);
1096

1097
static void __exit cfg80211_exit(void)
1098 1099
{
	debugfs_remove(ieee80211_debugfs_dir);
1100
	nl80211_exit();
1101 1102
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
	wiphy_sysfs_exit();
1103
	regulatory_exit();
1104
	unregister_pernet_device(&cfg80211_pernet_ops);
1105
	destroy_workqueue(cfg80211_wq);
1106 1107
}
module_exit(cfg80211_exit);