core.c 27.6 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
	assert_cfg80211_lock();

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

	return result;
}

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

76
	return rdev->wiphy_idx;
77 78
}

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

	assert_cfg80211_lock();

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

92
struct cfg80211_registered_device *
93
cfg80211_get_dev_from_ifindex(struct net *net, int ifindex)
94
{
95
	struct cfg80211_registered_device *rdev = ERR_PTR(-ENODEV);
96 97
	struct net_device *dev;

98
	mutex_lock(&cfg80211_mutex);
99
	dev = dev_get_by_index(net, ifindex);
100 101 102
	if (!dev)
		goto out;
	if (dev->ieee80211_ptr) {
103 104
		rdev = wiphy_to_dev(dev->ieee80211_ptr->wiphy);
		mutex_lock(&rdev->mtx);
105
	} else
106
		rdev = ERR_PTR(-ENODEV);
107 108
	dev_put(dev);
 out:
109
	mutex_unlock(&cfg80211_mutex);
110
	return rdev;
111 112
}

113
/* requires cfg80211_mutex to be held */
114 115 116
int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
			char *newname)
{
117
	struct cfg80211_registered_device *rdev2;
118
	int wiphy_idx, taken = -1, result, digits;
119

120
	assert_cfg80211_lock();
121

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
	/* 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;
	}


138 139
	/* Ignore nop renames */
	if (strcmp(newname, dev_name(&rdev->wiphy.dev)) == 0)
140
		return 0;
141 142

	/* Ensure another device does not already have this name. */
143 144
	list_for_each_entry(rdev2, &cfg80211_rdev_list, list)
		if (strcmp(newname, dev_name(&rdev2->wiphy.dev)) == 0)
145
			return -EINVAL;
146 147 148

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

151 152
	if (rdev->wiphy.debugfsdir &&
	    !debugfs_rename(rdev->wiphy.debugfsdir->d_parent,
153 154 155
			    rdev->wiphy.debugfsdir,
			    rdev->wiphy.debugfsdir->d_parent,
			    newname))
156
		pr_err("failed to rename debugfs dir to %s!\n", newname);
157

158
	nl80211_notify_dev_rename(rdev);
159

160
	return 0;
161 162
}

163 164 165 166 167 168
int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
			  struct net *net)
{
	struct wireless_dev *wdev;
	int err = 0;

J
Johannes Berg 已提交
169
	if (!(rdev->wiphy.flags & WIPHY_FLAG_NETNS_OK))
170 171
		return -EOPNOTSUPP;

172
	list_for_each_entry(wdev, &rdev->wdev_list, list) {
173 174
		if (!wdev->netdev)
			continue;
175 176 177 178 179 180 181 182 183 184 185
		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);

186
		list_for_each_entry_continue_reverse(wdev, &rdev->wdev_list,
187
						     list) {
188 189
			if (!wdev->netdev)
				continue;
190 191 192 193 194 195
			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;
		}
196 197

		return err;
198 199 200 201
	}

	wiphy_net_set(&rdev->wiphy, net);

202 203 204 205
	err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
	WARN_ON(err);

	return 0;
206 207
}

J
Johannes Berg 已提交
208 209
static void cfg80211_rfkill_poll(struct rfkill *rfkill, void *data)
{
210
	struct cfg80211_registered_device *rdev = data;
J
Johannes Berg 已提交
211

212
	rdev_rfkill_poll(rdev);
J
Johannes Berg 已提交
213 214 215 216
}

static int cfg80211_rfkill_set_block(void *data, bool blocked)
{
217
	struct cfg80211_registered_device *rdev = data;
J
Johannes Berg 已提交
218 219 220 221 222 223
	struct wireless_dev *wdev;

	if (!blocked)
		return 0;

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

226 227
	list_for_each_entry(wdev, &rdev->wdev_list, list) {
		if (wdev->netdev) {
228
			dev_close(wdev->netdev);
229 230 231 232 233 234 235
			continue;
		}
		/* otherwise, check iftype */
		switch (wdev->iftype) {
		case NL80211_IFTYPE_P2P_DEVICE:
			if (!wdev->p2p_started)
				break;
236
			rdev_stop_p2p_device(rdev, wdev);
237 238 239 240 241 242 243
			wdev->p2p_started = false;
			rdev->opencount--;
			break;
		default:
			break;
		}
	}
J
Johannes Berg 已提交
244

245
	mutex_unlock(&rdev->devlist_mtx);
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 267 268
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);

269
	cfg80211_process_rdev_events(rdev);
J
Johannes Berg 已提交
270 271 272 273
	cfg80211_unlock_rdev(rdev);
	rtnl_unlock();
}

274 275
/* exported functions */

276
struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
277
{
278
	static int wiphy_counter;
279 280

	struct cfg80211_registered_device *rdev;
281 282
	int alloc_size;

283 284 285 286 287 288 289
	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);
290
	WARN_ON(ops->join_mesh && !ops->leave_mesh);
291

292
	alloc_size = sizeof(*rdev) + sizeof_priv;
293

294 295
	rdev = kzalloc(alloc_size, GFP_KERNEL);
	if (!rdev)
296 297
		return NULL;

298
	rdev->ops = ops;
299

300
	mutex_lock(&cfg80211_mutex);
301

302
	rdev->wiphy_idx = wiphy_counter++;
303

J
Johannes Berg 已提交
304
	if (unlikely(rdev->wiphy_idx < 0)) {
305
		wiphy_counter--;
306
		mutex_unlock(&cfg80211_mutex);
307
		/* ugh, wrapped! */
308
		kfree(rdev);
309 310 311
		return NULL;
	}

312
	mutex_unlock(&cfg80211_mutex);
313

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

317 318
	mutex_init(&rdev->mtx);
	mutex_init(&rdev->devlist_mtx);
319
	mutex_init(&rdev->sched_scan_mtx);
320
	INIT_LIST_HEAD(&rdev->wdev_list);
321 322
	INIT_LIST_HEAD(&rdev->beacon_registrations);
	spin_lock_init(&rdev->beacon_registrations_lock);
323 324 325
	spin_lock_init(&rdev->bss_lock);
	INIT_LIST_HEAD(&rdev->bss_list);
	INIT_WORK(&rdev->scan_done_wk, __cfg80211_scan_done);
326
	INIT_WORK(&rdev->sched_scan_results_wk, __cfg80211_sched_scan_results);
327 328
	INIT_DELAYED_WORK(&rdev->dfs_update_channels_wk,
			  cfg80211_dfs_channels_update_work);
J
Johannes Berg 已提交
329 330 331 332
#ifdef CONFIG_CFG80211_WEXT
	rdev->wiphy.wext = &cfg80211_wext_handler;
#endif

333 334 335 336
	device_initialize(&rdev->wiphy.dev);
	rdev->wiphy.dev.class = &ieee80211_class;
	rdev->wiphy.dev.platform_data = rdev;

J
Johannes Berg 已提交
337 338 339
#ifdef CONFIG_CFG80211_DEFAULT_PS
	rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
#endif
340

341 342
	wiphy_net_set(&rdev->wiphy, &init_net);

343 344 345 346 347 348 349
	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 已提交
350 351 352
		return NULL;
	}

353 354 355
	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 已提交
356

357 358
	init_waitqueue_head(&rdev->dev_wait);

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

370
	rdev->wiphy.features = NL80211_FEATURE_SCAN_FLUSH;
371

372
	return &rdev->wiphy;
373 374 375
}
EXPORT_SYMBOL(wiphy_new);

376 377 378 379 380 381 382 383 384 385 386
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];

387 388 389 390 391
		/*
		 * 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))
392 393 394 395 396 397
			return -EINVAL;

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

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

406 407 408 409 410
		/* DFS only works on one channel. */
		if (WARN_ON(c->radar_detect_widths &&
			    (c->num_different_channels > 1)))
			return -EINVAL;

411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
		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;

432 433 434 435 436
			/* Only a single P2P_DEVICE can be allowed */
			if (WARN_ON(types & BIT(NL80211_IFTYPE_P2P_DEVICE) &&
				    c->limits[j].max > 1))
				return -EINVAL;

437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
			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;
}

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

464
#ifdef CONFIG_PM
465 466 467
	if (WARN_ON((wiphy->wowlan.flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) &&
		    !(wiphy->wowlan.flags & WIPHY_WOWLAN_SUPPORTS_GTK_REKEY)))
		return -EINVAL;
468
#endif
469

J
Johannes Berg 已提交
470 471 472 473
	if (WARN_ON(wiphy->ap_sme_capa &&
		    !(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME)))
		return -EINVAL;

474 475 476 477 478 479 480 481 482
	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;

483 484 485 486 487
	if (WARN_ON(wiphy->max_acl_mac_addrs &&
		    (!(wiphy->flags & WIPHY_FLAG_HAVE_AP_SME) ||
		     !rdev->ops->set_mac_acl)))
		return -EINVAL;

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

491 492
	/* sanity check ifmodes */
	WARN_ON(!ifmodes);
493
	ifmodes &= ((1 << NUM_NL80211_IFTYPES) - 1) & ~1;
494 495
	if (WARN_ON(ifmodes != wiphy->interface_modes))
		wiphy->interface_modes = ifmodes;
496

497 498 499 500
	res = wiphy_verify_combinations(wiphy);
	if (res)
		return res;

501 502 503 504 505 506 507
	/* sanity check supported bands/channels */
	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
		sband = wiphy->bands[band];
		if (!sband)
			continue;

		sband->band = band;
508 509 510 511 512 513 514 515
		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))
516 517
			return -EINVAL;

518 519 520 521 522 523 524 525 526 527 528 529
		/*
		 * 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;
		}

530 531 532 533 534 535
		/*
		 * 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))
536 537 538 539 540
			return -EINVAL;

		for (i = 0; i < sband->n_channels; i++) {
			sband->channels[i].orig_flags =
				sband->channels[i].flags;
541
			sband->channels[i].orig_mag = INT_MAX;
542 543 544 545 546 547 548 549 550 551 552 553 554
			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;
	}

555
#ifdef CONFIG_PM
J
Johannes Berg 已提交
556 557 558 559 560 561
	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;
	}
562
#endif
J
Johannes Berg 已提交
563

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

567 568
	mutex_lock(&cfg80211_mutex);

569
	res = device_add(&rdev->wiphy.dev);
570 571 572 573
	if (res) {
		mutex_unlock(&cfg80211_mutex);
		return res;
	}
J
Johannes Berg 已提交
574

575
	/* set up regulatory info */
576
	wiphy_regulatory_register(wiphy);
577

J
Johannes Berg 已提交
578
	list_add_rcu(&rdev->list, &cfg80211_rdev_list);
579
	cfg80211_rdev_list_generation++;
580 581

	/* add to debugfs */
582 583
	rdev->wiphy.debugfsdir =
		debugfs_create_dir(wiphy_name(&rdev->wiphy),
584
				   ieee80211_debugfs_dir);
585 586
	if (IS_ERR(rdev->wiphy.debugfsdir))
		rdev->wiphy.debugfsdir = NULL;
587

J
Johannes Berg 已提交
588
	if (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY) {
589 590 591 592 593 594 595 596 597 598
		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);
	}

599
	cfg80211_debugfs_rdev_add(rdev);
600
	mutex_unlock(&cfg80211_mutex);
601

602 603 604 605 606 607 608 609
	/*
	 * 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;

610 611 612
	rtnl_lock();
	rdev->wiphy.registered = true;
	rtnl_unlock();
613
	return 0;
J
Johannes Berg 已提交
614

615
out_rm_dev:
616
	device_del(&rdev->wiphy.dev);
617 618 619 620
	return res;
}
EXPORT_SYMBOL(wiphy_register);

J
Johannes Berg 已提交
621 622
void wiphy_rfkill_start_polling(struct wiphy *wiphy)
{
623
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
J
Johannes Berg 已提交
624

625
	if (!rdev->ops->rfkill_poll)
J
Johannes Berg 已提交
626
		return;
627 628
	rdev->rfkill_ops.poll = cfg80211_rfkill_poll;
	rfkill_resume_polling(rdev->rfkill);
J
Johannes Berg 已提交
629 630 631 632 633
}
EXPORT_SYMBOL(wiphy_rfkill_start_polling);

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

636
	rfkill_pause_polling(rdev->rfkill);
J
Johannes Berg 已提交
637 638 639
}
EXPORT_SYMBOL(wiphy_rfkill_stop_polling);

640 641
void wiphy_unregister(struct wiphy *wiphy)
{
642
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
643

644 645 646 647
	rtnl_lock();
	rdev->wiphy.registered = false;
	rtnl_unlock();

648
	rfkill_unregister(rdev->rfkill);
J
Johannes Berg 已提交
649

650
	/* protect the device list */
651
	mutex_lock(&cfg80211_mutex);
652

653 654 655 656 657
	wait_event(rdev->dev_wait, ({
		int __count;
		mutex_lock(&rdev->devlist_mtx);
		__count = rdev->opencount;
		mutex_unlock(&rdev->devlist_mtx);
658
		__count == 0; }));
659 660

	mutex_lock(&rdev->devlist_mtx);
661
	BUG_ON(!list_empty(&rdev->wdev_list));
662 663 664 665 666 667
	mutex_unlock(&rdev->devlist_mtx);

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

	/*
673
	 * Try to grab rdev->mtx. If a command is still in progress,
674 675 676 677
	 * 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
678 679 680
	 * 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.
681
	 */
J
Johannes Berg 已提交
682
	cfg80211_lock_rdev(rdev);
683
	/* nothing */
J
Johannes Berg 已提交
684
	cfg80211_unlock_rdev(rdev);
685

686 687 688 689 690
	/*
	 * 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);
691

692
	cfg80211_rdev_list_generation++;
693
	device_del(&rdev->wiphy.dev);
694

695
	mutex_unlock(&cfg80211_mutex);
J
Johannes Berg 已提交
696

697
	flush_work(&rdev->scan_done_wk);
J
Johannes Berg 已提交
698 699
	cancel_work_sync(&rdev->conn_work);
	flush_work(&rdev->event_work);
700
	cancel_delayed_work_sync(&rdev->dfs_update_channels_wk);
701 702

	if (rdev->wowlan && rdev->ops->set_wakeup)
703
		rdev_set_wakeup(rdev, false);
704
	cfg80211_rdev_free_wowlan(rdev);
705 706 707
}
EXPORT_SYMBOL(wiphy_unregister);

708
void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
709
{
710
	struct cfg80211_internal_bss *scan, *tmp;
711
	struct cfg80211_beacon_registration *reg, *treg;
712 713 714
	rfkill_destroy(rdev->rfkill);
	mutex_destroy(&rdev->mtx);
	mutex_destroy(&rdev->devlist_mtx);
715
	mutex_destroy(&rdev->sched_scan_mtx);
716 717 718 719
	list_for_each_entry_safe(reg, treg, &rdev->beacon_registrations, list) {
		list_del(&reg->list);
		kfree(reg);
	}
720
	list_for_each_entry_safe(scan, tmp, &rdev->bss_list, list)
721
		cfg80211_put_bss(&rdev->wiphy, &scan->pub);
722
	kfree(rdev);
723 724 725 726 727 728 729 730
}

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

J
Johannes Berg 已提交
731 732
void wiphy_rfkill_set_hw_state(struct wiphy *wiphy, bool blocked)
{
733
	struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
J
Johannes Berg 已提交
734

735 736
	if (rfkill_set_hw_state(rdev->rfkill, blocked))
		schedule_work(&rdev->rfkill_sync);
J
Johannes Berg 已提交
737 738 739
}
EXPORT_SYMBOL(wiphy_rfkill_set_hw_state);

740 741 742 743 744 745 746 747 748 749
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 已提交
750
	if (WARN_ON(rdev->scan_req && rdev->scan_req->wdev == wdev)) {
751
		rdev->scan_req->aborted = true;
752
		___cfg80211_scan_done(rdev, true);
753 754
	}

755 756 757 758
	cfg80211_unlock_rdev(rdev);

	mutex_lock(&rdev->sched_scan_mtx);

759 760 761 762 763
	if (WARN_ON(rdev->sched_scan_req &&
		    rdev->sched_scan_req->dev == wdev->netdev)) {
		__cfg80211_stop_sched_scan(rdev, false);
	}

764
	mutex_unlock(&rdev->sched_scan_mtx);
765 766 767 768 769 770 771 772 773

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

	dev_put(wdev->netdev);
}

774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790
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;
791
		rdev_stop_p2p_device(rdev, wdev);
792 793 794 795 796 797 798 799 800 801 802
		wdev->p2p_started = false;
		rdev->opencount--;
		break;
	default:
		WARN_ON_ONCE(1);
		break;
	}
	mutex_unlock(&rdev->devlist_mtx);
}
EXPORT_SYMBOL(cfg80211_unregister_wdev);

803 804 805 806
static struct device_type wiphy_type = {
	.name	= "wlan",
};

807 808 809
void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
			       enum nl80211_iftype iftype, int num)
{
810
	ASSERT_RTNL();
811 812 813 814 815 816

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

817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856
void cfg80211_leave(struct cfg80211_registered_device *rdev,
		   struct wireless_dev *wdev)
{
	struct net_device *dev = wdev->netdev;

	switch (wdev->iftype) {
	case NL80211_IFTYPE_ADHOC:
		cfg80211_leave_ibss(rdev, dev, true);
		break;
	case NL80211_IFTYPE_P2P_CLIENT:
	case NL80211_IFTYPE_STATION:
		mutex_lock(&rdev->sched_scan_mtx);
		__cfg80211_stop_sched_scan(rdev, false);
		mutex_unlock(&rdev->sched_scan_mtx);

		wdev_lock(wdev);
#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
		__cfg80211_disconnect(rdev, dev,
				      WLAN_REASON_DEAUTH_LEAVING, true);
		cfg80211_mlme_down(rdev, dev);
		wdev_unlock(wdev);
		break;
	case NL80211_IFTYPE_MESH_POINT:
		cfg80211_leave_mesh(rdev, dev);
		break;
	case NL80211_IFTYPE_AP:
		cfg80211_stop_ap(rdev, dev);
		break;
	default:
		break;
	}

	wdev->beacon_interval = 0;
}

857
static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
858 859 860 861
					 unsigned long state,
					 void *ndev)
{
	struct net_device *dev = ndev;
862
	struct wireless_dev *wdev = dev->ieee80211_ptr;
863
	struct cfg80211_registered_device *rdev;
864
	int ret;
865

866
	if (!wdev)
J
Johannes Berg 已提交
867
		return NOTIFY_DONE;
868

869
	rdev = wiphy_to_dev(wdev->wiphy);
870

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

873
	switch (state) {
874 875 876
	case NETDEV_POST_INIT:
		SET_NETDEV_DEVTYPE(dev, &wiphy_type);
		break;
877
	case NETDEV_REGISTER:
J
Johannes Berg 已提交
878 879 880 881 882
		/*
		 * 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 已提交
883
		mutex_init(&wdev->mtx);
884
		INIT_WORK(&wdev->cleanup_work, wdev_cleanup_work);
J
Johannes Berg 已提交
885 886
		INIT_LIST_HEAD(&wdev->event_list);
		spin_lock_init(&wdev->event_lock);
887 888
		INIT_LIST_HEAD(&wdev->mgmt_registrations);
		spin_lock_init(&wdev->mgmt_registrations_lock);
889

890
		mutex_lock(&rdev->devlist_mtx);
891 892
		wdev->identifier = ++rdev->wdev_id;
		list_add_rcu(&wdev->list, &rdev->wdev_list);
893
		rdev->devlist_generation++;
894 895 896
		/* can only change netns with wiphy */
		dev->features |= NETIF_F_NETNS_LOCAL;

897 898
		if (sysfs_create_link(&dev->dev.kobj, &rdev->wiphy.dev.kobj,
				      "phy80211")) {
899
			pr_err("failed to add phy80211 symlink to netdev!\n");
900
		}
901
		wdev->netdev = dev;
S
Samuel Ortiz 已提交
902
		wdev->sme_state = CFG80211_SME_IDLE;
J
Johannes Berg 已提交
903
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
904
#ifdef CONFIG_CFG80211_WEXT
905 906
		wdev->wext.default_key = -1;
		wdev->wext.default_mgmt_key = -1;
907
		wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
K
Kalle Valo 已提交
908 909
#endif

J
Johannes Berg 已提交
910
		if (wdev->wiphy->flags & WIPHY_FLAG_PS_ON_BY_DEFAULT)
K
Kalle Valo 已提交
911
			wdev->ps = true;
J
Johannes Berg 已提交
912
		else
K
Kalle Valo 已提交
913
			wdev->ps = false;
914 915
		/* allow mac80211 to determine the timeout */
		wdev->ps_timeout = -1;
K
Kalle Valo 已提交
916

917
		netdev_set_default_ethtool_ops(dev, &cfg80211_ethtool_ops);
918 919

		if ((wdev->iftype == NL80211_IFTYPE_STATION ||
920
		     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT ||
921 922
		     wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr)
			dev->priv_flags |= IFF_DONT_BRIDGE;
923
		break;
J
Johannes Berg 已提交
924
	case NETDEV_GOING_DOWN:
925
		cfg80211_leave(rdev, wdev);
926 927
		break;
	case NETDEV_DOWN:
928
		cfg80211_update_iface_num(rdev, wdev->iftype, -1);
929
		dev_hold(dev);
930
		queue_work(cfg80211_wq, &wdev->cleanup_work);
J
Johannes Berg 已提交
931 932
		break;
	case NETDEV_UP:
933 934 935 936 937 938 939 940 941 942 943 944
		/*
		 * 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);
		}
945
		cfg80211_update_iface_num(rdev, wdev->iftype, 1);
J
Johannes Berg 已提交
946
		cfg80211_lock_rdev(rdev);
947
		mutex_lock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
948
		wdev_lock(wdev);
949
		switch (wdev->iftype) {
950
#ifdef CONFIG_CFG80211_WEXT
951
		case NL80211_IFTYPE_ADHOC:
J
Johannes Berg 已提交
952
			cfg80211_ibss_wext_join(rdev, wdev);
J
Johannes Berg 已提交
953
			break;
954
		case NL80211_IFTYPE_STATION:
J
Johannes Berg 已提交
955
			cfg80211_mgd_wext_connect(rdev, wdev);
956
			break;
957
#endif
958
#ifdef CONFIG_MAC80211_MESH
959
		case NL80211_IFTYPE_MESH_POINT:
960 961 962 963 964 965 966 967 968 969 970 971 972 973 974
			{
				/* 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
975
		default:
J
Johannes Berg 已提交
976
			break;
977
		}
J
Johannes Berg 已提交
978
		wdev_unlock(wdev);
979
		rdev->opencount++;
980
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
981
		cfg80211_unlock_rdev(rdev);
982 983 984 985 986

		/*
		 * Configure power management to the driver here so that its
		 * correctly set also after interface type changes etc.
		 */
987 988
		if ((wdev->iftype == NL80211_IFTYPE_STATION ||
		     wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
989
		    rdev->ops->set_power_mgmt)
990 991
			if (rdev_set_power_mgmt(rdev, dev, wdev->ps,
						wdev->ps_timeout)) {
992 993 994
				/* assume this means it's off */
				wdev->ps = false;
			}
995
		break;
996
	case NETDEV_UNREGISTER:
J
Johannes Berg 已提交
997 998 999 1000 1001
		/*
		 * NB: cannot take rdev->mtx here because this may be
		 * called within code protected by it when interfaces
		 * are removed with nl80211.
		 */
1002
		mutex_lock(&rdev->devlist_mtx);
1003 1004 1005 1006 1007 1008 1009
		/*
		 * 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.
		 */
1010
		if (!list_empty(&wdev->list)) {
1011
			sysfs_remove_link(&dev->dev.kobj, "phy80211");
J
Johannes Berg 已提交
1012
			list_del_rcu(&wdev->list);
1013
			rdev->devlist_generation++;
1014
			cfg80211_mlme_purge_registrations(wdev);
J
Johannes Berg 已提交
1015
#ifdef CONFIG_CFG80211_WEXT
1016
			kfree(wdev->wext.keys);
J
Johannes Berg 已提交
1017
#endif
1018 1019
		}
		mutex_unlock(&rdev->devlist_mtx);
J
Johannes Berg 已提交
1020 1021 1022 1023 1024 1025 1026 1027
		/*
		 * 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);
1028 1029 1030 1031 1032
		/*
		 * Ensure that all events have been processed and
		 * freed.
		 */
		cfg80211_process_wdev_events(wdev);
1033
		break;
J
Johannes Berg 已提交
1034
	case NETDEV_PRE_UP:
1035 1036
		if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype)))
			return notifier_from_errno(-EOPNOTSUPP);
J
Johannes Berg 已提交
1037 1038
		if (rfkill_blocked(rdev->rfkill))
			return notifier_from_errno(-ERFKILL);
1039
		mutex_lock(&rdev->devlist_mtx);
1040
		ret = cfg80211_can_add_interface(rdev, wdev->iftype);
1041
		mutex_unlock(&rdev->devlist_mtx);
1042 1043
		if (ret)
			return notifier_from_errno(ret);
J
Johannes Berg 已提交
1044
		break;
1045 1046
	}

J
Johannes Berg 已提交
1047
	return NOTIFY_DONE;
1048 1049 1050 1051 1052 1053
}

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

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

1076 1077 1078 1079
	err = register_pernet_device(&cfg80211_pernet_ops);
	if (err)
		goto out_fail_pernet;

1080
	err = wiphy_sysfs_init();
1081 1082 1083 1084 1085 1086 1087
	if (err)
		goto out_fail_sysfs;

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

1088 1089 1090 1091
	err = nl80211_init();
	if (err)
		goto out_fail_nl80211;

1092 1093
	ieee80211_debugfs_dir = debugfs_create_dir("ieee80211", NULL);

1094 1095 1096 1097
	err = regulatory_init();
	if (err)
		goto out_fail_reg;

1098 1099 1100 1101
	cfg80211_wq = create_singlethread_workqueue("cfg80211");
	if (!cfg80211_wq)
		goto out_fail_wq;

1102 1103
	return 0;

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

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