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