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 * Copyright 2013-2014  Intel Mobile Communications GmbH
   7 * Copyright      2017  Intel Deutschland GmbH
   8 * Copyright (C) 2018 - 2021 Intel Corporation
   9 *
  10 * Permission to use, copy, modify, and/or distribute this software for any
  11 * purpose with or without fee is hereby granted, provided that the above
  12 * copyright notice and this permission notice appear in all copies.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  15 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  16 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  17 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  18 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  19 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  20 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  21 */
  22
  23
  24/**
  25 * DOC: Wireless regulatory infrastructure
  26 *
  27 * The usual implementation is for a driver to read a device EEPROM to
  28 * determine which regulatory domain it should be operating under, then
  29 * looking up the allowable channels in a driver-local table and finally
  30 * registering those channels in the wiphy structure.
  31 *
  32 * Another set of compliance enforcement is for drivers to use their
  33 * own compliance limits which can be stored on the EEPROM. The host
  34 * driver or firmware may ensure these are used.
  35 *
  36 * In addition to all this we provide an extra layer of regulatory
  37 * conformance. For drivers which do not have any regulatory
  38 * information CRDA provides the complete regulatory solution.
  39 * For others it provides a community effort on further restrictions
  40 * to enhance compliance.
  41 *
  42 * Note: When number of rules --> infinity we will not be able to
  43 * index on alpha2 any more, instead we'll probably have to
  44 * rely on some SHA1 checksum of the regdomain for example.
  45 *
  46 */
  47
  48#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  49
  50#include <linux/kernel.h>
  51#include <linux/export.h>
  52#include <linux/slab.h>
  53#include <linux/list.h>
  54#include <linux/ctype.h>
  55#include <linux/nl80211.h>
  56#include <linux/platform_device.h>
  57#include <linux/verification.h>
  58#include <linux/moduleparam.h>
  59#include <linux/firmware.h>
  60#include <net/cfg80211.h>
  61#include "core.h"
  62#include "reg.h"
  63#include "rdev-ops.h"
  64#include "nl80211.h"
  65
  66/*
  67 * Grace period we give before making sure all current interfaces reside on
  68 * channels allowed by the current regulatory domain.
  69 */
  70#define REG_ENFORCE_GRACE_MS 60000
  71
  72/**
  73 * enum reg_request_treatment - regulatory request treatment
  74 *
  75 * @REG_REQ_OK: continue processing the regulatory request
  76 * @REG_REQ_IGNORE: ignore the regulatory request
  77 * @REG_REQ_INTERSECT: the regulatory domain resulting from this request should
  78 *      be intersected with the current one.
  79 * @REG_REQ_ALREADY_SET: the regulatory request will not change the current
  80 *      regulatory settings, and no further processing is required.
  81 */
  82enum reg_request_treatment {
  83        REG_REQ_OK,
  84        REG_REQ_IGNORE,
  85        REG_REQ_INTERSECT,
  86        REG_REQ_ALREADY_SET,
  87};
  88
  89static struct regulatory_request core_request_world = {
  90        .initiator = NL80211_REGDOM_SET_BY_CORE,
  91        .alpha2[0] = '0',
  92        .alpha2[1] = '0',
  93        .intersect = false,
  94        .processed = true,
  95        .country_ie_env = ENVIRON_ANY,
  96};
  97
  98/*
  99 * Receipt of information from last regulatory request,
 100 * protected by RTNL (and can be accessed with RCU protection)
 101 */
 102static struct regulatory_request __rcu *last_request =
 103        (void __force __rcu *)&core_request_world;
 104
 105/* To trigger userspace events and load firmware */
 106static struct platform_device *reg_pdev;
 107
 108/*
 109 * Central wireless core regulatory domains, we only need two,
 110 * the current one and a world regulatory domain in case we have no
 111 * information to give us an alpha2.
 112 * (protected by RTNL, can be read under RCU)
 113 */
 114const struct ieee80211_regdomain __rcu *cfg80211_regdomain;
 115
 116/*
 117 * Number of devices that registered to the core
 118 * that support cellular base station regulatory hints
 119 * (protected by RTNL)
 120 */
 121static int reg_num_devs_support_basehint;
 122
 123/*
 124 * State variable indicating if the platform on which the devices
 125 * are attached is operating in an indoor environment. The state variable
 126 * is relevant for all registered devices.
 127 */
 128static bool reg_is_indoor;
 129static DEFINE_SPINLOCK(reg_indoor_lock);
 130
 131/* Used to track the userspace process controlling the indoor setting */
 132static u32 reg_is_indoor_portid;
 133
 134static void restore_regulatory_settings(bool reset_user, bool cached);
 135static void print_regdomain(const struct ieee80211_regdomain *rd);
 136
 137static const struct ieee80211_regdomain *get_cfg80211_regdom(void)
 138{
 139        return rcu_dereference_rtnl(cfg80211_regdomain);
 140}
 141
 142/*
 143 * Returns the regulatory domain associated with the wiphy.
 144 *
 145 * Requires any of RTNL, wiphy mutex or RCU protection.
 146 */
 147const struct ieee80211_regdomain *get_wiphy_regdom(struct wiphy *wiphy)
 148{
 149        return rcu_dereference_check(wiphy->regd,
 150                                     lockdep_is_held(&wiphy->mtx) ||
 151                                     lockdep_rtnl_is_held());
 152}
 153EXPORT_SYMBOL(get_wiphy_regdom);
 154
 155static const char *reg_dfs_region_str(enum nl80211_dfs_regions dfs_region)
 156{
 157        switch (dfs_region) {
 158        case NL80211_DFS_UNSET:
 159                return "unset";
 160        case NL80211_DFS_FCC:
 161                return "FCC";
 162        case NL80211_DFS_ETSI:
 163                return "ETSI";
 164        case NL80211_DFS_JP:
 165                return "JP";
 166        }
 167        return "Unknown";
 168}
 169
 170enum nl80211_dfs_regions reg_get_dfs_region(struct wiphy *wiphy)
 171{
 172        const struct ieee80211_regdomain *regd = NULL;
 173        const struct ieee80211_regdomain *wiphy_regd = NULL;
 174
 175        rcu_read_lock();
 176        regd = get_cfg80211_regdom();
 177
 178        if (!wiphy)
 179                goto out;
 180
 181        wiphy_regd = get_wiphy_regdom(wiphy);
 182        if (!wiphy_regd)
 183                goto out;
 184
 185        if (wiphy_regd->dfs_region == regd->dfs_region)
 186                goto out;
 187
 188        pr_debug("%s: device specific dfs_region (%s) disagrees with cfg80211's central dfs_region (%s)\n",
 189                 dev_name(&wiphy->dev),
 190                 reg_dfs_region_str(wiphy_regd->dfs_region),
 191                 reg_dfs_region_str(regd->dfs_region));
 192
 193out:
 194        rcu_read_unlock();
 195
 196        return regd->dfs_region;
 197}
 198
 199static void rcu_free_regdom(const struct ieee80211_regdomain *r)
 200{
 201        if (!r)
 202                return;
 203        kfree_rcu((struct ieee80211_regdomain *)r, rcu_head);
 204}
 205
 206static struct regulatory_request *get_last_request(void)
 207{
 208        return rcu_dereference_rtnl(last_request);
 209}
 210
 211/* Used to queue up regulatory hints */
 212static LIST_HEAD(reg_requests_list);
 213static DEFINE_SPINLOCK(reg_requests_lock);
 214
 215/* Used to queue up beacon hints for review */
 216static LIST_HEAD(reg_pending_beacons);
 217static DEFINE_SPINLOCK(reg_pending_beacons_lock);
 218
 219/* Used to keep track of processed beacon hints */
 220static LIST_HEAD(reg_beacon_list);
 221
 222struct reg_beacon {
 223        struct list_head list;
 224        struct ieee80211_channel chan;
 225};
 226
 227static void reg_check_chans_work(struct work_struct *work);
 228static DECLARE_DELAYED_WORK(reg_check_chans, reg_check_chans_work);
 229
 230static void reg_todo(struct work_struct *work);
 231static DECLARE_WORK(reg_work, reg_todo);
 232
 233/* We keep a static world regulatory domain in case of the absence of CRDA */
 234static const struct ieee80211_regdomain world_regdom = {
 235        .n_reg_rules = 8,
 236        .alpha2 =  "00",
 237        .reg_rules = {
 238                /* IEEE 802.11b/g, channels 1..11 */
 239                REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
 240                /* IEEE 802.11b/g, channels 12..13. */
 241                REG_RULE(2467-10, 2472+10, 20, 6, 20,
 242                        NL80211_RRF_NO_IR | NL80211_RRF_AUTO_BW),
 243                /* IEEE 802.11 channel 14 - Only JP enables
 244                 * this and for 802.11b only */
 245                REG_RULE(2484-10, 2484+10, 20, 6, 20,
 246                        NL80211_RRF_NO_IR |
 247                        NL80211_RRF_NO_OFDM),
 248                /* IEEE 802.11a, channel 36..48 */
 249                REG_RULE(5180-10, 5240+10, 80, 6, 20,
 250                        NL80211_RRF_NO_IR |
 251                        NL80211_RRF_AUTO_BW),
 252
 253                /* IEEE 802.11a, channel 52..64 - DFS required */
 254                REG_RULE(5260-10, 5320+10, 80, 6, 20,
 255                        NL80211_RRF_NO_IR |
 256                        NL80211_RRF_AUTO_BW |
 257                        NL80211_RRF_DFS),
 258
 259                /* IEEE 802.11a, channel 100..144 - DFS required */
 260                REG_RULE(5500-10, 5720+10, 160, 6, 20,
 261                        NL80211_RRF_NO_IR |
 262                        NL80211_RRF_DFS),
 263
 264                /* IEEE 802.11a, channel 149..165 */
 265                REG_RULE(5745-10, 5825+10, 80, 6, 20,
 266                        NL80211_RRF_NO_IR),
 267
 268                /* IEEE 802.11ad (60GHz), channels 1..3 */
 269                REG_RULE(56160+2160*1-1080, 56160+2160*3+1080, 2160, 0, 0, 0),
 270        }
 271};
 272
 273/* protected by RTNL */
 274static const struct ieee80211_regdomain *cfg80211_world_regdom =
 275        &world_regdom;
 276
 277static char *ieee80211_regdom = "00";
 278static char user_alpha2[2];
 279static const struct ieee80211_regdomain *cfg80211_user_regdom;
 280
 281module_param(ieee80211_regdom, charp, 0444);
 282MODULE_PARM_DESC(ieee80211_regdom, "IEEE 802.11 regulatory domain code");
 283
 284static void reg_free_request(struct regulatory_request *request)
 285{
 286        if (request == &core_request_world)
 287                return;
 288
 289        if (request != get_last_request())
 290                kfree(request);
 291}
 292
 293static void reg_free_last_request(void)
 294{
 295        struct regulatory_request *lr = get_last_request();
 296
 297        if (lr != &core_request_world && lr)
 298                kfree_rcu(lr, rcu_head);
 299}
 300
 301static void reg_update_last_request(struct regulatory_request *request)
 302{
 303        struct regulatory_request *lr;
 304
 305        lr = get_last_request();
 306        if (lr == request)
 307                return;
 308
 309        reg_free_last_request();
 310        rcu_assign_pointer(last_request, request);
 311}
 312
 313static void reset_regdomains(bool full_reset,
 314                             const struct ieee80211_regdomain *new_regdom)
 315{
 316        const struct ieee80211_regdomain *r;
 317
 318        ASSERT_RTNL();
 319
 320        r = get_cfg80211_regdom();
 321
 322        /* avoid freeing static information or freeing something twice */
 323        if (r == cfg80211_world_regdom)
 324                r = NULL;
 325        if (cfg80211_world_regdom == &world_regdom)
 326                cfg80211_world_regdom = NULL;
 327        if (r == &world_regdom)
 328                r = NULL;
 329
 330        rcu_free_regdom(r);
 331        rcu_free_regdom(cfg80211_world_regdom);
 332
 333        cfg80211_world_regdom = &world_regdom;
 334        rcu_assign_pointer(cfg80211_regdomain, new_regdom);
 335
 336        if (!full_reset)
 337                return;
 338
 339        reg_update_last_request(&core_request_world);
 340}
 341
 342/*
 343 * Dynamic world regulatory domain requested by the wireless
 344 * core upon initialization
 345 */
 346static void update_world_regdomain(const struct ieee80211_regdomain *rd)
 347{
 348        struct regulatory_request *lr;
 349
 350        lr = get_last_request();
 351
 352        WARN_ON(!lr);
 353
 354        reset_regdomains(false, rd);
 355
 356        cfg80211_world_regdom = rd;
 357}
 358
 359bool is_world_regdom(const char *alpha2)
 360{
 361        if (!alpha2)
 362                return false;
 363        return alpha2[0] == '0' && alpha2[1] == '0';
 364}
 365
 366static bool is_alpha2_set(const char *alpha2)
 367{
 368        if (!alpha2)
 369                return false;
 370        return alpha2[0] && alpha2[1];
 371}
 372
 373static bool is_unknown_alpha2(const char *alpha2)
 374{
 375        if (!alpha2)
 376                return false;
 377        /*
 378         * Special case where regulatory domain was built by driver
 379         * but a specific alpha2 cannot be determined
 380         */
 381        return alpha2[0] == '9' && alpha2[1] == '9';
 382}
 383
 384static bool is_intersected_alpha2(const char *alpha2)
 385{
 386        if (!alpha2)
 387                return false;
 388        /*
 389         * Special case where regulatory domain is the
 390         * result of an intersection between two regulatory domain
 391         * structures
 392         */
 393        return alpha2[0] == '9' && alpha2[1] == '8';
 394}
 395
 396static bool is_an_alpha2(const char *alpha2)
 397{
 398        if (!alpha2)
 399                return false;
 400        return isalpha(alpha2[0]) && isalpha(alpha2[1]);
 401}
 402
 403static bool alpha2_equal(const char *alpha2_x, const char *alpha2_y)
 404{
 405        if (!alpha2_x || !alpha2_y)
 406                return false;
 407        return alpha2_x[0] == alpha2_y[0] && alpha2_x[1] == alpha2_y[1];
 408}
 409
 410static bool regdom_changes(const char *alpha2)
 411{
 412        const struct ieee80211_regdomain *r = get_cfg80211_regdom();
 413
 414        if (!r)
 415                return true;
 416        return !alpha2_equal(r->alpha2, alpha2);
 417}
 418
 419/*
 420 * The NL80211_REGDOM_SET_BY_USER regdom alpha2 is cached, this lets
 421 * you know if a valid regulatory hint with NL80211_REGDOM_SET_BY_USER
 422 * has ever been issued.
 423 */
 424static bool is_user_regdom_saved(void)
 425{
 426        if (user_alpha2[0] == '9' && user_alpha2[1] == '7')
 427                return false;
 428
 429        /* This would indicate a mistake on the design */
 430        if (WARN(!is_world_regdom(user_alpha2) && !is_an_alpha2(user_alpha2),
 431                 "Unexpected user alpha2: %c%c\n",
 432                 user_alpha2[0], user_alpha2[1]))
 433                return false;
 434
 435        return true;
 436}
 437
 438static const struct ieee80211_regdomain *
 439reg_copy_regd(const struct ieee80211_regdomain *src_regd)
 440{
 441        struct ieee80211_regdomain *regd;
 442        unsigned int i;
 443
 444        regd = kzalloc(struct_size(regd, reg_rules, src_regd->n_reg_rules),
 445                       GFP_KERNEL);
 446        if (!regd)
 447                return ERR_PTR(-ENOMEM);
 448
 449        memcpy(regd, src_regd, sizeof(struct ieee80211_regdomain));
 450
 451        for (i = 0; i < src_regd->n_reg_rules; i++)
 452                memcpy(&regd->reg_rules[i], &src_regd->reg_rules[i],
 453                       sizeof(struct ieee80211_reg_rule));
 454
 455        return regd;
 456}
 457
 458static void cfg80211_save_user_regdom(const struct ieee80211_regdomain *rd)
 459{
 460        ASSERT_RTNL();
 461
 462        if (!IS_ERR(cfg80211_user_regdom))
 463                kfree(cfg80211_user_regdom);
 464        cfg80211_user_regdom = reg_copy_regd(rd);
 465}
 466
 467struct reg_regdb_apply_request {
 468        struct list_head list;
 469        const struct ieee80211_regdomain *regdom;
 470};
 471
 472static LIST_HEAD(reg_regdb_apply_list);
 473static DEFINE_MUTEX(reg_regdb_apply_mutex);
 474
 475static void reg_regdb_apply(struct work_struct *work)
 476{
 477        struct reg_regdb_apply_request *request;
 478
 479        rtnl_lock();
 480
 481        mutex_lock(&reg_regdb_apply_mutex);
 482        while (!list_empty(&reg_regdb_apply_list)) {
 483                request = list_first_entry(&reg_regdb_apply_list,
 484                                           struct reg_regdb_apply_request,
 485                                           list);
 486                list_del(&request->list);
 487
 488                set_regdom(request->regdom, REGD_SOURCE_INTERNAL_DB);
 489                kfree(request);
 490        }
 491        mutex_unlock(&reg_regdb_apply_mutex);
 492
 493        rtnl_unlock();
 494}
 495
 496static DECLARE_WORK(reg_regdb_work, reg_regdb_apply);
 497
 498static int reg_schedule_apply(const struct ieee80211_regdomain *regdom)
 499{
 500        struct reg_regdb_apply_request *request;
 501
 502        request = kzalloc(sizeof(struct reg_regdb_apply_request), GFP_KERNEL);
 503        if (!request) {
 504                kfree(regdom);
 505                return -ENOMEM;
 506        }
 507
 508        request->regdom = regdom;
 509
 510        mutex_lock(&reg_regdb_apply_mutex);
 511        list_add_tail(&request->list, &reg_regdb_apply_list);
 512        mutex_unlock(&reg_regdb_apply_mutex);
 513
 514        schedule_work(&reg_regdb_work);
 515        return 0;
 516}
 517
 518#ifdef CONFIG_CFG80211_CRDA_SUPPORT
 519/* Max number of consecutive attempts to communicate with CRDA  */
 520#define REG_MAX_CRDA_TIMEOUTS 10
 521
 522static u32 reg_crda_timeouts;
 523
 524static void crda_timeout_work(struct work_struct *work);
 525static DECLARE_DELAYED_WORK(crda_timeout, crda_timeout_work);
 526
 527static void crda_timeout_work(struct work_struct *work)
 528{
 529        pr_debug("Timeout while waiting for CRDA to reply, restoring regulatory settings\n");
 530        rtnl_lock();
 531        reg_crda_timeouts++;
 532        restore_regulatory_settings(true, false);
 533        rtnl_unlock();
 534}
 535
 536static void cancel_crda_timeout(void)
 537{
 538        cancel_delayed_work(&crda_timeout);
 539}
 540
 541static void cancel_crda_timeout_sync(void)
 542{
 543        cancel_delayed_work_sync(&crda_timeout);
 544}
 545
 546static void reset_crda_timeouts(void)
 547{
 548        reg_crda_timeouts = 0;
 549}
 550
 551/*
 552 * This lets us keep regulatory code which is updated on a regulatory
 553 * basis in userspace.
 554 */
 555static int call_crda(const char *alpha2)
 556{
 557        char country[12];
 558        char *env[] = { country, NULL };
 559        int ret;
 560
 561        snprintf(country, sizeof(country), "COUNTRY=%c%c",
 562                 alpha2[0], alpha2[1]);
 563
 564        if (reg_crda_timeouts > REG_MAX_CRDA_TIMEOUTS) {
 565                pr_debug("Exceeded CRDA call max attempts. Not calling CRDA\n");
 566                return -EINVAL;
 567        }
 568
 569        if (!is_world_regdom((char *) alpha2))
 570                pr_debug("Calling CRDA for country: %c%c\n",
 571                         alpha2[0], alpha2[1]);
 572        else
 573                pr_debug("Calling CRDA to update world regulatory domain\n");
 574
 575        ret = kobject_uevent_env(&reg_pdev->dev.kobj, KOBJ_CHANGE, env);
 576        if (ret)
 577                return ret;
 578
 579        queue_delayed_work(system_power_efficient_wq,
 580                           &crda_timeout, msecs_to_jiffies(3142));
 581        return 0;
 582}
 583#else
 584static inline void cancel_crda_timeout(void) {}
 585static inline void cancel_crda_timeout_sync(void) {}
 586static inline void reset_crda_timeouts(void) {}
 587static inline int call_crda(const char *alpha2)
 588{
 589        return -ENODATA;
 590}
 591#endif /* CONFIG_CFG80211_CRDA_SUPPORT */
 592
 593/* code to directly load a firmware database through request_firmware */
 594static const struct fwdb_header *regdb;
 595
 596struct fwdb_country {
 597        u8 alpha2[2];
 598        __be16 coll_ptr;
 599        /* this struct cannot be extended */
 600} __packed __aligned(4);
 601
 602struct fwdb_collection {
 603        u8 len;
 604        u8 n_rules;
 605        u8 dfs_region;
 606        /* no optional data yet */
 607        /* aligned to 2, then followed by __be16 array of rule pointers */
 608} __packed __aligned(4);
 609
 610enum fwdb_flags {
 611        FWDB_FLAG_NO_OFDM       = BIT(0),
 612        FWDB_FLAG_NO_OUTDOOR    = BIT(1),
 613        FWDB_FLAG_DFS           = BIT(2),
 614        FWDB_FLAG_NO_IR         = BIT(3),
 615        FWDB_FLAG_AUTO_BW       = BIT(4),
 616};
 617
 618struct fwdb_wmm_ac {
 619        u8 ecw;
 620        u8 aifsn;
 621        __be16 cot;
 622} __packed;
 623
 624struct fwdb_wmm_rule {
 625        struct fwdb_wmm_ac client[IEEE80211_NUM_ACS];
 626        struct fwdb_wmm_ac ap[IEEE80211_NUM_ACS];
 627} __packed;
 628
 629struct fwdb_rule {
 630        u8 len;
 631        u8 flags;
 632        __be16 max_eirp;
 633        __be32 start, end, max_bw;
 634        /* start of optional data */
 635        __be16 cac_timeout;
 636        __be16 wmm_ptr;
 637} __packed __aligned(4);
 638
 639#define FWDB_MAGIC 0x52474442
 640#define FWDB_VERSION 20
 641
 642struct fwdb_header {
 643        __be32 magic;
 644        __be32 version;
 645        struct fwdb_country country[];
 646} __packed __aligned(4);
 647
 648static int ecw2cw(int ecw)
 649{
 650        return (1 << ecw) - 1;
 651}
 652
 653static bool valid_wmm(struct fwdb_wmm_rule *rule)
 654{
 655        struct fwdb_wmm_ac *ac = (struct fwdb_wmm_ac *)rule;
 656        int i;
 657
 658        for (i = 0; i < IEEE80211_NUM_ACS * 2; i++) {
 659                u16 cw_min = ecw2cw((ac[i].ecw & 0xf0) >> 4);
 660                u16 cw_max = ecw2cw(ac[i].ecw & 0x0f);
 661                u8 aifsn = ac[i].aifsn;
 662
 663                if (cw_min >= cw_max)
 664                        return false;
 665
 666                if (aifsn < 1)
 667                        return false;
 668        }
 669
 670        return true;
 671}
 672
 673static bool valid_rule(const u8 *data, unsigned int size, u16 rule_ptr)
 674{
 675        struct fwdb_rule *rule = (void *)(data + (rule_ptr << 2));
 676
 677        if ((u8 *)rule + sizeof(rule->len) > data + size)
 678                return false;
 679
 680        /* mandatory fields */
 681        if (rule->len < offsetofend(struct fwdb_rule, max_bw))
 682                return false;
 683        if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr)) {
 684                u32 wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2;
 685                struct fwdb_wmm_rule *wmm;
 686
 687                if (wmm_ptr + sizeof(struct fwdb_wmm_rule) > size)
 688                        return false;
 689
 690                wmm = (void *)(data + wmm_ptr);
 691
 692                if (!valid_wmm(wmm))
 693                        return false;
 694        }
 695        return true;
 696}
 697
 698static bool valid_country(const u8 *data, unsigned int size,
 699                          const struct fwdb_country *country)
 700{
 701        unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
 702        struct fwdb_collection *coll = (void *)(data + ptr);
 703        __be16 *rules_ptr;
 704        unsigned int i;
 705
 706        /* make sure we can read len/n_rules */
 707        if ((u8 *)coll + offsetofend(typeof(*coll), n_rules) > data + size)
 708                return false;
 709
 710        /* make sure base struct and all rules fit */
 711        if ((u8 *)coll + ALIGN(coll->len, 2) +
 712            (coll->n_rules * 2) > data + size)
 713                return false;
 714
 715        /* mandatory fields must exist */
 716        if (coll->len < offsetofend(struct fwdb_collection, dfs_region))
 717                return false;
 718
 719        rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
 720
 721        for (i = 0; i < coll->n_rules; i++) {
 722                u16 rule_ptr = be16_to_cpu(rules_ptr[i]);
 723
 724                if (!valid_rule(data, size, rule_ptr))
 725                        return false;
 726        }
 727
 728        return true;
 729}
 730
 731#ifdef CONFIG_CFG80211_REQUIRE_SIGNED_REGDB
 732static struct key *builtin_regdb_keys;
 733
 734static void __init load_keys_from_buffer(const u8 *p, unsigned int buflen)
 735{
 736        const u8 *end = p + buflen;
 737        size_t plen;
 738        key_ref_t key;
 739
 740        while (p < end) {
 741                /* Each cert begins with an ASN.1 SEQUENCE tag and must be more
 742                 * than 256 bytes in size.
 743                 */
 744                if (end - p < 4)
 745                        goto dodgy_cert;
 746                if (p[0] != 0x30 &&
 747                    p[1] != 0x82)
 748                        goto dodgy_cert;
 749                plen = (p[2] << 8) | p[3];
 750                plen += 4;
 751                if (plen > end - p)
 752                        goto dodgy_cert;
 753
 754                key = key_create_or_update(make_key_ref(builtin_regdb_keys, 1),
 755                                           "asymmetric", NULL, p, plen,
 756                                           ((KEY_POS_ALL & ~KEY_POS_SETATTR) |
 757                                            KEY_USR_VIEW | KEY_USR_READ),
 758                                           KEY_ALLOC_NOT_IN_QUOTA |
 759                                           KEY_ALLOC_BUILT_IN |
 760                                           KEY_ALLOC_BYPASS_RESTRICTION);
 761                if (IS_ERR(key)) {
 762                        pr_err("Problem loading in-kernel X.509 certificate (%ld)\n",
 763                               PTR_ERR(key));
 764                } else {
 765                        pr_notice("Loaded X.509 cert '%s'\n",
 766                                  key_ref_to_ptr(key)->description);
 767                        key_ref_put(key);
 768                }
 769                p += plen;
 770        }
 771
 772        return;
 773
 774dodgy_cert:
 775        pr_err("Problem parsing in-kernel X.509 certificate list\n");
 776}
 777
 778static int __init load_builtin_regdb_keys(void)
 779{
 780        builtin_regdb_keys =
 781                keyring_alloc(".builtin_regdb_keys",
 782                              KUIDT_INIT(0), KGIDT_INIT(0), current_cred(),
 783                              ((KEY_POS_ALL & ~KEY_POS_SETATTR) |
 784                              KEY_USR_VIEW | KEY_USR_READ | KEY_USR_SEARCH),
 785                              KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
 786        if (IS_ERR(builtin_regdb_keys))
 787                return PTR_ERR(builtin_regdb_keys);
 788
 789        pr_notice("Loading compiled-in X.509 certificates for regulatory database\n");
 790
 791#ifdef CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS
 792        load_keys_from_buffer(shipped_regdb_certs, shipped_regdb_certs_len);
 793#endif
 794#ifdef CONFIG_CFG80211_EXTRA_REGDB_KEYDIR
 795        if (CONFIG_CFG80211_EXTRA_REGDB_KEYDIR[0] != '\0')
 796                load_keys_from_buffer(extra_regdb_certs, extra_regdb_certs_len);
 797#endif
 798
 799        return 0;
 800}
 801
 802static bool regdb_has_valid_signature(const u8 *data, unsigned int size)
 803{
 804        const struct firmware *sig;
 805        bool result;
 806
 807        if (request_firmware(&sig, "regulatory.db.p7s", &reg_pdev->dev))
 808                return false;
 809
 810        result = verify_pkcs7_signature(data, size, sig->data, sig->size,
 811                                        builtin_regdb_keys,
 812                                        VERIFYING_UNSPECIFIED_SIGNATURE,
 813                                        NULL, NULL) == 0;
 814
 815        release_firmware(sig);
 816
 817        return result;
 818}
 819
 820static void free_regdb_keyring(void)
 821{
 822        key_put(builtin_regdb_keys);
 823}
 824#else
 825static int load_builtin_regdb_keys(void)
 826{
 827        return 0;
 828}
 829
 830static bool regdb_has_valid_signature(const u8 *data, unsigned int size)
 831{
 832        return true;
 833}
 834
 835static void free_regdb_keyring(void)
 836{
 837}
 838#endif /* CONFIG_CFG80211_REQUIRE_SIGNED_REGDB */
 839
 840static bool valid_regdb(const u8 *data, unsigned int size)
 841{
 842        const struct fwdb_header *hdr = (void *)data;
 843        const struct fwdb_country *country;
 844
 845        if (size < sizeof(*hdr))
 846                return false;
 847
 848        if (hdr->magic != cpu_to_be32(FWDB_MAGIC))
 849                return false;
 850
 851        if (hdr->version != cpu_to_be32(FWDB_VERSION))
 852                return false;
 853
 854        if (!regdb_has_valid_signature(data, size))
 855                return false;
 856
 857        country = &hdr->country[0];
 858        while ((u8 *)(country + 1) <= data + size) {
 859                if (!country->coll_ptr)
 860                        break;
 861                if (!valid_country(data, size, country))
 862                        return false;
 863                country++;
 864        }
 865
 866        return true;
 867}
 868
 869static void set_wmm_rule(const struct fwdb_header *db,
 870                         const struct fwdb_country *country,
 871                         const struct fwdb_rule *rule,
 872                         struct ieee80211_reg_rule *rrule)
 873{
 874        struct ieee80211_wmm_rule *wmm_rule = &rrule->wmm_rule;
 875        struct fwdb_wmm_rule *wmm;
 876        unsigned int i, wmm_ptr;
 877
 878        wmm_ptr = be16_to_cpu(rule->wmm_ptr) << 2;
 879        wmm = (void *)((u8 *)db + wmm_ptr);
 880
 881        if (!valid_wmm(wmm)) {
 882                pr_err("Invalid regulatory WMM rule %u-%u in domain %c%c\n",
 883                       be32_to_cpu(rule->start), be32_to_cpu(rule->end),
 884                       country->alpha2[0], country->alpha2[1]);
 885                return;
 886        }
 887
 888        for (i = 0; i < IEEE80211_NUM_ACS; i++) {
 889                wmm_rule->client[i].cw_min =
 890                        ecw2cw((wmm->client[i].ecw & 0xf0) >> 4);
 891                wmm_rule->client[i].cw_max = ecw2cw(wmm->client[i].ecw & 0x0f);
 892                wmm_rule->client[i].aifsn =  wmm->client[i].aifsn;
 893                wmm_rule->client[i].cot =
 894                        1000 * be16_to_cpu(wmm->client[i].cot);
 895                wmm_rule->ap[i].cw_min = ecw2cw((wmm->ap[i].ecw & 0xf0) >> 4);
 896                wmm_rule->ap[i].cw_max = ecw2cw(wmm->ap[i].ecw & 0x0f);
 897                wmm_rule->ap[i].aifsn = wmm->ap[i].aifsn;
 898                wmm_rule->ap[i].cot = 1000 * be16_to_cpu(wmm->ap[i].cot);
 899        }
 900
 901        rrule->has_wmm = true;
 902}
 903
 904static int __regdb_query_wmm(const struct fwdb_header *db,
 905                             const struct fwdb_country *country, int freq,
 906                             struct ieee80211_reg_rule *rrule)
 907{
 908        unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
 909        struct fwdb_collection *coll = (void *)((u8 *)db + ptr);
 910        int i;
 911
 912        for (i = 0; i < coll->n_rules; i++) {
 913                __be16 *rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
 914                unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2;
 915                struct fwdb_rule *rule = (void *)((u8 *)db + rule_ptr);
 916
 917                if (rule->len < offsetofend(struct fwdb_rule, wmm_ptr))
 918                        continue;
 919
 920                if (freq >= KHZ_TO_MHZ(be32_to_cpu(rule->start)) &&
 921                    freq <= KHZ_TO_MHZ(be32_to_cpu(rule->end))) {
 922                        set_wmm_rule(db, country, rule, rrule);
 923                        return 0;
 924                }
 925        }
 926
 927        return -ENODATA;
 928}
 929
 930int reg_query_regdb_wmm(char *alpha2, int freq, struct ieee80211_reg_rule *rule)
 931{
 932        const struct fwdb_header *hdr = regdb;
 933        const struct fwdb_country *country;
 934
 935        if (!regdb)
 936                return -ENODATA;
 937
 938        if (IS_ERR(regdb))
 939                return PTR_ERR(regdb);
 940
 941        country = &hdr->country[0];
 942        while (country->coll_ptr) {
 943                if (alpha2_equal(alpha2, country->alpha2))
 944                        return __regdb_query_wmm(regdb, country, freq, rule);
 945
 946                country++;
 947        }
 948
 949        return -ENODATA;
 950}
 951EXPORT_SYMBOL(reg_query_regdb_wmm);
 952
 953static int regdb_query_country(const struct fwdb_header *db,
 954                               const struct fwdb_country *country)
 955{
 956        unsigned int ptr = be16_to_cpu(country->coll_ptr) << 2;
 957        struct fwdb_collection *coll = (void *)((u8 *)db + ptr);
 958        struct ieee80211_regdomain *regdom;
 959        unsigned int i;
 960
 961        regdom = kzalloc(struct_size(regdom, reg_rules, coll->n_rules),
 962                         GFP_KERNEL);
 963        if (!regdom)
 964                return -ENOMEM;
 965
 966        regdom->n_reg_rules = coll->n_rules;
 967        regdom->alpha2[0] = country->alpha2[0];
 968        regdom->alpha2[1] = country->alpha2[1];
 969        regdom->dfs_region = coll->dfs_region;
 970
 971        for (i = 0; i < regdom->n_reg_rules; i++) {
 972                __be16 *rules_ptr = (void *)((u8 *)coll + ALIGN(coll->len, 2));
 973                unsigned int rule_ptr = be16_to_cpu(rules_ptr[i]) << 2;
 974                struct fwdb_rule *rule = (void *)((u8 *)db + rule_ptr);
 975                struct ieee80211_reg_rule *rrule = &regdom->reg_rules[i];
 976
 977                rrule->freq_range.start_freq_khz = be32_to_cpu(rule->start);
 978                rrule->freq_range.end_freq_khz = be32_to_cpu(rule->end);
 979                rrule->freq_range.max_bandwidth_khz = be32_to_cpu(rule->max_bw);
 980
 981                rrule->power_rule.max_antenna_gain = 0;
 982                rrule->power_rule.max_eirp = be16_to_cpu(rule->max_eirp);
 983
 984                rrule->flags = 0;
 985                if (rule->flags & FWDB_FLAG_NO_OFDM)
 986                        rrule->flags |= NL80211_RRF_NO_OFDM;
 987                if (rule->flags & FWDB_FLAG_NO_OUTDOOR)
 988                        rrule->flags |= NL80211_RRF_NO_OUTDOOR;
 989                if (rule->flags & FWDB_FLAG_DFS)
 990                        rrule->flags |= NL80211_RRF_DFS;
 991                if (rule->flags & FWDB_FLAG_NO_IR)
 992                        rrule->flags |= NL80211_RRF_NO_IR;
 993                if (rule->flags & FWDB_FLAG_AUTO_BW)
 994                        rrule->flags |= NL80211_RRF_AUTO_BW;
 995
 996                rrule->dfs_cac_ms = 0;
 997
 998                /* handle optional data */
 999                if (rule->len >= offsetofend(struct fwdb_rule, cac_timeout))
1000                        rrule->dfs_cac_ms =
1001                                1000 * be16_to_cpu(rule->cac_timeout);
1002                if (rule->len >= offsetofend(struct fwdb_rule, wmm_ptr))
1003                        set_wmm_rule(db, country, rule, rrule);
1004        }
1005
1006        return reg_schedule_apply(regdom);
1007}
1008
1009static int query_regdb(const char *alpha2)
1010{
1011        const struct fwdb_header *hdr = regdb;
1012        const struct fwdb_country *country;
1013
1014        ASSERT_RTNL();
1015
1016        if (IS_ERR(regdb))
1017                return PTR_ERR(regdb);
1018
1019        country = &hdr->country[0];
1020        while (country->coll_ptr) {
1021                if (alpha2_equal(alpha2, country->alpha2))
1022                        return regdb_query_country(regdb, country);
1023                country++;
1024        }
1025
1026        return -ENODATA;
1027}
1028
1029static void regdb_fw_cb(const struct firmware *fw, void *context)
1030{
1031        int set_error = 0;
1032        bool restore = true;
1033        void *db;
1034
1035        if (!fw) {
1036                pr_info("failed to load regulatory.db\n");
1037                set_error = -ENODATA;
1038        } else if (!valid_regdb(fw->data, fw->size)) {
1039                pr_info("loaded regulatory.db is malformed or signature is missing/invalid\n");
1040                set_error = -EINVAL;
1041        }
1042
1043        rtnl_lock();
1044        if (regdb && !IS_ERR(regdb)) {
1045                /* negative case - a bug
1046                 * positive case - can happen due to race in case of multiple cb's in
1047                 * queue, due to usage of asynchronous callback
1048                 *
1049                 * Either case, just restore and free new db.
1050                 */
1051        } else if (set_error) {
1052                regdb = ERR_PTR(set_error);
1053        } else if (fw) {
1054                db = kmemdup(fw->data, fw->size, GFP_KERNEL);
1055                if (db) {
1056                        regdb = db;
1057                        restore = context && query_regdb(context);
1058                } else {
1059                        restore = true;
1060                }
1061        }
1062
1063        if (restore)
1064                restore_regulatory_settings(true, false);
1065
1066        rtnl_unlock();
1067
1068        kfree(context);
1069
1070        release_firmware(fw);
1071}
1072
1073static int query_regdb_file(const char *alpha2)
1074{
1075        ASSERT_RTNL();
1076
1077        if (regdb)
1078                return query_regdb(alpha2);
1079
1080        alpha2 = kmemdup(alpha2, 2, GFP_KERNEL);
1081        if (!alpha2)
1082                return -ENOMEM;
1083
1084        return request_firmware_nowait(THIS_MODULE, true, "regulatory.db",
1085                                       &reg_pdev->dev, GFP_KERNEL,
1086                                       (void *)alpha2, regdb_fw_cb);
1087}
1088
1089int reg_reload_regdb(void)
1090{
1091        const struct firmware *fw;
1092        void *db;
1093        int err;
1094
1095        err = request_firmware(&fw, "regulatory.db", &reg_pdev->dev);
1096        if (err)
1097                return err;
1098
1099        if (!valid_regdb(fw->data, fw->size)) {
1100                err = -ENODATA;
1101                goto out;
1102        }
1103
1104        db = kmemdup(fw->data, fw->size, GFP_KERNEL);
1105        if (!db) {
1106                err = -ENOMEM;
1107                goto out;
1108        }
1109
1110        rtnl_lock();
1111        if (!IS_ERR_OR_NULL(regdb))
1112                kfree(regdb);
1113        regdb = db;
1114        rtnl_unlock();
1115
1116 out:
1117        release_firmware(fw);
1118        return err;
1119}
1120
1121static bool reg_query_database(struct regulatory_request *request)
1122{
1123        if (query_regdb_file(request->alpha2) == 0)
1124                return true;
1125
1126        if (call_crda(request->alpha2) == 0)
1127                return true;
1128
1129        return false;
1130}
1131
1132bool reg_is_valid_request(const char *alpha2)
1133{
1134        struct regulatory_request *lr = get_last_request();
1135
1136        if (!lr || lr->processed)
1137                return false;
1138
1139        return alpha2_equal(lr->alpha2, alpha2);
1140}
1141
1142static const struct ieee80211_regdomain *reg_get_regdomain(struct wiphy *wiphy)
1143{
1144        struct regulatory_request *lr = get_last_request();
1145
1146        /*
1147         * Follow the driver's regulatory domain, if present, unless a country
1148         * IE has been processed or a user wants to help complaince further
1149         */
1150        if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1151            lr->initiator != NL80211_REGDOM_SET_BY_USER &&
1152            wiphy->regd)
1153                return get_wiphy_regdom(wiphy);
1154
1155        return get_cfg80211_regdom();
1156}
1157
1158static unsigned int
1159reg_get_max_bandwidth_from_range(const struct ieee80211_regdomain *rd,
1160                                 const struct ieee80211_reg_rule *rule)
1161{
1162        const struct ieee80211_freq_range *freq_range = &rule->freq_range;
1163        const struct ieee80211_freq_range *freq_range_tmp;
1164        const struct ieee80211_reg_rule *tmp;
1165        u32 start_freq, end_freq, idx, no;
1166
1167        for (idx = 0; idx < rd->n_reg_rules; idx++)
1168                if (rule == &rd->reg_rules[idx])
1169                        break;
1170
1171        if (idx == rd->n_reg_rules)
1172                return 0;
1173
1174        /* get start_freq */
1175        no = idx;
1176
1177        while (no) {
1178                tmp = &rd->reg_rules[--no];
1179                freq_range_tmp = &tmp->freq_range;
1180
1181                if (freq_range_tmp->end_freq_khz < freq_range->start_freq_khz)
1182                        break;
1183
1184                freq_range = freq_range_tmp;
1185        }
1186
1187        start_freq = freq_range->start_freq_khz;
1188
1189        /* get end_freq */
1190        freq_range = &rule->freq_range;
1191        no = idx;
1192
1193        while (no < rd->n_reg_rules - 1) {
1194                tmp = &rd->reg_rules[++no];
1195                freq_range_tmp = &tmp->freq_range;
1196
1197                if (freq_range_tmp->start_freq_khz > freq_range->end_freq_khz)
1198                        break;
1199
1200                freq_range = freq_range_tmp;
1201        }
1202
1203        end_freq = freq_range->end_freq_khz;
1204
1205        return end_freq - start_freq;
1206}
1207
1208unsigned int reg_get_max_bandwidth(const struct ieee80211_regdomain *rd,
1209                                   const struct ieee80211_reg_rule *rule)
1210{
1211        unsigned int bw = reg_get_max_bandwidth_from_range(rd, rule);
1212
1213        if (rule->flags & NL80211_RRF_NO_160MHZ)
1214                bw = min_t(unsigned int, bw, MHZ_TO_KHZ(80));
1215        if (rule->flags & NL80211_RRF_NO_80MHZ)
1216                bw = min_t(unsigned int, bw, MHZ_TO_KHZ(40));
1217
1218        /*
1219         * HT40+/HT40- limits are handled per-channel. Only limit BW if both
1220         * are not allowed.
1221         */
1222        if (rule->flags & NL80211_RRF_NO_HT40MINUS &&
1223            rule->flags & NL80211_RRF_NO_HT40PLUS)
1224                bw = min_t(unsigned int, bw, MHZ_TO_KHZ(20));
1225
1226        return bw;
1227}
1228
1229/* Sanity check on a regulatory rule */
1230static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)
1231{
1232        const struct ieee80211_freq_range *freq_range = &rule->freq_range;
1233        u32 freq_diff;
1234
1235        if (freq_range->start_freq_khz <= 0 || freq_range->end_freq_khz <= 0)
1236                return false;
1237
1238        if (freq_range->start_freq_khz > freq_range->end_freq_khz)
1239                return false;
1240
1241        freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
1242
1243        if (freq_range->end_freq_khz <= freq_range->start_freq_khz ||
1244            freq_range->max_bandwidth_khz > freq_diff)
1245                return false;
1246
1247        return true;
1248}
1249
1250static bool is_valid_rd(const struct ieee80211_regdomain *rd)
1251{
1252        const struct ieee80211_reg_rule *reg_rule = NULL;
1253        unsigned int i;
1254
1255        if (!rd->n_reg_rules)
1256                return false;
1257
1258        if (WARN_ON(rd->n_reg_rules > NL80211_MAX_SUPP_REG_RULES))
1259                return false;
1260
1261        for (i = 0; i < rd->n_reg_rules; i++) {
1262                reg_rule = &rd->reg_rules[i];
1263                if (!is_valid_reg_rule(reg_rule))
1264                        return false;
1265        }
1266
1267        return true;
1268}
1269
1270/**
1271 * freq_in_rule_band - tells us if a frequency is in a frequency band
1272 * @freq_range: frequency rule we want to query
1273 * @freq_khz: frequency we are inquiring about
1274 *
1275 * This lets us know if a specific frequency rule is or is not relevant to
1276 * a specific frequency's band. Bands are device specific and artificial
1277 * definitions (the "2.4 GHz band", the "5 GHz band" and the "60GHz band"),
1278 * however it is safe for now to assume that a frequency rule should not be
1279 * part of a frequency's band if the start freq or end freq are off by more
1280 * than 2 GHz for the 2.4 and 5 GHz bands, and by more than 20 GHz for the
1281 * 60 GHz band.
1282 * This resolution can be lowered and should be considered as we add
1283 * regulatory rule support for other "bands".
1284 **/
1285static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range,
1286                              u32 freq_khz)
1287{
1288#define ONE_GHZ_IN_KHZ  1000000
1289        /*
1290         * From 802.11ad: directional multi-gigabit (DMG):
1291         * Pertaining to operation in a frequency band containing a channel
1292         * with the Channel starting frequency above 45 GHz.
1293         */
1294        u32 limit = freq_khz > 45 * ONE_GHZ_IN_KHZ ?
1295                        20 * ONE_GHZ_IN_KHZ : 2 * ONE_GHZ_IN_KHZ;
1296        if (abs(freq_khz - freq_range->start_freq_khz) <= limit)
1297                return true;
1298        if (abs(freq_khz - freq_range->end_freq_khz) <= limit)
1299                return true;
1300        return false;
1301#undef ONE_GHZ_IN_KHZ
1302}
1303
1304/*
1305 * Later on we can perhaps use the more restrictive DFS
1306 * region but we don't have information for that yet so
1307 * for now simply disallow conflicts.
1308 */
1309static enum nl80211_dfs_regions
1310reg_intersect_dfs_region(const enum nl80211_dfs_regions dfs_region1,
1311                         const enum nl80211_dfs_regions dfs_region2)
1312{
1313        if (dfs_region1 != dfs_region2)
1314                return NL80211_DFS_UNSET;
1315        return dfs_region1;
1316}
1317
1318static void reg_wmm_rules_intersect(const struct ieee80211_wmm_ac *wmm_ac1,
1319                                    const struct ieee80211_wmm_ac *wmm_ac2,
1320                                    struct ieee80211_wmm_ac *intersect)
1321{
1322        intersect->cw_min = max_t(u16, wmm_ac1->cw_min, wmm_ac2->cw_min);
1323        intersect->cw_max = max_t(u16, wmm_ac1->cw_max, wmm_ac2->cw_max);
1324        intersect->cot = min_t(u16, wmm_ac1->cot, wmm_ac2->cot);
1325        intersect->aifsn = max_t(u8, wmm_ac1->aifsn, wmm_ac2->aifsn);
1326}
1327
1328/*
1329 * Helper for regdom_intersect(), this does the real
1330 * mathematical intersection fun
1331 */
1332static int reg_rules_intersect(const struct ieee80211_regdomain *rd1,
1333                               const struct ieee80211_regdomain *rd2,
1334                               const struct ieee80211_reg_rule *rule1,
1335                               const struct ieee80211_reg_rule *rule2,
1336                               struct ieee80211_reg_rule *intersected_rule)
1337{
1338        const struct ieee80211_freq_range *freq_range1, *freq_range2;
1339        struct ieee80211_freq_range *freq_range;
1340        const struct ieee80211_power_rule *power_rule1, *power_rule2;
1341        struct ieee80211_power_rule *power_rule;
1342        const struct ieee80211_wmm_rule *wmm_rule1, *wmm_rule2;
1343        struct ieee80211_wmm_rule *wmm_rule;
1344        u32 freq_diff, max_bandwidth1, max_bandwidth2;
1345
1346        freq_range1 = &rule1->freq_range;
1347        freq_range2 = &rule2->freq_range;
1348        freq_range = &intersected_rule->freq_range;
1349
1350        power_rule1 = &rule1->power_rule;
1351        power_rule2 = &rule2->power_rule;
1352        power_rule = &intersected_rule->power_rule;
1353
1354        wmm_rule1 = &rule1->wmm_rule;
1355        wmm_rule2 = &rule2->wmm_rule;
1356        wmm_rule = &intersected_rule->wmm_rule;
1357
1358        freq_range->start_freq_khz = max(freq_range1->start_freq_khz,
1359                                         freq_range2->start_freq_khz);
1360        freq_range->end_freq_khz = min(freq_range1->end_freq_khz,
1361                                       freq_range2->end_freq_khz);
1362
1363        max_bandwidth1 = freq_range1->max_bandwidth_khz;
1364        max_bandwidth2 = freq_range2->max_bandwidth_khz;
1365
1366        if (rule1->flags & NL80211_RRF_AUTO_BW)
1367                max_bandwidth1 = reg_get_max_bandwidth(rd1, rule1);
1368        if (rule2->flags & NL80211_RRF_AUTO_BW)
1369                max_bandwidth2 = reg_get_max_bandwidth(rd2, rule2);
1370
1371        freq_range->max_bandwidth_khz = min(max_bandwidth1, max_bandwidth2);
1372
1373        intersected_rule->flags = rule1->flags | rule2->flags;
1374
1375        /*
1376         * In case NL80211_RRF_AUTO_BW requested for both rules
1377         * set AUTO_BW in intersected rule also. Next we will
1378         * calculate BW correctly in handle_channel function.
1379         * In other case remove AUTO_BW flag while we calculate
1380         * maximum bandwidth correctly and auto calculation is
1381         * not required.
1382         */
1383        if ((rule1->flags & NL80211_RRF_AUTO_BW) &&
1384            (rule2->flags & NL80211_RRF_AUTO_BW))
1385                intersected_rule->flags |= NL80211_RRF_AUTO_BW;
1386        else
1387                intersected_rule->flags &= ~NL80211_RRF_AUTO_BW;
1388
1389        freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz;
1390        if (freq_range->max_bandwidth_khz > freq_diff)
1391                freq_range->max_bandwidth_khz = freq_diff;
1392
1393        power_rule->max_eirp = min(power_rule1->max_eirp,
1394                power_rule2->max_eirp);
1395        power_rule->max_antenna_gain = min(power_rule1->max_antenna_gain,
1396                power_rule2->max_antenna_gain);
1397
1398        intersected_rule->dfs_cac_ms = max(rule1->dfs_cac_ms,
1399                                           rule2->dfs_cac_ms);
1400
1401        if (rule1->has_wmm && rule2->has_wmm) {
1402                u8 ac;
1403
1404                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1405                        reg_wmm_rules_intersect(&wmm_rule1->client[ac],
1406                                                &wmm_rule2->client[ac],
1407                                                &wmm_rule->client[ac]);
1408                        reg_wmm_rules_intersect(&wmm_rule1->ap[ac],
1409                                                &wmm_rule2->ap[ac],
1410                                                &wmm_rule->ap[ac]);
1411                }
1412
1413                intersected_rule->has_wmm = true;
1414        } else if (rule1->has_wmm) {
1415                *wmm_rule = *wmm_rule1;
1416                intersected_rule->has_wmm = true;
1417        } else if (rule2->has_wmm) {
1418                *wmm_rule = *wmm_rule2;
1419                intersected_rule->has_wmm = true;
1420        } else {
1421                intersected_rule->has_wmm = false;
1422        }
1423
1424        if (!is_valid_reg_rule(intersected_rule))
1425                return -EINVAL;
1426
1427        return 0;
1428}
1429
1430/* check whether old rule contains new rule */
1431static bool rule_contains(struct ieee80211_reg_rule *r1,
1432                          struct ieee80211_reg_rule *r2)
1433{
1434        /* for simplicity, currently consider only same flags */
1435        if (r1->flags != r2->flags)
1436                return false;
1437
1438        /* verify r1 is more restrictive */
1439        if ((r1->power_rule.max_antenna_gain >
1440             r2->power_rule.max_antenna_gain) ||
1441            r1->power_rule.max_eirp > r2->power_rule.max_eirp)
1442                return false;
1443
1444        /* make sure r2's range is contained within r1 */
1445        if (r1->freq_range.start_freq_khz > r2->freq_range.start_freq_khz ||
1446            r1->freq_range.end_freq_khz < r2->freq_range.end_freq_khz)
1447                return false;
1448
1449        /* and finally verify that r1.max_bw >= r2.max_bw */
1450        if (r1->freq_range.max_bandwidth_khz <
1451            r2->freq_range.max_bandwidth_khz)
1452                return false;
1453
1454        return true;
1455}
1456
1457/* add or extend current rules. do nothing if rule is already contained */
1458static void add_rule(struct ieee80211_reg_rule *rule,
1459                     struct ieee80211_reg_rule *reg_rules, u32 *n_rules)
1460{
1461        struct ieee80211_reg_rule *tmp_rule;
1462        int i;
1463
1464        for (i = 0; i < *n_rules; i++) {
1465                tmp_rule = &reg_rules[i];
1466                /* rule is already contained - do nothing */
1467                if (rule_contains(tmp_rule, rule))
1468                        return;
1469
1470                /* extend rule if possible */
1471                if (rule_contains(rule, tmp_rule)) {
1472                        memcpy(tmp_rule, rule, sizeof(*rule));
1473                        return;
1474                }
1475        }
1476
1477        memcpy(&reg_rules[*n_rules], rule, sizeof(*rule));
1478        (*n_rules)++;
1479}
1480
1481/**
1482 * regdom_intersect - do the intersection between two regulatory domains
1483 * @rd1: first regulatory domain
1484 * @rd2: second regulatory domain
1485 *
1486 * Use this function to get the intersection between two regulatory domains.
1487 * Once completed we will mark the alpha2 for the rd as intersected, "98",
1488 * as no one single alpha2 can represent this regulatory domain.
1489 *
1490 * Returns a pointer to the regulatory domain structure which will hold the
1491 * resulting intersection of rules between rd1 and rd2. We will
1492 * kzalloc() this structure for you.
1493 */
1494static struct ieee80211_regdomain *
1495regdom_intersect(const struct ieee80211_regdomain *rd1,
1496                 const struct ieee80211_regdomain *rd2)
1497{
1498        int r;
1499        unsigned int x, y;
1500        unsigned int num_rules = 0;
1501        const struct ieee80211_reg_rule *rule1, *rule2;
1502        struct ieee80211_reg_rule intersected_rule;
1503        struct ieee80211_regdomain *rd;
1504
1505        if (!rd1 || !rd2)
1506                return NULL;
1507
1508        /*
1509         * First we get a count of the rules we'll need, then we actually
1510         * build them. This is to so we can malloc() and free() a
1511         * regdomain once. The reason we use reg_rules_intersect() here
1512         * is it will return -EINVAL if the rule computed makes no sense.
1513         * All rules that do check out OK are valid.
1514         */
1515
1516        for (x = 0; x < rd1->n_reg_rules; x++) {
1517                rule1 = &rd1->reg_rules[x];
1518                for (y = 0; y < rd2->n_reg_rules; y++) {
1519                        rule2 = &rd2->reg_rules[y];
1520                        if (!reg_rules_intersect(rd1, rd2, rule1, rule2,
1521                                                 &intersected_rule))
1522                                num_rules++;
1523                }
1524        }
1525
1526        if (!num_rules)
1527                return NULL;
1528
1529        rd = kzalloc(struct_size(rd, reg_rules, num_rules), GFP_KERNEL);
1530        if (!rd)
1531                return NULL;
1532
1533        for (x = 0; x < rd1->n_reg_rules; x++) {
1534                rule1 = &rd1->reg_rules[x];
1535                for (y = 0; y < rd2->n_reg_rules; y++) {
1536                        rule2 = &rd2->reg_rules[y];
1537                        r = reg_rules_intersect(rd1, rd2, rule1, rule2,
1538                                                &intersected_rule);
1539                        /*
1540                         * No need to memset here the intersected rule here as
1541                         * we're not using the stack anymore
1542                         */
1543                        if (r)
1544                                continue;
1545
1546                        add_rule(&intersected_rule, rd->reg_rules,
1547                                 &rd->n_reg_rules);
1548                }
1549        }
1550
1551        rd->alpha2[0] = '9';
1552        rd->alpha2[1] = '8';
1553        rd->dfs_region = reg_intersect_dfs_region(rd1->dfs_region,
1554                                                  rd2->dfs_region);
1555
1556        return rd;
1557}
1558
1559/*
1560 * XXX: add support for the rest of enum nl80211_reg_rule_flags, we may
1561 * want to just have the channel structure use these
1562 */
1563static u32 map_regdom_flags(u32 rd_flags)
1564{
1565        u32 channel_flags = 0;
1566        if (rd_flags & NL80211_RRF_NO_IR_ALL)
1567                channel_flags |= IEEE80211_CHAN_NO_IR;
1568        if (rd_flags & NL80211_RRF_DFS)
1569                channel_flags |= IEEE80211_CHAN_RADAR;
1570        if (rd_flags & NL80211_RRF_NO_OFDM)
1571                channel_flags |= IEEE80211_CHAN_NO_OFDM;
1572        if (rd_flags & NL80211_RRF_NO_OUTDOOR)
1573                channel_flags |= IEEE80211_CHAN_INDOOR_ONLY;
1574        if (rd_flags & NL80211_RRF_IR_CONCURRENT)
1575                channel_flags |= IEEE80211_CHAN_IR_CONCURRENT;
1576        if (rd_flags & NL80211_RRF_NO_HT40MINUS)
1577                channel_flags |= IEEE80211_CHAN_NO_HT40MINUS;
1578        if (rd_flags & NL80211_RRF_NO_HT40PLUS)
1579                channel_flags |= IEEE80211_CHAN_NO_HT40PLUS;
1580        if (rd_flags & NL80211_RRF_NO_80MHZ)
1581                channel_flags |= IEEE80211_CHAN_NO_80MHZ;
1582        if (rd_flags & NL80211_RRF_NO_160MHZ)
1583                channel_flags |= IEEE80211_CHAN_NO_160MHZ;
1584        if (rd_flags & NL80211_RRF_NO_HE)
1585                channel_flags |= IEEE80211_CHAN_NO_HE;
1586        return channel_flags;
1587}
1588
1589static const struct ieee80211_reg_rule *
1590freq_reg_info_regd(u32 center_freq,
1591                   const struct ieee80211_regdomain *regd, u32 bw)
1592{
1593        int i;
1594        bool band_rule_found = false;
1595        bool bw_fits = false;
1596
1597        if (!regd)
1598                return ERR_PTR(-EINVAL);
1599
1600        for (i = 0; i < regd->n_reg_rules; i++) {
1601                const struct ieee80211_reg_rule *rr;
1602                const struct ieee80211_freq_range *fr = NULL;
1603
1604                rr = &regd->reg_rules[i];
1605                fr = &rr->freq_range;
1606
1607                /*
1608                 * We only need to know if one frequency rule was
1609                 * in center_freq's band, that's enough, so let's
1610                 * not overwrite it once found
1611                 */
1612                if (!band_rule_found)
1613                        band_rule_found = freq_in_rule_band(fr, center_freq);
1614
1615                bw_fits = cfg80211_does_bw_fit_range(fr, center_freq, bw);
1616
1617                if (band_rule_found && bw_fits)
1618                        return rr;
1619        }
1620
1621        if (!band_rule_found)
1622                return ERR_PTR(-ERANGE);
1623
1624        return ERR_PTR(-EINVAL);
1625}
1626
1627static const struct ieee80211_reg_rule *
1628__freq_reg_info(struct wiphy *wiphy, u32 center_freq, u32 min_bw)
1629{
1630        const struct ieee80211_regdomain *regd = reg_get_regdomain(wiphy);
1631        static const u32 bws[] = {0, 1, 2, 4, 5, 8, 10, 16, 20};
1632        const struct ieee80211_reg_rule *reg_rule = ERR_PTR(-ERANGE);
1633        int i = ARRAY_SIZE(bws) - 1;
1634        u32 bw;
1635
1636        for (bw = MHZ_TO_KHZ(bws[i]); bw >= min_bw; bw = MHZ_TO_KHZ(bws[i--])) {
1637                reg_rule = freq_reg_info_regd(center_freq, regd, bw);
1638                if (!IS_ERR(reg_rule))
1639                        return reg_rule;
1640        }
1641
1642        return reg_rule;
1643}
1644
1645const struct ieee80211_reg_rule *freq_reg_info(struct wiphy *wiphy,
1646                                               u32 center_freq)
1647{
1648        u32 min_bw = center_freq < MHZ_TO_KHZ(1000) ? 1 : 20;
1649
1650        return __freq_reg_info(wiphy, center_freq, MHZ_TO_KHZ(min_bw));
1651}
1652EXPORT_SYMBOL(freq_reg_info);
1653
1654const char *reg_initiator_name(enum nl80211_reg_initiator initiator)
1655{
1656        switch (initiator) {
1657        case NL80211_REGDOM_SET_BY_CORE:
1658                return "core";
1659        case NL80211_REGDOM_SET_BY_USER:
1660                return "user";
1661        case NL80211_REGDOM_SET_BY_DRIVER:
1662                return "driver";
1663        case NL80211_REGDOM_SET_BY_COUNTRY_IE:
1664                return "country element";
1665        default:
1666                WARN_ON(1);
1667                return "bug";
1668        }
1669}
1670EXPORT_SYMBOL(reg_initiator_name);
1671
1672static uint32_t reg_rule_to_chan_bw_flags(const struct ieee80211_regdomain *regd,
1673                                          const struct ieee80211_reg_rule *reg_rule,
1674                                          const struct ieee80211_channel *chan)
1675{
1676        const struct ieee80211_freq_range *freq_range = NULL;
1677        u32 max_bandwidth_khz, center_freq_khz, bw_flags = 0;
1678        bool is_s1g = chan->band == NL80211_BAND_S1GHZ;
1679
1680        freq_range = &reg_rule->freq_range;
1681
1682        max_bandwidth_khz = freq_range->max_bandwidth_khz;
1683        center_freq_khz = ieee80211_channel_to_khz(chan);
1684        /* Check if auto calculation requested */
1685        if (reg_rule->flags & NL80211_RRF_AUTO_BW)
1686                max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule);
1687
1688        /* If we get a reg_rule we can assume that at least 5Mhz fit */
1689        if (!cfg80211_does_bw_fit_range(freq_range,
1690                                        center_freq_khz,
1691                                        MHZ_TO_KHZ(10)))
1692                bw_flags |= IEEE80211_CHAN_NO_10MHZ;
1693        if (!cfg80211_does_bw_fit_range(freq_range,
1694                                        center_freq_khz,
1695                                        MHZ_TO_KHZ(20)))
1696                bw_flags |= IEEE80211_CHAN_NO_20MHZ;
1697
1698        if (is_s1g) {
1699                /* S1G is strict about non overlapping channels. We can
1700                 * calculate which bandwidth is allowed per channel by finding
1701                 * the largest bandwidth which cleanly divides the freq_range.
1702                 */
1703                int edge_offset;
1704                int ch_bw = max_bandwidth_khz;
1705
1706                while (ch_bw) {
1707                        edge_offset = (center_freq_khz - ch_bw / 2) -
1708                                      freq_range->start_freq_khz;
1709                        if (edge_offset % ch_bw == 0) {
1710                                switch (KHZ_TO_MHZ(ch_bw)) {
1711                                case 1:
1712                                        bw_flags |= IEEE80211_CHAN_1MHZ;
1713                                        break;
1714                                case 2:
1715                                        bw_flags |= IEEE80211_CHAN_2MHZ;
1716                                        break;
1717                                case 4:
1718                                        bw_flags |= IEEE80211_CHAN_4MHZ;
1719                                        break;
1720                                case 8:
1721                                        bw_flags |= IEEE80211_CHAN_8MHZ;
1722                                        break;
1723                                case 16:
1724                                        bw_flags |= IEEE80211_CHAN_16MHZ;
1725                                        break;
1726                                default:
1727                                        /* If we got here, no bandwidths fit on
1728                                         * this frequency, ie. band edge.
1729                                         */
1730                                        bw_flags |= IEEE80211_CHAN_DISABLED;
1731                                        break;
1732                                }
1733                                break;
1734                        }
1735                        ch_bw /= 2;
1736                }
1737        } else {
1738                if (max_bandwidth_khz < MHZ_TO_KHZ(10))
1739                        bw_flags |= IEEE80211_CHAN_NO_10MHZ;
1740                if (max_bandwidth_khz < MHZ_TO_KHZ(20))
1741                        bw_flags |= IEEE80211_CHAN_NO_20MHZ;
1742                if (max_bandwidth_khz < MHZ_TO_KHZ(40))
1743                        bw_flags |= IEEE80211_CHAN_NO_HT40;
1744                if (max_bandwidth_khz < MHZ_TO_KHZ(80))
1745                        bw_flags |= IEEE80211_CHAN_NO_80MHZ;
1746                if (max_bandwidth_khz < MHZ_TO_KHZ(160))
1747                        bw_flags |= IEEE80211_CHAN_NO_160MHZ;
1748        }
1749        return bw_flags;
1750}
1751
1752static void handle_channel_single_rule(struct wiphy *wiphy,
1753                                       enum nl80211_reg_initiator initiator,
1754                                       struct ieee80211_channel *chan,
1755                                       u32 flags,
1756                                       struct regulatory_request *lr,
1757                                       struct wiphy *request_wiphy,
1758                                       const struct ieee80211_reg_rule *reg_rule)
1759{
1760        u32 bw_flags = 0;
1761        const struct ieee80211_power_rule *power_rule = NULL;
1762        const struct ieee80211_regdomain *regd;
1763
1764        regd = reg_get_regdomain(wiphy);
1765
1766        power_rule = &reg_rule->power_rule;
1767        bw_flags = reg_rule_to_chan_bw_flags(regd, reg_rule, chan);
1768
1769        if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
1770            request_wiphy && request_wiphy == wiphy &&
1771            request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
1772                /*
1773                 * This guarantees the driver's requested regulatory domain
1774                 * will always be used as a base for further regulatory
1775                 * settings
1776                 */
1777                chan->flags = chan->orig_flags =
1778                        map_regdom_flags(reg_rule->flags) | bw_flags;
1779                chan->max_antenna_gain = chan->orig_mag =
1780                        (int) MBI_TO_DBI(power_rule->max_antenna_gain);
1781                chan->max_reg_power = chan->max_power = chan->orig_mpwr =
1782                        (int) MBM_TO_DBM(power_rule->max_eirp);
1783
1784                if (chan->flags & IEEE80211_CHAN_RADAR) {
1785                        chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
1786                        if (reg_rule->dfs_cac_ms)
1787                                chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
1788                }
1789
1790                return;
1791        }
1792
1793        chan->dfs_state = NL80211_DFS_USABLE;
1794        chan->dfs_state_entered = jiffies;
1795
1796        chan->beacon_found = false;
1797        chan->flags = flags | bw_flags | map_regdom_flags(reg_rule->flags);
1798        chan->max_antenna_gain =
1799                min_t(int, chan->orig_mag,
1800                      MBI_TO_DBI(power_rule->max_antenna_gain));
1801        chan->max_reg_power = (int) MBM_TO_DBM(power_rule->max_eirp);
1802
1803        if (chan->flags & IEEE80211_CHAN_RADAR) {
1804                if (reg_rule->dfs_cac_ms)
1805                        chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
1806                else
1807                        chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
1808        }
1809
1810        if (chan->orig_mpwr) {
1811                /*
1812                 * Devices that use REGULATORY_COUNTRY_IE_FOLLOW_POWER
1813                 * will always follow the passed country IE power settings.
1814                 */
1815                if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1816                    wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER)
1817                        chan->max_power = chan->max_reg_power;
1818                else
1819                        chan->max_power = min(chan->orig_mpwr,
1820                                              chan->max_reg_power);
1821        } else
1822                chan->max_power = chan->max_reg_power;
1823}
1824
1825static void handle_channel_adjacent_rules(struct wiphy *wiphy,
1826                                          enum nl80211_reg_initiator initiator,
1827                                          struct ieee80211_channel *chan,
1828                                          u32 flags,
1829                                          struct regulatory_request *lr,
1830                                          struct wiphy *request_wiphy,
1831                                          const struct ieee80211_reg_rule *rrule1,
1832                                          const struct ieee80211_reg_rule *rrule2,
1833                                          struct ieee80211_freq_range *comb_range)
1834{
1835        u32 bw_flags1 = 0;
1836        u32 bw_flags2 = 0;
1837        const struct ieee80211_power_rule *power_rule1 = NULL;
1838        const struct ieee80211_power_rule *power_rule2 = NULL;
1839        const struct ieee80211_regdomain *regd;
1840
1841        regd = reg_get_regdomain(wiphy);
1842
1843        power_rule1 = &rrule1->power_rule;
1844        power_rule2 = &rrule2->power_rule;
1845        bw_flags1 = reg_rule_to_chan_bw_flags(regd, rrule1, chan);
1846        bw_flags2 = reg_rule_to_chan_bw_flags(regd, rrule2, chan);
1847
1848        if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
1849            request_wiphy && request_wiphy == wiphy &&
1850            request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
1851                /* This guarantees the driver's requested regulatory domain
1852                 * will always be used as a base for further regulatory
1853                 * settings
1854                 */
1855                chan->flags =
1856                        map_regdom_flags(rrule1->flags) |
1857                        map_regdom_flags(rrule2->flags) |
1858                        bw_flags1 |
1859                        bw_flags2;
1860                chan->orig_flags = chan->flags;
1861                chan->max_antenna_gain =
1862                        min_t(int, MBI_TO_DBI(power_rule1->max_antenna_gain),
1863                              MBI_TO_DBI(power_rule2->max_antenna_gain));
1864                chan->orig_mag = chan->max_antenna_gain;
1865                chan->max_reg_power =
1866                        min_t(int, MBM_TO_DBM(power_rule1->max_eirp),
1867                              MBM_TO_DBM(power_rule2->max_eirp));
1868                chan->max_power = chan->max_reg_power;
1869                chan->orig_mpwr = chan->max_reg_power;
1870
1871                if (chan->flags & IEEE80211_CHAN_RADAR) {
1872                        chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
1873                        if (rrule1->dfs_cac_ms || rrule2->dfs_cac_ms)
1874                                chan->dfs_cac_ms = max_t(unsigned int,
1875                                                         rrule1->dfs_cac_ms,
1876                                                         rrule2->dfs_cac_ms);
1877                }
1878
1879                return;
1880        }
1881
1882        chan->dfs_state = NL80211_DFS_USABLE;
1883        chan->dfs_state_entered = jiffies;
1884
1885        chan->beacon_found = false;
1886        chan->flags = flags | bw_flags1 | bw_flags2 |
1887                      map_regdom_flags(rrule1->flags) |
1888                      map_regdom_flags(rrule2->flags);
1889
1890        /* reg_rule_to_chan_bw_flags may forbids 10 and forbids 20 MHz
1891         * (otherwise no adj. rule case), recheck therefore
1892         */
1893        if (cfg80211_does_bw_fit_range(comb_range,
1894                                       ieee80211_channel_to_khz(chan),
1895                                       MHZ_TO_KHZ(10)))
1896                chan->flags &= ~IEEE80211_CHAN_NO_10MHZ;
1897        if (cfg80211_does_bw_fit_range(comb_range,
1898                                       ieee80211_channel_to_khz(chan),
1899                                       MHZ_TO_KHZ(20)))
1900                chan->flags &= ~IEEE80211_CHAN_NO_20MHZ;
1901
1902        chan->max_antenna_gain =
1903                min_t(int, chan->orig_mag,
1904                      min_t(int,
1905                            MBI_TO_DBI(power_rule1->max_antenna_gain),
1906                            MBI_TO_DBI(power_rule2->max_antenna_gain)));
1907        chan->max_reg_power = min_t(int,
1908                                    MBM_TO_DBM(power_rule1->max_eirp),
1909                                    MBM_TO_DBM(power_rule2->max_eirp));
1910
1911        if (chan->flags & IEEE80211_CHAN_RADAR) {
1912                if (rrule1->dfs_cac_ms || rrule2->dfs_cac_ms)
1913                        chan->dfs_cac_ms = max_t(unsigned int,
1914                                                 rrule1->dfs_cac_ms,
1915                                                 rrule2->dfs_cac_ms);
1916                else
1917                        chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
1918        }
1919
1920        if (chan->orig_mpwr) {
1921                /* Devices that use REGULATORY_COUNTRY_IE_FOLLOW_POWER
1922                 * will always follow the passed country IE power settings.
1923                 */
1924                if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
1925                    wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_FOLLOW_POWER)
1926                        chan->max_power = chan->max_reg_power;
1927                else
1928                        chan->max_power = min(chan->orig_mpwr,
1929                                              chan->max_reg_power);
1930        } else {
1931                chan->max_power = chan->max_reg_power;
1932        }
1933}
1934
1935/* Note that right now we assume the desired channel bandwidth
1936 * is always 20 MHz for each individual channel (HT40 uses 20 MHz
1937 * per channel, the primary and the extension channel).
1938 */
1939static void handle_channel(struct wiphy *wiphy,
1940                           enum nl80211_reg_initiator initiator,
1941                           struct ieee80211_channel *chan)
1942{
1943        const u32 orig_chan_freq = ieee80211_channel_to_khz(chan);
1944        struct regulatory_request *lr = get_last_request();
1945        struct wiphy *request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
1946        const struct ieee80211_reg_rule *rrule = NULL;
1947        const struct ieee80211_reg_rule *rrule1 = NULL;
1948        const struct ieee80211_reg_rule *rrule2 = NULL;
1949
1950        u32 flags = chan->orig_flags;
1951
1952        rrule = freq_reg_info(wiphy, orig_chan_freq);
1953        if (IS_ERR(rrule)) {
1954                /* check for adjacent match, therefore get rules for
1955                 * chan - 20 MHz and chan + 20 MHz and test
1956                 * if reg rules are adjacent
1957                 */
1958                rrule1 = freq_reg_info(wiphy,
1959                                       orig_chan_freq - MHZ_TO_KHZ(20));
1960                rrule2 = freq_reg_info(wiphy,
1961                                       orig_chan_freq + MHZ_TO_KHZ(20));
1962                if (!IS_ERR(rrule1) && !IS_ERR(rrule2)) {
1963                        struct ieee80211_freq_range comb_range;
1964
1965                        if (rrule1->freq_range.end_freq_khz !=
1966                            rrule2->freq_range.start_freq_khz)
1967                                goto disable_chan;
1968
1969                        comb_range.start_freq_khz =
1970                                rrule1->freq_range.start_freq_khz;
1971                        comb_range.end_freq_khz =
1972                                rrule2->freq_range.end_freq_khz;
1973                        comb_range.max_bandwidth_khz =
1974                                min_t(u32,
1975                                      rrule1->freq_range.max_bandwidth_khz,
1976                                      rrule2->freq_range.max_bandwidth_khz);
1977
1978                        if (!cfg80211_does_bw_fit_range(&comb_range,
1979                                                        orig_chan_freq,
1980                                                        MHZ_TO_KHZ(20)))
1981                                goto disable_chan;
1982
1983                        handle_channel_adjacent_rules(wiphy, initiator, chan,
1984                                                      flags, lr, request_wiphy,
1985                                                      rrule1, rrule2,
1986                                                      &comb_range);
1987                        return;
1988                }
1989
1990disable_chan:
1991                /* We will disable all channels that do not match our
1992                 * received regulatory rule unless the hint is coming
1993                 * from a Country IE and the Country IE had no information
1994                 * about a band. The IEEE 802.11 spec allows for an AP
1995                 * to send only a subset of the regulatory rules allowed,
1996                 * so an AP in the US that only supports 2.4 GHz may only send
1997                 * a country IE with information for the 2.4 GHz band
1998                 * while 5 GHz is still supported.
1999                 */
2000                if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
2001                    PTR_ERR(rrule) == -ERANGE)
2002                        return;
2003
2004                if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
2005                    request_wiphy && request_wiphy == wiphy &&
2006                    request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
2007                        pr_debug("Disabling freq %d.%03d MHz for good\n",
2008                                 chan->center_freq, chan->freq_offset);
2009                        chan->orig_flags |= IEEE80211_CHAN_DISABLED;
2010                        chan->flags = chan->orig_flags;
2011                } else {
2012                        pr_debug("Disabling freq %d.%03d MHz\n",
2013                                 chan->center_freq, chan->freq_offset);
2014                        chan->flags |= IEEE80211_CHAN_DISABLED;
2015                }
2016                return;
2017        }
2018
2019        handle_channel_single_rule(wiphy, initiator, chan, flags, lr,
2020                                   request_wiphy, rrule);
2021}
2022
2023static void handle_band(struct wiphy *wiphy,
2024                        enum nl80211_reg_initiator initiator,
2025                        struct ieee80211_supported_band *sband)
2026{
2027        unsigned int i;
2028
2029        if (!sband)
2030                return;
2031
2032        for (i = 0; i < sband->n_channels; i++)
2033                handle_channel(wiphy, initiator, &sband->channels[i]);
2034}
2035
2036static bool reg_request_cell_base(struct regulatory_request *request)
2037{
2038        if (request->initiator != NL80211_REGDOM_SET_BY_USER)
2039                return false;
2040        return request->user_reg_hint_type == NL80211_USER_REG_HINT_CELL_BASE;
2041}
2042
2043bool reg_last_request_cell_base(void)
2044{
2045        return reg_request_cell_base(get_last_request());
2046}
2047
2048#ifdef CONFIG_CFG80211_REG_CELLULAR_HINTS
2049/* Core specific check */
2050static enum reg_request_treatment
2051reg_ignore_cell_hint(struct regulatory_request *pending_request)
2052{
2053        struct regulatory_request *lr = get_last_request();
2054
2055        if (!reg_num_devs_support_basehint)
2056                return REG_REQ_IGNORE;
2057
2058        if (reg_request_cell_base(lr) &&
2059            !regdom_changes(pending_request->alpha2))
2060                return REG_REQ_ALREADY_SET;
2061
2062        return REG_REQ_OK;
2063}
2064
2065/* Device specific check */
2066static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
2067{
2068        return !(wiphy->features & NL80211_FEATURE_CELL_BASE_REG_HINTS);
2069}
2070#else
2071static enum reg_request_treatment
2072reg_ignore_cell_hint(struct regulatory_request *pending_request)
2073{
2074        return REG_REQ_IGNORE;
2075}
2076
2077static bool reg_dev_ignore_cell_hint(struct wiphy *wiphy)
2078{
2079        return true;
2080}
2081#endif
2082
2083static bool wiphy_strict_alpha2_regd(struct wiphy *wiphy)
2084{
2085        if (wiphy->regulatory_flags & REGULATORY_STRICT_REG &&
2086            !(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG))
2087                return true;
2088        return false;
2089}
2090
2091static bool ignore_reg_update(struct wiphy *wiphy,
2092                              enum nl80211_reg_initiator initiator)
2093{
2094        struct regulatory_request *lr = get_last_request();
2095
2096        if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
2097                return true;
2098
2099        if (!lr) {
2100                pr_debug("Ignoring regulatory request set by %s since last_request is not set\n",
2101                         reg_initiator_name(initiator));
2102                return true;
2103        }
2104
2105        if (initiator == NL80211_REGDOM_SET_BY_CORE &&
2106            wiphy->regulatory_flags & REGULATORY_CUSTOM_REG) {
2107                pr_debug("Ignoring regulatory request set by %s since the driver uses its own custom regulatory domain\n",
2108                         reg_initiator_name(initiator));
2109                return true;
2110        }
2111
2112        /*
2113         * wiphy->regd will be set once the device has its own
2114         * desired regulatory domain set
2115         */
2116        if (wiphy_strict_alpha2_regd(wiphy) && !wiphy->regd &&
2117            initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
2118            !is_world_regdom(lr->alpha2)) {
2119                pr_debug("Ignoring regulatory request set by %s since the driver requires its own regulatory domain to be set first\n",
2120                         reg_initiator_name(initiator));
2121                return true;
2122        }
2123
2124        if (reg_request_cell_base(lr))
2125                return reg_dev_ignore_cell_hint(wiphy);
2126
2127        return false;
2128}
2129
2130static bool reg_is_world_roaming(struct wiphy *wiphy)
2131{
2132        const struct ieee80211_regdomain *cr = get_cfg80211_regdom();
2133        const struct ieee80211_regdomain *wr = get_wiphy_regdom(wiphy);
2134        struct regulatory_request *lr = get_last_request();
2135
2136        if (is_world_regdom(cr->alpha2) || (wr && is_world_regdom(wr->alpha2)))
2137                return true;
2138
2139        if (lr && lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
2140            wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
2141                return true;
2142
2143        return false;
2144}
2145
2146static void handle_reg_beacon(struct wiphy *wiphy, unsigned int chan_idx,
2147                              struct reg_beacon *reg_beacon)
2148{
2149        struct ieee80211_supported_band *sband;
2150        struct ieee80211_channel *chan;
2151        bool channel_changed = false;
2152        struct ieee80211_channel chan_before;
2153
2154        sband = wiphy->bands[reg_beacon->chan.band];
2155        chan = &sband->channels[chan_idx];
2156
2157        if (likely(!ieee80211_channel_equal(chan, &reg_beacon->chan)))
2158                return;
2159
2160        if (chan->beacon_found)
2161                return;
2162
2163        chan->beacon_found = true;
2164
2165        if (!reg_is_world_roaming(wiphy))
2166                return;
2167
2168        if (wiphy->regulatory_flags & REGULATORY_DISABLE_BEACON_HINTS)
2169                return;
2170
2171        chan_before = *chan;
2172
2173        if (chan->flags & IEEE80211_CHAN_NO_IR) {
2174                chan->flags &= ~IEEE80211_CHAN_NO_IR;
2175                channel_changed = true;
2176        }
2177
2178        if (channel_changed)
2179                nl80211_send_beacon_hint_event(wiphy, &chan_before, chan);
2180}
2181
2182/*
2183 * Called when a scan on a wiphy finds a beacon on
2184 * new channel
2185 */
2186static void wiphy_update_new_beacon(struct wiphy *wiphy,
2187                                    struct reg_beacon *reg_beacon)
2188{
2189        unsigned int i;
2190        struct ieee80211_supported_band *sband;
2191
2192        if (!wiphy->bands[reg_beacon->chan.band])
2193                return;
2194
2195        sband = wiphy->bands[reg_beacon->chan.band];
2196
2197        for (i = 0; i < sband->n_channels; i++)
2198                handle_reg_beacon(wiphy, i, reg_beacon);
2199}
2200
2201/*
2202 * Called upon reg changes or a new wiphy is added
2203 */
2204static void wiphy_update_beacon_reg(struct wiphy *wiphy)
2205{
2206        unsigned int i;
2207        struct ieee80211_supported_band *sband;
2208        struct reg_beacon *reg_beacon;
2209
2210        list_for_each_entry(reg_beacon, &reg_beacon_list, list) {
2211                if (!wiphy->bands[reg_beacon->chan.band])
2212                        continue;
2213                sband = wiphy->bands[reg_beacon->chan.band];
2214                for (i = 0; i < sband->n_channels; i++)
2215                        handle_reg_beacon(wiphy, i, reg_beacon);
2216        }
2217}
2218
2219/* Reap the advantages of previously found beacons */
2220static void reg_process_beacons(struct wiphy *wiphy)
2221{
2222        /*
2223         * Means we are just firing up cfg80211, so no beacons would
2224         * have been processed yet.
2225         */
2226        if (!last_request)
2227                return;
2228        wiphy_update_beacon_reg(wiphy);
2229}
2230
2231static bool is_ht40_allowed(struct ieee80211_channel *chan)
2232{
2233        if (!chan)
2234                return false;
2235        if (chan->flags & IEEE80211_CHAN_DISABLED)
2236                return false;
2237        /* This would happen when regulatory rules disallow HT40 completely */
2238        if ((chan->flags & IEEE80211_CHAN_NO_HT40) == IEEE80211_CHAN_NO_HT40)
2239                return false;
2240        return true;
2241}
2242
2243static void reg_process_ht_flags_channel(struct wiphy *wiphy,
2244                                         struct ieee80211_channel *channel)
2245{
2246        struct ieee80211_supported_band *sband = wiphy->bands[channel->band];
2247        struct ieee80211_channel *channel_before = NULL, *channel_after = NULL;
2248        const struct ieee80211_regdomain *regd;
2249        unsigned int i;
2250        u32 flags;
2251
2252        if (!is_ht40_allowed(channel)) {
2253                channel->flags |= IEEE80211_CHAN_NO_HT40;
2254                return;
2255        }
2256
2257        /*
2258         * We need to ensure the extension channels exist to
2259         * be able to use HT40- or HT40+, this finds them (or not)
2260         */
2261        for (i = 0; i < sband->n_channels; i++) {
2262                struct ieee80211_channel *c = &sband->channels[i];
2263
2264                if (c->center_freq == (channel->center_freq - 20))
2265                        channel_before = c;
2266                if (c->center_freq == (channel->center_freq + 20))
2267                        channel_after = c;
2268        }
2269
2270        flags = 0;
2271        regd = get_wiphy_regdom(wiphy);
2272        if (regd) {
2273                const struct ieee80211_reg_rule *reg_rule =
2274                        freq_reg_info_regd(MHZ_TO_KHZ(channel->center_freq),
2275                                           regd, MHZ_TO_KHZ(20));
2276
2277                if (!IS_ERR(reg_rule))
2278                        flags = reg_rule->flags;
2279        }
2280
2281        /*
2282         * Please note that this assumes target bandwidth is 20 MHz,
2283         * if that ever changes we also need to change the below logic
2284         * to include that as well.
2285         */
2286        if (!is_ht40_allowed(channel_before) ||
2287            flags & NL80211_RRF_NO_HT40MINUS)
2288                channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
2289        else
2290                channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
2291
2292        if (!is_ht40_allowed(channel_after) ||
2293            flags & NL80211_RRF_NO_HT40PLUS)
2294                channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
2295        else
2296                channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
2297}
2298
2299static void reg_process_ht_flags_band(struct wiphy *wiphy,
2300                                      struct ieee80211_supported_band *sband)
2301{
2302        unsigned int i;
2303
2304        if (!sband)
2305                return;
2306
2307        for (i = 0; i < sband->n_channels; i++)
2308                reg_process_ht_flags_channel(wiphy, &sband->channels[i]);
2309}
2310
2311static void reg_process_ht_flags(struct wiphy *wiphy)
2312{
2313        enum nl80211_band band;
2314
2315        if (!wiphy)
2316                return;
2317
2318        for (band = 0; band < NUM_NL80211_BANDS; band++)
2319                reg_process_ht_flags_band(wiphy, wiphy->bands[band]);
2320}
2321
2322static void reg_call_notifier(struct wiphy *wiphy,
2323                              struct regulatory_request *request)
2324{
2325        if (wiphy->reg_notifier)
2326                wiphy->reg_notifier(wiphy, request);
2327}
2328
2329static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev)
2330{
2331        struct cfg80211_chan_def chandef = {};
2332        struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2333        enum nl80211_iftype iftype;
2334
2335        wdev_lock(wdev);
2336        iftype = wdev->iftype;
2337
2338        /* make sure the interface is active */
2339        if (!wdev->netdev || !netif_running(wdev->netdev))
2340                goto wdev_inactive_unlock;
2341
2342        switch (iftype) {
2343        case NL80211_IFTYPE_AP:
2344        case NL80211_IFTYPE_P2P_GO:
2345                if (!wdev->beacon_interval)
2346                        goto wdev_inactive_unlock;
2347                chandef = wdev->chandef;
2348                break;
2349        case NL80211_IFTYPE_ADHOC:
2350                if (!wdev->ssid_len)
2351                        goto wdev_inactive_unlock;
2352                chandef = wdev->chandef;
2353                break;
2354        case NL80211_IFTYPE_STATION:
2355        case NL80211_IFTYPE_P2P_CLIENT:
2356                if (!wdev->current_bss ||
2357                    !wdev->current_bss->pub.channel)
2358                        goto wdev_inactive_unlock;
2359
2360                if (!rdev->ops->get_channel ||
2361                    rdev_get_channel(rdev, wdev, &chandef))
2362                        cfg80211_chandef_create(&chandef,
2363                                                wdev->current_bss->pub.channel,
2364                                                NL80211_CHAN_NO_HT);
2365                break;
2366        case NL80211_IFTYPE_MONITOR:
2367        case NL80211_IFTYPE_AP_VLAN:
2368        case NL80211_IFTYPE_P2P_DEVICE:
2369                /* no enforcement required */
2370                break;
2371        default:
2372                /* others not implemented for now */
2373                WARN_ON(1);
2374                break;
2375        }
2376
2377        wdev_unlock(wdev);
2378
2379        switch (iftype) {
2380        case NL80211_IFTYPE_AP:
2381        case NL80211_IFTYPE_P2P_GO:
2382        case NL80211_IFTYPE_ADHOC:
2383                return cfg80211_reg_can_beacon_relax(wiphy, &chandef, iftype);
2384        case NL80211_IFTYPE_STATION:
2385        case NL80211_IFTYPE_P2P_CLIENT:
2386                return cfg80211_chandef_usable(wiphy, &chandef,
2387                                               IEEE80211_CHAN_DISABLED);
2388        default:
2389                break;
2390        }
2391
2392        return true;
2393
2394wdev_inactive_unlock:
2395        wdev_unlock(wdev);
2396        return true;
2397}
2398
2399static void reg_leave_invalid_chans(struct wiphy *wiphy)
2400{
2401        struct wireless_dev *wdev;
2402        struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2403
2404        ASSERT_RTNL();
2405
2406        list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list)
2407                if (!reg_wdev_chan_valid(wiphy, wdev))
2408                        cfg80211_leave(rdev, wdev);
2409}
2410
2411static void reg_check_chans_work(struct work_struct *work)
2412{
2413        struct cfg80211_registered_device *rdev;
2414
2415        pr_debug("Verifying active interfaces after reg change\n");
2416        rtnl_lock();
2417
2418        list_for_each_entry(rdev, &cfg80211_rdev_list, list)
2419                if (!(rdev->wiphy.regulatory_flags &
2420                      REGULATORY_IGNORE_STALE_KICKOFF))
2421                        reg_leave_invalid_chans(&rdev->wiphy);
2422
2423        rtnl_unlock();
2424}
2425
2426static void reg_check_channels(void)
2427{
2428        /*
2429         * Give usermode a chance to do something nicer (move to another
2430         * channel, orderly disconnection), before forcing a disconnection.
2431         */
2432        mod_delayed_work(system_power_efficient_wq,
2433                         &reg_check_chans,
2434                         msecs_to_jiffies(REG_ENFORCE_GRACE_MS));
2435}
2436
2437static void wiphy_update_regulatory(struct wiphy *wiphy,
2438                                    enum nl80211_reg_initiator initiator)
2439{
2440        enum nl80211_band band;
2441        struct regulatory_request *lr = get_last_request();
2442
2443        if (ignore_reg_update(wiphy, initiator)) {
2444                /*
2445                 * Regulatory updates set by CORE are ignored for custom
2446                 * regulatory cards. Let us notify the changes to the driver,
2447                 * as some drivers used this to restore its orig_* reg domain.
2448                 */
2449                if (initiator == NL80211_REGDOM_SET_BY_CORE &&
2450                    wiphy->regulatory_flags & REGULATORY_CUSTOM_REG &&
2451                    !(wiphy->regulatory_flags &
2452                      REGULATORY_WIPHY_SELF_MANAGED))
2453                        reg_call_notifier(wiphy, lr);
2454                return;
2455        }
2456
2457        lr->dfs_region = get_cfg80211_regdom()->dfs_region;
2458
2459        for (band = 0; band < NUM_NL80211_BANDS; band++)
2460                handle_band(wiphy, initiator, wiphy->bands[band]);
2461
2462        reg_process_beacons(wiphy);
2463        reg_process_ht_flags(wiphy);
2464        reg_call_notifier(wiphy, lr);
2465}
2466
2467static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
2468{
2469        struct cfg80211_registered_device *rdev;
2470        struct wiphy *wiphy;
2471
2472        ASSERT_RTNL();
2473
2474        list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2475                wiphy = &rdev->wiphy;
2476                wiphy_update_regulatory(wiphy, initiator);
2477        }
2478
2479        reg_check_channels();
2480}
2481
2482static void handle_channel_custom(struct wiphy *wiphy,
2483                                  struct ieee80211_channel *chan,
2484                                  const struct ieee80211_regdomain *regd,
2485                                  u32 min_bw)
2486{
2487        u32 bw_flags = 0;
2488        const struct ieee80211_reg_rule *reg_rule = NULL;
2489        const struct ieee80211_power_rule *power_rule = NULL;
2490        u32 bw, center_freq_khz;
2491
2492        center_freq_khz = ieee80211_channel_to_khz(chan);
2493        for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) {
2494                reg_rule = freq_reg_info_regd(center_freq_khz, regd, bw);
2495                if (!IS_ERR(reg_rule))
2496                        break;
2497        }
2498
2499        if (IS_ERR_OR_NULL(reg_rule)) {
2500                pr_debug("Disabling freq %d.%03d MHz as custom regd has no rule that fits it\n",
2501                         chan->center_freq, chan->freq_offset);
2502                if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
2503                        chan->flags |= IEEE80211_CHAN_DISABLED;
2504                } else {
2505                        chan->orig_flags |= IEEE80211_CHAN_DISABLED;
2506                        chan->flags = chan->orig_flags;
2507                }
2508                return;
2509        }
2510
2511        power_rule = &reg_rule->power_rule;
2512        bw_flags = reg_rule_to_chan_bw_flags(regd, reg_rule, chan);
2513
2514        chan->dfs_state_entered = jiffies;
2515        chan->dfs_state = NL80211_DFS_USABLE;
2516
2517        chan->beacon_found = false;
2518
2519        if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
2520                chan->flags = chan->orig_flags | bw_flags |
2521                              map_regdom_flags(reg_rule->flags);
2522        else
2523                chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;
2524
2525        chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
2526        chan->max_reg_power = chan->max_power =
2527                (int) MBM_TO_DBM(power_rule->max_eirp);
2528
2529        if (chan->flags & IEEE80211_CHAN_RADAR) {
2530                if (reg_rule->dfs_cac_ms)
2531                        chan->dfs_cac_ms = reg_rule->dfs_cac_ms;
2532                else
2533                        chan->dfs_cac_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
2534        }
2535
2536        chan->max_power = chan->max_reg_power;
2537}
2538
2539static void handle_band_custom(struct wiphy *wiphy,
2540                               struct ieee80211_supported_band *sband,
2541                               const struct ieee80211_regdomain *regd)
2542{
2543        unsigned int i;
2544
2545        if (!sband)
2546                return;
2547
2548        /*
2549         * We currently assume that you always want at least 20 MHz,
2550         * otherwise channel 12 might get enabled if this rule is
2551         * compatible to US, which permits 2402 - 2472 MHz.
2552         */
2553        for (i = 0; i < sband->n_channels; i++)
2554                handle_channel_custom(wiphy, &sband->channels[i], regd,
2555                                      MHZ_TO_KHZ(20));
2556}
2557
2558/* Used by drivers prior to wiphy registration */
2559void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
2560                                   const struct ieee80211_regdomain *regd)
2561{
2562        const struct ieee80211_regdomain *new_regd, *tmp;
2563        enum nl80211_band band;
2564        unsigned int bands_set = 0;
2565
2566        WARN(!(wiphy->regulatory_flags & REGULATORY_CUSTOM_REG),
2567             "wiphy should have REGULATORY_CUSTOM_REG\n");
2568        wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
2569
2570        for (band = 0; band < NUM_NL80211_BANDS; band++) {
2571                if (!wiphy->bands[band])
2572                        continue;
2573                handle_band_custom(wiphy, wiphy->bands[band], regd);
2574                bands_set++;
2575        }
2576
2577        /*
2578         * no point in calling this if it won't have any effect
2579         * on your device's supported bands.
2580         */
2581        WARN_ON(!bands_set);
2582        new_regd = reg_copy_regd(regd);
2583        if (IS_ERR(new_regd))
2584                return;
2585
2586        rtnl_lock();
2587        wiphy_lock(wiphy);
2588
2589        tmp = get_wiphy_regdom(wiphy);
2590        rcu_assign_pointer(wiphy->regd, new_regd);
2591        rcu_free_regdom(tmp);
2592
2593        wiphy_unlock(wiphy);
2594        rtnl_unlock();
2595}
2596EXPORT_SYMBOL(wiphy_apply_custom_regulatory);
2597
2598static void reg_set_request_processed(void)
2599{
2600        bool need_more_processing = false;
2601        struct regulatory_request *lr = get_last_request();
2602
2603        lr->processed = true;
2604
2605        spin_lock(&reg_requests_lock);
2606        if (!list_empty(&reg_requests_list))
2607                need_more_processing = true;
2608        spin_unlock(&reg_requests_lock);
2609
2610        cancel_crda_timeout();
2611
2612        if (need_more_processing)
2613                schedule_work(&reg_work);
2614}
2615
2616/**
2617 * reg_process_hint_core - process core regulatory requests
2618 * @core_request: a pending core regulatory request
2619 *
2620 * The wireless subsystem can use this function to process
2621 * a regulatory request issued by the regulatory core.
2622 */
2623static enum reg_request_treatment
2624reg_process_hint_core(struct regulatory_request *core_request)
2625{
2626        if (reg_query_database(core_request)) {
2627                core_request->intersect = false;
2628                core_request->processed = false;
2629                reg_update_last_request(core_request);
2630                return REG_REQ_OK;
2631        }
2632
2633        return REG_REQ_IGNORE;
2634}
2635
2636static enum reg_request_treatment
2637__reg_process_hint_user(struct regulatory_request *user_request)
2638{
2639        struct regulatory_request *lr = get_last_request();
2640
2641        if (reg_request_cell_base(user_request))
2642                return reg_ignore_cell_hint(user_request);
2643
2644        if (reg_request_cell_base(lr))
2645                return REG_REQ_IGNORE;
2646
2647        if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)
2648                return REG_REQ_INTERSECT;
2649        /*
2650         * If the user knows better the user should set the regdom
2651         * to their country before the IE is picked up
2652         */
2653        if (lr->initiator == NL80211_REGDOM_SET_BY_USER &&
2654            lr->intersect)
2655                return REG_REQ_IGNORE;
2656        /*
2657         * Process user requests only after previous user/driver/core
2658         * requests have been processed
2659         */
2660        if ((lr->initiator == NL80211_REGDOM_SET_BY_CORE ||
2661             lr->initiator == NL80211_REGDOM_SET_BY_DRIVER ||
2662             lr->initiator == NL80211_REGDOM_SET_BY_USER) &&
2663            regdom_changes(lr->alpha2))
2664                return REG_REQ_IGNORE;
2665
2666        if (!regdom_changes(user_request->alpha2))
2667                return REG_REQ_ALREADY_SET;
2668
2669        return REG_REQ_OK;
2670}
2671
2672/**
2673 * reg_process_hint_user - process user regulatory requests
2674 * @user_request: a pending user regulatory request
2675 *
2676 * The wireless subsystem can use this function to process
2677 * a regulatory request initiated by userspace.
2678 */
2679static enum reg_request_treatment
2680reg_process_hint_user(struct regulatory_request *user_request)
2681{
2682        enum reg_request_treatment treatment;
2683
2684        treatment = __reg_process_hint_user(user_request);
2685        if (treatment == REG_REQ_IGNORE ||
2686            treatment == REG_REQ_ALREADY_SET)
2687                return REG_REQ_IGNORE;
2688
2689        user_request->intersect = treatment == REG_REQ_INTERSECT;
2690        user_request->processed = false;
2691
2692        if (reg_query_database(user_request)) {
2693                reg_update_last_request(user_request);
2694                user_alpha2[0] = user_request->alpha2[0];
2695                user_alpha2[1] = user_request->alpha2[1];
2696                return REG_REQ_OK;
2697        }
2698
2699        return REG_REQ_IGNORE;
2700}
2701
2702static enum reg_request_treatment
2703__reg_process_hint_driver(struct regulatory_request *driver_request)
2704{
2705        struct regulatory_request *lr = get_last_request();
2706
2707        if (lr->initiator == NL80211_REGDOM_SET_BY_CORE) {
2708                if (regdom_changes(driver_request->alpha2))
2709                        return REG_REQ_OK;
2710                return REG_REQ_ALREADY_SET;
2711        }
2712
2713        /*
2714         * This would happen if you unplug and plug your card
2715         * back in or if you add a new device for which the previously
2716         * loaded card also agrees on the regulatory domain.
2717         */
2718        if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
2719            !regdom_changes(driver_request->alpha2))
2720                return REG_REQ_ALREADY_SET;
2721
2722        return REG_REQ_INTERSECT;
2723}
2724
2725/**
2726 * reg_process_hint_driver - process driver regulatory requests
2727 * @wiphy: the wireless device for the regulatory request
2728 * @driver_request: a pending driver regulatory request
2729 *
2730 * The wireless subsystem can use this function to process
2731 * a regulatory request issued by an 802.11 driver.
2732 *
2733 * Returns one of the different reg request treatment values.
2734 */
2735static enum reg_request_treatment
2736reg_process_hint_driver(struct wiphy *wiphy,
2737                        struct regulatory_request *driver_request)
2738{
2739        const struct ieee80211_regdomain *regd, *tmp;
2740        enum reg_request_treatment treatment;
2741
2742        treatment = __reg_process_hint_driver(driver_request);
2743
2744        switch (treatment) {
2745        case REG_REQ_OK:
2746                break;
2747        case REG_REQ_IGNORE:
2748                return REG_REQ_IGNORE;
2749        case REG_REQ_INTERSECT:
2750        case REG_REQ_ALREADY_SET:
2751                regd = reg_copy_regd(get_cfg80211_regdom());
2752                if (IS_ERR(regd))
2753                        return REG_REQ_IGNORE;
2754
2755                tmp = get_wiphy_regdom(wiphy);
2756                ASSERT_RTNL();
2757                wiphy_lock(wiphy);
2758                rcu_assign_pointer(wiphy->regd, regd);
2759                wiphy_unlock(wiphy);
2760                rcu_free_regdom(tmp);
2761        }
2762
2763
2764        driver_request->intersect = treatment == REG_REQ_INTERSECT;
2765        driver_request->processed = false;
2766
2767        /*
2768         * Since CRDA will not be called in this case as we already
2769         * have applied the requested regulatory domain before we just
2770         * inform userspace we have processed the request
2771         */
2772        if (treatment == REG_REQ_ALREADY_SET) {
2773                nl80211_send_reg_change_event(driver_request);
2774                reg_update_last_request(driver_request);
2775                reg_set_request_processed();
2776                return REG_REQ_ALREADY_SET;
2777        }
2778
2779        if (reg_query_database(driver_request)) {
2780                reg_update_last_request(driver_request);
2781                return REG_REQ_OK;
2782        }
2783
2784        return REG_REQ_IGNORE;
2785}
2786
2787static enum reg_request_treatment
2788__reg_process_hint_country_ie(struct wiphy *wiphy,
2789                              struct regulatory_request *country_ie_request)
2790{
2791        struct wiphy *last_wiphy = NULL;
2792        struct regulatory_request *lr = get_last_request();
2793
2794        if (reg_request_cell_base(lr)) {
2795                /* Trust a Cell base station over the AP's country IE */
2796                if (regdom_changes(country_ie_request->alpha2))
2797                        return REG_REQ_IGNORE;
2798                return REG_REQ_ALREADY_SET;
2799        } else {
2800                if (wiphy->regulatory_flags & REGULATORY_COUNTRY_IE_IGNORE)
2801                        return REG_REQ_IGNORE;
2802        }
2803
2804        if (unlikely(!is_an_alpha2(country_ie_request->alpha2)))
2805                return -EINVAL;
2806
2807        if (lr->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE)
2808                return REG_REQ_OK;
2809
2810        last_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
2811
2812        if (last_wiphy != wiphy) {
2813                /*
2814                 * Two cards with two APs claiming different
2815                 * Country IE alpha2s. We could
2816                 * intersect them, but that seems unlikely
2817                 * to be correct. Reject second one for now.
2818                 */
2819                if (regdom_changes(country_ie_request->alpha2))
2820                        return REG_REQ_IGNORE;
2821                return REG_REQ_ALREADY_SET;
2822        }
2823
2824        if (regdom_changes(country_ie_request->alpha2))
2825                return REG_REQ_OK;
2826        return REG_REQ_ALREADY_SET;
2827}
2828
2829/**
2830 * reg_process_hint_country_ie - process regulatory requests from country IEs
2831 * @wiphy: the wireless device for the regulatory request
2832 * @country_ie_request: a regulatory request from a country IE
2833 *
2834 * The wireless subsystem can use this function to process
2835 * a regulatory request issued by a country Information Element.
2836 *
2837 * Returns one of the different reg request treatment values.
2838 */
2839static enum reg_request_treatment
2840reg_process_hint_country_ie(struct wiphy *wiphy,
2841                            struct regulatory_request *country_ie_request)
2842{
2843        enum reg_request_treatment treatment;
2844
2845        treatment = __reg_process_hint_country_ie(wiphy, country_ie_request);
2846
2847        switch (treatment) {
2848        case REG_REQ_OK:
2849                break;
2850        case REG_REQ_IGNORE:
2851                return REG_REQ_IGNORE;
2852        case REG_REQ_ALREADY_SET:
2853                reg_free_request(country_ie_request);
2854                return REG_REQ_ALREADY_SET;
2855        case REG_REQ_INTERSECT:
2856                /*
2857                 * This doesn't happen yet, not sure we
2858                 * ever want to support it for this case.
2859                 */
2860                WARN_ONCE(1, "Unexpected intersection for country elements");
2861                return REG_REQ_IGNORE;
2862        }
2863
2864        country_ie_request->intersect = false;
2865        country_ie_request->processed = false;
2866
2867        if (reg_query_database(country_ie_request)) {
2868                reg_update_last_request(country_ie_request);
2869                return REG_REQ_OK;
2870        }
2871
2872        return REG_REQ_IGNORE;
2873}
2874
2875bool reg_dfs_domain_same(struct wiphy *wiphy1, struct wiphy *wiphy2)
2876{
2877        const struct ieee80211_regdomain *wiphy1_regd = NULL;
2878        const struct ieee80211_regdomain *wiphy2_regd = NULL;
2879        const struct ieee80211_regdomain *cfg80211_regd = NULL;
2880        bool dfs_domain_same;
2881
2882        rcu_read_lock();
2883
2884        cfg80211_regd = rcu_dereference(cfg80211_regdomain);
2885        wiphy1_regd = rcu_dereference(wiphy1->regd);
2886        if (!wiphy1_regd)
2887                wiphy1_regd = cfg80211_regd;
2888
2889        wiphy2_regd = rcu_dereference(wiphy2->regd);
2890        if (!wiphy2_regd)
2891                wiphy2_regd = cfg80211_regd;
2892
2893        dfs_domain_same = wiphy1_regd->dfs_region == wiphy2_regd->dfs_region;
2894
2895        rcu_read_unlock();
2896
2897        return dfs_domain_same;
2898}
2899
2900static void reg_copy_dfs_chan_state(struct ieee80211_channel *dst_chan,
2901                                    struct ieee80211_channel *src_chan)
2902{
2903        if (!(dst_chan->flags & IEEE80211_CHAN_RADAR) ||
2904            !(src_chan->flags & IEEE80211_CHAN_RADAR))
2905                return;
2906
2907        if (dst_chan->flags & IEEE80211_CHAN_DISABLED ||
2908            src_chan->flags & IEEE80211_CHAN_DISABLED)
2909                return;
2910
2911        if (src_chan->center_freq == dst_chan->center_freq &&
2912            dst_chan->dfs_state == NL80211_DFS_USABLE) {
2913                dst_chan->dfs_state = src_chan->dfs_state;
2914                dst_chan->dfs_state_entered = src_chan->dfs_state_entered;
2915        }
2916}
2917
2918static void wiphy_share_dfs_chan_state(struct wiphy *dst_wiphy,
2919                                       struct wiphy *src_wiphy)
2920{
2921        struct ieee80211_supported_band *src_sband, *dst_sband;
2922        struct ieee80211_channel *src_chan, *dst_chan;
2923        int i, j, band;
2924
2925        if (!reg_dfs_domain_same(dst_wiphy, src_wiphy))
2926                return;
2927
2928        for (band = 0; band < NUM_NL80211_BANDS; band++) {
2929                dst_sband = dst_wiphy->bands[band];
2930                src_sband = src_wiphy->bands[band];
2931                if (!dst_sband || !src_sband)
2932                        continue;
2933
2934                for (i = 0; i < dst_sband->n_channels; i++) {
2935                        dst_chan = &dst_sband->channels[i];
2936                        for (j = 0; j < src_sband->n_channels; j++) {
2937                                src_chan = &src_sband->channels[j];
2938                                reg_copy_dfs_chan_state(dst_chan, src_chan);
2939                        }
2940                }
2941        }
2942}
2943
2944static void wiphy_all_share_dfs_chan_state(struct wiphy *wiphy)
2945{
2946        struct cfg80211_registered_device *rdev;
2947
2948        ASSERT_RTNL();
2949
2950        list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
2951                if (wiphy == &rdev->wiphy)
2952                        continue;
2953                wiphy_share_dfs_chan_state(wiphy, &rdev->wiphy);
2954        }
2955}
2956
2957/* This processes *all* regulatory hints */
2958static void reg_process_hint(struct regulatory_request *reg_request)
2959{
2960        struct wiphy *wiphy = NULL;
2961        enum reg_request_treatment treatment;
2962        enum nl80211_reg_initiator initiator = reg_request->initiator;
2963
2964        if (reg_request->wiphy_idx != WIPHY_IDX_INVALID)
2965                wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);
2966
2967        switch (initiator) {
2968        case NL80211_REGDOM_SET_BY_CORE:
2969                treatment = reg_process_hint_core(reg_request);
2970                break;
2971        case NL80211_REGDOM_SET_BY_USER:
2972                treatment = reg_process_hint_user(reg_request);
2973                break;
2974        case NL80211_REGDOM_SET_BY_DRIVER:
2975                if (!wiphy)
2976                        goto out_free;
2977                treatment = reg_process_hint_driver(wiphy, reg_request);
2978                break;
2979        case NL80211_REGDOM_SET_BY_COUNTRY_IE:
2980                if (!wiphy)
2981                        goto out_free;
2982                treatment = reg_process_hint_country_ie(wiphy, reg_request);
2983                break;
2984        default:
2985                WARN(1, "invalid initiator %d\n", initiator);
2986                goto out_free;
2987        }
2988
2989        if (treatment == REG_REQ_IGNORE)
2990                goto out_free;
2991
2992        WARN(treatment != REG_REQ_OK && treatment != REG_REQ_ALREADY_SET,
2993             "unexpected treatment value %d\n", treatment);
2994
2995        /* This is required so that the orig_* parameters are saved.
2996         * NOTE: treatment must be set for any case that reaches here!
2997         */
2998        if (treatment == REG_REQ_ALREADY_SET && wiphy &&
2999            wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
3000                wiphy_update_regulatory(wiphy, initiator);
3001                wiphy_all_share_dfs_chan_state(wiphy);
3002                reg_check_channels();
3003        }
3004
3005        return;
3006
3007out_free:
3008        reg_free_request(reg_request);
3009}
3010
3011static void notify_self_managed_wiphys(struct regulatory_request *request)
3012{
3013        struct cfg80211_registered_device *rdev;
3014        struct wiphy *wiphy;
3015
3016        list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3017                wiphy = &rdev->wiphy;
3018                if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED &&
3019                    request->initiator == NL80211_REGDOM_SET_BY_USER)
3020                        reg_call_notifier(wiphy, request);
3021        }
3022}
3023
3024/*
3025 * Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_*
3026 * Regulatory hints come on a first come first serve basis and we
3027 * must process each one atomically.
3028 */
3029static void reg_process_pending_hints(void)
3030{
3031        struct regulatory_request *reg_request, *lr;
3032
3033        lr = get_last_request();
3034
3035        /* When last_request->processed becomes true this will be rescheduled */
3036        if (lr && !lr->processed) {
3037                pr_debug("Pending regulatory request, waiting for it to be processed...\n");
3038                return;
3039        }
3040
3041        spin_lock(&reg_requests_lock);
3042
3043        if (list_empty(&reg_requests_list)) {
3044                spin_unlock(&reg_requests_lock);
3045                return;
3046        }
3047
3048        reg_request = list_first_entry(&reg_requests_list,
3049                                       struct regulatory_request,
3050                                       list);
3051        list_del_init(&reg_request->list);
3052
3053        spin_unlock(&reg_requests_lock);
3054
3055        notify_self_managed_wiphys(reg_request);
3056
3057        reg_process_hint(reg_request);
3058
3059        lr = get_last_request();
3060
3061        spin_lock(&reg_requests_lock);
3062        if (!list_empty(&reg_requests_list) && lr && lr->processed)
3063                schedule_work(&reg_work);
3064        spin_unlock(&reg_requests_lock);
3065}
3066
3067/* Processes beacon hints -- this has nothing to do with country IEs */
3068static void reg_process_pending_beacon_hints(void)
3069{
3070        struct cfg80211_registered_device *rdev;
3071        struct reg_beacon *pending_beacon, *tmp;
3072
3073        /* This goes through the _pending_ beacon list */
3074        spin_lock_bh(&reg_pending_beacons_lock);
3075
3076        list_for_each_entry_safe(pending_beacon, tmp,
3077                                 &reg_pending_beacons, list) {
3078                list_del_init(&pending_beacon->list);
3079
3080                /* Applies the beacon hint to current wiphys */
3081                list_for_each_entry(rdev, &cfg80211_rdev_list, list)
3082                        wiphy_update_new_beacon(&rdev->wiphy, pending_beacon);
3083
3084                /* Remembers the beacon hint for new wiphys or reg changes */
3085                list_add_tail(&pending_beacon->list, &reg_beacon_list);
3086        }
3087
3088        spin_unlock_bh(&reg_pending_beacons_lock);
3089}
3090
3091static void reg_process_self_managed_hint(struct wiphy *wiphy)
3092{
3093        struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3094        const struct ieee80211_regdomain *tmp;
3095        const struct ieee80211_regdomain *regd;
3096        enum nl80211_band band;
3097        struct regulatory_request request = {};
3098
3099        ASSERT_RTNL();
3100        lockdep_assert_wiphy(wiphy);
3101
3102        spin_lock(&reg_requests_lock);
3103        regd = rdev->requested_regd;
3104        rdev->requested_regd = NULL;
3105        spin_unlock(&reg_requests_lock);
3106
3107        if (!regd)
3108                return;
3109
3110        tmp = get_wiphy_regdom(wiphy);
3111        rcu_assign_pointer(wiphy->regd, regd);
3112        rcu_free_regdom(tmp);
3113
3114        for (band = 0; band < NUM_NL80211_BANDS; band++)
3115                handle_band_custom(wiphy, wiphy->bands[band], regd);
3116
3117        reg_process_ht_flags(wiphy);
3118
3119        request.wiphy_idx = get_wiphy_idx(wiphy);
3120        request.alpha2[0] = regd->alpha2[0];
3121        request.alpha2[1] = regd->alpha2[1];
3122        request.initiator = NL80211_REGDOM_SET_BY_DRIVER;
3123
3124        nl80211_send_wiphy_reg_change_event(&request);
3125}
3126
3127static void reg_process_self_managed_hints(void)
3128{
3129        struct cfg80211_registered_device *rdev;
3130
3131        ASSERT_RTNL();
3132
3133        list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3134                wiphy_lock(&rdev->wiphy);
3135                reg_process_self_managed_hint(&rdev->wiphy);
3136                wiphy_unlock(&rdev->wiphy);
3137        }
3138
3139        reg_check_channels();
3140}
3141
3142static void reg_todo(struct work_struct *work)
3143{
3144        rtnl_lock();
3145        reg_process_pending_hints();
3146        reg_process_pending_beacon_hints();
3147        reg_process_self_managed_hints();
3148        rtnl_unlock();
3149}
3150
3151static void queue_regulatory_request(struct regulatory_request *request)
3152{
3153        request->alpha2[0] = toupper(request->alpha2[0]);
3154        request->alpha2[1] = toupper(request->alpha2[1]);
3155
3156        spin_lock(&reg_requests_lock);
3157        list_add_tail(&request->list, &reg_requests_list);
3158        spin_unlock(&reg_requests_lock);
3159
3160        schedule_work(&reg_work);
3161}
3162
3163/*
3164 * Core regulatory hint -- happens during cfg80211_init()
3165 * and when we restore regulatory settings.
3166 */
3167static int regulatory_hint_core(const char *alpha2)
3168{
3169        struct regulatory_request *request;
3170
3171        request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
3172        if (!request)
3173                return -ENOMEM;
3174
3175        request->alpha2[0] = alpha2[0];
3176        request->alpha2[1] = alpha2[1];
3177        request->initiator = NL80211_REGDOM_SET_BY_CORE;
3178        request->wiphy_idx = WIPHY_IDX_INVALID;
3179
3180        queue_regulatory_request(request);
3181
3182        return 0;
3183}
3184
3185/* User hints */
3186int regulatory_hint_user(const char *alpha2,
3187                         enum nl80211_user_reg_hint_type user_reg_hint_type)
3188{
3189        struct regulatory_request *request;
3190
3191        if (WARN_ON(!alpha2))
3192                return -EINVAL;
3193
3194        if (!is_world_regdom(alpha2) && !is_an_alpha2(alpha2))
3195                return -EINVAL;
3196
3197        request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
3198        if (!request)
3199                return -ENOMEM;
3200
3201        request->wiphy_idx = WIPHY_IDX_INVALID;
3202        request->alpha2[0] = alpha2[0];
3203        request->alpha2[1] = alpha2[1];
3204        request->initiator = NL80211_REGDOM_SET_BY_USER;
3205        request->user_reg_hint_type = user_reg_hint_type;
3206
3207        /* Allow calling CRDA again */
3208        reset_crda_timeouts();
3209
3210        queue_regulatory_request(request);
3211
3212        return 0;
3213}
3214
3215int regulatory_hint_indoor(bool is_indoor, u32 portid)
3216{
3217        spin_lock(&reg_indoor_lock);
3218
3219        /* It is possible that more than one user space process is trying to
3220         * configure the indoor setting. To handle such cases, clear the indoor
3221         * setting in case that some process does not think that the device
3222         * is operating in an indoor environment. In addition, if a user space
3223         * process indicates that it is controlling the indoor setting, save its
3224         * portid, i.e., make it the owner.
3225         */
3226        reg_is_indoor = is_indoor;
3227        if (reg_is_indoor) {
3228                if (!reg_is_indoor_portid)
3229                        reg_is_indoor_portid = portid;
3230        } else {
3231                reg_is_indoor_portid = 0;
3232        }
3233
3234        spin_unlock(&reg_indoor_lock);
3235
3236        if (!is_indoor)
3237                reg_check_channels();
3238
3239        return 0;
3240}
3241
3242void regulatory_netlink_notify(u32 portid)
3243{
3244        spin_lock(&reg_indoor_lock);
3245
3246        if (reg_is_indoor_portid != portid) {
3247                spin_unlock(&reg_indoor_lock);
3248                return;
3249        }
3250
3251        reg_is_indoor = false;
3252        reg_is_indoor_portid = 0;
3253
3254        spin_unlock(&reg_indoor_lock);
3255
3256        reg_check_channels();
3257}
3258
3259/* Driver hints */
3260int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
3261{
3262        struct regulatory_request *request;
3263
3264        if (WARN_ON(!alpha2 || !wiphy))
3265                return -EINVAL;
3266
3267        wiphy->regulatory_flags &= ~REGULATORY_CUSTOM_REG;
3268
3269        request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
3270        if (!request)
3271                return -ENOMEM;
3272
3273        request->wiphy_idx = get_wiphy_idx(wiphy);
3274
3275        request->alpha2[0] = alpha2[0];
3276        request->alpha2[1] = alpha2[1];
3277        request->initiator = NL80211_REGDOM_SET_BY_DRIVER;
3278
3279        /* Allow calling CRDA again */
3280        reset_crda_timeouts();
3281
3282        queue_regulatory_request(request);
3283
3284        return 0;
3285}
3286EXPORT_SYMBOL(regulatory_hint);
3287
3288void regulatory_hint_country_ie(struct wiphy *wiphy, enum nl80211_band band,
3289                                const u8 *country_ie, u8 country_ie_len)
3290{
3291        char alpha2[2];
3292        enum environment_cap env = ENVIRON_ANY;
3293        struct regulatory_request *request = NULL, *lr;
3294
3295        /* IE len must be evenly divisible by 2 */
3296        if (country_ie_len & 0x01)
3297                return;
3298
3299        if (country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
3300                return;
3301
3302        request = kzalloc(sizeof(*request), GFP_KERNEL);
3303        if (!request)
3304                return;
3305
3306        alpha2[0] = country_ie[0];
3307        alpha2[1] = country_ie[1];
3308
3309        if (country_ie[2] == 'I')
3310                env = ENVIRON_INDOOR;
3311        else if (country_ie[2] == 'O')
3312                env = ENVIRON_OUTDOOR;
3313
3314        rcu_read_lock();
3315        lr = get_last_request();
3316
3317        if (unlikely(!lr))
3318                goto out;
3319
3320        /*
3321         * We will run this only upon a successful connection on cfg80211.
3322         * We leave conflict resolution to the workqueue, where can hold
3323         * the RTNL.
3324         */
3325        if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
3326            lr->wiphy_idx != WIPHY_IDX_INVALID)
3327                goto out;
3328
3329        request->wiphy_idx = get_wiphy_idx(wiphy);
3330        request->alpha2[0] = alpha2[0];
3331        request->alpha2[1] = alpha2[1];
3332        request->initiator = NL80211_REGDOM_SET_BY_COUNTRY_IE;
3333        request->country_ie_env = env;
3334
3335        /* Allow calling CRDA again */
3336        reset_crda_timeouts();
3337
3338        queue_regulatory_request(request);
3339        request = NULL;
3340out:
3341        kfree(request);
3342        rcu_read_unlock();
3343}
3344
3345static void restore_alpha2(char *alpha2, bool reset_user)
3346{
3347        /* indicates there is no alpha2 to consider for restoration */
3348        alpha2[0] = '9';
3349        alpha2[1] = '7';
3350
3351        /* The user setting has precedence over the module parameter */
3352        if (is_user_regdom_saved()) {
3353                /* Unless we're asked to ignore it and reset it */
3354                if (reset_user) {
3355                        pr_debug("Restoring regulatory settings including user preference\n");
3356                        user_alpha2[0] = '9';
3357                        user_alpha2[1] = '7';
3358
3359                        /*
3360                         * If we're ignoring user settings, we still need to
3361                         * check the module parameter to ensure we put things
3362                         * back as they were for a full restore.
3363                         */
3364                        if (!is_world_regdom(ieee80211_regdom)) {
3365                                pr_debug("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
3366                                         ieee80211_regdom[0], ieee80211_regdom[1]);
3367                                alpha2[0] = ieee80211_regdom[0];
3368                                alpha2[1] = ieee80211_regdom[1];
3369                        }
3370                } else {
3371                        pr_debug("Restoring regulatory settings while preserving user preference for: %c%c\n",
3372                                 user_alpha2[0], user_alpha2[1]);
3373                        alpha2[0] = user_alpha2[0];
3374                        alpha2[1] = user_alpha2[1];
3375                }
3376        } else if (!is_world_regdom(ieee80211_regdom)) {
3377                pr_debug("Keeping preference on module parameter ieee80211_regdom: %c%c\n",
3378                         ieee80211_regdom[0], ieee80211_regdom[1]);
3379                alpha2[0] = ieee80211_regdom[0];
3380                alpha2[1] = ieee80211_regdom[1];
3381        } else
3382                pr_debug("Restoring regulatory settings\n");
3383}
3384
3385static void restore_custom_reg_settings(struct wiphy *wiphy)
3386{
3387        struct ieee80211_supported_band *sband;
3388        enum nl80211_band band;
3389        struct ieee80211_channel *chan;
3390        int i;
3391
3392        for (band = 0; band < NUM_NL80211_BANDS; band++) {
3393                sband = wiphy->bands[band];
3394                if (!sband)
3395                        continue;
3396                for (i = 0; i < sband->n_channels; i++) {
3397                        chan = &sband->channels[i];
3398                        chan->flags = chan->orig_flags;
3399                        chan->max_antenna_gain = chan->orig_mag;
3400                        chan->max_power = chan->orig_mpwr;
3401                        chan->beacon_found = false;
3402                }
3403        }
3404}
3405
3406/*
3407 * Restoring regulatory settings involves ignoring any
3408 * possibly stale country IE information and user regulatory
3409 * settings if so desired, this includes any beacon hints
3410 * learned as we could have traveled outside to another country
3411 * after disconnection. To restore regulatory settings we do
3412 * exactly what we did at bootup:
3413 *
3414 *   - send a core regulatory hint
3415 *   - send a user regulatory hint if applicable
3416 *
3417 * Device drivers that send a regulatory hint for a specific country
3418 * keep their own regulatory domain on wiphy->regd so that does
3419 * not need to be remembered.
3420 */
3421static void restore_regulatory_settings(bool reset_user, bool cached)
3422{
3423        char alpha2[2];
3424        char world_alpha2[2];
3425        struct reg_beacon *reg_beacon, *btmp;
3426        LIST_HEAD(tmp_reg_req_list);
3427        struct cfg80211_registered_device *rdev;
3428
3429        ASSERT_RTNL();
3430
3431        /*
3432         * Clear the indoor setting in case that it is not controlled by user
3433         * space, as otherwise there is no guarantee that the device is still
3434         * operating in an indoor environment.
3435         */
3436        spin_lock(&reg_indoor_lock);
3437        if (reg_is_indoor && !reg_is_indoor_portid) {
3438                reg_is_indoor = false;
3439                reg_check_channels();
3440        }
3441        spin_unlock(&reg_indoor_lock);
3442
3443        reset_regdomains(true, &world_regdom);
3444        restore_alpha2(alpha2, reset_user);
3445
3446        /*
3447         * If there's any pending requests we simply
3448         * stash them to a temporary pending queue and
3449         * add then after we've restored regulatory
3450         * settings.
3451         */
3452        spin_lock(&reg_requests_lock);
3453        list_splice_tail_init(&reg_requests_list, &tmp_reg_req_list);
3454        spin_unlock(&reg_requests_lock);
3455
3456        /* Clear beacon hints */
3457        spin_lock_bh(&reg_pending_beacons_lock);
3458        list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
3459                list_del(&reg_beacon->list);
3460                kfree(reg_beacon);
3461        }
3462        spin_unlock_bh(&reg_pending_beacons_lock);
3463
3464        list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
3465                list_del(&reg_beacon->list);
3466                kfree(reg_beacon);
3467        }
3468
3469        /* First restore to the basic regulatory settings */
3470        world_alpha2[0] = cfg80211_world_regdom->alpha2[0];
3471        world_alpha2[1] = cfg80211_world_regdom->alpha2[1];
3472
3473        list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3474                if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
3475                        continue;
3476                if (rdev->wiphy.regulatory_flags & REGULATORY_CUSTOM_REG)
3477                        restore_custom_reg_settings(&rdev->wiphy);
3478        }
3479
3480        if (cached && (!is_an_alpha2(alpha2) ||
3481                       !IS_ERR_OR_NULL(cfg80211_user_regdom))) {
3482                reset_regdomains(false, cfg80211_world_regdom);
3483                update_all_wiphy_regulatory(NL80211_REGDOM_SET_BY_CORE);
3484                print_regdomain(get_cfg80211_regdom());
3485                nl80211_send_reg_change_event(&core_request_world);
3486                reg_set_request_processed();
3487
3488                if (is_an_alpha2(alpha2) &&
3489                    !regulatory_hint_user(alpha2, NL80211_USER_REG_HINT_USER)) {
3490                        struct regulatory_request *ureq;
3491
3492                        spin_lock(&reg_requests_lock);
3493                        ureq = list_last_entry(&reg_requests_list,
3494                                               struct regulatory_request,
3495                                               list);
3496                        list_del(&ureq->list);
3497                        spin_unlock(&reg_requests_lock);
3498
3499                        notify_self_managed_wiphys(ureq);
3500                        reg_update_last_request(ureq);
3501                        set_regdom(reg_copy_regd(cfg80211_user_regdom),
3502                                   REGD_SOURCE_CACHED);
3503                }
3504        } else {
3505                regulatory_hint_core(world_alpha2);
3506
3507                /*
3508                 * This restores the ieee80211_regdom module parameter
3509                 * preference or the last user requested regulatory
3510                 * settings, user regulatory settings takes precedence.
3511                 */
3512                if (is_an_alpha2(alpha2))
3513                        regulatory_hint_user(alpha2, NL80211_USER_REG_HINT_USER);
3514        }
3515
3516        spin_lock(&reg_requests_lock);
3517        list_splice_tail_init(&tmp_reg_req_list, &reg_requests_list);
3518        spin_unlock(&reg_requests_lock);
3519
3520        pr_debug("Kicking the queue\n");
3521
3522        schedule_work(&reg_work);
3523}
3524
3525static bool is_wiphy_all_set_reg_flag(enum ieee80211_regulatory_flags flag)
3526{
3527        struct cfg80211_registered_device *rdev;
3528        struct wireless_dev *wdev;
3529
3530        list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
3531                list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
3532                        wdev_lock(wdev);
3533                        if (!(wdev->wiphy->regulatory_flags & flag)) {
3534                                wdev_unlock(wdev);
3535                                return false;
3536                        }
3537                        wdev_unlock(wdev);
3538                }
3539        }
3540
3541        return true;
3542}
3543
3544void regulatory_hint_disconnect(void)
3545{
3546        /* Restore of regulatory settings is not required when wiphy(s)
3547         * ignore IE from connected access point but clearance of beacon hints
3548         * is required when wiphy(s) supports beacon hints.
3549         */
3550        if (is_wiphy_all_set_reg_flag(REGULATORY_COUNTRY_IE_IGNORE)) {
3551                struct reg_beacon *reg_beacon, *btmp;
3552
3553                if (is_wiphy_all_set_reg_flag(REGULATORY_DISABLE_BEACON_HINTS))
3554                        return;
3555
3556                spin_lock_bh(&reg_pending_beacons_lock);
3557                list_for_each_entry_safe(reg_beacon, btmp,
3558                                         &reg_pending_beacons, list) {
3559                        list_del(&reg_beacon->list);
3560                        kfree(reg_beacon);
3561                }
3562                spin_unlock_bh(&reg_pending_beacons_lock);
3563
3564                list_for_each_entry_safe(reg_beacon, btmp,
3565                                         &reg_beacon_list, list) {
3566                        list_del(&reg_beacon->list);
3567                        kfree(reg_beacon);
3568                }
3569
3570                return;
3571        }
3572
3573        pr_debug("All devices are disconnected, going to restore regulatory settings\n");
3574        restore_regulatory_settings(false, true);
3575}
3576
3577static bool freq_is_chan_12_13_14(u32 freq)
3578{
3579        if (freq == ieee80211_channel_to_frequency(12, NL80211_BAND_2GHZ) ||
3580            freq == ieee80211_channel_to_frequency(13, NL80211_BAND_2GHZ) ||
3581            freq == ieee80211_channel_to_frequency(14, NL80211_BAND_2GHZ))
3582                return true;
3583        return false;
3584}
3585
3586static bool pending_reg_beacon(struct ieee80211_channel *beacon_chan)
3587{
3588        struct reg_beacon *pending_beacon;
3589
3590        list_for_each_entry(pending_beacon, &reg_pending_beacons, list)
3591                if (ieee80211_channel_equal(beacon_chan,
3592                                            &pending_beacon->chan))
3593                        return true;
3594        return false;
3595}
3596
3597int regulatory_hint_found_beacon(struct wiphy *wiphy,
3598                                 struct ieee80211_channel *beacon_chan,
3599                                 gfp_t gfp)
3600{
3601        struct reg_beacon *reg_beacon;
3602        bool processing;
3603
3604        if (beacon_chan->beacon_found ||
3605            beacon_chan->flags & IEEE80211_CHAN_RADAR ||
3606            (beacon_chan->band == NL80211_BAND_2GHZ &&
3607             !freq_is_chan_12_13_14(beacon_chan->center_freq)))
3608                return 0;
3609
3610        spin_lock_bh(&reg_pending_beacons_lock);
3611        processing = pending_reg_beacon(beacon_chan);
3612        spin_unlock_bh(&reg_pending_beacons_lock);
3613
3614        if (processing)
3615                return 0;
3616
3617        reg_beacon = kzalloc(sizeof(struct reg_beacon), gfp);
3618        if (!reg_beacon)
3619                return -ENOMEM;
3620
3621        pr_debug("Found new beacon on frequency: %d.%03d MHz (Ch %d) on %s\n",
3622                 beacon_chan->center_freq, beacon_chan->freq_offset,
3623                 ieee80211_freq_khz_to_channel(
3624                         ieee80211_channel_to_khz(beacon_chan)),
3625                 wiphy_name(wiphy));
3626
3627        memcpy(&reg_beacon->chan, beacon_chan,
3628               sizeof(struct ieee80211_channel));
3629
3630        /*
3631         * Since we can be called from BH or and non-BH context
3632         * we must use spin_lock_bh()
3633         */
3634        spin_lock_bh(&reg_pending_beacons_lock);
3635        list_add_tail(&reg_beacon->list, &reg_pending_beacons);
3636        spin_unlock_bh(&reg_pending_beacons_lock);
3637
3638        schedule_work(&reg_work);
3639
3640        return 0;
3641}
3642
3643static void print_rd_rules(const struct ieee80211_regdomain *rd)
3644{
3645        unsigned int i;
3646        const struct ieee80211_reg_rule *reg_rule = NULL;
3647        const struct ieee80211_freq_range *freq_range = NULL;
3648        const struct ieee80211_power_rule *power_rule = NULL;
3649        char bw[32], cac_time[32];
3650
3651        pr_debug("  (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)\n");
3652
3653        for (i = 0; i < rd->n_reg_rules; i++) {
3654                reg_rule = &rd->reg_rules[i];
3655                freq_range = &reg_rule->freq_range;
3656                power_rule = &reg_rule->power_rule;
3657
3658                if (reg_rule->flags & NL80211_RRF_AUTO_BW)
3659                        snprintf(bw, sizeof(bw), "%d KHz, %u KHz AUTO",
3660                                 freq_range->max_bandwidth_khz,
3661                                 reg_get_max_bandwidth(rd, reg_rule));
3662                else
3663                        snprintf(bw, sizeof(bw), "%d KHz",
3664                                 freq_range->max_bandwidth_khz);
3665
3666                if (reg_rule->flags & NL80211_RRF_DFS)
3667                        scnprintf(cac_time, sizeof(cac_time), "%u s",
3668                                  reg_rule->dfs_cac_ms/1000);
3669                else
3670                        scnprintf(cac_time, sizeof(cac_time), "N/A");
3671
3672
3673                /*
3674                 * There may not be documentation for max antenna gain
3675                 * in certain regions
3676                 */
3677                if (power_rule->max_antenna_gain)
3678                        pr_debug("  (%d KHz - %d KHz @ %s), (%d mBi, %d mBm), (%s)\n",
3679                                freq_range->start_freq_khz,
3680                                freq_range->end_freq_khz,
3681                                bw,
3682                                power_rule->max_antenna_gain,
3683                                power_rule->max_eirp,
3684                                cac_time);
3685                else
3686                        pr_debug("  (%d KHz - %d KHz @ %s), (N/A, %d mBm), (%s)\n",
3687                                freq_range->start_freq_khz,
3688                                freq_range->end_freq_khz,
3689                                bw,
3690                                power_rule->max_eirp,
3691                                cac_time);
3692        }
3693}
3694
3695bool reg_supported_dfs_region(enum nl80211_dfs_regions dfs_region)
3696{
3697        switch (dfs_region) {
3698        case NL80211_DFS_UNSET:
3699        case NL80211_DFS_FCC:
3700        case NL80211_DFS_ETSI:
3701        case NL80211_DFS_JP:
3702                return true;
3703        default:
3704                pr_debug("Ignoring unknown DFS master region: %d\n", dfs_region);
3705                return false;
3706        }
3707}
3708
3709static void print_regdomain(const struct ieee80211_regdomain *rd)
3710{
3711        struct regulatory_request *lr = get_last_request();
3712
3713        if (is_intersected_alpha2(rd->alpha2)) {
3714                if (lr->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
3715                        struct cfg80211_registered_device *rdev;
3716                        rdev = cfg80211_rdev_by_wiphy_idx(lr->wiphy_idx);
3717                        if (rdev) {
3718                                pr_debug("Current regulatory domain updated by AP to: %c%c\n",
3719                                        rdev->country_ie_alpha2[0],
3720                                        rdev->country_ie_alpha2[1]);
3721                        } else
3722                                pr_debug("Current regulatory domain intersected:\n");
3723                } else
3724                        pr_debug("Current regulatory domain intersected:\n");
3725        } else if (is_world_regdom(rd->alpha2)) {
3726                pr_debug("World regulatory domain updated:\n");
3727        } else {
3728                if (is_unknown_alpha2(rd->alpha2))
3729                        pr_debug("Regulatory domain changed to driver built-in settings (unknown country)\n");
3730                else {
3731                        if (reg_request_cell_base(lr))
3732                                pr_debug("Regulatory domain changed to country: %c%c by Cell Station\n",
3733                                        rd->alpha2[0], rd->alpha2[1]);
3734                        else
3735                                pr_debug("Regulatory domain changed to country: %c%c\n",
3736                                        rd->alpha2[0], rd->alpha2[1]);
3737                }
3738        }
3739
3740        pr_debug(" DFS Master region: %s", reg_dfs_region_str(rd->dfs_region));
3741        print_rd_rules(rd);
3742}
3743
3744static void print_regdomain_info(const struct ieee80211_regdomain *rd)
3745{
3746        pr_debug("Regulatory domain: %c%c\n", rd->alpha2[0], rd->alpha2[1]);
3747        print_rd_rules(rd);
3748}
3749
3750static int reg_set_rd_core(const struct ieee80211_regdomain *rd)
3751{
3752        if (!is_world_regdom(rd->alpha2))
3753                return -EINVAL;
3754        update_world_regdomain(rd);
3755        return 0;
3756}
3757
3758static int reg_set_rd_user(const struct ieee80211_regdomain *rd,
3759                           struct regulatory_request *user_request)
3760{
3761        const struct ieee80211_regdomain *intersected_rd = NULL;
3762
3763        if (!regdom_changes(rd->alpha2))
3764                return -EALREADY;
3765
3766        if (!is_valid_rd(rd)) {
3767                pr_err("Invalid regulatory domain detected: %c%c\n",
3768                       rd->alpha2[0], rd->alpha2[1]);
3769                print_regdomain_info(rd);
3770                return -EINVAL;
3771        }
3772
3773        if (!user_request->intersect) {
3774                reset_regdomains(false, rd);
3775                return 0;
3776        }
3777
3778        intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
3779        if (!intersected_rd)
3780                return -EINVAL;
3781
3782        kfree(rd);
3783        rd = NULL;
3784        reset_regdomains(false, intersected_rd);
3785
3786        return 0;
3787}
3788
3789static int reg_set_rd_driver(const struct ieee80211_regdomain *rd,
3790                             struct regulatory_request *driver_request)
3791{
3792        const struct ieee80211_regdomain *regd;
3793        const struct ieee80211_regdomain *intersected_rd = NULL;
3794        const struct ieee80211_regdomain *tmp;
3795        struct wiphy *request_wiphy;
3796
3797        if (is_world_regdom(rd->alpha2))
3798                return -EINVAL;
3799
3800        if (!regdom_changes(rd->alpha2))
3801                return -EALREADY;
3802
3803        if (!is_valid_rd(rd)) {
3804                pr_err("Invalid regulatory domain detected: %c%c\n",
3805                       rd->alpha2[0], rd->alpha2[1]);
3806                print_regdomain_info(rd);
3807                return -EINVAL;
3808        }
3809
3810        request_wiphy = wiphy_idx_to_wiphy(driver_request->wiphy_idx);
3811        if (!request_wiphy)
3812                return -ENODEV;
3813
3814        if (!driver_request->intersect) {
3815                ASSERT_RTNL();
3816                wiphy_lock(request_wiphy);
3817                if (request_wiphy->regd) {
3818                        wiphy_unlock(request_wiphy);
3819                        return -EALREADY;
3820                }
3821
3822                regd = reg_copy_regd(rd);
3823                if (IS_ERR(regd)) {
3824                        wiphy_unlock(request_wiphy);
3825                        return PTR_ERR(regd);
3826                }
3827
3828                rcu_assign_pointer(request_wiphy->regd, regd);
3829                wiphy_unlock(request_wiphy);
3830                reset_regdomains(false, rd);
3831                return 0;
3832        }
3833
3834        intersected_rd = regdom_intersect(rd, get_cfg80211_regdom());
3835        if (!intersected_rd)
3836                return -EINVAL;
3837
3838        /*
3839         * We can trash what CRDA provided now.
3840         * However if a driver requested this specific regulatory
3841         * domain we keep it for its private use
3842         */
3843        tmp = get_wiphy_regdom(request_wiphy);
3844        rcu_assign_pointer(request_wiphy->regd, rd);
3845        rcu_free_regdom(tmp);
3846
3847        rd = NULL;
3848
3849        reset_regdomains(false, intersected_rd);
3850
3851        return 0;
3852}
3853
3854static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd,
3855                                 struct regulatory_request *country_ie_request)
3856{
3857        struct wiphy *request_wiphy;
3858
3859        if (!is_alpha2_set(rd->alpha2) && !is_an_alpha2(rd->alpha2) &&
3860            !is_unknown_alpha2(rd->alpha2))
3861                return -EINVAL;
3862
3863        /*
3864         * Lets only bother proceeding on the same alpha2 if the current
3865         * rd is non static (it means CRDA was present and was used last)
3866         * and the pending request came in from a country IE
3867         */
3868
3869        if (!is_valid_rd(rd)) {
3870                pr_err("Invalid regulatory domain detected: %c%c\n",
3871                       rd->alpha2[0], rd->alpha2[1]);
3872                print_regdomain_info(rd);
3873                return -EINVAL;
3874        }
3875
3876        request_wiphy = wiphy_idx_to_wiphy(country_ie_request->wiphy_idx);
3877        if (!request_wiphy)
3878                return -ENODEV;
3879
3880        if (country_ie_request->intersect)
3881                return -EINVAL;
3882
3883        reset_regdomains(false, rd);
3884        return 0;
3885}
3886
3887/*
3888 * Use this call to set the current regulatory domain. Conflicts with
3889 * multiple drivers can be ironed out later. Caller must've already
3890 * kmalloc'd the rd structure.
3891 */
3892int set_regdom(const struct ieee80211_regdomain *rd,
3893               enum ieee80211_regd_source regd_src)
3894{
3895        struct regulatory_request *lr;
3896        bool user_reset = false;
3897        int r;
3898
3899        if (IS_ERR_OR_NULL(rd))
3900                return -ENODATA;
3901
3902        if (!reg_is_valid_request(rd->alpha2)) {
3903                kfree(rd);
3904                return -EINVAL;
3905        }
3906
3907        if (regd_src == REGD_SOURCE_CRDA)
3908                reset_crda_timeouts();
3909
3910        lr = get_last_request();
3911
3912        /* Note that this doesn't update the wiphys, this is done below */
3913        switch (lr->initiator) {
3914        case NL80211_REGDOM_SET_BY_CORE:
3915                r = reg_set_rd_core(rd);
3916                break;
3917        case NL80211_REGDOM_SET_BY_USER:
3918                cfg80211_save_user_regdom(rd);
3919                r = reg_set_rd_user(rd, lr);
3920                user_reset = true;
3921                break;
3922        case NL80211_REGDOM_SET_BY_DRIVER:
3923                r = reg_set_rd_driver(rd, lr);
3924                break;
3925        case NL80211_REGDOM_SET_BY_COUNTRY_IE:
3926                r = reg_set_rd_country_ie(rd, lr);
3927                break;
3928        default:
3929                WARN(1, "invalid initiator %d\n", lr->initiator);
3930                kfree(rd);
3931                return -EINVAL;
3932        }
3933
3934        if (r) {
3935                switch (r) {
3936                case -EALREADY:
3937                        reg_set_request_processed();
3938                        break;
3939                default:
3940                        /* Back to world regulatory in case of errors */
3941                        restore_regulatory_settings(user_reset, false);
3942                }
3943
3944                kfree(rd);
3945                return r;
3946        }
3947
3948        /* This would make this whole thing pointless */
3949        if (WARN_ON(!lr->intersect && rd != get_cfg80211_regdom()))
3950                return -EINVAL;
3951
3952        /* update all wiphys now with the new established regulatory domain */
3953        update_all_wiphy_regulatory(lr->initiator);
3954
3955        print_regdomain(get_cfg80211_regdom());
3956
3957        nl80211_send_reg_change_event(lr);
3958
3959        reg_set_request_processed();
3960
3961        return 0;
3962}
3963
3964static int __regulatory_set_wiphy_regd(struct wiphy *wiphy,
3965                                       struct ieee80211_regdomain *rd)
3966{
3967        const struct ieee80211_regdomain *regd;
3968        const struct ieee80211_regdomain *prev_regd;
3969        struct cfg80211_registered_device *rdev;
3970
3971        if (WARN_ON(!wiphy || !rd))
3972                return -EINVAL;
3973
3974        if (WARN(!(wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED),
3975                 "wiphy should have REGULATORY_WIPHY_SELF_MANAGED\n"))
3976                return -EPERM;
3977
3978        if (WARN(!is_valid_rd(rd),
3979                 "Invalid regulatory domain detected: %c%c\n",
3980                 rd->alpha2[0], rd->alpha2[1])) {
3981                print_regdomain_info(rd);
3982                return -EINVAL;
3983        }
3984
3985        regd = reg_copy_regd(rd);
3986        if (IS_ERR(regd))
3987                return PTR_ERR(regd);
3988
3989        rdev = wiphy_to_rdev(wiphy);
3990
3991        spin_lock(&reg_requests_lock);
3992        prev_regd = rdev->requested_regd;
3993        rdev->requested_regd = regd;
3994        spin_unlock(&reg_requests_lock);
3995
3996        kfree(prev_regd);
3997        return 0;
3998}
3999
4000int regulatory_set_wiphy_regd(struct wiphy *wiphy,
4001                              struct ieee80211_regdomain *rd)
4002{
4003        int ret = __regulatory_set_wiphy_regd(wiphy, rd);
4004
4005        if (ret)
4006                return ret;
4007
4008        schedule_work(&reg_work);
4009        return 0;
4010}
4011EXPORT_SYMBOL(regulatory_set_wiphy_regd);
4012
4013int regulatory_set_wiphy_regd_sync(struct wiphy *wiphy,
4014                                   struct ieee80211_regdomain *rd)
4015{
4016        int ret;
4017
4018        ASSERT_RTNL();
4019
4020        ret = __regulatory_set_wiphy_regd(wiphy, rd);
4021        if (ret)
4022                return ret;
4023
4024        /* process the request immediately */
4025        reg_process_self_managed_hint(wiphy);
4026        reg_check_channels();
4027        return 0;
4028}
4029EXPORT_SYMBOL(regulatory_set_wiphy_regd_sync);
4030
4031void wiphy_regulatory_register(struct wiphy *wiphy)
4032{
4033        struct regulatory_request *lr = get_last_request();
4034
4035        /* self-managed devices ignore beacon hints and country IE */
4036        if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
4037                wiphy->regulatory_flags |= REGULATORY_DISABLE_BEACON_HINTS |
4038                                           REGULATORY_COUNTRY_IE_IGNORE;
4039
4040                /*
4041                 * The last request may have been received before this
4042                 * registration call. Call the driver notifier if
4043                 * initiator is USER.
4044                 */
4045                if (lr->initiator == NL80211_REGDOM_SET_BY_USER)
4046                        reg_call_notifier(wiphy, lr);
4047        }
4048
4049        if (!reg_dev_ignore_cell_hint(wiphy))
4050                reg_num_devs_support_basehint++;
4051
4052        wiphy_update_regulatory(wiphy, lr->initiator);
4053        wiphy_all_share_dfs_chan_state(wiphy);
4054        reg_process_self_managed_hints();
4055}
4056
4057void wiphy_regulatory_deregister(struct wiphy *wiphy)
4058{
4059        struct wiphy *request_wiphy = NULL;
4060        struct regulatory_request *lr;
4061
4062        lr = get_last_request();
4063
4064        if (!reg_dev_ignore_cell_hint(wiphy))
4065                reg_num_devs_support_basehint--;
4066
4067        rcu_free_regdom(get_wiphy_regdom(wiphy));
4068        RCU_INIT_POINTER(wiphy->regd, NULL);
4069
4070        if (lr)
4071                request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
4072
4073        if (!request_wiphy || request_wiphy != wiphy)
4074                return;
4075
4076        lr->wiphy_idx = WIPHY_IDX_INVALID;
4077        lr->country_ie_env = ENVIRON_ANY;
4078}
4079
4080/*
4081 * See FCC notices for UNII band definitions
4082 *  5GHz: https://www.fcc.gov/document/5-ghz-unlicensed-spectrum-unii
4083 *  6GHz: https://www.fcc.gov/document/fcc-proposes-more-spectrum-unlicensed-use-0
4084 */
4085int cfg80211_get_unii(int freq)
4086{
4087        /* UNII-1 */
4088        if (freq >= 5150 && freq <= 5250)
4089                return 0;
4090
4091        /* UNII-2A */
4092        if (freq > 5250 && freq <= 5350)
4093                return 1;
4094
4095        /* UNII-2B */
4096        if (freq > 5350 && freq <= 5470)
4097                return 2;
4098
4099        /* UNII-2C */
4100        if (freq > 5470 && freq <= 5725)
4101                return 3;
4102
4103        /* UNII-3 */
4104        if (freq > 5725 && freq <= 5825)
4105                return 4;
4106
4107        /* UNII-5 */
4108        if (freq > 5925 && freq <= 6425)
4109                return 5;
4110
4111        /* UNII-6 */
4112        if (freq > 6425 && freq <= 6525)
4113                return 6;
4114
4115        /* UNII-7 */
4116        if (freq > 6525 && freq <= 6875)
4117                return 7;
4118
4119        /* UNII-8 */
4120        if (freq > 6875 && freq <= 7125)
4121                return 8;
4122
4123        return -EINVAL;
4124}
4125
4126bool regulatory_indoor_allowed(void)
4127{
4128        return reg_is_indoor;
4129}
4130
4131bool regulatory_pre_cac_allowed(struct wiphy *wiphy)
4132{
4133        const struct ieee80211_regdomain *regd = NULL;
4134        const struct ieee80211_regdomain *wiphy_regd = NULL;
4135        bool pre_cac_allowed = false;
4136
4137        rcu_read_lock();
4138
4139        regd = rcu_dereference(cfg80211_regdomain);
4140        wiphy_regd = rcu_dereference(wiphy->regd);
4141        if (!wiphy_regd) {
4142                if (regd->dfs_region == NL80211_DFS_ETSI)
4143                        pre_cac_allowed = true;
4144
4145                rcu_read_unlock();
4146
4147                return pre_cac_allowed;
4148        }
4149
4150        if (regd->dfs_region == wiphy_regd->dfs_region &&
4151            wiphy_regd->dfs_region == NL80211_DFS_ETSI)
4152                pre_cac_allowed = true;
4153
4154        rcu_read_unlock();
4155
4156        return pre_cac_allowed;
4157}
4158EXPORT_SYMBOL(regulatory_pre_cac_allowed);
4159
4160static void cfg80211_check_and_end_cac(struct cfg80211_registered_device *rdev)
4161{
4162        struct wireless_dev *wdev;
4163        /* If we finished CAC or received radar, we should end any
4164         * CAC running on the same channels.
4165         * the check !cfg80211_chandef_dfs_usable contain 2 options:
4166         * either all channels are available - those the CAC_FINISHED
4167         * event has effected another wdev state, or there is a channel
4168         * in unavailable state in wdev chandef - those the RADAR_DETECTED
4169         * event has effected another wdev state.
4170         * In both cases we should end the CAC on the wdev.
4171         */
4172        list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
4173                if (wdev->cac_started &&
4174                    !cfg80211_chandef_dfs_usable(&rdev->wiphy, &wdev->chandef))
4175                        rdev_end_cac(rdev, wdev->netdev);
4176        }
4177}
4178
4179void regulatory_propagate_dfs_state(struct wiphy *wiphy,
4180                                    struct cfg80211_chan_def *chandef,
4181                                    enum nl80211_dfs_state dfs_state,
4182                                    enum nl80211_radar_event event)
4183{
4184        struct cfg80211_registered_device *rdev;
4185
4186        ASSERT_RTNL();
4187
4188        if (WARN_ON(!cfg80211_chandef_valid(chandef)))
4189                return;
4190
4191        list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
4192                if (wiphy == &rdev->wiphy)
4193                        continue;
4194
4195                if (!reg_dfs_domain_same(wiphy, &rdev->wiphy))
4196                        continue;
4197
4198                if (!ieee80211_get_channel(&rdev->wiphy,
4199                                           chandef->chan->center_freq))
4200                        continue;
4201
4202                cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state);
4203
4204                if (event == NL80211_RADAR_DETECTED ||
4205                    event == NL80211_RADAR_CAC_FINISHED) {
4206                        cfg80211_sched_dfs_chan_update(rdev);
4207                        cfg80211_check_and_end_cac(rdev);
4208                }
4209
4210                nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL);
4211        }
4212}
4213
4214static int __init regulatory_init_db(void)
4215{
4216        int err;
4217
4218        /*
4219         * It's possible that - due to other bugs/issues - cfg80211
4220         * never called regulatory_init() below, or that it failed;
4221         * in that case, don't try to do any further work here as
4222         * it's doomed to lead to crashes.
4223         */
4224        if (IS_ERR_OR_NULL(reg_pdev))
4225                return -EINVAL;
4226
4227        err = load_builtin_regdb_keys();
4228        if (err)
4229                return err;
4230
4231        /* We always try to get an update for the static regdomain */
4232        err = regulatory_hint_core(cfg80211_world_regdom->alpha2);
4233        if (err) {
4234                if (err == -ENOMEM) {
4235                        platform_device_unregister(reg_pdev);
4236                        return err;
4237                }
4238                /*
4239                 * N.B. kobject_uevent_env() can fail mainly for when we're out
4240                 * memory which is handled and propagated appropriately above
4241                 * but it can also fail during a netlink_broadcast() or during
4242                 * early boot for call_usermodehelper(). For now treat these
4243                 * errors as non-fatal.
4244                 */
4245                pr_err("kobject_uevent_env() was unable to call CRDA during init\n");
4246        }
4247
4248        /*
4249         * Finally, if the user set the module parameter treat it
4250         * as a user hint.
4251         */
4252        if (!is_world_regdom(ieee80211_regdom))
4253                regulatory_hint_user(ieee80211_regdom,
4254                                     NL80211_USER_REG_HINT_USER);
4255
4256        return 0;
4257}
4258#ifndef MODULE
4259late_initcall(regulatory_init_db);
4260#endif
4261
4262int __init regulatory_init(void)
4263{
4264        reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0);
4265        if (IS_ERR(reg_pdev))
4266                return PTR_ERR(reg_pdev);
4267
4268        rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
4269
4270        user_alpha2[0] = '9';
4271        user_alpha2[1] = '7';
4272
4273#ifdef MODULE
4274        return regulatory_init_db();
4275#else
4276        return 0;
4277#endif
4278}
4279
4280void regulatory_exit(void)
4281{
4282        struct regulatory_request *reg_request, *tmp;
4283        struct reg_beacon *reg_beacon, *btmp;
4284
4285        cancel_work_sync(&reg_work);
4286        cancel_crda_timeout_sync();
4287        cancel_delayed_work_sync(&reg_check_chans);
4288
4289        /* Lock to suppress warnings */
4290        rtnl_lock();
4291        reset_regdomains(true, NULL);
4292        rtnl_unlock();
4293
4294        dev_set_uevent_suppress(&reg_pdev->dev, true);
4295
4296        platform_device_unregister(reg_pdev);
4297
4298        list_for_each_entry_safe(reg_beacon, btmp, &reg_pending_beacons, list) {
4299                list_del(&reg_beacon->list);
4300                kfree(reg_beacon);
4301        }
4302
4303        list_for_each_entry_safe(reg_beacon, btmp, &reg_beacon_list, list) {
4304                list_del(&reg_beacon->list);
4305                kfree(reg_beacon);
4306        }
4307
4308        list_for_each_entry_safe(reg_request, tmp, &reg_requests_list, list) {
4309                list_del(&reg_request->list);
4310                kfree(reg_request);
4311        }
4312
4313        if (!IS_ERR_OR_NULL(regdb))
4314                kfree(regdb);
4315        if (!IS_ERR_OR_NULL(cfg80211_user_regdom))
4316                kfree(cfg80211_user_regdom);
4317
4318        free_regdb_keyring();
4319}
4320