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