reg.c 62.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
 *
7 8 9 10 11 12 13 14 15 16 17
 * 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.
18 19
 */

20

21 22
/**
 * DOC: Wireless regulatory infrastructure
23 24 25 26 27 28
 *
 * 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.
 *
29 30 31 32 33 34 35 36 37 38 39 40 41 42
 * 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.
 *
43
 */
44 45 46

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

47
#include <linux/kernel.h>
48
#include <linux/export.h>
49
#include <linux/slab.h>
50
#include <linux/list.h>
51
#include <linux/ctype.h>
52 53
#include <linux/nl80211.h>
#include <linux/platform_device.h>
54
#include <linux/moduleparam.h>
55
#include <net/cfg80211.h>
56
#include "core.h"
57
#include "reg.h"
58
#include "regdb.h"
59
#include "nl80211.h"
60

61
#ifdef CONFIG_CFG80211_REG_DEBUG
62 63
#define REG_DBG_PRINT(format, args...)			\
	printk(KERN_DEBUG pr_fmt(format), ##args)
64
#else
65
#define REG_DBG_PRINT(args...)
66 67
#endif

68 69 70 71 72 73 74
enum reg_request_treatment {
	REG_REQ_OK,
	REG_REQ_IGNORE,
	REG_REQ_INTERSECT,
	REG_REQ_ALREADY_SET,
};

75 76 77 78 79 80 81 82 83
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 已提交
84 85 86 87
/*
 * Receipt of information from last regulatory request,
 * protected by RTNL (and can be accessed with RCU protection)
 */
88 89
static struct regulatory_request __rcu *last_request =
	(void __rcu *)&core_request_world;
90

91 92
/* To trigger userspace events */
static struct platform_device *reg_pdev;
93

94 95 96 97
static struct device_type reg_device_type = {
	.uevent = reg_device_uevent,
};

98 99
/*
 * Central wireless core regulatory domains, we only need two,
100
 * the current one and a world regulatory domain in case we have no
101
 * information to give us an alpha2.
J
Johannes Berg 已提交
102
 * (protected by RTNL, can be read under RCU)
103
 */
104
const struct ieee80211_regdomain __rcu *cfg80211_regdomain;
105

106 107 108
/*
 * Number of devices that registered to the core
 * that support cellular base station regulatory hints
J
Johannes Berg 已提交
109
 * (protected by RTNL)
110 111 112
 */
static int reg_num_devs_support_basehint;

113 114
static const struct ieee80211_regdomain *get_cfg80211_regdom(void)
{
J
Johannes Berg 已提交
115
	return rtnl_dereference(cfg80211_regdomain);
116 117 118 119
}

static const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy)
{
J
Johannes Berg 已提交
120
	return rtnl_dereference(wiphy->regd);
121 122 123 124 125 126 127 128 129
}

static void rcu_free_regdom(const struct ieee80211_regdomain *r)
{
	if (!r)
		return;
	kfree_rcu((struct ieee80211_regdomain *)r, rcu_head);
}

130 131
static struct regulatory_request *get_last_request(void)
{
J
Johannes Berg 已提交
132
	return rcu_dereference_rtnl(last_request);
133 134
}

135
/* Used to queue up regulatory hints */
136 137 138
static LIST_HEAD(reg_requests_list);
static spinlock_t reg_requests_lock;

139 140 141 142 143 144 145 146 147 148 149 150
/* 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;
};

151 152 153
static void reg_todo(struct work_struct *work);
static DECLARE_WORK(reg_work, reg_todo);

154 155 156
static void reg_timeout_work(struct work_struct *work);
static DECLARE_DELAYED_WORK(reg_timeout, reg_timeout_work);

157 158
/* We keep a static world regulatory domain in case of the absence of CRDA */
static const struct ieee80211_regdomain world_regdom = {
159
	.n_reg_rules = 6,
160 161
	.alpha2 =  "00",
	.reg_rules = {
162 163
		/* IEEE 802.11b/g, channels 1..11 */
		REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
164 165
		/* IEEE 802.11b/g, channels 12..13. */
		REG_RULE(2467-10, 2472+10, 40, 6, 20,
166 167
			NL80211_RRF_PASSIVE_SCAN |
			NL80211_RRF_NO_IBSS),
168 169 170 171 172 173 174
		/* IEEE 802.11 channel 14 - Only JP enables
		 * this and for 802.11b only */
		REG_RULE(2484-10, 2484+10, 20, 6, 20,
			NL80211_RRF_PASSIVE_SCAN |
			NL80211_RRF_NO_IBSS |
			NL80211_RRF_NO_OFDM),
		/* IEEE 802.11a, channel 36..48 */
175
		REG_RULE(5180-10, 5240+10, 80, 6, 20,
176 177
                        NL80211_RRF_PASSIVE_SCAN |
                        NL80211_RRF_NO_IBSS),
178

179
		/* NB: 5260 MHz - 5700 MHz requires DFS */
180 181

		/* IEEE 802.11a, channel 149..165 */
182
		REG_RULE(5745-10, 5825+10, 80, 6, 20,
183 184
			NL80211_RRF_PASSIVE_SCAN |
			NL80211_RRF_NO_IBSS),
185 186 187

		/* IEEE 802.11ad (60gHz), channels 1..3 */
		REG_RULE(56160+2160*1-1080, 56160+2160*3+1080, 2160, 0, 0, 0),
188 189 190
	}
};

J
Johannes Berg 已提交
191
/* protected by RTNL */
192 193
static const struct ieee80211_regdomain *cfg80211_world_regdom =
	&world_regdom;
194

195
static char *ieee80211_regdom = "00";
196
static char user_alpha2[2];
197

198 199 200
module_param(ieee80211_regdom, charp, 0444);
MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");

201 202
static void reset_regdomains(bool full_reset,
			     const struct ieee80211_regdomain *new_regdom)
203
{
204
	const struct ieee80211_regdomain *r;
205
	struct regulatory_request *lr;
206

J
Johannes Berg 已提交
207
	ASSERT_RTNL();
208

209 210
	r = get_cfg80211_regdom();

211
	/* avoid freeing static information or freeing something twice */
212 213
	if (r == cfg80211_world_regdom)
		r = NULL;
214 215
	if (cfg80211_world_regdom == &world_regdom)
		cfg80211_world_regdom = NULL;
216 217
	if (r == &world_regdom)
		r = NULL;
218

219 220
	rcu_free_regdom(r);
	rcu_free_regdom(cfg80211_world_regdom);
221

222
	cfg80211_world_regdom = &world_regdom;
223
	rcu_assign_pointer(cfg80211_regdomain, new_regdom);
224 225 226 227

	if (!full_reset)
		return;

228 229 230 231
	lr = get_last_request();
	if (lr != &core_request_world && lr)
		kfree_rcu(lr, rcu_head);
	rcu_assign_pointer(last_request, &core_request_world);
232 233
}

234 235 236 237
/*
 * Dynamic world regulatory domain requested by the wireless
 * core upon initialization
 */
238
static void update_world_regdomain(const struct ieee80211_regdomain *rd)
239
{
240
	struct regulatory_request *lr;
241

242 243 244
	lr = get_last_request();

	WARN_ON(!lr);
245

246
	reset_regdomains(false, rd);
247 248 249 250

	cfg80211_world_regdom = rd;
}

251
bool is_world_regdom(const char *alpha2)
252 253 254
{
	if (!alpha2)
		return false;
J
Johannes Berg 已提交
255
	return alpha2[0] == '0' && alpha2[1] == '0';
256
}
257

258
static bool is_alpha2_set(const char *alpha2)
259 260 261
{
	if (!alpha2)
		return false;
J
Johannes Berg 已提交
262
	return alpha2[0] && alpha2[1];
263
}
264

265
static bool is_unknown_alpha2(const char *alpha2)
266 267 268
{
	if (!alpha2)
		return false;
269 270 271 272
	/*
	 * Special case where regulatory domain was built by driver
	 * but a specific alpha2 cannot be determined
	 */
J
Johannes Berg 已提交
273
	return alpha2[0] == '9' && alpha2[1] == '9';
274
}
275

276 277 278 279
static bool is_intersected_alpha2(const char *alpha2)
{
	if (!alpha2)
		return false;
280 281
	/*
	 * Special case where regulatory domain is the
282
	 * result of an intersection between two regulatory domain
283 284
	 * structures
	 */
J
Johannes Berg 已提交
285
	return alpha2[0] == '9' && alpha2[1] == '8';
286 287
}

288
static bool is_an_alpha2(const char *alpha2)
289 290 291
{
	if (!alpha2)
		return false;
J
Johannes Berg 已提交
292
	return isalpha(alpha2[0]) && isalpha(alpha2[1]);
293
}
294

295
static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
296 297 298
{
	if (!alpha2_x || !alpha2_y)
		return false;
J
Johannes Berg 已提交
299
	return alpha2_x[0] == alpha2_y[0] && alpha2_x[1] == alpha2_y[1];
300 301
}

302
static bool regdom_changes(const char *alpha2)
303
{
304
	const struct ieee80211_regdomain *r = get_cfg80211_regdom();
305

306
	if (!r)
307
		return true;
308
	return !alpha2_equal(r->alpha2, alpha2);
309 310
}

311 312 313 314 315 316 317 318 319 320 321
/*
 * 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 已提交
322
	if (WARN(!is_world_regdom(user_alpha2) && !is_an_alpha2(user_alpha2),
323
		 "Unexpected user alpha2: %c%c\n",
J
Johannes Berg 已提交
324
		 user_alpha2[0], user_alpha2[1]))
325 326 327 328 329
		return false;

	return true;
}

330 331
static const struct ieee80211_regdomain *
reg_copy_regd(const struct ieee80211_regdomain *src_regd)
332 333
{
	struct ieee80211_regdomain *regd;
334
	int size_of_regd;
335 336
	unsigned int i;

337 338 339
	size_of_regd =
		sizeof(struct ieee80211_regdomain) +
		src_regd->n_reg_rules * sizeof(struct ieee80211_reg_rule);
340 341 342

	regd = kzalloc(size_of_regd, GFP_KERNEL);
	if (!regd)
343
		return ERR_PTR(-ENOMEM);
344 345 346 347 348

	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],
349
		       sizeof(struct ieee80211_reg_rule));
350

351
	return regd;
352 353 354 355 356 357 358 359 360
}

#ifdef CONFIG_CFG80211_INTERNAL_REGDB
struct reg_regdb_search_request {
	char alpha2[2];
	struct list_head list;
};

static LIST_HEAD(reg_regdb_search_list);
361
static DEFINE_MUTEX(reg_regdb_search_mutex);
362 363 364 365

static void reg_regdb_search(struct work_struct *work)
{
	struct reg_regdb_search_request *request;
366 367
	const struct ieee80211_regdomain *curdom, *regdom = NULL;
	int i;
368

369
	rtnl_lock();
370

371
	mutex_lock(&reg_regdb_search_mutex);
372 373 374 375 376 377
	while (!list_empty(&reg_regdb_search_list)) {
		request = list_first_entry(&reg_regdb_search_list,
					   struct reg_regdb_search_request,
					   list);
		list_del(&request->list);

J
Johannes Berg 已提交
378
		for (i = 0; i < reg_regdb_size; i++) {
379 380
			curdom = reg_regdb[i];

J
Johannes Berg 已提交
381
			if (alpha2_equal(request->alpha2, curdom->alpha2)) {
382
				regdom = reg_copy_regd(curdom);
383 384 385 386 387 388
				break;
			}
		}

		kfree(request);
	}
389
	mutex_unlock(&reg_regdb_search_mutex);
390

391
	if (!IS_ERR_OR_NULL(regdom))
392 393
		set_regdom(regdom);

394
	rtnl_unlock();
395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
}

static DECLARE_WORK(reg_regdb_work, reg_regdb_search);

static void reg_regdb_query(const char *alpha2)
{
	struct reg_regdb_search_request *request;

	if (!alpha2)
		return;

	request = kzalloc(sizeof(struct reg_regdb_search_request), GFP_KERNEL);
	if (!request)
		return;

	memcpy(request->alpha2, alpha2, 2);

412
	mutex_lock(&reg_regdb_search_mutex);
413
	list_add_tail(&request->list, &reg_regdb_search_list);
414
	mutex_unlock(&reg_regdb_search_mutex);
415 416 417

	schedule_work(&reg_regdb_work);
}
418 419 420 421 422 423 424

/* 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...");
}
425
#else
426
static inline void reg_regdb_size_check(void) {}
427 428 429
static inline void reg_regdb_query(const char *alpha2) {}
#endif /* CONFIG_CFG80211_INTERNAL_REGDB */

430 431
/*
 * This lets us keep regulatory code which is updated on a regulatory
432 433
 * basis in userspace. Country information is filled in by
 * reg_device_uevent
434
 */
435 436 437
static int call_crda(const char *alpha2)
{
	if (!is_world_regdom((char *) alpha2))
438
		pr_info("Calling CRDA for country: %c%c\n",
439 440
			alpha2[0], alpha2[1]);
	else
441
		pr_info("Calling CRDA to update world regulatory domain\n");
442

443 444 445
	/* query internal regulatory database (if it exists) */
	reg_regdb_query(alpha2);

446
	return kobject_uevent(&reg_pdev->dev.kobj, KOBJ_CHANGE);
447 448
}

449
static bool reg_is_valid_request(const char *alpha2)
450
{
451
	struct regulatory_request *lr = get_last_request();
452

453
	if (!lr || lr->processed)
454 455
		return false;

456
	return alpha2_equal(lr->alpha2, alpha2);
457
}
458

459
/* Sanity check on a regulatory rule */
460
static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)
461
{
462
	const struct ieee80211_freq_range *freq_range = &rule->freq_range;
463 464
	u32 freq_diff;

465
	if (freq_range->start_freq_khz <= 0 || freq_range->end_freq_khz <= 0)
466 467 468 469 470 471 472
		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;

473
	if (freq_range->end_freq_khz <= freq_range->start_freq_khz ||
J
Johannes Berg 已提交
474
	    freq_range->max_bandwidth_khz > freq_diff)
475 476 477 478 479
		return false;

	return true;
}

480
static bool is_valid_rd(const struct ieee80211_regdomain *rd)
481
{
482
	const struct ieee80211_reg_rule *reg_rule = NULL;
483
	unsigned int i;
484

485 486
	if (!rd->n_reg_rules)
		return false;
487

488 489 490
	if (WARN_ON(rd->n_reg_rules > NL80211_MAX_SUPP_REG_RULES))
		return false;

491 492 493 494 495 496 497
	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;
498 499
}

500
static bool reg_does_bw_fit(const struct ieee80211_freq_range *freq_range,
501
			    u32 center_freq_khz, u32 bw_khz)
502
{
503 504 505 506 507 508 509 510 511 512
	u32 start_freq_khz, end_freq_khz;

	start_freq_khz = center_freq_khz - (bw_khz/2);
	end_freq_khz = center_freq_khz + (bw_khz/2);

	if (start_freq_khz >= freq_range->start_freq_khz &&
	    end_freq_khz <= freq_range->end_freq_khz)
		return true;

	return false;
513
}
514

515 516 517 518 519 520 521
/**
 * 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
522 523 524 525 526
 * 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.
527 528 529 530
 * 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 已提交
531
			      u32 freq_khz)
532 533
{
#define ONE_GHZ_IN_KHZ	1000000
534 535 536 537 538 539 540 541
	/*
	 * 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)
542
		return true;
543
	if (abs(freq_khz - freq_range->end_freq_khz) <= limit)
544 545 546 547 548
		return true;
	return false;
#undef ONE_GHZ_IN_KHZ
}

549 550 551 552
/*
 * Helper for regdom_intersect(), this does the real
 * mathematical intersection fun
 */
J
Johannes Berg 已提交
553 554 555
static int reg_rules_intersect(const struct ieee80211_reg_rule *rule1,
			       const struct ieee80211_reg_rule *rule2,
			       struct ieee80211_reg_rule *intersected_rule)
556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
{
	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;
	u32 freq_diff;

	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 已提交
572
					 freq_range2->start_freq_khz);
573
	freq_range->end_freq_khz = min(freq_range1->end_freq_khz,
J
Johannes Berg 已提交
574
				       freq_range2->end_freq_khz);
575
	freq_range->max_bandwidth_khz = min(freq_range1->max_bandwidth_khz,
J
Johannes Berg 已提交
576
					    freq_range2->max_bandwidth_khz);
577 578 579 580 581 582 583 584 585 586

	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);

J
Johannes Berg 已提交
587
	intersected_rule->flags = rule1->flags | rule2->flags;
588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607

	if (!is_valid_reg_rule(intersected_rule))
		return -EINVAL;

	return 0;
}

/**
 * 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 已提交
608 609 610
static struct ieee80211_regdomain *
regdom_intersect(const struct ieee80211_regdomain *rd1,
		 const struct ieee80211_regdomain *rd2)
611 612 613 614 615 616 617 618
{
	int r, size_of_regd;
	unsigned int x, y;
	unsigned int num_rules = 0, rule_idx = 0;
	const struct ieee80211_reg_rule *rule1, *rule2;
	struct ieee80211_reg_rule *intersected_rule;
	struct ieee80211_regdomain *rd;
	/* This is just a dummy holder to help us count */
619
	struct ieee80211_reg_rule dummy_rule;
620 621 622 623

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

624 625
	/*
	 * First we get a count of the rules we'll need, then we actually
626 627 628
	 * 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.
629 630
	 * All rules that do check out OK are valid.
	 */
631 632 633 634 635

	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];
636
			if (!reg_rules_intersect(rule1, rule2, &dummy_rule))
637 638 639 640 641 642 643 644
				num_rules++;
		}
	}

	if (!num_rules)
		return NULL;

	size_of_regd = sizeof(struct ieee80211_regdomain) +
645
		       num_rules * sizeof(struct ieee80211_reg_rule);
646 647 648 649 650

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

651
	for (x = 0; x < rd1->n_reg_rules && rule_idx < num_rules; x++) {
652
		rule1 = &rd1->reg_rules[x];
653
		for (y = 0; y < rd2->n_reg_rules && rule_idx < num_rules; y++) {
654
			rule2 = &rd2->reg_rules[y];
655 656
			/*
			 * This time around instead of using the stack lets
657
			 * write to the target rule directly saving ourselves
658 659
			 * a memcpy()
			 */
660
			intersected_rule = &rd->reg_rules[rule_idx];
J
Johannes Berg 已提交
661
			r = reg_rules_intersect(rule1, rule2, intersected_rule);
662 663 664 665
			/*
			 * No need to memset here the intersected rule here as
			 * we're not using the stack anymore
			 */
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
			if (r)
				continue;
			rule_idx++;
		}
	}

	if (rule_idx != num_rules) {
		kfree(rd);
		return NULL;
	}

	rd->n_reg_rules = num_rules;
	rd->alpha2[0] = '9';
	rd->alpha2[1] = '8';

	return rd;
}

684 685 686 687
/*
 * XXX: add support for the rest of enum nl80211_reg_rule_flags, we may
 * want to just have the channel structure use these
 */
688 689 690 691 692 693 694 695 696
static u32 map_regdom_flags(u32 rd_flags)
{
	u32 channel_flags = 0;
	if (rd_flags & NL80211_RRF_PASSIVE_SCAN)
		channel_flags |= IEEE80211_CHAN_PASSIVE_SCAN;
	if (rd_flags & NL80211_RRF_NO_IBSS)
		channel_flags |= IEEE80211_CHAN_NO_IBSS;
	if (rd_flags & NL80211_RRF_DFS)
		channel_flags |= IEEE80211_CHAN_RADAR;
697 698
	if (rd_flags & NL80211_RRF_NO_OFDM)
		channel_flags |= IEEE80211_CHAN_NO_OFDM;
699 700 701
	return channel_flags;
}

702 703 704
static const struct ieee80211_reg_rule *
freq_reg_info_regd(struct wiphy *wiphy, u32 center_freq,
		   const struct ieee80211_regdomain *regd)
705 706
{
	int i;
707
	bool band_rule_found = false;
708 709
	bool bw_fits = false;

710
	if (!regd)
711
		return ERR_PTR(-EINVAL);
712

713
	for (i = 0; i < regd->n_reg_rules; i++) {
714 715 716
		const struct ieee80211_reg_rule *rr;
		const struct ieee80211_freq_range *fr = NULL;

717
		rr = &regd->reg_rules[i];
718
		fr = &rr->freq_range;
719

720 721
		/*
		 * We only need to know if one frequency rule was
722
		 * was in center_freq's band, that's enough, so lets
723 724
		 * not overwrite it once found
		 */
725 726 727
		if (!band_rule_found)
			band_rule_found = freq_in_rule_band(fr, center_freq);

728
		bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(20));
729

730 731
		if (band_rule_found && bw_fits)
			return rr;
732 733
	}

734
	if (!band_rule_found)
735
		return ERR_PTR(-ERANGE);
736

737
	return ERR_PTR(-EINVAL);
738 739
}

740 741
const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
					       u32 center_freq)
742
{
743
	const struct ieee80211_regdomain *regd;
744
	struct regulatory_request *lr = get_last_request();
J
Johannes Berg 已提交
745

746 747 748 749
	/*
	 * Follow the driver's regulatory domain, if present, unless a country
	 * IE has been processed or a user wants to help complaince further
	 */
750 751
	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
	    lr->initiator != NL80211_REGDOM_SET_BY_USER &&
752
	    wiphy->regd)
753
		regd = get_wiphy_regdom(wiphy);
754
	else
755
		regd = get_cfg80211_regdom();
756

757
	return freq_reg_info_regd(wiphy, center_freq, regd);
758
}
759
EXPORT_SYMBOL(freq_reg_info);
760

761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777
#ifdef CONFIG_CFG80211_REG_DEBUG
static const char *reg_initiator_name(enum nl80211_reg_initiator initiator)
{
	switch (initiator) {
	case NL80211_REGDOM_SET_BY_CORE:
		return "Set by core";
	case NL80211_REGDOM_SET_BY_USER:
		return "Set by user";
	case NL80211_REGDOM_SET_BY_DRIVER:
		return "Set by driver";
	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
		return "Set by country IE";
	default:
		WARN_ON(1);
		return "Set by bug";
	}
}
778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793

static void chan_reg_rule_print_dbg(struct ieee80211_channel *chan,
				    const struct ieee80211_reg_rule *reg_rule)
{
	const struct ieee80211_power_rule *power_rule;
	const struct ieee80211_freq_range *freq_range;
	char max_antenna_gain[32];

	power_rule = &reg_rule->power_rule;
	freq_range = &reg_rule->freq_range;

	if (!power_rule->max_antenna_gain)
		snprintf(max_antenna_gain, 32, "N/A");
	else
		snprintf(max_antenna_gain, 32, "%d", power_rule->max_antenna_gain);

794 795
	REG_DBG_PRINT("Updating information on frequency %d MHz with regulatory rule:\n",
		      chan->center_freq);
796

797
	REG_DBG_PRINT("%d KHz - %d KHz @ %d KHz), (%s mBi, %d mBm)\n",
J
Johannes Berg 已提交
798 799
		      freq_range->start_freq_khz, freq_range->end_freq_khz,
		      freq_range->max_bandwidth_khz, max_antenna_gain,
800 801 802 803 804 805 806 807
		      power_rule->max_eirp);
}
#else
static void chan_reg_rule_print_dbg(struct ieee80211_channel *chan,
				    const struct ieee80211_reg_rule *reg_rule)
{
	return;
}
808 809
#endif

810 811 812
/*
 * Note that right now we assume the desired channel bandwidth
 * is always 20 MHz for each individual channel (HT40 uses 20 MHz
813
 * per channel, the primary and the extension channel).
814
 */
815 816
static void handle_channel(struct wiphy *wiphy,
			   enum nl80211_reg_initiator initiator,
J
Johannes Berg 已提交
817
			   struct ieee80211_channel *chan)
818
{
819
	u32 flags, bw_flags = 0;
820 821
	const struct ieee80211_reg_rule *reg_rule = NULL;
	const struct ieee80211_power_rule *power_rule = NULL;
822
	const struct ieee80211_freq_range *freq_range = NULL;
823
	struct wiphy *request_wiphy = NULL;
824
	struct regulatory_request *lr = get_last_request();
825

826
	request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
827 828

	flags = chan->orig_flags;
829

830 831
	reg_rule = freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq));
	if (IS_ERR(reg_rule)) {
832 833
		/*
		 * We will disable all channels that do not match our
L
Lucas De Marchi 已提交
834
		 * received regulatory rule unless the hint is coming
835 836 837 838 839 840 841 842
		 * 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 &&
843
		    PTR_ERR(reg_rule) == -ERANGE)
844 845
			return;

846
		REG_DBG_PRINT("Disabling freq %d MHz\n", chan->center_freq);
847
		chan->flags |= IEEE80211_CHAN_DISABLED;
848
		return;
849
	}
850

851
	chan_reg_rule_print_dbg(chan, reg_rule);
852

853
	power_rule = &reg_rule->power_rule;
854 855 856 857
	freq_range = &reg_rule->freq_range;

	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(40))
		bw_flags = IEEE80211_CHAN_NO_HT40;
858 859 860 861
	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(80))
		bw_flags |= IEEE80211_CHAN_NO_80MHZ;
	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(160))
		bw_flags |= IEEE80211_CHAN_NO_160MHZ;
862

863
	if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
864
	    request_wiphy && request_wiphy == wiphy &&
J
Johannes Berg 已提交
865
	    request_wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY) {
866
		/*
L
Lucas De Marchi 已提交
867
		 * This guarantees the driver's requested regulatory domain
868
		 * will always be used as a base for further regulatory
869 870
		 * settings
		 */
871
		chan->flags = chan->orig_flags =
872
			map_regdom_flags(reg_rule->flags) | bw_flags;
873 874
		chan->max_antenna_gain = chan->orig_mag =
			(int) MBI_TO_DBI(power_rule->max_antenna_gain);
875
		chan->max_reg_power = chan->max_power = chan->orig_mpwr =
876 877 878 879
			(int) MBM_TO_DBM(power_rule->max_eirp);
		return;
	}

880 881 882
	chan->dfs_state = NL80211_DFS_USABLE;
	chan->dfs_state_entered = jiffies;

883
	chan->beacon_found = false;
884
	chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
J
Johannes Berg 已提交
885 886 887
	chan->max_antenna_gain =
		min_t(int, chan->orig_mag,
		      MBI_TO_DBI(power_rule->max_antenna_gain));
888
	chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp);
889 890 891 892 893 894 895 896 897 898 899 900 901 902 903
	if (chan->orig_mpwr) {
		/*
		 * Devices that have their own custom regulatory domain
		 * but also use WIPHY_FLAG_STRICT_REGULATORY will follow the
		 * passed country IE power settings.
		 */
		if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
		    wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY &&
		    wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY)
			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;
904 905
}

906
static void handle_band(struct wiphy *wiphy,
J
Johannes Berg 已提交
907 908
			enum nl80211_reg_initiator initiator,
			struct ieee80211_supported_band *sband)
909
{
910 911
	unsigned int i;

J
Johannes Berg 已提交
912 913
	if (!sband)
		return;
914 915

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

919 920 921 922
static bool reg_request_cell_base(struct regulatory_request *request)
{
	if (request->initiator != NL80211_REGDOM_SET_BY_USER)
		return false;
J
Johannes Berg 已提交
923
	return request->user_reg_hint_type == NL80211_USER_REG_HINT_CELL_BASE;
924 925 926 927
}

bool reg_last_request_cell_base(void)
{
J
Johannes Berg 已提交
928
	return reg_request_cell_base(get_last_request());
929 930 931 932
}

#ifdef CONFIG_CFG80211_CERTIFICATION_ONUS
/* Core specific check */
933 934
static enum reg_request_treatment
reg_ignore_cell_hint(struct regulatory_request *pending_request)
935
{
936 937
	struct regulatory_request *lr = get_last_request();

938
	if (!reg_num_devs_support_basehint)
939
		return REG_REQ_IGNORE;
940

941
	if (reg_request_cell_base(lr) &&
J
Johannes Berg 已提交
942
	    !regdom_changes(pending_request->alpha2))
943
		return REG_REQ_ALREADY_SET;
J
Johannes Berg 已提交
944

945
	return REG_REQ_OK;
946 947 948 949 950
}

/* Device specific check */
static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
{
J
Johannes Berg 已提交
951
	return !(wiphy->features & NL80211_FEATURE_CELL_BASE_REG_HINTS);
952 953 954 955
}
#else
static int reg_ignore_cell_hint(struct regulatory_request *pending_request)
{
956
	return REG_REQ_IGNORE;
957
}
J
Johannes Berg 已提交
958 959

static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
960 961 962 963 964 965
{
	return true;
}
#endif


966 967
static bool ignore_reg_update(struct wiphy *wiphy,
			      enum nl80211_reg_initiator initiator)
968
{
969 970 971
	struct regulatory_request *lr = get_last_request();

	if (!lr) {
J
Johannes Berg 已提交
972
		REG_DBG_PRINT("Ignoring regulatory request %s since last_request is not set\n",
973
			      reg_initiator_name(initiator));
974
		return true;
975 976
	}

977
	if (initiator == NL80211_REGDOM_SET_BY_CORE &&
978
	    wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY) {
J
Johannes Berg 已提交
979
		REG_DBG_PRINT("Ignoring regulatory request %s since the driver uses its own custom regulatory domain\n",
980
			      reg_initiator_name(initiator));
981
		return true;
982 983
	}

984 985 986 987
	/*
	 * wiphy->regd will be set once the device has its own
	 * desired regulatory domain set
	 */
J
Johannes Berg 已提交
988
	if (wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY && !wiphy->regd &&
989
	    initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
990
	    !is_world_regdom(lr->alpha2)) {
J
Johannes Berg 已提交
991
		REG_DBG_PRINT("Ignoring regulatory request %s since the driver requires its own regulatory domain to be set first\n",
992
			      reg_initiator_name(initiator));
993
		return true;
994 995
	}

996
	if (reg_request_cell_base(lr))
997 998
		return reg_dev_ignore_cell_hint(wiphy);

999 1000 1001
	return false;
}

1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
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 &&
	    wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY)
		return true;

	return false;
}

J
Johannes Berg 已提交
1018
static void handle_reg_beacon(struct wiphy *wiphy, unsigned int chan_idx,
1019 1020 1021 1022
			      struct reg_beacon *reg_beacon)
{
	struct ieee80211_supported_band *sband;
	struct ieee80211_channel *chan;
1023 1024
	bool channel_changed = false;
	struct ieee80211_channel chan_before;
1025 1026 1027 1028 1029 1030 1031

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

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

1032 1033 1034 1035 1036
	if (chan->beacon_found)
		return;

	chan->beacon_found = true;

1037 1038 1039
	if (!reg_is_world_roaming(wiphy))
		return;

J
Johannes Berg 已提交
1040
	if (wiphy->flags & WIPHY_FLAG_DISABLE_BEACON_HINTS)
1041 1042
		return;

1043 1044 1045
	chan_before.center_freq = chan->center_freq;
	chan_before.flags = chan->flags;

1046
	if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) {
1047
		chan->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
1048
		channel_changed = true;
1049 1050
	}

1051
	if (chan->flags & IEEE80211_CHAN_NO_IBSS) {
1052
		chan->flags &= ~IEEE80211_CHAN_NO_IBSS;
1053
		channel_changed = true;
1054 1055
	}

1056 1057
	if (channel_changed)
		nl80211_send_beacon_hint_event(wiphy, &chan_before, chan);
1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
}

/*
 * 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)
{
1100 1101 1102 1103 1104 1105
	/*
	 * Means we are just firing up cfg80211, so no beacons would
	 * have been processed yet.
	 */
	if (!last_request)
		return;
1106 1107 1108
	wiphy_update_beacon_reg(wiphy);
}

J
Johannes Berg 已提交
1109
static bool is_ht40_allowed(struct ieee80211_channel *chan)
1110 1111
{
	if (!chan)
J
Johannes Berg 已提交
1112
		return false;
1113
	if (chan->flags & IEEE80211_CHAN_DISABLED)
J
Johannes Berg 已提交
1114
		return false;
1115
	/* This would happen when regulatory rules disallow HT40 completely */
1116 1117 1118
	if ((chan->flags & IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40)
		return false;
	return true;
1119 1120 1121
}

static void reg_process_ht_flags_channel(struct wiphy *wiphy,
J
Johannes Berg 已提交
1122
					 struct ieee80211_channel *channel)
1123
{
J
Johannes Berg 已提交
1124
	struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
1125 1126 1127
	struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
	unsigned int i;

J
Johannes Berg 已提交
1128
	if (!is_ht40_allowed(channel)) {
1129 1130 1131 1132 1133 1134 1135 1136 1137 1138
		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 已提交
1139

1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150
		if (c->center_freq == (channel->center_freq - 20))
			channel_before = c;
		if (c->center_freq == (channel->center_freq + 20))
			channel_after = c;
	}

	/*
	 * 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.
	 */
J
Johannes Berg 已提交
1151
	if (!is_ht40_allowed(channel_before))
1152
		channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
1153
	else
1154
		channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
1155

J
Johannes Berg 已提交
1156
	if (!is_ht40_allowed(channel_after))
1157
		channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
1158
	else
1159
		channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
1160 1161 1162
}

static void reg_process_ht_flags_band(struct wiphy *wiphy,
J
Johannes Berg 已提交
1163
				      struct ieee80211_supported_band *sband)
1164 1165 1166
{
	unsigned int i;

J
Johannes Berg 已提交
1167 1168
	if (!sband)
		return;
1169 1170

	for (i = 0; i < sband->n_channels; i++)
J
Johannes Berg 已提交
1171
		reg_process_ht_flags_channel(wiphy, &sband->channels[i]);
1172 1173 1174 1175 1176 1177 1178 1179 1180
}

static void reg_process_ht_flags(struct wiphy *wiphy)
{
	enum ieee80211_band band;

	if (!wiphy)
		return;

J
Johannes Berg 已提交
1181 1182
	for (band = 0; band < IEEE80211_NUM_BANDS; band++)
		reg_process_ht_flags_band(wiphy, wiphy->bands[band]);
1183 1184
}

1185 1186
static void wiphy_update_regulatory(struct wiphy *wiphy,
				    enum nl80211_reg_initiator initiator)
1187 1188
{
	enum ieee80211_band band;
1189
	struct regulatory_request *lr = get_last_request();
1190

1191
	if (ignore_reg_update(wiphy, initiator))
1192 1193
		return;

1194
	lr->dfs_region = get_cfg80211_regdom()->dfs_region;
1195

J
Johannes Berg 已提交
1196 1197
	for (band = 0; band < IEEE80211_NUM_BANDS; band++)
		handle_band(wiphy, initiator, wiphy->bands[band]);
1198

1199
	reg_process_beacons(wiphy);
1200
	reg_process_ht_flags(wiphy);
J
Johannes Berg 已提交
1201

1202
	if (wiphy->reg_notifier)
1203
		wiphy->reg_notifier(wiphy, lr);
1204 1205
}

1206 1207 1208
static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
{
	struct cfg80211_registered_device *rdev;
1209
	struct wiphy *wiphy;
1210

1211
	ASSERT_RTNL();
1212

1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		wiphy = &rdev->wiphy;
		wiphy_update_regulatory(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 &&
		    wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY &&
		    wiphy->reg_notifier)
1224
			wiphy->reg_notifier(wiphy, get_last_request());
1225
	}
1226 1227
}

1228
static void handle_channel_custom(struct wiphy *wiphy,
J
Johannes Berg 已提交
1229
				  struct ieee80211_channel *chan,
1230 1231
				  const struct ieee80211_regdomain *regd)
{
1232
	u32 bw_flags = 0;
1233 1234
	const struct ieee80211_reg_rule *reg_rule = NULL;
	const struct ieee80211_power_rule *power_rule = NULL;
1235
	const struct ieee80211_freq_range *freq_range = NULL;
1236

1237 1238
	reg_rule = freq_reg_info_regd(wiphy, MHZ_TO_KHZ(chan->center_freq),
				      regd);
1239

1240
	if (IS_ERR(reg_rule)) {
1241 1242
		REG_DBG_PRINT("Disabling freq %d MHz as custom regd has no rule that fits it\n",
			      chan->center_freq);
1243 1244 1245 1246
		chan->flags = IEEE80211_CHAN_DISABLED;
		return;
	}

1247
	chan_reg_rule_print_dbg(chan, reg_rule);
1248

1249
	power_rule = &reg_rule->power_rule;
1250 1251 1252 1253
	freq_range = &reg_rule->freq_range;

	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(40))
		bw_flags = IEEE80211_CHAN_NO_HT40;
1254 1255 1256 1257
	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(80))
		bw_flags |= IEEE80211_CHAN_NO_80MHZ;
	if (freq_range->max_bandwidth_khz < MHZ_TO_KHZ(160))
		bw_flags |= IEEE80211_CHAN_NO_160MHZ;
1258

1259
	chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;
1260
	chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
1261 1262
	chan->max_reg_power = chan->max_power =
		(int) MBM_TO_DBM(power_rule->max_eirp);
1263 1264
}

J
Johannes Berg 已提交
1265 1266
static void handle_band_custom(struct wiphy *wiphy,
			       struct ieee80211_supported_band *sband,
1267 1268 1269 1270
			       const struct ieee80211_regdomain *regd)
{
	unsigned int i;

J
Johannes Berg 已提交
1271 1272
	if (!sband)
		return;
1273 1274

	for (i = 0; i < sband->n_channels; i++)
J
Johannes Berg 已提交
1275
		handle_channel_custom(wiphy, &sband->channels[i], regd);
1276 1277 1278 1279 1280 1281 1282
}

/* Used by drivers prior to wiphy registration */
void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
				   const struct ieee80211_regdomain *regd)
{
	enum ieee80211_band band;
1283
	unsigned int bands_set = 0;
1284

1285
	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1286 1287
		if (!wiphy->bands[band])
			continue;
J
Johannes Berg 已提交
1288
		handle_band_custom(wiphy, wiphy->bands[band], regd);
1289
		bands_set++;
1290
	}
1291 1292 1293

	/*
	 * no point in calling this if it won't have any effect
J
Johannes Berg 已提交
1294
	 * on your device's supported bands.
1295 1296
	 */
	WARN_ON(!bands_set);
1297
}
1298 1299
EXPORT_SYMBOL(wiphy_apply_custom_regulatory);

1300 1301
/* This has the logic which determines when a new request
 * should be ignored. */
1302 1303
static enum reg_request_treatment
get_reg_request_treatment(struct wiphy *wiphy,
1304
			  struct regulatory_request *pending_request)
1305
{
1306
	struct wiphy *last_wiphy = NULL;
1307
	struct regulatory_request *lr = get_last_request();
1308

1309
	/* All initial requests are respected */
1310
	if (!lr)
1311
		return REG_REQ_OK;
1312

1313
	switch (pending_request->initiator) {
1314
	case NL80211_REGDOM_SET_BY_CORE:
1315
		return REG_REQ_OK;
1316
	case NL80211_REGDOM_SET_BY_COUNTRY_IE:
1317
		if (reg_request_cell_base(lr)) {
1318 1319
			/* Trust a Cell base station over the AP's country IE */
			if (regdom_changes(pending_request->alpha2))
1320 1321
				return REG_REQ_IGNORE;
			return REG_REQ_ALREADY_SET;
1322 1323
		}

1324
		last_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
1325

1326
		if (unlikely(!is_an_alpha2(pending_request->alpha2)))
1327
			return -EINVAL;
1328
		if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
1329
			if (last_wiphy != wiphy) {
1330 1331
				/*
				 * Two cards with two APs claiming different
1332
				 * Country IE alpha2s. We could
1333 1334 1335
				 * intersect them, but that seems unlikely
				 * to be correct. Reject second one for now.
				 */
1336
				if (regdom_changes(pending_request->alpha2))
1337 1338
					return REG_REQ_IGNORE;
				return REG_REQ_ALREADY_SET;
1339
			}
1340 1341 1342 1343
			/*
			 * Two consecutive Country IE hints on the same wiphy.
			 * This should be picked up early by the driver/stack
			 */
1344
			if (WARN_ON(regdom_changes(pending_request->alpha2)))
1345 1346
				return REG_REQ_OK;
			return REG_REQ_ALREADY_SET;
1347
		}
1348
		return REG_REQ_OK;
1349
	case NL80211_REGDOM_SET_BY_DRIVER:
1350
		if (lr->initiator == NL80211_REGDOM_SET_BY_CORE) {
1351
			if (regdom_changes(pending_request->alpha2))
1352 1353
				return REG_REQ_OK;
			return REG_REQ_ALREADY_SET;
1354
		}
1355 1356 1357 1358 1359 1360

		/*
		 * 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.
		 */
1361
		if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
1362
		    !regdom_changes(pending_request->alpha2))
1363
			return REG_REQ_ALREADY_SET;
1364

1365
		return REG_REQ_INTERSECT;
1366
	case NL80211_REGDOM_SET_BY_USER:
1367 1368 1369
		if (reg_request_cell_base(pending_request))
			return reg_ignore_cell_hint(pending_request);

1370
		if (reg_request_cell_base(lr))
1371
			return REG_REQ_IGNORE;
1372

1373
		if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)
1374
			return REG_REQ_INTERSECT;
1375 1376 1377 1378
		/*
		 * If the user knows better the user should set the regdom
		 * to their country before the IE is picked up
		 */
1379 1380
		if (lr->initiator == NL80211_REGDOM_SET_BY_USER &&
		    lr->intersect)
1381
			return REG_REQ_IGNORE;
1382 1383 1384 1385
		/*
		 * Process user requests only after previous user/driver/core
		 * requests have been processed
		 */
1386 1387 1388 1389
		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))
1390
			return REG_REQ_IGNORE;
1391

1392
		if (!regdom_changes(pending_request->alpha2))
1393
			return REG_REQ_ALREADY_SET;
1394

1395
		return REG_REQ_OK;
1396 1397
	}

1398
	return REG_REQ_IGNORE;
1399 1400
}

1401 1402 1403
static void reg_set_request_processed(void)
{
	bool need_more_processing = false;
1404
	struct regulatory_request *lr = get_last_request();
1405

1406
	lr->processed = true;
1407 1408 1409 1410 1411 1412

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

1413
	if (lr->initiator == NL80211_REGDOM_SET_BY_USER)
1414
		cancel_delayed_work(&reg_timeout);
1415

1416 1417 1418 1419
	if (need_more_processing)
		schedule_work(&reg_work);
}

1420 1421 1422 1423
/**
 * __regulatory_hint - hint to the wireless core a regulatory domain
 * @wiphy: if the hint comes from country information from an AP, this
 *	is required to be set to the wiphy that received the information
1424
 * @pending_request: the regulatory request currently being processed
1425 1426
 *
 * The Wireless subsystem can use this function to hint to the wireless core
1427
 * what it believes should be the current regulatory domain.
1428
 *
1429
 * Returns one of the different reg request treatment values.
1430
 */
1431 1432 1433
static enum reg_request_treatment
__regulatory_hint(struct wiphy *wiphy,
		  struct regulatory_request *pending_request)
1434
{
1435
	const struct ieee80211_regdomain *regd;
1436
	bool intersect = false;
1437
	enum reg_request_treatment treatment;
1438
	struct regulatory_request *lr;
1439

1440
	treatment = get_reg_request_treatment(wiphy, pending_request);
1441

1442 1443
	switch (treatment) {
	case REG_REQ_INTERSECT:
1444 1445
		if (pending_request->initiator ==
		    NL80211_REGDOM_SET_BY_DRIVER) {
1446
			regd = reg_copy_regd(get_cfg80211_regdom());
1447
			if (IS_ERR(regd)) {
1448
				kfree(pending_request);
1449
				return PTR_ERR(regd);
1450
			}
1451
			rcu_assign_pointer(wiphy->regd, regd);
1452
		}
1453
		intersect = true;
1454 1455 1456 1457
		break;
	case REG_REQ_OK:
		break;
	default:
1458 1459
		/*
		 * If the regulatory domain being requested by the
1460
		 * driver has already been set just copy it to the
1461 1462
		 * wiphy
		 */
1463 1464
		if (treatment == REG_REQ_ALREADY_SET &&
		    pending_request->initiator == NL80211_REGDOM_SET_BY_DRIVER) {
1465
			regd = reg_copy_regd(get_cfg80211_regdom());
1466
			if (IS_ERR(regd)) {
1467
				kfree(pending_request);
1468
				return REG_REQ_IGNORE;
1469
			}
1470
			treatment = REG_REQ_ALREADY_SET;
1471
			rcu_assign_pointer(wiphy->regd, regd);
1472 1473
			goto new_request;
		}
1474
		kfree(pending_request);
1475
		return treatment;
1476
	}
1477

1478
new_request:
1479 1480 1481
	lr = get_last_request();
	if (lr != &core_request_world && lr)
		kfree_rcu(lr, rcu_head);
1482

1483 1484 1485 1486
	pending_request->intersect = intersect;
	pending_request->processed = false;
	rcu_assign_pointer(last_request, pending_request);
	lr = pending_request;
1487

1488
	pending_request = NULL;
1489

1490 1491 1492
	if (lr->initiator == NL80211_REGDOM_SET_BY_USER) {
		user_alpha2[0] = lr->alpha2[0];
		user_alpha2[1] = lr->alpha2[1];
1493 1494
	}

1495 1496
	/* When r == REG_REQ_INTERSECT we do need to call CRDA */
	if (treatment != REG_REQ_OK && treatment != REG_REQ_INTERSECT) {
1497 1498 1499 1500 1501
		/*
		 * 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
		 */
1502
		if (treatment == REG_REQ_ALREADY_SET) {
1503
			nl80211_send_reg_change_event(lr);
1504 1505
			reg_set_request_processed();
		}
1506
		return treatment;
1507
	}
1508

1509
	if (call_crda(lr->alpha2))
1510 1511
		return REG_REQ_IGNORE;
	return REG_REQ_OK;
1512 1513
}

1514
/* This processes *all* regulatory hints */
1515 1516
static void reg_process_hint(struct regulatory_request *reg_request,
			     enum nl80211_reg_initiator reg_initiator)
1517 1518 1519
{
	struct wiphy *wiphy = NULL;

J
Johannes Berg 已提交
1520 1521
	if (WARN_ON(!reg_request->alpha2))
		return;
1522

J
Johannes Berg 已提交
1523
	if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
1524 1525
		wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);

J
Johannes Berg 已提交
1526
	if (reg_initiator == NL80211_REGDOM_SET_BY_DRIVER && !wiphy) {
1527
		kfree(reg_request);
1528
		return;
1529 1530
	}

1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541
	switch (__regulatory_hint(wiphy, reg_request)) {
	case REG_REQ_ALREADY_SET:
		/* This is required so that the orig_* parameters are saved */
		if (wiphy && wiphy->flags & WIPHY_FLAG_STRICT_REGULATORY)
			wiphy_update_regulatory(wiphy, reg_initiator);
		break;
	default:
		if (reg_initiator == NL80211_REGDOM_SET_BY_USER)
			schedule_delayed_work(&reg_timeout,
					      msecs_to_jiffies(3142));
		break;
1542
	}
1543 1544
}

1545 1546 1547 1548 1549
/*
 * 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.
 */
1550
static void reg_process_pending_hints(void)
1551
{
1552
	struct regulatory_request *reg_request, *lr;
1553

1554
	lr = get_last_request();
1555

1556
	/* When last_request->processed becomes true this will be rescheduled */
1557
	if (lr && !lr->processed) {
J
Johannes Berg 已提交
1558
		REG_DBG_PRINT("Pending regulatory request, waiting for it to be processed...\n");
1559
		return;
1560 1561
	}

1562 1563
	spin_lock(&reg_requests_lock);

1564
	if (list_empty(&reg_requests_list)) {
1565
		spin_unlock(&reg_requests_lock);
1566
		return;
1567
	}
1568 1569 1570 1571 1572 1573

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

1574
	spin_unlock(&reg_requests_lock);
1575

1576
	reg_process_hint(reg_request, reg_request->initiator);
1577 1578
}

1579 1580 1581
/* Processes beacon hints -- this has nothing to do with country IEs */
static void reg_process_pending_beacon_hints(void)
{
1582
	struct cfg80211_registered_device *rdev;
1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
	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 */
1593 1594
		list_for_each_entry(rdev, &cfg80211_rdev_list, list)
			wiphy_update_new_beacon(&rdev->wiphy, pending_beacon);
1595 1596 1597 1598 1599 1600 1601 1602

		/* 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);
}

1603 1604
static void reg_todo(struct work_struct *work)
{
1605
	rtnl_lock();
1606
	reg_process_pending_hints();
1607
	reg_process_pending_beacon_hints();
1608
	rtnl_unlock();
1609 1610 1611 1612
}

static void queue_regulatory_request(struct regulatory_request *request)
{
1613 1614
	request->alpha2[0] = toupper(request->alpha2[0]);
	request->alpha2[1] = toupper(request->alpha2[1]);
1615

1616 1617 1618 1619 1620 1621 1622
	spin_lock(&reg_requests_lock);
	list_add_tail(&request->list, &reg_requests_list);
	spin_unlock(&reg_requests_lock);

	schedule_work(&reg_work);
}

1623 1624 1625 1626
/*
 * Core regulatory hint -- happens during cfg80211_init()
 * and when we restore regulatory settings.
 */
1627 1628 1629 1630
static int regulatory_hint_core(const char *alpha2)
{
	struct regulatory_request *request;

J
Johannes Berg 已提交
1631
	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
1632 1633 1634 1635 1636
	if (!request)
		return -ENOMEM;

	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
1637
	request->initiator = NL80211_REGDOM_SET_BY_CORE;
1638

1639
	queue_regulatory_request(request);
1640

1641
	return 0;
1642 1643
}

1644
/* User hints */
1645 1646
int regulatory_hint_user(const char *alpha2,
			 enum nl80211_user_reg_hint_type user_reg_hint_type)
1647
{
1648 1649
	struct regulatory_request *request;

J
Johannes Berg 已提交
1650 1651
	if (WARN_ON(!alpha2))
		return -EINVAL;
1652

1653 1654 1655 1656
	request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
	if (!request)
		return -ENOMEM;

J
Johannes Berg 已提交
1657
	request->wiphy_idx = WIPHY_IDX_INVALID;
1658 1659
	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
1660
	request->initiator = NL80211_REGDOM_SET_BY_USER;
1661
	request->user_reg_hint_type = user_reg_hint_type;
1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672

	queue_regulatory_request(request);

	return 0;
}

/* Driver hints */
int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
{
	struct regulatory_request *request;

J
Johannes Berg 已提交
1673 1674
	if (WARN_ON(!alpha2 || !wiphy))
		return -EINVAL;
1675 1676 1677 1678 1679 1680 1681 1682 1683

	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];
1684
	request->initiator = NL80211_REGDOM_SET_BY_DRIVER;
1685 1686 1687 1688

	queue_regulatory_request(request);

	return 0;
1689 1690 1691
}
EXPORT_SYMBOL(regulatory_hint);

J
Johannes Berg 已提交
1692 1693
void regulatory_hint_11d(struct wiphy *wiphy, enum ieee80211_band band,
			 const u8 *country_ie, u8 country_ie_len)
1694 1695 1696
{
	char alpha2[2];
	enum environment_cap env = ENVIRON_ANY;
1697
	struct regulatory_request *request = NULL, *lr;
1698

1699 1700
	/* IE len must be evenly divisible by 2 */
	if (country_ie_len & 0x01)
1701
		return;
1702 1703

	if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
1704 1705 1706 1707 1708
		return;

	request = kzalloc(sizeof(*request), GFP_KERNEL);
	if (!request)
		return;
1709 1710 1711 1712 1713 1714 1715 1716 1717

	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;

1718 1719 1720 1721 1722 1723
	rcu_read_lock();
	lr = get_last_request();

	if (unlikely(!lr))
		goto out;

1724
	/*
1725
	 * We will run this only upon a successful connection on cfg80211.
1726
	 * We leave conflict resolution to the workqueue, where can hold
1727
	 * the RTNL.
1728
	 */
1729 1730
	if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
	    lr->wiphy_idx != WIPHY_IDX_INVALID)
1731
		goto out;
1732

1733
	request->wiphy_idx = get_wiphy_idx(wiphy);
1734 1735
	request->alpha2[0] = alpha2[0];
	request->alpha2[1] = alpha2[1];
1736
	request->initiator = NL80211_REGDOM_SET_BY_COUNTRY_IE;
1737 1738 1739
	request->country_ie_env = env;

	queue_regulatory_request(request);
1740
	request = NULL;
1741
out:
1742 1743
	kfree(request);
	rcu_read_unlock();
1744
}
1745

1746 1747 1748 1749 1750 1751 1752 1753 1754 1755
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) {
J
Johannes Berg 已提交
1756
			REG_DBG_PRINT("Restoring regulatory settings including user preference\n");
1757 1758 1759 1760 1761 1762 1763 1764 1765
			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)) {
J
Johannes Berg 已提交
1766 1767
				REG_DBG_PRINT("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
					      ieee80211_regdom[0], ieee80211_regdom[1]);
1768 1769 1770 1771
				alpha2[0] = ieee80211_regdom[0];
				alpha2[1] = ieee80211_regdom[1];
			}
		} else {
J
Johannes Berg 已提交
1772 1773
			REG_DBG_PRINT("Restoring regulatory settings while preserving user preference for: %c%c\n",
				      user_alpha2[0], user_alpha2[1]);
1774 1775 1776 1777
			alpha2[0] = user_alpha2[0];
			alpha2[1] = user_alpha2[1];
		}
	} else if (!is_world_regdom(ieee80211_regdom)) {
J
Johannes Berg 已提交
1778 1779
		REG_DBG_PRINT("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
			      ieee80211_regdom[0], ieee80211_regdom[1]);
1780 1781 1782
		alpha2[0] = ieee80211_regdom[0];
		alpha2[1] = ieee80211_regdom[1];
	} else
1783
		REG_DBG_PRINT("Restoring regulatory settings\n");
1784 1785
}

1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801
static void restore_custom_reg_settings(struct wiphy *wiphy)
{
	struct ieee80211_supported_band *sband;
	enum ieee80211_band band;
	struct ieee80211_channel *chan;
	int i;

	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
		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;
1802
			chan->beacon_found = false;
1803 1804 1805 1806
		}
	}
}

1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824
/*
 * 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];
1825
	char world_alpha2[2];
1826
	struct reg_beacon *reg_beacon, *btmp;
1827 1828
	struct regulatory_request *reg_request, *tmp;
	LIST_HEAD(tmp_reg_req_list);
1829
	struct cfg80211_registered_device *rdev;
1830

1831 1832
	ASSERT_RTNL();

1833
	reset_regdomains(true, &world_regdom);
1834 1835
	restore_alpha2(alpha2, reset_user);

1836 1837 1838 1839 1840 1841 1842
	/*
	 * 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);
1843 1844 1845 1846
	list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
		if (reg_request->initiator != NL80211_REGDOM_SET_BY_USER)
			continue;
		list_move_tail(&reg_request->list, &tmp_reg_req_list);
1847 1848 1849
	}
	spin_unlock(&reg_requests_lock);

1850 1851
	/* Clear beacon hints */
	spin_lock_bh(&reg_pending_beacons_lock);
1852 1853 1854
	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
1855 1856 1857
	}
	spin_unlock_bh(&reg_pending_beacons_lock);

1858 1859 1860
	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
1861 1862 1863
	}

	/* First restore to the basic regulatory settings */
1864 1865
	world_alpha2[0] = cfg80211_world_regdom->alpha2[0];
	world_alpha2[1] = cfg80211_world_regdom->alpha2[1];
1866

1867 1868 1869 1870 1871
	list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
		if (rdev->wiphy.flags & WIPHY_FLAG_CUSTOM_REGULATORY)
			restore_custom_reg_settings(&rdev->wiphy);
	}

1872
	regulatory_hint_core(world_alpha2);
1873 1874 1875 1876 1877 1878 1879

	/*
	 * 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))
1880
		regulatory_hint_user(user_alpha2, NL80211_USER_REG_HINT_USER);
1881

1882
	spin_lock(&reg_requests_lock);
1883
	list_splice_tail_init(&tmp_reg_req_list, &reg_requests_list);
1884 1885 1886 1887 1888 1889
	spin_unlock(&reg_requests_lock);

	REG_DBG_PRINT("Kicking the queue\n");

	schedule_work(&reg_work);
}
1890 1891 1892

void regulatory_hint_disconnect(void)
{
J
Johannes Berg 已提交
1893
	REG_DBG_PRINT("All devices are disconnected, going to restore regulatory settings\n");
1894 1895 1896
	restore_regulatory_settings(false);
}

1897 1898
static bool freq_is_chan_12_13_14(u16 freq)
{
1899 1900 1901
	if (freq == ieee80211_channel_to_frequency(12, IEEE80211_BAND_2GHZ) ||
	    freq == ieee80211_channel_to_frequency(13, IEEE80211_BAND_2GHZ) ||
	    freq == ieee80211_channel_to_frequency(14, IEEE80211_BAND_2GHZ))
1902 1903 1904 1905
		return true;
	return false;
}

1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916
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;
}

1917 1918 1919 1920 1921
int regulatory_hint_found_beacon(struct wiphy *wiphy,
				 struct ieee80211_channel *beacon_chan,
				 gfp_t gfp)
{
	struct reg_beacon *reg_beacon;
1922
	bool processing;
1923

J
Johannes Berg 已提交
1924 1925
	if (beacon_chan->beacon_found ||
	    beacon_chan->flags & IEEE80211_CHAN_RADAR ||
1926
	    (beacon_chan->band == IEEE80211_BAND_2GHZ &&
J
Johannes Berg 已提交
1927
	     !freq_is_chan_12_13_14(beacon_chan->center_freq)))
1928 1929
		return 0;

1930 1931 1932 1933 1934
	spin_lock_bh(&reg_pending_beacons_lock);
	processing = pending_reg_beacon(beacon_chan);
	spin_unlock_bh(&reg_pending_beacons_lock);

	if (processing)
1935 1936 1937 1938 1939 1940
		return 0;

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

J
Johannes Berg 已提交
1941
	REG_DBG_PRINT("Found new beacon on frequency: %d MHz (Ch %d) on %s\n",
1942 1943 1944 1945
		      beacon_chan->center_freq,
		      ieee80211_frequency_to_channel(beacon_chan->center_freq),
		      wiphy_name(wiphy));

1946
	memcpy(&reg_beacon->chan, beacon_chan,
J
Johannes Berg 已提交
1947
	       sizeof(struct ieee80211_channel));
1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961

	/*
	 * 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;
}

1962
static void print_rd_rules(const struct ieee80211_regdomain *rd)
1963 1964
{
	unsigned int i;
1965 1966 1967
	const struct ieee80211_reg_rule *reg_rule = NULL;
	const struct ieee80211_freq_range *freq_range = NULL;
	const struct ieee80211_power_rule *power_rule = NULL;
1968

1969
	pr_info("  (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)\n");
1970 1971 1972 1973 1974 1975

	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;

1976 1977 1978 1979
		/*
		 * There may not be documentation for max antenna gain
		 * in certain regions
		 */
1980
		if (power_rule->max_antenna_gain)
1981
			pr_info("  (%d KHz - %d KHz @ %d KHz), (%d mBi, %d mBm)\n",
1982 1983 1984 1985 1986 1987
				freq_range->start_freq_khz,
				freq_range->end_freq_khz,
				freq_range->max_bandwidth_khz,
				power_rule->max_antenna_gain,
				power_rule->max_eirp);
		else
1988
			pr_info("  (%d KHz - %d KHz @ %d KHz), (N/A, %d mBm)\n",
1989 1990 1991 1992 1993 1994 1995
				freq_range->start_freq_khz,
				freq_range->end_freq_khz,
				freq_range->max_bandwidth_khz,
				power_rule->max_eirp);
	}
}

1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026
bool reg_supported_dfs_region(u8 dfs_region)
{
	switch (dfs_region) {
	case NL80211_DFS_UNSET:
	case NL80211_DFS_FCC:
	case NL80211_DFS_ETSI:
	case NL80211_DFS_JP:
		return true;
	default:
		REG_DBG_PRINT("Ignoring uknown DFS master region: %d\n",
			      dfs_region);
		return false;
	}
}

static void print_dfs_region(u8 dfs_region)
{
	if (!dfs_region)
		return;

	switch (dfs_region) {
	case NL80211_DFS_FCC:
		pr_info(" DFS Master region FCC");
		break;
	case NL80211_DFS_ETSI:
		pr_info(" DFS Master region ETSI");
		break;
	case NL80211_DFS_JP:
		pr_info(" DFS Master region JP");
		break;
	default:
J
Johannes Berg 已提交
2027
		pr_info(" DFS Master region Unknown");
2028 2029 2030 2031
		break;
	}
}

2032
static void print_regdomain(const struct ieee80211_regdomain *rd)
2033
{
2034
	struct regulatory_request *lr = get_last_request();
2035

2036
	if (is_intersected_alpha2(rd->alpha2)) {
2037
		if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
2038
			struct cfg80211_registered_device *rdev;
2039
			rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx);
2040
			if (rdev) {
2041
				pr_info("Current regulatory domain updated by AP to: %c%c\n",
2042 2043
					rdev->country_ie_alpha2[0],
					rdev->country_ie_alpha2[1]);
2044
			} else
2045
				pr_info("Current regulatory domain intersected:\n");
2046
		} else
2047
			pr_info("Current regulatory domain intersected:\n");
J
Johannes Berg 已提交
2048
	} else if (is_world_regdom(rd->alpha2)) {
2049
		pr_info("World regulatory domain updated:\n");
J
Johannes Berg 已提交
2050
	} else {
2051
		if (is_unknown_alpha2(rd->alpha2))
2052
			pr_info("Regulatory domain changed to driver built-in settings (unknown country)\n");
2053
		else {
2054
			if (reg_request_cell_base(lr))
J
Johannes Berg 已提交
2055
				pr_info("Regulatory domain changed to country: %c%c by Cell Station\n",
2056 2057
					rd->alpha2[0], rd->alpha2[1]);
			else
J
Johannes Berg 已提交
2058
				pr_info("Regulatory domain changed to country: %c%c\n",
2059 2060
					rd->alpha2[0], rd->alpha2[1]);
		}
2061
	}
J
Johannes Berg 已提交
2062

2063
	print_dfs_region(rd->dfs_region);
2064 2065 2066
	print_rd_rules(rd);
}

2067
static void print_regdomain_info(const struct ieee80211_regdomain *rd)
2068
{
2069
	pr_info("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]);
2070 2071 2072
	print_rd_rules(rd);
}

2073
/* Takes ownership of rd only if it doesn't fail */
2074
static int __set_regdom(const struct ieee80211_regdomain *rd)
2075
{
2076
	const struct ieee80211_regdomain *regd;
2077
	const struct ieee80211_regdomain *intersected_rd = NULL;
2078
	struct wiphy *request_wiphy;
2079
	struct regulatory_request *lr = get_last_request();
2080

2081 2082
	/* Some basic sanity checks first */

2083 2084 2085
	if (!reg_is_valid_request(rd->alpha2))
		return -EINVAL;

2086 2087 2088 2089 2090 2091
	if (is_world_regdom(rd->alpha2)) {
		update_world_regdomain(rd);
		return 0;
	}

	if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) &&
J
Johannes Berg 已提交
2092
	    !is_unknown_alpha2(rd->alpha2))
2093 2094
		return -EINVAL;

2095 2096
	/*
	 * Lets only bother proceeding on the same alpha2 if the current
2097
	 * rd is non static (it means CRDA was present and was used last)
2098 2099
	 * and the pending request came in from a country IE
	 */
2100
	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) {
2101 2102 2103 2104
		/*
		 * If someone else asked us to change the rd lets only bother
		 * checking if the alpha2 changes if CRDA was already called
		 */
2105
		if (!regdom_changes(rd->alpha2))
2106
			return -EALREADY;
2107 2108
	}

2109 2110
	/*
	 * Now lets set the regulatory domain, update all driver channels
2111 2112
	 * and finally inform them of what we have done, in case they want
	 * to review or adjust their own settings based on their own
2113 2114
	 * internal EEPROM data
	 */
2115

2116
	if (!is_valid_rd(rd)) {
2117
		pr_err("Invalid regulatory domain detected:\n");
2118 2119
		print_regdomain_info(rd);
		return -EINVAL;
2120 2121
	}

2122
	request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
2123
	if (!request_wiphy &&
2124 2125
	    (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER ||
	     lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)) {
2126
		schedule_delayed_work(&reg_timeout, 0);
2127 2128
		return -ENODEV;
	}
2129

2130 2131
	if (!lr->intersect) {
		if (lr->initiator != NL80211_REGDOM_SET_BY_DRIVER) {
2132
			reset_regdomains(false, rd);
2133 2134 2135
			return 0;
		}

2136 2137 2138 2139
		/*
		 * For a driver hint, lets copy the regulatory domain the
		 * driver wanted to the wiphy to deal with conflicts
		 */
2140

2141 2142 2143 2144 2145 2146
		/*
		 * Userspace could have sent two replies with only
		 * one kernel request.
		 */
		if (request_wiphy->regd)
			return -EALREADY;
2147

2148 2149 2150
		regd = reg_copy_regd(rd);
		if (IS_ERR(regd))
			return PTR_ERR(regd);
2151

2152
		rcu_assign_pointer(request_wiphy->regd, regd);
2153
		reset_regdomains(false, rd);
2154 2155 2156 2157 2158
		return 0;
	}

	/* Intersection requires a bit more work */

2159
	if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) {
2160
		intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
2161 2162
		if (!intersected_rd)
			return -EINVAL;
2163

2164 2165
		/*
		 * We can trash what CRDA provided now.
2166
		 * However if a driver requested this specific regulatory
2167 2168
		 * domain we keep it for its private use
		 */
L
Larry Finger 已提交
2169 2170 2171 2172
		if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER) {
			const struct ieee80211_regdomain *tmp;

			tmp = get_wiphy_regdom(request_wiphy);
2173
			rcu_assign_pointer(request_wiphy->regd, rd);
L
Larry Finger 已提交
2174 2175
			rcu_free_regdom(tmp);
		} else {
2176
			kfree(rd);
L
Larry Finger 已提交
2177
		}
2178

2179 2180
		rd = NULL;

2181
		reset_regdomains(false, intersected_rd);
2182 2183

		return 0;
2184 2185
	}

A
Alan Cox 已提交
2186
	return -EINVAL;
2187 2188 2189
}


2190 2191
/*
 * Use this call to set the current regulatory domain. Conflicts with
2192
 * multiple drivers can be ironed out later. Caller must've already
2193
 * kmalloc'd the rd structure.
2194
 */
2195
int set_regdom(const struct ieee80211_regdomain *rd)
2196
{
2197
	struct regulatory_request *lr;
2198 2199
	int r;

2200
	lr = get_last_request();
2201

2202 2203
	/* Note that this doesn't update the wiphys, this is done below */
	r = __set_regdom(rd);
2204
	if (r) {
2205 2206 2207
		if (r == -EALREADY)
			reg_set_request_processed();

2208
		kfree(rd);
J
Johannes Berg 已提交
2209
		return r;
2210
	}
2211 2212

	/* This would make this whole thing pointless */
J
Johannes Berg 已提交
2213 2214
	if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom()))
		return -EINVAL;
2215 2216

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

2219
	print_regdomain(get_cfg80211_regdom());
2220

2221
	nl80211_send_reg_change_event(lr);
2222

2223 2224
	reg_set_request_processed();

J
Johannes Berg 已提交
2225
	return 0;
2226 2227
}

2228 2229
int reg_device_uevent(struct device *dev, struct kobj_uevent_env *env)
{
J
Johannes Berg 已提交
2230 2231 2232
	struct regulatory_request *lr;
	u8 alpha2[2];
	bool add = false;
2233

J
Johannes Berg 已提交
2234 2235
	rcu_read_lock();
	lr = get_last_request();
2236
	if (lr && !lr->processed) {
J
Johannes Berg 已提交
2237 2238
		memcpy(alpha2, lr->alpha2, 2);
		add = true;
2239
	}
J
Johannes Berg 已提交
2240
	rcu_read_unlock();
2241

J
Johannes Berg 已提交
2242 2243 2244
	if (add)
		return add_uevent_var(env, "COUNTRY=%c%c",
				      alpha2[0], alpha2[1]);
2245 2246 2247
	return 0;
}

2248 2249 2250 2251 2252
void wiphy_regulatory_register(struct wiphy *wiphy)
{
	if (!reg_dev_ignore_cell_hint(wiphy))
		reg_num_devs_support_basehint++;

2253
	wiphy_update_regulatory(wiphy, NL80211_REGDOM_SET_BY_CORE);
2254 2255
}

2256
void wiphy_regulatory_deregister(struct wiphy *wiphy)
2257
{
2258
	struct wiphy *request_wiphy = NULL;
2259
	struct regulatory_request *lr;
2260

2261
	lr = get_last_request();
2262

2263 2264 2265
	if (!reg_dev_ignore_cell_hint(wiphy))
		reg_num_devs_support_basehint--;

2266 2267
	rcu_free_regdom(get_wiphy_regdom(wiphy));
	rcu_assign_pointer(wiphy->regd, NULL);
2268

2269 2270
	if (lr)
		request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
2271

2272
	if (!request_wiphy || request_wiphy != wiphy)
J
Johannes Berg 已提交
2273
		return;
2274

2275 2276
	lr->wiphy_idx = WIPHY_IDX_INVALID;
	lr->country_ie_env = ENVIRON_ANY;
2277 2278
}

2279 2280
static void reg_timeout_work(struct work_struct *work)
{
J
Johannes Berg 已提交
2281
	REG_DBG_PRINT("Timeout while waiting for CRDA to reply, restoring regulatory settings\n");
2282
	rtnl_lock();
2283
	restore_regulatory_settings(true);
2284
	rtnl_unlock();
2285 2286
}

2287
int __init regulatory_init(void)
2288
{
2289
	int err = 0;
2290

2291 2292 2293
	reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0);
	if (IS_ERR(reg_pdev))
		return PTR_ERR(reg_pdev);
2294

2295 2296
	reg_pdev->dev.type = &reg_device_type;

2297
	spin_lock_init(&reg_requests_lock);
2298
	spin_lock_init(&reg_pending_beacons_lock);
2299

2300 2301
	reg_regdb_size_check();

2302
	rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
2303

2304 2305 2306
	user_alpha2[0] = '9';
	user_alpha2[1] = '7';

2307
	/* We always try to get an update for the static regdomain */
2308
	err = regulatory_hint_core(cfg80211_world_regdom->alpha2);
2309
	if (err) {
2310 2311 2312 2313 2314 2315 2316 2317 2318
		if (err == -ENOMEM)
			return err;
		/*
		 * 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.
		 */
2319
		pr_err("kobject_uevent_env() was unable to call CRDA during init\n");
2320
	}
2321

2322 2323 2324 2325 2326
	/*
	 * Finally, if the user set the module parameter treat it
	 * as a user hint.
	 */
	if (!is_world_regdom(ieee80211_regdom))
2327 2328
		regulatory_hint_user(ieee80211_regdom,
				     NL80211_USER_REG_HINT_USER);
2329

2330 2331 2332
	return 0;
}

J
Johannes Berg 已提交
2333
void regulatory_exit(void)
2334
{
2335
	struct regulatory_request *reg_request, *tmp;
2336
	struct reg_beacon *reg_beacon, *btmp;
2337 2338

	cancel_work_sync(&reg_work);
2339
	cancel_delayed_work_sync(&reg_timeout);
2340

2341
	/* Lock to suppress warnings */
J
Johannes Berg 已提交
2342
	rtnl_lock();
2343
	reset_regdomains(true, NULL);
J
Johannes Berg 已提交
2344
	rtnl_unlock();
2345

2346
	dev_set_uevent_suppress(&reg_pdev->dev, true);
2347

2348
	platform_device_unregister(reg_pdev);
2349

2350 2351 2352
	list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
2353 2354
	}

2355 2356 2357
	list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
		list_del(&reg_beacon->list);
		kfree(reg_beacon);
2358 2359
	}

2360 2361 2362
	list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
		list_del(&reg_request->list);
		kfree(reg_request);
2363
	}
2364
}