Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / net / wireless / chan.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * This file contains helper code to handle channel
4  * settings and keeping track of what is possible at
5  * any point in time.
6  *
7  * Copyright 2009       Johannes Berg <johannes@sipsolutions.net>
8  * Copyright 2013-2014  Intel Mobile Communications GmbH
9  * Copyright 2018       Intel Corporation
10  */
11
12 #include <linux/export.h>
13 #include <net/cfg80211.h>
14 #include "core.h"
15 #include "rdev-ops.h"
16
17 void cfg80211_chandef_create(struct cfg80211_chan_def *chandef,
18                              struct ieee80211_channel *chan,
19                              enum nl80211_channel_type chan_type)
20 {
21         if (WARN_ON(!chan))
22                 return;
23
24         chandef->chan = chan;
25         chandef->center_freq2 = 0;
26
27         switch (chan_type) {
28         case NL80211_CHAN_NO_HT:
29                 chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
30                 chandef->center_freq1 = chan->center_freq;
31                 break;
32         case NL80211_CHAN_HT20:
33                 chandef->width = NL80211_CHAN_WIDTH_20;
34                 chandef->center_freq1 = chan->center_freq;
35                 break;
36         case NL80211_CHAN_HT40PLUS:
37                 chandef->width = NL80211_CHAN_WIDTH_40;
38                 chandef->center_freq1 = chan->center_freq + 10;
39                 break;
40         case NL80211_CHAN_HT40MINUS:
41                 chandef->width = NL80211_CHAN_WIDTH_40;
42                 chandef->center_freq1 = chan->center_freq - 10;
43                 break;
44         default:
45                 WARN_ON(1);
46         }
47 }
48 EXPORT_SYMBOL(cfg80211_chandef_create);
49
50 bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef)
51 {
52         u32 control_freq;
53
54         if (!chandef->chan)
55                 return false;
56
57         control_freq = chandef->chan->center_freq;
58
59         switch (chandef->width) {
60         case NL80211_CHAN_WIDTH_5:
61         case NL80211_CHAN_WIDTH_10:
62         case NL80211_CHAN_WIDTH_20:
63         case NL80211_CHAN_WIDTH_20_NOHT:
64                 if (chandef->center_freq1 != control_freq)
65                         return false;
66                 if (chandef->center_freq2)
67                         return false;
68                 break;
69         case NL80211_CHAN_WIDTH_40:
70                 if (chandef->center_freq1 != control_freq + 10 &&
71                     chandef->center_freq1 != control_freq - 10)
72                         return false;
73                 if (chandef->center_freq2)
74                         return false;
75                 break;
76         case NL80211_CHAN_WIDTH_80P80:
77                 if (chandef->center_freq1 != control_freq + 30 &&
78                     chandef->center_freq1 != control_freq + 10 &&
79                     chandef->center_freq1 != control_freq - 10 &&
80                     chandef->center_freq1 != control_freq - 30)
81                         return false;
82                 if (!chandef->center_freq2)
83                         return false;
84                 /* adjacent is not allowed -- that's a 160 MHz channel */
85                 if (chandef->center_freq1 - chandef->center_freq2 == 80 ||
86                     chandef->center_freq2 - chandef->center_freq1 == 80)
87                         return false;
88                 break;
89         case NL80211_CHAN_WIDTH_80:
90                 if (chandef->center_freq1 != control_freq + 30 &&
91                     chandef->center_freq1 != control_freq + 10 &&
92                     chandef->center_freq1 != control_freq - 10 &&
93                     chandef->center_freq1 != control_freq - 30)
94                         return false;
95                 if (chandef->center_freq2)
96                         return false;
97                 break;
98         case NL80211_CHAN_WIDTH_160:
99                 if (chandef->center_freq1 != control_freq + 70 &&
100                     chandef->center_freq1 != control_freq + 50 &&
101                     chandef->center_freq1 != control_freq + 30 &&
102                     chandef->center_freq1 != control_freq + 10 &&
103                     chandef->center_freq1 != control_freq - 10 &&
104                     chandef->center_freq1 != control_freq - 30 &&
105                     chandef->center_freq1 != control_freq - 50 &&
106                     chandef->center_freq1 != control_freq - 70)
107                         return false;
108                 if (chandef->center_freq2)
109                         return false;
110                 break;
111         default:
112                 return false;
113         }
114
115         return true;
116 }
117 EXPORT_SYMBOL(cfg80211_chandef_valid);
118
119 static void chandef_primary_freqs(const struct cfg80211_chan_def *c,
120                                   u32 *pri40, u32 *pri80)
121 {
122         int tmp;
123
124         switch (c->width) {
125         case NL80211_CHAN_WIDTH_40:
126                 *pri40 = c->center_freq1;
127                 *pri80 = 0;
128                 break;
129         case NL80211_CHAN_WIDTH_80:
130         case NL80211_CHAN_WIDTH_80P80:
131                 *pri80 = c->center_freq1;
132                 /* n_P20 */
133                 tmp = (30 + c->chan->center_freq - c->center_freq1)/20;
134                 /* n_P40 */
135                 tmp /= 2;
136                 /* freq_P40 */
137                 *pri40 = c->center_freq1 - 20 + 40 * tmp;
138                 break;
139         case NL80211_CHAN_WIDTH_160:
140                 /* n_P20 */
141                 tmp = (70 + c->chan->center_freq - c->center_freq1)/20;
142                 /* n_P40 */
143                 tmp /= 2;
144                 /* freq_P40 */
145                 *pri40 = c->center_freq1 - 60 + 40 * tmp;
146                 /* n_P80 */
147                 tmp /= 2;
148                 *pri80 = c->center_freq1 - 40 + 80 * tmp;
149                 break;
150         default:
151                 WARN_ON_ONCE(1);
152         }
153 }
154
155 static int cfg80211_chandef_get_width(const struct cfg80211_chan_def *c)
156 {
157         int width;
158
159         switch (c->width) {
160         case NL80211_CHAN_WIDTH_5:
161                 width = 5;
162                 break;
163         case NL80211_CHAN_WIDTH_10:
164                 width = 10;
165                 break;
166         case NL80211_CHAN_WIDTH_20:
167         case NL80211_CHAN_WIDTH_20_NOHT:
168                 width = 20;
169                 break;
170         case NL80211_CHAN_WIDTH_40:
171                 width = 40;
172                 break;
173         case NL80211_CHAN_WIDTH_80P80:
174         case NL80211_CHAN_WIDTH_80:
175                 width = 80;
176                 break;
177         case NL80211_CHAN_WIDTH_160:
178                 width = 160;
179                 break;
180         default:
181                 WARN_ON_ONCE(1);
182                 return -1;
183         }
184         return width;
185 }
186
187 const struct cfg80211_chan_def *
188 cfg80211_chandef_compatible(const struct cfg80211_chan_def *c1,
189                             const struct cfg80211_chan_def *c2)
190 {
191         u32 c1_pri40, c1_pri80, c2_pri40, c2_pri80;
192
193         /* If they are identical, return */
194         if (cfg80211_chandef_identical(c1, c2))
195                 return c1;
196
197         /* otherwise, must have same control channel */
198         if (c1->chan != c2->chan)
199                 return NULL;
200
201         /*
202          * If they have the same width, but aren't identical,
203          * then they can't be compatible.
204          */
205         if (c1->width == c2->width)
206                 return NULL;
207
208         /*
209          * can't be compatible if one of them is 5 or 10 MHz,
210          * but they don't have the same width.
211          */
212         if (c1->width == NL80211_CHAN_WIDTH_5 ||
213             c1->width == NL80211_CHAN_WIDTH_10 ||
214             c2->width == NL80211_CHAN_WIDTH_5 ||
215             c2->width == NL80211_CHAN_WIDTH_10)
216                 return NULL;
217
218         if (c1->width == NL80211_CHAN_WIDTH_20_NOHT ||
219             c1->width == NL80211_CHAN_WIDTH_20)
220                 return c2;
221
222         if (c2->width == NL80211_CHAN_WIDTH_20_NOHT ||
223             c2->width == NL80211_CHAN_WIDTH_20)
224                 return c1;
225
226         chandef_primary_freqs(c1, &c1_pri40, &c1_pri80);
227         chandef_primary_freqs(c2, &c2_pri40, &c2_pri80);
228
229         if (c1_pri40 != c2_pri40)
230                 return NULL;
231
232         WARN_ON(!c1_pri80 && !c2_pri80);
233         if (c1_pri80 && c2_pri80 && c1_pri80 != c2_pri80)
234                 return NULL;
235
236         if (c1->width > c2->width)
237                 return c1;
238         return c2;
239 }
240 EXPORT_SYMBOL(cfg80211_chandef_compatible);
241
242 static void cfg80211_set_chans_dfs_state(struct wiphy *wiphy, u32 center_freq,
243                                          u32 bandwidth,
244                                          enum nl80211_dfs_state dfs_state)
245 {
246         struct ieee80211_channel *c;
247         u32 freq;
248
249         for (freq = center_freq - bandwidth/2 + 10;
250              freq <= center_freq + bandwidth/2 - 10;
251              freq += 20) {
252                 c = ieee80211_get_channel(wiphy, freq);
253                 if (!c || !(c->flags & IEEE80211_CHAN_RADAR))
254                         continue;
255
256                 c->dfs_state = dfs_state;
257                 c->dfs_state_entered = jiffies;
258         }
259 }
260
261 void cfg80211_set_dfs_state(struct wiphy *wiphy,
262                             const struct cfg80211_chan_def *chandef,
263                             enum nl80211_dfs_state dfs_state)
264 {
265         int width;
266
267         if (WARN_ON(!cfg80211_chandef_valid(chandef)))
268                 return;
269
270         width = cfg80211_chandef_get_width(chandef);
271         if (width < 0)
272                 return;
273
274         cfg80211_set_chans_dfs_state(wiphy, chandef->center_freq1,
275                                      width, dfs_state);
276
277         if (!chandef->center_freq2)
278                 return;
279         cfg80211_set_chans_dfs_state(wiphy, chandef->center_freq2,
280                                      width, dfs_state);
281 }
282
283 static u32 cfg80211_get_start_freq(u32 center_freq,
284                                    u32 bandwidth)
285 {
286         u32 start_freq;
287
288         if (bandwidth <= 20)
289                 start_freq = center_freq;
290         else
291                 start_freq = center_freq - bandwidth/2 + 10;
292
293         return start_freq;
294 }
295
296 static u32 cfg80211_get_end_freq(u32 center_freq,
297                                  u32 bandwidth)
298 {
299         u32 end_freq;
300
301         if (bandwidth <= 20)
302                 end_freq = center_freq;
303         else
304                 end_freq = center_freq + bandwidth/2 - 10;
305
306         return end_freq;
307 }
308
309 static int cfg80211_get_chans_dfs_required(struct wiphy *wiphy,
310                                             u32 center_freq,
311                                             u32 bandwidth)
312 {
313         struct ieee80211_channel *c;
314         u32 freq, start_freq, end_freq;
315
316         start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
317         end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
318
319         for (freq = start_freq; freq <= end_freq; freq += 20) {
320                 c = ieee80211_get_channel(wiphy, freq);
321                 if (!c)
322                         return -EINVAL;
323
324                 if (c->flags & IEEE80211_CHAN_RADAR)
325                         return 1;
326         }
327         return 0;
328 }
329
330
331 int cfg80211_chandef_dfs_required(struct wiphy *wiphy,
332                                   const struct cfg80211_chan_def *chandef,
333                                   enum nl80211_iftype iftype)
334 {
335         int width;
336         int ret;
337
338         if (WARN_ON(!cfg80211_chandef_valid(chandef)))
339                 return -EINVAL;
340
341         switch (iftype) {
342         case NL80211_IFTYPE_ADHOC:
343         case NL80211_IFTYPE_AP:
344         case NL80211_IFTYPE_P2P_GO:
345         case NL80211_IFTYPE_MESH_POINT:
346                 width = cfg80211_chandef_get_width(chandef);
347                 if (width < 0)
348                         return -EINVAL;
349
350                 ret = cfg80211_get_chans_dfs_required(wiphy,
351                                                       chandef->center_freq1,
352                                                       width);
353                 if (ret < 0)
354                         return ret;
355                 else if (ret > 0)
356                         return BIT(chandef->width);
357
358                 if (!chandef->center_freq2)
359                         return 0;
360
361                 ret = cfg80211_get_chans_dfs_required(wiphy,
362                                                       chandef->center_freq2,
363                                                       width);
364                 if (ret < 0)
365                         return ret;
366                 else if (ret > 0)
367                         return BIT(chandef->width);
368
369                 break;
370         case NL80211_IFTYPE_STATION:
371         case NL80211_IFTYPE_OCB:
372         case NL80211_IFTYPE_P2P_CLIENT:
373         case NL80211_IFTYPE_MONITOR:
374         case NL80211_IFTYPE_AP_VLAN:
375         case NL80211_IFTYPE_WDS:
376         case NL80211_IFTYPE_P2P_DEVICE:
377         case NL80211_IFTYPE_NAN:
378                 break;
379         case NL80211_IFTYPE_UNSPECIFIED:
380         case NUM_NL80211_IFTYPES:
381                 WARN_ON(1);
382         }
383
384         return 0;
385 }
386 EXPORT_SYMBOL(cfg80211_chandef_dfs_required);
387
388 static int cfg80211_get_chans_dfs_usable(struct wiphy *wiphy,
389                                          u32 center_freq,
390                                          u32 bandwidth)
391 {
392         struct ieee80211_channel *c;
393         u32 freq, start_freq, end_freq;
394         int count = 0;
395
396         start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
397         end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
398
399         /*
400          * Check entire range of channels for the bandwidth.
401          * Check all channels are DFS channels (DFS_USABLE or
402          * DFS_AVAILABLE). Return number of usable channels
403          * (require CAC). Allow DFS and non-DFS channel mix.
404          */
405         for (freq = start_freq; freq <= end_freq; freq += 20) {
406                 c = ieee80211_get_channel(wiphy, freq);
407                 if (!c)
408                         return -EINVAL;
409
410                 if (c->flags & IEEE80211_CHAN_DISABLED)
411                         return -EINVAL;
412
413                 if (c->flags & IEEE80211_CHAN_RADAR) {
414                         if (c->dfs_state == NL80211_DFS_UNAVAILABLE)
415                                 return -EINVAL;
416
417                         if (c->dfs_state == NL80211_DFS_USABLE)
418                                 count++;
419                 }
420         }
421
422         return count;
423 }
424
425 bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
426                                  const struct cfg80211_chan_def *chandef)
427 {
428         int width;
429         int r1, r2 = 0;
430
431         if (WARN_ON(!cfg80211_chandef_valid(chandef)))
432                 return false;
433
434         width = cfg80211_chandef_get_width(chandef);
435         if (width < 0)
436                 return false;
437
438         r1 = cfg80211_get_chans_dfs_usable(wiphy, chandef->center_freq1,
439                                           width);
440
441         if (r1 < 0)
442                 return false;
443
444         switch (chandef->width) {
445         case NL80211_CHAN_WIDTH_80P80:
446                 WARN_ON(!chandef->center_freq2);
447                 r2 = cfg80211_get_chans_dfs_usable(wiphy,
448                                                    chandef->center_freq2,
449                                                    width);
450                 if (r2 < 0)
451                         return false;
452                 break;
453         default:
454                 WARN_ON(chandef->center_freq2);
455                 break;
456         }
457
458         return (r1 + r2 > 0);
459 }
460
461 /*
462  * Checks if center frequency of chan falls with in the bandwidth
463  * range of chandef.
464  */
465 bool cfg80211_is_sub_chan(struct cfg80211_chan_def *chandef,
466                           struct ieee80211_channel *chan)
467 {
468         int width;
469         u32 freq;
470
471         if (chandef->chan->center_freq == chan->center_freq)
472                 return true;
473
474         width = cfg80211_chandef_get_width(chandef);
475         if (width <= 20)
476                 return false;
477
478         for (freq = chandef->center_freq1 - width / 2 + 10;
479              freq <= chandef->center_freq1 + width / 2 - 10; freq += 20) {
480                 if (chan->center_freq == freq)
481                         return true;
482         }
483
484         if (!chandef->center_freq2)
485                 return false;
486
487         for (freq = chandef->center_freq2 - width / 2 + 10;
488              freq <= chandef->center_freq2 + width / 2 - 10; freq += 20) {
489                 if (chan->center_freq == freq)
490                         return true;
491         }
492
493         return false;
494 }
495
496 bool cfg80211_beaconing_iface_active(struct wireless_dev *wdev)
497 {
498         bool active = false;
499
500         ASSERT_WDEV_LOCK(wdev);
501
502         if (!wdev->chandef.chan)
503                 return false;
504
505         switch (wdev->iftype) {
506         case NL80211_IFTYPE_AP:
507         case NL80211_IFTYPE_P2P_GO:
508                 active = wdev->beacon_interval != 0;
509                 break;
510         case NL80211_IFTYPE_ADHOC:
511                 active = wdev->ssid_len != 0;
512                 break;
513         case NL80211_IFTYPE_MESH_POINT:
514                 active = wdev->mesh_id_len != 0;
515                 break;
516         case NL80211_IFTYPE_STATION:
517         case NL80211_IFTYPE_OCB:
518         case NL80211_IFTYPE_P2P_CLIENT:
519         case NL80211_IFTYPE_MONITOR:
520         case NL80211_IFTYPE_AP_VLAN:
521         case NL80211_IFTYPE_WDS:
522         case NL80211_IFTYPE_P2P_DEVICE:
523         /* Can NAN type be considered as beaconing interface? */
524         case NL80211_IFTYPE_NAN:
525                 break;
526         case NL80211_IFTYPE_UNSPECIFIED:
527         case NUM_NL80211_IFTYPES:
528                 WARN_ON(1);
529         }
530
531         return active;
532 }
533
534 static bool cfg80211_is_wiphy_oper_chan(struct wiphy *wiphy,
535                                         struct ieee80211_channel *chan)
536 {
537         struct wireless_dev *wdev;
538
539         list_for_each_entry(wdev, &wiphy->wdev_list, list) {
540                 wdev_lock(wdev);
541                 if (!cfg80211_beaconing_iface_active(wdev)) {
542                         wdev_unlock(wdev);
543                         continue;
544                 }
545
546                 if (cfg80211_is_sub_chan(&wdev->chandef, chan)) {
547                         wdev_unlock(wdev);
548                         return true;
549                 }
550                 wdev_unlock(wdev);
551         }
552
553         return false;
554 }
555
556 bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy,
557                                   struct ieee80211_channel *chan)
558 {
559         struct cfg80211_registered_device *rdev;
560
561         ASSERT_RTNL();
562
563         if (!(chan->flags & IEEE80211_CHAN_RADAR))
564                 return false;
565
566         list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
567                 if (!reg_dfs_domain_same(wiphy, &rdev->wiphy))
568                         continue;
569
570                 if (cfg80211_is_wiphy_oper_chan(&rdev->wiphy, chan))
571                         return true;
572         }
573
574         return false;
575 }
576
577 static bool cfg80211_get_chans_dfs_available(struct wiphy *wiphy,
578                                              u32 center_freq,
579                                              u32 bandwidth)
580 {
581         struct ieee80211_channel *c;
582         u32 freq, start_freq, end_freq;
583         bool dfs_offload;
584
585         dfs_offload = wiphy_ext_feature_isset(wiphy,
586                                               NL80211_EXT_FEATURE_DFS_OFFLOAD);
587
588         start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
589         end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
590
591         /*
592          * Check entire range of channels for the bandwidth.
593          * If any channel in between is disabled or has not
594          * had gone through CAC return false
595          */
596         for (freq = start_freq; freq <= end_freq; freq += 20) {
597                 c = ieee80211_get_channel(wiphy, freq);
598                 if (!c)
599                         return false;
600
601                 if (c->flags & IEEE80211_CHAN_DISABLED)
602                         return false;
603
604                 if ((c->flags & IEEE80211_CHAN_RADAR) &&
605                     (c->dfs_state != NL80211_DFS_AVAILABLE) &&
606                     !(c->dfs_state == NL80211_DFS_USABLE && dfs_offload))
607                         return false;
608         }
609
610         return true;
611 }
612
613 static bool cfg80211_chandef_dfs_available(struct wiphy *wiphy,
614                                 const struct cfg80211_chan_def *chandef)
615 {
616         int width;
617         int r;
618
619         if (WARN_ON(!cfg80211_chandef_valid(chandef)))
620                 return false;
621
622         width = cfg80211_chandef_get_width(chandef);
623         if (width < 0)
624                 return false;
625
626         r = cfg80211_get_chans_dfs_available(wiphy, chandef->center_freq1,
627                                              width);
628
629         /* If any of channels unavailable for cf1 just return */
630         if (!r)
631                 return r;
632
633         switch (chandef->width) {
634         case NL80211_CHAN_WIDTH_80P80:
635                 WARN_ON(!chandef->center_freq2);
636                 r = cfg80211_get_chans_dfs_available(wiphy,
637                                                      chandef->center_freq2,
638                                                      width);
639                 break;
640         default:
641                 WARN_ON(chandef->center_freq2);
642                 break;
643         }
644
645         return r;
646 }
647
648 static unsigned int cfg80211_get_chans_dfs_cac_time(struct wiphy *wiphy,
649                                                     u32 center_freq,
650                                                     u32 bandwidth)
651 {
652         struct ieee80211_channel *c;
653         u32 start_freq, end_freq, freq;
654         unsigned int dfs_cac_ms = 0;
655
656         start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
657         end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
658
659         for (freq = start_freq; freq <= end_freq; freq += 20) {
660                 c = ieee80211_get_channel(wiphy, freq);
661                 if (!c)
662                         return 0;
663
664                 if (c->flags & IEEE80211_CHAN_DISABLED)
665                         return 0;
666
667                 if (!(c->flags & IEEE80211_CHAN_RADAR))
668                         continue;
669
670                 if (c->dfs_cac_ms > dfs_cac_ms)
671                         dfs_cac_ms = c->dfs_cac_ms;
672         }
673
674         return dfs_cac_ms;
675 }
676
677 unsigned int
678 cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
679                               const struct cfg80211_chan_def *chandef)
680 {
681         int width;
682         unsigned int t1 = 0, t2 = 0;
683
684         if (WARN_ON(!cfg80211_chandef_valid(chandef)))
685                 return 0;
686
687         width = cfg80211_chandef_get_width(chandef);
688         if (width < 0)
689                 return 0;
690
691         t1 = cfg80211_get_chans_dfs_cac_time(wiphy,
692                                              chandef->center_freq1,
693                                              width);
694
695         if (!chandef->center_freq2)
696                 return t1;
697
698         t2 = cfg80211_get_chans_dfs_cac_time(wiphy,
699                                              chandef->center_freq2,
700                                              width);
701
702         return max(t1, t2);
703 }
704
705 static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
706                                         u32 center_freq, u32 bandwidth,
707                                         u32 prohibited_flags)
708 {
709         struct ieee80211_channel *c;
710         u32 freq, start_freq, end_freq;
711
712         start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
713         end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
714
715         for (freq = start_freq; freq <= end_freq; freq += 20) {
716                 c = ieee80211_get_channel(wiphy, freq);
717                 if (!c || c->flags & prohibited_flags)
718                         return false;
719         }
720
721         return true;
722 }
723
724 bool cfg80211_chandef_usable(struct wiphy *wiphy,
725                              const struct cfg80211_chan_def *chandef,
726                              u32 prohibited_flags)
727 {
728         struct ieee80211_sta_ht_cap *ht_cap;
729         struct ieee80211_sta_vht_cap *vht_cap;
730         u32 width, control_freq, cap;
731
732         if (WARN_ON(!cfg80211_chandef_valid(chandef)))
733                 return false;
734
735         ht_cap = &wiphy->bands[chandef->chan->band]->ht_cap;
736         vht_cap = &wiphy->bands[chandef->chan->band]->vht_cap;
737
738         control_freq = chandef->chan->center_freq;
739
740         switch (chandef->width) {
741         case NL80211_CHAN_WIDTH_5:
742                 width = 5;
743                 break;
744         case NL80211_CHAN_WIDTH_10:
745                 prohibited_flags |= IEEE80211_CHAN_NO_10MHZ;
746                 width = 10;
747                 break;
748         case NL80211_CHAN_WIDTH_20:
749                 if (!ht_cap->ht_supported)
750                         return false;
751                 /* fall through */
752         case NL80211_CHAN_WIDTH_20_NOHT:
753                 prohibited_flags |= IEEE80211_CHAN_NO_20MHZ;
754                 width = 20;
755                 break;
756         case NL80211_CHAN_WIDTH_40:
757                 width = 40;
758                 if (!ht_cap->ht_supported)
759                         return false;
760                 if (!(ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) ||
761                     ht_cap->cap & IEEE80211_HT_CAP_40MHZ_INTOLERANT)
762                         return false;
763                 if (chandef->center_freq1 < control_freq &&
764                     chandef->chan->flags & IEEE80211_CHAN_NO_HT40MINUS)
765                         return false;
766                 if (chandef->center_freq1 > control_freq &&
767                     chandef->chan->flags & IEEE80211_CHAN_NO_HT40PLUS)
768                         return false;
769                 break;
770         case NL80211_CHAN_WIDTH_80P80:
771                 cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
772                 if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)
773                         return false;
774                 /* fall through */
775         case NL80211_CHAN_WIDTH_80:
776                 if (!vht_cap->vht_supported)
777                         return false;
778                 prohibited_flags |= IEEE80211_CHAN_NO_80MHZ;
779                 width = 80;
780                 break;
781         case NL80211_CHAN_WIDTH_160:
782                 if (!vht_cap->vht_supported)
783                         return false;
784                 cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
785                 if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ &&
786                     cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)
787                         return false;
788                 prohibited_flags |= IEEE80211_CHAN_NO_160MHZ;
789                 width = 160;
790                 break;
791         default:
792                 WARN_ON_ONCE(1);
793                 return false;
794         }
795
796         /*
797          * TODO: What if there are only certain 80/160/80+80 MHz channels
798          *       allowed by the driver, or only certain combinations?
799          *       For 40 MHz the driver can set the NO_HT40 flags, but for
800          *       80/160 MHz and in particular 80+80 MHz this isn't really
801          *       feasible and we only have NO_80MHZ/NO_160MHZ so far but
802          *       no way to cover 80+80 MHz or more complex restrictions.
803          *       Note that such restrictions also need to be advertised to
804          *       userspace, for example for P2P channel selection.
805          */
806
807         if (width > 20)
808                 prohibited_flags |= IEEE80211_CHAN_NO_OFDM;
809
810         /* 5 and 10 MHz are only defined for the OFDM PHY */
811         if (width < 20)
812                 prohibited_flags |= IEEE80211_CHAN_NO_OFDM;
813
814
815         if (!cfg80211_secondary_chans_ok(wiphy, chandef->center_freq1,
816                                          width, prohibited_flags))
817                 return false;
818
819         if (!chandef->center_freq2)
820                 return true;
821         return cfg80211_secondary_chans_ok(wiphy, chandef->center_freq2,
822                                            width, prohibited_flags);
823 }
824 EXPORT_SYMBOL(cfg80211_chandef_usable);
825
826 /*
827  * Check if the channel can be used under permissive conditions mandated by
828  * some regulatory bodies, i.e., the channel is marked with
829  * IEEE80211_CHAN_IR_CONCURRENT and there is an additional station interface
830  * associated to an AP on the same channel or on the same UNII band
831  * (assuming that the AP is an authorized master).
832  * In addition allow operation on a channel on which indoor operation is
833  * allowed, iff we are currently operating in an indoor environment.
834  */
835 static bool cfg80211_ir_permissive_chan(struct wiphy *wiphy,
836                                         enum nl80211_iftype iftype,
837                                         struct ieee80211_channel *chan)
838 {
839         struct wireless_dev *wdev;
840         struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
841
842         ASSERT_RTNL();
843
844         if (!IS_ENABLED(CONFIG_CFG80211_REG_RELAX_NO_IR) ||
845             !(wiphy->regulatory_flags & REGULATORY_ENABLE_RELAX_NO_IR))
846                 return false;
847
848         /* only valid for GO and TDLS off-channel (station/p2p-CL) */
849         if (iftype != NL80211_IFTYPE_P2P_GO &&
850             iftype != NL80211_IFTYPE_STATION &&
851             iftype != NL80211_IFTYPE_P2P_CLIENT)
852                 return false;
853
854         if (regulatory_indoor_allowed() &&
855             (chan->flags & IEEE80211_CHAN_INDOOR_ONLY))
856                 return true;
857
858         if (!(chan->flags & IEEE80211_CHAN_IR_CONCURRENT))
859                 return false;
860
861         /*
862          * Generally, it is possible to rely on another device/driver to allow
863          * the IR concurrent relaxation, however, since the device can further
864          * enforce the relaxation (by doing a similar verifications as this),
865          * and thus fail the GO instantiation, consider only the interfaces of
866          * the current registered device.
867          */
868         list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
869                 struct ieee80211_channel *other_chan = NULL;
870                 int r1, r2;
871
872                 wdev_lock(wdev);
873                 if (wdev->iftype == NL80211_IFTYPE_STATION &&
874                     wdev->current_bss)
875                         other_chan = wdev->current_bss->pub.channel;
876
877                 /*
878                  * If a GO already operates on the same GO_CONCURRENT channel,
879                  * this one (maybe the same one) can beacon as well. We allow
880                  * the operation even if the station we relied on with
881                  * GO_CONCURRENT is disconnected now. But then we must make sure
882                  * we're not outdoor on an indoor-only channel.
883                  */
884                 if (iftype == NL80211_IFTYPE_P2P_GO &&
885                     wdev->iftype == NL80211_IFTYPE_P2P_GO &&
886                     wdev->beacon_interval &&
887                     !(chan->flags & IEEE80211_CHAN_INDOOR_ONLY))
888                         other_chan = wdev->chandef.chan;
889                 wdev_unlock(wdev);
890
891                 if (!other_chan)
892                         continue;
893
894                 if (chan == other_chan)
895                         return true;
896
897                 if (chan->band != NL80211_BAND_5GHZ)
898                         continue;
899
900                 r1 = cfg80211_get_unii(chan->center_freq);
901                 r2 = cfg80211_get_unii(other_chan->center_freq);
902
903                 if (r1 != -EINVAL && r1 == r2) {
904                         /*
905                          * At some locations channels 149-165 are considered a
906                          * bundle, but at other locations, e.g., Indonesia,
907                          * channels 149-161 are considered a bundle while
908                          * channel 165 is left out and considered to be in a
909                          * different bundle. Thus, in case that there is a
910                          * station interface connected to an AP on channel 165,
911                          * it is assumed that channels 149-161 are allowed for
912                          * GO operations. However, having a station interface
913                          * connected to an AP on channels 149-161, does not
914                          * allow GO operation on channel 165.
915                          */
916                         if (chan->center_freq == 5825 &&
917                             other_chan->center_freq != 5825)
918                                 continue;
919                         return true;
920                 }
921         }
922
923         return false;
924 }
925
926 static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy,
927                                      struct cfg80211_chan_def *chandef,
928                                      enum nl80211_iftype iftype,
929                                      bool check_no_ir)
930 {
931         bool res;
932         u32 prohibited_flags = IEEE80211_CHAN_DISABLED |
933                                IEEE80211_CHAN_RADAR;
934
935         trace_cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir);
936
937         if (check_no_ir)
938                 prohibited_flags |= IEEE80211_CHAN_NO_IR;
939
940         if (cfg80211_chandef_dfs_required(wiphy, chandef, iftype) > 0 &&
941             cfg80211_chandef_dfs_available(wiphy, chandef)) {
942                 /* We can skip IEEE80211_CHAN_NO_IR if chandef dfs available */
943                 prohibited_flags = IEEE80211_CHAN_DISABLED;
944         }
945
946         res = cfg80211_chandef_usable(wiphy, chandef, prohibited_flags);
947
948         trace_cfg80211_return_bool(res);
949         return res;
950 }
951
952 bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
953                              struct cfg80211_chan_def *chandef,
954                              enum nl80211_iftype iftype)
955 {
956         return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, true);
957 }
958 EXPORT_SYMBOL(cfg80211_reg_can_beacon);
959
960 bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
961                                    struct cfg80211_chan_def *chandef,
962                                    enum nl80211_iftype iftype)
963 {
964         bool check_no_ir;
965
966         ASSERT_RTNL();
967
968         /*
969          * Under certain conditions suggested by some regulatory bodies a
970          * GO/STA can IR on channels marked with IEEE80211_NO_IR. Set this flag
971          * only if such relaxations are not enabled and the conditions are not
972          * met.
973          */
974         check_no_ir = !cfg80211_ir_permissive_chan(wiphy, iftype,
975                                                    chandef->chan);
976
977         return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir);
978 }
979 EXPORT_SYMBOL(cfg80211_reg_can_beacon_relax);
980
981 int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
982                                  struct cfg80211_chan_def *chandef)
983 {
984         if (!rdev->ops->set_monitor_channel)
985                 return -EOPNOTSUPP;
986         if (!cfg80211_has_monitors_only(rdev))
987                 return -EBUSY;
988
989         return rdev_set_monitor_channel(rdev, chandef);
990 }
991
992 void
993 cfg80211_get_chan_state(struct wireless_dev *wdev,
994                         struct ieee80211_channel **chan,
995                         enum cfg80211_chan_mode *chanmode,
996                         u8 *radar_detect)
997 {
998         int ret;
999
1000         *chan = NULL;
1001         *chanmode = CHAN_MODE_UNDEFINED;
1002
1003         ASSERT_WDEV_LOCK(wdev);
1004
1005         if (wdev->netdev && !netif_running(wdev->netdev))
1006                 return;
1007
1008         switch (wdev->iftype) {
1009         case NL80211_IFTYPE_ADHOC:
1010                 if (wdev->current_bss) {
1011                         *chan = wdev->current_bss->pub.channel;
1012                         *chanmode = (wdev->ibss_fixed &&
1013                                      !wdev->ibss_dfs_possible)
1014                                   ? CHAN_MODE_SHARED
1015                                   : CHAN_MODE_EXCLUSIVE;
1016
1017                         /* consider worst-case - IBSS can try to return to the
1018                          * original user-specified channel as creator */
1019                         if (wdev->ibss_dfs_possible)
1020                                 *radar_detect |= BIT(wdev->chandef.width);
1021                         return;
1022                 }
1023                 break;
1024         case NL80211_IFTYPE_STATION:
1025         case NL80211_IFTYPE_P2P_CLIENT:
1026                 if (wdev->current_bss) {
1027                         *chan = wdev->current_bss->pub.channel;
1028                         *chanmode = CHAN_MODE_SHARED;
1029                         return;
1030                 }
1031                 break;
1032         case NL80211_IFTYPE_AP:
1033         case NL80211_IFTYPE_P2P_GO:
1034                 if (wdev->cac_started) {
1035                         *chan = wdev->chandef.chan;
1036                         *chanmode = CHAN_MODE_SHARED;
1037                         *radar_detect |= BIT(wdev->chandef.width);
1038                 } else if (wdev->beacon_interval) {
1039                         *chan = wdev->chandef.chan;
1040                         *chanmode = CHAN_MODE_SHARED;
1041
1042                         ret = cfg80211_chandef_dfs_required(wdev->wiphy,
1043                                                             &wdev->chandef,
1044                                                             wdev->iftype);
1045                         WARN_ON(ret < 0);
1046                         if (ret > 0)
1047                                 *radar_detect |= BIT(wdev->chandef.width);
1048                 }
1049                 return;
1050         case NL80211_IFTYPE_MESH_POINT:
1051                 if (wdev->mesh_id_len) {
1052                         *chan = wdev->chandef.chan;
1053                         *chanmode = CHAN_MODE_SHARED;
1054
1055                         ret = cfg80211_chandef_dfs_required(wdev->wiphy,
1056                                                             &wdev->chandef,
1057                                                             wdev->iftype);
1058                         WARN_ON(ret < 0);
1059                         if (ret > 0)
1060                                 *radar_detect |= BIT(wdev->chandef.width);
1061                 }
1062                 return;
1063         case NL80211_IFTYPE_OCB:
1064                 if (wdev->chandef.chan) {
1065                         *chan = wdev->chandef.chan;
1066                         *chanmode = CHAN_MODE_SHARED;
1067                         return;
1068                 }
1069                 break;
1070         case NL80211_IFTYPE_MONITOR:
1071         case NL80211_IFTYPE_AP_VLAN:
1072         case NL80211_IFTYPE_WDS:
1073         case NL80211_IFTYPE_P2P_DEVICE:
1074         case NL80211_IFTYPE_NAN:
1075                 /* these interface types don't really have a channel */
1076                 return;
1077         case NL80211_IFTYPE_UNSPECIFIED:
1078         case NUM_NL80211_IFTYPES:
1079                 WARN_ON(1);
1080         }
1081 }