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