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