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