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