core.c 27.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 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

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

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

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

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

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

49 50 51 52 53
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");

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

58
	ASSERT_RTNL();
59

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

	return result;
}

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

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

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

81
	ASSERT_RTNL();
82

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

89 90 91
int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
			char *newname)
{
92
	struct cfg80211_registered_device *rdev2;
93
	int wiphy_idx, taken = -1, result, digits;
94

95
	ASSERT_RTNL();
96

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
	/* Ignore nop renames */
	if (strcmp(newname, dev_name(&rdev->wiphy.dev)) == 0)
115
		return 0;
116 117

	/* Ensure another device does not already have this name. */
118 119
	list_for_each_entry(rdev2, &cfg80211_rdev_list, list)
		if (strcmp(newname, dev_name(&rdev2->wiphy.dev)) == 0)
120
			return -EINVAL;
121 122 123

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

126 127
	if (rdev->wiphy.debugfsdir &&
	    !debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
128 129 130
			    rdev->wiphy.debugfsdir,
			    rdev->wiphy.debugfsdir->d_parent,
			    newname))
131
		pr_err("failed to rename debugfs dir to %s!\n", newname);
132

133
	nl80211_notify_dev_rename(rdev);
134

135
	return 0;
136 137
}

138 139 140 141 142 143
int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
			  struct net *net)
{
	struct wireless_dev *wdev;
	int err = 0;

J
Johannes Berg 已提交
144
	if (!(rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK))
145 146
		return -EOPNOTSUPP;

147
	list_for_each_entry(wdev, &rdev->wdev_list, list) {
148 149
		if (!wdev->netdev)
			continue;
150 151 152 153 154 155 156 157 158 159 160
		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);

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

		return err;
173 174 175 176
	}

	wiphy_net_set(&rdev->wiphy, net);

177 178 179 180
	err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
	WARN_ON(err);

	return 0;
181 182
}

J
Johannes Berg 已提交
183 184
static void cfg80211_rfkill_poll(struct rfkill *rfkill, void *data)
{
185
	struct cfg80211_registered_device *rdev = data;
J
Johannes Berg 已提交
186

187
	rdev_rfkill_poll(rdev);
J
Johannes Berg 已提交
188 189
}

190 191 192
void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev,
			      struct wireless_dev *wdev)
{
193
	ASSERT_RTNL();
194 195 196 197 198 199 200 201 202 203 204 205

	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 已提交
206 207 208
	if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
		if (WARN_ON(!rdev->scan_req->notified))
			rdev->scan_req->aborted = true;
209
		___cfg80211_scan_done(rdev, false);
J
Johannes Berg 已提交
210
	}
211 212
}

213
void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy)
J
Johannes Berg 已提交
214
{
215
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
J
Johannes Berg 已提交
216 217
	struct wireless_dev *wdev;

218
	ASSERT_RTNL();
219

220 221
	list_for_each_entry(wdev, &rdev->wdev_list, list) {
		if (wdev->netdev) {
222
			dev_close(wdev->netdev);
223 224 225 226 227
			continue;
		}
		/* otherwise, check iftype */
		switch (wdev->iftype) {
		case NL80211_IFTYPE_P2P_DEVICE:
228
			cfg80211_stop_p2p_device(rdev, wdev);
229 230 231 232 233
			break;
		default:
			break;
		}
	}
234 235
}
EXPORT_SYMBOL_GPL(cfg80211_shutdown_all_interfaces);
J
Johannes Berg 已提交
236

237 238 239 240 241 242 243 244 245
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 已提交
246 247 248 249 250 251 252
	rtnl_unlock();

	return 0;
}

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

255 256
	rdev = container_of(work, struct cfg80211_registered_device, rfkill_sync);
	cfg80211_rfkill_set_block(rdev, rfkill_blocked(rdev->rfkill));
J
Johannes Berg 已提交
257 258
}

J
Johannes Berg 已提交
259 260 261 262 263 264 265 266
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();
267
	cfg80211_process_rdev_events(rdev);
J
Johannes Berg 已提交
268 269 270
	rtnl_unlock();
}

271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
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);

		list_for_each_entry_safe(wdev, tmp, &rdev->wdev_list, list) {
			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();
}

310 311
/* exported functions */

312
struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
313
{
314
	static atomic_t wiphy_counter = ATOMIC_INIT(0);
315 316

	struct cfg80211_registered_device *rdev;
317 318
	int alloc_size;

319 320 321 322 323 324 325
	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);
326
	WARN_ON(ops->join_mesh && !ops->leave_mesh);
327

328
	alloc_size = sizeof(*rdev) + sizeof_priv;
329

330 331
	rdev = kzalloc(alloc_size, GFP_KERNEL);
	if (!rdev)
332 333
		return NULL;

334
	rdev->ops = ops;
335

336
	rdev->wiphy_idx = atomic_inc_return(&wiphy_counter);
337

J
Johannes Berg 已提交
338
	if (unlikely(rdev->wiphy_idx < 0)) {
339
		/* ugh, wrapped! */
340
		atomic_dec(&wiphy_counter);
341
		kfree(rdev);
342 343 344
		return NULL;
	}

345 346 347
	/* atomic_inc_return makes it start at 1, make it start at 0 */
	rdev->wiphy_idx--;

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

351
	INIT_LIST_HEAD(&rdev->wdev_list);
352 353
	INIT_LIST_HEAD(&rdev->beacon_registrations);
	spin_lock_init(&rdev->beacon_registrations_lock);
354 355 356
	spin_lock_init(&rdev->bss_lock);
	INIT_LIST_HEAD(&rdev->bss_list);
	INIT_WORK(&rdev->scan_done_wk, __cfg80211_scan_done);
357
	INIT_WORK(&rdev->sched_scan_results_wk, __cfg80211_sched_scan_results);
358 359
	INIT_DELAYED_WORK(&rdev->dfs_update_channels_wk,
			  cfg80211_dfs_channels_update_work);
J
Johannes Berg 已提交
360 361 362 363
#ifdef CONFIG_CFG80211_WEXT
	rdev->wiphy.wext = &cfg80211_wext_handler;
#endif

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

368 369 370 371
	INIT_LIST_HEAD(&rdev->destroy_list);
	spin_lock_init(&rdev->destroy_list_lock);
	INIT_WORK(&rdev->destroy_work, cfg80211_destroy_iface_wk);

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

376 377
	wiphy_net_set(&rdev->wiphy, &init_net);

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

388 389 390
	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 已提交
391

392 393
	init_waitqueue_head(&rdev->dev_wait);

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

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

409 410 411 412 413 414 415 416 417 418 419
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];

420 421 422 423 424
		/*
		 * 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))
425 426 427 428 429 430
			return -EINVAL;

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

431 432 433 434 435 436 437 438
		/*
		 * 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;

439 440 441 442 443
		/* DFS only works on one channel. */
		if (WARN_ON(c->radar_detect_widths &&
			    (c->num_different_channels > 1)))
			return -EINVAL;

444 445 446 447 448 449
		if (WARN_ON(!c->n_limits))
			return -EINVAL;

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

450
			/* interface types shouldn't overlap */
451 452 453 454 455 456 457 458 459 460 461
			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;

462 463 464 465 466
			/* Only a single P2P_DEVICE can be allowed */
			if (WARN_ON(types & BIT(NL80211_IFTYPE_P2P_DEVICE) &&
				    c->limits[j].max > 1))
				return -EINVAL;

467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
			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;
}

484 485
int wiphy_register(struct wiphy *wiphy)
{
486
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
487
	int res;
488 489 490 491
	enum ieee80211_band band;
	struct ieee80211_supported_band *sband;
	bool have_band = false;
	int i;
492 493
	u16 ifmodes = wiphy->interface_modes;

494 495 496 497 498 499
	/*
	 * There are major locking problems in nl80211/mac80211 for CSA,
	 * disable for all drivers until this has been reworked.
	 */
	wiphy->flags &= ~WIPHY_FLAG_HAS_CHANNEL_SWITCH;

500
#ifdef CONFIG_PM
501 502 503 504 505 506 507
	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))
508
		return -EINVAL;
509
#endif
510

511 512 513 514 515 516 517 518
	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 已提交
519 520 521 522
	if (WARN_ON(wiphy->ap_sme_capa &&
		    !(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME)))
		return -EINVAL;

523 524 525 526 527 528 529 530 531
	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;

532 533 534 535 536
	if (WARN_ON(wiphy->max_acl_mac_addrs &&
		    (!(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME) ||
		     !rdev->ops->set_mac_acl)))
		return -EINVAL;

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

540 541
	/* sanity check ifmodes */
	WARN_ON(!ifmodes);
542
	ifmodes &= ((1 << NUM_NL80211_IFTYPES) - 1) & ~1;
543 544
	if (WARN_ON(ifmodes != wiphy->interface_modes))
		wiphy->interface_modes = ifmodes;
545

546 547 548 549
	res = wiphy_verify_combinations(wiphy);
	if (res)
		return res;

550 551 552 553 554 555 556
	/* sanity check supported bands/channels */
	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
		sband = wiphy->bands[band];
		if (!sband)
			continue;

		sband->band = band;
557 558 559 560 561 562 563 564
		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))
565 566
			return -EINVAL;

567 568 569 570 571 572 573 574 575 576 577 578
		/*
		 * 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;
		}

579 580 581 582 583 584
		/*
		 * 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))
585 586 587 588 589
			return -EINVAL;

		for (i = 0; i < sband->n_channels; i++) {
			sband->channels[i].orig_flags =
				sband->channels[i].flags;
590
			sband->channels[i].orig_mag = INT_MAX;
591 592 593 594 595 596 597 598 599 600 601 602 603
			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;
	}

604
#ifdef CONFIG_PM
605 606 607 608 609
	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;
610
#endif
J
Johannes Berg 已提交
611

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

615 616
	rdev->wiphy.features |= NL80211_FEATURE_SCAN_FLUSH;

617
	rtnl_lock();
618
	res = device_add(&rdev->wiphy.dev);
619
	if (res) {
620
		rtnl_unlock();
621 622
		return res;
	}
J
Johannes Berg 已提交
623

624
	/* set up regulatory info */
625
	wiphy_regulatory_register(wiphy);
626

J
Johannes Berg 已提交
627
	list_add_rcu(&rdev->list, &cfg80211_rdev_list);
628
	cfg80211_rdev_list_generation++;
629 630

	/* add to debugfs */
631 632
	rdev->wiphy.debugfsdir =
		debugfs_create_dir(wiphy_name(&rdev->wiphy),
633
				   ieee80211_debugfs_dir);
634 635
	if (IS_ERR(rdev->wiphy.debugfsdir))
		rdev->wiphy.debugfsdir = NULL;
636

637
	if (wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
638 639 640 641 642 643 644 645 646 647
		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);
	}

648
	cfg80211_debugfs_rdev_add(rdev);
649

650 651
	rdev->wiphy.registered = true;
	rtnl_unlock();
652 653 654 655 656 657 658 659 660

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

661
	return 0;
662 663 664
}
EXPORT_SYMBOL(wiphy_register);

J
Johannes Berg 已提交
665 666
void wiphy_rfkill_start_polling(struct wiphy *wiphy)
{
667
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
J
Johannes Berg 已提交
668

669
	if (!rdev->ops->rfkill_poll)
J
Johannes Berg 已提交
670
		return;
671 672
	rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
	rfkill_resume_polling(rdev->rfkill);
J
Johannes Berg 已提交
673 674 675 676 677
}
EXPORT_SYMBOL(wiphy_rfkill_start_polling);

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

680
	rfkill_pause_polling(rdev->rfkill);
J
Johannes Berg 已提交
681 682 683
}
EXPORT_SYMBOL(wiphy_rfkill_stop_polling);

684 685
void wiphy_unregister(struct wiphy *wiphy)
{
686
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
687

688 689
	wait_event(rdev->dev_wait, ({
		int __count;
690
		rtnl_lock();
691
		__count = rdev->opencount;
692
		rtnl_unlock();
693
		__count == 0; }));
694

695 696
	if (rdev->rfkill)
		rfkill_unregister(rdev->rfkill);
697

698 699 700
	rtnl_lock();
	rdev->wiphy.registered = false;

J
Johannes Berg 已提交
701
	WARN_ON(!list_empty(&rdev->wdev_list));
702 703 704 705 706

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

711 712 713 714 715
	/*
	 * 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);
716

717
	cfg80211_rdev_list_generation++;
718
	device_del(&rdev->wiphy.dev);
719

720
	rtnl_unlock();
J
Johannes Berg 已提交
721

722
	flush_work(&rdev->scan_done_wk);
J
Johannes Berg 已提交
723 724
	cancel_work_sync(&rdev->conn_work);
	flush_work(&rdev->event_work);
725
	cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
726
	flush_work(&rdev->destroy_work);
727

728 729
#ifdef CONFIG_PM
	if (rdev->wiphy.wowlan_config && rdev->ops->set_wakeup)
730
		rdev_set_wakeup(rdev, false);
731
#endif
732
	cfg80211_rdev_free_wowlan(rdev);
733
	cfg80211_rdev_free_coalesce(rdev);
734 735 736
}
EXPORT_SYMBOL(wiphy_unregister);

737
void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
738
{
739
	struct cfg80211_internal_bss *scan, *tmp;
740
	struct cfg80211_beacon_registration *reg, *treg;
741
	rfkill_destroy(rdev->rfkill);
742 743 744 745
	list_for_each_entry_safe(reg, treg, &rdev->beacon_registrations, list) {
		list_del(&reg->list);
		kfree(reg);
	}
746
	list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
747
		cfg80211_put_bss(&rdev->wiphy, &scan->pub);
748
	kfree(rdev);
749 750 751 752 753 754 755 756
}

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

J
Johannes Berg 已提交
757 758
void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
{
759
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
J
Johannes Berg 已提交
760

761 762
	if (rfkill_set_hw_state(rdev->rfkill, blocked))
		schedule_work(&rdev->rfkill_sync);
J
Johannes Berg 已提交
763 764 765
}
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state);

766 767
void cfg80211_unregister_wdev(struct wireless_dev *wdev)
{
768
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
769 770 771 772 773 774 775 776 777 778 779

	ASSERT_RTNL();

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

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

	switch (wdev->iftype) {
	case NL80211_IFTYPE_P2P_DEVICE:
780
		cfg80211_stop_p2p_device(rdev, wdev);
781 782 783 784 785 786 787 788
		break;
	default:
		WARN_ON_ONCE(1);
		break;
	}
}
EXPORT_SYMBOL(cfg80211_unregister_wdev);

J
Johannes Berg 已提交
789
static const struct device_type wiphy_type = {
790 791 792
	.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 804
void __cfg80211_leave(struct cfg80211_registered_device *rdev,
		      struct wireless_dev *wdev)
805 806 807
{
	struct net_device *dev = wdev->netdev;

808
	ASSERT_RTNL();
809
	ASSERT_WDEV_LOCK(wdev);
810

811 812
	switch (wdev->iftype) {
	case NL80211_IFTYPE_ADHOC:
813
		__cfg80211_leave_ibss(rdev, dev, true);
814 815 816
		break;
	case NL80211_IFTYPE_P2P_CLIENT:
	case NL80211_IFTYPE_STATION:
817 818
		if (rdev->sched_scan_req && dev == rdev->sched_scan_req->dev)
			__cfg80211_stop_sched_scan(rdev, false);
819 820 821 822 823 824 825

#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
826 827
		cfg80211_disconnect(rdev, dev,
				    WLAN_REASON_DEAUTH_LEAVING, true);
828 829
		break;
	case NL80211_IFTYPE_MESH_POINT:
830
		__cfg80211_leave_mesh(rdev, dev);
831 832
		break;
	case NL80211_IFTYPE_AP:
833
	case NL80211_IFTYPE_P2P_GO:
834
		__cfg80211_stop_ap(rdev, dev, true);
835 836 837 838 839 840
		break;
	default:
		break;
	}
}

841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870
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);

871
static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
872
					 unsigned long state, void *ptr)
873
{
874
	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
875
	struct wireless_dev *wdev = dev->ieee80211_ptr;
876 877
	struct cfg80211_registered_device *rdev;

878
	if (!wdev)
J
Johannes Berg 已提交
879
		return NOTIFY_DONE;
880

881
	rdev = wiphy_to_rdev(wdev->wiphy);
882

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

885
	switch (state) {
886 887 888
	case NETDEV_POST_INIT:
		SET_NETDEV_DEVTYPE(dev, &wiphy_type);
		break;
889
	case NETDEV_REGISTER:
J
Johannes Berg 已提交
890 891 892 893 894
		/*
		 * 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 已提交
895 896 897
		mutex_init(&wdev->mtx);
		INIT_LIST_HEAD(&wdev->event_list);
		spin_lock_init(&wdev->event_lock);
898 899
		INIT_LIST_HEAD(&wdev->mgmt_registrations);
		spin_lock_init(&wdev->mgmt_registrations_lock);
900

901 902
		wdev->identifier = ++rdev->wdev_id;
		list_add_rcu(&wdev->list, &rdev->wdev_list);
903
		rdev->devlist_generation++;
904 905 906
		/* can only change netns with wiphy */
		dev->features |= NETIF_F_NETNS_LOCAL;

907 908
		if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
				      "phy80211")) {
909
			pr_err("failed to add phy80211 symlink to netdev!\n");
910
		}
911
		wdev->netdev = dev;
J
Johannes Berg 已提交
912
#ifdef CONFIG_CFG80211_WEXT
913 914
		wdev->wext.default_key = -1;
		wdev->wext.default_mgmt_key = -1;
915
		wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
K
Kalle Valo 已提交
916 917
#endif

J
Johannes Berg 已提交
918
		if (wdev->wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT)
K
Kalle Valo 已提交
919
			wdev->ps = true;
J
Johannes Berg 已提交
920
		else
K
Kalle Valo 已提交
921
			wdev->ps = false;
922 923
		/* allow mac80211 to determine the timeout */
		wdev->ps_timeout = -1;
K
Kalle Valo 已提交
924

925
		netdev_set_default_ethtool_ops(dev, &cfg80211_ethtool_ops);
926 927

		if ((wdev->iftype == NL80211_IFTYPE_STATION ||
928
		     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT ||
929 930
		     wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr)
			dev->priv_flags |= IFF_DONT_BRIDGE;
931
		break;
J
Johannes Berg 已提交
932
	case NETDEV_GOING_DOWN:
933
		cfg80211_leave(rdev, wdev);
934 935
		break;
	case NETDEV_DOWN:
936
		cfg80211_update_iface_num(rdev, wdev->iftype, -1);
J
Johannes Berg 已提交
937 938 939
		if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
			if (WARN_ON(!rdev->scan_req->notified))
				rdev->scan_req->aborted = true;
940
			___cfg80211_scan_done(rdev, false);
J
Johannes Berg 已提交
941
		}
942 943 944 945 946 947 948 949

		if (WARN_ON(rdev->sched_scan_req &&
			    rdev->sched_scan_req->dev == wdev->netdev)) {
			__cfg80211_stop_sched_scan(rdev, false);
		}

		rdev->opencount--;
		wake_up(&rdev->dev_wait);
J
Johannes Berg 已提交
950 951
		break;
	case NETDEV_UP:
952
		cfg80211_update_iface_num(rdev, wdev->iftype, 1);
J
Johannes Berg 已提交
953
		wdev_lock(wdev);
954
		switch (wdev->iftype) {
955
#ifdef CONFIG_CFG80211_WEXT
956
		case NL80211_IFTYPE_ADHOC:
J
Johannes Berg 已提交
957
			cfg80211_ibss_wext_join(rdev, wdev);
J
Johannes Berg 已提交
958
			break;
959
		case NL80211_IFTYPE_STATION:
J
Johannes Berg 已提交
960
			cfg80211_mgd_wext_connect(rdev, wdev);
961
			break;
962
#endif
963
#ifdef CONFIG_MAC80211_MESH
964
		case NL80211_IFTYPE_MESH_POINT:
965 966 967 968 969 970 971 972 973 974 975 976 977 978 979
			{
				/* 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
980
		default:
J
Johannes Berg 已提交
981
			break;
982
		}
J
Johannes Berg 已提交
983
		wdev_unlock(wdev);
984
		rdev->opencount++;
985 986 987 988 989

		/*
		 * Configure power management to the driver here so that its
		 * correctly set also after interface type changes etc.
		 */
990 991
		if ((wdev->iftype == NL80211_IFTYPE_STATION ||
		     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
992
		    rdev->ops->set_power_mgmt)
993 994
			if (rdev_set_power_mgmt(rdev, dev, wdev->ps,
						wdev->ps_timeout)) {
995 996 997
				/* assume this means it's off */
				wdev->ps = false;
			}
998
		break;
999
	case NETDEV_UNREGISTER:
1000 1001 1002 1003 1004 1005 1006
		/*
		 * 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.
		 */
1007
		if (!list_empty(&wdev->list)) {
1008
			sysfs_remove_link(&dev->dev.kobj, "phy80211");
J
Johannes Berg 已提交
1009
			list_del_rcu(&wdev->list);
1010
			rdev->devlist_generation++;
1011
			cfg80211_mlme_purge_registrations(wdev);
J
Johannes Berg 已提交
1012
#ifdef CONFIG_CFG80211_WEXT
1013
			kfree(wdev->wext.keys);
J
Johannes Berg 已提交
1014
#endif
1015
		}
J
Johannes Berg 已提交
1016 1017 1018 1019 1020 1021 1022 1023
		/*
		 * 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);
1024 1025 1026 1027 1028
		/*
		 * Ensure that all events have been processed and
		 * freed.
		 */
		cfg80211_process_wdev_events(wdev);
1029 1030 1031 1032 1033 1034

		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;
		}
1035
		break;
J
Johannes Berg 已提交
1036
	case NETDEV_PRE_UP:
1037 1038
		if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
			return notifier_from_errno(-EOPNOTSUPP);
1039 1040
		if (rfkill_blocked(rdev->rfkill))
			return notifier_from_errno(-ERFKILL);
J
Johannes Berg 已提交
1041
		break;
1042 1043
	default:
		return NOTIFY_DONE;
1044 1045
	}

1046
	return NOTIFY_OK;
1047 1048 1049 1050 1051 1052
}

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

1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
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)
1070
{
1071 1072
	int err;

1073 1074 1075 1076
	err = register_pernet_device(&cfg80211_pernet_ops);
	if (err)
		goto out_fail_pernet;

1077
	err = wiphy_sysfs_init();
1078 1079 1080 1081 1082 1083 1084
	if (err)
		goto out_fail_sysfs;

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

1085 1086 1087 1088
	err = nl80211_init();
	if (err)
		goto out_fail_nl80211;

1089 1090
	ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);

1091 1092 1093 1094
	err = regulatory_init();
	if (err)
		goto out_fail_reg;

1095
	cfg80211_wq = create_singlethread_workqueue("cfg80211");
1096 1097
	if (!cfg80211_wq) {
		err = -ENOMEM;
1098
		goto out_fail_wq;
1099
	}
1100

1101 1102
	return 0;

1103 1104
out_fail_wq:
	regulatory_exit();
1105 1106
out_fail_reg:
	debugfs_remove(ieee80211_debugfs_dir);
1107 1108
out_fail_nl80211:
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
1109 1110 1111
out_fail_notifier:
	wiphy_sysfs_exit();
out_fail_sysfs:
1112 1113
	unregister_pernet_device(&cfg80211_pernet_ops);
out_fail_pernet:
1114 1115
	return err;
}
1116
subsys_initcall(cfg80211_init);
1117

1118
static void __exit cfg80211_exit(void)
1119 1120
{
	debugfs_remove(ieee80211_debugfs_dir);
1121
	nl80211_exit();
1122 1123
	unregister_netdevice_notifier(&cfg80211_netdev_notifier);
	wiphy_sysfs_exit();
1124
	regulatory_exit();
1125
	unregister_pernet_device(&cfg80211_pernet_ops);
1126
	destroy_workqueue(cfg80211_wq);
1127 1128
}
module_exit(cfg80211_exit);