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}
v3.15
  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 */
  8
  9#include <linux/export.h>
 10#include <net/cfg80211.h>
 11#include "core.h"
 12#include "rdev-ops.h"
 13
 14void cfg80211_chandef_create(struct cfg80211_chan_def *chandef,
 15			     struct ieee80211_channel *chan,
 16			     enum nl80211_channel_type chan_type)
 17{
 18	if (WARN_ON(!chan))
 19		return;
 20
 21	chandef->chan = chan;
 22	chandef->center_freq2 = 0;
 23
 24	switch (chan_type) {
 25	case NL80211_CHAN_NO_HT:
 26		chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
 27		chandef->center_freq1 = chan->center_freq;
 28		break;
 29	case NL80211_CHAN_HT20:
 30		chandef->width = NL80211_CHAN_WIDTH_20;
 31		chandef->center_freq1 = chan->center_freq;
 32		break;
 33	case NL80211_CHAN_HT40PLUS:
 34		chandef->width = NL80211_CHAN_WIDTH_40;
 35		chandef->center_freq1 = chan->center_freq + 10;
 36		break;
 37	case NL80211_CHAN_HT40MINUS:
 38		chandef->width = NL80211_CHAN_WIDTH_40;
 39		chandef->center_freq1 = chan->center_freq - 10;
 40		break;
 41	default:
 42		WARN_ON(1);
 43	}
 44}
 45EXPORT_SYMBOL(cfg80211_chandef_create);
 46
 47bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef)
 48{
 49	u32 control_freq;
 50
 51	if (!chandef->chan)
 52		return false;
 53
 54	control_freq = chandef->chan->center_freq;
 55
 56	switch (chandef->width) {
 57	case NL80211_CHAN_WIDTH_5:
 58	case NL80211_CHAN_WIDTH_10:
 59	case NL80211_CHAN_WIDTH_20:
 60	case NL80211_CHAN_WIDTH_20_NOHT:
 61		if (chandef->center_freq1 != control_freq)
 62			return false;
 63		if (chandef->center_freq2)
 64			return false;
 65		break;
 66	case NL80211_CHAN_WIDTH_40:
 67		if (chandef->center_freq1 != control_freq + 10 &&
 68		    chandef->center_freq1 != control_freq - 10)
 69			return false;
 70		if (chandef->center_freq2)
 71			return false;
 72		break;
 73	case NL80211_CHAN_WIDTH_80P80:
 74		if (chandef->center_freq1 != control_freq + 30 &&
 75		    chandef->center_freq1 != control_freq + 10 &&
 76		    chandef->center_freq1 != control_freq - 10 &&
 77		    chandef->center_freq1 != control_freq - 30)
 78			return false;
 79		if (!chandef->center_freq2)
 80			return false;
 81		/* adjacent is not allowed -- that's a 160 MHz channel */
 82		if (chandef->center_freq1 - chandef->center_freq2 == 80 ||
 83		    chandef->center_freq2 - chandef->center_freq1 == 80)
 84			return false;
 85		break;
 86	case NL80211_CHAN_WIDTH_80:
 87		if (chandef->center_freq1 != control_freq + 30 &&
 88		    chandef->center_freq1 != control_freq + 10 &&
 89		    chandef->center_freq1 != control_freq - 10 &&
 90		    chandef->center_freq1 != control_freq - 30)
 91			return false;
 92		if (chandef->center_freq2)
 93			return false;
 94		break;
 95	case NL80211_CHAN_WIDTH_160:
 96		if (chandef->center_freq1 != control_freq + 70 &&
 97		    chandef->center_freq1 != control_freq + 50 &&
 98		    chandef->center_freq1 != control_freq + 30 &&
 99		    chandef->center_freq1 != control_freq + 10 &&
100		    chandef->center_freq1 != control_freq - 10 &&
101		    chandef->center_freq1 != control_freq - 30 &&
102		    chandef->center_freq1 != control_freq - 50 &&
103		    chandef->center_freq1 != control_freq - 70)
104			return false;
105		if (chandef->center_freq2)
106			return false;
107		break;
108	default:
109		return false;
110	}
111
112	return true;
113}
114EXPORT_SYMBOL(cfg80211_chandef_valid);
115
116static void chandef_primary_freqs(const struct cfg80211_chan_def *c,
117				  int *pri40, int *pri80)
118{
119	int tmp;
120
121	switch (c->width) {
122	case NL80211_CHAN_WIDTH_40:
123		*pri40 = c->center_freq1;
124		*pri80 = 0;
125		break;
126	case NL80211_CHAN_WIDTH_80:
127	case NL80211_CHAN_WIDTH_80P80:
128		*pri80 = c->center_freq1;
129		/* n_P20 */
130		tmp = (30 + c->chan->center_freq - c->center_freq1)/20;
131		/* n_P40 */
132		tmp /= 2;
133		/* freq_P40 */
134		*pri40 = c->center_freq1 - 20 + 40 * tmp;
135		break;
136	case NL80211_CHAN_WIDTH_160:
137		/* n_P20 */
138		tmp = (70 + c->chan->center_freq - c->center_freq1)/20;
139		/* n_P40 */
140		tmp /= 2;
141		/* freq_P40 */
142		*pri40 = c->center_freq1 - 60 + 40 * tmp;
143		/* n_P80 */
144		tmp /= 2;
145		*pri80 = c->center_freq1 - 40 + 80 * tmp;
146		break;
147	default:
148		WARN_ON_ONCE(1);
149	}
150}
151
152static int cfg80211_chandef_get_width(const struct cfg80211_chan_def *c)
153{
154	int width;
155
156	switch (c->width) {
157	case NL80211_CHAN_WIDTH_5:
158		width = 5;
159		break;
160	case NL80211_CHAN_WIDTH_10:
161		width = 10;
162		break;
163	case NL80211_CHAN_WIDTH_20:
164	case NL80211_CHAN_WIDTH_20_NOHT:
165		width = 20;
166		break;
167	case NL80211_CHAN_WIDTH_40:
168		width = 40;
169		break;
170	case NL80211_CHAN_WIDTH_80P80:
171	case NL80211_CHAN_WIDTH_80:
172		width = 80;
173		break;
174	case NL80211_CHAN_WIDTH_160:
175		width = 160;
176		break;
177	default:
178		WARN_ON_ONCE(1);
179		return -1;
180	}
181	return width;
182}
183
184const struct cfg80211_chan_def *
185cfg80211_chandef_compatible(const struct cfg80211_chan_def *c1,
186			    const struct cfg80211_chan_def *c2)
187{
188	u32 c1_pri40, c1_pri80, c2_pri40, c2_pri80;
189
190	/* If they are identical, return */
191	if (cfg80211_chandef_identical(c1, c2))
192		return c1;
193
194	/* otherwise, must have same control channel */
195	if (c1->chan != c2->chan)
196		return NULL;
197
198	/*
199	 * If they have the same width, but aren't identical,
200	 * then they can't be compatible.
201	 */
202	if (c1->width == c2->width)
203		return NULL;
204
205	/*
206	 * can't be compatible if one of them is 5 or 10 MHz,
207	 * but they don't have the same width.
208	 */
209	if (c1->width == NL80211_CHAN_WIDTH_5 ||
210	    c1->width == NL80211_CHAN_WIDTH_10 ||
211	    c2->width == NL80211_CHAN_WIDTH_5 ||
212	    c2->width == NL80211_CHAN_WIDTH_10)
213		return NULL;
214
215	if (c1->width == NL80211_CHAN_WIDTH_20_NOHT ||
216	    c1->width == NL80211_CHAN_WIDTH_20)
217		return c2;
218
219	if (c2->width == NL80211_CHAN_WIDTH_20_NOHT ||
220	    c2->width == NL80211_CHAN_WIDTH_20)
221		return c1;
222
223	chandef_primary_freqs(c1, &c1_pri40, &c1_pri80);
224	chandef_primary_freqs(c2, &c2_pri40, &c2_pri80);
225
226	if (c1_pri40 != c2_pri40)
227		return NULL;
228
229	WARN_ON(!c1_pri80 && !c2_pri80);
230	if (c1_pri80 && c2_pri80 && c1_pri80 != c2_pri80)
231		return NULL;
232
233	if (c1->width > c2->width)
234		return c1;
235	return c2;
236}
237EXPORT_SYMBOL(cfg80211_chandef_compatible);
238
239static void cfg80211_set_chans_dfs_state(struct wiphy *wiphy, u32 center_freq,
240					 u32 bandwidth,
241					 enum nl80211_dfs_state dfs_state)
242{
243	struct ieee80211_channel *c;
244	u32 freq;
245
246	for (freq = center_freq - bandwidth/2 + 10;
247	     freq <= center_freq + bandwidth/2 - 10;
248	     freq += 20) {
249		c = ieee80211_get_channel(wiphy, freq);
250		if (!c || !(c->flags & IEEE80211_CHAN_RADAR))
251			continue;
252
253		c->dfs_state = dfs_state;
254		c->dfs_state_entered = jiffies;
255	}
256}
257
258void cfg80211_set_dfs_state(struct wiphy *wiphy,
259			    const struct cfg80211_chan_def *chandef,
260			    enum nl80211_dfs_state dfs_state)
261{
262	int width;
263
264	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
265		return;
266
267	width = cfg80211_chandef_get_width(chandef);
268	if (width < 0)
269		return;
270
271	cfg80211_set_chans_dfs_state(wiphy, chandef->center_freq1,
272				     width, dfs_state);
273
274	if (!chandef->center_freq2)
275		return;
276	cfg80211_set_chans_dfs_state(wiphy, chandef->center_freq2,
277				     width, dfs_state);
278}
279
280static u32 cfg80211_get_start_freq(u32 center_freq,
281				   u32 bandwidth)
282{
283	u32 start_freq;
284
285	if (bandwidth <= 20)
286		start_freq = center_freq;
287	else
288		start_freq = center_freq - bandwidth/2 + 10;
289
290	return start_freq;
291}
292
293static u32 cfg80211_get_end_freq(u32 center_freq,
294				 u32 bandwidth)
295{
296	u32 end_freq;
297
298	if (bandwidth <= 20)
299		end_freq = center_freq;
300	else
301		end_freq = center_freq + bandwidth/2 - 10;
302
303	return end_freq;
304}
305
306static int cfg80211_get_chans_dfs_required(struct wiphy *wiphy,
307					    u32 center_freq,
308					    u32 bandwidth)
309{
310	struct ieee80211_channel *c;
311	u32 freq, start_freq, end_freq;
312
313	start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
314	end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
315
316	for (freq = start_freq; freq <= end_freq; freq += 20) {
317		c = ieee80211_get_channel(wiphy, freq);
318		if (!c)
319			return -EINVAL;
320
321		if (c->flags & IEEE80211_CHAN_RADAR)
322			return 1;
323	}
324	return 0;
325}
326
327
328int cfg80211_chandef_dfs_required(struct wiphy *wiphy,
329				  const struct cfg80211_chan_def *chandef)
 
330{
331	int width;
332	int r;
333
334	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
335		return -EINVAL;
336
337	width = cfg80211_chandef_get_width(chandef);
338	if (width < 0)
339		return -EINVAL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
340
341	r = cfg80211_get_chans_dfs_required(wiphy, chandef->center_freq1,
342					    width);
343	if (r)
344		return r;
 
 
 
345
346	if (!chandef->center_freq2)
347		return 0;
 
 
 
 
 
 
 
 
 
 
 
 
348
349	return cfg80211_get_chans_dfs_required(wiphy, chandef->center_freq2,
350					       width);
351}
352EXPORT_SYMBOL(cfg80211_chandef_dfs_required);
353
354static int cfg80211_get_chans_dfs_usable(struct wiphy *wiphy,
355					 u32 center_freq,
356					 u32 bandwidth)
357{
358	struct ieee80211_channel *c;
359	u32 freq, start_freq, end_freq;
360	int count = 0;
361
362	start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
363	end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
364
365	/*
366	 * Check entire range of channels for the bandwidth.
367	 * Check all channels are DFS channels (DFS_USABLE or
368	 * DFS_AVAILABLE). Return number of usable channels
369	 * (require CAC). Allow DFS and non-DFS channel mix.
370	 */
371	for (freq = start_freq; freq <= end_freq; freq += 20) {
372		c = ieee80211_get_channel(wiphy, freq);
373		if (!c)
374			return -EINVAL;
375
376		if (c->flags & IEEE80211_CHAN_DISABLED)
377			return -EINVAL;
378
379		if (c->flags & IEEE80211_CHAN_RADAR) {
380			if (c->dfs_state == NL80211_DFS_UNAVAILABLE)
381				return -EINVAL;
382
383			if (c->dfs_state == NL80211_DFS_USABLE)
384				count++;
385		}
386	}
387
388	return count;
389}
390
391bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
392				 const struct cfg80211_chan_def *chandef)
393{
394	int width;
395	int r1, r2 = 0;
396
397	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
398		return false;
399
400	width = cfg80211_chandef_get_width(chandef);
401	if (width < 0)
402		return false;
403
404	r1 = cfg80211_get_chans_dfs_usable(wiphy, chandef->center_freq1,
405					  width);
406
407	if (r1 < 0)
408		return false;
409
410	switch (chandef->width) {
411	case NL80211_CHAN_WIDTH_80P80:
412		WARN_ON(!chandef->center_freq2);
413		r2 = cfg80211_get_chans_dfs_usable(wiphy,
414						   chandef->center_freq2,
415						   width);
416		if (r2 < 0)
417			return false;
418		break;
419	default:
420		WARN_ON(chandef->center_freq2);
421		break;
422	}
423
424	return (r1 + r2 > 0);
425}
426
427
428static bool cfg80211_get_chans_dfs_available(struct wiphy *wiphy,
429					     u32 center_freq,
430					     u32 bandwidth)
431{
432	struct ieee80211_channel *c;
433	u32 freq, start_freq, end_freq;
434
435	start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
436	end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
437
438	/*
439	 * Check entire range of channels for the bandwidth.
440	 * If any channel in between is disabled or has not
441	 * had gone through CAC return false
442	 */
443	for (freq = start_freq; freq <= end_freq; freq += 20) {
444		c = ieee80211_get_channel(wiphy, freq);
445		if (!c)
446			return false;
447
448		if (c->flags & IEEE80211_CHAN_DISABLED)
449			return false;
450
451		if ((c->flags & IEEE80211_CHAN_RADAR)  &&
452		    (c->dfs_state != NL80211_DFS_AVAILABLE))
453			return false;
454	}
455
456	return true;
457}
458
459static bool cfg80211_chandef_dfs_available(struct wiphy *wiphy,
460				const struct cfg80211_chan_def *chandef)
461{
462	int width;
463	int r;
464
465	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
466		return false;
467
468	width = cfg80211_chandef_get_width(chandef);
469	if (width < 0)
470		return false;
471
472	r = cfg80211_get_chans_dfs_available(wiphy, chandef->center_freq1,
473					     width);
474
475	/* If any of channels unavailable for cf1 just return */
476	if (!r)
477		return r;
478
479	switch (chandef->width) {
480	case NL80211_CHAN_WIDTH_80P80:
481		WARN_ON(!chandef->center_freq2);
482		r = cfg80211_get_chans_dfs_available(wiphy,
483						     chandef->center_freq2,
484						     width);
 
485	default:
486		WARN_ON(chandef->center_freq2);
487		break;
488	}
489
490	return r;
491}
492
493static unsigned int cfg80211_get_chans_dfs_cac_time(struct wiphy *wiphy,
494						    u32 center_freq,
495						    u32 bandwidth)
496{
497	struct ieee80211_channel *c;
498	u32 start_freq, end_freq, freq;
499	unsigned int dfs_cac_ms = 0;
500
501	start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
502	end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
503
504	for (freq = start_freq; freq <= end_freq; freq += 20) {
505		c = ieee80211_get_channel(wiphy, freq);
506		if (!c)
507			return 0;
508
509		if (c->flags & IEEE80211_CHAN_DISABLED)
510			return 0;
511
512		if (!(c->flags & IEEE80211_CHAN_RADAR))
513			continue;
514
515		if (c->dfs_cac_ms > dfs_cac_ms)
516			dfs_cac_ms = c->dfs_cac_ms;
517	}
518
519	return dfs_cac_ms;
520}
521
522unsigned int
523cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
524			      const struct cfg80211_chan_def *chandef)
525{
526	int width;
527	unsigned int t1 = 0, t2 = 0;
528
529	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
530		return 0;
531
532	width = cfg80211_chandef_get_width(chandef);
533	if (width < 0)
534		return 0;
535
536	t1 = cfg80211_get_chans_dfs_cac_time(wiphy,
537					     chandef->center_freq1,
538					     width);
539
540	if (!chandef->center_freq2)
541		return t1;
542
543	t2 = cfg80211_get_chans_dfs_cac_time(wiphy,
544					     chandef->center_freq2,
545					     width);
546
547	return max(t1, t2);
548}
549
550static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
551					u32 center_freq, u32 bandwidth,
552					u32 prohibited_flags)
553{
554	struct ieee80211_channel *c;
555	u32 freq, start_freq, end_freq;
556
557	start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
558	end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
559
560	for (freq = start_freq; freq <= end_freq; freq += 20) {
561		c = ieee80211_get_channel(wiphy, freq);
562		if (!c || c->flags & prohibited_flags)
563			return false;
564	}
565
566	return true;
567}
568
569bool cfg80211_chandef_usable(struct wiphy *wiphy,
570			     const struct cfg80211_chan_def *chandef,
571			     u32 prohibited_flags)
572{
573	struct ieee80211_sta_ht_cap *ht_cap;
574	struct ieee80211_sta_vht_cap *vht_cap;
575	u32 width, control_freq;
576
577	if (WARN_ON(!cfg80211_chandef_valid(chandef)))
578		return false;
579
580	ht_cap = &wiphy->bands[chandef->chan->band]->ht_cap;
581	vht_cap = &wiphy->bands[chandef->chan->band]->vht_cap;
582
583	control_freq = chandef->chan->center_freq;
584
585	switch (chandef->width) {
586	case NL80211_CHAN_WIDTH_5:
587		width = 5;
588		break;
589	case NL80211_CHAN_WIDTH_10:
 
590		width = 10;
591		break;
592	case NL80211_CHAN_WIDTH_20:
593		if (!ht_cap->ht_supported)
594			return false;
595	case NL80211_CHAN_WIDTH_20_NOHT:
 
596		width = 20;
597		break;
598	case NL80211_CHAN_WIDTH_40:
599		width = 40;
600		if (!ht_cap->ht_supported)
601			return false;
602		if (!(ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) ||
603		    ht_cap->cap & IEEE80211_HT_CAP_40MHZ_INTOLERANT)
604			return false;
605		if (chandef->center_freq1 < control_freq &&
606		    chandef->chan->flags & IEEE80211_CHAN_NO_HT40MINUS)
607			return false;
608		if (chandef->center_freq1 > control_freq &&
609		    chandef->chan->flags & IEEE80211_CHAN_NO_HT40PLUS)
610			return false;
611		break;
612	case NL80211_CHAN_WIDTH_80P80:
613		if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ))
 
614			return false;
615	case NL80211_CHAN_WIDTH_80:
616		if (!vht_cap->vht_supported)
617			return false;
618		prohibited_flags |= IEEE80211_CHAN_NO_80MHZ;
619		width = 80;
620		break;
621	case NL80211_CHAN_WIDTH_160:
622		if (!vht_cap->vht_supported)
623			return false;
624		if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ))
 
 
625			return false;
626		prohibited_flags |= IEEE80211_CHAN_NO_160MHZ;
627		width = 160;
628		break;
629	default:
630		WARN_ON_ONCE(1);
631		return false;
632	}
633
634	/*
635	 * TODO: What if there are only certain 80/160/80+80 MHz channels
636	 *	 allowed by the driver, or only certain combinations?
637	 *	 For 40 MHz the driver can set the NO_HT40 flags, but for
638	 *	 80/160 MHz and in particular 80+80 MHz this isn't really
639	 *	 feasible and we only have NO_80MHZ/NO_160MHZ so far but
640	 *	 no way to cover 80+80 MHz or more complex restrictions.
641	 *	 Note that such restrictions also need to be advertised to
642	 *	 userspace, for example for P2P channel selection.
643	 */
644
645	if (width > 20)
646		prohibited_flags |= IEEE80211_CHAN_NO_OFDM;
647
648	/* 5 and 10 MHz are only defined for the OFDM PHY */
649	if (width < 20)
650		prohibited_flags |= IEEE80211_CHAN_NO_OFDM;
651
652
653	if (!cfg80211_secondary_chans_ok(wiphy, chandef->center_freq1,
654					 width, prohibited_flags))
655		return false;
656
657	if (!chandef->center_freq2)
658		return true;
659	return cfg80211_secondary_chans_ok(wiphy, chandef->center_freq2,
660					   width, prohibited_flags);
661}
662EXPORT_SYMBOL(cfg80211_chandef_usable);
663
664bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
665			     struct cfg80211_chan_def *chandef)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
666{
667	bool res;
668	u32 prohibited_flags = IEEE80211_CHAN_DISABLED |
669			       IEEE80211_CHAN_NO_IR |
670			       IEEE80211_CHAN_RADAR;
671
672	trace_cfg80211_reg_can_beacon(wiphy, chandef);
 
 
 
673
674	if (cfg80211_chandef_dfs_required(wiphy, chandef) > 0 &&
675	    cfg80211_chandef_dfs_available(wiphy, chandef)) {
676		/* We can skip IEEE80211_CHAN_NO_IR if chandef dfs available */
677		prohibited_flags = IEEE80211_CHAN_DISABLED;
678	}
679
680	res = cfg80211_chandef_usable(wiphy, chandef, prohibited_flags);
681
682	trace_cfg80211_return_bool(res);
683	return res;
684}
 
 
 
 
 
 
 
685EXPORT_SYMBOL(cfg80211_reg_can_beacon);
686
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
687int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
688				 struct cfg80211_chan_def *chandef)
689{
690	if (!rdev->ops->set_monitor_channel)
691		return -EOPNOTSUPP;
692	if (!cfg80211_has_monitors_only(rdev))
693		return -EBUSY;
694
695	return rdev_set_monitor_channel(rdev, chandef);
696}
697
698void
699cfg80211_get_chan_state(struct wireless_dev *wdev,
700		        struct ieee80211_channel **chan,
701		        enum cfg80211_chan_mode *chanmode,
702		        u8 *radar_detect)
703{
 
 
704	*chan = NULL;
705	*chanmode = CHAN_MODE_UNDEFINED;
706
707	ASSERT_WDEV_LOCK(wdev);
708
709	if (wdev->netdev && !netif_running(wdev->netdev))
710		return;
711
712	switch (wdev->iftype) {
713	case NL80211_IFTYPE_ADHOC:
714		if (wdev->current_bss) {
715			*chan = wdev->current_bss->pub.channel;
716			*chanmode = (wdev->ibss_fixed &&
717				     !wdev->ibss_dfs_possible)
718				  ? CHAN_MODE_SHARED
719				  : CHAN_MODE_EXCLUSIVE;
720
721			/* consider worst-case - IBSS can try to return to the
722			 * original user-specified channel as creator */
723			if (wdev->ibss_dfs_possible)
724				*radar_detect |= BIT(wdev->chandef.width);
725			return;
726		}
727		break;
728	case NL80211_IFTYPE_STATION:
729	case NL80211_IFTYPE_P2P_CLIENT:
730		if (wdev->current_bss) {
731			*chan = wdev->current_bss->pub.channel;
732			*chanmode = CHAN_MODE_SHARED;
733			return;
734		}
735		break;
736	case NL80211_IFTYPE_AP:
737	case NL80211_IFTYPE_P2P_GO:
738		if (wdev->cac_started) {
739			*chan = wdev->chandef.chan;
740			*chanmode = CHAN_MODE_SHARED;
741			*radar_detect |= BIT(wdev->chandef.width);
742		} else if (wdev->beacon_interval) {
743			*chan = wdev->chandef.chan;
744			*chanmode = CHAN_MODE_SHARED;
745
746			if (cfg80211_chandef_dfs_required(wdev->wiphy,
747							  &wdev->chandef))
 
 
 
748				*radar_detect |= BIT(wdev->chandef.width);
749		}
750		return;
751	case NL80211_IFTYPE_MESH_POINT:
752		if (wdev->mesh_id_len) {
753			*chan = wdev->chandef.chan;
754			*chanmode = CHAN_MODE_SHARED;
755
756			if (cfg80211_chandef_dfs_required(wdev->wiphy,
757							  &wdev->chandef))
 
 
 
758				*radar_detect |= BIT(wdev->chandef.width);
759		}
760		return;
 
 
 
 
 
 
 
761	case NL80211_IFTYPE_MONITOR:
762	case NL80211_IFTYPE_AP_VLAN:
763	case NL80211_IFTYPE_WDS:
764	case NL80211_IFTYPE_P2P_DEVICE:
 
765		/* these interface types don't really have a channel */
766		return;
767	case NL80211_IFTYPE_UNSPECIFIED:
768	case NUM_NL80211_IFTYPES:
769		WARN_ON(1);
770	}
771}