Linux Audio

Check our new training course

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