reg.c 92.8 KB
Newer Older
1 2 3 4
/*
 * Copyright 2002-2005, Instant802 Networks, Inc.
 * Copyright 2005-2006, Devicescape Software, Inc.
 * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
5
 * Copyright 2008-2011	Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
6
 * Copyright 2013-2014  Intel Mobile Communications GmbH
7
 * Copyright      2017  Intel Deutschland GmbH
8
 *
9 10 11 12 13 14 15 16 17 18 19
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 21
 */

22

23 24
/**
 * DOC: Wireless regulatory infrastructure
25 26 27 28 29 30
 *
 * The usual implementation is for a driver to read a device EEPROM to
 * determine which regulatory domain it should be operating under, then
 * looking up the allowable channels in a driver-local table and finally
 * registering those channels in the wiphy structure.
 *
31 32 33 34 35 36 37 38 39 40 41 42 43 44
 * Another set of compliance enforcement is for drivers to use their
 * own compliance limits which can be stored on the EEPROM. The host
 * driver or firmware may ensure these are used.
 *
 * In addition to all this we provide an extra layer of regulatory
 * conformance. For drivers which do not have any regulatory
 * information CRDA provides the complete regulatory solution.
 * For others it provides a community effort on further restrictions
 * to enhance compliance.
 *
 * Note: When number of rules --> infinity we will not be able to
 * index on alpha2 any more, instead we'll probably have to
 * rely on some SHA1 checksum of the regdomain for example.
 *
45
 */
46 47 48

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

49
#include <linux/kernel.h>
50
#include <linux/export.h>
51
#include <linux/slab.h>
52
#include <linux/list.h>
53
#include <linux/ctype.h>
54 55
#include <linux/nl80211.h>
#include <linux/platform_device.h>
56
#include <linux/moduleparam.h>
57
#include <linux/firmware.h>
58
#include <net/cfg80211.h>
59
#include "core.h"
60
#include "reg.h"
61
#include "rdev-ops.h"
62
#include "regdb.h"
63
#include "nl80211.h"
64

65 66 67 68 69 70
/*
 * Grace period we give before making sure all current interfaces reside on
 * channels allowed by the current regulatory domain.
 */
#define REG_ENFORCE_GRACE_MS 60000

71 72 73 74 75 76 77 78 79 80
/**
 * enum reg_request_treatment - regulatory request treatment
 *
 * @REG_REQ_OK: continue processing the regulatory request
 * @REG_REQ_IGNORE: ignore the regulatory request
 * @REG_REQ_INTERSECT: the regulatory domain resulting from this request should
 *	be intersected with the current one.
 * @REG_REQ_ALREADY_SET: the regulatory request will not change the current
 *	regulatory settings, and no further processing is required.
 */
81 82 83 84 85 86 87
enum reg_request_treatment {
	REG_REQ_OK,
	REG_REQ_IGNORE,
	REG_REQ_INTERSECT,
	REG_REQ_ALREADY_SET,
};

88 89 90 91 92 93 94 95 96
static struct regulatory_request core_request_world = {
	.initiator = NL80211_REGDOM_SET_BY_CORE,
	.alpha2[0] = '0',
	.alpha2[1] = '0',
	.intersect = false,
	.processed = true,
	.country_ie_env = ENVIRON_ANY,
};

J
Johannes Berg 已提交
97 98 99 100
/*
 * Receipt of information from last regulatory request,
 * protected by RTNL (and can be accessed with RCU protection)
 */
101
static struct regulatory_request __rcu *last_request =
102
	(void __force __rcu *)&core_request_world;
103

104
/* To trigger userspace events and load firmware */
105
static struct platform_device *reg_pdev;
106

107 108
/*
 * Central wireless core regulatory domains, we only need two,
109
 * the current one and a world regulatory domain in case we have no
110
 * information to give us an alpha2.
J
Johannes Berg 已提交
111
 * (protected by RTNL, can be read under RCU)
112
 */
113
const struct ieee80211_regdomain __rcu *cfg80211_regdomain;
114

115 116 117
/*
 * Number of devices that registered to the core
 * that support cellular base station regulatory hints
J
Johannes Berg 已提交
118
 * (protected by RTNL)
119 120 121
 */
static int reg_num_devs_support_basehint;

122 123 124 125 126 127
/*
 * State variable indicating if the platform on which the devices
 * are attached is operating in an indoor environment. The state variable
 * is relevant for all registered devices.
 */
static bool reg_is_indoor;
128 129 130 131
static spinlock_t reg_indoor_lock;

/* Used to track the userspace process controlling the indoor setting */
static u32 reg_is_indoor_portid;
132

133
static void restore_regulatory_settings(bool reset_user);
134

135 136
static const struct ieee80211_regdomain *get_cfg80211_regdom(void)
{
J
Johannes Berg 已提交
137
	return rtnl_dereference(cfg80211_regdomain);
138 139
}

140
const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy)
141
{
J
Johannes Berg 已提交
142
	return rtnl_dereference(wiphy->regd);
143 144
}

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
static const char *reg_dfs_region_str(enum nl80211_dfs_regions dfs_region)
{
	switch (dfs_region) {
	case NL80211_DFS_UNSET:
		return "unset";
	case NL80211_DFS_FCC:
		return "FCC";
	case NL80211_DFS_ETSI:
		return "ETSI";
	case NL80211_DFS_JP:
		return "JP";
	}
	return "Unknown";
}

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy)
{
	const struct ieee80211_regdomain *regd = NULL;
	const struct ieee80211_regdomain *wiphy_regd = NULL;

	regd = get_cfg80211_regdom();
	if (!wiphy)
		goto out;

	wiphy_regd = get_wiphy_regdom(wiphy);
	if (!wiphy_regd)
		goto out;

	if (wiphy_regd->dfs_region == regd->dfs_region)
		goto out;

176 177 178 179
	pr_debug("%s: device specific dfs_region (%s) disagrees with cfg80211's central dfs_region (%s)\n",
		 dev_name(&wiphy->dev),
		 reg_dfs_region_str(wiphy_regd->dfs_region),
		 reg_dfs_region_str(regd->dfs_region));
180 181 182 183 184

out:
	return regd->dfs_region;
}

185 186 187 188 189 190 191
static void rcu_free_regdom(const struct ieee80211_regdomain *r)
{
	if (!r)
		return;
	kfree_rcu((struct ieee80211_regdomain *)r, rcu_head);
}

192 193
static struct regulatory_request *get_last_request(void)
{
J
Johannes Berg 已提交
194
	return rcu_dereference_rtnl(last_request);
195 196
}

197
/* Used to queue up regulatory hints */
198 199 200
static LIST_HEAD(reg_requests_list);
static spinlock_t reg_requests_lock;

201 202 203 204 205 206 207 208 209 210 211 212
/* Used to queue up beacon hints for review */
static LIST_HEAD(reg_pending_beacons);
static spinlock_t reg_pending_beacons_lock;

/* Used to keep track of processed beacon hints */
static LIST_HEAD(reg_beacon_list);

struct reg_beacon {
	struct list_head list;
	struct ieee80211_channel chan;
};

213 214 215
static void reg_check_chans_work(struct work_struct *work);
static DECLARE_DELAYED_WORK(reg_check_chans, reg_check_chans_work);

216 217 218
static void reg_todo(struct work_struct *work);
static DECLARE_WORK(reg_work, reg_todo);

219 220
/* We keep a static world regulatory domain in case of the absence of CRDA */
static const struct ieee80211_regdomain world_regdom = {
221
	.n_reg_rules = 8,
222 223
	.alpha2 =  "00",
	.reg_rules = {
224 225
		/* IEEE 802.11b/g, channels 1..11 */
		REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
226
		/* IEEE 802.11b/g, channels 12..13. */
227 228
		REG_RULE(2467-10, 2472+10, 20, 6, 20,
			NL80211_RRF_NO_IR | NL80211_RRF_AUTO_BW),
229 230 231
		/* IEEE 802.11 channel 14 - Only JP enables
		 * this and for 802.11b only */
		REG_RULE(2484-10, 2484+10, 20, 6, 20,
232
			NL80211_RRF_NO_IR |
233 234
			NL80211_RRF_NO_OFDM),
		/* IEEE 802.11a, channel 36..48 */
235 236 237
		REG_RULE(5180-10, 5240+10, 80, 6, 20,
                        NL80211_RRF_NO_IR |
                        NL80211_RRF_AUTO_BW),
238

239
		/* IEEE 802.11a, channel 52..64 - DFS required */
240
		REG_RULE(5260-10, 5320+10, 80, 6, 20,
241
			NL80211_RRF_NO_IR |
242
			NL80211_RRF_AUTO_BW |
243 244 245 246
			NL80211_RRF_DFS),

		/* IEEE 802.11a, channel 100..144 - DFS required */
		REG_RULE(5500-10, 5720+10, 160, 6, 20,
247
			NL80211_RRF_NO_IR |
248
			NL80211_RRF_DFS),
249 250

		/* IEEE 802.11a, channel 149..165 */
251
		REG_RULE(5745-10, 5825+10, 80, 6, 20,
252
			NL80211_RRF_NO_IR),
253

J
Johannes Berg 已提交
254
		/* IEEE 802.11ad (60GHz), channels 1..3 */
255
		REG_RULE(56160+2160*1-1080, 56160+2160*3+1080, 2160, 0, 0, 0),
256 257 258
	}
};

J
Johannes Berg 已提交
259
/* protected by RTNL */
260 261
static const struct ieee80211_regdomain *cfg80211_world_regdom =
	&world_regdom;
262

263
static char *ieee80211_regdom = "00";
264
static char user_alpha2[2];
265

266 267 268
module_param(ieee80211_regdom, charp, 0444);
MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");

269
static void reg_free_request(struct regulatory_request *request)
270
{
271 272 273
	if (request == &core_request_world)
		return;

274 275 276 277 278 279 280 281
	if (request != get_last_request())
		kfree(request);
}

static void reg_free_last_request(void)
{
	struct regulatory_request *lr = get_last_request();

282 283 284 285
	if (lr != &core_request_world && lr)
		kfree_rcu(lr, rcu_head);
}

286 287
static void reg_update_last_request(struct regulatory_request *request)
{
288 289 290 291 292 293
	struct regulatory_request *lr;

	lr = get_last_request();
	if (lr == request)
		return;

294
	reg_free_last_request();
295 296 297
	rcu_assign_pointer(last_request, request);
}

298 299
static void reset_regdomains(bool full_reset,
			     const struct ieee80211_regdomain *new_regdom)
300
{
301 302
	const struct ieee80211_regdomain *r;

J
Johannes Berg 已提交
303
	ASSERT_RTNL();
304

305 306
	r = get_cfg80211_regdom();

307
	/* avoid freeing static information or freeing something twice */
308 309
	if (r == cfg80211_world_regdom)
		r = NULL;
310 311
	if (cfg80211_world_regdom == &world_regdom)
		cfg80211_world_regdom = NULL;
312 313
	if (r == &world_regdom)
		r = NULL;
314

315 316
	rcu_free_regdom(r);
	rcu_free_regdom(cfg80211_world_regdom);
317

318
	cfg80211_world_regdom = &world_regdom;
319
	rcu_assign_pointer(cfg80211_regdomain, new_regdom);
320 321 322 323

	if (!full_reset)
		return;

324
	reg_update_last_request(&core_request_world);
325 326
}

327 328 329 330
/*
 * Dynamic world regulatory domain requested by the wireless
 * core upon initialization
 */
331
static void update_world_regdomain(const struct ieee80211_regdomain *rd)
332
{
333
	struct regulatory_request *lr;
334

335 336 337
	lr = get_last_request();

	WARN_ON(!lr);
338

339
	reset_regdomains(false, rd);
340 341 342 343

	cfg80211_world_regdom = rd;
}

344
bool is_world_regdom(const char *alpha2)
345 346 347
{
	if (!alpha2)
		return false;
J
Johannes Berg 已提交
348
	return alpha2[0] == '0' && alpha2[1] == '0';
349
}
350

351
static bool is_alpha2_set(const char *alpha2)
352 353 354
{
	if (!alpha2)
		return false;
J
Johannes Berg 已提交
355
	return alpha2[0] && alpha2[1];
356
}
357

358
static bool is_unknown_alpha2(const char *alpha2)
359 360 361
{
	if (!alpha2)
		return false;
362 363 364 365
	/*
	 * Special case where regulatory domain was built by driver
	 * but a specific alpha2 cannot be determined
	 */
J
Johannes Berg 已提交
366
	return alpha2[0] == '9' && alpha2[1] == '9';
367
}
368

369 370 371 372
static bool is_intersected_alpha2(const char *alpha2)
{
	if (!alpha2)
		return false;
373 374
	/*
	 * Special case where regulatory domain is the
375
	 * result of an intersection between two regulatory domain
376 377
	 * structures
	 */
J
Johannes Berg 已提交
378
	return alpha2[0] == '9' && alpha2[1] == '8';
379 380
}

381
static bool is_an_alpha2(const char *alpha2)
382 383 384
{
	if (!alpha2)
		return false;
J
Johannes Berg 已提交
385
	return isalpha(alpha2[0]) && isalpha(alpha2[1]);
386
}
387

388
static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
389 390 391
{
	if (!alpha2_x || !alpha2_y)
		return false;
J
Johannes Berg 已提交
392
	return alpha2_x[0] == alpha2_y[0] && alpha2_x[1] == alpha2_y[1];
393 394
}

395
static bool regdom_changes(const char *alpha2)
396
{
397
	const struct ieee80211_regdomain *r = get_cfg80211_regdom();
398

399
	if (!r)
400
		return true;
401
	return !alpha2_equal(r->alpha2, alpha2);
402 403
}

404 405 406 407 408 409 410 411 412 413 414
/*
 * The NL80211_REGDOM_SET_BY_USER regdom alpha2 is cached, this lets
 * you know if a valid regulatory hint with NL80211_REGDOM_SET_BY_USER
 * has ever been issued.
 */
static bool is_user_regdom_saved(void)
{
	if (user_alpha2[0] == '9' && user_alpha2[1] == '7')
		return false;

	/* This would indicate a mistake on the design */
J
Johannes Berg 已提交
415
	if (WARN(!is_world_regdom(user_alpha2) && !is_an_alpha2(user_alpha2),
416
		 "Unexpected user alpha2: %c%c\n",
J
Johannes Berg 已提交
417
		 user_alpha2[0], user_alpha2[1]))
418 419 420 421 422
		return false;

	return true;
}

423 424
static const struct ieee80211_regdomain *
reg_copy_regd(const struct ieee80211_regdomain *src_regd)
425 426
{
	struct ieee80211_regdomain *regd;
427
	int size_of_regd;
428 429
	unsigned int i;

430 431 432
	size_of_regd =
		sizeof(struct ieee80211_regdomain) +
		src_regd->n_reg_rules * sizeof(struct ieee80211_reg_rule);
433 434 435

	regd = kzalloc(size_of_regd, GFP_KERNEL);
	if (!regd)
436
		return ERR_PTR(-ENOMEM);
437 438 439 440 441

	memcpy(regd, src_regd, sizeof(struct ieee80211_regdomain));

	for (i = 0; i < src_regd->n_reg_rules; i++)
		memcpy(&regd->reg_rules[i], &src_regd->reg_rules[i],
442
		       sizeof(struct ieee80211_reg_rule));
443

444
	return regd;
445 446
}

447
struct reg_regdb_apply_request {
448
	struct list_head list;
449
	const struct ieee80211_regdomain *regdom;
450 451
};

452 453
static LIST_HEAD(reg_regdb_apply_list);
static DEFINE_MUTEX(reg_regdb_apply_mutex);
454

455
static void reg_regdb_apply(struct work_struct *work)
456
{
457
	struct reg_regdb_apply_request *request;
458

459
	rtnl_lock();
460

461 462 463 464
	mutex_lock(&reg_regdb_apply_mutex);
	while (!list_empty(&reg_regdb_apply_list)) {
		request = list_first_entry(&reg_regdb_apply_list,
					   struct reg_regdb_apply_request,
465 466 467
					   list);
		list_del(&request->list);

468
		set_regdom(request->regdom, REGD_SOURCE_INTERNAL_DB);
469 470
		kfree(request);
	}
471
	mutex_unlock(&reg_regdb_apply_mutex);
472

473
	rtnl_unlock();
474 475
}

476
static DECLARE_WORK(reg_regdb_work, reg_regdb_apply);
477

478
static int reg_schedule_apply(const struct ieee80211_regdomain *regdom)
479
{
480
	struct reg_regdb_apply_request *request;
481

482
	request = kzalloc(sizeof(struct reg_regdb_apply_request), GFP_KERNEL);
483 484
	if (!request) {
		kfree(regdom);
485 486
		return -ENOMEM;
	}
487

488 489
	request->regdom = regdom;

490 491 492
	mutex_lock(&reg_regdb_apply_mutex);
	list_add_tail(&request->list, &reg_regdb_apply_list);
	mutex_unlock(&reg_regdb_apply_mutex);
493 494

	schedule_work(&reg_regdb_work);
495
	return 0;
496
}
497

498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
#ifdef CONFIG_CFG80211_INTERNAL_REGDB
static int reg_query_builtin(const char *alpha2)
{
	const struct ieee80211_regdomain *regdom = NULL;
	unsigned int i;

	for (i = 0; i < reg_regdb_size; i++) {
		if (alpha2_equal(alpha2, reg_regdb[i]->alpha2)) {
			regdom = reg_copy_regd(reg_regdb[i]);
			break;
		}
	}
	if (!regdom)
		return -ENODATA;

	return reg_schedule_apply(regdom);
}

516 517 518 519 520 521
/* Feel free to add any other sanity checks here */
static void reg_regdb_size_check(void)
{
	/* We should ideally BUILD_BUG_ON() but then random builds would fail */
	WARN_ONCE(!reg_regdb_size, "db.txt is empty, you should update it...");
}
522
#else
523
static inline void reg_regdb_size_check(void) {}
524
static inline int reg_query_builtin(const char *alpha2)
525 526 527
{
	return -ENODATA;
}
528 529
#endif /* CONFIG_CFG80211_INTERNAL_REGDB */

530 531 532 533 534 535 536 537 538 539 540
#ifdef CONFIG_CFG80211_CRDA_SUPPORT
/* Max number of consecutive attempts to communicate with CRDA  */
#define REG_MAX_CRDA_TIMEOUTS 10

static u32 reg_crda_timeouts;

static void crda_timeout_work(struct work_struct *work);
static DECLARE_DELAYED_WORK(crda_timeout, crda_timeout_work);

static void crda_timeout_work(struct work_struct *work)
{
541
	pr_debug("Timeout while waiting for CRDA to reply, restoring regulatory settings\n");
542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
	rtnl_lock();
	reg_crda_timeouts++;
	restore_regulatory_settings(true);
	rtnl_unlock();
}

static void cancel_crda_timeout(void)
{
	cancel_delayed_work(&crda_timeout);
}

static void cancel_crda_timeout_sync(void)
{
	cancel_delayed_work_sync(&crda_timeout);
}

static void reset_crda_timeouts(void)
{
	reg_crda_timeouts = 0;
}

563 564
/*
 * This lets us keep regulatory code which is updated on a regulatory
565
 * basis in userspace.
566
 */
567 568
static int call_crda(const char *alpha2)
{
569 570
	char country[12];
	char *env[] = { country, NULL };
571
	int ret;
572 573 574 575

	snprintf(country, sizeof(country), "COUNTRY=%c%c",
		 alpha2[0], alpha2[1]);

576
	if (reg_crda_timeouts > REG_MAX_CRDA_TIMEOUTS) {
577
		pr_debug("Exceeded CRDA call max attempts. Not calling CRDA\n");
578 579 580
		return -EINVAL;
	}

581
	if (!is_world_regdom((char *) alpha2))
582
		pr_debug("Calling CRDA for country: %c%c\n",
583
			 alpha2[0], alpha2[1]);
584
	else
585
		pr_debug("Calling CRDA to update world regulatory domain\n");
586

587 588 589 590 591
	ret = kobject_uevent_env(&reg_pdev->dev.kobj, KOBJ_CHANGE, env);
	if (ret)
		return ret;

	queue_delayed_work(system_power_efficient_wq,
592
			   &crda_timeout, msecs_to_jiffies(3142));
593
	return 0;
594
}
595 596 597 598 599 600 601 602 603
#else
static inline void cancel_crda_timeout(void) {}
static inline void cancel_crda_timeout_sync(void) {}
static inline void reset_crda_timeouts(void) {}
static inline int call_crda(const char *alpha2)
{
	return -ENODATA;
}
#endif /* CONFIG_CFG80211_CRDA_SUPPORT */
604

605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 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
/* code to directly load a firmware database through request_firmware */
static const struct fwdb_header *regdb;

struct fwdb_country {
	u8 alpha2[2];
	__be16 coll_ptr;
	/* this struct cannot be extended */
} __packed __aligned(4);

struct fwdb_collection {
	u8 len;
	u8 n_rules;
	u8 dfs_region;
	/* no optional data yet */
	/* aligned to 2, then followed by __be16 array of rule pointers */
} __packed __aligned(4);

enum fwdb_flags {
	FWDB_FLAG_NO_OFDM	= BIT(0),
	FWDB_FLAG_NO_OUTDOOR	= BIT(1),
	FWDB_FLAG_DFS		= BIT(2),
	FWDB_FLAG_NO_IR		= BIT(3),
	FWDB_FLAG_AUTO_BW	= BIT(4),
};

struct fwdb_rule {
	u8 len;
	u8 flags;
	__be16 max_eirp;
	__be32 start, end, max_bw;
	/* start of optional data */
	__be16 cac_timeout;
} __packed __aligned(4);

#define FWDB_MAGIC 0x52474442
#define FWDB_VERSION 20

struct fwdb_header {
	__be32 magic;
	__be32 version;
	struct fwdb_country country[];
} __packed __aligned(4);

static bool valid_rule(const u8 *data, unsigned int size, u16 rule_ptr)
{
	struct fwdb_rule *rule = (void *)(data + (rule_ptr << 2));

	if ((u8 *)rule + sizeof(rule->len) > data + size)
		return false;

	/* mandatory fields */
	if (rule->len < offsetofend(struct fwdb_rule, max_bw))
		return false;

	return true;
}

static bool valid_country(const u8 *data, unsigned int size,
			  const struct fwdb_country *country)
{
	unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
	struct fwdb_collection *coll = (void *)(data + ptr);
	__be16 *rules_ptr;
	unsigned int i;

	/* make sure we can read len/n_rules */
	if ((u8 *)coll + offsetofend(typeof(*coll), n_rules) > data + size)
		return false;

	/* make sure base struct and all rules fit */
	if ((u8 *)coll + ALIGN(coll->len, 2) +
	    (coll->n_rules * 2) > data + size)
		return false;

	/* mandatory fields must exist */
	if (coll->len < offsetofend(struct fwdb_collection, dfs_region))
		return false;

	rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));

	for (i = 0; i < coll->n_rules; i++) {
		u16 rule_ptr = be16_to_cpu(rules_ptr[i]);

		if (!valid_rule(data, size, rule_ptr))
			return false;
	}

	return true;
}

static bool valid_regdb(const u8 *data, unsigned int size)
{
	const struct fwdb_header *hdr = (void *)data;
	const struct fwdb_country *country;

	if (size < sizeof(*hdr))
		return false;

	if (hdr->magic != cpu_to_be32(FWDB_MAGIC))
		return false;

	if (hdr->version != cpu_to_be32(FWDB_VERSION))
		return false;

	country = &hdr->country[0];
	while ((u8 *)(country + 1) <= data + size) {
		if (!country->coll_ptr)
			break;
		if (!valid_country(data, size, country))
			return false;
		country++;
	}

	return true;
}

static int regdb_query_country(const struct fwdb_header *db,
			       const struct fwdb_country *country)
{
	unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
	struct fwdb_collection *coll = (void *)((u8 *)db + ptr);
	struct ieee80211_regdomain *regdom;
	unsigned int size_of_regd;
	unsigned int i;

	size_of_regd =
		sizeof(struct ieee80211_regdomain) +
		coll->n_rules * sizeof(struct ieee80211_reg_rule);

	regdom = kzalloc(size_of_regd, GFP_KERNEL);
	if (!regdom)
		return -ENOMEM;

	regdom->n_reg_rules = coll->n_rules;
	regdom->alpha2[0] = country->alpha2[0];
	regdom->alpha2[1] = country->alpha2[1];
	regdom->dfs_region = coll->dfs_region;

	for (i = 0; i < regdom->n_reg_rules; i++) {
		__be16 *rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
		unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2;
		struct fwdb_rule *rule = (void *)((u8 *)db + rule_ptr);
		struct ieee80211_reg_rule *rrule = &regdom->reg_rules[i];

		rrule->freq_range.start_freq_khz = be32_to_cpu(rule->start);
		rrule->freq_range.end_freq_khz = be32_to_cpu(rule->end);
		rrule->freq_range.max_bandwidth_khz = be32_to_cpu(rule->max_bw);

		rrule->power_rule.max_antenna_gain = 0;
		rrule->power_rule.max_eirp = be16_to_cpu(rule->max_eirp);

		rrule->flags = 0;
		if (rule->flags & FWDB_FLAG_NO_OFDM)
			rrule->flags |= NL80211_RRF_NO_OFDM;
		if (rule->flags & FWDB_FLAG_NO_OUTDOOR)
			rrule->flags |= NL80211_RRF_NO_OUTDOOR;
		if (rule->flags & FWDB_FLAG_DFS)
			rrule->flags |= NL80211_RRF_DFS;
		if (rule->flags & FWDB_FLAG_NO_IR)
			rrule->flags |= NL80211_RRF_NO_IR;
		if (rule->flags & FWDB_FLAG_AUTO_BW)
			rrule->flags |= NL80211_RRF_AUTO_BW;

		rrule->dfs_cac_ms = 0;

		/* handle optional data */
		if (rule->len >= offsetofend(struct fwdb_rule, cac_timeout))
			rrule->dfs_cac_ms =
				1000 * be16_to_cpu(rule->cac_timeout);
	}

	return reg_schedule_apply(regdom);
}

static int query_regdb(const char *alpha2)
{
	const struct fwdb_header *hdr = regdb;
	const struct fwdb_country *country;

	if (IS_ERR(regdb))
		return PTR_ERR(regdb);

	country = &hdr->country[0];
	while (country->coll_ptr) {
		if (alpha2_equal(alpha2, country->alpha2))
			return regdb_query_country(regdb, country);
		country++;
	}

	return -ENODATA;
}

static void regdb_fw_cb(const struct firmware *fw, void *context)
{
	void *db;

	if (!fw) {
		pr_info("failed to load regulatory.db\n");
		regdb = ERR_PTR(-ENODATA);
		goto restore;
	}

	if (!valid_regdb(fw->data, fw->size)) {
		pr_info("loaded regulatory.db is malformed\n");
		release_firmware(fw);
		regdb = ERR_PTR(-EINVAL);
		goto restore;
	}

	db = kmemdup(fw->data, fw->size, GFP_KERNEL);
	release_firmware(fw);

	if (!db)
		goto restore;
	regdb = db;

	if (query_regdb(context))
		goto restore;
	goto free;
 restore:
	rtnl_lock();
	restore_regulatory_settings(true);
	rtnl_unlock();
 free:
	kfree(context);
}

static int query_regdb_file(const char *alpha2)
{
	if (regdb)
		return query_regdb(alpha2);

	alpha2 = kmemdup(alpha2, 2, GFP_KERNEL);
	if (!alpha2)
		return -ENOMEM;

	return request_firmware_nowait(THIS_MODULE, true, "regulatory.db",
				       &reg_pdev->dev, GFP_KERNEL,
				       (void *)alpha2, regdb_fw_cb);
}

846
static bool reg_query_database(struct regulatory_request *request)
847
{
848
	/* query internal regulatory database (if it exists) */
849
	if (reg_query_builtin(request->alpha2) == 0)
850
		return true;
851

852 853 854
	if (query_regdb_file(request->alpha2) == 0)
		return true;

855 856 857 858
	if (call_crda(request->alpha2) == 0)
		return true;

	return false;
859 860
}

861
bool reg_is_valid_request(const char *alpha2)
862
{
863
	struct regulatory_request *lr = get_last_request();
864

865
	if (!lr || lr->processed)
866 867
		return false;

868
	return alpha2_equal(lr->alpha2, alpha2);
869
}
870

871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886
static const struct ieee80211_regdomain *reg_get_regdomain(struct wiphy *wiphy)
{
	struct regulatory_request *lr = get_last_request();

	/*
	 * Follow the driver's regulatory domain, if present, unless a country
	 * IE has been processed or a user wants to help complaince further
	 */
	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
	    lr->initiator != NL80211_REGDOM_SET_BY_USER &&
	    wiphy->regd)
		return get_wiphy_regdom(wiphy);

	return get_cfg80211_regdom();
}

887 888 889
static unsigned int
reg_get_max_bandwidth_from_range(const struct ieee80211_regdomain *rd,
				 const struct ieee80211_reg_rule *rule)
890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
{
	const struct ieee80211_freq_range *freq_range = &rule->freq_range;
	const struct ieee80211_freq_range *freq_range_tmp;
	const struct ieee80211_reg_rule *tmp;
	u32 start_freq, end_freq, idx, no;

	for (idx = 0; idx < rd->n_reg_rules; idx++)
		if (rule == &rd->reg_rules[idx])
			break;

	if (idx == rd->n_reg_rules)
		return 0;

	/* get start_freq */
	no = idx;

	while (no) {
		tmp = &rd->reg_rules[--no];
		freq_range_tmp = &tmp->freq_range;

		if (freq_range_tmp->end_freq_khz < freq_range->start_freq_khz)
			break;

		freq_range = freq_range_tmp;
	}

	start_freq = freq_range->start_freq_khz;

	/* get end_freq */
	freq_range = &rule->freq_range;
	no = idx;

	while (no < rd->n_reg_rules - 1) {
		tmp = &rd->reg_rules[++no];
		freq_range_tmp = &tmp->freq_range;

		if (freq_range_tmp->start_freq_khz > freq_range->end_freq_khz)
			break;

		freq_range = freq_range_tmp;
	}

	end_freq = freq_range->end_freq_khz;

	return end_freq - start_freq;
}

937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957
unsigned int reg_get_max_bandwidth(const struct ieee80211_regdomain *rd,
				   const struct ieee80211_reg_rule *rule)
{
	unsigned int bw = reg_get_max_bandwidth_from_range(rd, rule);

	if (rule->flags & NL80211_RRF_NO_160MHZ)
		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(80));
	if (rule->flags & NL80211_RRF_NO_80MHZ)
		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(40));

	/*
	 * HT40+/HT40- limits are handled per-channel. Only limit BW if both
	 * are not allowed.
	 */
	if (rule->flags & NL80211_RRF_NO_HT40MINUS &&
	    rule->flags & NL80211_RRF_NO_HT40PLUS)
		bw = min_t(unsigned int, bw, MHZ_TO_KHZ(20));

	return bw;
}

958
/* Sanity check on a regulatory rule */
959
static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)
960
{
961
	const struct ieee80211_freq_range *freq_range = &rule->freq_range;
962 963
	u32 freq_diff;

964
	if (freq_range->start_freq_khz <= 0 || freq_range->end_freq_khz <= 0)
965 966 967 968 969 970 971
		return false;

	if (freq_range->start_freq_khz > freq_range->end_freq_khz)
		return false;

	freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;

972
	if (freq_range->end_freq_khz <= freq_range->start_freq_khz ||
J
Johannes Berg 已提交
973
	    freq_range->max_bandwidth_khz > freq_diff)
974 975 976 977 978
		return false;

	return true;
}

979
static bool is_valid_rd(const struct ieee80211_regdomain *rd)
980
{
981
	const struct ieee80211_reg_rule *reg_rule = NULL;
982
	unsigned int i;
983

984 985
	if (!rd->n_reg_rules)
		return false;
986

987 988 989
	if (WARN_ON(rd->n_reg_rules > NL80211_MAX_SUPP_REG_RULES))
		return false;

990 991 992 993 994 995 996
	for (i = 0; i < rd->n_reg_rules; i++) {
		reg_rule = &rd->reg_rules[i];
		if (!is_valid_reg_rule(reg_rule))
			return false;
	}

	return true;
997 998
}

999 1000 1001 1002 1003 1004 1005
/**
 * freq_in_rule_band - tells us if a frequency is in a frequency band
 * @freq_range: frequency rule we want to query
 * @freq_khz: frequency we are inquiring about
 *
 * This lets us know if a specific frequency rule is or is not relevant to
 * a specific frequency's band. Bands are device specific and artificial
1006 1007 1008 1009 1010
 * definitions (the "2.4 GHz band", the "5 GHz band" and the "60GHz band"),
 * however it is safe for now to assume that a frequency rule should not be
 * part of a frequency's band if the start freq or end freq are off by more
 * than 2 GHz for the 2.4 and 5 GHz bands, and by more than 10 GHz for the
 * 60 GHz band.
1011 1012 1013 1014
 * This resolution can be lowered and should be considered as we add
 * regulatory rule support for other "bands".
 **/
static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
J
Johannes Berg 已提交
1015
			      u32 freq_khz)
1016 1017
{
#define ONE_GHZ_IN_KHZ	1000000
1018 1019 1020 1021 1022 1023 1024 1025
	/*
	 * From 802.11ad: directional multi-gigabit (DMG):
	 * Pertaining to operation in a frequency band containing a channel
	 * with the Channel starting frequency above 45 GHz.
	 */
	u32 limit = freq_khz > 45 * ONE_GHZ_IN_KHZ ?
			10 * ONE_GHZ_IN_KHZ : 2 * ONE_GHZ_IN_KHZ;
	if (abs(freq_khz - freq_range->start_freq_khz) <= limit)
1026
		return true;
1027
	if (abs(freq_khz - freq_range->end_freq_khz) <= limit)
1028 1029 1030 1031 1032
		return true;
	return false;
#undef ONE_GHZ_IN_KHZ
}

1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046
/*
 * Later on we can perhaps use the more restrictive DFS
 * region but we don't have information for that yet so
 * for now simply disallow conflicts.
 */
static enum nl80211_dfs_regions
reg_intersect_dfs_region(const enum nl80211_dfs_regions dfs_region1,
			 const enum nl80211_dfs_regions dfs_region2)
{
	if (dfs_region1 != dfs_region2)
		return NL80211_DFS_UNSET;
	return dfs_region1;
}

1047 1048 1049 1050
/*
 * Helper for regdom_intersect(), this does the real
 * mathematical intersection fun
 */
1051 1052 1053
static int reg_rules_intersect(const struct ieee80211_regdomain *rd1,
			       const struct ieee80211_regdomain *rd2,
			       const struct ieee80211_reg_rule *rule1,
J
Johannes Berg 已提交
1054 1055
			       const struct ieee80211_reg_rule *rule2,
			       struct ieee80211_reg_rule *intersected_rule)
1056 1057 1058 1059 1060
{
	const struct ieee80211_freq_range *freq_range1, *freq_range2;
	struct ieee80211_freq_range *freq_range;
	const struct ieee80211_power_rule *power_rule1, *power_rule2;
	struct ieee80211_power_rule *power_rule;
1061
	u32 freq_diff, max_bandwidth1, max_bandwidth2;
1062 1063 1064 1065 1066 1067 1068 1069 1070 1071

	freq_range1 = &rule1->freq_range;
	freq_range2 = &rule2->freq_range;
	freq_range = &intersected_rule->freq_range;

	power_rule1 = &rule1->power_rule;
	power_rule2 = &rule2->power_rule;
	power_rule = &intersected_rule->power_rule;

	freq_range->start_freq_khz = max(freq_range1->start_freq_khz,
J
Johannes Berg 已提交
1072
					 freq_range2->start_freq_khz);
1073
	freq_range->end_freq_khz = min(freq_range1->end_freq_khz,
J
Johannes Berg 已提交
1074
				       freq_range2->end_freq_khz);
1075 1076 1077 1078

	max_bandwidth1 = freq_range1->max_bandwidth_khz;
	max_bandwidth2 = freq_range2->max_bandwidth_khz;

1079 1080 1081 1082
	if (rule1->flags & NL80211_RRF_AUTO_BW)
		max_bandwidth1 = reg_get_max_bandwidth(rd1, rule1);
	if (rule2->flags & NL80211_RRF_AUTO_BW)
		max_bandwidth2 = reg_get_max_bandwidth(rd2, rule2);
1083 1084

	freq_range->max_bandwidth_khz = min(max_bandwidth1, max_bandwidth2);
1085

1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
	intersected_rule->flags = rule1->flags | rule2->flags;

	/*
	 * In case NL80211_RRF_AUTO_BW requested for both rules
	 * set AUTO_BW in intersected rule also. Next we will
	 * calculate BW correctly in handle_channel function.
	 * In other case remove AUTO_BW flag while we calculate
	 * maximum bandwidth correctly and auto calculation is
	 * not required.
	 */
	if ((rule1->flags & NL80211_RRF_AUTO_BW) &&
	    (rule2->flags & NL80211_RRF_AUTO_BW))
		intersected_rule->flags |= NL80211_RRF_AUTO_BW;
	else
		intersected_rule->flags &= ~NL80211_RRF_AUTO_BW;

1102 1103 1104 1105 1106 1107 1108 1109 1110
	freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
	if (freq_range->max_bandwidth_khz > freq_diff)
		freq_range->max_bandwidth_khz = freq_diff;

	power_rule->max_eirp = min(power_rule1->max_eirp,
		power_rule2->max_eirp);
	power_rule->max_antenna_gain = min(power_rule1->max_antenna_gain,
		power_rule2->max_antenna_gain);

1111 1112 1113
	intersected_rule->dfs_cac_ms = max(rule1->dfs_cac_ms,
					   rule2->dfs_cac_ms);

1114 1115 1116 1117 1118 1119
	if (!is_valid_reg_rule(intersected_rule))
		return -EINVAL;

	return 0;
}

1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
/* check whether old rule contains new rule */
static bool rule_contains(struct ieee80211_reg_rule *r1,
			  struct ieee80211_reg_rule *r2)
{
	/* for simplicity, currently consider only same flags */
	if (r1->flags != r2->flags)
		return false;

	/* verify r1 is more restrictive */
	if ((r1->power_rule.max_antenna_gain >
	     r2->power_rule.max_antenna_gain) ||
	    r1->power_rule.max_eirp > r2->power_rule.max_eirp)
		return false;

	/* make sure r2's range is contained within r1 */
	if (r1->freq_range.start_freq_khz > r2->freq_range.start_freq_khz ||
	    r1->freq_range.end_freq_khz < r2->freq_range.end_freq_khz)
		return false;

	/* and finally verify that r1.max_bw >= r2.max_bw */
	if (r1->freq_range.max_bandwidth_khz <
	    r2->freq_range.max_bandwidth_khz)
		return false;

	return true;
}

/* add or extend current rules. do nothing if rule is already contained */
static void add_rule(struct ieee80211_reg_rule *rule,
		     struct ieee80211_reg_rule *reg_rules, u32 *n_rules)
{
	struct ieee80211_reg_rule *tmp_rule;
	int i;

	for (i = 0; i < *n_rules; i++) {
		tmp_rule = &reg_rules[i];
		/* rule is already contained - do nothing */
		if (rule_contains(tmp_rule, rule))
			return;

		/* extend rule if possible */
		if (rule_contains(rule, tmp_rule)) {
			memcpy(tmp_rule, rule, sizeof(*rule));
			return;
		}
	}

	memcpy(&reg_rules[*n_rules], rule, sizeof(*rule));
	(*n_rules)++;
}

1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
/**
 * regdom_intersect - do the intersection between two regulatory domains
 * @rd1: first regulatory domain
 * @rd2: second regulatory domain
 *
 * Use this function to get the intersection between two regulatory domains.
 * Once completed we will mark the alpha2 for the rd as intersected, "98",
 * as no one single alpha2 can represent this regulatory domain.
 *
 * Returns a pointer to the regulatory domain structure which will hold the
 * resulting intersection of rules between rd1 and rd2. We will
 * kzalloc() this structure for you.
 */
J
Johannes Berg 已提交
1184 1185 1186
static struct ieee80211_regdomain *
regdom_intersect(const struct ieee80211_regdomain *rd1,
		 const struct ieee80211_regdomain *rd2)
1187 1188 1189
{
	int r, size_of_regd;
	unsigned int x, y;
1190
	unsigned int num_rules = 0;
1191
	const struct ieee80211_reg_rule *rule1, *rule2;
1192
	struct ieee80211_reg_rule intersected_rule;
1193 1194 1195 1196 1197
	struct ieee80211_regdomain *rd;

	if (!rd1 || !rd2)
		return NULL;

1198 1199
	/*
	 * First we get a count of the rules we'll need, then we actually
1200 1201 1202
	 * build them. This is to so we can malloc() and free() a
	 * regdomain once. The reason we use reg_rules_intersect() here
	 * is it will return -EINVAL if the rule computed makes no sense.
1203 1204
	 * All rules that do check out OK are valid.
	 */
1205 1206 1207 1208 1209

	for (x = 0; x < rd1->n_reg_rules; x++) {
		rule1 = &rd1->reg_rules[x];
		for (y = 0; y < rd2->n_reg_rules; y++) {
			rule2 = &rd2->reg_rules[y];
1210
			if (!reg_rules_intersect(rd1, rd2, rule1, rule2,
1211
						 &intersected_rule))
1212 1213 1214 1215 1216 1217 1218 1219
				num_rules++;
		}
	}

	if (!num_rules)
		return NULL;

	size_of_regd = sizeof(struct ieee80211_regdomain) +
1220
		       num_rules * sizeof(struct ieee80211_reg_rule);
1221 1222 1223 1224 1225

	rd = kzalloc(size_of_regd, GFP_KERNEL);
	if (!rd)
		return NULL;

1226
	for (x = 0; x < rd1->n_reg_rules; x++) {
1227
		rule1 = &rd1->reg_rules[x];
1228
		for (y = 0; y < rd2->n_reg_rules; y++) {
1229
			rule2 = &rd2->reg_rules[y];
1230
			r = reg_rules_intersect(rd1, rd2, rule1, rule2,
1231
						&intersected_rule);
1232 1233 1234 1235
			/*
			 * No need to memset here the intersected rule here as
			 * we're not using the stack anymore
			 */
1236 1237 1238
			if (r)
				continue;

1239 1240 1241
			add_rule(&intersected_rule, rd->reg_rules,
				 &rd->n_reg_rules);
		}
1242 1243 1244 1245
	}

	rd->alpha2[0] = '9';
	rd->alpha2[1] = '8';
1246 1247
	rd->dfs_region = reg_intersect_dfs_region(rd1->dfs_region,
						  rd2->dfs_region);
1248 1249 1250 1251

	return rd;
}

1252 1253 1254 1255
/*
 * XXX: add support for the rest of enum nl80211_reg_rule_flags, we may
 * want to just have the channel structure use these
 */
1256 1257 1258
static u32 map_regdom_flags(u32 rd_flags)
{
	u32 channel_flags = 0;
1259 1260
	if (rd_flags & NL80211_RRF_NO_IR_ALL)
		channel_flags |= IEEE80211_CHAN_NO_IR;
1261 1262
	if (rd_flags & NL80211_RRF_DFS)
		channel_flags |= IEEE80211_CHAN_RADAR;
1263 1264
	if (rd_flags & NL80211_RRF_NO_OFDM)
		channel_flags |= IEEE80211_CHAN_NO_OFDM;
1265 1266
	if (rd_flags & NL80211_RRF_NO_OUTDOOR)
		channel_flags |= IEEE80211_CHAN_INDOOR_ONLY;
1267 1268
	if (rd_flags & NL80211_RRF_IR_CONCURRENT)
		channel_flags |= IEEE80211_CHAN_IR_CONCURRENT;
1269 1270 1271 1272 1273 1274 1275 1276
	if (rd_flags & NL80211_RRF_NO_HT40MINUS)
		channel_flags |= IEEE80211_CHAN_NO_HT40MINUS;
	if (rd_flags & NL80211_RRF_NO_HT40PLUS)
		channel_flags |= IEEE80211_CHAN_NO_HT40PLUS;
	if (rd_flags & NL80211_RRF_NO_80MHZ)
		channel_flags |= IEEE80211_CHAN_NO_80MHZ;
	if (rd_flags & NL80211_RRF_NO_160MHZ)
		channel_flags |= IEEE80211_CHAN_NO_160MHZ;
1277 1278 1279
	return channel_flags;
}

1280
static const struct ieee80211_reg_rule *
1281
freq_reg_info_regd(u32 center_freq,
1282
		   const struct ieee80211_regdomain *regd, u32 bw)
1283 1284
{
	int i;
1285
	bool band_rule_found = false;
1286 1287
	bool bw_fits = false;

1288
	if (!regd)
1289
		return ERR_PTR(-EINVAL);
1290

1291
	for (i = 0; i < regd->n_reg_rules; i++) {
1292 1293 1294
		const struct ieee80211_reg_rule *rr;
		const struct ieee80211_freq_range *fr = NULL;

1295
		rr = &regd->reg_rules[i];
1296
		fr = &rr->freq_range;
1297

1298 1299
		/*
		 * We only need to know if one frequency rule was
1300
		 * was in center_freq's band, that's enough, so lets
1301 1302
		 * not overwrite it once found
		 */
1303 1304 1305
		if (!band_rule_found)
			band_rule_found = freq_in_rule_band(fr, center_freq);

1306
		bw_fits = cfg80211_does_bw_fit_range(fr, center_freq, bw);
1307

1308 1309
		if (band_rule_found && bw_fits)
			return rr;
1310 1311
	}

1312
	if (!band_rule_found)
1313
		return ERR_PTR(-ERANGE);
1314

1315
	return ERR_PTR(-EINVAL);
1316 1317
}

1318 1319
static const struct ieee80211_reg_rule *
__freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 min_bw)
1320
{
1321 1322 1323
	const struct ieee80211_regdomain *regd = reg_get_regdomain(wiphy);
	const struct ieee80211_reg_rule *reg_rule = NULL;
	u32 bw;
J
Johannes Berg 已提交
1324

1325
	for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) {
1326
		reg_rule = freq_reg_info_regd(center_freq, regd, bw);
1327 1328 1329
		if (!IS_ERR(reg_rule))
			return reg_rule;
	}
1330

1331 1332 1333 1334 1335 1336 1337
	return reg_rule;
}

const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
					       u32 center_freq)
{
	return __freq_reg_info(wiphy, center_freq, MHZ_TO_KHZ(20));
1338
}
1339
EXPORT_SYMBOL(freq_reg_info);
1340

1341
const char *reg_initiator_name(enum nl80211_reg_initiator initiator)
1342 1343 1344
{
	switch (initiator) {
	case NL80211_REGDOM_SET_BY_CORE:
1345
		return "core";
1346
	case NL80211_REGDOM_SET_BY_USER:
1347
		return "user";
1348
	case NL80211_REGDOM_SET_BY_DRIVER:
1349
		return "driver";
1350
	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
1351
		return "country IE";
1352 1353
	default:
		WARN_ON(1);
1354
		return "bug";
1355 1356
	}
}
1357
EXPORT_SYMBOL(reg_initiator_name);
1358

1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373
static uint32_t reg_rule_to_chan_bw_flags(const struct ieee80211_regdomain *regd,
					  const struct ieee80211_reg_rule *reg_rule,
					  const struct ieee80211_channel *chan)
{
	const struct ieee80211_freq_range *freq_range = NULL;
	u32 max_bandwidth_khz, bw_flags = 0;

	freq_range = &reg_rule->freq_range;

	max_bandwidth_khz = freq_range->max_bandwidth_khz;
	/* Check if auto calculation requested */
	if (reg_rule->flags & NL80211_RRF_AUTO_BW)
		max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule);

	/* If we get a reg_rule we can assume that at least 5Mhz fit */
1374 1375 1376
	if (!cfg80211_does_bw_fit_range(freq_range,
					MHZ_TO_KHZ(chan->center_freq),
					MHZ_TO_KHZ(10)))
1377
		bw_flags |= IEEE80211_CHAN_NO_10MHZ;
1378 1379 1380
	if (!cfg80211_does_bw_fit_range(freq_range,
					MHZ_TO_KHZ(chan->center_freq),
					MHZ_TO_KHZ(20)))
1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395
		bw_flags |= IEEE80211_CHAN_NO_20MHZ;

	if (max_bandwidth_khz < MHZ_TO_KHZ(10))
		bw_flags |= IEEE80211_CHAN_NO_10MHZ;
	if (max_bandwidth_khz < MHZ_TO_KHZ(20))
		bw_flags |= IEEE80211_CHAN_NO_20MHZ;
	if (max_bandwidth_khz < MHZ_TO_KHZ(40))
		bw_flags |= IEEE80211_CHAN_NO_HT40;
	if (max_bandwidth_khz < MHZ_TO_KHZ(80))
		bw_flags |= IEEE80211_CHAN_NO_80MHZ;
	if (max_bandwidth_khz < MHZ_TO_KHZ(160))
		bw_flags |= IEEE80211_CHAN_NO_160MHZ;
	return bw_flags;
}

1396 1397 1398 1399
/*
 * Note that right now we assume the desired channel bandwidth
 * is always 20 MHz for each individual channel (HT40 uses 20 MHz
 * per channel, the primary and the extension channel).
1400
 */
1401 1402
static void handle_channel(struct wiphy *wiphy,
			   enum nl80211_reg_initiator initiator,
J
Johannes Berg 已提交
1403
			   struct ieee80211_channel *chan)
1404
{
1405
	u32 flags, bw_flags = 0;
1406 1407
	const struct ieee80211_reg_rule *reg_rule = NULL;
	const struct ieee80211_power_rule *power_rule = NULL;
1408
	struct wiphy *request_wiphy = NULL;
1409
	struct regulatory_request *lr = get_last_request();
1410
	const struct ieee80211_regdomain *regd;
1411

1412
	request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
1413 1414

	flags = chan->orig_flags;
1415

1416 1417
	reg_rule = freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
	if (IS_ERR(reg_rule)) {
1418 1419
		/*
		 * We will disable all channels that do not match our
L
Lucas De Marchi 已提交
1420
		 * received regulatory rule unless the hint is coming
1421 1422 1423 1424 1425 1426 1427 1428
		 * from a Country IE and the Country IE had no information
		 * about a band. The IEEE 802.11 spec allows for an AP
		 * to send only a subset of the regulatory rules allowed,
		 * so an AP in the US that only supports 2.4 GHz may only send
		 * a country IE with information for the 2.4 GHz band
		 * while 5 GHz is still supported.
		 */
		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1429
		    PTR_ERR(reg_rule) == -ERANGE)
1430 1431
			return;

1432 1433
		if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
		    request_wiphy && request_wiphy == wiphy &&
1434
		    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
1435 1436
			pr_debug("Disabling freq %d MHz for good\n",
				 chan->center_freq);
1437 1438 1439
			chan->orig_flags |= IEEE80211_CHAN_DISABLED;
			chan->flags = chan->orig_flags;
		} else {
1440 1441
			pr_debug("Disabling freq %d MHz\n",
				 chan->center_freq);
1442 1443
			chan->flags |= IEEE80211_CHAN_DISABLED;
		}
1444
		return;
1445
	}
1446

1447
	regd = reg_get_regdomain(wiphy);
1448

1449
	power_rule = &reg_rule->power_rule;
1450
	bw_flags = reg_rule_to_chan_bw_flags(regd, reg_rule, chan);
1451

1452
	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
1453
	    request_wiphy && request_wiphy == wiphy &&
1454
	    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
1455
		/*
L
Lucas De Marchi 已提交
1456
		 * This guarantees the driver's requested regulatory domain
1457
		 * will always be used as a base for further regulatory
1458 1459
		 * settings
		 */
1460
		chan->flags = chan->orig_flags =
1461
			map_regdom_flags(reg_rule->flags) | bw_flags;
1462 1463
		chan->max_antenna_gain = chan->orig_mag =
			(int) MBI_TO_DBI(power_rule->max_antenna_gain);
1464
		chan->max_reg_power = chan->max_power = chan->orig_mpwr =
1465
			(int) MBM_TO_DBM(power_rule->max_eirp);
1466 1467 1468 1469 1470 1471 1472

		if (chan->flags & IEEE80211_CHAN_RADAR) {
			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
			if (reg_rule->dfs_cac_ms)
				chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
		}

1473 1474 1475
		return;
	}

1476 1477 1478
	chan->dfs_state = NL80211_DFS_USABLE;
	chan->dfs_state_entered = jiffies;

1479
	chan->beacon_found = false;
1480
	chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
J
Johannes Berg 已提交
1481 1482 1483
	chan->max_antenna_gain =
		min_t(int, chan->orig_mag,
		      MBI_TO_DBI(power_rule->max_antenna_gain));
1484
	chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp);
1485 1486 1487 1488 1489 1490 1491 1492

	if (chan->flags & IEEE80211_CHAN_RADAR) {
		if (reg_rule->dfs_cac_ms)
			chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
		else
			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
	}

1493 1494
	if (chan->orig_mpwr) {
		/*
1495 1496
		 * Devices that use REGULATORY_COUNTRY_IE_FOLLOW_POWER
		 * will always follow the passed country IE power settings.
1497 1498
		 */
		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1499
		    wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER)
1500 1501 1502 1503 1504 1505
			chan->max_power = chan->max_reg_power;
		else
			chan->max_power = min(chan->orig_mpwr,
					      chan->max_reg_power);
	} else
		chan->max_power = chan->max_reg_power;
1506 1507
}

1508
static void handle_band(struct wiphy *wiphy,
J
Johannes Berg 已提交
1509 1510
			enum nl80211_reg_initiator initiator,
			struct ieee80211_supported_band *sband)
1511
{
1512 1513
	unsigned int i;

J
Johannes Berg 已提交
1514 1515
	if (!sband)
		return;
1516 1517

	for (i = 0; i < sband->n_channels; i++)
J
Johannes Berg 已提交
1518
		handle_channel(wiphy, initiator, &sband->channels[i]);
1519 1520
}

1521 1522 1523 1524
static bool reg_request_cell_base(struct regulatory_request *request)
{
	if (request->initiator != NL80211_REGDOM_SET_BY_USER)
		return false;
J
Johannes Berg 已提交
1525
	return request->user_reg_hint_type == NL80211_USER_REG_HINT_CELL_BASE;
1526 1527 1528 1529
}

bool reg_last_request_cell_base(void)
{
J
Johannes Berg 已提交
1530
	return reg_request_cell_base(get_last_request());
1531 1532
}

1533
#ifdef CONFIG_CFG80211_REG_CELLULAR_HINTS
1534
/* Core specific check */
1535 1536
static enum reg_request_treatment
reg_ignore_cell_hint(struct regulatory_request *pending_request)
1537
{
1538 1539
	struct regulatory_request *lr = get_last_request();

1540
	if (!reg_num_devs_support_basehint)
1541
		return REG_REQ_IGNORE;
1542

1543
	if (reg_request_cell_base(lr) &&
J
Johannes Berg 已提交
1544
	    !regdom_changes(pending_request->alpha2))
1545
		return REG_REQ_ALREADY_SET;
J
Johannes Berg 已提交
1546

1547
	return REG_REQ_OK;
1548 1549 1550 1551 1552
}

/* Device specific check */
static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
{
J
Johannes Berg 已提交
1553
	return !(wiphy->features & NL80211_FEATURE_CELL_BASE_REG_HINTS);
1554 1555
}
#else
1556 1557
static enum reg_request_treatment
reg_ignore_cell_hint(struct regulatory_request *pending_request)
1558
{
1559
	return REG_REQ_IGNORE;
1560
}
J
Johannes Berg 已提交
1561 1562

static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
1563 1564 1565 1566 1567
{
	return true;
}
#endif

1568 1569
static bool wiphy_strict_alpha2_regd(struct wiphy *wiphy)
{
1570 1571
	if (wiphy->regulatory_flags & REGULATORY_STRICT_REG &&
	    !(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG))
1572 1573 1574
		return true;
	return false;
}
1575

1576 1577
static bool ignore_reg_update(struct wiphy *wiphy,
			      enum nl80211_reg_initiator initiator)
1578
{
1579 1580
	struct regulatory_request *lr = get_last_request();

1581 1582 1583
	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
		return true;

1584
	if (!lr) {
1585 1586
		pr_debug("Ignoring regulatory request set by %s since last_request is not set\n",
			 reg_initiator_name(initiator));
1587
		return true;
1588 1589
	}

1590
	if (initiator == NL80211_REGDOM_SET_BY_CORE &&
1591
	    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
1592 1593
		pr_debug("Ignoring regulatory request set by %s since the driver uses its own custom regulatory domain\n",
			 reg_initiator_name(initiator));
1594
		return true;
1595 1596
	}

1597 1598 1599 1600
	/*
	 * wiphy->regd will be set once the device has its own
	 * desired regulatory domain set
	 */
1601
	if (wiphy_strict_alpha2_regd(wiphy) && !wiphy->regd &&
1602
	    initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1603
	    !is_world_regdom(lr->alpha2)) {
1604 1605
		pr_debug("Ignoring regulatory request set by %s since the driver requires its own regulatory domain to be set first\n",
			 reg_initiator_name(initiator));
1606
		return true;
1607 1608
	}

1609
	if (reg_request_cell_base(lr))
1610 1611
		return reg_dev_ignore_cell_hint(wiphy);

1612 1613 1614
	return false;
}

1615 1616 1617 1618 1619 1620 1621 1622 1623 1624
static bool reg_is_world_roaming(struct wiphy *wiphy)
{
	const struct ieee80211_regdomain *cr = get_cfg80211_regdom();
	const struct ieee80211_regdomain *wr = get_wiphy_regdom(wiphy);
	struct regulatory_request *lr = get_last_request();

	if (is_world_regdom(cr->alpha2) || (wr && is_world_regdom(wr->alpha2)))
		return true;

	if (lr && lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1625
	    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
1626 1627 1628 1629 1630
		return true;

	return false;
}

J
Johannes Berg 已提交
1631
static void handle_reg_beacon(struct wiphy *wiphy, unsigned int chan_idx,
1632 1633 1634 1635
			      struct reg_beacon *reg_beacon)
{
	struct ieee80211_supported_band *sband;
	struct ieee80211_channel *chan;
1636 1637
	bool channel_changed = false;
	struct ieee80211_channel chan_before;
1638 1639 1640 1641 1642 1643 1644

	sband = wiphy->bands[reg_beacon->chan.band];
	chan = &sband->channels[chan_idx];

	if (likely(chan->center_freq != reg_beacon->chan.center_freq))
		return;

1645 1646 1647 1648 1649
	if (chan->beacon_found)
		return;

	chan->beacon_found = true;

1650 1651 1652
	if (!reg_is_world_roaming(wiphy))
		return;

1653
	if (wiphy->regulatory_flags & REGULATORY_DISABLE_BEACON_HINTS)
1654 1655
		return;

1656 1657 1658
	chan_before.center_freq = chan->center_freq;
	chan_before.flags = chan->flags;

1659 1660
	if (chan->flags & IEEE80211_CHAN_NO_IR) {
		chan->flags &= ~IEEE80211_CHAN_NO_IR;
1661
		channel_changed = true;
1662 1663
	}

1664 1665
	if (channel_changed)
		nl80211_send_beacon_hint_event(wiphy, &chan_before, chan);
1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707
}

/*
 * Called when a scan on a wiphy finds a beacon on
 * new channel
 */
static void wiphy_update_new_beacon(struct wiphy *wiphy,
				    struct reg_beacon *reg_beacon)
{
	unsigned int i;
	struct ieee80211_supported_band *sband;

	if (!wiphy->bands[reg_beacon->chan.band])
		return;

	sband = wiphy->bands[reg_beacon->chan.band];

	for (i = 0; i < sband->n_channels; i++)
		handle_reg_beacon(wiphy, i, reg_beacon);
}

/*
 * Called upon reg changes or a new wiphy is added
 */
static void wiphy_update_beacon_reg(struct wiphy *wiphy)
{
	unsigned int i;
	struct ieee80211_supported_band *sband;
	struct reg_beacon *reg_beacon;

	list_for_each_entry(reg_beacon, &reg_beacon_list, list) {
		if (!wiphy->bands[reg_beacon->chan.band])
			continue;
		sband = wiphy->bands[reg_beacon->chan.band];
		for (i = 0; i < sband->n_channels; i++)
			handle_reg_beacon(wiphy, i, reg_beacon);
	}
}

/* Reap the advantages of previously found beacons */
static void reg_process_beacons(struct wiphy *wiphy)
{
1708 1709 1710 1711 1712 1713
	/*
	 * Means we are just firing up cfg80211, so no beacons would
	 * have been processed yet.
	 */
	if (!last_request)
		return;
1714 1715 1716
	wiphy_update_beacon_reg(wiphy);
}

J
Johannes Berg 已提交
1717
static bool is_ht40_allowed(struct ieee80211_channel *chan)
1718 1719
{
	if (!chan)
J
Johannes Berg 已提交
1720
		return false;
1721
	if (chan->flags & IEEE80211_CHAN_DISABLED)
J
Johannes Berg 已提交
1722
		return false;
1723
	/* This would happen when regulatory rules disallow HT40 completely */
1724 1725 1726
	if ((chan->flags & IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40)
		return false;
	return true;
1727 1728 1729
}

static void reg_process_ht_flags_channel(struct wiphy *wiphy,
J
Johannes Berg 已提交
1730
					 struct ieee80211_channel *channel)
1731
{
J
Johannes Berg 已提交
1732
	struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
1733
	struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
1734
	const struct ieee80211_regdomain *regd;
1735
	unsigned int i;
1736
	u32 flags;
1737

J
Johannes Berg 已提交
1738
	if (!is_ht40_allowed(channel)) {
1739 1740 1741 1742 1743 1744 1745 1746 1747 1748
		channel->flags |= IEEE80211_CHAN_NO_HT40;
		return;
	}

	/*
	 * We need to ensure the extension channels exist to
	 * be able to use HT40- or HT40+, this finds them (or not)
	 */
	for (i = 0; i < sband->n_channels; i++) {
		struct ieee80211_channel *c = &sband->channels[i];
J
Johannes Berg 已提交
1749

1750 1751 1752 1753 1754 1755
		if (c->center_freq == (channel->center_freq - 20))
			channel_before = c;
		if (c->center_freq == (channel->center_freq + 20))
			channel_after = c;
	}

1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766
	flags = 0;
	regd = get_wiphy_regdom(wiphy);
	if (regd) {
		const struct ieee80211_reg_rule *reg_rule =
			freq_reg_info_regd(MHZ_TO_KHZ(channel->center_freq),
					   regd, MHZ_TO_KHZ(20));

		if (!IS_ERR(reg_rule))
			flags = reg_rule->flags;
	}

1767 1768 1769 1770 1771
	/*
	 * Please note that this assumes target bandwidth is 20 MHz,
	 * if that ever changes we also need to change the below logic
	 * to include that as well.
	 */
1772 1773
	if (!is_ht40_allowed(channel_before) ||
	    flags & NL80211_RRF_NO_HT40MINUS)
1774
		channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
1775
	else
1776
		channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
1777

1778 1779
	if (!is_ht40_allowed(channel_after) ||
	    flags & NL80211_RRF_NO_HT40PLUS)
1780
		channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
1781
	else
1782
		channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
1783 1784 1785
}

static void reg_process_ht_flags_band(struct wiphy *wiphy,
J
Johannes Berg 已提交
1786
				      struct ieee80211_supported_band *sband)
1787 1788 1789
{
	unsigned int i;

J
Johannes Berg 已提交
1790 1791
	if (!sband)
		return;
1792 1793

	for (i = 0; i < sband->n_channels; i++)
J
Johannes Berg 已提交
1794
		reg_process_ht_flags_channel(wiphy, &sband->channels[i]);
1795 1796 1797 1798
}

static void reg_process_ht_flags(struct wiphy *wiphy)
{
1799
	enum nl80211_band band;
1800 1801 1802 1803

	if (!wiphy)
		return;

1804
	for (band = 0; band < NUM_NL80211_BANDS; band++)
J
Johannes Berg 已提交
1805
		reg_process_ht_flags_band(wiphy, wiphy->bands[band]);
1806 1807
}

1808 1809 1810 1811 1812 1813 1814
static void reg_call_notifier(struct wiphy *wiphy,
			      struct regulatory_request *request)
{
	if (wiphy->reg_notifier)
		wiphy->reg_notifier(wiphy, request);
}

1815 1816 1817 1818
static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev)
{
	struct cfg80211_chan_def chandef;
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1819
	enum nl80211_iftype iftype;
1820 1821

	wdev_lock(wdev);
1822
	iftype = wdev->iftype;
1823

1824
	/* make sure the interface is active */
1825
	if (!wdev->netdev || !netif_running(wdev->netdev))
1826
		goto wdev_inactive_unlock;
1827

1828
	switch (iftype) {
1829 1830 1831
	case NL80211_IFTYPE_AP:
	case NL80211_IFTYPE_P2P_GO:
		if (!wdev->beacon_interval)
1832 1833
			goto wdev_inactive_unlock;
		chandef = wdev->chandef;
1834 1835 1836
		break;
	case NL80211_IFTYPE_ADHOC:
		if (!wdev->ssid_len)
1837 1838
			goto wdev_inactive_unlock;
		chandef = wdev->chandef;
1839 1840 1841 1842 1843
		break;
	case NL80211_IFTYPE_STATION:
	case NL80211_IFTYPE_P2P_CLIENT:
		if (!wdev->current_bss ||
		    !wdev->current_bss->pub.channel)
1844
			goto wdev_inactive_unlock;
1845

1846 1847 1848 1849 1850
		if (!rdev->ops->get_channel ||
		    rdev_get_channel(rdev, wdev, &chandef))
			cfg80211_chandef_create(&chandef,
						wdev->current_bss->pub.channel,
						NL80211_CHAN_NO_HT);
1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863
		break;
	case NL80211_IFTYPE_MONITOR:
	case NL80211_IFTYPE_AP_VLAN:
	case NL80211_IFTYPE_P2P_DEVICE:
		/* no enforcement required */
		break;
	default:
		/* others not implemented for now */
		WARN_ON(1);
		break;
	}

	wdev_unlock(wdev);
1864 1865 1866 1867 1868

	switch (iftype) {
	case NL80211_IFTYPE_AP:
	case NL80211_IFTYPE_P2P_GO:
	case NL80211_IFTYPE_ADHOC:
1869
		return cfg80211_reg_can_beacon_relax(wiphy, &chandef, iftype);
1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882
	case NL80211_IFTYPE_STATION:
	case NL80211_IFTYPE_P2P_CLIENT:
		return cfg80211_chandef_usable(wiphy, &chandef,
					       IEEE80211_CHAN_DISABLED);
	default:
		break;
	}

	return true;

wdev_inactive_unlock:
	wdev_unlock(wdev);
	return true;
1883 1884 1885 1886 1887 1888 1889 1890 1891
}

static void reg_leave_invalid_chans(struct wiphy *wiphy)
{
	struct wireless_dev *wdev;
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);

	ASSERT_RTNL();

1892
	list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list)
1893 1894 1895 1896 1897 1898 1899 1900
		if (!reg_wdev_chan_valid(wiphy, wdev))
			cfg80211_leave(rdev, wdev);
}

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

1901
	pr_debug("Verifying active interfaces after reg change\n");
1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922
	rtnl_lock();

	list_for_each_entry(rdev, &cfg80211_rdev_list, list)
		if (!(rdev->wiphy.regulatory_flags &
		      REGULATORY_IGNORE_STALE_KICKOFF))
			reg_leave_invalid_chans(&rdev->wiphy);

	rtnl_unlock();
}

static void reg_check_channels(void)
{
	/*
	 * Give usermode a chance to do something nicer (move to another
	 * channel, orderly disconnection), before forcing a disconnection.
	 */
	mod_delayed_work(system_power_efficient_wq,
			 &reg_check_chans,
			 msecs_to_jiffies(REG_ENFORCE_GRACE_MS));
}

1923 1924
static void wiphy_update_regulatory(struct wiphy *wiphy,
				    enum nl80211_reg_initiator initiator)
1925
{
1926
	enum nl80211_band band;
1927
	struct regulatory_request *lr = get_last_request();
1928

1929 1930 1931 1932 1933 1934 1935
	if (ignore_reg_update(wiphy, initiator)) {
		/*
		 * Regulatory updates set by CORE are ignored for custom
		 * regulatory cards. Let us notify the changes to the driver,
		 * as some drivers used this to restore its orig_* reg domain.
		 */
		if (initiator == NL80211_REGDOM_SET_BY_CORE &&
1936
		    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
1937
			reg_call_notifier(wiphy, lr);
1938
		return;
1939
	}
1940

1941
	lr->dfs_region = get_cfg80211_regdom()->dfs_region;
1942

1943
	for (band = 0; band < NUM_NL80211_BANDS; band++)
J
Johannes Berg 已提交
1944
		handle_band(wiphy, initiator, wiphy->bands[band]);
1945

1946
	reg_process_beacons(wiphy);
1947
	reg_process_ht_flags(wiphy);
1948
	reg_call_notifier(wiphy, lr);
1949 1950
}

1951 1952 1953
static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
{
	struct cfg80211_registered_device *rdev;
1954
	struct wiphy *wiphy;
1955

1956
	ASSERT_RTNL();
1957

1958 1959 1960 1961
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		wiphy = &rdev->wiphy;
		wiphy_update_regulatory(wiphy, initiator);
	}
1962 1963

	reg_check_channels();
1964 1965
}

1966
static void handle_channel_custom(struct wiphy *wiphy,
J
Johannes Berg 已提交
1967
				  struct ieee80211_channel *chan,
1968 1969
				  const struct ieee80211_regdomain *regd)
{
1970
	u32 bw_flags = 0;
1971 1972
	const struct ieee80211_reg_rule *reg_rule = NULL;
	const struct ieee80211_power_rule *power_rule = NULL;
1973
	u32 bw;
1974

1975
	for (bw = MHZ_TO_KHZ(20); bw >= MHZ_TO_KHZ(5); bw = bw / 2) {
1976
		reg_rule = freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq),
1977 1978 1979 1980
					      regd, bw);
		if (!IS_ERR(reg_rule))
			break;
	}
1981

1982
	if (IS_ERR(reg_rule)) {
1983 1984
		pr_debug("Disabling freq %d MHz as custom regd has no rule that fits it\n",
			 chan->center_freq);
1985 1986 1987 1988 1989 1990
		if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
			chan->flags |= IEEE80211_CHAN_DISABLED;
		} else {
			chan->orig_flags |= IEEE80211_CHAN_DISABLED;
			chan->flags = chan->orig_flags;
		}
1991 1992 1993 1994
		return;
	}

	power_rule = &reg_rule->power_rule;
1995
	bw_flags = reg_rule_to_chan_bw_flags(regd, reg_rule, chan);
1996

1997
	chan->dfs_state_entered = jiffies;
1998 1999 2000
	chan->dfs_state = NL80211_DFS_USABLE;

	chan->beacon_found = false;
2001 2002 2003 2004 2005 2006 2007

	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
		chan->flags = chan->orig_flags | bw_flags |
			      map_regdom_flags(reg_rule->flags);
	else
		chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;

2008
	chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
2009 2010
	chan->max_reg_power = chan->max_power =
		(int) MBM_TO_DBM(power_rule->max_eirp);
2011 2012 2013 2014 2015 2016 2017 2018 2019

	if (chan->flags & IEEE80211_CHAN_RADAR) {
		if (reg_rule->dfs_cac_ms)
			chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
		else
			chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
	}

	chan->max_power = chan->max_reg_power;
2020 2021
}

J
Johannes Berg 已提交
2022 2023
static void handle_band_custom(struct wiphy *wiphy,
			       struct ieee80211_supported_band *sband,
2024 2025 2026 2027
			       const struct ieee80211_regdomain *regd)
{
	unsigned int i;

J
Johannes Berg 已提交
2028 2029
	if (!sband)
		return;
2030 2031

	for (i = 0; i < sband->n_channels; i++)
J
Johannes Berg 已提交
2032
		handle_channel_custom(wiphy, &sband->channels[i], regd);
2033 2034 2035 2036 2037 2038
}

/* Used by drivers prior to wiphy registration */
void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
				   const struct ieee80211_regdomain *regd)
{
2039
	enum nl80211_band band;
2040
	unsigned int bands_set = 0;
2041

2042 2043 2044
	WARN(!(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG),
	     "wiphy should have REGULATORY_CUSTOM_REG\n");
	wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
2045

2046
	for (band = 0; band < NUM_NL80211_BANDS; band++) {
2047 2048
		if (!wiphy->bands[band])
			continue;
J
Johannes Berg 已提交
2049
		handle_band_custom(wiphy, wiphy->bands[band], regd);
2050
		bands_set++;
2051
	}
2052 2053 2054

	/*
	 * no point in calling this if it won't have any effect
J
Johannes Berg 已提交
2055
	 * on your device's supported bands.
2056 2057
	 */
	WARN_ON(!bands_set);
2058
}
2059 2060
EXPORT_SYMBOL(wiphy_apply_custom_regulatory);

2061 2062 2063
static void reg_set_request_processed(void)
{
	bool need_more_processing = false;
2064
	struct regulatory_request *lr = get_last_request();
2065

2066
	lr->processed = true;
2067 2068 2069 2070 2071 2072

	spin_lock(&reg_requests_lock);
	if (!list_empty(&reg_requests_list))
		need_more_processing = true;
	spin_unlock(&reg_requests_lock);

2073
	cancel_crda_timeout();
2074

2075 2076 2077 2078
	if (need_more_processing)
		schedule_work(&reg_work);
}

2079 2080 2081 2082 2083 2084 2085
/**
 * reg_process_hint_core - process core regulatory requests
 * @pending_request: a pending core regulatory request
 *
 * The wireless subsystem can use this function to process
 * a regulatory request issued by the regulatory core.
 */
2086 2087
static enum reg_request_treatment
reg_process_hint_core(struct regulatory_request *core_request)
2088
{
2089
	if (reg_query_database(core_request)) {
2090 2091 2092
		core_request->intersect = false;
		core_request->processed = false;
		reg_update_last_request(core_request);
2093
		return REG_REQ_OK;
2094
	}
2095 2096

	return REG_REQ_IGNORE;
2097 2098
}

2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141
static enum reg_request_treatment
__reg_process_hint_user(struct regulatory_request *user_request)
{
	struct regulatory_request *lr = get_last_request();

	if (reg_request_cell_base(user_request))
		return reg_ignore_cell_hint(user_request);

	if (reg_request_cell_base(lr))
		return REG_REQ_IGNORE;

	if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)
		return REG_REQ_INTERSECT;
	/*
	 * If the user knows better the user should set the regdom
	 * to their country before the IE is picked up
	 */
	if (lr->initiator == NL80211_REGDOM_SET_BY_USER &&
	    lr->intersect)
		return REG_REQ_IGNORE;
	/*
	 * Process user requests only after previous user/driver/core
	 * requests have been processed
	 */
	if ((lr->initiator == NL80211_REGDOM_SET_BY_CORE ||
	     lr->initiator == NL80211_REGDOM_SET_BY_DRIVER ||
	     lr->initiator == NL80211_REGDOM_SET_BY_USER) &&
	    regdom_changes(lr->alpha2))
		return REG_REQ_IGNORE;

	if (!regdom_changes(user_request->alpha2))
		return REG_REQ_ALREADY_SET;

	return REG_REQ_OK;
}

/**
 * reg_process_hint_user - process user regulatory requests
 * @user_request: a pending user regulatory request
 *
 * The wireless subsystem can use this function to process
 * a regulatory request initiated by userspace.
 */
2142 2143
static enum reg_request_treatment
reg_process_hint_user(struct regulatory_request *user_request)
2144 2145 2146 2147 2148
{
	enum reg_request_treatment treatment;

	treatment = __reg_process_hint_user(user_request);
	if (treatment == REG_REQ_IGNORE ||
2149 2150
	    treatment == REG_REQ_ALREADY_SET)
		return REG_REQ_IGNORE;
2151 2152 2153

	user_request->intersect = treatment == REG_REQ_INTERSECT;
	user_request->processed = false;
2154

2155
	if (reg_query_database(user_request)) {
2156 2157 2158
		reg_update_last_request(user_request);
		user_alpha2[0] = user_request->alpha2[0];
		user_alpha2[1] = user_request->alpha2[1];
2159
		return REG_REQ_OK;
2160
	}
2161 2162

	return REG_REQ_IGNORE;
2163 2164
}

2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200
static enum reg_request_treatment
__reg_process_hint_driver(struct regulatory_request *driver_request)
{
	struct regulatory_request *lr = get_last_request();

	if (lr->initiator == NL80211_REGDOM_SET_BY_CORE) {
		if (regdom_changes(driver_request->alpha2))
			return REG_REQ_OK;
		return REG_REQ_ALREADY_SET;
	}

	/*
	 * This would happen if you unplug and plug your card
	 * back in or if you add a new device for which the previously
	 * loaded card also agrees on the regulatory domain.
	 */
	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
	    !regdom_changes(driver_request->alpha2))
		return REG_REQ_ALREADY_SET;

	return REG_REQ_INTERSECT;
}

/**
 * reg_process_hint_driver - process driver regulatory requests
 * @driver_request: a pending driver regulatory request
 *
 * The wireless subsystem can use this function to process
 * a regulatory request issued by an 802.11 driver.
 *
 * Returns one of the different reg request treatment values.
 */
static enum reg_request_treatment
reg_process_hint_driver(struct wiphy *wiphy,
			struct regulatory_request *driver_request)
{
2201
	const struct ieee80211_regdomain *regd, *tmp;
2202 2203 2204 2205 2206 2207 2208 2209
	enum reg_request_treatment treatment;

	treatment = __reg_process_hint_driver(driver_request);

	switch (treatment) {
	case REG_REQ_OK:
		break;
	case REG_REQ_IGNORE:
2210
		return REG_REQ_IGNORE;
2211 2212 2213
	case REG_REQ_INTERSECT:
	case REG_REQ_ALREADY_SET:
		regd = reg_copy_regd(get_cfg80211_regdom());
2214 2215
		if (IS_ERR(regd))
			return REG_REQ_IGNORE;
2216 2217

		tmp = get_wiphy_regdom(wiphy);
2218
		rcu_assign_pointer(wiphy->regd, regd);
2219
		rcu_free_regdom(tmp);
2220 2221 2222 2223 2224
	}


	driver_request->intersect = treatment == REG_REQ_INTERSECT;
	driver_request->processed = false;
2225

2226 2227 2228 2229 2230 2231 2232
	/*
	 * Since CRDA will not be called in this case as we already
	 * have applied the requested regulatory domain before we just
	 * inform userspace we have processed the request
	 */
	if (treatment == REG_REQ_ALREADY_SET) {
		nl80211_send_reg_change_event(driver_request);
2233
		reg_update_last_request(driver_request);
2234
		reg_set_request_processed();
2235
		return REG_REQ_ALREADY_SET;
2236 2237
	}

2238
	if (reg_query_database(driver_request)) {
2239
		reg_update_last_request(driver_request);
2240 2241
		return REG_REQ_OK;
	}
2242

2243
	return REG_REQ_IGNORE;
2244 2245
}

2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257
static enum reg_request_treatment
__reg_process_hint_country_ie(struct wiphy *wiphy,
			      struct regulatory_request *country_ie_request)
{
	struct wiphy *last_wiphy = NULL;
	struct regulatory_request *lr = get_last_request();

	if (reg_request_cell_base(lr)) {
		/* Trust a Cell base station over the AP's country IE */
		if (regdom_changes(country_ie_request->alpha2))
			return REG_REQ_IGNORE;
		return REG_REQ_ALREADY_SET;
2258 2259 2260
	} else {
		if (wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_IGNORE)
			return REG_REQ_IGNORE;
2261 2262 2263 2264
	}

	if (unlikely(!is_an_alpha2(country_ie_request->alpha2)))
		return -EINVAL;
2265 2266 2267 2268 2269 2270 2271

	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE)
		return REG_REQ_OK;

	last_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);

	if (last_wiphy != wiphy) {
2272
		/*
2273 2274 2275 2276
		 * Two cards with two APs claiming different
		 * Country IE alpha2s. We could
		 * intersect them, but that seems unlikely
		 * to be correct. Reject second one for now.
2277
		 */
2278 2279
		if (regdom_changes(country_ie_request->alpha2))
			return REG_REQ_IGNORE;
2280 2281
		return REG_REQ_ALREADY_SET;
	}
2282 2283

	if (regdom_changes(country_ie_request->alpha2))
2284 2285
		return REG_REQ_OK;
	return REG_REQ_ALREADY_SET;
2286 2287
}

2288
/**
2289 2290
 * reg_process_hint_country_ie - process regulatory requests from country IEs
 * @country_ie_request: a regulatory request from a country IE
2291
 *
2292 2293
 * The wireless subsystem can use this function to process
 * a regulatory request issued by a country Information Element.
2294
 *
2295
 * Returns one of the different reg request treatment values.
2296
 */
2297
static enum reg_request_treatment
2298 2299
reg_process_hint_country_ie(struct wiphy *wiphy,
			    struct regulatory_request *country_ie_request)
2300
{
2301
	enum reg_request_treatment treatment;
2302

2303
	treatment = __reg_process_hint_country_ie(wiphy, country_ie_request);
2304

2305 2306 2307
	switch (treatment) {
	case REG_REQ_OK:
		break;
2308
	case REG_REQ_IGNORE:
2309
		return REG_REQ_IGNORE;
2310
	case REG_REQ_ALREADY_SET:
2311
		reg_free_request(country_ie_request);
2312
		return REG_REQ_ALREADY_SET;
2313
	case REG_REQ_INTERSECT:
2314
		/*
2315 2316
		 * This doesn't happen yet, not sure we
		 * ever want to support it for this case.
2317
		 */
2318
		WARN_ONCE(1, "Unexpected intersection for country IEs");
2319
		return REG_REQ_IGNORE;
2320
	}
2321

2322 2323
	country_ie_request->intersect = false;
	country_ie_request->processed = false;
2324

2325
	if (reg_query_database(country_ie_request)) {
2326
		reg_update_last_request(country_ie_request);
2327 2328
		return REG_REQ_OK;
	}
2329

2330
	return REG_REQ_IGNORE;
2331 2332
}

2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414
bool reg_dfs_domain_same(struct wiphy *wiphy1, struct wiphy *wiphy2)
{
	const struct ieee80211_regdomain *wiphy1_regd = NULL;
	const struct ieee80211_regdomain *wiphy2_regd = NULL;
	const struct ieee80211_regdomain *cfg80211_regd = NULL;
	bool dfs_domain_same;

	rcu_read_lock();

	cfg80211_regd = rcu_dereference(cfg80211_regdomain);
	wiphy1_regd = rcu_dereference(wiphy1->regd);
	if (!wiphy1_regd)
		wiphy1_regd = cfg80211_regd;

	wiphy2_regd = rcu_dereference(wiphy2->regd);
	if (!wiphy2_regd)
		wiphy2_regd = cfg80211_regd;

	dfs_domain_same = wiphy1_regd->dfs_region == wiphy2_regd->dfs_region;

	rcu_read_unlock();

	return dfs_domain_same;
}

static void reg_copy_dfs_chan_state(struct ieee80211_channel *dst_chan,
				    struct ieee80211_channel *src_chan)
{
	if (!(dst_chan->flags & IEEE80211_CHAN_RADAR) ||
	    !(src_chan->flags & IEEE80211_CHAN_RADAR))
		return;

	if (dst_chan->flags & IEEE80211_CHAN_DISABLED ||
	    src_chan->flags & IEEE80211_CHAN_DISABLED)
		return;

	if (src_chan->center_freq == dst_chan->center_freq &&
	    dst_chan->dfs_state == NL80211_DFS_USABLE) {
		dst_chan->dfs_state = src_chan->dfs_state;
		dst_chan->dfs_state_entered = src_chan->dfs_state_entered;
	}
}

static void wiphy_share_dfs_chan_state(struct wiphy *dst_wiphy,
				       struct wiphy *src_wiphy)
{
	struct ieee80211_supported_band *src_sband, *dst_sband;
	struct ieee80211_channel *src_chan, *dst_chan;
	int i, j, band;

	if (!reg_dfs_domain_same(dst_wiphy, src_wiphy))
		return;

	for (band = 0; band < NUM_NL80211_BANDS; band++) {
		dst_sband = dst_wiphy->bands[band];
		src_sband = src_wiphy->bands[band];
		if (!dst_sband || !src_sband)
			continue;

		for (i = 0; i < dst_sband->n_channels; i++) {
			dst_chan = &dst_sband->channels[i];
			for (j = 0; j < src_sband->n_channels; j++) {
				src_chan = &src_sband->channels[j];
				reg_copy_dfs_chan_state(dst_chan, src_chan);
			}
		}
	}
}

static void wiphy_all_share_dfs_chan_state(struct wiphy *wiphy)
{
	struct cfg80211_registered_device *rdev;

	ASSERT_RTNL();

	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		if (wiphy == &rdev->wiphy)
			continue;
		wiphy_share_dfs_chan_state(wiphy, &rdev->wiphy);
	}
}

2415
/* This processes *all* regulatory hints */
2416
static void reg_process_hint(struct regulatory_request *reg_request)
2417 2418
{
	struct wiphy *wiphy = NULL;
2419
	enum reg_request_treatment treatment;
2420

J
Johannes Berg 已提交
2421
	if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
2422 2423
		wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);

2424 2425
	switch (reg_request->initiator) {
	case NL80211_REGDOM_SET_BY_CORE:
2426 2427
		treatment = reg_process_hint_core(reg_request);
		break;
2428
	case NL80211_REGDOM_SET_BY_USER:
2429 2430
		treatment = reg_process_hint_user(reg_request);
		break;
2431
	case NL80211_REGDOM_SET_BY_DRIVER:
2432 2433
		if (!wiphy)
			goto out_free;
2434 2435
		treatment = reg_process_hint_driver(wiphy, reg_request);
		break;
2436
	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
2437 2438
		if (!wiphy)
			goto out_free;
2439
		treatment = reg_process_hint_country_ie(wiphy, reg_request);
2440 2441 2442
		break;
	default:
		WARN(1, "invalid initiator %d\n", reg_request->initiator);
2443
		goto out_free;
2444 2445
	}

2446 2447 2448
	if (treatment == REG_REQ_IGNORE)
		goto out_free;

2449 2450 2451
	WARN(treatment != REG_REQ_OK && treatment != REG_REQ_ALREADY_SET,
	     "unexpected treatment value %d\n", treatment);

2452 2453 2454
	/* This is required so that the orig_* parameters are saved.
	 * NOTE: treatment must be set for any case that reaches here!
	 */
2455
	if (treatment == REG_REQ_ALREADY_SET && wiphy &&
2456
	    wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
2457
		wiphy_update_regulatory(wiphy, reg_request->initiator);
2458
		wiphy_all_share_dfs_chan_state(wiphy);
2459 2460
		reg_check_channels();
	}
2461 2462 2463 2464

	return;

out_free:
2465
	reg_free_request(reg_request);
2466 2467
}

2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487
static bool reg_only_self_managed_wiphys(void)
{
	struct cfg80211_registered_device *rdev;
	struct wiphy *wiphy;
	bool self_managed_found = false;

	ASSERT_RTNL();

	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		wiphy = &rdev->wiphy;
		if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
			self_managed_found = true;
		else
			return false;
	}

	/* make sure at least one self-managed wiphy exists */
	return self_managed_found;
}

2488 2489 2490 2491 2492
/*
 * Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_*
 * Regulatory hints come on a first come first serve basis and we
 * must process each one atomically.
 */
2493
static void reg_process_pending_hints(void)
2494
{
2495
	struct regulatory_request *reg_request, *lr;
2496

2497
	lr = get_last_request();
2498

2499
	/* When last_request->processed becomes true this will be rescheduled */
2500
	if (lr && !lr->processed) {
2501
		reg_process_hint(lr);
2502
		return;
2503 2504
	}

2505 2506
	spin_lock(&reg_requests_lock);

2507
	if (list_empty(&reg_requests_list)) {
2508
		spin_unlock(&reg_requests_lock);
2509
		return;
2510
	}
2511 2512 2513 2514 2515 2516

	reg_request = list_first_entry(&reg_requests_list,
				       struct regulatory_request,
				       list);
	list_del_init(&reg_request->list);

2517
	spin_unlock(&reg_requests_lock);
2518

2519 2520 2521 2522 2523
	if (reg_only_self_managed_wiphys()) {
		reg_free_request(reg_request);
		return;
	}

2524
	reg_process_hint(reg_request);
2525 2526 2527 2528 2529 2530 2531

	lr = get_last_request();

	spin_lock(&reg_requests_lock);
	if (!list_empty(&reg_requests_list) && lr && lr->processed)
		schedule_work(&reg_work);
	spin_unlock(&reg_requests_lock);
2532 2533
}

2534 2535 2536
/* Processes beacon hints -- this has nothing to do with country IEs */
static void reg_process_pending_beacon_hints(void)
{
2537
	struct cfg80211_registered_device *rdev;
2538 2539 2540 2541 2542 2543 2544 2545 2546 2547
	struct reg_beacon *pending_beacon, *tmp;

	/* This goes through the _pending_ beacon list */
	spin_lock_bh(&reg_pending_beacons_lock);

	list_for_each_entry_safe(pending_beacon, tmp,
				 &reg_pending_beacons, list) {
		list_del_init(&pending_beacon->list);

		/* Applies the beacon hint to current wiphys */
2548 2549
		list_for_each_entry(rdev, &cfg80211_rdev_list, list)
			wiphy_update_new_beacon(&rdev->wiphy, pending_beacon);
2550 2551 2552 2553 2554 2555 2556 2557

		/* Remembers the beacon hint for new wiphys or reg changes */
		list_add_tail(&pending_beacon->list, &reg_beacon_list);
	}

	spin_unlock_bh(&reg_pending_beacons_lock);
}

2558 2559 2560 2561 2562 2563
static void reg_process_self_managed_hints(void)
{
	struct cfg80211_registered_device *rdev;
	struct wiphy *wiphy;
	const struct ieee80211_regdomain *tmp;
	const struct ieee80211_regdomain *regd;
2564
	enum nl80211_band band;
2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581
	struct regulatory_request request = {};

	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		wiphy = &rdev->wiphy;

		spin_lock(&reg_requests_lock);
		regd = rdev->requested_regd;
		rdev->requested_regd = NULL;
		spin_unlock(&reg_requests_lock);

		if (regd == NULL)
			continue;

		tmp = get_wiphy_regdom(wiphy);
		rcu_assign_pointer(wiphy->regd, regd);
		rcu_free_regdom(tmp);

2582
		for (band = 0; band < NUM_NL80211_BANDS; band++)
2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597
			handle_band_custom(wiphy, wiphy->bands[band], regd);

		reg_process_ht_flags(wiphy);

		request.wiphy_idx = get_wiphy_idx(wiphy);
		request.alpha2[0] = regd->alpha2[0];
		request.alpha2[1] = regd->alpha2[1];
		request.initiator = NL80211_REGDOM_SET_BY_DRIVER;

		nl80211_send_wiphy_reg_change_event(&request);
	}

	reg_check_channels();
}

2598 2599
static void reg_todo(struct work_struct *work)
{
2600
	rtnl_lock();
2601
	reg_process_pending_hints();
2602
	reg_process_pending_beacon_hints();
2603
	reg_process_self_managed_hints();
2604
	rtnl_unlock();
2605 2606 2607 2608
}

static void queue_regulatory_request(struct regulatory_request *request)
{
2609 2610
	request->alpha2[0] = toupper(request->alpha2[0]);
	request->alpha2[1] = toupper(request->alpha2[1]);
2611

2612 2613 2614 2615 2616 2617 2618
	spin_lock(&reg_requests_lock);
	list_add_tail(&request->list, &reg_requests_list);
	spin_unlock(&reg_requests_lock);

	schedule_work(&reg_work);
}

2619 2620 2621 2622
/*
 * Core regulatory hint -- happens during cfg80211_init()
 * and when we restore regulatory settings.
 */
2623 2624 2625 2626
static int regulatory_hint_core(const char *alpha2)
{
	struct regulatory_request *request;

J
Johannes Berg 已提交
2627
	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
2628 2629 2630 2631 2632
	if (!request)
		return -ENOMEM;

	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
2633
	request->initiator = NL80211_REGDOM_SET_BY_CORE;
2634

2635
	queue_regulatory_request(request);
2636

2637
	return 0;
2638 2639
}

2640
/* User hints */
2641 2642
int regulatory_hint_user(const char *alpha2,
			 enum nl80211_user_reg_hint_type user_reg_hint_type)
2643
{
2644 2645
	struct regulatory_request *request;

J
Johannes Berg 已提交
2646 2647
	if (WARN_ON(!alpha2))
		return -EINVAL;
2648

2649 2650 2651 2652
	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
	if (!request)
		return -ENOMEM;

J
Johannes Berg 已提交
2653
	request->wiphy_idx = WIPHY_IDX_INVALID;
2654 2655
	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
2656
	request->initiator = NL80211_REGDOM_SET_BY_USER;
2657
	request->user_reg_hint_type = user_reg_hint_type;
2658

2659
	/* Allow calling CRDA again */
2660
	reset_crda_timeouts();
2661

2662 2663 2664 2665 2666
	queue_regulatory_request(request);

	return 0;
}

2667
int regulatory_hint_indoor(bool is_indoor, u32 portid)
2668
{
2669
	spin_lock(&reg_indoor_lock);
2670

2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684
	/* It is possible that more than one user space process is trying to
	 * configure the indoor setting. To handle such cases, clear the indoor
	 * setting in case that some process does not think that the device
	 * is operating in an indoor environment. In addition, if a user space
	 * process indicates that it is controlling the indoor setting, save its
	 * portid, i.e., make it the owner.
	 */
	reg_is_indoor = is_indoor;
	if (reg_is_indoor) {
		if (!reg_is_indoor_portid)
			reg_is_indoor_portid = portid;
	} else {
		reg_is_indoor_portid = 0;
	}
2685

2686
	spin_unlock(&reg_indoor_lock);
2687

2688 2689
	if (!is_indoor)
		reg_check_channels();
2690 2691 2692 2693

	return 0;
}

2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710
void regulatory_netlink_notify(u32 portid)
{
	spin_lock(&reg_indoor_lock);

	if (reg_is_indoor_portid != portid) {
		spin_unlock(&reg_indoor_lock);
		return;
	}

	reg_is_indoor = false;
	reg_is_indoor_portid = 0;

	spin_unlock(&reg_indoor_lock);

	reg_check_channels();
}

2711 2712 2713 2714 2715
/* Driver hints */
int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
{
	struct regulatory_request *request;

J
Johannes Berg 已提交
2716 2717
	if (WARN_ON(!alpha2 || !wiphy))
		return -EINVAL;
2718

2719 2720
	wiphy->regulatory_flags &= ~REGULATORY_CUSTOM_REG;

2721 2722 2723 2724 2725 2726 2727 2728
	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
	if (!request)
		return -ENOMEM;

	request->wiphy_idx = get_wiphy_idx(wiphy);

	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
2729
	request->initiator = NL80211_REGDOM_SET_BY_DRIVER;
2730

2731
	/* Allow calling CRDA again */
2732
	reset_crda_timeouts();
2733

2734 2735 2736
	queue_regulatory_request(request);

	return 0;
2737 2738 2739
}
EXPORT_SYMBOL(regulatory_hint);

2740
void regulatory_hint_country_ie(struct wiphy *wiphy, enum nl80211_band band,
2741
				const u8 *country_ie, u8 country_ie_len)
2742 2743 2744
{
	char alpha2[2];
	enum environment_cap env = ENVIRON_ANY;
2745
	struct regulatory_request *request = NULL, *lr;
2746

2747 2748
	/* IE len must be evenly divisible by 2 */
	if (country_ie_len & 0x01)
2749
		return;
2750 2751

	if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
2752 2753 2754 2755 2756
		return;

	request = kzalloc(sizeof(*request), GFP_KERNEL);
	if (!request)
		return;
2757 2758 2759 2760 2761 2762 2763 2764 2765

	alpha2[0] = country_ie[0];
	alpha2[1] = country_ie[1];

	if (country_ie[2] == 'I')
		env = ENVIRON_INDOOR;
	else if (country_ie[2] == 'O')
		env = ENVIRON_OUTDOOR;

2766 2767 2768 2769 2770 2771
	rcu_read_lock();
	lr = get_last_request();

	if (unlikely(!lr))
		goto out;

2772
	/*
2773
	 * We will run this only upon a successful connection on cfg80211.
2774
	 * We leave conflict resolution to the workqueue, where can hold
2775
	 * the RTNL.
2776
	 */
2777 2778
	if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
	    lr->wiphy_idx != WIPHY_IDX_INVALID)
2779
		goto out;
2780

2781
	request->wiphy_idx = get_wiphy_idx(wiphy);
2782 2783
	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
2784
	request->initiator = NL80211_REGDOM_SET_BY_COUNTRY_IE;
2785 2786
	request->country_ie_env = env;

2787
	/* Allow calling CRDA again */
2788
	reset_crda_timeouts();
2789

2790
	queue_regulatory_request(request);
2791
	request = NULL;
2792
out:
2793 2794
	kfree(request);
	rcu_read_unlock();
2795
}
2796

2797 2798 2799 2800 2801 2802 2803 2804 2805 2806
static void restore_alpha2(char *alpha2, bool reset_user)
{
	/* indicates there is no alpha2 to consider for restoration */
	alpha2[0] = '9';
	alpha2[1] = '7';

	/* The user setting has precedence over the module parameter */
	if (is_user_regdom_saved()) {
		/* Unless we're asked to ignore it and reset it */
		if (reset_user) {
2807
			pr_debug("Restoring regulatory settings including user preference\n");
2808 2809 2810 2811 2812 2813 2814 2815 2816
			user_alpha2[0] = '9';
			user_alpha2[1] = '7';

			/*
			 * If we're ignoring user settings, we still need to
			 * check the module parameter to ensure we put things
			 * back as they were for a full restore.
			 */
			if (!is_world_regdom(ieee80211_regdom)) {
2817 2818
				pr_debug("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
					 ieee80211_regdom[0], ieee80211_regdom[1]);
2819 2820 2821 2822
				alpha2[0] = ieee80211_regdom[0];
				alpha2[1] = ieee80211_regdom[1];
			}
		} else {
2823 2824
			pr_debug("Restoring regulatory settings while preserving user preference for: %c%c\n",
				 user_alpha2[0], user_alpha2[1]);
2825 2826 2827 2828
			alpha2[0] = user_alpha2[0];
			alpha2[1] = user_alpha2[1];
		}
	} else if (!is_world_regdom(ieee80211_regdom)) {
2829 2830
		pr_debug("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
			 ieee80211_regdom[0], ieee80211_regdom[1]);
2831 2832 2833
		alpha2[0] = ieee80211_regdom[0];
		alpha2[1] = ieee80211_regdom[1];
	} else
2834
		pr_debug("Restoring regulatory settings\n");
2835 2836
}

2837 2838 2839
static void restore_custom_reg_settings(struct wiphy *wiphy)
{
	struct ieee80211_supported_band *sband;
2840
	enum nl80211_band band;
2841 2842 2843
	struct ieee80211_channel *chan;
	int i;

2844
	for (band = 0; band < NUM_NL80211_BANDS; band++) {
2845 2846 2847 2848 2849 2850 2851 2852
		sband = wiphy->bands[band];
		if (!sband)
			continue;
		for (i = 0; i < sband->n_channels; i++) {
			chan = &sband->channels[i];
			chan->flags = chan->orig_flags;
			chan->max_antenna_gain = chan->orig_mag;
			chan->max_power = chan->orig_mpwr;
2853
			chan->beacon_found = false;
2854 2855 2856 2857
		}
	}
}

2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875
/*
 * Restoring regulatory settings involves ingoring any
 * possibly stale country IE information and user regulatory
 * settings if so desired, this includes any beacon hints
 * learned as we could have traveled outside to another country
 * after disconnection. To restore regulatory settings we do
 * exactly what we did at bootup:
 *
 *   - send a core regulatory hint
 *   - send a user regulatory hint if applicable
 *
 * Device drivers that send a regulatory hint for a specific country
 * keep their own regulatory domain on wiphy->regd so that does does
 * not need to be remembered.
 */
static void restore_regulatory_settings(bool reset_user)
{
	char alpha2[2];
2876
	char world_alpha2[2];
2877
	struct reg_beacon *reg_beacon, *btmp;
2878
	LIST_HEAD(tmp_reg_req_list);
2879
	struct cfg80211_registered_device *rdev;
2880

2881 2882
	ASSERT_RTNL();

2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893
	/*
	 * Clear the indoor setting in case that it is not controlled by user
	 * space, as otherwise there is no guarantee that the device is still
	 * operating in an indoor environment.
	 */
	spin_lock(&reg_indoor_lock);
	if (reg_is_indoor && !reg_is_indoor_portid) {
		reg_is_indoor = false;
		reg_check_channels();
	}
	spin_unlock(&reg_indoor_lock);
2894

2895
	reset_regdomains(true, &world_regdom);
2896 2897
	restore_alpha2(alpha2, reset_user);

2898 2899 2900 2901 2902 2903 2904
	/*
	 * If there's any pending requests we simply
	 * stash them to a temporary pending queue and
	 * add then after we've restored regulatory
	 * settings.
	 */
	spin_lock(&reg_requests_lock);
2905
	list_splice_tail_init(&reg_requests_list, &tmp_reg_req_list);
2906 2907
	spin_unlock(&reg_requests_lock);

2908 2909
	/* Clear beacon hints */
	spin_lock_bh(&reg_pending_beacons_lock);
2910 2911 2912
	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
2913 2914 2915
	}
	spin_unlock_bh(&reg_pending_beacons_lock);

2916 2917 2918
	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
2919 2920 2921
	}

	/* First restore to the basic regulatory settings */
2922 2923
	world_alpha2[0] = cfg80211_world_regdom->alpha2[0];
	world_alpha2[1] = cfg80211_world_regdom->alpha2[1];
2924

2925
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2926 2927
		if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
			continue;
2928
		if (rdev->wiphy.regulatory_flags & REGULATORY_CUSTOM_REG)
2929 2930 2931
			restore_custom_reg_settings(&rdev->wiphy);
	}

2932
	regulatory_hint_core(world_alpha2);
2933 2934 2935 2936 2937 2938 2939

	/*
	 * This restores the ieee80211_regdom module parameter
	 * preference or the last user requested regulatory
	 * settings, user regulatory settings takes precedence.
	 */
	if (is_an_alpha2(alpha2))
2940
		regulatory_hint_user(alpha2, NL80211_USER_REG_HINT_USER);
2941

2942
	spin_lock(&reg_requests_lock);
2943
	list_splice_tail_init(&tmp_reg_req_list, &reg_requests_list);
2944 2945
	spin_unlock(&reg_requests_lock);

2946
	pr_debug("Kicking the queue\n");
2947 2948 2949

	schedule_work(&reg_work);
}
2950 2951 2952

void regulatory_hint_disconnect(void)
{
2953
	pr_debug("All devices are disconnected, going to restore regulatory settings\n");
2954 2955 2956
	restore_regulatory_settings(false);
}

2957 2958
static bool freq_is_chan_12_13_14(u16 freq)
{
2959 2960 2961
	if (freq == ieee80211_channel_to_frequency(12, NL80211_BAND_2GHZ) ||
	    freq == ieee80211_channel_to_frequency(13, NL80211_BAND_2GHZ) ||
	    freq == ieee80211_channel_to_frequency(14, NL80211_BAND_2GHZ))
2962 2963 2964 2965
		return true;
	return false;
}

2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976
static bool pending_reg_beacon(struct ieee80211_channel *beacon_chan)
{
	struct reg_beacon *pending_beacon;

	list_for_each_entry(pending_beacon, &reg_pending_beacons, list)
		if (beacon_chan->center_freq ==
		    pending_beacon->chan.center_freq)
			return true;
	return false;
}

2977 2978 2979 2980 2981
int regulatory_hint_found_beacon(struct wiphy *wiphy,
				 struct ieee80211_channel *beacon_chan,
				 gfp_t gfp)
{
	struct reg_beacon *reg_beacon;
2982
	bool processing;
2983

J
Johannes Berg 已提交
2984 2985
	if (beacon_chan->beacon_found ||
	    beacon_chan->flags & IEEE80211_CHAN_RADAR ||
2986
	    (beacon_chan->band == NL80211_BAND_2GHZ &&
J
Johannes Berg 已提交
2987
	     !freq_is_chan_12_13_14(beacon_chan->center_freq)))
2988 2989
		return 0;

2990 2991 2992 2993 2994
	spin_lock_bh(&reg_pending_beacons_lock);
	processing = pending_reg_beacon(beacon_chan);
	spin_unlock_bh(&reg_pending_beacons_lock);

	if (processing)
2995 2996 2997 2998 2999 3000
		return 0;

	reg_beacon = kzalloc(sizeof(struct reg_beacon), gfp);
	if (!reg_beacon)
		return -ENOMEM;

3001 3002 3003 3004
	pr_debug("Found new beacon on frequency: %d MHz (Ch %d) on %s\n",
		 beacon_chan->center_freq,
		 ieee80211_frequency_to_channel(beacon_chan->center_freq),
		 wiphy_name(wiphy));
3005

3006
	memcpy(&reg_beacon->chan, beacon_chan,
J
Johannes Berg 已提交
3007
	       sizeof(struct ieee80211_channel));
3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021

	/*
	 * Since we can be called from BH or and non-BH context
	 * we must use spin_lock_bh()
	 */
	spin_lock_bh(&reg_pending_beacons_lock);
	list_add_tail(&reg_beacon->list, &reg_pending_beacons);
	spin_unlock_bh(&reg_pending_beacons_lock);

	schedule_work(&reg_work);

	return 0;
}

3022
static void print_rd_rules(const struct ieee80211_regdomain *rd)
3023 3024
{
	unsigned int i;
3025 3026 3027
	const struct ieee80211_reg_rule *reg_rule = NULL;
	const struct ieee80211_freq_range *freq_range = NULL;
	const struct ieee80211_power_rule *power_rule = NULL;
3028
	char bw[32], cac_time[32];
3029

3030
	pr_debug("  (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)\n");
3031 3032 3033 3034 3035 3036

	for (i = 0; i < rd->n_reg_rules; i++) {
		reg_rule = &rd->reg_rules[i];
		freq_range = &reg_rule->freq_range;
		power_rule = &reg_rule->power_rule;

3037 3038 3039
		if (reg_rule->flags & NL80211_RRF_AUTO_BW)
			snprintf(bw, sizeof(bw), "%d KHz, %d KHz AUTO",
				 freq_range->max_bandwidth_khz,
3040 3041
				 reg_get_max_bandwidth(rd, reg_rule));
		else
3042
			snprintf(bw, sizeof(bw), "%d KHz",
3043 3044
				 freq_range->max_bandwidth_khz);

3045 3046 3047 3048 3049 3050 3051
		if (reg_rule->flags & NL80211_RRF_DFS)
			scnprintf(cac_time, sizeof(cac_time), "%u s",
				  reg_rule->dfs_cac_ms/1000);
		else
			scnprintf(cac_time, sizeof(cac_time), "N/A");


3052 3053 3054 3055
		/*
		 * There may not be documentation for max antenna gain
		 * in certain regions
		 */
3056
		if (power_rule->max_antenna_gain)
3057
			pr_debug("  (%d KHz - %d KHz @ %s), (%d mBi, %d mBm), (%s)\n",
3058 3059
				freq_range->start_freq_khz,
				freq_range->end_freq_khz,
3060
				bw,
3061
				power_rule->max_antenna_gain,
3062 3063
				power_rule->max_eirp,
				cac_time);
3064
		else
3065
			pr_debug("  (%d KHz - %d KHz @ %s), (N/A, %d mBm), (%s)\n",
3066 3067
				freq_range->start_freq_khz,
				freq_range->end_freq_khz,
3068
				bw,
3069 3070
				power_rule->max_eirp,
				cac_time);
3071 3072 3073
	}
}

3074
bool reg_supported_dfs_region(enum nl80211_dfs_regions dfs_region)
3075 3076 3077 3078 3079 3080 3081 3082
{
	switch (dfs_region) {
	case NL80211_DFS_UNSET:
	case NL80211_DFS_FCC:
	case NL80211_DFS_ETSI:
	case NL80211_DFS_JP:
		return true;
	default:
3083
		pr_debug("Ignoring uknown DFS master region: %d\n", dfs_region);
3084 3085 3086 3087
		return false;
	}
}

3088
static void print_regdomain(const struct ieee80211_regdomain *rd)
3089
{
3090
	struct regulatory_request *lr = get_last_request();
3091

3092
	if (is_intersected_alpha2(rd->alpha2)) {
3093
		if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
3094
			struct cfg80211_registered_device *rdev;
3095
			rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx);
3096
			if (rdev) {
3097
				pr_debug("Current regulatory domain updated by AP to: %c%c\n",
3098 3099
					rdev->country_ie_alpha2[0],
					rdev->country_ie_alpha2[1]);
3100
			} else
3101
				pr_debug("Current regulatory domain intersected:\n");
3102
		} else
3103
			pr_debug("Current regulatory domain intersected:\n");
J
Johannes Berg 已提交
3104
	} else if (is_world_regdom(rd->alpha2)) {
3105
		pr_debug("World regulatory domain updated:\n");
J
Johannes Berg 已提交
3106
	} else {
3107
		if (is_unknown_alpha2(rd->alpha2))
3108
			pr_debug("Regulatory domain changed to driver built-in settings (unknown country)\n");
3109
		else {
3110
			if (reg_request_cell_base(lr))
3111
				pr_debug("Regulatory domain changed to country: %c%c by Cell Station\n",
3112 3113
					rd->alpha2[0], rd->alpha2[1]);
			else
3114
				pr_debug("Regulatory domain changed to country: %c%c\n",
3115 3116
					rd->alpha2[0], rd->alpha2[1]);
		}
3117
	}
J
Johannes Berg 已提交
3118

3119
	pr_debug(" DFS Master region: %s", reg_dfs_region_str(rd->dfs_region));
3120 3121 3122
	print_rd_rules(rd);
}

3123
static void print_regdomain_info(const struct ieee80211_regdomain *rd)
3124
{
3125
	pr_debug("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]);
3126 3127 3128
	print_rd_rules(rd);
}

3129 3130 3131 3132 3133 3134 3135 3136
static int reg_set_rd_core(const struct ieee80211_regdomain *rd)
{
	if (!is_world_regdom(rd->alpha2))
		return -EINVAL;
	update_world_regdomain(rd);
	return 0;
}

3137 3138 3139 3140 3141 3142 3143 3144 3145
static int reg_set_rd_user(const struct ieee80211_regdomain *rd,
			   struct regulatory_request *user_request)
{
	const struct ieee80211_regdomain *intersected_rd = NULL;

	if (!regdom_changes(rd->alpha2))
		return -EALREADY;

	if (!is_valid_rd(rd)) {
3146 3147
		pr_err("Invalid regulatory domain detected: %c%c\n",
		       rd->alpha2[0], rd->alpha2[1]);
3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167
		print_regdomain_info(rd);
		return -EINVAL;
	}

	if (!user_request->intersect) {
		reset_regdomains(false, rd);
		return 0;
	}

	intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
	if (!intersected_rd)
		return -EINVAL;

	kfree(rd);
	rd = NULL;
	reset_regdomains(false, intersected_rd);

	return 0;
}

3168 3169
static int reg_set_rd_driver(const struct ieee80211_regdomain *rd,
			     struct regulatory_request *driver_request)
3170
{
3171
	const struct ieee80211_regdomain *regd;
3172
	const struct ieee80211_regdomain *intersected_rd = NULL;
3173
	const struct ieee80211_regdomain *tmp;
3174
	struct wiphy *request_wiphy;
3175

3176
	if (is_world_regdom(rd->alpha2))
3177 3178
		return -EINVAL;

3179 3180
	if (!regdom_changes(rd->alpha2))
		return -EALREADY;
3181

3182
	if (!is_valid_rd(rd)) {
3183 3184
		pr_err("Invalid regulatory domain detected: %c%c\n",
		       rd->alpha2[0], rd->alpha2[1]);
3185 3186
		print_regdomain_info(rd);
		return -EINVAL;
3187 3188
	}

3189
	request_wiphy = wiphy_idx_to_wiphy(driver_request->wiphy_idx);
3190
	if (!request_wiphy)
3191
		return -ENODEV;
3192

3193
	if (!driver_request->intersect) {
3194 3195
		if (request_wiphy->regd)
			return -EALREADY;
3196

3197 3198 3199
		regd = reg_copy_regd(rd);
		if (IS_ERR(regd))
			return PTR_ERR(regd);
3200

3201
		rcu_assign_pointer(request_wiphy->regd, regd);
3202
		reset_regdomains(false, rd);
3203 3204 3205
		return 0;
	}

3206 3207 3208
	intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
	if (!intersected_rd)
		return -EINVAL;
3209

3210 3211 3212 3213 3214 3215 3216 3217
	/*
	 * We can trash what CRDA provided now.
	 * However if a driver requested this specific regulatory
	 * domain we keep it for its private use
	 */
	tmp = get_wiphy_regdom(request_wiphy);
	rcu_assign_pointer(request_wiphy->regd, rd);
	rcu_free_regdom(tmp);
3218

3219
	rd = NULL;
L
Larry Finger 已提交
3220

3221
	reset_regdomains(false, intersected_rd);
3222

3223 3224 3225
	return 0;
}

3226 3227
static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd,
				 struct regulatory_request *country_ie_request)
3228 3229
{
	struct wiphy *request_wiphy;
3230

3231 3232 3233
	if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) &&
	    !is_unknown_alpha2(rd->alpha2))
		return -EINVAL;
3234

3235 3236 3237 3238 3239 3240 3241
	/*
	 * Lets only bother proceeding on the same alpha2 if the current
	 * rd is non static (it means CRDA was present and was used last)
	 * and the pending request came in from a country IE
	 */

	if (!is_valid_rd(rd)) {
3242 3243
		pr_err("Invalid regulatory domain detected: %c%c\n",
		       rd->alpha2[0], rd->alpha2[1]);
3244 3245
		print_regdomain_info(rd);
		return -EINVAL;
3246 3247
	}

3248
	request_wiphy = wiphy_idx_to_wiphy(country_ie_request->wiphy_idx);
3249
	if (!request_wiphy)
3250
		return -ENODEV;
3251

3252
	if (country_ie_request->intersect)
3253 3254 3255 3256 3257
		return -EINVAL;

	reset_regdomains(false, rd);
	return 0;
}
3258

3259 3260
/*
 * Use this call to set the current regulatory domain. Conflicts with
3261
 * multiple drivers can be ironed out later. Caller must've already
3262
 * kmalloc'd the rd structure.
3263
 */
3264 3265
int set_regdom(const struct ieee80211_regdomain *rd,
	       enum ieee80211_regd_source regd_src)
3266
{
3267
	struct regulatory_request *lr;
3268
	bool user_reset = false;
3269 3270
	int r;

3271 3272 3273 3274 3275
	if (!reg_is_valid_request(rd->alpha2)) {
		kfree(rd);
		return -EINVAL;
	}

3276
	if (regd_src == REGD_SOURCE_CRDA)
3277
		reset_crda_timeouts();
3278

3279
	lr = get_last_request();
3280

3281
	/* Note that this doesn't update the wiphys, this is done below */
3282 3283 3284 3285 3286
	switch (lr->initiator) {
	case NL80211_REGDOM_SET_BY_CORE:
		r = reg_set_rd_core(rd);
		break;
	case NL80211_REGDOM_SET_BY_USER:
3287
		r = reg_set_rd_user(rd, lr);
3288
		user_reset = true;
3289
		break;
3290
	case NL80211_REGDOM_SET_BY_DRIVER:
3291 3292
		r = reg_set_rd_driver(rd, lr);
		break;
3293
	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
3294
		r = reg_set_rd_country_ie(rd, lr);
3295 3296 3297
		break;
	default:
		WARN(1, "invalid initiator %d\n", lr->initiator);
3298
		kfree(rd);
3299 3300 3301
		return -EINVAL;
	}

3302
	if (r) {
3303 3304
		switch (r) {
		case -EALREADY:
3305
			reg_set_request_processed();
3306 3307 3308 3309 3310
			break;
		default:
			/* Back to world regulatory in case of errors */
			restore_regulatory_settings(user_reset);
		}
3311

3312
		kfree(rd);
J
Johannes Berg 已提交
3313
		return r;
3314
	}
3315 3316

	/* This would make this whole thing pointless */
J
Johannes Berg 已提交
3317 3318
	if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom()))
		return -EINVAL;
3319 3320

	/* update all wiphys now with the new established regulatory domain */
3321
	update_all_wiphy_regulatory(lr->initiator);
3322

3323
	print_regdomain(get_cfg80211_regdom());
3324

3325
	nl80211_send_reg_change_event(lr);
3326

3327 3328
	reg_set_request_processed();

J
Johannes Berg 已提交
3329
	return 0;
3330 3331
}

3332 3333
static int __regulatory_set_wiphy_regd(struct wiphy *wiphy,
				       struct ieee80211_regdomain *rd)
3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362
{
	const struct ieee80211_regdomain *regd;
	const struct ieee80211_regdomain *prev_regd;
	struct cfg80211_registered_device *rdev;

	if (WARN_ON(!wiphy || !rd))
		return -EINVAL;

	if (WARN(!(wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED),
		 "wiphy should have REGULATORY_WIPHY_SELF_MANAGED\n"))
		return -EPERM;

	if (WARN(!is_valid_rd(rd), "Invalid regulatory domain detected\n")) {
		print_regdomain_info(rd);
		return -EINVAL;
	}

	regd = reg_copy_regd(rd);
	if (IS_ERR(regd))
		return PTR_ERR(regd);

	rdev = wiphy_to_rdev(wiphy);

	spin_lock(&reg_requests_lock);
	prev_regd = rdev->requested_regd;
	rdev->requested_regd = regd;
	spin_unlock(&reg_requests_lock);

	kfree(prev_regd);
3363 3364 3365 3366 3367 3368 3369 3370 3371 3372
	return 0;
}

int regulatory_set_wiphy_regd(struct wiphy *wiphy,
			      struct ieee80211_regdomain *rd)
{
	int ret = __regulatory_set_wiphy_regd(wiphy, rd);

	if (ret)
		return ret;
3373 3374 3375 3376 3377 3378

	schedule_work(&reg_work);
	return 0;
}
EXPORT_SYMBOL(regulatory_set_wiphy_regd);

3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395
int regulatory_set_wiphy_regd_sync_rtnl(struct wiphy *wiphy,
					struct ieee80211_regdomain *rd)
{
	int ret;

	ASSERT_RTNL();

	ret = __regulatory_set_wiphy_regd(wiphy, rd);
	if (ret)
		return ret;

	/* process the request immediately */
	reg_process_self_managed_hints();
	return 0;
}
EXPORT_SYMBOL(regulatory_set_wiphy_regd_sync_rtnl);

3396 3397
void wiphy_regulatory_register(struct wiphy *wiphy)
{
3398 3399
	struct regulatory_request *lr;

3400 3401 3402 3403 3404
	/* self-managed devices ignore external hints */
	if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
		wiphy->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS |
					   REGULATORY_COUNTRY_IE_IGNORE;

3405 3406 3407
	if (!reg_dev_ignore_cell_hint(wiphy))
		reg_num_devs_support_basehint++;

3408 3409
	lr = get_last_request();
	wiphy_update_regulatory(wiphy, lr->initiator);
3410
	wiphy_all_share_dfs_chan_state(wiphy);
3411 3412
}

3413
void wiphy_regulatory_deregister(struct wiphy *wiphy)
3414
{
3415
	struct wiphy *request_wiphy = NULL;
3416
	struct regulatory_request *lr;
3417

3418
	lr = get_last_request();
3419

3420 3421 3422
	if (!reg_dev_ignore_cell_hint(wiphy))
		reg_num_devs_support_basehint--;

3423
	rcu_free_regdom(get_wiphy_regdom(wiphy));
3424
	RCU_INIT_POINTER(wiphy->regd, NULL);
3425

3426 3427
	if (lr)
		request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
3428

3429
	if (!request_wiphy || request_wiphy != wiphy)
J
Johannes Berg 已提交
3430
		return;
3431

3432 3433
	lr->wiphy_idx = WIPHY_IDX_INVALID;
	lr->country_ie_env = ENVIRON_ANY;
3434 3435
}

3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464
/*
 * See http://www.fcc.gov/document/5-ghz-unlicensed-spectrum-unii, for
 * UNII band definitions
 */
int cfg80211_get_unii(int freq)
{
	/* UNII-1 */
	if (freq >= 5150 && freq <= 5250)
		return 0;

	/* UNII-2A */
	if (freq > 5250 && freq <= 5350)
		return 1;

	/* UNII-2B */
	if (freq > 5350 && freq <= 5470)
		return 2;

	/* UNII-2C */
	if (freq > 5470 && freq <= 5725)
		return 3;

	/* UNII-3 */
	if (freq > 5725 && freq <= 5825)
		return 4;

	return -EINVAL;
}

3465 3466 3467 3468 3469
bool regulatory_indoor_allowed(void)
{
	return reg_is_indoor;
}

3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497
bool regulatory_pre_cac_allowed(struct wiphy *wiphy)
{
	const struct ieee80211_regdomain *regd = NULL;
	const struct ieee80211_regdomain *wiphy_regd = NULL;
	bool pre_cac_allowed = false;

	rcu_read_lock();

	regd = rcu_dereference(cfg80211_regdomain);
	wiphy_regd = rcu_dereference(wiphy->regd);
	if (!wiphy_regd) {
		if (regd->dfs_region == NL80211_DFS_ETSI)
			pre_cac_allowed = true;

		rcu_read_unlock();

		return pre_cac_allowed;
	}

	if (regd->dfs_region == wiphy_regd->dfs_region &&
	    wiphy_regd->dfs_region == NL80211_DFS_ETSI)
		pre_cac_allowed = true;

	rcu_read_unlock();

	return pre_cac_allowed;
}

3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530
void regulatory_propagate_dfs_state(struct wiphy *wiphy,
				    struct cfg80211_chan_def *chandef,
				    enum nl80211_dfs_state dfs_state,
				    enum nl80211_radar_event event)
{
	struct cfg80211_registered_device *rdev;

	ASSERT_RTNL();

	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
		return;

	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		if (wiphy == &rdev->wiphy)
			continue;

		if (!reg_dfs_domain_same(wiphy, &rdev->wiphy))
			continue;

		if (!ieee80211_get_channel(&rdev->wiphy,
					   chandef->chan->center_freq))
			continue;

		cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state);

		if (event == NL80211_RADAR_DETECTED ||
		    event == NL80211_RADAR_CAC_FINISHED)
			cfg80211_sched_dfs_chan_update(rdev);

		nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL);
	}
}

3531
int __init regulatory_init(void)
3532
{
3533
	int err = 0;
3534

3535 3536 3537
	reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0);
	if (IS_ERR(reg_pdev))
		return PTR_ERR(reg_pdev);
3538

3539
	spin_lock_init(&reg_requests_lock);
3540
	spin_lock_init(&reg_pending_beacons_lock);
3541
	spin_lock_init(&reg_indoor_lock);
3542

3543 3544
	reg_regdb_size_check();

3545
	rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
3546

3547 3548 3549
	user_alpha2[0] = '9';
	user_alpha2[1] = '7';

3550
	/* We always try to get an update for the static regdomain */
3551
	err = regulatory_hint_core(cfg80211_world_regdom->alpha2);
3552
	if (err) {
3553 3554
		if (err == -ENOMEM) {
			platform_device_unregister(reg_pdev);
3555
			return err;
3556
		}
3557 3558 3559 3560 3561 3562 3563
		/*
		 * N.B. kobject_uevent_env() can fail mainly for when we're out
		 * memory which is handled and propagated appropriately above
		 * but it can also fail during a netlink_broadcast() or during
		 * early boot for call_usermodehelper(). For now treat these
		 * errors as non-fatal.
		 */
3564
		pr_err("kobject_uevent_env() was unable to call CRDA during init\n");
3565
	}
3566

3567 3568 3569 3570 3571
	/*
	 * Finally, if the user set the module parameter treat it
	 * as a user hint.
	 */
	if (!is_world_regdom(ieee80211_regdom))
3572 3573
		regulatory_hint_user(ieee80211_regdom,
				     NL80211_USER_REG_HINT_USER);
3574

3575 3576 3577
	return 0;
}

J
Johannes Berg 已提交
3578
void regulatory_exit(void)
3579
{
3580
	struct regulatory_request *reg_request, *tmp;
3581
	struct reg_beacon *reg_beacon, *btmp;
3582 3583

	cancel_work_sync(&reg_work);
3584
	cancel_crda_timeout_sync();
3585
	cancel_delayed_work_sync(&reg_check_chans);
3586

3587
	/* Lock to suppress warnings */
J
Johannes Berg 已提交
3588
	rtnl_lock();
3589
	reset_regdomains(true, NULL);
J
Johannes Berg 已提交
3590
	rtnl_unlock();
3591

3592
	dev_set_uevent_suppress(&reg_pdev->dev, true);
3593

3594
	platform_device_unregister(reg_pdev);
3595

3596 3597 3598
	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
3599 3600
	}

3601 3602 3603
	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
3604 3605
	}

3606 3607 3608
	list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
		list_del(&reg_request->list);
		kfree(reg_request);
3609
	}
3610 3611 3612

	if (!IS_ERR_OR_NULL(regdb))
		kfree(regdb);
3613
}