1 /* 2 * Copyright 2002-2005, Instant802 Networks, Inc. 3 * Copyright 2005-2006, Devicescape Software, Inc. 4 * 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 * 8 * Permission to use, copy, modify, and/or distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 22 /** 23 * DOC: Wireless regulatory infrastructure 24 * 25 * The usual implementation is for a driver to read a device EEPROM to 26 * determine which regulatory domain it should be operating under, then 27 * looking up the allowable channels in a driver-local table and finally 28 * registering those channels in the wiphy structure. 29 * 30 * Another set of compliance enforcement is for drivers to use their 31 * own compliance limits which can be stored on the EEPROM. The host 32 * driver or firmware may ensure these are used. 33 * 34 * In addition to all this we provide an extra layer of regulatory 35 * conformance. For drivers which do not have any regulatory 36 * information CRDA provides the complete regulatory solution. 37 * For others it provides a community effort on further restrictions 38 * to enhance compliance. 39 * 40 * Note: When number of rules --> infinity we will not be able to 41 * index on alpha2 any more, instead we'll probably have to 42 * rely on some SHA1 checksum of the regdomain for example. 43 * 44 */ 45 46 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 47 48 #include <linux/kernel.h> 49 #include <linux/export.h> 50 #include <linux/slab.h> 51 #include <linux/list.h> 52 #include <linux/ctype.h> 53 #include <linux/nl80211.h> 54 #include <linux/platform_device.h> 55 #include <linux/moduleparam.h> 56 #include <net/cfg80211.h> 57 #include "core.h" 58 #include "reg.h" 59 #include "regdb.h" 60 #include "nl80211.h" 61 62 #ifdef CONFIG_CFG80211_REG_DEBUG 63 #define REG_DBG_PRINT(format, args...) \ 64 printk(KERN_DEBUG pr_fmt(format), ##args) 65 #else 66 #define REG_DBG_PRINT(args...) 67 #endif 68 69 /** 70 * enum reg_request_treatment - regulatory request treatment 71 * 72 * @REG_REQ_OK: continue processing the regulatory request 73 * @REG_REQ_IGNORE: ignore the regulatory request 74 * @REG_REQ_INTERSECT: the regulatory domain resulting from this request should 75 * be intersected with the current one. 76 * @REG_REQ_ALREADY_SET: the regulatory request will not change the current 77 * regulatory settings, and no further processing is required. 78 * @REG_REQ_USER_HINT_HANDLED: a non alpha2 user hint was handled and no 79 * further processing is required, i.e., not need to update last_request 80 * etc. This should be used for user hints that do not provide an alpha2 81 * but some other type of regulatory hint, i.e., indoor operation. 82 */ 83 enum reg_request_treatment { 84 REG_REQ_OK, 85 REG_REQ_IGNORE, 86 REG_REQ_INTERSECT, 87 REG_REQ_ALREADY_SET, 88 REG_REQ_USER_HINT_HANDLED, 89 }; 90 91 static struct regulatory_request core_request_world = { 92 .initiator = NL80211_REGDOM_SET_BY_CORE, 93 .alpha2[0] = '0', 94 .alpha2[1] = '0', 95 .intersect = false, 96 .processed = true, 97 .country_ie_env = ENVIRON_ANY, 98 }; 99 100 /* 101 * Receipt of information from last regulatory request, 102 * protected by RTNL (and can be accessed with RCU protection) 103 */ 104 static struct regulatory_request __rcu *last_request = 105 (void __rcu *)&core_request_world; 106 107 /* To trigger userspace events */ 108 static struct platform_device *reg_pdev; 109 110 /* 111 * Central wireless core regulatory domains, we only need two, 112 * the current one and a world regulatory domain in case we have no 113 * information to give us an alpha2. 114 * (protected by RTNL, can be read under RCU) 115 */ 116 const struct ieee80211_regdomain __rcu *cfg80211_regdomain; 117 118 /* 119 * Number of devices that registered to the core 120 * that support cellular base station regulatory hints 121 * (protected by RTNL) 122 */ 123 static int reg_num_devs_support_basehint; 124 125 /* 126 * State variable indicating if the platform on which the devices 127 * are attached is operating in an indoor environment. The state variable 128 * is relevant for all registered devices. 129 * (protected by RTNL) 130 */ 131 static bool reg_is_indoor; 132 133 static const struct ieee80211_regdomain *get_cfg80211_regdom(void) 134 { 135 return rtnl_dereference(cfg80211_regdomain); 136 } 137 138 static const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy) 139 { 140 return rtnl_dereference(wiphy->regd); 141 } 142 143 static const char *reg_dfs_region_str(enum nl80211_dfs_regions dfs_region) 144 { 145 switch (dfs_region) { 146 case NL80211_DFS_UNSET: 147 return "unset"; 148 case NL80211_DFS_FCC: 149 return "FCC"; 150 case NL80211_DFS_ETSI: 151 return "ETSI"; 152 case NL80211_DFS_JP: 153 return "JP"; 154 } 155 return "Unknown"; 156 } 157 158 enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy) 159 { 160 const struct ieee80211_regdomain *regd = NULL; 161 const struct ieee80211_regdomain *wiphy_regd = NULL; 162 163 regd = get_cfg80211_regdom(); 164 if (!wiphy) 165 goto out; 166 167 wiphy_regd = get_wiphy_regdom(wiphy); 168 if (!wiphy_regd) 169 goto out; 170 171 if (wiphy_regd->dfs_region == regd->dfs_region) 172 goto out; 173 174 REG_DBG_PRINT("%s: device specific dfs_region " 175 "(%s) disagrees with cfg80211's " 176 "central dfs_region (%s)\n", 177 dev_name(&wiphy->dev), 178 reg_dfs_region_str(wiphy_regd->dfs_region), 179 reg_dfs_region_str(regd->dfs_region)); 180 181 out: 182 return regd->dfs_region; 183 } 184 185 static void rcu_free_regdom(const struct ieee80211_regdomain *r) 186 { 187 if (!r) 188 return; 189 kfree_rcu((struct ieee80211_regdomain *)r, rcu_head); 190 } 191 192 static struct regulatory_request *get_last_request(void) 193 { 194 return rcu_dereference_rtnl(last_request); 195 } 196 197 /* Used to queue up regulatory hints */ 198 static LIST_HEAD(reg_requests_list); 199 static spinlock_t reg_requests_lock; 200 201 /* Used to queue up beacon hints for review */ 202 static LIST_HEAD(reg_pending_beacons); 203 static spinlock_t reg_pending_beacons_lock; 204 205 /* Used to keep track of processed beacon hints */ 206 static LIST_HEAD(reg_beacon_list); 207 208 struct reg_beacon { 209 struct list_head list; 210 struct ieee80211_channel chan; 211 }; 212 213 static void reg_todo(struct work_struct *work); 214 static DECLARE_WORK(reg_work, reg_todo); 215 216 static void reg_timeout_work(struct work_struct *work); 217 static DECLARE_DELAYED_WORK(reg_timeout, reg_timeout_work); 218 219 /* We keep a static world regulatory domain in case of the absence of CRDA */ 220 static const struct ieee80211_regdomain world_regdom = { 221 .n_reg_rules = 6, 222 .alpha2 = "00", 223 .reg_rules = { 224 /* IEEE 802.11b/g, channels 1..11 */ 225 REG_RULE(2412-10, 2462+10, 40, 6, 20, 0), 226 /* IEEE 802.11b/g, channels 12..13. */ 227 REG_RULE(2467-10, 2472+10, 40, 6, 20, 228 NL80211_RRF_NO_IR), 229 /* IEEE 802.11 channel 14 - Only JP enables 230 * this and for 802.11b only */ 231 REG_RULE(2484-10, 2484+10, 20, 6, 20, 232 NL80211_RRF_NO_IR | 233 NL80211_RRF_NO_OFDM), 234 /* IEEE 802.11a, channel 36..48 */ 235 REG_RULE(5180-10, 5240+10, 160, 6, 20, 236 NL80211_RRF_NO_IR), 237 238 /* IEEE 802.11a, channel 52..64 - DFS required */ 239 REG_RULE(5260-10, 5320+10, 160, 6, 20, 240 NL80211_RRF_NO_IR | 241 NL80211_RRF_DFS), 242 243 /* IEEE 802.11a, channel 100..144 - DFS required */ 244 REG_RULE(5500-10, 5720+10, 160, 6, 20, 245 NL80211_RRF_NO_IR | 246 NL80211_RRF_DFS), 247 248 /* IEEE 802.11a, channel 149..165 */ 249 REG_RULE(5745-10, 5825+10, 80, 6, 20, 250 NL80211_RRF_NO_IR), 251 252 /* IEEE 802.11ad (60gHz), channels 1..3 */ 253 REG_RULE(56160+2160*1-1080, 56160+2160*3+1080, 2160, 0, 0, 0), 254 } 255 }; 256 257 /* protected by RTNL */ 258 static const struct ieee80211_regdomain *cfg80211_world_regdom = 259 &world_regdom; 260 261 static char *ieee80211_regdom = "00"; 262 static char user_alpha2[2]; 263 264 module_param(ieee80211_regdom, charp, 0444); 265 MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code"); 266 267 static void reg_free_request(struct regulatory_request *request) 268 { 269 if (request != get_last_request()) 270 kfree(request); 271 } 272 273 static void reg_free_last_request(void) 274 { 275 struct regulatory_request *lr = get_last_request(); 276 277 if (lr != &core_request_world && lr) 278 kfree_rcu(lr, rcu_head); 279 } 280 281 static void reg_update_last_request(struct regulatory_request *request) 282 { 283 struct regulatory_request *lr; 284 285 lr = get_last_request(); 286 if (lr == request) 287 return; 288 289 reg_free_last_request(); 290 rcu_assign_pointer(last_request, request); 291 } 292 293 static void reset_regdomains(bool full_reset, 294 const struct ieee80211_regdomain *new_regdom) 295 { 296 const struct ieee80211_regdomain *r; 297 298 ASSERT_RTNL(); 299 300 r = get_cfg80211_regdom(); 301 302 /* avoid freeing static information or freeing something twice */ 303 if (r == cfg80211_world_regdom) 304 r = NULL; 305 if (cfg80211_world_regdom == &world_regdom) 306 cfg80211_world_regdom = NULL; 307 if (r == &world_regdom) 308 r = NULL; 309 310 rcu_free_regdom(r); 311 rcu_free_regdom(cfg80211_world_regdom); 312 313 cfg80211_world_regdom = &world_regdom; 314 rcu_assign_pointer(cfg80211_regdomain, new_regdom); 315 316 if (!full_reset) 317 return; 318 319 reg_update_last_request(&core_request_world); 320 } 321 322 /* 323 * Dynamic world regulatory domain requested by the wireless 324 * core upon initialization 325 */ 326 static void update_world_regdomain(const struct ieee80211_regdomain *rd) 327 { 328 struct regulatory_request *lr; 329 330 lr = get_last_request(); 331 332 WARN_ON(!lr); 333 334 reset_regdomains(false, rd); 335 336 cfg80211_world_regdom = rd; 337 } 338 339 bool is_world_regdom(const char *alpha2) 340 { 341 if (!alpha2) 342 return false; 343 return alpha2[0] == '0' && alpha2[1] == '0'; 344 } 345 346 static bool is_alpha2_set(const char *alpha2) 347 { 348 if (!alpha2) 349 return false; 350 return alpha2[0] && alpha2[1]; 351 } 352 353 static bool is_unknown_alpha2(const char *alpha2) 354 { 355 if (!alpha2) 356 return false; 357 /* 358 * Special case where regulatory domain was built by driver 359 * but a specific alpha2 cannot be determined 360 */ 361 return alpha2[0] == '9' && alpha2[1] == '9'; 362 } 363 364 static bool is_intersected_alpha2(const char *alpha2) 365 { 366 if (!alpha2) 367 return false; 368 /* 369 * Special case where regulatory domain is the 370 * result of an intersection between two regulatory domain 371 * structures 372 */ 373 return alpha2[0] == '9' && alpha2[1] == '8'; 374 } 375 376 static bool is_an_alpha2(const char *alpha2) 377 { 378 if (!alpha2) 379 return false; 380 return isalpha(alpha2[0]) && isalpha(alpha2[1]); 381 } 382 383 static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y) 384 { 385 if (!alpha2_x || !alpha2_y) 386 return false; 387 return alpha2_x[0] == alpha2_y[0] && alpha2_x[1] == alpha2_y[1]; 388 } 389 390 static bool regdom_changes(const char *alpha2) 391 { 392 const struct ieee80211_regdomain *r = get_cfg80211_regdom(); 393 394 if (!r) 395 return true; 396 return !alpha2_equal(r->alpha2, alpha2); 397 } 398 399 /* 400 * The NL80211_REGDOM_SET_BY_USER regdom alpha2 is cached, this lets 401 * you know if a valid regulatory hint with NL80211_REGDOM_SET_BY_USER 402 * has ever been issued. 403 */ 404 static bool is_user_regdom_saved(void) 405 { 406 if (user_alpha2[0] == '9' && user_alpha2[1] == '7') 407 return false; 408 409 /* This would indicate a mistake on the design */ 410 if (WARN(!is_world_regdom(user_alpha2) && !is_an_alpha2(user_alpha2), 411 "Unexpected user alpha2: %c%c\n", 412 user_alpha2[0], user_alpha2[1])) 413 return false; 414 415 return true; 416 } 417 418 static const struct ieee80211_regdomain * 419 reg_copy_regd(const struct ieee80211_regdomain *src_regd) 420 { 421 struct ieee80211_regdomain *regd; 422 int size_of_regd; 423 unsigned int i; 424 425 size_of_regd = 426 sizeof(struct ieee80211_regdomain) + 427 src_regd->n_reg_rules * sizeof(struct ieee80211_reg_rule); 428 429 regd = kzalloc(size_of_regd, GFP_KERNEL); 430 if (!regd) 431 return ERR_PTR(-ENOMEM); 432 433 memcpy(regd, src_regd, sizeof(struct ieee80211_regdomain)); 434 435 for (i = 0; i < src_regd->n_reg_rules; i++) 436 memcpy(®d->reg_rules[i], &src_regd->reg_rules[i], 437 sizeof(struct ieee80211_reg_rule)); 438 439 return regd; 440 } 441 442 #ifdef CONFIG_CFG80211_INTERNAL_REGDB 443 struct reg_regdb_search_request { 444 char alpha2[2]; 445 struct list_head list; 446 }; 447 448 static LIST_HEAD(reg_regdb_search_list); 449 static DEFINE_MUTEX(reg_regdb_search_mutex); 450 451 static void reg_regdb_search(struct work_struct *work) 452 { 453 struct reg_regdb_search_request *request; 454 const struct ieee80211_regdomain *curdom, *regdom = NULL; 455 int i; 456 457 rtnl_lock(); 458 459 mutex_lock(®_regdb_search_mutex); 460 while (!list_empty(®_regdb_search_list)) { 461 request = list_first_entry(®_regdb_search_list, 462 struct reg_regdb_search_request, 463 list); 464 list_del(&request->list); 465 466 for (i = 0; i < reg_regdb_size; i++) { 467 curdom = reg_regdb[i]; 468 469 if (alpha2_equal(request->alpha2, curdom->alpha2)) { 470 regdom = reg_copy_regd(curdom); 471 break; 472 } 473 } 474 475 kfree(request); 476 } 477 mutex_unlock(®_regdb_search_mutex); 478 479 if (!IS_ERR_OR_NULL(regdom)) 480 set_regdom(regdom); 481 482 rtnl_unlock(); 483 } 484 485 static DECLARE_WORK(reg_regdb_work, reg_regdb_search); 486 487 static void reg_regdb_query(const char *alpha2) 488 { 489 struct reg_regdb_search_request *request; 490 491 if (!alpha2) 492 return; 493 494 request = kzalloc(sizeof(struct reg_regdb_search_request), GFP_KERNEL); 495 if (!request) 496 return; 497 498 memcpy(request->alpha2, alpha2, 2); 499 500 mutex_lock(®_regdb_search_mutex); 501 list_add_tail(&request->list, ®_regdb_search_list); 502 mutex_unlock(®_regdb_search_mutex); 503 504 schedule_work(®_regdb_work); 505 } 506 507 /* Feel free to add any other sanity checks here */ 508 static void reg_regdb_size_check(void) 509 { 510 /* We should ideally BUILD_BUG_ON() but then random builds would fail */ 511 WARN_ONCE(!reg_regdb_size, "db.txt is empty, you should update it..."); 512 } 513 #else 514 static inline void reg_regdb_size_check(void) {} 515 static inline void reg_regdb_query(const char *alpha2) {} 516 #endif /* CONFIG_CFG80211_INTERNAL_REGDB */ 517 518 /* 519 * This lets us keep regulatory code which is updated on a regulatory 520 * basis in userspace. 521 */ 522 static int call_crda(const char *alpha2) 523 { 524 char country[12]; 525 char *env[] = { country, NULL }; 526 527 snprintf(country, sizeof(country), "COUNTRY=%c%c", 528 alpha2[0], alpha2[1]); 529 530 if (!is_world_regdom((char *) alpha2)) 531 pr_info("Calling CRDA for country: %c%c\n", 532 alpha2[0], alpha2[1]); 533 else 534 pr_info("Calling CRDA to update world regulatory domain\n"); 535 536 /* query internal regulatory database (if it exists) */ 537 reg_regdb_query(alpha2); 538 539 return kobject_uevent_env(®_pdev->dev.kobj, KOBJ_CHANGE, env); 540 } 541 542 static enum reg_request_treatment 543 reg_call_crda(struct regulatory_request *request) 544 { 545 if (call_crda(request->alpha2)) 546 return REG_REQ_IGNORE; 547 return REG_REQ_OK; 548 } 549 550 bool reg_is_valid_request(const char *alpha2) 551 { 552 struct regulatory_request *lr = get_last_request(); 553 554 if (!lr || lr->processed) 555 return false; 556 557 return alpha2_equal(lr->alpha2, alpha2); 558 } 559 560 static const struct ieee80211_regdomain *reg_get_regdomain(struct wiphy *wiphy) 561 { 562 struct regulatory_request *lr = get_last_request(); 563 564 /* 565 * Follow the driver's regulatory domain, if present, unless a country 566 * IE has been processed or a user wants to help complaince further 567 */ 568 if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE && 569 lr->initiator != NL80211_REGDOM_SET_BY_USER && 570 wiphy->regd) 571 return get_wiphy_regdom(wiphy); 572 573 return get_cfg80211_regdom(); 574 } 575 576 unsigned int reg_get_max_bandwidth(const struct ieee80211_regdomain *rd, 577 const struct ieee80211_reg_rule *rule) 578 { 579 const struct ieee80211_freq_range *freq_range = &rule->freq_range; 580 const struct ieee80211_freq_range *freq_range_tmp; 581 const struct ieee80211_reg_rule *tmp; 582 u32 start_freq, end_freq, idx, no; 583 584 for (idx = 0; idx < rd->n_reg_rules; idx++) 585 if (rule == &rd->reg_rules[idx]) 586 break; 587 588 if (idx == rd->n_reg_rules) 589 return 0; 590 591 /* get start_freq */ 592 no = idx; 593 594 while (no) { 595 tmp = &rd->reg_rules[--no]; 596 freq_range_tmp = &tmp->freq_range; 597 598 if (freq_range_tmp->end_freq_khz < freq_range->start_freq_khz) 599 break; 600 601 freq_range = freq_range_tmp; 602 } 603 604 start_freq = freq_range->start_freq_khz; 605 606 /* get end_freq */ 607 freq_range = &rule->freq_range; 608 no = idx; 609 610 while (no < rd->n_reg_rules - 1) { 611 tmp = &rd->reg_rules[++no]; 612 freq_range_tmp = &tmp->freq_range; 613 614 if (freq_range_tmp->start_freq_khz > freq_range->end_freq_khz) 615 break; 616 617 freq_range = freq_range_tmp; 618 } 619 620 end_freq = freq_range->end_freq_khz; 621 622 return end_freq - start_freq; 623 } 624 625 /* Sanity check on a regulatory rule */ 626 static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule) 627 { 628 const struct ieee80211_freq_range *freq_range = &rule->freq_range; 629 u32 freq_diff; 630 631 if (freq_range->start_freq_khz <= 0 || freq_range->end_freq_khz <= 0) 632 return false; 633 634 if (freq_range->start_freq_khz > freq_range->end_freq_khz) 635 return false; 636 637 freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz; 638 639 if (freq_range->end_freq_khz <= freq_range->start_freq_khz || 640 freq_range->max_bandwidth_khz > freq_diff) 641 return false; 642 643 return true; 644 } 645 646 static bool is_valid_rd(const struct ieee80211_regdomain *rd) 647 { 648 const struct ieee80211_reg_rule *reg_rule = NULL; 649 unsigned int i; 650 651 if (!rd->n_reg_rules) 652 return false; 653 654 if (WARN_ON(rd->n_reg_rules > NL80211_MAX_SUPP_REG_RULES)) 655 return false; 656 657 for (i = 0; i < rd->n_reg_rules; i++) { 658 reg_rule = &rd->reg_rules[i]; 659 if (!is_valid_reg_rule(reg_rule)) 660 return false; 661 } 662 663 return true; 664 } 665 666 static bool reg_does_bw_fit(const struct ieee80211_freq_range *freq_range, 667 u32 center_freq_khz, u32 bw_khz) 668 { 669 u32 start_freq_khz, end_freq_khz; 670 671 start_freq_khz = center_freq_khz - (bw_khz/2); 672 end_freq_khz = center_freq_khz + (bw_khz/2); 673 674 if (start_freq_khz >= freq_range->start_freq_khz && 675 end_freq_khz <= freq_range->end_freq_khz) 676 return true; 677 678 return false; 679 } 680 681 /** 682 * freq_in_rule_band - tells us if a frequency is in a frequency band 683 * @freq_range: frequency rule we want to query 684 * @freq_khz: frequency we are inquiring about 685 * 686 * This lets us know if a specific frequency rule is or is not relevant to 687 * a specific frequency's band. Bands are device specific and artificial 688 * definitions (the "2.4 GHz band", the "5 GHz band" and the "60GHz band"), 689 * however it is safe for now to assume that a frequency rule should not be 690 * part of a frequency's band if the start freq or end freq are off by more 691 * than 2 GHz for the 2.4 and 5 GHz bands, and by more than 10 GHz for the 692 * 60 GHz band. 693 * This resolution can be lowered and should be considered as we add 694 * regulatory rule support for other "bands". 695 **/ 696 static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range, 697 u32 freq_khz) 698 { 699 #define ONE_GHZ_IN_KHZ 1000000 700 /* 701 * From 802.11ad: directional multi-gigabit (DMG): 702 * Pertaining to operation in a frequency band containing a channel 703 * with the Channel starting frequency above 45 GHz. 704 */ 705 u32 limit = freq_khz > 45 * ONE_GHZ_IN_KHZ ? 706 10 * ONE_GHZ_IN_KHZ : 2 * ONE_GHZ_IN_KHZ; 707 if (abs(freq_khz - freq_range->start_freq_khz) <= limit) 708 return true; 709 if (abs(freq_khz - freq_range->end_freq_khz) <= limit) 710 return true; 711 return false; 712 #undef ONE_GHZ_IN_KHZ 713 } 714 715 /* 716 * Later on we can perhaps use the more restrictive DFS 717 * region but we don't have information for that yet so 718 * for now simply disallow conflicts. 719 */ 720 static enum nl80211_dfs_regions 721 reg_intersect_dfs_region(const enum nl80211_dfs_regions dfs_region1, 722 const enum nl80211_dfs_regions dfs_region2) 723 { 724 if (dfs_region1 != dfs_region2) 725 return NL80211_DFS_UNSET; 726 return dfs_region1; 727 } 728 729 /* 730 * Helper for regdom_intersect(), this does the real 731 * mathematical intersection fun 732 */ 733 static int reg_rules_intersect(const struct ieee80211_regdomain *rd1, 734 const struct ieee80211_regdomain *rd2, 735 const struct ieee80211_reg_rule *rule1, 736 const struct ieee80211_reg_rule *rule2, 737 struct ieee80211_reg_rule *intersected_rule) 738 { 739 const struct ieee80211_freq_range *freq_range1, *freq_range2; 740 struct ieee80211_freq_range *freq_range; 741 const struct ieee80211_power_rule *power_rule1, *power_rule2; 742 struct ieee80211_power_rule *power_rule; 743 u32 freq_diff, max_bandwidth1, max_bandwidth2; 744 745 freq_range1 = &rule1->freq_range; 746 freq_range2 = &rule2->freq_range; 747 freq_range = &intersected_rule->freq_range; 748 749 power_rule1 = &rule1->power_rule; 750 power_rule2 = &rule2->power_rule; 751 power_rule = &intersected_rule->power_rule; 752 753 freq_range->start_freq_khz = max(freq_range1->start_freq_khz, 754 freq_range2->start_freq_khz); 755 freq_range->end_freq_khz = min(freq_range1->end_freq_khz, 756 freq_range2->end_freq_khz); 757 758 max_bandwidth1 = freq_range1->max_bandwidth_khz; 759 max_bandwidth2 = freq_range2->max_bandwidth_khz; 760 761 if (rule1->flags & NL80211_RRF_AUTO_BW) 762 max_bandwidth1 = reg_get_max_bandwidth(rd1, rule1); 763 if (rule2->flags & NL80211_RRF_AUTO_BW) 764 max_bandwidth2 = reg_get_max_bandwidth(rd2, rule2); 765 766 freq_range->max_bandwidth_khz = min(max_bandwidth1, max_bandwidth2); 767 768 intersected_rule->flags = rule1->flags | rule2->flags; 769 770 /* 771 * In case NL80211_RRF_AUTO_BW requested for both rules 772 * set AUTO_BW in intersected rule also. Next we will 773 * calculate BW correctly in handle_channel function. 774 * In other case remove AUTO_BW flag while we calculate 775 * maximum bandwidth correctly and auto calculation is 776 * not required. 777 */ 778 if ((rule1->flags & NL80211_RRF_AUTO_BW) && 779 (rule2->flags & NL80211_RRF_AUTO_BW)) 780 intersected_rule->flags |= NL80211_RRF_AUTO_BW; 781 else 782 intersected_rule->flags &= ~NL80211_RRF_AUTO_BW; 783 784 freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz; 785 if (freq_range->max_bandwidth_khz > freq_diff) 786 freq_range->max_bandwidth_khz = freq_diff; 787 788 power_rule->max_eirp = min(power_rule1->max_eirp, 789 power_rule2->max_eirp); 790 power_rule->max_antenna_gain = min(power_rule1->max_antenna_gain, 791 power_rule2->max_antenna_gain); 792 793 intersected_rule->dfs_cac_ms = max(rule1->dfs_cac_ms, 794 rule2->dfs_cac_ms); 795 796 if (!is_valid_reg_rule(intersected_rule)) 797 return -EINVAL; 798 799 return 0; 800 } 801 802 /* check whether old rule contains new rule */ 803 static bool rule_contains(struct ieee80211_reg_rule *r1, 804 struct ieee80211_reg_rule *r2) 805 { 806 /* for simplicity, currently consider only same flags */ 807 if (r1->flags != r2->flags) 808 return false; 809 810 /* verify r1 is more restrictive */ 811 if ((r1->power_rule.max_antenna_gain > 812 r2->power_rule.max_antenna_gain) || 813 r1->power_rule.max_eirp > r2->power_rule.max_eirp) 814 return false; 815 816 /* make sure r2's range is contained within r1 */ 817 if (r1->freq_range.start_freq_khz > r2->freq_range.start_freq_khz || 818 r1->freq_range.end_freq_khz < r2->freq_range.end_freq_khz) 819 return false; 820 821 /* and finally verify that r1.max_bw >= r2.max_bw */ 822 if (r1->freq_range.max_bandwidth_khz < 823 r2->freq_range.max_bandwidth_khz) 824 return false; 825 826 return true; 827 } 828 829 /* add or extend current rules. do nothing if rule is already contained */ 830 static void add_rule(struct ieee80211_reg_rule *rule, 831 struct ieee80211_reg_rule *reg_rules, u32 *n_rules) 832 { 833 struct ieee80211_reg_rule *tmp_rule; 834 int i; 835 836 for (i = 0; i < *n_rules; i++) { 837 tmp_rule = ®_rules[i]; 838 /* rule is already contained - do nothing */ 839 if (rule_contains(tmp_rule, rule)) 840 return; 841 842 /* extend rule if possible */ 843 if (rule_contains(rule, tmp_rule)) { 844 memcpy(tmp_rule, rule, sizeof(*rule)); 845 return; 846 } 847 } 848 849 memcpy(®_rules[*n_rules], rule, sizeof(*rule)); 850 (*n_rules)++; 851 } 852 853 /** 854 * regdom_intersect - do the intersection between two regulatory domains 855 * @rd1: first regulatory domain 856 * @rd2: second regulatory domain 857 * 858 * Use this function to get the intersection between two regulatory domains. 859 * Once completed we will mark the alpha2 for the rd as intersected, "98", 860 * as no one single alpha2 can represent this regulatory domain. 861 * 862 * Returns a pointer to the regulatory domain structure which will hold the 863 * resulting intersection of rules between rd1 and rd2. We will 864 * kzalloc() this structure for you. 865 */ 866 static struct ieee80211_regdomain * 867 regdom_intersect(const struct ieee80211_regdomain *rd1, 868 const struct ieee80211_regdomain *rd2) 869 { 870 int r, size_of_regd; 871 unsigned int x, y; 872 unsigned int num_rules = 0; 873 const struct ieee80211_reg_rule *rule1, *rule2; 874 struct ieee80211_reg_rule intersected_rule; 875 struct ieee80211_regdomain *rd; 876 877 if (!rd1 || !rd2) 878 return NULL; 879 880 /* 881 * First we get a count of the rules we'll need, then we actually 882 * build them. This is to so we can malloc() and free() a 883 * regdomain once. The reason we use reg_rules_intersect() here 884 * is it will return -EINVAL if the rule computed makes no sense. 885 * All rules that do check out OK are valid. 886 */ 887 888 for (x = 0; x < rd1->n_reg_rules; x++) { 889 rule1 = &rd1->reg_rules[x]; 890 for (y = 0; y < rd2->n_reg_rules; y++) { 891 rule2 = &rd2->reg_rules[y]; 892 if (!reg_rules_intersect(rd1, rd2, rule1, rule2, 893 &intersected_rule)) 894 num_rules++; 895 } 896 } 897 898 if (!num_rules) 899 return NULL; 900 901 size_of_regd = sizeof(struct ieee80211_regdomain) + 902 num_rules * sizeof(struct ieee80211_reg_rule); 903 904 rd = kzalloc(size_of_regd, GFP_KERNEL); 905 if (!rd) 906 return NULL; 907 908 for (x = 0; x < rd1->n_reg_rules; x++) { 909 rule1 = &rd1->reg_rules[x]; 910 for (y = 0; y < rd2->n_reg_rules; y++) { 911 rule2 = &rd2->reg_rules[y]; 912 r = reg_rules_intersect(rd1, rd2, rule1, rule2, 913 &intersected_rule); 914 /* 915 * No need to memset here the intersected rule here as 916 * we're not using the stack anymore 917 */ 918 if (r) 919 continue; 920 921 add_rule(&intersected_rule, rd->reg_rules, 922 &rd->n_reg_rules); 923 } 924 } 925 926 rd->alpha2[0] = '9'; 927 rd->alpha2[1] = '8'; 928 rd->dfs_region = reg_intersect_dfs_region(rd1->dfs_region, 929 rd2->dfs_region); 930 931 return rd; 932 } 933 934 /* 935 * XXX: add support for the rest of enum nl80211_reg_rule_flags, we may 936 * want to just have the channel structure use these 937 */ 938 static u32 map_regdom_flags(u32 rd_flags) 939 { 940 u32 channel_flags = 0; 941 if (rd_flags & NL80211_RRF_NO_IR_ALL) 942 channel_flags |= IEEE80211_CHAN_NO_IR; 943 if (rd_flags & NL80211_RRF_DFS) 944 channel_flags |= IEEE80211_CHAN_RADAR; 945 if (rd_flags & NL80211_RRF_NO_OFDM) 946 channel_flags |= IEEE80211_CHAN_NO_OFDM; 947 if (rd_flags & NL80211_RRF_NO_OUTDOOR) 948 channel_flags |= IEEE80211_CHAN_INDOOR_ONLY; 949 return channel_flags; 950 } 951 952 static const struct ieee80211_reg_rule * 953 freq_reg_info_regd(struct wiphy *wiphy, u32 center_freq, 954 const struct ieee80211_regdomain *regd) 955 { 956 int i; 957 bool band_rule_found = false; 958 bool bw_fits = false; 959 960 if (!regd) 961 return ERR_PTR(-EINVAL); 962 963 for (i = 0; i < regd->n_reg_rules; i++) { 964 const struct ieee80211_reg_rule *rr; 965 const struct ieee80211_freq_range *fr = NULL; 966 967 rr = ®d->reg_rules[i]; 968 fr = &rr->freq_range; 969 970 /* 971 * We only need to know if one frequency rule was 972 * was in center_freq's band, that's enough, so lets 973 * not overwrite it once found 974 */ 975 if (!band_rule_found) 976 band_rule_found = freq_in_rule_band(fr, center_freq); 977 978 bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(20)); 979 980 if (band_rule_found && bw_fits) 981 return rr; 982 } 983 984 if (!band_rule_found) 985 return ERR_PTR(-ERANGE); 986 987 return ERR_PTR(-EINVAL); 988 } 989 990 const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy, 991 u32 center_freq) 992 { 993 const struct ieee80211_regdomain *regd; 994 995 regd = reg_get_regdomain(wiphy); 996 997 return freq_reg_info_regd(wiphy, center_freq, regd); 998 } 999 EXPORT_SYMBOL(freq_reg_info); 1000 1001 const char *reg_initiator_name(enum nl80211_reg_initiator initiator) 1002 { 1003 switch (initiator) { 1004 case NL80211_REGDOM_SET_BY_CORE: 1005 return "core"; 1006 case NL80211_REGDOM_SET_BY_USER: 1007 return "user"; 1008 case NL80211_REGDOM_SET_BY_DRIVER: 1009 return "driver"; 1010 case NL80211_REGDOM_SET_BY_COUNTRY_IE: 1011 return "country IE"; 1012 default: 1013 WARN_ON(1); 1014 return "bug"; 1015 } 1016 } 1017 EXPORT_SYMBOL(reg_initiator_name); 1018 1019 #ifdef CONFIG_CFG80211_REG_DEBUG 1020 static void chan_reg_rule_print_dbg(const struct ieee80211_regdomain *regd, 1021 struct ieee80211_channel *chan, 1022 const struct ieee80211_reg_rule *reg_rule) 1023 { 1024 const struct ieee80211_power_rule *power_rule; 1025 const struct ieee80211_freq_range *freq_range; 1026 char max_antenna_gain[32], bw[32]; 1027 1028 power_rule = ®_rule->power_rule; 1029 freq_range = ®_rule->freq_range; 1030 1031 if (!power_rule->max_antenna_gain) 1032 snprintf(max_antenna_gain, sizeof(max_antenna_gain), "N/A"); 1033 else 1034 snprintf(max_antenna_gain, sizeof(max_antenna_gain), "%d", 1035 power_rule->max_antenna_gain); 1036 1037 if (reg_rule->flags & NL80211_RRF_AUTO_BW) 1038 snprintf(bw, sizeof(bw), "%d KHz, %d KHz AUTO", 1039 freq_range->max_bandwidth_khz, 1040 reg_get_max_bandwidth(regd, reg_rule)); 1041 else 1042 snprintf(bw, sizeof(bw), "%d KHz", 1043 freq_range->max_bandwidth_khz); 1044 1045 REG_DBG_PRINT("Updating information on frequency %d MHz with regulatory rule:\n", 1046 chan->center_freq); 1047 1048 REG_DBG_PRINT("%d KHz - %d KHz @ %s), (%s mBi, %d mBm)\n", 1049 freq_range->start_freq_khz, freq_range->end_freq_khz, 1050 bw, max_antenna_gain, 1051 power_rule->max_eirp); 1052 } 1053 #else 1054 static void chan_reg_rule_print_dbg(const struct ieee80211_regdomain *regd, 1055 struct ieee80211_channel *chan, 1056 const struct ieee80211_reg_rule *reg_rule) 1057 { 1058 return; 1059 } 1060 #endif 1061 1062 /* 1063 * Note that right now we assume the desired channel bandwidth 1064 * is always 20 MHz for each individual channel (HT40 uses 20 MHz 1065 * per channel, the primary and the extension channel). 1066 */ 1067 static void handle_channel(struct wiphy *wiphy, 1068 enum nl80211_reg_initiator initiator, 1069 struct ieee80211_channel *chan) 1070 { 1071 u32 flags, bw_flags = 0; 1072 const struct ieee80211_reg_rule *reg_rule = NULL; 1073 const struct ieee80211_power_rule *power_rule = NULL; 1074 const struct ieee80211_freq_range *freq_range = NULL; 1075 struct wiphy *request_wiphy = NULL; 1076 struct regulatory_request *lr = get_last_request(); 1077 const struct ieee80211_regdomain *regd; 1078 u32 max_bandwidth_khz; 1079 1080 request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx); 1081 1082 flags = chan->orig_flags; 1083 1084 reg_rule = freq_reg_info(wiphy, MHZ_TO_KHZ(chan->center_freq)); 1085 if (IS_ERR(reg_rule)) { 1086 /* 1087 * We will disable all channels that do not match our 1088 * received regulatory rule unless the hint is coming 1089 * from a Country IE and the Country IE had no information 1090 * about a band. The IEEE 802.11 spec allows for an AP 1091 * to send only a subset of the regulatory rules allowed, 1092 * so an AP in the US that only supports 2.4 GHz may only send 1093 * a country IE with information for the 2.4 GHz band 1094 * while 5 GHz is still supported. 1095 */ 1096 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE && 1097 PTR_ERR(reg_rule) == -ERANGE) 1098 return; 1099 1100 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER && 1101 request_wiphy && request_wiphy == wiphy && 1102 request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) { 1103 REG_DBG_PRINT("Disabling freq %d MHz for good\n", 1104 chan->center_freq); 1105 chan->orig_flags |= IEEE80211_CHAN_DISABLED; 1106 chan->flags = chan->orig_flags; 1107 } else { 1108 REG_DBG_PRINT("Disabling freq %d MHz\n", 1109 chan->center_freq); 1110 chan->flags |= IEEE80211_CHAN_DISABLED; 1111 } 1112 return; 1113 } 1114 1115 regd = reg_get_regdomain(wiphy); 1116 chan_reg_rule_print_dbg(regd, chan, reg_rule); 1117 1118 power_rule = ®_rule->power_rule; 1119 freq_range = ®_rule->freq_range; 1120 1121 max_bandwidth_khz = freq_range->max_bandwidth_khz; 1122 /* Check if auto calculation requested */ 1123 if (reg_rule->flags & NL80211_RRF_AUTO_BW) 1124 max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule); 1125 1126 if (max_bandwidth_khz < MHZ_TO_KHZ(40)) 1127 bw_flags = IEEE80211_CHAN_NO_HT40; 1128 if (max_bandwidth_khz < MHZ_TO_KHZ(80)) 1129 bw_flags |= IEEE80211_CHAN_NO_80MHZ; 1130 if (max_bandwidth_khz < MHZ_TO_KHZ(160)) 1131 bw_flags |= IEEE80211_CHAN_NO_160MHZ; 1132 1133 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER && 1134 request_wiphy && request_wiphy == wiphy && 1135 request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) { 1136 /* 1137 * This guarantees the driver's requested regulatory domain 1138 * will always be used as a base for further regulatory 1139 * settings 1140 */ 1141 chan->flags = chan->orig_flags = 1142 map_regdom_flags(reg_rule->flags) | bw_flags; 1143 chan->max_antenna_gain = chan->orig_mag = 1144 (int) MBI_TO_DBI(power_rule->max_antenna_gain); 1145 chan->max_reg_power = chan->max_power = chan->orig_mpwr = 1146 (int) MBM_TO_DBM(power_rule->max_eirp); 1147 1148 if (chan->flags & IEEE80211_CHAN_RADAR) { 1149 chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 1150 if (reg_rule->dfs_cac_ms) 1151 chan->dfs_cac_ms = reg_rule->dfs_cac_ms; 1152 } 1153 1154 return; 1155 } 1156 1157 chan->dfs_state = NL80211_DFS_USABLE; 1158 chan->dfs_state_entered = jiffies; 1159 1160 chan->beacon_found = false; 1161 chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags); 1162 chan->max_antenna_gain = 1163 min_t(int, chan->orig_mag, 1164 MBI_TO_DBI(power_rule->max_antenna_gain)); 1165 chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp); 1166 1167 if (chan->flags & IEEE80211_CHAN_RADAR) { 1168 if (reg_rule->dfs_cac_ms) 1169 chan->dfs_cac_ms = reg_rule->dfs_cac_ms; 1170 else 1171 chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS; 1172 } 1173 1174 if (chan->orig_mpwr) { 1175 /* 1176 * Devices that use REGULATORY_COUNTRY_IE_FOLLOW_POWER 1177 * will always follow the passed country IE power settings. 1178 */ 1179 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE && 1180 wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER) 1181 chan->max_power = chan->max_reg_power; 1182 else 1183 chan->max_power = min(chan->orig_mpwr, 1184 chan->max_reg_power); 1185 } else 1186 chan->max_power = chan->max_reg_power; 1187 } 1188 1189 static void handle_band(struct wiphy *wiphy, 1190 enum nl80211_reg_initiator initiator, 1191 struct ieee80211_supported_band *sband) 1192 { 1193 unsigned int i; 1194 1195 if (!sband) 1196 return; 1197 1198 for (i = 0; i < sband->n_channels; i++) 1199 handle_channel(wiphy, initiator, &sband->channels[i]); 1200 } 1201 1202 static bool reg_request_cell_base(struct regulatory_request *request) 1203 { 1204 if (request->initiator != NL80211_REGDOM_SET_BY_USER) 1205 return false; 1206 return request->user_reg_hint_type == NL80211_USER_REG_HINT_CELL_BASE; 1207 } 1208 1209 static bool reg_request_indoor(struct regulatory_request *request) 1210 { 1211 if (request->initiator != NL80211_REGDOM_SET_BY_USER) 1212 return false; 1213 return request->user_reg_hint_type == NL80211_USER_REG_HINT_INDOOR; 1214 } 1215 1216 bool reg_last_request_cell_base(void) 1217 { 1218 return reg_request_cell_base(get_last_request()); 1219 } 1220 1221 #ifdef CONFIG_CFG80211_REG_CELLULAR_HINTS 1222 /* Core specific check */ 1223 static enum reg_request_treatment 1224 reg_ignore_cell_hint(struct regulatory_request *pending_request) 1225 { 1226 struct regulatory_request *lr = get_last_request(); 1227 1228 if (!reg_num_devs_support_basehint) 1229 return REG_REQ_IGNORE; 1230 1231 if (reg_request_cell_base(lr) && 1232 !regdom_changes(pending_request->alpha2)) 1233 return REG_REQ_ALREADY_SET; 1234 1235 return REG_REQ_OK; 1236 } 1237 1238 /* Device specific check */ 1239 static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy) 1240 { 1241 return !(wiphy->features & NL80211_FEATURE_CELL_BASE_REG_HINTS); 1242 } 1243 #else 1244 static int reg_ignore_cell_hint(struct regulatory_request *pending_request) 1245 { 1246 return REG_REQ_IGNORE; 1247 } 1248 1249 static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy) 1250 { 1251 return true; 1252 } 1253 #endif 1254 1255 static bool wiphy_strict_alpha2_regd(struct wiphy *wiphy) 1256 { 1257 if (wiphy->regulatory_flags & REGULATORY_STRICT_REG && 1258 !(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)) 1259 return true; 1260 return false; 1261 } 1262 1263 static bool ignore_reg_update(struct wiphy *wiphy, 1264 enum nl80211_reg_initiator initiator) 1265 { 1266 struct regulatory_request *lr = get_last_request(); 1267 1268 if (!lr) { 1269 REG_DBG_PRINT("Ignoring regulatory request set by %s " 1270 "since last_request is not set\n", 1271 reg_initiator_name(initiator)); 1272 return true; 1273 } 1274 1275 if (initiator == NL80211_REGDOM_SET_BY_CORE && 1276 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) { 1277 REG_DBG_PRINT("Ignoring regulatory request set by %s " 1278 "since the driver uses its own custom " 1279 "regulatory domain\n", 1280 reg_initiator_name(initiator)); 1281 return true; 1282 } 1283 1284 /* 1285 * wiphy->regd will be set once the device has its own 1286 * desired regulatory domain set 1287 */ 1288 if (wiphy_strict_alpha2_regd(wiphy) && !wiphy->regd && 1289 initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE && 1290 !is_world_regdom(lr->alpha2)) { 1291 REG_DBG_PRINT("Ignoring regulatory request set by %s " 1292 "since the driver requires its own regulatory " 1293 "domain to be set first\n", 1294 reg_initiator_name(initiator)); 1295 return true; 1296 } 1297 1298 if (reg_request_cell_base(lr)) 1299 return reg_dev_ignore_cell_hint(wiphy); 1300 1301 return false; 1302 } 1303 1304 static bool reg_is_world_roaming(struct wiphy *wiphy) 1305 { 1306 const struct ieee80211_regdomain *cr = get_cfg80211_regdom(); 1307 const struct ieee80211_regdomain *wr = get_wiphy_regdom(wiphy); 1308 struct regulatory_request *lr = get_last_request(); 1309 1310 if (is_world_regdom(cr->alpha2) || (wr && is_world_regdom(wr->alpha2))) 1311 return true; 1312 1313 if (lr && lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE && 1314 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) 1315 return true; 1316 1317 return false; 1318 } 1319 1320 static void handle_reg_beacon(struct wiphy *wiphy, unsigned int chan_idx, 1321 struct reg_beacon *reg_beacon) 1322 { 1323 struct ieee80211_supported_band *sband; 1324 struct ieee80211_channel *chan; 1325 bool channel_changed = false; 1326 struct ieee80211_channel chan_before; 1327 1328 sband = wiphy->bands[reg_beacon->chan.band]; 1329 chan = &sband->channels[chan_idx]; 1330 1331 if (likely(chan->center_freq != reg_beacon->chan.center_freq)) 1332 return; 1333 1334 if (chan->beacon_found) 1335 return; 1336 1337 chan->beacon_found = true; 1338 1339 if (!reg_is_world_roaming(wiphy)) 1340 return; 1341 1342 if (wiphy->regulatory_flags & REGULATORY_DISABLE_BEACON_HINTS) 1343 return; 1344 1345 chan_before.center_freq = chan->center_freq; 1346 chan_before.flags = chan->flags; 1347 1348 if (chan->flags & IEEE80211_CHAN_NO_IR) { 1349 chan->flags &= ~IEEE80211_CHAN_NO_IR; 1350 channel_changed = true; 1351 } 1352 1353 if (channel_changed) 1354 nl80211_send_beacon_hint_event(wiphy, &chan_before, chan); 1355 } 1356 1357 /* 1358 * Called when a scan on a wiphy finds a beacon on 1359 * new channel 1360 */ 1361 static void wiphy_update_new_beacon(struct wiphy *wiphy, 1362 struct reg_beacon *reg_beacon) 1363 { 1364 unsigned int i; 1365 struct ieee80211_supported_band *sband; 1366 1367 if (!wiphy->bands[reg_beacon->chan.band]) 1368 return; 1369 1370 sband = wiphy->bands[reg_beacon->chan.band]; 1371 1372 for (i = 0; i < sband->n_channels; i++) 1373 handle_reg_beacon(wiphy, i, reg_beacon); 1374 } 1375 1376 /* 1377 * Called upon reg changes or a new wiphy is added 1378 */ 1379 static void wiphy_update_beacon_reg(struct wiphy *wiphy) 1380 { 1381 unsigned int i; 1382 struct ieee80211_supported_band *sband; 1383 struct reg_beacon *reg_beacon; 1384 1385 list_for_each_entry(reg_beacon, ®_beacon_list, list) { 1386 if (!wiphy->bands[reg_beacon->chan.band]) 1387 continue; 1388 sband = wiphy->bands[reg_beacon->chan.band]; 1389 for (i = 0; i < sband->n_channels; i++) 1390 handle_reg_beacon(wiphy, i, reg_beacon); 1391 } 1392 } 1393 1394 /* Reap the advantages of previously found beacons */ 1395 static void reg_process_beacons(struct wiphy *wiphy) 1396 { 1397 /* 1398 * Means we are just firing up cfg80211, so no beacons would 1399 * have been processed yet. 1400 */ 1401 if (!last_request) 1402 return; 1403 wiphy_update_beacon_reg(wiphy); 1404 } 1405 1406 static bool is_ht40_allowed(struct ieee80211_channel *chan) 1407 { 1408 if (!chan) 1409 return false; 1410 if (chan->flags & IEEE80211_CHAN_DISABLED) 1411 return false; 1412 /* This would happen when regulatory rules disallow HT40 completely */ 1413 if ((chan->flags & IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40) 1414 return false; 1415 return true; 1416 } 1417 1418 static void reg_process_ht_flags_channel(struct wiphy *wiphy, 1419 struct ieee80211_channel *channel) 1420 { 1421 struct ieee80211_supported_band *sband = wiphy->bands[channel->band]; 1422 struct ieee80211_channel *channel_before = NULL, *channel_after = NULL; 1423 unsigned int i; 1424 1425 if (!is_ht40_allowed(channel)) { 1426 channel->flags |= IEEE80211_CHAN_NO_HT40; 1427 return; 1428 } 1429 1430 /* 1431 * We need to ensure the extension channels exist to 1432 * be able to use HT40- or HT40+, this finds them (or not) 1433 */ 1434 for (i = 0; i < sband->n_channels; i++) { 1435 struct ieee80211_channel *c = &sband->channels[i]; 1436 1437 if (c->center_freq == (channel->center_freq - 20)) 1438 channel_before = c; 1439 if (c->center_freq == (channel->center_freq + 20)) 1440 channel_after = c; 1441 } 1442 1443 /* 1444 * Please note that this assumes target bandwidth is 20 MHz, 1445 * if that ever changes we also need to change the below logic 1446 * to include that as well. 1447 */ 1448 if (!is_ht40_allowed(channel_before)) 1449 channel->flags |= IEEE80211_CHAN_NO_HT40MINUS; 1450 else 1451 channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS; 1452 1453 if (!is_ht40_allowed(channel_after)) 1454 channel->flags |= IEEE80211_CHAN_NO_HT40PLUS; 1455 else 1456 channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS; 1457 } 1458 1459 static void reg_process_ht_flags_band(struct wiphy *wiphy, 1460 struct ieee80211_supported_band *sband) 1461 { 1462 unsigned int i; 1463 1464 if (!sband) 1465 return; 1466 1467 for (i = 0; i < sband->n_channels; i++) 1468 reg_process_ht_flags_channel(wiphy, &sband->channels[i]); 1469 } 1470 1471 static void reg_process_ht_flags(struct wiphy *wiphy) 1472 { 1473 enum ieee80211_band band; 1474 1475 if (!wiphy) 1476 return; 1477 1478 for (band = 0; band < IEEE80211_NUM_BANDS; band++) 1479 reg_process_ht_flags_band(wiphy, wiphy->bands[band]); 1480 } 1481 1482 static void reg_call_notifier(struct wiphy *wiphy, 1483 struct regulatory_request *request) 1484 { 1485 if (wiphy->reg_notifier) 1486 wiphy->reg_notifier(wiphy, request); 1487 } 1488 1489 static void wiphy_update_regulatory(struct wiphy *wiphy, 1490 enum nl80211_reg_initiator initiator) 1491 { 1492 enum ieee80211_band band; 1493 struct regulatory_request *lr = get_last_request(); 1494 1495 if (ignore_reg_update(wiphy, initiator)) { 1496 /* 1497 * Regulatory updates set by CORE are ignored for custom 1498 * regulatory cards. Let us notify the changes to the driver, 1499 * as some drivers used this to restore its orig_* reg domain. 1500 */ 1501 if (initiator == NL80211_REGDOM_SET_BY_CORE && 1502 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) 1503 reg_call_notifier(wiphy, lr); 1504 return; 1505 } 1506 1507 lr->dfs_region = get_cfg80211_regdom()->dfs_region; 1508 1509 for (band = 0; band < IEEE80211_NUM_BANDS; band++) 1510 handle_band(wiphy, initiator, wiphy->bands[band]); 1511 1512 reg_process_beacons(wiphy); 1513 reg_process_ht_flags(wiphy); 1514 reg_call_notifier(wiphy, lr); 1515 } 1516 1517 static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator) 1518 { 1519 struct cfg80211_registered_device *rdev; 1520 struct wiphy *wiphy; 1521 1522 ASSERT_RTNL(); 1523 1524 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 1525 wiphy = &rdev->wiphy; 1526 wiphy_update_regulatory(wiphy, initiator); 1527 } 1528 } 1529 1530 static void handle_channel_custom(struct wiphy *wiphy, 1531 struct ieee80211_channel *chan, 1532 const struct ieee80211_regdomain *regd) 1533 { 1534 u32 bw_flags = 0; 1535 const struct ieee80211_reg_rule *reg_rule = NULL; 1536 const struct ieee80211_power_rule *power_rule = NULL; 1537 const struct ieee80211_freq_range *freq_range = NULL; 1538 u32 max_bandwidth_khz; 1539 1540 reg_rule = freq_reg_info_regd(wiphy, MHZ_TO_KHZ(chan->center_freq), 1541 regd); 1542 1543 if (IS_ERR(reg_rule)) { 1544 REG_DBG_PRINT("Disabling freq %d MHz as custom regd has no rule that fits it\n", 1545 chan->center_freq); 1546 chan->orig_flags |= IEEE80211_CHAN_DISABLED; 1547 chan->flags = chan->orig_flags; 1548 return; 1549 } 1550 1551 chan_reg_rule_print_dbg(regd, chan, reg_rule); 1552 1553 power_rule = ®_rule->power_rule; 1554 freq_range = ®_rule->freq_range; 1555 1556 max_bandwidth_khz = freq_range->max_bandwidth_khz; 1557 /* Check if auto calculation requested */ 1558 if (reg_rule->flags & NL80211_RRF_AUTO_BW) 1559 max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule); 1560 1561 if (max_bandwidth_khz < MHZ_TO_KHZ(40)) 1562 bw_flags = IEEE80211_CHAN_NO_HT40; 1563 if (max_bandwidth_khz < MHZ_TO_KHZ(80)) 1564 bw_flags |= IEEE80211_CHAN_NO_80MHZ; 1565 if (max_bandwidth_khz < MHZ_TO_KHZ(160)) 1566 bw_flags |= IEEE80211_CHAN_NO_160MHZ; 1567 1568 chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags; 1569 chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain); 1570 chan->max_reg_power = chan->max_power = 1571 (int) MBM_TO_DBM(power_rule->max_eirp); 1572 } 1573 1574 static void handle_band_custom(struct wiphy *wiphy, 1575 struct ieee80211_supported_band *sband, 1576 const struct ieee80211_regdomain *regd) 1577 { 1578 unsigned int i; 1579 1580 if (!sband) 1581 return; 1582 1583 for (i = 0; i < sband->n_channels; i++) 1584 handle_channel_custom(wiphy, &sband->channels[i], regd); 1585 } 1586 1587 /* Used by drivers prior to wiphy registration */ 1588 void wiphy_apply_custom_regulatory(struct wiphy *wiphy, 1589 const struct ieee80211_regdomain *regd) 1590 { 1591 enum ieee80211_band band; 1592 unsigned int bands_set = 0; 1593 1594 WARN(!(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG), 1595 "wiphy should have REGULATORY_CUSTOM_REG\n"); 1596 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG; 1597 1598 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 1599 if (!wiphy->bands[band]) 1600 continue; 1601 handle_band_custom(wiphy, wiphy->bands[band], regd); 1602 bands_set++; 1603 } 1604 1605 /* 1606 * no point in calling this if it won't have any effect 1607 * on your device's supported bands. 1608 */ 1609 WARN_ON(!bands_set); 1610 } 1611 EXPORT_SYMBOL(wiphy_apply_custom_regulatory); 1612 1613 static void reg_set_request_processed(void) 1614 { 1615 bool need_more_processing = false; 1616 struct regulatory_request *lr = get_last_request(); 1617 1618 lr->processed = true; 1619 1620 spin_lock(®_requests_lock); 1621 if (!list_empty(®_requests_list)) 1622 need_more_processing = true; 1623 spin_unlock(®_requests_lock); 1624 1625 if (lr->initiator == NL80211_REGDOM_SET_BY_USER) 1626 cancel_delayed_work(®_timeout); 1627 1628 if (need_more_processing) 1629 schedule_work(®_work); 1630 } 1631 1632 /** 1633 * reg_process_hint_core - process core regulatory requests 1634 * @pending_request: a pending core regulatory request 1635 * 1636 * The wireless subsystem can use this function to process 1637 * a regulatory request issued by the regulatory core. 1638 * 1639 * Returns one of the different reg request treatment values. 1640 */ 1641 static enum reg_request_treatment 1642 reg_process_hint_core(struct regulatory_request *core_request) 1643 { 1644 1645 core_request->intersect = false; 1646 core_request->processed = false; 1647 1648 reg_update_last_request(core_request); 1649 1650 return reg_call_crda(core_request); 1651 } 1652 1653 static enum reg_request_treatment 1654 __reg_process_hint_user(struct regulatory_request *user_request) 1655 { 1656 struct regulatory_request *lr = get_last_request(); 1657 1658 if (reg_request_indoor(user_request)) { 1659 reg_is_indoor = true; 1660 return REG_REQ_USER_HINT_HANDLED; 1661 } 1662 1663 if (reg_request_cell_base(user_request)) 1664 return reg_ignore_cell_hint(user_request); 1665 1666 if (reg_request_cell_base(lr)) 1667 return REG_REQ_IGNORE; 1668 1669 if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) 1670 return REG_REQ_INTERSECT; 1671 /* 1672 * If the user knows better the user should set the regdom 1673 * to their country before the IE is picked up 1674 */ 1675 if (lr->initiator == NL80211_REGDOM_SET_BY_USER && 1676 lr->intersect) 1677 return REG_REQ_IGNORE; 1678 /* 1679 * Process user requests only after previous user/driver/core 1680 * requests have been processed 1681 */ 1682 if ((lr->initiator == NL80211_REGDOM_SET_BY_CORE || 1683 lr->initiator == NL80211_REGDOM_SET_BY_DRIVER || 1684 lr->initiator == NL80211_REGDOM_SET_BY_USER) && 1685 regdom_changes(lr->alpha2)) 1686 return REG_REQ_IGNORE; 1687 1688 if (!regdom_changes(user_request->alpha2)) 1689 return REG_REQ_ALREADY_SET; 1690 1691 return REG_REQ_OK; 1692 } 1693 1694 /** 1695 * reg_process_hint_user - process user regulatory requests 1696 * @user_request: a pending user regulatory request 1697 * 1698 * The wireless subsystem can use this function to process 1699 * a regulatory request initiated by userspace. 1700 * 1701 * Returns one of the different reg request treatment values. 1702 */ 1703 static enum reg_request_treatment 1704 reg_process_hint_user(struct regulatory_request *user_request) 1705 { 1706 enum reg_request_treatment treatment; 1707 1708 treatment = __reg_process_hint_user(user_request); 1709 if (treatment == REG_REQ_IGNORE || 1710 treatment == REG_REQ_ALREADY_SET || 1711 treatment == REG_REQ_USER_HINT_HANDLED) { 1712 reg_free_request(user_request); 1713 return treatment; 1714 } 1715 1716 user_request->intersect = treatment == REG_REQ_INTERSECT; 1717 user_request->processed = false; 1718 1719 reg_update_last_request(user_request); 1720 1721 user_alpha2[0] = user_request->alpha2[0]; 1722 user_alpha2[1] = user_request->alpha2[1]; 1723 1724 return reg_call_crda(user_request); 1725 } 1726 1727 static enum reg_request_treatment 1728 __reg_process_hint_driver(struct regulatory_request *driver_request) 1729 { 1730 struct regulatory_request *lr = get_last_request(); 1731 1732 if (lr->initiator == NL80211_REGDOM_SET_BY_CORE) { 1733 if (regdom_changes(driver_request->alpha2)) 1734 return REG_REQ_OK; 1735 return REG_REQ_ALREADY_SET; 1736 } 1737 1738 /* 1739 * This would happen if you unplug and plug your card 1740 * back in or if you add a new device for which the previously 1741 * loaded card also agrees on the regulatory domain. 1742 */ 1743 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER && 1744 !regdom_changes(driver_request->alpha2)) 1745 return REG_REQ_ALREADY_SET; 1746 1747 return REG_REQ_INTERSECT; 1748 } 1749 1750 /** 1751 * reg_process_hint_driver - process driver regulatory requests 1752 * @driver_request: a pending driver regulatory request 1753 * 1754 * The wireless subsystem can use this function to process 1755 * a regulatory request issued by an 802.11 driver. 1756 * 1757 * Returns one of the different reg request treatment values. 1758 */ 1759 static enum reg_request_treatment 1760 reg_process_hint_driver(struct wiphy *wiphy, 1761 struct regulatory_request *driver_request) 1762 { 1763 const struct ieee80211_regdomain *regd; 1764 enum reg_request_treatment treatment; 1765 1766 treatment = __reg_process_hint_driver(driver_request); 1767 1768 switch (treatment) { 1769 case REG_REQ_OK: 1770 break; 1771 case REG_REQ_IGNORE: 1772 case REG_REQ_USER_HINT_HANDLED: 1773 reg_free_request(driver_request); 1774 return treatment; 1775 case REG_REQ_INTERSECT: 1776 /* fall through */ 1777 case REG_REQ_ALREADY_SET: 1778 regd = reg_copy_regd(get_cfg80211_regdom()); 1779 if (IS_ERR(regd)) { 1780 reg_free_request(driver_request); 1781 return REG_REQ_IGNORE; 1782 } 1783 rcu_assign_pointer(wiphy->regd, regd); 1784 } 1785 1786 1787 driver_request->intersect = treatment == REG_REQ_INTERSECT; 1788 driver_request->processed = false; 1789 1790 reg_update_last_request(driver_request); 1791 1792 /* 1793 * Since CRDA will not be called in this case as we already 1794 * have applied the requested regulatory domain before we just 1795 * inform userspace we have processed the request 1796 */ 1797 if (treatment == REG_REQ_ALREADY_SET) { 1798 nl80211_send_reg_change_event(driver_request); 1799 reg_set_request_processed(); 1800 return treatment; 1801 } 1802 1803 return reg_call_crda(driver_request); 1804 } 1805 1806 static enum reg_request_treatment 1807 __reg_process_hint_country_ie(struct wiphy *wiphy, 1808 struct regulatory_request *country_ie_request) 1809 { 1810 struct wiphy *last_wiphy = NULL; 1811 struct regulatory_request *lr = get_last_request(); 1812 1813 if (reg_request_cell_base(lr)) { 1814 /* Trust a Cell base station over the AP's country IE */ 1815 if (regdom_changes(country_ie_request->alpha2)) 1816 return REG_REQ_IGNORE; 1817 return REG_REQ_ALREADY_SET; 1818 } else { 1819 if (wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_IGNORE) 1820 return REG_REQ_IGNORE; 1821 } 1822 1823 if (unlikely(!is_an_alpha2(country_ie_request->alpha2))) 1824 return -EINVAL; 1825 1826 if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) 1827 return REG_REQ_OK; 1828 1829 last_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx); 1830 1831 if (last_wiphy != wiphy) { 1832 /* 1833 * Two cards with two APs claiming different 1834 * Country IE alpha2s. We could 1835 * intersect them, but that seems unlikely 1836 * to be correct. Reject second one for now. 1837 */ 1838 if (regdom_changes(country_ie_request->alpha2)) 1839 return REG_REQ_IGNORE; 1840 return REG_REQ_ALREADY_SET; 1841 } 1842 /* 1843 * Two consecutive Country IE hints on the same wiphy. 1844 * This should be picked up early by the driver/stack 1845 */ 1846 if (WARN_ON(regdom_changes(country_ie_request->alpha2))) 1847 return REG_REQ_OK; 1848 return REG_REQ_ALREADY_SET; 1849 } 1850 1851 /** 1852 * reg_process_hint_country_ie - process regulatory requests from country IEs 1853 * @country_ie_request: a regulatory request from a country IE 1854 * 1855 * The wireless subsystem can use this function to process 1856 * a regulatory request issued by a country Information Element. 1857 * 1858 * Returns one of the different reg request treatment values. 1859 */ 1860 static enum reg_request_treatment 1861 reg_process_hint_country_ie(struct wiphy *wiphy, 1862 struct regulatory_request *country_ie_request) 1863 { 1864 enum reg_request_treatment treatment; 1865 1866 treatment = __reg_process_hint_country_ie(wiphy, country_ie_request); 1867 1868 switch (treatment) { 1869 case REG_REQ_OK: 1870 break; 1871 case REG_REQ_IGNORE: 1872 case REG_REQ_USER_HINT_HANDLED: 1873 /* fall through */ 1874 case REG_REQ_ALREADY_SET: 1875 reg_free_request(country_ie_request); 1876 return treatment; 1877 case REG_REQ_INTERSECT: 1878 reg_free_request(country_ie_request); 1879 /* 1880 * This doesn't happen yet, not sure we 1881 * ever want to support it for this case. 1882 */ 1883 WARN_ONCE(1, "Unexpected intersection for country IEs"); 1884 return REG_REQ_IGNORE; 1885 } 1886 1887 country_ie_request->intersect = false; 1888 country_ie_request->processed = false; 1889 1890 reg_update_last_request(country_ie_request); 1891 1892 return reg_call_crda(country_ie_request); 1893 } 1894 1895 /* This processes *all* regulatory hints */ 1896 static void reg_process_hint(struct regulatory_request *reg_request) 1897 { 1898 struct wiphy *wiphy = NULL; 1899 enum reg_request_treatment treatment; 1900 1901 if (reg_request->wiphy_idx != WIPHY_IDX_INVALID) 1902 wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx); 1903 1904 switch (reg_request->initiator) { 1905 case NL80211_REGDOM_SET_BY_CORE: 1906 reg_process_hint_core(reg_request); 1907 return; 1908 case NL80211_REGDOM_SET_BY_USER: 1909 treatment = reg_process_hint_user(reg_request); 1910 if (treatment == REG_REQ_IGNORE || 1911 treatment == REG_REQ_ALREADY_SET || 1912 treatment == REG_REQ_USER_HINT_HANDLED) 1913 return; 1914 queue_delayed_work(system_power_efficient_wq, 1915 ®_timeout, msecs_to_jiffies(3142)); 1916 return; 1917 case NL80211_REGDOM_SET_BY_DRIVER: 1918 if (!wiphy) 1919 goto out_free; 1920 treatment = reg_process_hint_driver(wiphy, reg_request); 1921 break; 1922 case NL80211_REGDOM_SET_BY_COUNTRY_IE: 1923 if (!wiphy) 1924 goto out_free; 1925 treatment = reg_process_hint_country_ie(wiphy, reg_request); 1926 break; 1927 default: 1928 WARN(1, "invalid initiator %d\n", reg_request->initiator); 1929 goto out_free; 1930 } 1931 1932 /* This is required so that the orig_* parameters are saved */ 1933 if (treatment == REG_REQ_ALREADY_SET && wiphy && 1934 wiphy->regulatory_flags & REGULATORY_STRICT_REG) 1935 wiphy_update_regulatory(wiphy, reg_request->initiator); 1936 1937 return; 1938 1939 out_free: 1940 reg_free_request(reg_request); 1941 } 1942 1943 /* 1944 * Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_* 1945 * Regulatory hints come on a first come first serve basis and we 1946 * must process each one atomically. 1947 */ 1948 static void reg_process_pending_hints(void) 1949 { 1950 struct regulatory_request *reg_request, *lr; 1951 1952 lr = get_last_request(); 1953 1954 /* When last_request->processed becomes true this will be rescheduled */ 1955 if (lr && !lr->processed) { 1956 reg_process_hint(lr); 1957 return; 1958 } 1959 1960 spin_lock(®_requests_lock); 1961 1962 if (list_empty(®_requests_list)) { 1963 spin_unlock(®_requests_lock); 1964 return; 1965 } 1966 1967 reg_request = list_first_entry(®_requests_list, 1968 struct regulatory_request, 1969 list); 1970 list_del_init(®_request->list); 1971 1972 spin_unlock(®_requests_lock); 1973 1974 reg_process_hint(reg_request); 1975 } 1976 1977 /* Processes beacon hints -- this has nothing to do with country IEs */ 1978 static void reg_process_pending_beacon_hints(void) 1979 { 1980 struct cfg80211_registered_device *rdev; 1981 struct reg_beacon *pending_beacon, *tmp; 1982 1983 /* This goes through the _pending_ beacon list */ 1984 spin_lock_bh(®_pending_beacons_lock); 1985 1986 list_for_each_entry_safe(pending_beacon, tmp, 1987 ®_pending_beacons, list) { 1988 list_del_init(&pending_beacon->list); 1989 1990 /* Applies the beacon hint to current wiphys */ 1991 list_for_each_entry(rdev, &cfg80211_rdev_list, list) 1992 wiphy_update_new_beacon(&rdev->wiphy, pending_beacon); 1993 1994 /* Remembers the beacon hint for new wiphys or reg changes */ 1995 list_add_tail(&pending_beacon->list, ®_beacon_list); 1996 } 1997 1998 spin_unlock_bh(®_pending_beacons_lock); 1999 } 2000 2001 static void reg_todo(struct work_struct *work) 2002 { 2003 rtnl_lock(); 2004 reg_process_pending_hints(); 2005 reg_process_pending_beacon_hints(); 2006 rtnl_unlock(); 2007 } 2008 2009 static void queue_regulatory_request(struct regulatory_request *request) 2010 { 2011 request->alpha2[0] = toupper(request->alpha2[0]); 2012 request->alpha2[1] = toupper(request->alpha2[1]); 2013 2014 spin_lock(®_requests_lock); 2015 list_add_tail(&request->list, ®_requests_list); 2016 spin_unlock(®_requests_lock); 2017 2018 schedule_work(®_work); 2019 } 2020 2021 /* 2022 * Core regulatory hint -- happens during cfg80211_init() 2023 * and when we restore regulatory settings. 2024 */ 2025 static int regulatory_hint_core(const char *alpha2) 2026 { 2027 struct regulatory_request *request; 2028 2029 request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL); 2030 if (!request) 2031 return -ENOMEM; 2032 2033 request->alpha2[0] = alpha2[0]; 2034 request->alpha2[1] = alpha2[1]; 2035 request->initiator = NL80211_REGDOM_SET_BY_CORE; 2036 2037 queue_regulatory_request(request); 2038 2039 return 0; 2040 } 2041 2042 /* User hints */ 2043 int regulatory_hint_user(const char *alpha2, 2044 enum nl80211_user_reg_hint_type user_reg_hint_type) 2045 { 2046 struct regulatory_request *request; 2047 2048 if (WARN_ON(!alpha2)) 2049 return -EINVAL; 2050 2051 request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL); 2052 if (!request) 2053 return -ENOMEM; 2054 2055 request->wiphy_idx = WIPHY_IDX_INVALID; 2056 request->alpha2[0] = alpha2[0]; 2057 request->alpha2[1] = alpha2[1]; 2058 request->initiator = NL80211_REGDOM_SET_BY_USER; 2059 request->user_reg_hint_type = user_reg_hint_type; 2060 2061 queue_regulatory_request(request); 2062 2063 return 0; 2064 } 2065 2066 int regulatory_hint_indoor_user(void) 2067 { 2068 struct regulatory_request *request; 2069 2070 request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL); 2071 if (!request) 2072 return -ENOMEM; 2073 2074 request->wiphy_idx = WIPHY_IDX_INVALID; 2075 request->initiator = NL80211_REGDOM_SET_BY_USER; 2076 request->user_reg_hint_type = NL80211_USER_REG_HINT_INDOOR; 2077 queue_regulatory_request(request); 2078 2079 return 0; 2080 } 2081 2082 /* Driver hints */ 2083 int regulatory_hint(struct wiphy *wiphy, const char *alpha2) 2084 { 2085 struct regulatory_request *request; 2086 2087 if (WARN_ON(!alpha2 || !wiphy)) 2088 return -EINVAL; 2089 2090 wiphy->regulatory_flags &= ~REGULATORY_CUSTOM_REG; 2091 2092 request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL); 2093 if (!request) 2094 return -ENOMEM; 2095 2096 request->wiphy_idx = get_wiphy_idx(wiphy); 2097 2098 request->alpha2[0] = alpha2[0]; 2099 request->alpha2[1] = alpha2[1]; 2100 request->initiator = NL80211_REGDOM_SET_BY_DRIVER; 2101 2102 queue_regulatory_request(request); 2103 2104 return 0; 2105 } 2106 EXPORT_SYMBOL(regulatory_hint); 2107 2108 void regulatory_hint_country_ie(struct wiphy *wiphy, enum ieee80211_band band, 2109 const u8 *country_ie, u8 country_ie_len) 2110 { 2111 char alpha2[2]; 2112 enum environment_cap env = ENVIRON_ANY; 2113 struct regulatory_request *request = NULL, *lr; 2114 2115 /* IE len must be evenly divisible by 2 */ 2116 if (country_ie_len & 0x01) 2117 return; 2118 2119 if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN) 2120 return; 2121 2122 request = kzalloc(sizeof(*request), GFP_KERNEL); 2123 if (!request) 2124 return; 2125 2126 alpha2[0] = country_ie[0]; 2127 alpha2[1] = country_ie[1]; 2128 2129 if (country_ie[2] == 'I') 2130 env = ENVIRON_INDOOR; 2131 else if (country_ie[2] == 'O') 2132 env = ENVIRON_OUTDOOR; 2133 2134 rcu_read_lock(); 2135 lr = get_last_request(); 2136 2137 if (unlikely(!lr)) 2138 goto out; 2139 2140 /* 2141 * We will run this only upon a successful connection on cfg80211. 2142 * We leave conflict resolution to the workqueue, where can hold 2143 * the RTNL. 2144 */ 2145 if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE && 2146 lr->wiphy_idx != WIPHY_IDX_INVALID) 2147 goto out; 2148 2149 request->wiphy_idx = get_wiphy_idx(wiphy); 2150 request->alpha2[0] = alpha2[0]; 2151 request->alpha2[1] = alpha2[1]; 2152 request->initiator = NL80211_REGDOM_SET_BY_COUNTRY_IE; 2153 request->country_ie_env = env; 2154 2155 queue_regulatory_request(request); 2156 request = NULL; 2157 out: 2158 kfree(request); 2159 rcu_read_unlock(); 2160 } 2161 2162 static void restore_alpha2(char *alpha2, bool reset_user) 2163 { 2164 /* indicates there is no alpha2 to consider for restoration */ 2165 alpha2[0] = '9'; 2166 alpha2[1] = '7'; 2167 2168 /* The user setting has precedence over the module parameter */ 2169 if (is_user_regdom_saved()) { 2170 /* Unless we're asked to ignore it and reset it */ 2171 if (reset_user) { 2172 REG_DBG_PRINT("Restoring regulatory settings including user preference\n"); 2173 user_alpha2[0] = '9'; 2174 user_alpha2[1] = '7'; 2175 2176 /* 2177 * If we're ignoring user settings, we still need to 2178 * check the module parameter to ensure we put things 2179 * back as they were for a full restore. 2180 */ 2181 if (!is_world_regdom(ieee80211_regdom)) { 2182 REG_DBG_PRINT("Keeping preference on module parameter ieee80211_regdom: %c%c\n", 2183 ieee80211_regdom[0], ieee80211_regdom[1]); 2184 alpha2[0] = ieee80211_regdom[0]; 2185 alpha2[1] = ieee80211_regdom[1]; 2186 } 2187 } else { 2188 REG_DBG_PRINT("Restoring regulatory settings while preserving user preference for: %c%c\n", 2189 user_alpha2[0], user_alpha2[1]); 2190 alpha2[0] = user_alpha2[0]; 2191 alpha2[1] = user_alpha2[1]; 2192 } 2193 } else if (!is_world_regdom(ieee80211_regdom)) { 2194 REG_DBG_PRINT("Keeping preference on module parameter ieee80211_regdom: %c%c\n", 2195 ieee80211_regdom[0], ieee80211_regdom[1]); 2196 alpha2[0] = ieee80211_regdom[0]; 2197 alpha2[1] = ieee80211_regdom[1]; 2198 } else 2199 REG_DBG_PRINT("Restoring regulatory settings\n"); 2200 } 2201 2202 static void restore_custom_reg_settings(struct wiphy *wiphy) 2203 { 2204 struct ieee80211_supported_band *sband; 2205 enum ieee80211_band band; 2206 struct ieee80211_channel *chan; 2207 int i; 2208 2209 for (band = 0; band < IEEE80211_NUM_BANDS; band++) { 2210 sband = wiphy->bands[band]; 2211 if (!sband) 2212 continue; 2213 for (i = 0; i < sband->n_channels; i++) { 2214 chan = &sband->channels[i]; 2215 chan->flags = chan->orig_flags; 2216 chan->max_antenna_gain = chan->orig_mag; 2217 chan->max_power = chan->orig_mpwr; 2218 chan->beacon_found = false; 2219 } 2220 } 2221 } 2222 2223 /* 2224 * Restoring regulatory settings involves ingoring any 2225 * possibly stale country IE information and user regulatory 2226 * settings if so desired, this includes any beacon hints 2227 * learned as we could have traveled outside to another country 2228 * after disconnection. To restore regulatory settings we do 2229 * exactly what we did at bootup: 2230 * 2231 * - send a core regulatory hint 2232 * - send a user regulatory hint if applicable 2233 * 2234 * Device drivers that send a regulatory hint for a specific country 2235 * keep their own regulatory domain on wiphy->regd so that does does 2236 * not need to be remembered. 2237 */ 2238 static void restore_regulatory_settings(bool reset_user) 2239 { 2240 char alpha2[2]; 2241 char world_alpha2[2]; 2242 struct reg_beacon *reg_beacon, *btmp; 2243 struct regulatory_request *reg_request, *tmp; 2244 LIST_HEAD(tmp_reg_req_list); 2245 struct cfg80211_registered_device *rdev; 2246 2247 ASSERT_RTNL(); 2248 2249 reg_is_indoor = false; 2250 2251 reset_regdomains(true, &world_regdom); 2252 restore_alpha2(alpha2, reset_user); 2253 2254 /* 2255 * If there's any pending requests we simply 2256 * stash them to a temporary pending queue and 2257 * add then after we've restored regulatory 2258 * settings. 2259 */ 2260 spin_lock(®_requests_lock); 2261 list_for_each_entry_safe(reg_request, tmp, ®_requests_list, list) { 2262 if (reg_request->initiator != NL80211_REGDOM_SET_BY_USER) 2263 continue; 2264 list_move_tail(®_request->list, &tmp_reg_req_list); 2265 } 2266 spin_unlock(®_requests_lock); 2267 2268 /* Clear beacon hints */ 2269 spin_lock_bh(®_pending_beacons_lock); 2270 list_for_each_entry_safe(reg_beacon, btmp, ®_pending_beacons, list) { 2271 list_del(®_beacon->list); 2272 kfree(reg_beacon); 2273 } 2274 spin_unlock_bh(®_pending_beacons_lock); 2275 2276 list_for_each_entry_safe(reg_beacon, btmp, ®_beacon_list, list) { 2277 list_del(®_beacon->list); 2278 kfree(reg_beacon); 2279 } 2280 2281 /* First restore to the basic regulatory settings */ 2282 world_alpha2[0] = cfg80211_world_regdom->alpha2[0]; 2283 world_alpha2[1] = cfg80211_world_regdom->alpha2[1]; 2284 2285 list_for_each_entry(rdev, &cfg80211_rdev_list, list) { 2286 if (rdev->wiphy.regulatory_flags & REGULATORY_CUSTOM_REG) 2287 restore_custom_reg_settings(&rdev->wiphy); 2288 } 2289 2290 regulatory_hint_core(world_alpha2); 2291 2292 /* 2293 * This restores the ieee80211_regdom module parameter 2294 * preference or the last user requested regulatory 2295 * settings, user regulatory settings takes precedence. 2296 */ 2297 if (is_an_alpha2(alpha2)) 2298 regulatory_hint_user(user_alpha2, NL80211_USER_REG_HINT_USER); 2299 2300 spin_lock(®_requests_lock); 2301 list_splice_tail_init(&tmp_reg_req_list, ®_requests_list); 2302 spin_unlock(®_requests_lock); 2303 2304 REG_DBG_PRINT("Kicking the queue\n"); 2305 2306 schedule_work(®_work); 2307 } 2308 2309 void regulatory_hint_disconnect(void) 2310 { 2311 REG_DBG_PRINT("All devices are disconnected, going to restore regulatory settings\n"); 2312 restore_regulatory_settings(false); 2313 } 2314 2315 static bool freq_is_chan_12_13_14(u16 freq) 2316 { 2317 if (freq == ieee80211_channel_to_frequency(12, IEEE80211_BAND_2GHZ) || 2318 freq == ieee80211_channel_to_frequency(13, IEEE80211_BAND_2GHZ) || 2319 freq == ieee80211_channel_to_frequency(14, IEEE80211_BAND_2GHZ)) 2320 return true; 2321 return false; 2322 } 2323 2324 static bool pending_reg_beacon(struct ieee80211_channel *beacon_chan) 2325 { 2326 struct reg_beacon *pending_beacon; 2327 2328 list_for_each_entry(pending_beacon, ®_pending_beacons, list) 2329 if (beacon_chan->center_freq == 2330 pending_beacon->chan.center_freq) 2331 return true; 2332 return false; 2333 } 2334 2335 int regulatory_hint_found_beacon(struct wiphy *wiphy, 2336 struct ieee80211_channel *beacon_chan, 2337 gfp_t gfp) 2338 { 2339 struct reg_beacon *reg_beacon; 2340 bool processing; 2341 2342 if (beacon_chan->beacon_found || 2343 beacon_chan->flags & IEEE80211_CHAN_RADAR || 2344 (beacon_chan->band == IEEE80211_BAND_2GHZ && 2345 !freq_is_chan_12_13_14(beacon_chan->center_freq))) 2346 return 0; 2347 2348 spin_lock_bh(®_pending_beacons_lock); 2349 processing = pending_reg_beacon(beacon_chan); 2350 spin_unlock_bh(®_pending_beacons_lock); 2351 2352 if (processing) 2353 return 0; 2354 2355 reg_beacon = kzalloc(sizeof(struct reg_beacon), gfp); 2356 if (!reg_beacon) 2357 return -ENOMEM; 2358 2359 REG_DBG_PRINT("Found new beacon on frequency: %d MHz (Ch %d) on %s\n", 2360 beacon_chan->center_freq, 2361 ieee80211_frequency_to_channel(beacon_chan->center_freq), 2362 wiphy_name(wiphy)); 2363 2364 memcpy(®_beacon->chan, beacon_chan, 2365 sizeof(struct ieee80211_channel)); 2366 2367 /* 2368 * Since we can be called from BH or and non-BH context 2369 * we must use spin_lock_bh() 2370 */ 2371 spin_lock_bh(®_pending_beacons_lock); 2372 list_add_tail(®_beacon->list, ®_pending_beacons); 2373 spin_unlock_bh(®_pending_beacons_lock); 2374 2375 schedule_work(®_work); 2376 2377 return 0; 2378 } 2379 2380 static void print_rd_rules(const struct ieee80211_regdomain *rd) 2381 { 2382 unsigned int i; 2383 const struct ieee80211_reg_rule *reg_rule = NULL; 2384 const struct ieee80211_freq_range *freq_range = NULL; 2385 const struct ieee80211_power_rule *power_rule = NULL; 2386 char bw[32], cac_time[32]; 2387 2388 pr_info(" (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)\n"); 2389 2390 for (i = 0; i < rd->n_reg_rules; i++) { 2391 reg_rule = &rd->reg_rules[i]; 2392 freq_range = ®_rule->freq_range; 2393 power_rule = ®_rule->power_rule; 2394 2395 if (reg_rule->flags & NL80211_RRF_AUTO_BW) 2396 snprintf(bw, sizeof(bw), "%d KHz, %d KHz AUTO", 2397 freq_range->max_bandwidth_khz, 2398 reg_get_max_bandwidth(rd, reg_rule)); 2399 else 2400 snprintf(bw, sizeof(bw), "%d KHz", 2401 freq_range->max_bandwidth_khz); 2402 2403 if (reg_rule->flags & NL80211_RRF_DFS) 2404 scnprintf(cac_time, sizeof(cac_time), "%u s", 2405 reg_rule->dfs_cac_ms/1000); 2406 else 2407 scnprintf(cac_time, sizeof(cac_time), "N/A"); 2408 2409 2410 /* 2411 * There may not be documentation for max antenna gain 2412 * in certain regions 2413 */ 2414 if (power_rule->max_antenna_gain) 2415 pr_info(" (%d KHz - %d KHz @ %s), (%d mBi, %d mBm), (%s)\n", 2416 freq_range->start_freq_khz, 2417 freq_range->end_freq_khz, 2418 bw, 2419 power_rule->max_antenna_gain, 2420 power_rule->max_eirp, 2421 cac_time); 2422 else 2423 pr_info(" (%d KHz - %d KHz @ %s), (N/A, %d mBm), (%s)\n", 2424 freq_range->start_freq_khz, 2425 freq_range->end_freq_khz, 2426 bw, 2427 power_rule->max_eirp, 2428 cac_time); 2429 } 2430 } 2431 2432 bool reg_supported_dfs_region(enum nl80211_dfs_regions dfs_region) 2433 { 2434 switch (dfs_region) { 2435 case NL80211_DFS_UNSET: 2436 case NL80211_DFS_FCC: 2437 case NL80211_DFS_ETSI: 2438 case NL80211_DFS_JP: 2439 return true; 2440 default: 2441 REG_DBG_PRINT("Ignoring uknown DFS master region: %d\n", 2442 dfs_region); 2443 return false; 2444 } 2445 } 2446 2447 static void print_regdomain(const struct ieee80211_regdomain *rd) 2448 { 2449 struct regulatory_request *lr = get_last_request(); 2450 2451 if (is_intersected_alpha2(rd->alpha2)) { 2452 if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) { 2453 struct cfg80211_registered_device *rdev; 2454 rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx); 2455 if (rdev) { 2456 pr_info("Current regulatory domain updated by AP to: %c%c\n", 2457 rdev->country_ie_alpha2[0], 2458 rdev->country_ie_alpha2[1]); 2459 } else 2460 pr_info("Current regulatory domain intersected:\n"); 2461 } else 2462 pr_info("Current regulatory domain intersected:\n"); 2463 } else if (is_world_regdom(rd->alpha2)) { 2464 pr_info("World regulatory domain updated:\n"); 2465 } else { 2466 if (is_unknown_alpha2(rd->alpha2)) 2467 pr_info("Regulatory domain changed to driver built-in settings (unknown country)\n"); 2468 else { 2469 if (reg_request_cell_base(lr)) 2470 pr_info("Regulatory domain changed to country: %c%c by Cell Station\n", 2471 rd->alpha2[0], rd->alpha2[1]); 2472 else 2473 pr_info("Regulatory domain changed to country: %c%c\n", 2474 rd->alpha2[0], rd->alpha2[1]); 2475 } 2476 } 2477 2478 pr_info(" DFS Master region: %s", reg_dfs_region_str(rd->dfs_region)); 2479 print_rd_rules(rd); 2480 } 2481 2482 static void print_regdomain_info(const struct ieee80211_regdomain *rd) 2483 { 2484 pr_info("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]); 2485 print_rd_rules(rd); 2486 } 2487 2488 static int reg_set_rd_core(const struct ieee80211_regdomain *rd) 2489 { 2490 if (!is_world_regdom(rd->alpha2)) 2491 return -EINVAL; 2492 update_world_regdomain(rd); 2493 return 0; 2494 } 2495 2496 static int reg_set_rd_user(const struct ieee80211_regdomain *rd, 2497 struct regulatory_request *user_request) 2498 { 2499 const struct ieee80211_regdomain *intersected_rd = NULL; 2500 2501 if (!regdom_changes(rd->alpha2)) 2502 return -EALREADY; 2503 2504 if (!is_valid_rd(rd)) { 2505 pr_err("Invalid regulatory domain detected:\n"); 2506 print_regdomain_info(rd); 2507 return -EINVAL; 2508 } 2509 2510 if (!user_request->intersect) { 2511 reset_regdomains(false, rd); 2512 return 0; 2513 } 2514 2515 intersected_rd = regdom_intersect(rd, get_cfg80211_regdom()); 2516 if (!intersected_rd) 2517 return -EINVAL; 2518 2519 kfree(rd); 2520 rd = NULL; 2521 reset_regdomains(false, intersected_rd); 2522 2523 return 0; 2524 } 2525 2526 static int reg_set_rd_driver(const struct ieee80211_regdomain *rd, 2527 struct regulatory_request *driver_request) 2528 { 2529 const struct ieee80211_regdomain *regd; 2530 const struct ieee80211_regdomain *intersected_rd = NULL; 2531 const struct ieee80211_regdomain *tmp; 2532 struct wiphy *request_wiphy; 2533 2534 if (is_world_regdom(rd->alpha2)) 2535 return -EINVAL; 2536 2537 if (!regdom_changes(rd->alpha2)) 2538 return -EALREADY; 2539 2540 if (!is_valid_rd(rd)) { 2541 pr_err("Invalid regulatory domain detected:\n"); 2542 print_regdomain_info(rd); 2543 return -EINVAL; 2544 } 2545 2546 request_wiphy = wiphy_idx_to_wiphy(driver_request->wiphy_idx); 2547 if (!request_wiphy) { 2548 queue_delayed_work(system_power_efficient_wq, 2549 ®_timeout, 0); 2550 return -ENODEV; 2551 } 2552 2553 if (!driver_request->intersect) { 2554 if (request_wiphy->regd) 2555 return -EALREADY; 2556 2557 regd = reg_copy_regd(rd); 2558 if (IS_ERR(regd)) 2559 return PTR_ERR(regd); 2560 2561 rcu_assign_pointer(request_wiphy->regd, regd); 2562 reset_regdomains(false, rd); 2563 return 0; 2564 } 2565 2566 intersected_rd = regdom_intersect(rd, get_cfg80211_regdom()); 2567 if (!intersected_rd) 2568 return -EINVAL; 2569 2570 /* 2571 * We can trash what CRDA provided now. 2572 * However if a driver requested this specific regulatory 2573 * domain we keep it for its private use 2574 */ 2575 tmp = get_wiphy_regdom(request_wiphy); 2576 rcu_assign_pointer(request_wiphy->regd, rd); 2577 rcu_free_regdom(tmp); 2578 2579 rd = NULL; 2580 2581 reset_regdomains(false, intersected_rd); 2582 2583 return 0; 2584 } 2585 2586 static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd, 2587 struct regulatory_request *country_ie_request) 2588 { 2589 struct wiphy *request_wiphy; 2590 2591 if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) && 2592 !is_unknown_alpha2(rd->alpha2)) 2593 return -EINVAL; 2594 2595 /* 2596 * Lets only bother proceeding on the same alpha2 if the current 2597 * rd is non static (it means CRDA was present and was used last) 2598 * and the pending request came in from a country IE 2599 */ 2600 2601 if (!is_valid_rd(rd)) { 2602 pr_err("Invalid regulatory domain detected:\n"); 2603 print_regdomain_info(rd); 2604 return -EINVAL; 2605 } 2606 2607 request_wiphy = wiphy_idx_to_wiphy(country_ie_request->wiphy_idx); 2608 if (!request_wiphy) { 2609 queue_delayed_work(system_power_efficient_wq, 2610 ®_timeout, 0); 2611 return -ENODEV; 2612 } 2613 2614 if (country_ie_request->intersect) 2615 return -EINVAL; 2616 2617 reset_regdomains(false, rd); 2618 return 0; 2619 } 2620 2621 /* 2622 * Use this call to set the current regulatory domain. Conflicts with 2623 * multiple drivers can be ironed out later. Caller must've already 2624 * kmalloc'd the rd structure. 2625 */ 2626 int set_regdom(const struct ieee80211_regdomain *rd) 2627 { 2628 struct regulatory_request *lr; 2629 bool user_reset = false; 2630 int r; 2631 2632 if (!reg_is_valid_request(rd->alpha2)) { 2633 kfree(rd); 2634 return -EINVAL; 2635 } 2636 2637 lr = get_last_request(); 2638 2639 /* Note that this doesn't update the wiphys, this is done below */ 2640 switch (lr->initiator) { 2641 case NL80211_REGDOM_SET_BY_CORE: 2642 r = reg_set_rd_core(rd); 2643 break; 2644 case NL80211_REGDOM_SET_BY_USER: 2645 r = reg_set_rd_user(rd, lr); 2646 user_reset = true; 2647 break; 2648 case NL80211_REGDOM_SET_BY_DRIVER: 2649 r = reg_set_rd_driver(rd, lr); 2650 break; 2651 case NL80211_REGDOM_SET_BY_COUNTRY_IE: 2652 r = reg_set_rd_country_ie(rd, lr); 2653 break; 2654 default: 2655 WARN(1, "invalid initiator %d\n", lr->initiator); 2656 return -EINVAL; 2657 } 2658 2659 if (r) { 2660 switch (r) { 2661 case -EALREADY: 2662 reg_set_request_processed(); 2663 break; 2664 default: 2665 /* Back to world regulatory in case of errors */ 2666 restore_regulatory_settings(user_reset); 2667 } 2668 2669 kfree(rd); 2670 return r; 2671 } 2672 2673 /* This would make this whole thing pointless */ 2674 if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom())) 2675 return -EINVAL; 2676 2677 /* update all wiphys now with the new established regulatory domain */ 2678 update_all_wiphy_regulatory(lr->initiator); 2679 2680 print_regdomain(get_cfg80211_regdom()); 2681 2682 nl80211_send_reg_change_event(lr); 2683 2684 reg_set_request_processed(); 2685 2686 return 0; 2687 } 2688 2689 void wiphy_regulatory_register(struct wiphy *wiphy) 2690 { 2691 struct regulatory_request *lr; 2692 2693 if (!reg_dev_ignore_cell_hint(wiphy)) 2694 reg_num_devs_support_basehint++; 2695 2696 lr = get_last_request(); 2697 wiphy_update_regulatory(wiphy, lr->initiator); 2698 } 2699 2700 void wiphy_regulatory_deregister(struct wiphy *wiphy) 2701 { 2702 struct wiphy *request_wiphy = NULL; 2703 struct regulatory_request *lr; 2704 2705 lr = get_last_request(); 2706 2707 if (!reg_dev_ignore_cell_hint(wiphy)) 2708 reg_num_devs_support_basehint--; 2709 2710 rcu_free_regdom(get_wiphy_regdom(wiphy)); 2711 RCU_INIT_POINTER(wiphy->regd, NULL); 2712 2713 if (lr) 2714 request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx); 2715 2716 if (!request_wiphy || request_wiphy != wiphy) 2717 return; 2718 2719 lr->wiphy_idx = WIPHY_IDX_INVALID; 2720 lr->country_ie_env = ENVIRON_ANY; 2721 } 2722 2723 static void reg_timeout_work(struct work_struct *work) 2724 { 2725 REG_DBG_PRINT("Timeout while waiting for CRDA to reply, restoring regulatory settings\n"); 2726 rtnl_lock(); 2727 restore_regulatory_settings(true); 2728 rtnl_unlock(); 2729 } 2730 2731 /* 2732 * See http://www.fcc.gov/document/5-ghz-unlicensed-spectrum-unii, for 2733 * UNII band definitions 2734 */ 2735 int cfg80211_get_unii(int freq) 2736 { 2737 /* UNII-1 */ 2738 if (freq >= 5150 && freq <= 5250) 2739 return 0; 2740 2741 /* UNII-2A */ 2742 if (freq > 5250 && freq <= 5350) 2743 return 1; 2744 2745 /* UNII-2B */ 2746 if (freq > 5350 && freq <= 5470) 2747 return 2; 2748 2749 /* UNII-2C */ 2750 if (freq > 5470 && freq <= 5725) 2751 return 3; 2752 2753 /* UNII-3 */ 2754 if (freq > 5725 && freq <= 5825) 2755 return 4; 2756 2757 return -EINVAL; 2758 } 2759 2760 bool regulatory_indoor_allowed(void) 2761 { 2762 return reg_is_indoor; 2763 } 2764 2765 int __init regulatory_init(void) 2766 { 2767 int err = 0; 2768 2769 reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0); 2770 if (IS_ERR(reg_pdev)) 2771 return PTR_ERR(reg_pdev); 2772 2773 spin_lock_init(®_requests_lock); 2774 spin_lock_init(®_pending_beacons_lock); 2775 2776 reg_regdb_size_check(); 2777 2778 rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom); 2779 2780 user_alpha2[0] = '9'; 2781 user_alpha2[1] = '7'; 2782 2783 /* We always try to get an update for the static regdomain */ 2784 err = regulatory_hint_core(cfg80211_world_regdom->alpha2); 2785 if (err) { 2786 if (err == -ENOMEM) 2787 return err; 2788 /* 2789 * N.B. kobject_uevent_env() can fail mainly for when we're out 2790 * memory which is handled and propagated appropriately above 2791 * but it can also fail during a netlink_broadcast() or during 2792 * early boot for call_usermodehelper(). For now treat these 2793 * errors as non-fatal. 2794 */ 2795 pr_err("kobject_uevent_env() was unable to call CRDA during init\n"); 2796 } 2797 2798 /* 2799 * Finally, if the user set the module parameter treat it 2800 * as a user hint. 2801 */ 2802 if (!is_world_regdom(ieee80211_regdom)) 2803 regulatory_hint_user(ieee80211_regdom, 2804 NL80211_USER_REG_HINT_USER); 2805 2806 return 0; 2807 } 2808 2809 void regulatory_exit(void) 2810 { 2811 struct regulatory_request *reg_request, *tmp; 2812 struct reg_beacon *reg_beacon, *btmp; 2813 2814 cancel_work_sync(®_work); 2815 cancel_delayed_work_sync(®_timeout); 2816 2817 /* Lock to suppress warnings */ 2818 rtnl_lock(); 2819 reset_regdomains(true, NULL); 2820 rtnl_unlock(); 2821 2822 dev_set_uevent_suppress(®_pdev->dev, true); 2823 2824 platform_device_unregister(reg_pdev); 2825 2826 list_for_each_entry_safe(reg_beacon, btmp, ®_pending_beacons, list) { 2827 list_del(®_beacon->list); 2828 kfree(reg_beacon); 2829 } 2830 2831 list_for_each_entry_safe(reg_beacon, btmp, ®_beacon_list, list) { 2832 list_del(®_beacon->list); 2833 kfree(reg_beacon); 2834 } 2835 2836 list_for_each_entry_safe(reg_request, tmp, ®_requests_list, list) { 2837 list_del(®_request->list); 2838 kfree(reg_request); 2839 } 2840 } 2841