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