0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0049
0050 #include <linux/kernel.h>
0051 #include <linux/export.h>
0052 #include <linux/slab.h>
0053 #include <linux/list.h>
0054 #include <linux/ctype.h>
0055 #include <linux/nl80211.h>
0056 #include <linux/platform_device.h>
0057 #include <linux/verification.h>
0058 #include <linux/moduleparam.h>
0059 #include <linux/firmware.h>
0060 #include <net/cfg80211.h>
0061 #include "core.h"
0062 #include "reg.h"
0063 #include "rdev-ops.h"
0064 #include "nl80211.h"
0065
0066
0067
0068
0069
0070 #define REG_ENFORCE_GRACE_MS 60000
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082 enum reg_request_treatment {
0083 REG_REQ_OK,
0084 REG_REQ_IGNORE,
0085 REG_REQ_INTERSECT,
0086 REG_REQ_ALREADY_SET,
0087 };
0088
0089 static struct regulatory_request core_request_world = {
0090 .initiator = NL80211_REGDOM_SET_BY_CORE,
0091 .alpha2[0] = '0',
0092 .alpha2[1] = '0',
0093 .intersect = false,
0094 .processed = true,
0095 .country_ie_env = ENVIRON_ANY,
0096 };
0097
0098
0099
0100
0101
0102 static struct regulatory_request __rcu *last_request =
0103 (void __force __rcu *)&core_request_world;
0104
0105
0106 static struct platform_device *reg_pdev;
0107
0108
0109
0110
0111
0112
0113
0114 const struct ieee80211_regdomain __rcu *cfg80211_regdomain;
0115
0116
0117
0118
0119
0120
0121 static int reg_num_devs_support_basehint;
0122
0123
0124
0125
0126
0127
0128 static bool reg_is_indoor;
0129 static DEFINE_SPINLOCK(reg_indoor_lock);
0130
0131
0132 static u32 reg_is_indoor_portid;
0133
0134 static void restore_regulatory_settings(bool reset_user, bool cached);
0135 static void print_regdomain(const struct ieee80211_regdomain *rd);
0136 static void reg_process_hint(struct regulatory_request *reg_request);
0137
0138 static const struct ieee80211_regdomain *get_cfg80211_regdom(void)
0139 {
0140 return rcu_dereference_rtnl(cfg80211_regdomain);
0141 }
0142
0143
0144
0145
0146
0147
0148 const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy)
0149 {
0150 return rcu_dereference_check(wiphy->regd,
0151 lockdep_is_held(&wiphy->mtx) ||
0152 lockdep_rtnl_is_held());
0153 }
0154 EXPORT_SYMBOL(get_wiphy_regdom);
0155
0156 static const char *reg_dfs_region_str(enum nl80211_dfs_regions dfs_region)
0157 {
0158 switch (dfs_region) {
0159 case NL80211_DFS_UNSET:
0160 return "unset";
0161 case NL80211_DFS_FCC:
0162 return "FCC";
0163 case NL80211_DFS_ETSI:
0164 return "ETSI";
0165 case NL80211_DFS_JP:
0166 return "JP";
0167 }
0168 return "Unknown";
0169 }
0170
0171 enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy)
0172 {
0173 const struct ieee80211_regdomain *regd = NULL;
0174 const struct ieee80211_regdomain *wiphy_regd = NULL;
0175 enum nl80211_dfs_regions dfs_region;
0176
0177 rcu_read_lock();
0178 regd = get_cfg80211_regdom();
0179 dfs_region = regd->dfs_region;
0180
0181 if (!wiphy)
0182 goto out;
0183
0184 wiphy_regd = get_wiphy_regdom(wiphy);
0185 if (!wiphy_regd)
0186 goto out;
0187
0188 if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
0189 dfs_region = wiphy_regd->dfs_region;
0190 goto out;
0191 }
0192
0193 if (wiphy_regd->dfs_region == regd->dfs_region)
0194 goto out;
0195
0196 pr_debug("%s: device specific dfs_region (%s) disagrees with cfg80211's central dfs_region (%s)\n",
0197 dev_name(&wiphy->dev),
0198 reg_dfs_region_str(wiphy_regd->dfs_region),
0199 reg_dfs_region_str(regd->dfs_region));
0200
0201 out:
0202 rcu_read_unlock();
0203
0204 return dfs_region;
0205 }
0206
0207 static void rcu_free_regdom(const struct ieee80211_regdomain *r)
0208 {
0209 if (!r)
0210 return;
0211 kfree_rcu((struct ieee80211_regdomain *)r, rcu_head);
0212 }
0213
0214 static struct regulatory_request *get_last_request(void)
0215 {
0216 return rcu_dereference_rtnl(last_request);
0217 }
0218
0219
0220 static LIST_HEAD(reg_requests_list);
0221 static DEFINE_SPINLOCK(reg_requests_lock);
0222
0223
0224 static LIST_HEAD(reg_pending_beacons);
0225 static DEFINE_SPINLOCK(reg_pending_beacons_lock);
0226
0227
0228 static LIST_HEAD(reg_beacon_list);
0229
0230 struct reg_beacon {
0231 struct list_head list;
0232 struct ieee80211_channel chan;
0233 };
0234
0235 static void reg_check_chans_work(struct work_struct *work);
0236 static DECLARE_DELAYED_WORK(reg_check_chans, reg_check_chans_work);
0237
0238 static void reg_todo(struct work_struct *work);
0239 static DECLARE_WORK(reg_work, reg_todo);
0240
0241
0242 static const struct ieee80211_regdomain world_regdom = {
0243 .n_reg_rules = 8,
0244 .alpha2 = "00",
0245 .reg_rules = {
0246
0247 REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
0248
0249 REG_RULE(2467-10, 2472+10, 20, 6, 20,
0250 NL80211_RRF_NO_IR | NL80211_RRF_AUTO_BW),
0251
0252
0253 REG_RULE(2484-10, 2484+10, 20, 6, 20,
0254 NL80211_RRF_NO_IR |
0255 NL80211_RRF_NO_OFDM),
0256
0257 REG_RULE(5180-10, 5240+10, 80, 6, 20,
0258 NL80211_RRF_NO_IR |
0259 NL80211_RRF_AUTO_BW),
0260
0261
0262 REG_RULE(5260-10, 5320+10, 80, 6, 20,
0263 NL80211_RRF_NO_IR |
0264 NL80211_RRF_AUTO_BW |
0265 NL80211_RRF_DFS),
0266
0267
0268 REG_RULE(5500-10, 5720+10, 160, 6, 20,
0269 NL80211_RRF_NO_IR |
0270 NL80211_RRF_DFS),
0271
0272
0273 REG_RULE(5745-10, 5825+10, 80, 6, 20,
0274 NL80211_RRF_NO_IR),
0275
0276
0277 REG_RULE(56160+2160*1-1080, 56160+2160*3+1080, 2160, 0, 0, 0),
0278 }
0279 };
0280
0281
0282 static const struct ieee80211_regdomain *cfg80211_world_regdom =
0283 &world_regdom;
0284
0285 static char *ieee80211_regdom = "00";
0286 static char user_alpha2[2];
0287 static const struct ieee80211_regdomain *cfg80211_user_regdom;
0288
0289 module_param(ieee80211_regdom, charp, 0444);
0290 MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");
0291
0292 static void reg_free_request(struct regulatory_request *request)
0293 {
0294 if (request == &core_request_world)
0295 return;
0296
0297 if (request != get_last_request())
0298 kfree(request);
0299 }
0300
0301 static void reg_free_last_request(void)
0302 {
0303 struct regulatory_request *lr = get_last_request();
0304
0305 if (lr != &core_request_world && lr)
0306 kfree_rcu(lr, rcu_head);
0307 }
0308
0309 static void reg_update_last_request(struct regulatory_request *request)
0310 {
0311 struct regulatory_request *lr;
0312
0313 lr = get_last_request();
0314 if (lr == request)
0315 return;
0316
0317 reg_free_last_request();
0318 rcu_assign_pointer(last_request, request);
0319 }
0320
0321 static void reset_regdomains(bool full_reset,
0322 const struct ieee80211_regdomain *new_regdom)
0323 {
0324 const struct ieee80211_regdomain *r;
0325
0326 ASSERT_RTNL();
0327
0328 r = get_cfg80211_regdom();
0329
0330
0331 if (r == cfg80211_world_regdom)
0332 r = NULL;
0333 if (cfg80211_world_regdom == &world_regdom)
0334 cfg80211_world_regdom = NULL;
0335 if (r == &world_regdom)
0336 r = NULL;
0337
0338 rcu_free_regdom(r);
0339 rcu_free_regdom(cfg80211_world_regdom);
0340
0341 cfg80211_world_regdom = &world_regdom;
0342 rcu_assign_pointer(cfg80211_regdomain, new_regdom);
0343
0344 if (!full_reset)
0345 return;
0346
0347 reg_update_last_request(&core_request_world);
0348 }
0349
0350
0351
0352
0353
0354 static void update_world_regdomain(const struct ieee80211_regdomain *rd)
0355 {
0356 struct regulatory_request *lr;
0357
0358 lr = get_last_request();
0359
0360 WARN_ON(!lr);
0361
0362 reset_regdomains(false, rd);
0363
0364 cfg80211_world_regdom = rd;
0365 }
0366
0367 bool is_world_regdom(const char *alpha2)
0368 {
0369 if (!alpha2)
0370 return false;
0371 return alpha2[0] == '0' && alpha2[1] == '0';
0372 }
0373
0374 static bool is_alpha2_set(const char *alpha2)
0375 {
0376 if (!alpha2)
0377 return false;
0378 return alpha2[0] && alpha2[1];
0379 }
0380
0381 static bool is_unknown_alpha2(const char *alpha2)
0382 {
0383 if (!alpha2)
0384 return false;
0385
0386
0387
0388
0389 return alpha2[0] == '9' && alpha2[1] == '9';
0390 }
0391
0392 static bool is_intersected_alpha2(const char *alpha2)
0393 {
0394 if (!alpha2)
0395 return false;
0396
0397
0398
0399
0400
0401 return alpha2[0] == '9' && alpha2[1] == '8';
0402 }
0403
0404 static bool is_an_alpha2(const char *alpha2)
0405 {
0406 if (!alpha2)
0407 return false;
0408 return isalpha(alpha2[0]) && isalpha(alpha2[1]);
0409 }
0410
0411 static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
0412 {
0413 if (!alpha2_x || !alpha2_y)
0414 return false;
0415 return alpha2_x[0] == alpha2_y[0] && alpha2_x[1] == alpha2_y[1];
0416 }
0417
0418 static bool regdom_changes(const char *alpha2)
0419 {
0420 const struct ieee80211_regdomain *r = get_cfg80211_regdom();
0421
0422 if (!r)
0423 return true;
0424 return !alpha2_equal(r->alpha2, alpha2);
0425 }
0426
0427
0428
0429
0430
0431
0432 static bool is_user_regdom_saved(void)
0433 {
0434 if (user_alpha2[0] == '9' && user_alpha2[1] == '7')
0435 return false;
0436
0437
0438 if (WARN(!is_world_regdom(user_alpha2) && !is_an_alpha2(user_alpha2),
0439 "Unexpected user alpha2: %c%c\n",
0440 user_alpha2[0], user_alpha2[1]))
0441 return false;
0442
0443 return true;
0444 }
0445
0446 static const struct ieee80211_regdomain *
0447 reg_copy_regd(const struct ieee80211_regdomain *src_regd)
0448 {
0449 struct ieee80211_regdomain *regd;
0450 unsigned int i;
0451
0452 regd = kzalloc(struct_size(regd, reg_rules, src_regd->n_reg_rules),
0453 GFP_KERNEL);
0454 if (!regd)
0455 return ERR_PTR(-ENOMEM);
0456
0457 memcpy(regd, src_regd, sizeof(struct ieee80211_regdomain));
0458
0459 for (i = 0; i < src_regd->n_reg_rules; i++)
0460 memcpy(®d->reg_rules[i], &src_regd->reg_rules[i],
0461 sizeof(struct ieee80211_reg_rule));
0462
0463 return regd;
0464 }
0465
0466 static void cfg80211_save_user_regdom(const struct ieee80211_regdomain *rd)
0467 {
0468 ASSERT_RTNL();
0469
0470 if (!IS_ERR(cfg80211_user_regdom))
0471 kfree(cfg80211_user_regdom);
0472 cfg80211_user_regdom = reg_copy_regd(rd);
0473 }
0474
0475 struct reg_regdb_apply_request {
0476 struct list_head list;
0477 const struct ieee80211_regdomain *regdom;
0478 };
0479
0480 static LIST_HEAD(reg_regdb_apply_list);
0481 static DEFINE_MUTEX(reg_regdb_apply_mutex);
0482
0483 static void reg_regdb_apply(struct work_struct *work)
0484 {
0485 struct reg_regdb_apply_request *request;
0486
0487 rtnl_lock();
0488
0489 mutex_lock(®_regdb_apply_mutex);
0490 while (!list_empty(®_regdb_apply_list)) {
0491 request = list_first_entry(®_regdb_apply_list,
0492 struct reg_regdb_apply_request,
0493 list);
0494 list_del(&request->list);
0495
0496 set_regdom(request->regdom, REGD_SOURCE_INTERNAL_DB);
0497 kfree(request);
0498 }
0499 mutex_unlock(®_regdb_apply_mutex);
0500
0501 rtnl_unlock();
0502 }
0503
0504 static DECLARE_WORK(reg_regdb_work, reg_regdb_apply);
0505
0506 static int reg_schedule_apply(const struct ieee80211_regdomain *regdom)
0507 {
0508 struct reg_regdb_apply_request *request;
0509
0510 request = kzalloc(sizeof(struct reg_regdb_apply_request), GFP_KERNEL);
0511 if (!request) {
0512 kfree(regdom);
0513 return -ENOMEM;
0514 }
0515
0516 request->regdom = regdom;
0517
0518 mutex_lock(®_regdb_apply_mutex);
0519 list_add_tail(&request->list, ®_regdb_apply_list);
0520 mutex_unlock(®_regdb_apply_mutex);
0521
0522 schedule_work(®_regdb_work);
0523 return 0;
0524 }
0525
0526 #ifdef CONFIG_CFG80211_CRDA_SUPPORT
0527
0528 #define REG_MAX_CRDA_TIMEOUTS 10
0529
0530 static u32 reg_crda_timeouts;
0531
0532 static void crda_timeout_work(struct work_struct *work);
0533 static DECLARE_DELAYED_WORK(crda_timeout, crda_timeout_work);
0534
0535 static void crda_timeout_work(struct work_struct *work)
0536 {
0537 pr_debug("Timeout while waiting for CRDA to reply, restoring regulatory settings\n");
0538 rtnl_lock();
0539 reg_crda_timeouts++;
0540 restore_regulatory_settings(true, false);
0541 rtnl_unlock();
0542 }
0543
0544 static void cancel_crda_timeout(void)
0545 {
0546 cancel_delayed_work(&crda_timeout);
0547 }
0548
0549 static void cancel_crda_timeout_sync(void)
0550 {
0551 cancel_delayed_work_sync(&crda_timeout);
0552 }
0553
0554 static void reset_crda_timeouts(void)
0555 {
0556 reg_crda_timeouts = 0;
0557 }
0558
0559
0560
0561
0562
0563 static int call_crda(const char *alpha2)
0564 {
0565 char country[12];
0566 char *env[] = { country, NULL };
0567 int ret;
0568
0569 snprintf(country, sizeof(country), "COUNTRY=%c%c",
0570 alpha2[0], alpha2[1]);
0571
0572 if (reg_crda_timeouts > REG_MAX_CRDA_TIMEOUTS) {
0573 pr_debug("Exceeded CRDA call max attempts. Not calling CRDA\n");
0574 return -EINVAL;
0575 }
0576
0577 if (!is_world_regdom((char *) alpha2))
0578 pr_debug("Calling CRDA for country: %c%c\n",
0579 alpha2[0], alpha2[1]);
0580 else
0581 pr_debug("Calling CRDA to update world regulatory domain\n");
0582
0583 ret = kobject_uevent_env(®_pdev->dev.kobj, KOBJ_CHANGE, env);
0584 if (ret)
0585 return ret;
0586
0587 queue_delayed_work(system_power_efficient_wq,
0588 &crda_timeout, msecs_to_jiffies(3142));
0589 return 0;
0590 }
0591 #else
0592 static inline void cancel_crda_timeout(void) {}
0593 static inline void cancel_crda_timeout_sync(void) {}
0594 static inline void reset_crda_timeouts(void) {}
0595 static inline int call_crda(const char *alpha2)
0596 {
0597 return -ENODATA;
0598 }
0599 #endif
0600
0601
0602 static const struct fwdb_header *regdb;
0603
0604 struct fwdb_country {
0605 u8 alpha2[2];
0606 __be16 coll_ptr;
0607
0608 } __packed __aligned(4);
0609
0610 struct fwdb_collection {
0611 u8 len;
0612 u8 n_rules;
0613 u8 dfs_region;
0614
0615
0616 } __packed __aligned(4);
0617
0618 enum fwdb_flags {
0619 FWDB_FLAG_NO_OFDM = BIT(0),
0620 FWDB_FLAG_NO_OUTDOOR = BIT(1),
0621 FWDB_FLAG_DFS = BIT(2),
0622 FWDB_FLAG_NO_IR = BIT(3),
0623 FWDB_FLAG_AUTO_BW = BIT(4),
0624 };
0625
0626 struct fwdb_wmm_ac {
0627 u8 ecw;
0628 u8 aifsn;
0629 __be16 cot;
0630 } __packed;
0631
0632 struct fwdb_wmm_rule {
0633 struct fwdb_wmm_ac client[IEEE80211_NUM_ACS];
0634 struct fwdb_wmm_ac ap[IEEE80211_NUM_ACS];
0635 } __packed;
0636
0637 struct fwdb_rule {
0638 u8 len;
0639 u8 flags;
0640 __be16 max_eirp;
0641 __be32 start, end, max_bw;
0642
0643 __be16 cac_timeout;
0644 __be16 wmm_ptr;
0645 } __packed __aligned(4);
0646
0647 #define FWDB_MAGIC 0x52474442
0648 #define FWDB_VERSION 20
0649
0650 struct fwdb_header {
0651 __be32 magic;
0652 __be32 version;
0653 struct fwdb_country country[];
0654 } __packed __aligned(4);
0655
0656 static int ecw2cw(int ecw)
0657 {
0658 return (1 << ecw) - 1;
0659 }
0660
0661 static bool valid_wmm(struct fwdb_wmm_rule *rule)
0662 {
0663 struct fwdb_wmm_ac *ac = (struct fwdb_wmm_ac *)rule;
0664 int i;
0665
0666 for (i = 0; i < IEEE80211_NUM_ACS * 2; i++) {
0667 u16 cw_min = ecw2cw((ac[i].ecw & 0xf0) >> 4);
0668 u16 cw_max = ecw2cw(ac[i].ecw & 0x0f);
0669 u8 aifsn = ac[i].aifsn;
0670
0671 if (cw_min >= cw_max)
0672 return false;
0673
0674 if (aifsn < 1)
0675 return false;
0676 }
0677
0678 return true;
0679 }
0680
0681 static bool valid_rule(const u8 *data, unsigned int size, u16 rule_ptr)
0682 {
0683 struct fwdb_rule *rule = (void *)(data + (rule_ptr << 2));
0684
0685 if ((u8 *)rule + sizeof(rule->len) > data + size)
0686 return false;
0687
0688
0689 if (rule->len < offsetofend(struct fwdb_rule, max_bw))
0690 return false;
0691 if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr)) {
0692 u32 wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2;
0693 struct fwdb_wmm_rule *wmm;
0694
0695 if (wmm_ptr + sizeof(struct fwdb_wmm_rule) > size)
0696 return false;
0697
0698 wmm = (void *)(data + wmm_ptr);
0699
0700 if (!valid_wmm(wmm))
0701 return false;
0702 }
0703 return true;
0704 }
0705
0706 static bool valid_country(const u8 *data, unsigned int size,
0707 const struct fwdb_country *country)
0708 {
0709 unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
0710 struct fwdb_collection *coll = (void *)(data + ptr);
0711 __be16 *rules_ptr;
0712 unsigned int i;
0713
0714
0715 if ((u8 *)coll + offsetofend(typeof(*coll), n_rules) > data + size)
0716 return false;
0717
0718
0719 if ((u8 *)coll + ALIGN(coll->len, 2) +
0720 (coll->n_rules * 2) > data + size)
0721 return false;
0722
0723
0724 if (coll->len < offsetofend(struct fwdb_collection, dfs_region))
0725 return false;
0726
0727 rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
0728
0729 for (i = 0; i < coll->n_rules; i++) {
0730 u16 rule_ptr = be16_to_cpu(rules_ptr[i]);
0731
0732 if (!valid_rule(data, size, rule_ptr))
0733 return false;
0734 }
0735
0736 return true;
0737 }
0738
0739 #ifdef CONFIG_CFG80211_REQUIRE_SIGNED_REGDB
0740 static struct key *builtin_regdb_keys;
0741
0742 static void __init load_keys_from_buffer(const u8 *p, unsigned int buflen)
0743 {
0744 const u8 *end = p + buflen;
0745 size_t plen;
0746 key_ref_t key;
0747
0748 while (p < end) {
0749
0750
0751
0752 if (end - p < 4)
0753 goto dodgy_cert;
0754 if (p[0] != 0x30 &&
0755 p[1] != 0x82)
0756 goto dodgy_cert;
0757 plen = (p[2] << 8) | p[3];
0758 plen += 4;
0759 if (plen > end - p)
0760 goto dodgy_cert;
0761
0762 key = key_create_or_update(make_key_ref(builtin_regdb_keys, 1),
0763 "asymmetric", NULL, p, plen,
0764 ((KEY_POS_ALL & ~KEY_POS_SETATTR) |
0765 KEY_USR_VIEW | KEY_USR_READ),
0766 KEY_ALLOC_NOT_IN_QUOTA |
0767 KEY_ALLOC_BUILT_IN |
0768 KEY_ALLOC_BYPASS_RESTRICTION);
0769 if (IS_ERR(key)) {
0770 pr_err("Problem loading in-kernel X.509 certificate (%ld)\n",
0771 PTR_ERR(key));
0772 } else {
0773 pr_notice("Loaded X.509 cert '%s'\n",
0774 key_ref_to_ptr(key)->description);
0775 key_ref_put(key);
0776 }
0777 p += plen;
0778 }
0779
0780 return;
0781
0782 dodgy_cert:
0783 pr_err("Problem parsing in-kernel X.509 certificate list\n");
0784 }
0785
0786 static int __init load_builtin_regdb_keys(void)
0787 {
0788 builtin_regdb_keys =
0789 keyring_alloc(".builtin_regdb_keys",
0790 KUIDT_INIT(0), KGIDT_INIT(0), current_cred(),
0791 ((KEY_POS_ALL & ~KEY_POS_SETATTR) |
0792 KEY_USR_VIEW | KEY_USR_READ | KEY_USR_SEARCH),
0793 KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
0794 if (IS_ERR(builtin_regdb_keys))
0795 return PTR_ERR(builtin_regdb_keys);
0796
0797 pr_notice("Loading compiled-in X.509 certificates for regulatory database\n");
0798
0799 #ifdef CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS
0800 load_keys_from_buffer(shipped_regdb_certs, shipped_regdb_certs_len);
0801 #endif
0802 #ifdef CONFIG_CFG80211_EXTRA_REGDB_KEYDIR
0803 if (CONFIG_CFG80211_EXTRA_REGDB_KEYDIR[0] != '\0')
0804 load_keys_from_buffer(extra_regdb_certs, extra_regdb_certs_len);
0805 #endif
0806
0807 return 0;
0808 }
0809
0810 MODULE_FIRMWARE("regulatory.db.p7s");
0811
0812 static bool regdb_has_valid_signature(const u8 *data, unsigned int size)
0813 {
0814 const struct firmware *sig;
0815 bool result;
0816
0817 if (request_firmware(&sig, "regulatory.db.p7s", ®_pdev->dev))
0818 return false;
0819
0820 result = verify_pkcs7_signature(data, size, sig->data, sig->size,
0821 builtin_regdb_keys,
0822 VERIFYING_UNSPECIFIED_SIGNATURE,
0823 NULL, NULL) == 0;
0824
0825 release_firmware(sig);
0826
0827 return result;
0828 }
0829
0830 static void free_regdb_keyring(void)
0831 {
0832 key_put(builtin_regdb_keys);
0833 }
0834 #else
0835 static int load_builtin_regdb_keys(void)
0836 {
0837 return 0;
0838 }
0839
0840 static bool regdb_has_valid_signature(const u8 *data, unsigned int size)
0841 {
0842 return true;
0843 }
0844
0845 static void free_regdb_keyring(void)
0846 {
0847 }
0848 #endif
0849
0850 static bool valid_regdb(const u8 *data, unsigned int size)
0851 {
0852 const struct fwdb_header *hdr = (void *)data;
0853 const struct fwdb_country *country;
0854
0855 if (size < sizeof(*hdr))
0856 return false;
0857
0858 if (hdr->magic != cpu_to_be32(FWDB_MAGIC))
0859 return false;
0860
0861 if (hdr->version != cpu_to_be32(FWDB_VERSION))
0862 return false;
0863
0864 if (!regdb_has_valid_signature(data, size))
0865 return false;
0866
0867 country = &hdr->country[0];
0868 while ((u8 *)(country + 1) <= data + size) {
0869 if (!country->coll_ptr)
0870 break;
0871 if (!valid_country(data, size, country))
0872 return false;
0873 country++;
0874 }
0875
0876 return true;
0877 }
0878
0879 static void set_wmm_rule(const struct fwdb_header *db,
0880 const struct fwdb_country *country,
0881 const struct fwdb_rule *rule,
0882 struct ieee80211_reg_rule *rrule)
0883 {
0884 struct ieee80211_wmm_rule *wmm_rule = &rrule->wmm_rule;
0885 struct fwdb_wmm_rule *wmm;
0886 unsigned int i, wmm_ptr;
0887
0888 wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2;
0889 wmm = (void *)((u8 *)db + wmm_ptr);
0890
0891 if (!valid_wmm(wmm)) {
0892 pr_err("Invalid regulatory WMM rule %u-%u in domain %c%c\n",
0893 be32_to_cpu(rule->start), be32_to_cpu(rule->end),
0894 country->alpha2[0], country->alpha2[1]);
0895 return;
0896 }
0897
0898 for (i = 0; i < IEEE80211_NUM_ACS; i++) {
0899 wmm_rule->client[i].cw_min =
0900 ecw2cw((wmm->client[i].ecw & 0xf0) >> 4);
0901 wmm_rule->client[i].cw_max = ecw2cw(wmm->client[i].ecw & 0x0f);
0902 wmm_rule->client[i].aifsn = wmm->client[i].aifsn;
0903 wmm_rule->client[i].cot =
0904 1000 * be16_to_cpu(wmm->client[i].cot);
0905 wmm_rule->ap[i].cw_min = ecw2cw((wmm->ap[i].ecw & 0xf0) >> 4);
0906 wmm_rule->ap[i].cw_max = ecw2cw(wmm->ap[i].ecw & 0x0f);
0907 wmm_rule->ap[i].aifsn = wmm->ap[i].aifsn;
0908 wmm_rule->ap[i].cot = 1000 * be16_to_cpu(wmm->ap[i].cot);
0909 }
0910
0911 rrule->has_wmm = true;
0912 }
0913
0914 static int __regdb_query_wmm(const struct fwdb_header *db,
0915 const struct fwdb_country *country, int freq,
0916 struct ieee80211_reg_rule *rrule)
0917 {
0918 unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
0919 struct fwdb_collection *coll = (void *)((u8 *)db + ptr);
0920 int i;
0921
0922 for (i = 0; i < coll->n_rules; i++) {
0923 __be16 *rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
0924 unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2;
0925 struct fwdb_rule *rule = (void *)((u8 *)db + rule_ptr);
0926
0927 if (rule->len < offsetofend(struct fwdb_rule, wmm_ptr))
0928 continue;
0929
0930 if (freq >= KHZ_TO_MHZ(be32_to_cpu(rule->start)) &&
0931 freq <= KHZ_TO_MHZ(be32_to_cpu(rule->end))) {
0932 set_wmm_rule(db, country, rule, rrule);
0933 return 0;
0934 }
0935 }
0936
0937 return -ENODATA;
0938 }
0939
0940 int reg_query_regdb_wmm(char *alpha2, int freq, struct ieee80211_reg_rule *rule)
0941 {
0942 const struct fwdb_header *hdr = regdb;
0943 const struct fwdb_country *country;
0944
0945 if (!regdb)
0946 return -ENODATA;
0947
0948 if (IS_ERR(regdb))
0949 return PTR_ERR(regdb);
0950
0951 country = &hdr->country[0];
0952 while (country->coll_ptr) {
0953 if (alpha2_equal(alpha2, country->alpha2))
0954 return __regdb_query_wmm(regdb, country, freq, rule);
0955
0956 country++;
0957 }
0958
0959 return -ENODATA;
0960 }
0961 EXPORT_SYMBOL(reg_query_regdb_wmm);
0962
0963 static int regdb_query_country(const struct fwdb_header *db,
0964 const struct fwdb_country *country)
0965 {
0966 unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
0967 struct fwdb_collection *coll = (void *)((u8 *)db + ptr);
0968 struct ieee80211_regdomain *regdom;
0969 unsigned int i;
0970
0971 regdom = kzalloc(struct_size(regdom, reg_rules, coll->n_rules),
0972 GFP_KERNEL);
0973 if (!regdom)
0974 return -ENOMEM;
0975
0976 regdom->n_reg_rules = coll->n_rules;
0977 regdom->alpha2[0] = country->alpha2[0];
0978 regdom->alpha2[1] = country->alpha2[1];
0979 regdom->dfs_region = coll->dfs_region;
0980
0981 for (i = 0; i < regdom->n_reg_rules; i++) {
0982 __be16 *rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
0983 unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2;
0984 struct fwdb_rule *rule = (void *)((u8 *)db + rule_ptr);
0985 struct ieee80211_reg_rule *rrule = ®dom->reg_rules[i];
0986
0987 rrule->freq_range.start_freq_khz = be32_to_cpu(rule->start);
0988 rrule->freq_range.end_freq_khz = be32_to_cpu(rule->end);
0989 rrule->freq_range.max_bandwidth_khz = be32_to_cpu(rule->max_bw);
0990
0991 rrule->power_rule.max_antenna_gain = 0;
0992 rrule->power_rule.max_eirp = be16_to_cpu(rule->max_eirp);
0993
0994 rrule->flags = 0;
0995 if (rule->flags & FWDB_FLAG_NO_OFDM)
0996 rrule->flags |= NL80211_RRF_NO_OFDM;
0997 if (rule->flags & FWDB_FLAG_NO_OUTDOOR)
0998 rrule->flags |= NL80211_RRF_NO_OUTDOOR;
0999 if (rule->flags & FWDB_FLAG_DFS)
1000 rrule->flags |= NL80211_RRF_DFS;
1001 if (rule->flags & FWDB_FLAG_NO_IR)
1002 rrule->flags |= NL80211_RRF_NO_IR;
1003 if (rule->flags & FWDB_FLAG_AUTO_BW)
1004 rrule->flags |= NL80211_RRF_AUTO_BW;
1005
1006 rrule->dfs_cac_ms = 0;
1007
1008
1009 if (rule->len >= offsetofend(struct fwdb_rule, cac_timeout))
1010 rrule->dfs_cac_ms =
1011 1000 * be16_to_cpu(rule->cac_timeout);
1012 if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr))
1013 set_wmm_rule(db, country, rule, rrule);
1014 }
1015
1016 return reg_schedule_apply(regdom);
1017 }
1018
1019 static int query_regdb(const char *alpha2)
1020 {
1021 const struct fwdb_header *hdr = regdb;
1022 const struct fwdb_country *country;
1023
1024 ASSERT_RTNL();
1025
1026 if (IS_ERR(regdb))
1027 return PTR_ERR(regdb);
1028
1029 country = &hdr->country[0];
1030 while (country->coll_ptr) {
1031 if (alpha2_equal(alpha2, country->alpha2))
1032 return regdb_query_country(regdb, country);
1033 country++;
1034 }
1035
1036 return -ENODATA;
1037 }
1038
1039 static void regdb_fw_cb(const struct firmware *fw, void *context)
1040 {
1041 int set_error = 0;
1042 bool restore = true;
1043 void *db;
1044
1045 if (!fw) {
1046 pr_info("failed to load regulatory.db\n");
1047 set_error = -ENODATA;
1048 } else if (!valid_regdb(fw->data, fw->size)) {
1049 pr_info("loaded regulatory.db is malformed or signature is missing/invalid\n");
1050 set_error = -EINVAL;
1051 }
1052
1053 rtnl_lock();
1054 if (regdb && !IS_ERR(regdb)) {
1055
1056
1057
1058
1059
1060
1061 } else if (set_error) {
1062 regdb = ERR_PTR(set_error);
1063 } else if (fw) {
1064 db = kmemdup(fw->data, fw->size, GFP_KERNEL);
1065 if (db) {
1066 regdb = db;
1067 restore = context && query_regdb(context);
1068 } else {
1069 restore = true;
1070 }
1071 }
1072
1073 if (restore)
1074 restore_regulatory_settings(true, false);
1075
1076 rtnl_unlock();
1077
1078 kfree(context);
1079
1080 release_firmware(fw);
1081 }
1082
1083 MODULE_FIRMWARE("regulatory.db");
1084
1085 static int query_regdb_file(const char *alpha2)
1086 {
1087 ASSERT_RTNL();
1088
1089 if (regdb)
1090 return query_regdb(alpha2);
1091
1092 alpha2 = kmemdup(alpha2, 2, GFP_KERNEL);
1093 if (!alpha2)
1094 return -ENOMEM;
1095
1096 return request_firmware_nowait(THIS_MODULE, true, "regulatory.db",
1097 ®_pdev->dev, GFP_KERNEL,
1098 (void *)alpha2, regdb_fw_cb);
1099 }
1100
1101 int reg_reload_regdb(void)
1102 {
1103 const struct firmware *fw;
1104 void *db;
1105 int err;
1106 const struct ieee80211_regdomain *current_regdomain;
1107 struct regulatory_request *request;
1108
1109 err = request_firmware(&fw, "regulatory.db", ®_pdev->dev);
1110 if (err)
1111 return err;
1112
1113 if (!valid_regdb(fw->data, fw->size)) {
1114 err = -ENODATA;
1115 goto out;
1116 }
1117
1118 db = kmemdup(fw->data, fw->size, GFP_KERNEL);
1119 if (!db) {
1120 err = -ENOMEM;
1121 goto out;
1122 }
1123
1124 rtnl_lock();
1125 if (!IS_ERR_OR_NULL(regdb))
1126 kfree(regdb);
1127 regdb = db;
1128
1129
1130 current_regdomain = get_cfg80211_regdom();
1131
1132 request = kzalloc(sizeof(*request), GFP_KERNEL);
1133 if (!request) {
1134 err = -ENOMEM;
1135 goto out_unlock;
1136 }
1137
1138 request->wiphy_idx = WIPHY_IDX_INVALID;
1139 request->alpha2[0] = current_regdomain->alpha2[0];
1140 request->alpha2[1] = current_regdomain->alpha2[1];
1141 request->initiator = NL80211_REGDOM_SET_BY_CORE;
1142 request->user_reg_hint_type = NL80211_USER_REG_HINT_USER;
1143
1144 reg_process_hint(request);
1145
1146 out_unlock:
1147 rtnl_unlock();
1148 out:
1149 release_firmware(fw);
1150 return err;
1151 }
1152
1153 static bool reg_query_database(struct regulatory_request *request)
1154 {
1155 if (query_regdb_file(request->alpha2) == 0)
1156 return true;
1157
1158 if (call_crda(request->alpha2) == 0)
1159 return true;
1160
1161 return false;
1162 }
1163
1164 bool reg_is_valid_request(const char *alpha2)
1165 {
1166 struct regulatory_request *lr = get_last_request();
1167
1168 if (!lr || lr->processed)
1169 return false;
1170
1171 return alpha2_equal(lr->alpha2, alpha2);
1172 }
1173
1174 static const struct ieee80211_regdomain *reg_get_regdomain(struct wiphy *wiphy)
1175 {
1176 struct regulatory_request *lr = get_last_request();
1177
1178
1179
1180
1181
1182 if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1183 lr->initiator != NL80211_REGDOM_SET_BY_USER &&
1184 wiphy->regd)
1185 return get_wiphy_regdom(wiphy);
1186
1187 return get_cfg80211_regdom();
1188 }
1189
1190 static unsigned int
1191 reg_get_max_bandwidth_from_range(const struct ieee80211_regdomain *rd,
1192 const struct ieee80211_reg_rule *rule)
1193 {
1194 const struct ieee80211_freq_range *freq_range = &rule->freq_range;
1195 const struct ieee80211_freq_range *freq_range_tmp;
1196 const struct ieee80211_reg_rule *tmp;
1197 u32 start_freq, end_freq, idx, no;
1198
1199 for (idx = 0; idx < rd->n_reg_rules; idx++)
1200 if (rule == &rd->reg_rules[idx])
1201 break;
1202
1203 if (idx == rd->n_reg_rules)
1204 return 0;
1205
1206
1207 no = idx;
1208
1209 while (no) {
1210 tmp = &rd->reg_rules[--no];
1211 freq_range_tmp = &tmp->freq_range;
1212
1213 if (freq_range_tmp->end_freq_khz < freq_range->start_freq_khz)
1214 break;
1215
1216 freq_range = freq_range_tmp;
1217 }
1218
1219 start_freq = freq_range->start_freq_khz;
1220
1221
1222 freq_range = &rule->freq_range;
1223 no = idx;
1224
1225 while (no < rd->n_reg_rules - 1) {
1226 tmp = &rd->reg_rules[++no];
1227 freq_range_tmp = &tmp->freq_range;
1228
1229 if (freq_range_tmp->start_freq_khz > freq_range->end_freq_khz)
1230 break;
1231
1232 freq_range = freq_range_tmp;
1233 }
1234
1235 end_freq = freq_range->end_freq_khz;
1236
1237 return end_freq - start_freq;
1238 }
1239
1240 unsigned int reg_get_max_bandwidth(const struct ieee80211_regdomain *rd,
1241 const struct ieee80211_reg_rule *rule)
1242 {
1243 unsigned int bw = reg_get_max_bandwidth_from_range(rd, rule);
1244
1245 if (rule->flags & NL80211_RRF_NO_320MHZ)
1246 bw = min_t(unsigned int, bw, MHZ_TO_KHZ(160));
1247 if (rule->flags & NL80211_RRF_NO_160MHZ)
1248 bw = min_t(unsigned int, bw, MHZ_TO_KHZ(80));
1249 if (rule->flags & NL80211_RRF_NO_80MHZ)
1250 bw = min_t(unsigned int, bw, MHZ_TO_KHZ(40));
1251
1252
1253
1254
1255
1256 if (rule->flags & NL80211_RRF_NO_HT40MINUS &&
1257 rule->flags & NL80211_RRF_NO_HT40PLUS)
1258 bw = min_t(unsigned int, bw, MHZ_TO_KHZ(20));
1259
1260 return bw;
1261 }
1262
1263
1264 static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)
1265 {
1266 const struct ieee80211_freq_range *freq_range = &rule->freq_range;
1267 u32 freq_diff;
1268
1269 if (freq_range->start_freq_khz <= 0 || freq_range->end_freq_khz <= 0)
1270 return false;
1271
1272 if (freq_range->start_freq_khz > freq_range->end_freq_khz)
1273 return false;
1274
1275 freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
1276
1277 if (freq_range->end_freq_khz <= freq_range->start_freq_khz ||
1278 freq_range->max_bandwidth_khz > freq_diff)
1279 return false;
1280
1281 return true;
1282 }
1283
1284 static bool is_valid_rd(const struct ieee80211_regdomain *rd)
1285 {
1286 const struct ieee80211_reg_rule *reg_rule = NULL;
1287 unsigned int i;
1288
1289 if (!rd->n_reg_rules)
1290 return false;
1291
1292 if (WARN_ON(rd->n_reg_rules > NL80211_MAX_SUPP_REG_RULES))
1293 return false;
1294
1295 for (i = 0; i < rd->n_reg_rules; i++) {
1296 reg_rule = &rd->reg_rules[i];
1297 if (!is_valid_reg_rule(reg_rule))
1298 return false;
1299 }
1300
1301 return true;
1302 }
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319 static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
1320 u32 freq_khz)
1321 {
1322 #define ONE_GHZ_IN_KHZ 1000000
1323
1324
1325
1326
1327
1328 u32 limit = freq_khz > 45 * ONE_GHZ_IN_KHZ ?
1329 20 * ONE_GHZ_IN_KHZ : 2 * ONE_GHZ_IN_KHZ;
1330 if (abs(freq_khz - freq_range->start_freq_khz) <= limit)
1331 return true;
1332 if (abs(freq_khz - freq_range->end_freq_khz) <= limit)
1333 return true;
1334 return false;
1335 #undef ONE_GHZ_IN_KHZ
1336 }
1337
1338
1339
1340
1341
1342
1343 static enum nl80211_dfs_regions
1344 reg_intersect_dfs_region(const enum nl80211_dfs_regions dfs_region1,
1345 const enum nl80211_dfs_regions dfs_region2)
1346 {
1347 if (dfs_region1 != dfs_region2)
1348 return NL80211_DFS_UNSET;
1349 return dfs_region1;
1350 }
1351
1352 static void reg_wmm_rules_intersect(const struct ieee80211_wmm_ac *wmm_ac1,
1353 const struct ieee80211_wmm_ac *wmm_ac2,
1354 struct ieee80211_wmm_ac *intersect)
1355 {
1356 intersect->cw_min = max_t(u16, wmm_ac1->cw_min, wmm_ac2->cw_min);
1357 intersect->cw_max = max_t(u16, wmm_ac1->cw_max, wmm_ac2->cw_max);
1358 intersect->cot = min_t(u16, wmm_ac1->cot, wmm_ac2->cot);
1359 intersect->aifsn = max_t(u8, wmm_ac1->aifsn, wmm_ac2->aifsn);
1360 }
1361
1362
1363
1364
1365
1366 static int reg_rules_intersect(const struct ieee80211_regdomain *rd1,
1367 const struct ieee80211_regdomain *rd2,
1368 const struct ieee80211_reg_rule *rule1,
1369 const struct ieee80211_reg_rule *rule2,
1370 struct ieee80211_reg_rule *intersected_rule)
1371 {
1372 const struct ieee80211_freq_range *freq_range1, *freq_range2;
1373 struct ieee80211_freq_range *freq_range;
1374 const struct ieee80211_power_rule *power_rule1, *power_rule2;
1375 struct ieee80211_power_rule *power_rule;
1376 const struct ieee80211_wmm_rule *wmm_rule1, *wmm_rule2;
1377 struct ieee80211_wmm_rule *wmm_rule;
1378 u32 freq_diff, max_bandwidth1, max_bandwidth2;
1379
1380 freq_range1 = &rule1->freq_range;
1381 freq_range2 = &rule2->freq_range;
1382 freq_range = &intersected_rule->freq_range;
1383
1384 power_rule1 = &rule1->power_rule;
1385 power_rule2 = &rule2->power_rule;
1386 power_rule = &intersected_rule->power_rule;
1387
1388 wmm_rule1 = &rule1->wmm_rule;
1389 wmm_rule2 = &rule2->wmm_rule;
1390 wmm_rule = &intersected_rule->wmm_rule;
1391
1392 freq_range->start_freq_khz = max(freq_range1->start_freq_khz,
1393 freq_range2->start_freq_khz);
1394 freq_range->end_freq_khz = min(freq_range1->end_freq_khz,
1395 freq_range2->end_freq_khz);
1396
1397 max_bandwidth1 = freq_range1->max_bandwidth_khz;
1398 max_bandwidth2 = freq_range2->max_bandwidth_khz;
1399
1400 if (rule1->flags & NL80211_RRF_AUTO_BW)
1401 max_bandwidth1 = reg_get_max_bandwidth(rd1, rule1);
1402 if (rule2->flags & NL80211_RRF_AUTO_BW)
1403 max_bandwidth2 = reg_get_max_bandwidth(rd2, rule2);
1404
1405 freq_range->max_bandwidth_khz = min(max_bandwidth1, max_bandwidth2);
1406
1407 intersected_rule->flags = rule1->flags | rule2->flags;
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417 if ((rule1->flags & NL80211_RRF_AUTO_BW) &&
1418 (rule2->flags & NL80211_RRF_AUTO_BW))
1419 intersected_rule->flags |= NL80211_RRF_AUTO_BW;
1420 else
1421 intersected_rule->flags &= ~NL80211_RRF_AUTO_BW;
1422
1423 freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
1424 if (freq_range->max_bandwidth_khz > freq_diff)
1425 freq_range->max_bandwidth_khz = freq_diff;
1426
1427 power_rule->max_eirp = min(power_rule1->max_eirp,
1428 power_rule2->max_eirp);
1429 power_rule->max_antenna_gain = min(power_rule1->max_antenna_gain,
1430 power_rule2->max_antenna_gain);
1431
1432 intersected_rule->dfs_cac_ms = max(rule1->dfs_cac_ms,
1433 rule2->dfs_cac_ms);
1434
1435 if (rule1->has_wmm && rule2->has_wmm) {
1436 u8 ac;
1437
1438 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1439 reg_wmm_rules_intersect(&wmm_rule1->client[ac],
1440 &wmm_rule2->client[ac],
1441 &wmm_rule->client[ac]);
1442 reg_wmm_rules_intersect(&wmm_rule1->ap[ac],
1443 &wmm_rule2->ap[ac],
1444 &wmm_rule->ap[ac]);
1445 }
1446
1447 intersected_rule->has_wmm = true;
1448 } else if (rule1->has_wmm) {
1449 *wmm_rule = *wmm_rule1;
1450 intersected_rule->has_wmm = true;
1451 } else if (rule2->has_wmm) {
1452 *wmm_rule = *wmm_rule2;
1453 intersected_rule->has_wmm = true;
1454 } else {
1455 intersected_rule->has_wmm = false;
1456 }
1457
1458 if (!is_valid_reg_rule(intersected_rule))
1459 return -EINVAL;
1460
1461 return 0;
1462 }
1463
1464
1465 static bool rule_contains(struct ieee80211_reg_rule *r1,
1466 struct ieee80211_reg_rule *r2)
1467 {
1468
1469 if (r1->flags != r2->flags)
1470 return false;
1471
1472
1473 if ((r1->power_rule.max_antenna_gain >
1474 r2->power_rule.max_antenna_gain) ||
1475 r1->power_rule.max_eirp > r2->power_rule.max_eirp)
1476 return false;
1477
1478
1479 if (r1->freq_range.start_freq_khz > r2->freq_range.start_freq_khz ||
1480 r1->freq_range.end_freq_khz < r2->freq_range.end_freq_khz)
1481 return false;
1482
1483
1484 if (r1->freq_range.max_bandwidth_khz <
1485 r2->freq_range.max_bandwidth_khz)
1486 return false;
1487
1488 return true;
1489 }
1490
1491
1492 static void add_rule(struct ieee80211_reg_rule *rule,
1493 struct ieee80211_reg_rule *reg_rules, u32 *n_rules)
1494 {
1495 struct ieee80211_reg_rule *tmp_rule;
1496 int i;
1497
1498 for (i = 0; i < *n_rules; i++) {
1499 tmp_rule = ®_rules[i];
1500
1501 if (rule_contains(tmp_rule, rule))
1502 return;
1503
1504
1505 if (rule_contains(rule, tmp_rule)) {
1506 memcpy(tmp_rule, rule, sizeof(*rule));
1507 return;
1508 }
1509 }
1510
1511 memcpy(®_rules[*n_rules], rule, sizeof(*rule));
1512 (*n_rules)++;
1513 }
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528 static struct ieee80211_regdomain *
1529 regdom_intersect(const struct ieee80211_regdomain *rd1,
1530 const struct ieee80211_regdomain *rd2)
1531 {
1532 int r;
1533 unsigned int x, y;
1534 unsigned int num_rules = 0;
1535 const struct ieee80211_reg_rule *rule1, *rule2;
1536 struct ieee80211_reg_rule intersected_rule;
1537 struct ieee80211_regdomain *rd;
1538
1539 if (!rd1 || !rd2)
1540 return NULL;
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550 for (x = 0; x < rd1->n_reg_rules; x++) {
1551 rule1 = &rd1->reg_rules[x];
1552 for (y = 0; y < rd2->n_reg_rules; y++) {
1553 rule2 = &rd2->reg_rules[y];
1554 if (!reg_rules_intersect(rd1, rd2, rule1, rule2,
1555 &intersected_rule))
1556 num_rules++;
1557 }
1558 }
1559
1560 if (!num_rules)
1561 return NULL;
1562
1563 rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL);
1564 if (!rd)
1565 return NULL;
1566
1567 for (x = 0; x < rd1->n_reg_rules; x++) {
1568 rule1 = &rd1->reg_rules[x];
1569 for (y = 0; y < rd2->n_reg_rules; y++) {
1570 rule2 = &rd2->reg_rules[y];
1571 r = reg_rules_intersect(rd1, rd2, rule1, rule2,
1572 &intersected_rule);
1573
1574
1575
1576
1577 if (r)
1578 continue;
1579
1580 add_rule(&intersected_rule, rd->reg_rules,
1581 &rd->n_reg_rules);
1582 }
1583 }
1584
1585 rd->alpha2[0] = '9';
1586 rd->alpha2[1] = '8';
1587 rd->dfs_region = reg_intersect_dfs_region(rd1->dfs_region,
1588 rd2->dfs_region);
1589
1590 return rd;
1591 }
1592
1593
1594
1595
1596
1597 static u32 map_regdom_flags(u32 rd_flags)
1598 {
1599 u32 channel_flags = 0;
1600 if (rd_flags & NL80211_RRF_NO_IR_ALL)
1601 channel_flags |= IEEE80211_CHAN_NO_IR;
1602 if (rd_flags & NL80211_RRF_DFS)
1603 channel_flags |= IEEE80211_CHAN_RADAR;
1604 if (rd_flags & NL80211_RRF_NO_OFDM)
1605 channel_flags |= IEEE80211_CHAN_NO_OFDM;
1606 if (rd_flags & NL80211_RRF_NO_OUTDOOR)
1607 channel_flags |= IEEE80211_CHAN_INDOOR_ONLY;
1608 if (rd_flags & NL80211_RRF_IR_CONCURRENT)
1609 channel_flags |= IEEE80211_CHAN_IR_CONCURRENT;
1610 if (rd_flags & NL80211_RRF_NO_HT40MINUS)
1611 channel_flags |= IEEE80211_CHAN_NO_HT40MINUS;
1612 if (rd_flags & NL80211_RRF_NO_HT40PLUS)
1613 channel_flags |= IEEE80211_CHAN_NO_HT40PLUS;
1614 if (rd_flags & NL80211_RRF_NO_80MHZ)
1615 channel_flags |= IEEE80211_CHAN_NO_80MHZ;
1616 if (rd_flags & NL80211_RRF_NO_160MHZ)
1617 channel_flags |= IEEE80211_CHAN_NO_160MHZ;
1618 if (rd_flags & NL80211_RRF_NO_HE)
1619 channel_flags |= IEEE80211_CHAN_NO_HE;
1620 if (rd_flags & NL80211_RRF_NO_320MHZ)
1621 channel_flags |= IEEE80211_CHAN_NO_320MHZ;
1622 return channel_flags;
1623 }
1624
1625 static const struct ieee80211_reg_rule *
1626 freq_reg_info_regd(u32 center_freq,
1627 const struct ieee80211_regdomain *regd, u32 bw)
1628 {
1629 int i;
1630 bool band_rule_found = false;
1631 bool bw_fits = false;
1632
1633 if (!regd)
1634 return ERR_PTR(-EINVAL);
1635
1636 for (i = 0; i < regd->n_reg_rules; i++) {
1637 const struct ieee80211_reg_rule *rr;
1638 const struct ieee80211_freq_range *fr = NULL;
1639
1640 rr = ®d->reg_rules[i];
1641 fr = &rr->freq_range;
1642
1643
1644
1645
1646
1647
1648 if (!band_rule_found)
1649 band_rule_found = freq_in_rule_band(fr, center_freq);
1650
1651 bw_fits = cfg80211_does_bw_fit_range(fr, center_freq, bw);
1652
1653 if (band_rule_found && bw_fits)
1654 return rr;
1655 }
1656
1657 if (!band_rule_found)
1658 return ERR_PTR(-ERANGE);
1659
1660 return ERR_PTR(-EINVAL);
1661 }
1662
1663 static const struct ieee80211_reg_rule *
1664 __freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 min_bw)
1665 {
1666 const struct ieee80211_regdomain *regd = reg_get_regdomain(wiphy);
1667 static const u32 bws[] = {0, 1, 2, 4, 5, 8, 10, 16, 20};
1668 const struct ieee80211_reg_rule *reg_rule = ERR_PTR(-ERANGE);
1669 int i = ARRAY_SIZE(bws) - 1;
1670 u32 bw;
1671
1672 for (bw = MHZ_TO_KHZ(bws[i]); bw >= min_bw; bw = MHZ_TO_KHZ(bws[i--])) {
1673 reg_rule = freq_reg_info_regd(center_freq, regd, bw);
1674 if (!IS_ERR(reg_rule))
1675 return reg_rule;
1676 }
1677
1678 return reg_rule;
1679 }
1680
1681 const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
1682 u32 center_freq)
1683 {
1684 u32 min_bw = center_freq < MHZ_TO_KHZ(1000) ? 1 : 20;
1685
1686 return __freq_reg_info(wiphy, center_freq, MHZ_TO_KHZ(min_bw));
1687 }
1688 EXPORT_SYMBOL(freq_reg_info);
1689
1690 const char *reg_initiator_name(enum nl80211_reg_initiator initiator)
1691 {
1692 switch (initiator) {
1693 case NL80211_REGDOM_SET_BY_CORE:
1694 return "core";
1695 case NL80211_REGDOM_SET_BY_USER:
1696 return "user";
1697 case NL80211_REGDOM_SET_BY_DRIVER:
1698 return "driver";
1699 case NL80211_REGDOM_SET_BY_COUNTRY_IE:
1700 return "country element";
1701 default:
1702 WARN_ON(1);
1703 return "bug";
1704 }
1705 }
1706 EXPORT_SYMBOL(reg_initiator_name);
1707
1708 static uint32_t reg_rule_to_chan_bw_flags(const struct ieee80211_regdomain *regd,
1709 const struct ieee80211_reg_rule *reg_rule,
1710 const struct ieee80211_channel *chan)
1711 {
1712 const struct ieee80211_freq_range *freq_range = NULL;
1713 u32 max_bandwidth_khz, center_freq_khz, bw_flags = 0;
1714 bool is_s1g = chan->band == NL80211_BAND_S1GHZ;
1715
1716 freq_range = ®_rule->freq_range;
1717
1718 max_bandwidth_khz = freq_range->max_bandwidth_khz;
1719 center_freq_khz = ieee80211_channel_to_khz(chan);
1720
1721 if (reg_rule->flags & NL80211_RRF_AUTO_BW)
1722 max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule);
1723
1724
1725 if (!cfg80211_does_bw_fit_range(freq_range,
1726 center_freq_khz,
1727 MHZ_TO_KHZ(10)))
1728 bw_flags |= IEEE80211_CHAN_NO_10MHZ;
1729 if (!cfg80211_does_bw_fit_range(freq_range,
1730 center_freq_khz,
1731 MHZ_TO_KHZ(20)))
1732 bw_flags |= IEEE80211_CHAN_NO_20MHZ;
1733
1734 if (is_s1g) {
1735
1736
1737
1738
1739 int edge_offset;
1740 int ch_bw = max_bandwidth_khz;
1741
1742 while (ch_bw) {
1743 edge_offset = (center_freq_khz - ch_bw / 2) -
1744 freq_range->start_freq_khz;
1745 if (edge_offset % ch_bw == 0) {
1746 switch (KHZ_TO_MHZ(ch_bw)) {
1747 case 1:
1748 bw_flags |= IEEE80211_CHAN_1MHZ;
1749 break;
1750 case 2:
1751 bw_flags |= IEEE80211_CHAN_2MHZ;
1752 break;
1753 case 4:
1754 bw_flags |= IEEE80211_CHAN_4MHZ;
1755 break;
1756 case 8:
1757 bw_flags |= IEEE80211_CHAN_8MHZ;
1758 break;
1759 case 16:
1760 bw_flags |= IEEE80211_CHAN_16MHZ;
1761 break;
1762 default:
1763
1764
1765
1766 bw_flags |= IEEE80211_CHAN_DISABLED;
1767 break;
1768 }
1769 break;
1770 }
1771 ch_bw /= 2;
1772 }
1773 } else {
1774 if (max_bandwidth_khz < MHZ_TO_KHZ(10))
1775 bw_flags |= IEEE80211_CHAN_NO_10MHZ;
1776 if (max_bandwidth_khz < MHZ_TO_KHZ(20))
1777 bw_flags |= IEEE80211_CHAN_NO_20MHZ;
1778 if (max_bandwidth_khz < MHZ_TO_KHZ(40))
1779 bw_flags |= IEEE80211_CHAN_NO_HT40;
1780 if (max_bandwidth_khz < MHZ_TO_KHZ(80))
1781 bw_flags |= IEEE80211_CHAN_NO_80MHZ;
1782 if (max_bandwidth_khz < MHZ_TO_KHZ(160))
1783 bw_flags |= IEEE80211_CHAN_NO_160MHZ;
1784 if (max_bandwidth_khz < MHZ_TO_KHZ(320))
1785 bw_flags |= IEEE80211_CHAN_NO_320MHZ;
1786 }
1787 return bw_flags;
1788 }
1789
1790 static void handle_channel_single_rule(struct wiphy *wiphy,
1791 enum nl80211_reg_initiator initiator,
1792 struct ieee80211_channel *chan,
1793 u32 flags,
1794 struct regulatory_request *lr,
1795 struct wiphy *request_wiphy,
1796 const struct ieee80211_reg_rule *reg_rule)
1797 {
1798 u32 bw_flags = 0;
1799 const struct ieee80211_power_rule *power_rule = NULL;
1800 const struct ieee80211_regdomain *regd;
1801
1802 regd = reg_get_regdomain(wiphy);
1803
1804 power_rule = ®_rule->power_rule;
1805 bw_flags = reg_rule_to_chan_bw_flags(regd, reg_rule, chan);
1806
1807 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
1808 request_wiphy && request_wiphy == wiphy &&
1809 request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
1810
1811
1812
1813
1814
1815 chan->flags = chan->orig_flags =
1816 map_regdom_flags(reg_rule->flags) | bw_flags;
1817 chan->max_antenna_gain = chan->orig_mag =
1818 (int) MBI_TO_DBI(power_rule->max_antenna_gain);
1819 chan->max_reg_power = chan->max_power = chan->orig_mpwr =
1820 (int) MBM_TO_DBM(power_rule->max_eirp);
1821
1822 if (chan->flags & IEEE80211_CHAN_RADAR) {
1823 chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
1824 if (reg_rule->dfs_cac_ms)
1825 chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
1826 }
1827
1828 return;
1829 }
1830
1831 chan->dfs_state = NL80211_DFS_USABLE;
1832 chan->dfs_state_entered = jiffies;
1833
1834 chan->beacon_found = false;
1835 chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
1836 chan->max_antenna_gain =
1837 min_t(int, chan->orig_mag,
1838 MBI_TO_DBI(power_rule->max_antenna_gain));
1839 chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp);
1840
1841 if (chan->flags & IEEE80211_CHAN_RADAR) {
1842 if (reg_rule->dfs_cac_ms)
1843 chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
1844 else
1845 chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
1846 }
1847
1848 if (chan->orig_mpwr) {
1849
1850
1851
1852
1853 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1854 wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER)
1855 chan->max_power = chan->max_reg_power;
1856 else
1857 chan->max_power = min(chan->orig_mpwr,
1858 chan->max_reg_power);
1859 } else
1860 chan->max_power = chan->max_reg_power;
1861 }
1862
1863 static void handle_channel_adjacent_rules(struct wiphy *wiphy,
1864 enum nl80211_reg_initiator initiator,
1865 struct ieee80211_channel *chan,
1866 u32 flags,
1867 struct regulatory_request *lr,
1868 struct wiphy *request_wiphy,
1869 const struct ieee80211_reg_rule *rrule1,
1870 const struct ieee80211_reg_rule *rrule2,
1871 struct ieee80211_freq_range *comb_range)
1872 {
1873 u32 bw_flags1 = 0;
1874 u32 bw_flags2 = 0;
1875 const struct ieee80211_power_rule *power_rule1 = NULL;
1876 const struct ieee80211_power_rule *power_rule2 = NULL;
1877 const struct ieee80211_regdomain *regd;
1878
1879 regd = reg_get_regdomain(wiphy);
1880
1881 power_rule1 = &rrule1->power_rule;
1882 power_rule2 = &rrule2->power_rule;
1883 bw_flags1 = reg_rule_to_chan_bw_flags(regd, rrule1, chan);
1884 bw_flags2 = reg_rule_to_chan_bw_flags(regd, rrule2, chan);
1885
1886 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
1887 request_wiphy && request_wiphy == wiphy &&
1888 request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
1889
1890
1891
1892
1893 chan->flags =
1894 map_regdom_flags(rrule1->flags) |
1895 map_regdom_flags(rrule2->flags) |
1896 bw_flags1 |
1897 bw_flags2;
1898 chan->orig_flags = chan->flags;
1899 chan->max_antenna_gain =
1900 min_t(int, MBI_TO_DBI(power_rule1->max_antenna_gain),
1901 MBI_TO_DBI(power_rule2->max_antenna_gain));
1902 chan->orig_mag = chan->max_antenna_gain;
1903 chan->max_reg_power =
1904 min_t(int, MBM_TO_DBM(power_rule1->max_eirp),
1905 MBM_TO_DBM(power_rule2->max_eirp));
1906 chan->max_power = chan->max_reg_power;
1907 chan->orig_mpwr = chan->max_reg_power;
1908
1909 if (chan->flags & IEEE80211_CHAN_RADAR) {
1910 chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
1911 if (rrule1->dfs_cac_ms || rrule2->dfs_cac_ms)
1912 chan->dfs_cac_ms = max_t(unsigned int,
1913 rrule1->dfs_cac_ms,
1914 rrule2->dfs_cac_ms);
1915 }
1916
1917 return;
1918 }
1919
1920 chan->dfs_state = NL80211_DFS_USABLE;
1921 chan->dfs_state_entered = jiffies;
1922
1923 chan->beacon_found = false;
1924 chan->flags = flags | bw_flags1 | bw_flags2 |
1925 map_regdom_flags(rrule1->flags) |
1926 map_regdom_flags(rrule2->flags);
1927
1928
1929
1930
1931 if (cfg80211_does_bw_fit_range(comb_range,
1932 ieee80211_channel_to_khz(chan),
1933 MHZ_TO_KHZ(10)))
1934 chan->flags &= ~IEEE80211_CHAN_NO_10MHZ;
1935 if (cfg80211_does_bw_fit_range(comb_range,
1936 ieee80211_channel_to_khz(chan),
1937 MHZ_TO_KHZ(20)))
1938 chan->flags &= ~IEEE80211_CHAN_NO_20MHZ;
1939
1940 chan->max_antenna_gain =
1941 min_t(int, chan->orig_mag,
1942 min_t(int,
1943 MBI_TO_DBI(power_rule1->max_antenna_gain),
1944 MBI_TO_DBI(power_rule2->max_antenna_gain)));
1945 chan->max_reg_power = min_t(int,
1946 MBM_TO_DBM(power_rule1->max_eirp),
1947 MBM_TO_DBM(power_rule2->max_eirp));
1948
1949 if (chan->flags & IEEE80211_CHAN_RADAR) {
1950 if (rrule1->dfs_cac_ms || rrule2->dfs_cac_ms)
1951 chan->dfs_cac_ms = max_t(unsigned int,
1952 rrule1->dfs_cac_ms,
1953 rrule2->dfs_cac_ms);
1954 else
1955 chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
1956 }
1957
1958 if (chan->orig_mpwr) {
1959
1960
1961
1962 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1963 wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER)
1964 chan->max_power = chan->max_reg_power;
1965 else
1966 chan->max_power = min(chan->orig_mpwr,
1967 chan->max_reg_power);
1968 } else {
1969 chan->max_power = chan->max_reg_power;
1970 }
1971 }
1972
1973
1974
1975
1976
1977 static void handle_channel(struct wiphy *wiphy,
1978 enum nl80211_reg_initiator initiator,
1979 struct ieee80211_channel *chan)
1980 {
1981 const u32 orig_chan_freq = ieee80211_channel_to_khz(chan);
1982 struct regulatory_request *lr = get_last_request();
1983 struct wiphy *request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
1984 const struct ieee80211_reg_rule *rrule = NULL;
1985 const struct ieee80211_reg_rule *rrule1 = NULL;
1986 const struct ieee80211_reg_rule *rrule2 = NULL;
1987
1988 u32 flags = chan->orig_flags;
1989
1990 rrule = freq_reg_info(wiphy, orig_chan_freq);
1991 if (IS_ERR(rrule)) {
1992
1993
1994
1995
1996 rrule1 = freq_reg_info(wiphy,
1997 orig_chan_freq - MHZ_TO_KHZ(20));
1998 rrule2 = freq_reg_info(wiphy,
1999 orig_chan_freq + MHZ_TO_KHZ(20));
2000 if (!IS_ERR(rrule1) && !IS_ERR(rrule2)) {
2001 struct ieee80211_freq_range comb_range;
2002
2003 if (rrule1->freq_range.end_freq_khz !=
2004 rrule2->freq_range.start_freq_khz)
2005 goto disable_chan;
2006
2007 comb_range.start_freq_khz =
2008 rrule1->freq_range.start_freq_khz;
2009 comb_range.end_freq_khz =
2010 rrule2->freq_range.end_freq_khz;
2011 comb_range.max_bandwidth_khz =
2012 min_t(u32,
2013 rrule1->freq_range.max_bandwidth_khz,
2014 rrule2->freq_range.max_bandwidth_khz);
2015
2016 if (!cfg80211_does_bw_fit_range(&comb_range,
2017 orig_chan_freq,
2018 MHZ_TO_KHZ(20)))
2019 goto disable_chan;
2020
2021 handle_channel_adjacent_rules(wiphy, initiator, chan,
2022 flags, lr, request_wiphy,
2023 rrule1, rrule2,
2024 &comb_range);
2025 return;
2026 }
2027
2028 disable_chan:
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
2039 PTR_ERR(rrule) == -ERANGE)
2040 return;
2041
2042 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
2043 request_wiphy && request_wiphy == wiphy &&
2044 request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
2045 pr_debug("Disabling freq %d.%03d MHz for good\n",
2046 chan->center_freq, chan->freq_offset);
2047 chan->orig_flags |= IEEE80211_CHAN_DISABLED;
2048 chan->flags = chan->orig_flags;
2049 } else {
2050 pr_debug("Disabling freq %d.%03d MHz\n",
2051 chan->center_freq, chan->freq_offset);
2052 chan->flags |= IEEE80211_CHAN_DISABLED;
2053 }
2054 return;
2055 }
2056
2057 handle_channel_single_rule(wiphy, initiator, chan, flags, lr,
2058 request_wiphy, rrule);
2059 }
2060
2061 static void handle_band(struct wiphy *wiphy,
2062 enum nl80211_reg_initiator initiator,
2063 struct ieee80211_supported_band *sband)
2064 {
2065 unsigned int i;
2066
2067 if (!sband)
2068 return;
2069
2070 for (i = 0; i < sband->n_channels; i++)
2071 handle_channel(wiphy, initiator, &sband->channels[i]);
2072 }
2073
2074 static bool reg_request_cell_base(struct regulatory_request *request)
2075 {
2076 if (request->initiator != NL80211_REGDOM_SET_BY_USER)
2077 return false;
2078 return request->user_reg_hint_type == NL80211_USER_REG_HINT_CELL_BASE;
2079 }
2080
2081 bool reg_last_request_cell_base(void)
2082 {
2083 return reg_request_cell_base(get_last_request());
2084 }
2085
2086 #ifdef CONFIG_CFG80211_REG_CELLULAR_HINTS
2087
2088 static enum reg_request_treatment
2089 reg_ignore_cell_hint(struct regulatory_request *pending_request)
2090 {
2091 struct regulatory_request *lr = get_last_request();
2092
2093 if (!reg_num_devs_support_basehint)
2094 return REG_REQ_IGNORE;
2095
2096 if (reg_request_cell_base(lr) &&
2097 !regdom_changes(pending_request->alpha2))
2098 return REG_REQ_ALREADY_SET;
2099
2100 return REG_REQ_OK;
2101 }
2102
2103
2104 static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
2105 {
2106 return !(wiphy->features & NL80211_FEATURE_CELL_BASE_REG_HINTS);
2107 }
2108 #else
2109 static enum reg_request_treatment
2110 reg_ignore_cell_hint(struct regulatory_request *pending_request)
2111 {
2112 return REG_REQ_IGNORE;
2113 }
2114
2115 static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
2116 {
2117 return true;
2118 }
2119 #endif
2120
2121 static bool wiphy_strict_alpha2_regd(struct wiphy *wiphy)
2122 {
2123 if (wiphy->regulatory_flags & REGULATORY_STRICT_REG &&
2124 !(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG))
2125 return true;
2126 return false;
2127 }
2128
2129 static bool ignore_reg_update(struct wiphy *wiphy,
2130 enum nl80211_reg_initiator initiator)
2131 {
2132 struct regulatory_request *lr = get_last_request();
2133
2134 if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
2135 return true;
2136
2137 if (!lr) {
2138 pr_debug("Ignoring regulatory request set by %s since last_request is not set\n",
2139 reg_initiator_name(initiator));
2140 return true;
2141 }
2142
2143 if (initiator == NL80211_REGDOM_SET_BY_CORE &&
2144 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
2145 pr_debug("Ignoring regulatory request set by %s since the driver uses its own custom regulatory domain\n",
2146 reg_initiator_name(initiator));
2147 return true;
2148 }
2149
2150
2151
2152
2153
2154 if (wiphy_strict_alpha2_regd(wiphy) && !wiphy->regd &&
2155 initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
2156 !is_world_regdom(lr->alpha2)) {
2157 pr_debug("Ignoring regulatory request set by %s since the driver requires its own regulatory domain to be set first\n",
2158 reg_initiator_name(initiator));
2159 return true;
2160 }
2161
2162 if (reg_request_cell_base(lr))
2163 return reg_dev_ignore_cell_hint(wiphy);
2164
2165 return false;
2166 }
2167
2168 static bool reg_is_world_roaming(struct wiphy *wiphy)
2169 {
2170 const struct ieee80211_regdomain *cr = get_cfg80211_regdom();
2171 const struct ieee80211_regdomain *wr = get_wiphy_regdom(wiphy);
2172 struct regulatory_request *lr = get_last_request();
2173
2174 if (is_world_regdom(cr->alpha2) || (wr && is_world_regdom(wr->alpha2)))
2175 return true;
2176
2177 if (lr && lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
2178 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
2179 return true;
2180
2181 return false;
2182 }
2183
2184 static void handle_reg_beacon(struct wiphy *wiphy, unsigned int chan_idx,
2185 struct reg_beacon *reg_beacon)
2186 {
2187 struct ieee80211_supported_band *sband;
2188 struct ieee80211_channel *chan;
2189 bool channel_changed = false;
2190 struct ieee80211_channel chan_before;
2191
2192 sband = wiphy->bands[reg_beacon->chan.band];
2193 chan = &sband->channels[chan_idx];
2194
2195 if (likely(!ieee80211_channel_equal(chan, ®_beacon->chan)))
2196 return;
2197
2198 if (chan->beacon_found)
2199 return;
2200
2201 chan->beacon_found = true;
2202
2203 if (!reg_is_world_roaming(wiphy))
2204 return;
2205
2206 if (wiphy->regulatory_flags & REGULATORY_DISABLE_BEACON_HINTS)
2207 return;
2208
2209 chan_before = *chan;
2210
2211 if (chan->flags & IEEE80211_CHAN_NO_IR) {
2212 chan->flags &= ~IEEE80211_CHAN_NO_IR;
2213 channel_changed = true;
2214 }
2215
2216 if (channel_changed)
2217 nl80211_send_beacon_hint_event(wiphy, &chan_before, chan);
2218 }
2219
2220
2221
2222
2223
2224 static void wiphy_update_new_beacon(struct wiphy *wiphy,
2225 struct reg_beacon *reg_beacon)
2226 {
2227 unsigned int i;
2228 struct ieee80211_supported_band *sband;
2229
2230 if (!wiphy->bands[reg_beacon->chan.band])
2231 return;
2232
2233 sband = wiphy->bands[reg_beacon->chan.band];
2234
2235 for (i = 0; i < sband->n_channels; i++)
2236 handle_reg_beacon(wiphy, i, reg_beacon);
2237 }
2238
2239
2240
2241
2242 static void wiphy_update_beacon_reg(struct wiphy *wiphy)
2243 {
2244 unsigned int i;
2245 struct ieee80211_supported_band *sband;
2246 struct reg_beacon *reg_beacon;
2247
2248 list_for_each_entry(reg_beacon, ®_beacon_list, list) {
2249 if (!wiphy->bands[reg_beacon->chan.band])
2250 continue;
2251 sband = wiphy->bands[reg_beacon->chan.band];
2252 for (i = 0; i < sband->n_channels; i++)
2253 handle_reg_beacon(wiphy, i, reg_beacon);
2254 }
2255 }
2256
2257
2258 static void reg_process_beacons(struct wiphy *wiphy)
2259 {
2260
2261
2262
2263
2264 if (!last_request)
2265 return;
2266 wiphy_update_beacon_reg(wiphy);
2267 }
2268
2269 static bool is_ht40_allowed(struct ieee80211_channel *chan)
2270 {
2271 if (!chan)
2272 return false;
2273 if (chan->flags & IEEE80211_CHAN_DISABLED)
2274 return false;
2275
2276 if ((chan->flags & IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40)
2277 return false;
2278 return true;
2279 }
2280
2281 static void reg_process_ht_flags_channel(struct wiphy *wiphy,
2282 struct ieee80211_channel *channel)
2283 {
2284 struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
2285 struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
2286 const struct ieee80211_regdomain *regd;
2287 unsigned int i;
2288 u32 flags;
2289
2290 if (!is_ht40_allowed(channel)) {
2291 channel->flags |= IEEE80211_CHAN_NO_HT40;
2292 return;
2293 }
2294
2295
2296
2297
2298
2299 for (i = 0; i < sband->n_channels; i++) {
2300 struct ieee80211_channel *c = &sband->channels[i];
2301
2302 if (c->center_freq == (channel->center_freq - 20))
2303 channel_before = c;
2304 if (c->center_freq == (channel->center_freq + 20))
2305 channel_after = c;
2306 }
2307
2308 flags = 0;
2309 regd = get_wiphy_regdom(wiphy);
2310 if (regd) {
2311 const struct ieee80211_reg_rule *reg_rule =
2312 freq_reg_info_regd(MHZ_TO_KHZ(channel->center_freq),
2313 regd, MHZ_TO_KHZ(20));
2314
2315 if (!IS_ERR(reg_rule))
2316 flags = reg_rule->flags;
2317 }
2318
2319
2320
2321
2322
2323
2324 if (!is_ht40_allowed(channel_before) ||
2325 flags & NL80211_RRF_NO_HT40MINUS)
2326 channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
2327 else
2328 channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
2329
2330 if (!is_ht40_allowed(channel_after) ||
2331 flags & NL80211_RRF_NO_HT40PLUS)
2332 channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
2333 else
2334 channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
2335 }
2336
2337 static void reg_process_ht_flags_band(struct wiphy *wiphy,
2338 struct ieee80211_supported_band *sband)
2339 {
2340 unsigned int i;
2341
2342 if (!sband)
2343 return;
2344
2345 for (i = 0; i < sband->n_channels; i++)
2346 reg_process_ht_flags_channel(wiphy, &sband->channels[i]);
2347 }
2348
2349 static void reg_process_ht_flags(struct wiphy *wiphy)
2350 {
2351 enum nl80211_band band;
2352
2353 if (!wiphy)
2354 return;
2355
2356 for (band = 0; band < NUM_NL80211_BANDS; band++)
2357 reg_process_ht_flags_band(wiphy, wiphy->bands[band]);
2358 }
2359
2360 static void reg_call_notifier(struct wiphy *wiphy,
2361 struct regulatory_request *request)
2362 {
2363 if (wiphy->reg_notifier)
2364 wiphy->reg_notifier(wiphy, request);
2365 }
2366
2367 static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev)
2368 {
2369 struct cfg80211_chan_def chandef = {};
2370 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2371 enum nl80211_iftype iftype;
2372 bool ret;
2373 int link;
2374
2375 wdev_lock(wdev);
2376 iftype = wdev->iftype;
2377
2378
2379 if (!wdev->netdev || !netif_running(wdev->netdev))
2380 goto wdev_inactive_unlock;
2381
2382 for (link = 0; link < ARRAY_SIZE(wdev->links); link++) {
2383 struct ieee80211_channel *chan;
2384
2385 if (!wdev->valid_links && link > 0)
2386 break;
2387 if (!(wdev->valid_links & BIT(link)))
2388 continue;
2389 switch (iftype) {
2390 case NL80211_IFTYPE_AP:
2391 case NL80211_IFTYPE_P2P_GO:
2392 case NL80211_IFTYPE_MESH_POINT:
2393 if (!wdev->u.mesh.beacon_interval)
2394 continue;
2395 chandef = wdev->u.mesh.chandef;
2396 break;
2397 case NL80211_IFTYPE_ADHOC:
2398 if (!wdev->u.ibss.ssid_len)
2399 continue;
2400 chandef = wdev->u.ibss.chandef;
2401 break;
2402 case NL80211_IFTYPE_STATION:
2403 case NL80211_IFTYPE_P2P_CLIENT:
2404
2405 if (!wdev->links[link].client.current_bss)
2406 continue;
2407
2408 chan = wdev->links[link].client.current_bss->pub.channel;
2409 if (!chan)
2410 continue;
2411
2412 if (!rdev->ops->get_channel ||
2413 rdev_get_channel(rdev, wdev, link, &chandef))
2414 cfg80211_chandef_create(&chandef, chan,
2415 NL80211_CHAN_NO_HT);
2416 break;
2417 case NL80211_IFTYPE_MONITOR:
2418 case NL80211_IFTYPE_AP_VLAN:
2419 case NL80211_IFTYPE_P2P_DEVICE:
2420
2421 break;
2422 default:
2423
2424 WARN_ON(1);
2425 break;
2426 }
2427
2428 wdev_unlock(wdev);
2429
2430 switch (iftype) {
2431 case NL80211_IFTYPE_AP:
2432 case NL80211_IFTYPE_P2P_GO:
2433 case NL80211_IFTYPE_ADHOC:
2434 case NL80211_IFTYPE_MESH_POINT:
2435 wiphy_lock(wiphy);
2436 ret = cfg80211_reg_can_beacon_relax(wiphy, &chandef,
2437 iftype);
2438 wiphy_unlock(wiphy);
2439
2440 if (!ret)
2441 return ret;
2442 break;
2443 case NL80211_IFTYPE_STATION:
2444 case NL80211_IFTYPE_P2P_CLIENT:
2445 ret = cfg80211_chandef_usable(wiphy, &chandef,
2446 IEEE80211_CHAN_DISABLED);
2447 if (!ret)
2448 return ret;
2449 break;
2450 default:
2451 break;
2452 }
2453
2454 wdev_lock(wdev);
2455 }
2456
2457 wdev_unlock(wdev);
2458
2459 return true;
2460
2461 wdev_inactive_unlock:
2462 wdev_unlock(wdev);
2463 return true;
2464 }
2465
2466 static void reg_leave_invalid_chans(struct wiphy *wiphy)
2467 {
2468 struct wireless_dev *wdev;
2469 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2470
2471 ASSERT_RTNL();
2472
2473 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list)
2474 if (!reg_wdev_chan_valid(wiphy, wdev))
2475 cfg80211_leave(rdev, wdev);
2476 }
2477
2478 static void reg_check_chans_work(struct work_struct *work)
2479 {
2480 struct cfg80211_registered_device *rdev;
2481
2482 pr_debug("Verifying active interfaces after reg change\n");
2483 rtnl_lock();
2484
2485 list_for_each_entry(rdev, &cfg80211_rdev_list, list)
2486 if (!(rdev->wiphy.regulatory_flags &
2487 REGULATORY_IGNORE_STALE_KICKOFF))
2488 reg_leave_invalid_chans(&rdev->wiphy);
2489
2490 rtnl_unlock();
2491 }
2492
2493 static void reg_check_channels(void)
2494 {
2495
2496
2497
2498
2499 mod_delayed_work(system_power_efficient_wq,
2500 ®_check_chans,
2501 msecs_to_jiffies(REG_ENFORCE_GRACE_MS));
2502 }
2503
2504 static void wiphy_update_regulatory(struct wiphy *wiphy,
2505 enum nl80211_reg_initiator initiator)
2506 {
2507 enum nl80211_band band;
2508 struct regulatory_request *lr = get_last_request();
2509
2510 if (ignore_reg_update(wiphy, initiator)) {
2511
2512
2513
2514
2515
2516 if (initiator == NL80211_REGDOM_SET_BY_CORE &&
2517 wiphy->regulatory_flags & REGULATORY_CUSTOM_REG &&
2518 !(wiphy->regulatory_flags &
2519 REGULATORY_WIPHY_SELF_MANAGED))
2520 reg_call_notifier(wiphy, lr);
2521 return;
2522 }
2523
2524 lr->dfs_region = get_cfg80211_regdom()->dfs_region;
2525
2526 for (band = 0; band < NUM_NL80211_BANDS; band++)
2527 handle_band(wiphy, initiator, wiphy->bands[band]);
2528
2529 reg_process_beacons(wiphy);
2530 reg_process_ht_flags(wiphy);
2531 reg_call_notifier(wiphy, lr);
2532 }
2533
2534 static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
2535 {
2536 struct cfg80211_registered_device *rdev;
2537 struct wiphy *wiphy;
2538
2539 ASSERT_RTNL();
2540
2541 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2542 wiphy = &rdev->wiphy;
2543 wiphy_update_regulatory(wiphy, initiator);
2544 }
2545
2546 reg_check_channels();
2547 }
2548
2549 static void handle_channel_custom(struct wiphy *wiphy,
2550 struct ieee80211_channel *chan,
2551 const struct ieee80211_regdomain *regd,
2552 u32 min_bw)
2553 {
2554 u32 bw_flags = 0;
2555 const struct ieee80211_reg_rule *reg_rule = NULL;
2556 const struct ieee80211_power_rule *power_rule = NULL;
2557 u32 bw, center_freq_khz;
2558
2559 center_freq_khz = ieee80211_channel_to_khz(chan);
2560 for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) {
2561 reg_rule = freq_reg_info_regd(center_freq_khz, regd, bw);
2562 if (!IS_ERR(reg_rule))
2563 break;
2564 }
2565
2566 if (IS_ERR_OR_NULL(reg_rule)) {
2567 pr_debug("Disabling freq %d.%03d MHz as custom regd has no rule that fits it\n",
2568 chan->center_freq, chan->freq_offset);
2569 if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
2570 chan->flags |= IEEE80211_CHAN_DISABLED;
2571 } else {
2572 chan->orig_flags |= IEEE80211_CHAN_DISABLED;
2573 chan->flags = chan->orig_flags;
2574 }
2575 return;
2576 }
2577
2578 power_rule = ®_rule->power_rule;
2579 bw_flags = reg_rule_to_chan_bw_flags(regd, reg_rule, chan);
2580
2581 chan->dfs_state_entered = jiffies;
2582 chan->dfs_state = NL80211_DFS_USABLE;
2583
2584 chan->beacon_found = false;
2585
2586 if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
2587 chan->flags = chan->orig_flags | bw_flags |
2588 map_regdom_flags(reg_rule->flags);
2589 else
2590 chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;
2591
2592 chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
2593 chan->max_reg_power = chan->max_power =
2594 (int) MBM_TO_DBM(power_rule->max_eirp);
2595
2596 if (chan->flags & IEEE80211_CHAN_RADAR) {
2597 if (reg_rule->dfs_cac_ms)
2598 chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
2599 else
2600 chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
2601 }
2602
2603 chan->max_power = chan->max_reg_power;
2604 }
2605
2606 static void handle_band_custom(struct wiphy *wiphy,
2607 struct ieee80211_supported_band *sband,
2608 const struct ieee80211_regdomain *regd)
2609 {
2610 unsigned int i;
2611
2612 if (!sband)
2613 return;
2614
2615
2616
2617
2618
2619
2620 for (i = 0; i < sband->n_channels; i++)
2621 handle_channel_custom(wiphy, &sband->channels[i], regd,
2622 MHZ_TO_KHZ(20));
2623 }
2624
2625
2626 void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
2627 const struct ieee80211_regdomain *regd)
2628 {
2629 const struct ieee80211_regdomain *new_regd, *tmp;
2630 enum nl80211_band band;
2631 unsigned int bands_set = 0;
2632
2633 WARN(!(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG),
2634 "wiphy should have REGULATORY_CUSTOM_REG\n");
2635 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
2636
2637 for (band = 0; band < NUM_NL80211_BANDS; band++) {
2638 if (!wiphy->bands[band])
2639 continue;
2640 handle_band_custom(wiphy, wiphy->bands[band], regd);
2641 bands_set++;
2642 }
2643
2644
2645
2646
2647
2648 WARN_ON(!bands_set);
2649 new_regd = reg_copy_regd(regd);
2650 if (IS_ERR(new_regd))
2651 return;
2652
2653 rtnl_lock();
2654 wiphy_lock(wiphy);
2655
2656 tmp = get_wiphy_regdom(wiphy);
2657 rcu_assign_pointer(wiphy->regd, new_regd);
2658 rcu_free_regdom(tmp);
2659
2660 wiphy_unlock(wiphy);
2661 rtnl_unlock();
2662 }
2663 EXPORT_SYMBOL(wiphy_apply_custom_regulatory);
2664
2665 static void reg_set_request_processed(void)
2666 {
2667 bool need_more_processing = false;
2668 struct regulatory_request *lr = get_last_request();
2669
2670 lr->processed = true;
2671
2672 spin_lock(®_requests_lock);
2673 if (!list_empty(®_requests_list))
2674 need_more_processing = true;
2675 spin_unlock(®_requests_lock);
2676
2677 cancel_crda_timeout();
2678
2679 if (need_more_processing)
2680 schedule_work(®_work);
2681 }
2682
2683
2684
2685
2686
2687
2688
2689
2690 static enum reg_request_treatment
2691 reg_process_hint_core(struct regulatory_request *core_request)
2692 {
2693 if (reg_query_database(core_request)) {
2694 core_request->intersect = false;
2695 core_request->processed = false;
2696 reg_update_last_request(core_request);
2697 return REG_REQ_OK;
2698 }
2699
2700 return REG_REQ_IGNORE;
2701 }
2702
2703 static enum reg_request_treatment
2704 __reg_process_hint_user(struct regulatory_request *user_request)
2705 {
2706 struct regulatory_request *lr = get_last_request();
2707
2708 if (reg_request_cell_base(user_request))
2709 return reg_ignore_cell_hint(user_request);
2710
2711 if (reg_request_cell_base(lr))
2712 return REG_REQ_IGNORE;
2713
2714 if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)
2715 return REG_REQ_INTERSECT;
2716
2717
2718
2719
2720 if (lr->initiator == NL80211_REGDOM_SET_BY_USER &&
2721 lr->intersect)
2722 return REG_REQ_IGNORE;
2723
2724
2725
2726
2727 if ((lr->initiator == NL80211_REGDOM_SET_BY_CORE ||
2728 lr->initiator == NL80211_REGDOM_SET_BY_DRIVER ||
2729 lr->initiator == NL80211_REGDOM_SET_BY_USER) &&
2730 regdom_changes(lr->alpha2))
2731 return REG_REQ_IGNORE;
2732
2733 if (!regdom_changes(user_request->alpha2))
2734 return REG_REQ_ALREADY_SET;
2735
2736 return REG_REQ_OK;
2737 }
2738
2739
2740
2741
2742
2743
2744
2745
2746 static enum reg_request_treatment
2747 reg_process_hint_user(struct regulatory_request *user_request)
2748 {
2749 enum reg_request_treatment treatment;
2750
2751 treatment = __reg_process_hint_user(user_request);
2752 if (treatment == REG_REQ_IGNORE ||
2753 treatment == REG_REQ_ALREADY_SET)
2754 return REG_REQ_IGNORE;
2755
2756 user_request->intersect = treatment == REG_REQ_INTERSECT;
2757 user_request->processed = false;
2758
2759 if (reg_query_database(user_request)) {
2760 reg_update_last_request(user_request);
2761 user_alpha2[0] = user_request->alpha2[0];
2762 user_alpha2[1] = user_request->alpha2[1];
2763 return REG_REQ_OK;
2764 }
2765
2766 return REG_REQ_IGNORE;
2767 }
2768
2769 static enum reg_request_treatment
2770 __reg_process_hint_driver(struct regulatory_request *driver_request)
2771 {
2772 struct regulatory_request *lr = get_last_request();
2773
2774 if (lr->initiator == NL80211_REGDOM_SET_BY_CORE) {
2775 if (regdom_changes(driver_request->alpha2))
2776 return REG_REQ_OK;
2777 return REG_REQ_ALREADY_SET;
2778 }
2779
2780
2781
2782
2783
2784
2785 if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
2786 !regdom_changes(driver_request->alpha2))
2787 return REG_REQ_ALREADY_SET;
2788
2789 return REG_REQ_INTERSECT;
2790 }
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802 static enum reg_request_treatment
2803 reg_process_hint_driver(struct wiphy *wiphy,
2804 struct regulatory_request *driver_request)
2805 {
2806 const struct ieee80211_regdomain *regd, *tmp;
2807 enum reg_request_treatment treatment;
2808
2809 treatment = __reg_process_hint_driver(driver_request);
2810
2811 switch (treatment) {
2812 case REG_REQ_OK:
2813 break;
2814 case REG_REQ_IGNORE:
2815 return REG_REQ_IGNORE;
2816 case REG_REQ_INTERSECT:
2817 case REG_REQ_ALREADY_SET:
2818 regd = reg_copy_regd(get_cfg80211_regdom());
2819 if (IS_ERR(regd))
2820 return REG_REQ_IGNORE;
2821
2822 tmp = get_wiphy_regdom(wiphy);
2823 ASSERT_RTNL();
2824 wiphy_lock(wiphy);
2825 rcu_assign_pointer(wiphy->regd, regd);
2826 wiphy_unlock(wiphy);
2827 rcu_free_regdom(tmp);
2828 }
2829
2830
2831 driver_request->intersect = treatment == REG_REQ_INTERSECT;
2832 driver_request->processed = false;
2833
2834
2835
2836
2837
2838
2839 if (treatment == REG_REQ_ALREADY_SET) {
2840 nl80211_send_reg_change_event(driver_request);
2841 reg_update_last_request(driver_request);
2842 reg_set_request_processed();
2843 return REG_REQ_ALREADY_SET;
2844 }
2845
2846 if (reg_query_database(driver_request)) {
2847 reg_update_last_request(driver_request);
2848 return REG_REQ_OK;
2849 }
2850
2851 return REG_REQ_IGNORE;
2852 }
2853
2854 static enum reg_request_treatment
2855 __reg_process_hint_country_ie(struct wiphy *wiphy,
2856 struct regulatory_request *country_ie_request)
2857 {
2858 struct wiphy *last_wiphy = NULL;
2859 struct regulatory_request *lr = get_last_request();
2860
2861 if (reg_request_cell_base(lr)) {
2862
2863 if (regdom_changes(country_ie_request->alpha2))
2864 return REG_REQ_IGNORE;
2865 return REG_REQ_ALREADY_SET;
2866 } else {
2867 if (wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_IGNORE)
2868 return REG_REQ_IGNORE;
2869 }
2870
2871 if (unlikely(!is_an_alpha2(country_ie_request->alpha2)))
2872 return -EINVAL;
2873
2874 if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE)
2875 return REG_REQ_OK;
2876
2877 last_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
2878
2879 if (last_wiphy != wiphy) {
2880
2881
2882
2883
2884
2885
2886 if (regdom_changes(country_ie_request->alpha2))
2887 return REG_REQ_IGNORE;
2888 return REG_REQ_ALREADY_SET;
2889 }
2890
2891 if (regdom_changes(country_ie_request->alpha2))
2892 return REG_REQ_OK;
2893 return REG_REQ_ALREADY_SET;
2894 }
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906 static enum reg_request_treatment
2907 reg_process_hint_country_ie(struct wiphy *wiphy,
2908 struct regulatory_request *country_ie_request)
2909 {
2910 enum reg_request_treatment treatment;
2911
2912 treatment = __reg_process_hint_country_ie(wiphy, country_ie_request);
2913
2914 switch (treatment) {
2915 case REG_REQ_OK:
2916 break;
2917 case REG_REQ_IGNORE:
2918 return REG_REQ_IGNORE;
2919 case REG_REQ_ALREADY_SET:
2920 reg_free_request(country_ie_request);
2921 return REG_REQ_ALREADY_SET;
2922 case REG_REQ_INTERSECT:
2923
2924
2925
2926
2927 WARN_ONCE(1, "Unexpected intersection for country elements");
2928 return REG_REQ_IGNORE;
2929 }
2930
2931 country_ie_request->intersect = false;
2932 country_ie_request->processed = false;
2933
2934 if (reg_query_database(country_ie_request)) {
2935 reg_update_last_request(country_ie_request);
2936 return REG_REQ_OK;
2937 }
2938
2939 return REG_REQ_IGNORE;
2940 }
2941
2942 bool reg_dfs_domain_same(struct wiphy *wiphy1, struct wiphy *wiphy2)
2943 {
2944 const struct ieee80211_regdomain *wiphy1_regd = NULL;
2945 const struct ieee80211_regdomain *wiphy2_regd = NULL;
2946 const struct ieee80211_regdomain *cfg80211_regd = NULL;
2947 bool dfs_domain_same;
2948
2949 rcu_read_lock();
2950
2951 cfg80211_regd = rcu_dereference(cfg80211_regdomain);
2952 wiphy1_regd = rcu_dereference(wiphy1->regd);
2953 if (!wiphy1_regd)
2954 wiphy1_regd = cfg80211_regd;
2955
2956 wiphy2_regd = rcu_dereference(wiphy2->regd);
2957 if (!wiphy2_regd)
2958 wiphy2_regd = cfg80211_regd;
2959
2960 dfs_domain_same = wiphy1_regd->dfs_region == wiphy2_regd->dfs_region;
2961
2962 rcu_read_unlock();
2963
2964 return dfs_domain_same;
2965 }
2966
2967 static void reg_copy_dfs_chan_state(struct ieee80211_channel *dst_chan,
2968 struct ieee80211_channel *src_chan)
2969 {
2970 if (!(dst_chan->flags & IEEE80211_CHAN_RADAR) ||
2971 !(src_chan->flags & IEEE80211_CHAN_RADAR))
2972 return;
2973
2974 if (dst_chan->flags & IEEE80211_CHAN_DISABLED ||
2975 src_chan->flags & IEEE80211_CHAN_DISABLED)
2976 return;
2977
2978 if (src_chan->center_freq == dst_chan->center_freq &&
2979 dst_chan->dfs_state == NL80211_DFS_USABLE) {
2980 dst_chan->dfs_state = src_chan->dfs_state;
2981 dst_chan->dfs_state_entered = src_chan->dfs_state_entered;
2982 }
2983 }
2984
2985 static void wiphy_share_dfs_chan_state(struct wiphy *dst_wiphy,
2986 struct wiphy *src_wiphy)
2987 {
2988 struct ieee80211_supported_band *src_sband, *dst_sband;
2989 struct ieee80211_channel *src_chan, *dst_chan;
2990 int i, j, band;
2991
2992 if (!reg_dfs_domain_same(dst_wiphy, src_wiphy))
2993 return;
2994
2995 for (band = 0; band < NUM_NL80211_BANDS; band++) {
2996 dst_sband = dst_wiphy->bands[band];
2997 src_sband = src_wiphy->bands[band];
2998 if (!dst_sband || !src_sband)
2999 continue;
3000
3001 for (i = 0; i < dst_sband->n_channels; i++) {
3002 dst_chan = &dst_sband->channels[i];
3003 for (j = 0; j < src_sband->n_channels; j++) {
3004 src_chan = &src_sband->channels[j];
3005 reg_copy_dfs_chan_state(dst_chan, src_chan);
3006 }
3007 }
3008 }
3009 }
3010
3011 static void wiphy_all_share_dfs_chan_state(struct wiphy *wiphy)
3012 {
3013 struct cfg80211_registered_device *rdev;
3014
3015 ASSERT_RTNL();
3016
3017 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3018 if (wiphy == &rdev->wiphy)
3019 continue;
3020 wiphy_share_dfs_chan_state(wiphy, &rdev->wiphy);
3021 }
3022 }
3023
3024
3025 static void reg_process_hint(struct regulatory_request *reg_request)
3026 {
3027 struct wiphy *wiphy = NULL;
3028 enum reg_request_treatment treatment;
3029 enum nl80211_reg_initiator initiator = reg_request->initiator;
3030
3031 if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
3032 wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);
3033
3034 switch (initiator) {
3035 case NL80211_REGDOM_SET_BY_CORE:
3036 treatment = reg_process_hint_core(reg_request);
3037 break;
3038 case NL80211_REGDOM_SET_BY_USER:
3039 treatment = reg_process_hint_user(reg_request);
3040 break;
3041 case NL80211_REGDOM_SET_BY_DRIVER:
3042 if (!wiphy)
3043 goto out_free;
3044 treatment = reg_process_hint_driver(wiphy, reg_request);
3045 break;
3046 case NL80211_REGDOM_SET_BY_COUNTRY_IE:
3047 if (!wiphy)
3048 goto out_free;
3049 treatment = reg_process_hint_country_ie(wiphy, reg_request);
3050 break;
3051 default:
3052 WARN(1, "invalid initiator %d\n", initiator);
3053 goto out_free;
3054 }
3055
3056 if (treatment == REG_REQ_IGNORE)
3057 goto out_free;
3058
3059 WARN(treatment != REG_REQ_OK && treatment != REG_REQ_ALREADY_SET,
3060 "unexpected treatment value %d\n", treatment);
3061
3062
3063
3064
3065 if (treatment == REG_REQ_ALREADY_SET && wiphy &&
3066 wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
3067 wiphy_update_regulatory(wiphy, initiator);
3068 wiphy_all_share_dfs_chan_state(wiphy);
3069 reg_check_channels();
3070 }
3071
3072 return;
3073
3074 out_free:
3075 reg_free_request(reg_request);
3076 }
3077
3078 static void notify_self_managed_wiphys(struct regulatory_request *request)
3079 {
3080 struct cfg80211_registered_device *rdev;
3081 struct wiphy *wiphy;
3082
3083 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3084 wiphy = &rdev->wiphy;
3085 if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
3086 request->initiator == NL80211_REGDOM_SET_BY_USER)
3087 reg_call_notifier(wiphy, request);
3088 }
3089 }
3090
3091
3092
3093
3094
3095
3096 static void reg_process_pending_hints(void)
3097 {
3098 struct regulatory_request *reg_request, *lr;
3099
3100 lr = get_last_request();
3101
3102
3103 if (lr && !lr->processed) {
3104 pr_debug("Pending regulatory request, waiting for it to be processed...\n");
3105 return;
3106 }
3107
3108 spin_lock(®_requests_lock);
3109
3110 if (list_empty(®_requests_list)) {
3111 spin_unlock(®_requests_lock);
3112 return;
3113 }
3114
3115 reg_request = list_first_entry(®_requests_list,
3116 struct regulatory_request,
3117 list);
3118 list_del_init(®_request->list);
3119
3120 spin_unlock(®_requests_lock);
3121
3122 notify_self_managed_wiphys(reg_request);
3123
3124 reg_process_hint(reg_request);
3125
3126 lr = get_last_request();
3127
3128 spin_lock(®_requests_lock);
3129 if (!list_empty(®_requests_list) && lr && lr->processed)
3130 schedule_work(®_work);
3131 spin_unlock(®_requests_lock);
3132 }
3133
3134
3135 static void reg_process_pending_beacon_hints(void)
3136 {
3137 struct cfg80211_registered_device *rdev;
3138 struct reg_beacon *pending_beacon, *tmp;
3139
3140
3141 spin_lock_bh(®_pending_beacons_lock);
3142
3143 list_for_each_entry_safe(pending_beacon, tmp,
3144 ®_pending_beacons, list) {
3145 list_del_init(&pending_beacon->list);
3146
3147
3148 list_for_each_entry(rdev, &cfg80211_rdev_list, list)
3149 wiphy_update_new_beacon(&rdev->wiphy, pending_beacon);
3150
3151
3152 list_add_tail(&pending_beacon->list, ®_beacon_list);
3153 }
3154
3155 spin_unlock_bh(®_pending_beacons_lock);
3156 }
3157
3158 static void reg_process_self_managed_hint(struct wiphy *wiphy)
3159 {
3160 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3161 const struct ieee80211_regdomain *tmp;
3162 const struct ieee80211_regdomain *regd;
3163 enum nl80211_band band;
3164 struct regulatory_request request = {};
3165
3166 ASSERT_RTNL();
3167 lockdep_assert_wiphy(wiphy);
3168
3169 spin_lock(®_requests_lock);
3170 regd = rdev->requested_regd;
3171 rdev->requested_regd = NULL;
3172 spin_unlock(®_requests_lock);
3173
3174 if (!regd)
3175 return;
3176
3177 tmp = get_wiphy_regdom(wiphy);
3178 rcu_assign_pointer(wiphy->regd, regd);
3179 rcu_free_regdom(tmp);
3180
3181 for (band = 0; band < NUM_NL80211_BANDS; band++)
3182 handle_band_custom(wiphy, wiphy->bands[band], regd);
3183
3184 reg_process_ht_flags(wiphy);
3185
3186 request.wiphy_idx = get_wiphy_idx(wiphy);
3187 request.alpha2[0] = regd->alpha2[0];
3188 request.alpha2[1] = regd->alpha2[1];
3189 request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
3190
3191 nl80211_send_wiphy_reg_change_event(&request);
3192 }
3193
3194 static void reg_process_self_managed_hints(void)
3195 {
3196 struct cfg80211_registered_device *rdev;
3197
3198 ASSERT_RTNL();
3199
3200 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3201 wiphy_lock(&rdev->wiphy);
3202 reg_process_self_managed_hint(&rdev->wiphy);
3203 wiphy_unlock(&rdev->wiphy);
3204 }
3205
3206 reg_check_channels();
3207 }
3208
3209 static void reg_todo(struct work_struct *work)
3210 {
3211 rtnl_lock();
3212 reg_process_pending_hints();
3213 reg_process_pending_beacon_hints();
3214 reg_process_self_managed_hints();
3215 rtnl_unlock();
3216 }
3217
3218 static void queue_regulatory_request(struct regulatory_request *request)
3219 {
3220 request->alpha2[0] = toupper(request->alpha2[0]);
3221 request->alpha2[1] = toupper(request->alpha2[1]);
3222
3223 spin_lock(®_requests_lock);
3224 list_add_tail(&request->list, ®_requests_list);
3225 spin_unlock(®_requests_lock);
3226
3227 schedule_work(®_work);
3228 }
3229
3230
3231
3232
3233
3234 static int regulatory_hint_core(const char *alpha2)
3235 {
3236 struct regulatory_request *request;
3237
3238 request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
3239 if (!request)
3240 return -ENOMEM;
3241
3242 request->alpha2[0] = alpha2[0];
3243 request->alpha2[1] = alpha2[1];
3244 request->initiator = NL80211_REGDOM_SET_BY_CORE;
3245 request->wiphy_idx = WIPHY_IDX_INVALID;
3246
3247 queue_regulatory_request(request);
3248
3249 return 0;
3250 }
3251
3252
3253 int regulatory_hint_user(const char *alpha2,
3254 enum nl80211_user_reg_hint_type user_reg_hint_type)
3255 {
3256 struct regulatory_request *request;
3257
3258 if (WARN_ON(!alpha2))
3259 return -EINVAL;
3260
3261 if (!is_world_regdom(alpha2) && !is_an_alpha2(alpha2))
3262 return -EINVAL;
3263
3264 request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
3265 if (!request)
3266 return -ENOMEM;
3267
3268 request->wiphy_idx = WIPHY_IDX_INVALID;
3269 request->alpha2[0] = alpha2[0];
3270 request->alpha2[1] = alpha2[1];
3271 request->initiator = NL80211_REGDOM_SET_BY_USER;
3272 request->user_reg_hint_type = user_reg_hint_type;
3273
3274
3275 reset_crda_timeouts();
3276
3277 queue_regulatory_request(request);
3278
3279 return 0;
3280 }
3281
3282 int regulatory_hint_indoor(bool is_indoor, u32 portid)
3283 {
3284 spin_lock(®_indoor_lock);
3285
3286
3287
3288
3289
3290
3291
3292
3293 reg_is_indoor = is_indoor;
3294 if (reg_is_indoor) {
3295 if (!reg_is_indoor_portid)
3296 reg_is_indoor_portid = portid;
3297 } else {
3298 reg_is_indoor_portid = 0;
3299 }
3300
3301 spin_unlock(®_indoor_lock);
3302
3303 if (!is_indoor)
3304 reg_check_channels();
3305
3306 return 0;
3307 }
3308
3309 void regulatory_netlink_notify(u32 portid)
3310 {
3311 spin_lock(®_indoor_lock);
3312
3313 if (reg_is_indoor_portid != portid) {
3314 spin_unlock(®_indoor_lock);
3315 return;
3316 }
3317
3318 reg_is_indoor = false;
3319 reg_is_indoor_portid = 0;
3320
3321 spin_unlock(®_indoor_lock);
3322
3323 reg_check_channels();
3324 }
3325
3326
3327 int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
3328 {
3329 struct regulatory_request *request;
3330
3331 if (WARN_ON(!alpha2 || !wiphy))
3332 return -EINVAL;
3333
3334 wiphy->regulatory_flags &= ~REGULATORY_CUSTOM_REG;
3335
3336 request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
3337 if (!request)
3338 return -ENOMEM;
3339
3340 request->wiphy_idx = get_wiphy_idx(wiphy);
3341
3342 request->alpha2[0] = alpha2[0];
3343 request->alpha2[1] = alpha2[1];
3344 request->initiator = NL80211_REGDOM_SET_BY_DRIVER;
3345
3346
3347 reset_crda_timeouts();
3348
3349 queue_regulatory_request(request);
3350
3351 return 0;
3352 }
3353 EXPORT_SYMBOL(regulatory_hint);
3354
3355 void regulatory_hint_country_ie(struct wiphy *wiphy, enum nl80211_band band,
3356 const u8 *country_ie, u8 country_ie_len)
3357 {
3358 char alpha2[2];
3359 enum environment_cap env = ENVIRON_ANY;
3360 struct regulatory_request *request = NULL, *lr;
3361
3362
3363 if (country_ie_len & 0x01)
3364 return;
3365
3366 if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
3367 return;
3368
3369 request = kzalloc(sizeof(*request), GFP_KERNEL);
3370 if (!request)
3371 return;
3372
3373 alpha2[0] = country_ie[0];
3374 alpha2[1] = country_ie[1];
3375
3376 if (country_ie[2] == 'I')
3377 env = ENVIRON_INDOOR;
3378 else if (country_ie[2] == 'O')
3379 env = ENVIRON_OUTDOOR;
3380
3381 rcu_read_lock();
3382 lr = get_last_request();
3383
3384 if (unlikely(!lr))
3385 goto out;
3386
3387
3388
3389
3390
3391
3392 if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
3393 lr->wiphy_idx != WIPHY_IDX_INVALID)
3394 goto out;
3395
3396 request->wiphy_idx = get_wiphy_idx(wiphy);
3397 request->alpha2[0] = alpha2[0];
3398 request->alpha2[1] = alpha2[1];
3399 request->initiator = NL80211_REGDOM_SET_BY_COUNTRY_IE;
3400 request->country_ie_env = env;
3401
3402
3403 reset_crda_timeouts();
3404
3405 queue_regulatory_request(request);
3406 request = NULL;
3407 out:
3408 kfree(request);
3409 rcu_read_unlock();
3410 }
3411
3412 static void restore_alpha2(char *alpha2, bool reset_user)
3413 {
3414
3415 alpha2[0] = '9';
3416 alpha2[1] = '7';
3417
3418
3419 if (is_user_regdom_saved()) {
3420
3421 if (reset_user) {
3422 pr_debug("Restoring regulatory settings including user preference\n");
3423 user_alpha2[0] = '9';
3424 user_alpha2[1] = '7';
3425
3426
3427
3428
3429
3430
3431 if (!is_world_regdom(ieee80211_regdom)) {
3432 pr_debug("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
3433 ieee80211_regdom[0], ieee80211_regdom[1]);
3434 alpha2[0] = ieee80211_regdom[0];
3435 alpha2[1] = ieee80211_regdom[1];
3436 }
3437 } else {
3438 pr_debug("Restoring regulatory settings while preserving user preference for: %c%c\n",
3439 user_alpha2[0], user_alpha2[1]);
3440 alpha2[0] = user_alpha2[0];
3441 alpha2[1] = user_alpha2[1];
3442 }
3443 } else if (!is_world_regdom(ieee80211_regdom)) {
3444 pr_debug("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
3445 ieee80211_regdom[0], ieee80211_regdom[1]);
3446 alpha2[0] = ieee80211_regdom[0];
3447 alpha2[1] = ieee80211_regdom[1];
3448 } else
3449 pr_debug("Restoring regulatory settings\n");
3450 }
3451
3452 static void restore_custom_reg_settings(struct wiphy *wiphy)
3453 {
3454 struct ieee80211_supported_band *sband;
3455 enum nl80211_band band;
3456 struct ieee80211_channel *chan;
3457 int i;
3458
3459 for (band = 0; band < NUM_NL80211_BANDS; band++) {
3460 sband = wiphy->bands[band];
3461 if (!sband)
3462 continue;
3463 for (i = 0; i < sband->n_channels; i++) {
3464 chan = &sband->channels[i];
3465 chan->flags = chan->orig_flags;
3466 chan->max_antenna_gain = chan->orig_mag;
3467 chan->max_power = chan->orig_mpwr;
3468 chan->beacon_found = false;
3469 }
3470 }
3471 }
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488 static void restore_regulatory_settings(bool reset_user, bool cached)
3489 {
3490 char alpha2[2];
3491 char world_alpha2[2];
3492 struct reg_beacon *reg_beacon, *btmp;
3493 LIST_HEAD(tmp_reg_req_list);
3494 struct cfg80211_registered_device *rdev;
3495
3496 ASSERT_RTNL();
3497
3498
3499
3500
3501
3502
3503 spin_lock(®_indoor_lock);
3504 if (reg_is_indoor && !reg_is_indoor_portid) {
3505 reg_is_indoor = false;
3506 reg_check_channels();
3507 }
3508 spin_unlock(®_indoor_lock);
3509
3510 reset_regdomains(true, &world_regdom);
3511 restore_alpha2(alpha2, reset_user);
3512
3513
3514
3515
3516
3517
3518
3519 spin_lock(®_requests_lock);
3520 list_splice_tail_init(®_requests_list, &tmp_reg_req_list);
3521 spin_unlock(®_requests_lock);
3522
3523
3524 spin_lock_bh(®_pending_beacons_lock);
3525 list_for_each_entry_safe(reg_beacon, btmp, ®_pending_beacons, list) {
3526 list_del(®_beacon->list);
3527 kfree(reg_beacon);
3528 }
3529 spin_unlock_bh(®_pending_beacons_lock);
3530
3531 list_for_each_entry_safe(reg_beacon, btmp, ®_beacon_list, list) {
3532 list_del(®_beacon->list);
3533 kfree(reg_beacon);
3534 }
3535
3536
3537 world_alpha2[0] = cfg80211_world_regdom->alpha2[0];
3538 world_alpha2[1] = cfg80211_world_regdom->alpha2[1];
3539
3540 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3541 if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
3542 continue;
3543 if (rdev->wiphy.regulatory_flags & REGULATORY_CUSTOM_REG)
3544 restore_custom_reg_settings(&rdev->wiphy);
3545 }
3546
3547 if (cached && (!is_an_alpha2(alpha2) ||
3548 !IS_ERR_OR_NULL(cfg80211_user_regdom))) {
3549 reset_regdomains(false, cfg80211_world_regdom);
3550 update_all_wiphy_regulatory(NL80211_REGDOM_SET_BY_CORE);
3551 print_regdomain(get_cfg80211_regdom());
3552 nl80211_send_reg_change_event(&core_request_world);
3553 reg_set_request_processed();
3554
3555 if (is_an_alpha2(alpha2) &&
3556 !regulatory_hint_user(alpha2, NL80211_USER_REG_HINT_USER)) {
3557 struct regulatory_request *ureq;
3558
3559 spin_lock(®_requests_lock);
3560 ureq = list_last_entry(®_requests_list,
3561 struct regulatory_request,
3562 list);
3563 list_del(&ureq->list);
3564 spin_unlock(®_requests_lock);
3565
3566 notify_self_managed_wiphys(ureq);
3567 reg_update_last_request(ureq);
3568 set_regdom(reg_copy_regd(cfg80211_user_regdom),
3569 REGD_SOURCE_CACHED);
3570 }
3571 } else {
3572 regulatory_hint_core(world_alpha2);
3573
3574
3575
3576
3577
3578
3579 if (is_an_alpha2(alpha2))
3580 regulatory_hint_user(alpha2, NL80211_USER_REG_HINT_USER);
3581 }
3582
3583 spin_lock(®_requests_lock);
3584 list_splice_tail_init(&tmp_reg_req_list, ®_requests_list);
3585 spin_unlock(®_requests_lock);
3586
3587 pr_debug("Kicking the queue\n");
3588
3589 schedule_work(®_work);
3590 }
3591
3592 static bool is_wiphy_all_set_reg_flag(enum ieee80211_regulatory_flags flag)
3593 {
3594 struct cfg80211_registered_device *rdev;
3595 struct wireless_dev *wdev;
3596
3597 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3598 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
3599 wdev_lock(wdev);
3600 if (!(wdev->wiphy->regulatory_flags & flag)) {
3601 wdev_unlock(wdev);
3602 return false;
3603 }
3604 wdev_unlock(wdev);
3605 }
3606 }
3607
3608 return true;
3609 }
3610
3611 void regulatory_hint_disconnect(void)
3612 {
3613
3614
3615
3616
3617 if (is_wiphy_all_set_reg_flag(REGULATORY_COUNTRY_IE_IGNORE)) {
3618 struct reg_beacon *reg_beacon, *btmp;
3619
3620 if (is_wiphy_all_set_reg_flag(REGULATORY_DISABLE_BEACON_HINTS))
3621 return;
3622
3623 spin_lock_bh(®_pending_beacons_lock);
3624 list_for_each_entry_safe(reg_beacon, btmp,
3625 ®_pending_beacons, list) {
3626 list_del(®_beacon->list);
3627 kfree(reg_beacon);
3628 }
3629 spin_unlock_bh(®_pending_beacons_lock);
3630
3631 list_for_each_entry_safe(reg_beacon, btmp,
3632 ®_beacon_list, list) {
3633 list_del(®_beacon->list);
3634 kfree(reg_beacon);
3635 }
3636
3637 return;
3638 }
3639
3640 pr_debug("All devices are disconnected, going to restore regulatory settings\n");
3641 restore_regulatory_settings(false, true);
3642 }
3643
3644 static bool freq_is_chan_12_13_14(u32 freq)
3645 {
3646 if (freq == ieee80211_channel_to_frequency(12, NL80211_BAND_2GHZ) ||
3647 freq == ieee80211_channel_to_frequency(13, NL80211_BAND_2GHZ) ||
3648 freq == ieee80211_channel_to_frequency(14, NL80211_BAND_2GHZ))
3649 return true;
3650 return false;
3651 }
3652
3653 static bool pending_reg_beacon(struct ieee80211_channel *beacon_chan)
3654 {
3655 struct reg_beacon *pending_beacon;
3656
3657 list_for_each_entry(pending_beacon, ®_pending_beacons, list)
3658 if (ieee80211_channel_equal(beacon_chan,
3659 &pending_beacon->chan))
3660 return true;
3661 return false;
3662 }
3663
3664 int regulatory_hint_found_beacon(struct wiphy *wiphy,
3665 struct ieee80211_channel *beacon_chan,
3666 gfp_t gfp)
3667 {
3668 struct reg_beacon *reg_beacon;
3669 bool processing;
3670
3671 if (beacon_chan->beacon_found ||
3672 beacon_chan->flags & IEEE80211_CHAN_RADAR ||
3673 (beacon_chan->band == NL80211_BAND_2GHZ &&
3674 !freq_is_chan_12_13_14(beacon_chan->center_freq)))
3675 return 0;
3676
3677 spin_lock_bh(®_pending_beacons_lock);
3678 processing = pending_reg_beacon(beacon_chan);
3679 spin_unlock_bh(®_pending_beacons_lock);
3680
3681 if (processing)
3682 return 0;
3683
3684 reg_beacon = kzalloc(sizeof(struct reg_beacon), gfp);
3685 if (!reg_beacon)
3686 return -ENOMEM;
3687
3688 pr_debug("Found new beacon on frequency: %d.%03d MHz (Ch %d) on %s\n",
3689 beacon_chan->center_freq, beacon_chan->freq_offset,
3690 ieee80211_freq_khz_to_channel(
3691 ieee80211_channel_to_khz(beacon_chan)),
3692 wiphy_name(wiphy));
3693
3694 memcpy(®_beacon->chan, beacon_chan,
3695 sizeof(struct ieee80211_channel));
3696
3697
3698
3699
3700
3701 spin_lock_bh(®_pending_beacons_lock);
3702 list_add_tail(®_beacon->list, ®_pending_beacons);
3703 spin_unlock_bh(®_pending_beacons_lock);
3704
3705 schedule_work(®_work);
3706
3707 return 0;
3708 }
3709
3710 static void print_rd_rules(const struct ieee80211_regdomain *rd)
3711 {
3712 unsigned int i;
3713 const struct ieee80211_reg_rule *reg_rule = NULL;
3714 const struct ieee80211_freq_range *freq_range = NULL;
3715 const struct ieee80211_power_rule *power_rule = NULL;
3716 char bw[32], cac_time[32];
3717
3718 pr_debug(" (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)\n");
3719
3720 for (i = 0; i < rd->n_reg_rules; i++) {
3721 reg_rule = &rd->reg_rules[i];
3722 freq_range = ®_rule->freq_range;
3723 power_rule = ®_rule->power_rule;
3724
3725 if (reg_rule->flags & NL80211_RRF_AUTO_BW)
3726 snprintf(bw, sizeof(bw), "%d KHz, %u KHz AUTO",
3727 freq_range->max_bandwidth_khz,
3728 reg_get_max_bandwidth(rd, reg_rule));
3729 else
3730 snprintf(bw, sizeof(bw), "%d KHz",
3731 freq_range->max_bandwidth_khz);
3732
3733 if (reg_rule->flags & NL80211_RRF_DFS)
3734 scnprintf(cac_time, sizeof(cac_time), "%u s",
3735 reg_rule->dfs_cac_ms/1000);
3736 else
3737 scnprintf(cac_time, sizeof(cac_time), "N/A");
3738
3739
3740
3741
3742
3743
3744 if (power_rule->max_antenna_gain)
3745 pr_debug(" (%d KHz - %d KHz @ %s), (%d mBi, %d mBm), (%s)\n",
3746 freq_range->start_freq_khz,
3747 freq_range->end_freq_khz,
3748 bw,
3749 power_rule->max_antenna_gain,
3750 power_rule->max_eirp,
3751 cac_time);
3752 else
3753 pr_debug(" (%d KHz - %d KHz @ %s), (N/A, %d mBm), (%s)\n",
3754 freq_range->start_freq_khz,
3755 freq_range->end_freq_khz,
3756 bw,
3757 power_rule->max_eirp,
3758 cac_time);
3759 }
3760 }
3761
3762 bool reg_supported_dfs_region(enum nl80211_dfs_regions dfs_region)
3763 {
3764 switch (dfs_region) {
3765 case NL80211_DFS_UNSET:
3766 case NL80211_DFS_FCC:
3767 case NL80211_DFS_ETSI:
3768 case NL80211_DFS_JP:
3769 return true;
3770 default:
3771 pr_debug("Ignoring unknown DFS master region: %d\n", dfs_region);
3772 return false;
3773 }
3774 }
3775
3776 static void print_regdomain(const struct ieee80211_regdomain *rd)
3777 {
3778 struct regulatory_request *lr = get_last_request();
3779
3780 if (is_intersected_alpha2(rd->alpha2)) {
3781 if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
3782 struct cfg80211_registered_device *rdev;
3783 rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx);
3784 if (rdev) {
3785 pr_debug("Current regulatory domain updated by AP to: %c%c\n",
3786 rdev->country_ie_alpha2[0],
3787 rdev->country_ie_alpha2[1]);
3788 } else
3789 pr_debug("Current regulatory domain intersected:\n");
3790 } else
3791 pr_debug("Current regulatory domain intersected:\n");
3792 } else if (is_world_regdom(rd->alpha2)) {
3793 pr_debug("World regulatory domain updated:\n");
3794 } else {
3795 if (is_unknown_alpha2(rd->alpha2))
3796 pr_debug("Regulatory domain changed to driver built-in settings (unknown country)\n");
3797 else {
3798 if (reg_request_cell_base(lr))
3799 pr_debug("Regulatory domain changed to country: %c%c by Cell Station\n",
3800 rd->alpha2[0], rd->alpha2[1]);
3801 else
3802 pr_debug("Regulatory domain changed to country: %c%c\n",
3803 rd->alpha2[0], rd->alpha2[1]);
3804 }
3805 }
3806
3807 pr_debug(" DFS Master region: %s", reg_dfs_region_str(rd->dfs_region));
3808 print_rd_rules(rd);
3809 }
3810
3811 static void print_regdomain_info(const struct ieee80211_regdomain *rd)
3812 {
3813 pr_debug("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]);
3814 print_rd_rules(rd);
3815 }
3816
3817 static int reg_set_rd_core(const struct ieee80211_regdomain *rd)
3818 {
3819 if (!is_world_regdom(rd->alpha2))
3820 return -EINVAL;
3821 update_world_regdomain(rd);
3822 return 0;
3823 }
3824
3825 static int reg_set_rd_user(const struct ieee80211_regdomain *rd,
3826 struct regulatory_request *user_request)
3827 {
3828 const struct ieee80211_regdomain *intersected_rd = NULL;
3829
3830 if (!regdom_changes(rd->alpha2))
3831 return -EALREADY;
3832
3833 if (!is_valid_rd(rd)) {
3834 pr_err("Invalid regulatory domain detected: %c%c\n",
3835 rd->alpha2[0], rd->alpha2[1]);
3836 print_regdomain_info(rd);
3837 return -EINVAL;
3838 }
3839
3840 if (!user_request->intersect) {
3841 reset_regdomains(false, rd);
3842 return 0;
3843 }
3844
3845 intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
3846 if (!intersected_rd)
3847 return -EINVAL;
3848
3849 kfree(rd);
3850 rd = NULL;
3851 reset_regdomains(false, intersected_rd);
3852
3853 return 0;
3854 }
3855
3856 static int reg_set_rd_driver(const struct ieee80211_regdomain *rd,
3857 struct regulatory_request *driver_request)
3858 {
3859 const struct ieee80211_regdomain *regd;
3860 const struct ieee80211_regdomain *intersected_rd = NULL;
3861 const struct ieee80211_regdomain *tmp;
3862 struct wiphy *request_wiphy;
3863
3864 if (is_world_regdom(rd->alpha2))
3865 return -EINVAL;
3866
3867 if (!regdom_changes(rd->alpha2))
3868 return -EALREADY;
3869
3870 if (!is_valid_rd(rd)) {
3871 pr_err("Invalid regulatory domain detected: %c%c\n",
3872 rd->alpha2[0], rd->alpha2[1]);
3873 print_regdomain_info(rd);
3874 return -EINVAL;
3875 }
3876
3877 request_wiphy = wiphy_idx_to_wiphy(driver_request->wiphy_idx);
3878 if (!request_wiphy)
3879 return -ENODEV;
3880
3881 if (!driver_request->intersect) {
3882 ASSERT_RTNL();
3883 wiphy_lock(request_wiphy);
3884 if (request_wiphy->regd) {
3885 wiphy_unlock(request_wiphy);
3886 return -EALREADY;
3887 }
3888
3889 regd = reg_copy_regd(rd);
3890 if (IS_ERR(regd)) {
3891 wiphy_unlock(request_wiphy);
3892 return PTR_ERR(regd);
3893 }
3894
3895 rcu_assign_pointer(request_wiphy->regd, regd);
3896 wiphy_unlock(request_wiphy);
3897 reset_regdomains(false, rd);
3898 return 0;
3899 }
3900
3901 intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
3902 if (!intersected_rd)
3903 return -EINVAL;
3904
3905
3906
3907
3908
3909
3910 tmp = get_wiphy_regdom(request_wiphy);
3911 rcu_assign_pointer(request_wiphy->regd, rd);
3912 rcu_free_regdom(tmp);
3913
3914 rd = NULL;
3915
3916 reset_regdomains(false, intersected_rd);
3917
3918 return 0;
3919 }
3920
3921 static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd,
3922 struct regulatory_request *country_ie_request)
3923 {
3924 struct wiphy *request_wiphy;
3925
3926 if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) &&
3927 !is_unknown_alpha2(rd->alpha2))
3928 return -EINVAL;
3929
3930
3931
3932
3933
3934
3935
3936 if (!is_valid_rd(rd)) {
3937 pr_err("Invalid regulatory domain detected: %c%c\n",
3938 rd->alpha2[0], rd->alpha2[1]);
3939 print_regdomain_info(rd);
3940 return -EINVAL;
3941 }
3942
3943 request_wiphy = wiphy_idx_to_wiphy(country_ie_request->wiphy_idx);
3944 if (!request_wiphy)
3945 return -ENODEV;
3946
3947 if (country_ie_request->intersect)
3948 return -EINVAL;
3949
3950 reset_regdomains(false, rd);
3951 return 0;
3952 }
3953
3954
3955
3956
3957
3958
3959 int set_regdom(const struct ieee80211_regdomain *rd,
3960 enum ieee80211_regd_source regd_src)
3961 {
3962 struct regulatory_request *lr;
3963 bool user_reset = false;
3964 int r;
3965
3966 if (IS_ERR_OR_NULL(rd))
3967 return -ENODATA;
3968
3969 if (!reg_is_valid_request(rd->alpha2)) {
3970 kfree(rd);
3971 return -EINVAL;
3972 }
3973
3974 if (regd_src == REGD_SOURCE_CRDA)
3975 reset_crda_timeouts();
3976
3977 lr = get_last_request();
3978
3979
3980 switch (lr->initiator) {
3981 case NL80211_REGDOM_SET_BY_CORE:
3982 r = reg_set_rd_core(rd);
3983 break;
3984 case NL80211_REGDOM_SET_BY_USER:
3985 cfg80211_save_user_regdom(rd);
3986 r = reg_set_rd_user(rd, lr);
3987 user_reset = true;
3988 break;
3989 case NL80211_REGDOM_SET_BY_DRIVER:
3990 r = reg_set_rd_driver(rd, lr);
3991 break;
3992 case NL80211_REGDOM_SET_BY_COUNTRY_IE:
3993 r = reg_set_rd_country_ie(rd, lr);
3994 break;
3995 default:
3996 WARN(1, "invalid initiator %d\n", lr->initiator);
3997 kfree(rd);
3998 return -EINVAL;
3999 }
4000
4001 if (r) {
4002 switch (r) {
4003 case -EALREADY:
4004 reg_set_request_processed();
4005 break;
4006 default:
4007
4008 restore_regulatory_settings(user_reset, false);
4009 }
4010
4011 kfree(rd);
4012 return r;
4013 }
4014
4015
4016 if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom()))
4017 return -EINVAL;
4018
4019
4020 update_all_wiphy_regulatory(lr->initiator);
4021
4022 print_regdomain(get_cfg80211_regdom());
4023
4024 nl80211_send_reg_change_event(lr);
4025
4026 reg_set_request_processed();
4027
4028 return 0;
4029 }
4030
4031 static int __regulatory_set_wiphy_regd(struct wiphy *wiphy,
4032 struct ieee80211_regdomain *rd)
4033 {
4034 const struct ieee80211_regdomain *regd;
4035 const struct ieee80211_regdomain *prev_regd;
4036 struct cfg80211_registered_device *rdev;
4037
4038 if (WARN_ON(!wiphy || !rd))
4039 return -EINVAL;
4040
4041 if (WARN(!(wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED),
4042 "wiphy should have REGULATORY_WIPHY_SELF_MANAGED\n"))
4043 return -EPERM;
4044
4045 if (WARN(!is_valid_rd(rd),
4046 "Invalid regulatory domain detected: %c%c\n",
4047 rd->alpha2[0], rd->alpha2[1])) {
4048 print_regdomain_info(rd);
4049 return -EINVAL;
4050 }
4051
4052 regd = reg_copy_regd(rd);
4053 if (IS_ERR(regd))
4054 return PTR_ERR(regd);
4055
4056 rdev = wiphy_to_rdev(wiphy);
4057
4058 spin_lock(®_requests_lock);
4059 prev_regd = rdev->requested_regd;
4060 rdev->requested_regd = regd;
4061 spin_unlock(®_requests_lock);
4062
4063 kfree(prev_regd);
4064 return 0;
4065 }
4066
4067 int regulatory_set_wiphy_regd(struct wiphy *wiphy,
4068 struct ieee80211_regdomain *rd)
4069 {
4070 int ret = __regulatory_set_wiphy_regd(wiphy, rd);
4071
4072 if (ret)
4073 return ret;
4074
4075 schedule_work(®_work);
4076 return 0;
4077 }
4078 EXPORT_SYMBOL(regulatory_set_wiphy_regd);
4079
4080 int regulatory_set_wiphy_regd_sync(struct wiphy *wiphy,
4081 struct ieee80211_regdomain *rd)
4082 {
4083 int ret;
4084
4085 ASSERT_RTNL();
4086
4087 ret = __regulatory_set_wiphy_regd(wiphy, rd);
4088 if (ret)
4089 return ret;
4090
4091
4092 reg_process_self_managed_hint(wiphy);
4093 reg_check_channels();
4094 return 0;
4095 }
4096 EXPORT_SYMBOL(regulatory_set_wiphy_regd_sync);
4097
4098 void wiphy_regulatory_register(struct wiphy *wiphy)
4099 {
4100 struct regulatory_request *lr = get_last_request();
4101
4102
4103 if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
4104 wiphy->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS |
4105 REGULATORY_COUNTRY_IE_IGNORE;
4106
4107
4108
4109
4110
4111
4112 if (lr->initiator == NL80211_REGDOM_SET_BY_USER)
4113 reg_call_notifier(wiphy, lr);
4114 }
4115
4116 if (!reg_dev_ignore_cell_hint(wiphy))
4117 reg_num_devs_support_basehint++;
4118
4119 wiphy_update_regulatory(wiphy, lr->initiator);
4120 wiphy_all_share_dfs_chan_state(wiphy);
4121 reg_process_self_managed_hints();
4122 }
4123
4124 void wiphy_regulatory_deregister(struct wiphy *wiphy)
4125 {
4126 struct wiphy *request_wiphy = NULL;
4127 struct regulatory_request *lr;
4128
4129 lr = get_last_request();
4130
4131 if (!reg_dev_ignore_cell_hint(wiphy))
4132 reg_num_devs_support_basehint--;
4133
4134 rcu_free_regdom(get_wiphy_regdom(wiphy));
4135 RCU_INIT_POINTER(wiphy->regd, NULL);
4136
4137 if (lr)
4138 request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
4139
4140 if (!request_wiphy || request_wiphy != wiphy)
4141 return;
4142
4143 lr->wiphy_idx = WIPHY_IDX_INVALID;
4144 lr->country_ie_env = ENVIRON_ANY;
4145 }
4146
4147
4148
4149
4150
4151
4152 int cfg80211_get_unii(int freq)
4153 {
4154
4155 if (freq >= 5150 && freq <= 5250)
4156 return 0;
4157
4158
4159 if (freq > 5250 && freq <= 5350)
4160 return 1;
4161
4162
4163 if (freq > 5350 && freq <= 5470)
4164 return 2;
4165
4166
4167 if (freq > 5470 && freq <= 5725)
4168 return 3;
4169
4170
4171 if (freq > 5725 && freq <= 5825)
4172 return 4;
4173
4174
4175 if (freq > 5925 && freq <= 6425)
4176 return 5;
4177
4178
4179 if (freq > 6425 && freq <= 6525)
4180 return 6;
4181
4182
4183 if (freq > 6525 && freq <= 6875)
4184 return 7;
4185
4186
4187 if (freq > 6875 && freq <= 7125)
4188 return 8;
4189
4190 return -EINVAL;
4191 }
4192
4193 bool regulatory_indoor_allowed(void)
4194 {
4195 return reg_is_indoor;
4196 }
4197
4198 bool regulatory_pre_cac_allowed(struct wiphy *wiphy)
4199 {
4200 const struct ieee80211_regdomain *regd = NULL;
4201 const struct ieee80211_regdomain *wiphy_regd = NULL;
4202 bool pre_cac_allowed = false;
4203
4204 rcu_read_lock();
4205
4206 regd = rcu_dereference(cfg80211_regdomain);
4207 wiphy_regd = rcu_dereference(wiphy->regd);
4208 if (!wiphy_regd) {
4209 if (regd->dfs_region == NL80211_DFS_ETSI)
4210 pre_cac_allowed = true;
4211
4212 rcu_read_unlock();
4213
4214 return pre_cac_allowed;
4215 }
4216
4217 if (regd->dfs_region == wiphy_regd->dfs_region &&
4218 wiphy_regd->dfs_region == NL80211_DFS_ETSI)
4219 pre_cac_allowed = true;
4220
4221 rcu_read_unlock();
4222
4223 return pre_cac_allowed;
4224 }
4225 EXPORT_SYMBOL(regulatory_pre_cac_allowed);
4226
4227 static void cfg80211_check_and_end_cac(struct cfg80211_registered_device *rdev)
4228 {
4229 struct wireless_dev *wdev;
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
4240 struct cfg80211_chan_def *chandef;
4241
4242 if (!wdev->cac_started)
4243 continue;
4244
4245
4246 chandef = wdev_chandef(wdev, 0);
4247 if (!chandef)
4248 continue;
4249
4250 if (!cfg80211_chandef_dfs_usable(&rdev->wiphy, chandef))
4251 rdev_end_cac(rdev, wdev->netdev);
4252 }
4253 }
4254
4255 void regulatory_propagate_dfs_state(struct wiphy *wiphy,
4256 struct cfg80211_chan_def *chandef,
4257 enum nl80211_dfs_state dfs_state,
4258 enum nl80211_radar_event event)
4259 {
4260 struct cfg80211_registered_device *rdev;
4261
4262 ASSERT_RTNL();
4263
4264 if (WARN_ON(!cfg80211_chandef_valid(chandef)))
4265 return;
4266
4267 list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
4268 if (wiphy == &rdev->wiphy)
4269 continue;
4270
4271 if (!reg_dfs_domain_same(wiphy, &rdev->wiphy))
4272 continue;
4273
4274 if (!ieee80211_get_channel(&rdev->wiphy,
4275 chandef->chan->center_freq))
4276 continue;
4277
4278 cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state);
4279
4280 if (event == NL80211_RADAR_DETECTED ||
4281 event == NL80211_RADAR_CAC_FINISHED) {
4282 cfg80211_sched_dfs_chan_update(rdev);
4283 cfg80211_check_and_end_cac(rdev);
4284 }
4285
4286 nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL);
4287 }
4288 }
4289
4290 static int __init regulatory_init_db(void)
4291 {
4292 int err;
4293
4294
4295
4296
4297
4298
4299
4300 if (IS_ERR_OR_NULL(reg_pdev))
4301 return -EINVAL;
4302
4303 err = load_builtin_regdb_keys();
4304 if (err)
4305 return err;
4306
4307
4308 err = regulatory_hint_core(cfg80211_world_regdom->alpha2);
4309 if (err) {
4310 if (err == -ENOMEM) {
4311 platform_device_unregister(reg_pdev);
4312 return err;
4313 }
4314
4315
4316
4317
4318
4319
4320
4321 pr_err("kobject_uevent_env() was unable to call CRDA during init\n");
4322 }
4323
4324
4325
4326
4327
4328 if (!is_world_regdom(ieee80211_regdom))
4329 regulatory_hint_user(ieee80211_regdom,
4330 NL80211_USER_REG_HINT_USER);
4331
4332 return 0;
4333 }
4334 #ifndef MODULE
4335 late_initcall(regulatory_init_db);
4336 #endif
4337
4338 int __init regulatory_init(void)
4339 {
4340 reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0);
4341 if (IS_ERR(reg_pdev))
4342 return PTR_ERR(reg_pdev);
4343
4344 rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
4345
4346 user_alpha2[0] = '9';
4347 user_alpha2[1] = '7';
4348
4349 #ifdef MODULE
4350 return regulatory_init_db();
4351 #else
4352 return 0;
4353 #endif
4354 }
4355
4356 void regulatory_exit(void)
4357 {
4358 struct regulatory_request *reg_request, *tmp;
4359 struct reg_beacon *reg_beacon, *btmp;
4360
4361 cancel_work_sync(®_work);
4362 cancel_crda_timeout_sync();
4363 cancel_delayed_work_sync(®_check_chans);
4364
4365
4366 rtnl_lock();
4367 reset_regdomains(true, NULL);
4368 rtnl_unlock();
4369
4370 dev_set_uevent_suppress(®_pdev->dev, true);
4371
4372 platform_device_unregister(reg_pdev);
4373
4374 list_for_each_entry_safe(reg_beacon, btmp, ®_pending_beacons, list) {
4375 list_del(®_beacon->list);
4376 kfree(reg_beacon);
4377 }
4378
4379 list_for_each_entry_safe(reg_beacon, btmp, ®_beacon_list, list) {
4380 list_del(®_beacon->list);
4381 kfree(reg_beacon);
4382 }
4383
4384 list_for_each_entry_safe(reg_request, tmp, ®_requests_list, list) {
4385 list_del(®_request->list);
4386 kfree(reg_request);
4387 }
4388
4389 if (!IS_ERR_OR_NULL(regdb))
4390 kfree(regdb);
4391 if (!IS_ERR_OR_NULL(cfg80211_user_regdom))
4392 kfree(cfg80211_user_regdom);
4393
4394 free_regdb_keyring();
4395 }