xref: /openbmc/linux/net/mac80211/cfg.c (revision 6dfcd296)
1 /*
2  * mac80211 configuration hooks for cfg80211
3  *
4  * Copyright 2006-2010	Johannes Berg <johannes@sipsolutions.net>
5  * Copyright 2013-2015  Intel Mobile Communications GmbH
6  * Copyright (C) 2015-2016 Intel Deutschland GmbH
7  *
8  * This file is GPLv2 as found in COPYING.
9  */
10 
11 #include <linux/ieee80211.h>
12 #include <linux/nl80211.h>
13 #include <linux/rtnetlink.h>
14 #include <linux/slab.h>
15 #include <net/net_namespace.h>
16 #include <linux/rcupdate.h>
17 #include <linux/if_ether.h>
18 #include <net/cfg80211.h>
19 #include "ieee80211_i.h"
20 #include "driver-ops.h"
21 #include "rate.h"
22 #include "mesh.h"
23 #include "wme.h"
24 
25 static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy,
26 						const char *name,
27 						unsigned char name_assign_type,
28 						enum nl80211_iftype type,
29 						u32 *flags,
30 						struct vif_params *params)
31 {
32 	struct ieee80211_local *local = wiphy_priv(wiphy);
33 	struct wireless_dev *wdev;
34 	struct ieee80211_sub_if_data *sdata;
35 	int err;
36 
37 	err = ieee80211_if_add(local, name, name_assign_type, &wdev, type, params);
38 	if (err)
39 		return ERR_PTR(err);
40 
41 	if (type == NL80211_IFTYPE_MONITOR && flags) {
42 		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
43 		sdata->u.mntr.flags = *flags;
44 	}
45 
46 	return wdev;
47 }
48 
49 static int ieee80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
50 {
51 	ieee80211_if_remove(IEEE80211_WDEV_TO_SUB_IF(wdev));
52 
53 	return 0;
54 }
55 
56 static int ieee80211_change_iface(struct wiphy *wiphy,
57 				  struct net_device *dev,
58 				  enum nl80211_iftype type, u32 *flags,
59 				  struct vif_params *params)
60 {
61 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
62 	int ret;
63 
64 	ret = ieee80211_if_change_type(sdata, type);
65 	if (ret)
66 		return ret;
67 
68 	if (type == NL80211_IFTYPE_AP_VLAN &&
69 	    params && params->use_4addr == 0) {
70 		RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
71 		ieee80211_check_fast_rx_iface(sdata);
72 	} else if (type == NL80211_IFTYPE_STATION &&
73 		   params && params->use_4addr >= 0) {
74 		sdata->u.mgd.use_4addr = params->use_4addr;
75 	}
76 
77 	if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
78 		struct ieee80211_local *local = sdata->local;
79 		struct ieee80211_sub_if_data *monitor_sdata;
80 		u32 mu_mntr_cap_flag = NL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER;
81 
82 		monitor_sdata = rtnl_dereference(local->monitor_sdata);
83 		if (monitor_sdata &&
84 		    wiphy_ext_feature_isset(wiphy, mu_mntr_cap_flag)) {
85 			memcpy(monitor_sdata->vif.bss_conf.mu_group.membership,
86 			       params->vht_mumimo_groups, WLAN_MEMBERSHIP_LEN);
87 			memcpy(monitor_sdata->vif.bss_conf.mu_group.position,
88 			       params->vht_mumimo_groups + WLAN_MEMBERSHIP_LEN,
89 			       WLAN_USER_POSITION_LEN);
90 			monitor_sdata->vif.mu_mimo_owner = true;
91 			ieee80211_bss_info_change_notify(monitor_sdata,
92 							 BSS_CHANGED_MU_GROUPS);
93 
94 			ether_addr_copy(monitor_sdata->u.mntr.mu_follow_addr,
95 					params->macaddr);
96 		}
97 
98 		if (!flags)
99 			return 0;
100 
101 		if (ieee80211_sdata_running(sdata)) {
102 			u32 mask = MONITOR_FLAG_COOK_FRAMES |
103 				   MONITOR_FLAG_ACTIVE;
104 
105 			/*
106 			 * Prohibit MONITOR_FLAG_COOK_FRAMES and
107 			 * MONITOR_FLAG_ACTIVE to be changed while the
108 			 * interface is up.
109 			 * Else we would need to add a lot of cruft
110 			 * to update everything:
111 			 *	cooked_mntrs, monitor and all fif_* counters
112 			 *	reconfigure hardware
113 			 */
114 			if ((*flags & mask) != (sdata->u.mntr.flags & mask))
115 				return -EBUSY;
116 
117 			ieee80211_adjust_monitor_flags(sdata, -1);
118 			sdata->u.mntr.flags = *flags;
119 			ieee80211_adjust_monitor_flags(sdata, 1);
120 
121 			ieee80211_configure_filter(local);
122 		} else {
123 			/*
124 			 * Because the interface is down, ieee80211_do_stop
125 			 * and ieee80211_do_open take care of "everything"
126 			 * mentioned in the comment above.
127 			 */
128 			sdata->u.mntr.flags = *flags;
129 		}
130 	}
131 
132 	return 0;
133 }
134 
135 static int ieee80211_start_p2p_device(struct wiphy *wiphy,
136 				      struct wireless_dev *wdev)
137 {
138 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
139 	int ret;
140 
141 	mutex_lock(&sdata->local->chanctx_mtx);
142 	ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
143 	mutex_unlock(&sdata->local->chanctx_mtx);
144 	if (ret < 0)
145 		return ret;
146 
147 	return ieee80211_do_open(wdev, true);
148 }
149 
150 static void ieee80211_stop_p2p_device(struct wiphy *wiphy,
151 				      struct wireless_dev *wdev)
152 {
153 	ieee80211_sdata_stop(IEEE80211_WDEV_TO_SUB_IF(wdev));
154 }
155 
156 static int ieee80211_start_nan(struct wiphy *wiphy,
157 			       struct wireless_dev *wdev,
158 			       struct cfg80211_nan_conf *conf)
159 {
160 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
161 	int ret;
162 
163 	mutex_lock(&sdata->local->chanctx_mtx);
164 	ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
165 	mutex_unlock(&sdata->local->chanctx_mtx);
166 	if (ret < 0)
167 		return ret;
168 
169 	ret = ieee80211_do_open(wdev, true);
170 	if (ret)
171 		return ret;
172 
173 	ret = drv_start_nan(sdata->local, sdata, conf);
174 	if (ret)
175 		ieee80211_sdata_stop(sdata);
176 
177 	sdata->u.nan.conf = *conf;
178 
179 	return ret;
180 }
181 
182 static void ieee80211_stop_nan(struct wiphy *wiphy,
183 			       struct wireless_dev *wdev)
184 {
185 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
186 
187 	drv_stop_nan(sdata->local, sdata);
188 	ieee80211_sdata_stop(sdata);
189 }
190 
191 static int ieee80211_nan_change_conf(struct wiphy *wiphy,
192 				     struct wireless_dev *wdev,
193 				     struct cfg80211_nan_conf *conf,
194 				     u32 changes)
195 {
196 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
197 	struct cfg80211_nan_conf new_conf;
198 	int ret = 0;
199 
200 	if (sdata->vif.type != NL80211_IFTYPE_NAN)
201 		return -EOPNOTSUPP;
202 
203 	if (!ieee80211_sdata_running(sdata))
204 		return -ENETDOWN;
205 
206 	new_conf = sdata->u.nan.conf;
207 
208 	if (changes & CFG80211_NAN_CONF_CHANGED_PREF)
209 		new_conf.master_pref = conf->master_pref;
210 
211 	if (changes & CFG80211_NAN_CONF_CHANGED_DUAL)
212 		new_conf.dual = conf->dual;
213 
214 	ret = drv_nan_change_conf(sdata->local, sdata, &new_conf, changes);
215 	if (!ret)
216 		sdata->u.nan.conf = new_conf;
217 
218 	return ret;
219 }
220 
221 static int ieee80211_add_nan_func(struct wiphy *wiphy,
222 				  struct wireless_dev *wdev,
223 				  struct cfg80211_nan_func *nan_func)
224 {
225 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
226 	int ret;
227 
228 	if (sdata->vif.type != NL80211_IFTYPE_NAN)
229 		return -EOPNOTSUPP;
230 
231 	if (!ieee80211_sdata_running(sdata))
232 		return -ENETDOWN;
233 
234 	spin_lock_bh(&sdata->u.nan.func_lock);
235 
236 	ret = idr_alloc(&sdata->u.nan.function_inst_ids,
237 			nan_func, 1, sdata->local->hw.max_nan_de_entries + 1,
238 			GFP_ATOMIC);
239 	spin_unlock_bh(&sdata->u.nan.func_lock);
240 
241 	if (ret < 0)
242 		return ret;
243 
244 	nan_func->instance_id = ret;
245 
246 	WARN_ON(nan_func->instance_id == 0);
247 
248 	ret = drv_add_nan_func(sdata->local, sdata, nan_func);
249 	if (ret) {
250 		spin_lock_bh(&sdata->u.nan.func_lock);
251 		idr_remove(&sdata->u.nan.function_inst_ids,
252 			   nan_func->instance_id);
253 		spin_unlock_bh(&sdata->u.nan.func_lock);
254 	}
255 
256 	return ret;
257 }
258 
259 static struct cfg80211_nan_func *
260 ieee80211_find_nan_func_by_cookie(struct ieee80211_sub_if_data *sdata,
261 				  u64 cookie)
262 {
263 	struct cfg80211_nan_func *func;
264 	int id;
265 
266 	lockdep_assert_held(&sdata->u.nan.func_lock);
267 
268 	idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, id) {
269 		if (func->cookie == cookie)
270 			return func;
271 	}
272 
273 	return NULL;
274 }
275 
276 static void ieee80211_del_nan_func(struct wiphy *wiphy,
277 				  struct wireless_dev *wdev, u64 cookie)
278 {
279 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
280 	struct cfg80211_nan_func *func;
281 	u8 instance_id = 0;
282 
283 	if (sdata->vif.type != NL80211_IFTYPE_NAN ||
284 	    !ieee80211_sdata_running(sdata))
285 		return;
286 
287 	spin_lock_bh(&sdata->u.nan.func_lock);
288 
289 	func = ieee80211_find_nan_func_by_cookie(sdata, cookie);
290 	if (func)
291 		instance_id = func->instance_id;
292 
293 	spin_unlock_bh(&sdata->u.nan.func_lock);
294 
295 	if (instance_id)
296 		drv_del_nan_func(sdata->local, sdata, instance_id);
297 }
298 
299 static int ieee80211_set_noack_map(struct wiphy *wiphy,
300 				  struct net_device *dev,
301 				  u16 noack_map)
302 {
303 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
304 
305 	sdata->noack_map = noack_map;
306 
307 	ieee80211_check_fast_xmit_iface(sdata);
308 
309 	return 0;
310 }
311 
312 static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
313 			     u8 key_idx, bool pairwise, const u8 *mac_addr,
314 			     struct key_params *params)
315 {
316 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
317 	struct ieee80211_local *local = sdata->local;
318 	struct sta_info *sta = NULL;
319 	const struct ieee80211_cipher_scheme *cs = NULL;
320 	struct ieee80211_key *key;
321 	int err;
322 
323 	if (!ieee80211_sdata_running(sdata))
324 		return -ENETDOWN;
325 
326 	/* reject WEP and TKIP keys if WEP failed to initialize */
327 	switch (params->cipher) {
328 	case WLAN_CIPHER_SUITE_WEP40:
329 	case WLAN_CIPHER_SUITE_TKIP:
330 	case WLAN_CIPHER_SUITE_WEP104:
331 		if (IS_ERR(local->wep_tx_tfm))
332 			return -EINVAL;
333 		break;
334 	case WLAN_CIPHER_SUITE_CCMP:
335 	case WLAN_CIPHER_SUITE_CCMP_256:
336 	case WLAN_CIPHER_SUITE_AES_CMAC:
337 	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
338 	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
339 	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
340 	case WLAN_CIPHER_SUITE_GCMP:
341 	case WLAN_CIPHER_SUITE_GCMP_256:
342 		break;
343 	default:
344 		cs = ieee80211_cs_get(local, params->cipher, sdata->vif.type);
345 		break;
346 	}
347 
348 	key = ieee80211_key_alloc(params->cipher, key_idx, params->key_len,
349 				  params->key, params->seq_len, params->seq,
350 				  cs);
351 	if (IS_ERR(key))
352 		return PTR_ERR(key);
353 
354 	if (pairwise)
355 		key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE;
356 
357 	mutex_lock(&local->sta_mtx);
358 
359 	if (mac_addr) {
360 		if (ieee80211_vif_is_mesh(&sdata->vif))
361 			sta = sta_info_get(sdata, mac_addr);
362 		else
363 			sta = sta_info_get_bss(sdata, mac_addr);
364 		/*
365 		 * The ASSOC test makes sure the driver is ready to
366 		 * receive the key. When wpa_supplicant has roamed
367 		 * using FT, it attempts to set the key before
368 		 * association has completed, this rejects that attempt
369 		 * so it will set the key again after association.
370 		 *
371 		 * TODO: accept the key if we have a station entry and
372 		 *       add it to the device after the station.
373 		 */
374 		if (!sta || !test_sta_flag(sta, WLAN_STA_ASSOC)) {
375 			ieee80211_key_free_unused(key);
376 			err = -ENOENT;
377 			goto out_unlock;
378 		}
379 	}
380 
381 	switch (sdata->vif.type) {
382 	case NL80211_IFTYPE_STATION:
383 		if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED)
384 			key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
385 		break;
386 	case NL80211_IFTYPE_AP:
387 	case NL80211_IFTYPE_AP_VLAN:
388 		/* Keys without a station are used for TX only */
389 		if (key->sta && test_sta_flag(key->sta, WLAN_STA_MFP))
390 			key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
391 		break;
392 	case NL80211_IFTYPE_ADHOC:
393 		/* no MFP (yet) */
394 		break;
395 	case NL80211_IFTYPE_MESH_POINT:
396 #ifdef CONFIG_MAC80211_MESH
397 		if (sdata->u.mesh.security != IEEE80211_MESH_SEC_NONE)
398 			key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
399 		break;
400 #endif
401 	case NL80211_IFTYPE_WDS:
402 	case NL80211_IFTYPE_MONITOR:
403 	case NL80211_IFTYPE_P2P_DEVICE:
404 	case NL80211_IFTYPE_NAN:
405 	case NL80211_IFTYPE_UNSPECIFIED:
406 	case NUM_NL80211_IFTYPES:
407 	case NL80211_IFTYPE_P2P_CLIENT:
408 	case NL80211_IFTYPE_P2P_GO:
409 	case NL80211_IFTYPE_OCB:
410 		/* shouldn't happen */
411 		WARN_ON_ONCE(1);
412 		break;
413 	}
414 
415 	if (sta)
416 		sta->cipher_scheme = cs;
417 
418 	err = ieee80211_key_link(key, sdata, sta);
419 
420  out_unlock:
421 	mutex_unlock(&local->sta_mtx);
422 
423 	return err;
424 }
425 
426 static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
427 			     u8 key_idx, bool pairwise, const u8 *mac_addr)
428 {
429 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
430 	struct ieee80211_local *local = sdata->local;
431 	struct sta_info *sta;
432 	struct ieee80211_key *key = NULL;
433 	int ret;
434 
435 	mutex_lock(&local->sta_mtx);
436 	mutex_lock(&local->key_mtx);
437 
438 	if (mac_addr) {
439 		ret = -ENOENT;
440 
441 		sta = sta_info_get_bss(sdata, mac_addr);
442 		if (!sta)
443 			goto out_unlock;
444 
445 		if (pairwise)
446 			key = key_mtx_dereference(local, sta->ptk[key_idx]);
447 		else
448 			key = key_mtx_dereference(local, sta->gtk[key_idx]);
449 	} else
450 		key = key_mtx_dereference(local, sdata->keys[key_idx]);
451 
452 	if (!key) {
453 		ret = -ENOENT;
454 		goto out_unlock;
455 	}
456 
457 	ieee80211_key_free(key, true);
458 
459 	ret = 0;
460  out_unlock:
461 	mutex_unlock(&local->key_mtx);
462 	mutex_unlock(&local->sta_mtx);
463 
464 	return ret;
465 }
466 
467 static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
468 			     u8 key_idx, bool pairwise, const u8 *mac_addr,
469 			     void *cookie,
470 			     void (*callback)(void *cookie,
471 					      struct key_params *params))
472 {
473 	struct ieee80211_sub_if_data *sdata;
474 	struct sta_info *sta = NULL;
475 	u8 seq[6] = {0};
476 	struct key_params params;
477 	struct ieee80211_key *key = NULL;
478 	u64 pn64;
479 	u32 iv32;
480 	u16 iv16;
481 	int err = -ENOENT;
482 	struct ieee80211_key_seq kseq = {};
483 
484 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
485 
486 	rcu_read_lock();
487 
488 	if (mac_addr) {
489 		sta = sta_info_get_bss(sdata, mac_addr);
490 		if (!sta)
491 			goto out;
492 
493 		if (pairwise && key_idx < NUM_DEFAULT_KEYS)
494 			key = rcu_dereference(sta->ptk[key_idx]);
495 		else if (!pairwise &&
496 			 key_idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
497 			key = rcu_dereference(sta->gtk[key_idx]);
498 	} else
499 		key = rcu_dereference(sdata->keys[key_idx]);
500 
501 	if (!key)
502 		goto out;
503 
504 	memset(&params, 0, sizeof(params));
505 
506 	params.cipher = key->conf.cipher;
507 
508 	switch (key->conf.cipher) {
509 	case WLAN_CIPHER_SUITE_TKIP:
510 		pn64 = atomic64_read(&key->conf.tx_pn);
511 		iv32 = TKIP_PN_TO_IV32(pn64);
512 		iv16 = TKIP_PN_TO_IV16(pn64);
513 
514 		if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
515 		    !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
516 			drv_get_key_seq(sdata->local, key, &kseq);
517 			iv32 = kseq.tkip.iv32;
518 			iv16 = kseq.tkip.iv16;
519 		}
520 
521 		seq[0] = iv16 & 0xff;
522 		seq[1] = (iv16 >> 8) & 0xff;
523 		seq[2] = iv32 & 0xff;
524 		seq[3] = (iv32 >> 8) & 0xff;
525 		seq[4] = (iv32 >> 16) & 0xff;
526 		seq[5] = (iv32 >> 24) & 0xff;
527 		params.seq = seq;
528 		params.seq_len = 6;
529 		break;
530 	case WLAN_CIPHER_SUITE_CCMP:
531 	case WLAN_CIPHER_SUITE_CCMP_256:
532 	case WLAN_CIPHER_SUITE_AES_CMAC:
533 	case WLAN_CIPHER_SUITE_BIP_CMAC_256:
534 		BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
535 			     offsetof(typeof(kseq), aes_cmac));
536 	case WLAN_CIPHER_SUITE_BIP_GMAC_128:
537 	case WLAN_CIPHER_SUITE_BIP_GMAC_256:
538 		BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
539 			     offsetof(typeof(kseq), aes_gmac));
540 	case WLAN_CIPHER_SUITE_GCMP:
541 	case WLAN_CIPHER_SUITE_GCMP_256:
542 		BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
543 			     offsetof(typeof(kseq), gcmp));
544 
545 		if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE &&
546 		    !(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
547 			drv_get_key_seq(sdata->local, key, &kseq);
548 			memcpy(seq, kseq.ccmp.pn, 6);
549 		} else {
550 			pn64 = atomic64_read(&key->conf.tx_pn);
551 			seq[0] = pn64;
552 			seq[1] = pn64 >> 8;
553 			seq[2] = pn64 >> 16;
554 			seq[3] = pn64 >> 24;
555 			seq[4] = pn64 >> 32;
556 			seq[5] = pn64 >> 40;
557 		}
558 		params.seq = seq;
559 		params.seq_len = 6;
560 		break;
561 	default:
562 		if (!(key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
563 			break;
564 		if (WARN_ON(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))
565 			break;
566 		drv_get_key_seq(sdata->local, key, &kseq);
567 		params.seq = kseq.hw.seq;
568 		params.seq_len = kseq.hw.seq_len;
569 		break;
570 	}
571 
572 	params.key = key->conf.key;
573 	params.key_len = key->conf.keylen;
574 
575 	callback(cookie, &params);
576 	err = 0;
577 
578  out:
579 	rcu_read_unlock();
580 	return err;
581 }
582 
583 static int ieee80211_config_default_key(struct wiphy *wiphy,
584 					struct net_device *dev,
585 					u8 key_idx, bool uni,
586 					bool multi)
587 {
588 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
589 
590 	ieee80211_set_default_key(sdata, key_idx, uni, multi);
591 
592 	return 0;
593 }
594 
595 static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
596 					     struct net_device *dev,
597 					     u8 key_idx)
598 {
599 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
600 
601 	ieee80211_set_default_mgmt_key(sdata, key_idx);
602 
603 	return 0;
604 }
605 
606 void sta_set_rate_info_tx(struct sta_info *sta,
607 			  const struct ieee80211_tx_rate *rate,
608 			  struct rate_info *rinfo)
609 {
610 	rinfo->flags = 0;
611 	if (rate->flags & IEEE80211_TX_RC_MCS) {
612 		rinfo->flags |= RATE_INFO_FLAGS_MCS;
613 		rinfo->mcs = rate->idx;
614 	} else if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
615 		rinfo->flags |= RATE_INFO_FLAGS_VHT_MCS;
616 		rinfo->mcs = ieee80211_rate_get_vht_mcs(rate);
617 		rinfo->nss = ieee80211_rate_get_vht_nss(rate);
618 	} else {
619 		struct ieee80211_supported_band *sband;
620 		int shift = ieee80211_vif_get_shift(&sta->sdata->vif);
621 		u16 brate;
622 
623 		sband = sta->local->hw.wiphy->bands[
624 				ieee80211_get_sdata_band(sta->sdata)];
625 		brate = sband->bitrates[rate->idx].bitrate;
626 		rinfo->legacy = DIV_ROUND_UP(brate, 1 << shift);
627 	}
628 	if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
629 		rinfo->bw = RATE_INFO_BW_40;
630 	else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
631 		rinfo->bw = RATE_INFO_BW_80;
632 	else if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
633 		rinfo->bw = RATE_INFO_BW_160;
634 	else
635 		rinfo->bw = RATE_INFO_BW_20;
636 	if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
637 		rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
638 }
639 
640 static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
641 				  int idx, u8 *mac, struct station_info *sinfo)
642 {
643 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
644 	struct ieee80211_local *local = sdata->local;
645 	struct sta_info *sta;
646 	int ret = -ENOENT;
647 
648 	mutex_lock(&local->sta_mtx);
649 
650 	sta = sta_info_get_by_idx(sdata, idx);
651 	if (sta) {
652 		ret = 0;
653 		memcpy(mac, sta->sta.addr, ETH_ALEN);
654 		sta_set_sinfo(sta, sinfo);
655 	}
656 
657 	mutex_unlock(&local->sta_mtx);
658 
659 	return ret;
660 }
661 
662 static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
663 				 int idx, struct survey_info *survey)
664 {
665 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
666 
667 	return drv_get_survey(local, idx, survey);
668 }
669 
670 static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
671 				 const u8 *mac, struct station_info *sinfo)
672 {
673 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
674 	struct ieee80211_local *local = sdata->local;
675 	struct sta_info *sta;
676 	int ret = -ENOENT;
677 
678 	mutex_lock(&local->sta_mtx);
679 
680 	sta = sta_info_get_bss(sdata, mac);
681 	if (sta) {
682 		ret = 0;
683 		sta_set_sinfo(sta, sinfo);
684 	}
685 
686 	mutex_unlock(&local->sta_mtx);
687 
688 	return ret;
689 }
690 
691 static int ieee80211_set_monitor_channel(struct wiphy *wiphy,
692 					 struct cfg80211_chan_def *chandef)
693 {
694 	struct ieee80211_local *local = wiphy_priv(wiphy);
695 	struct ieee80211_sub_if_data *sdata;
696 	int ret = 0;
697 
698 	if (cfg80211_chandef_identical(&local->monitor_chandef, chandef))
699 		return 0;
700 
701 	mutex_lock(&local->mtx);
702 	mutex_lock(&local->iflist_mtx);
703 	if (local->use_chanctx) {
704 		sdata = rcu_dereference_protected(
705 				local->monitor_sdata,
706 				lockdep_is_held(&local->iflist_mtx));
707 		if (sdata) {
708 			ieee80211_vif_release_channel(sdata);
709 			ret = ieee80211_vif_use_channel(sdata, chandef,
710 					IEEE80211_CHANCTX_EXCLUSIVE);
711 		}
712 	} else if (local->open_count == local->monitors) {
713 		local->_oper_chandef = *chandef;
714 		ieee80211_hw_config(local, 0);
715 	}
716 
717 	if (ret == 0)
718 		local->monitor_chandef = *chandef;
719 	mutex_unlock(&local->iflist_mtx);
720 	mutex_unlock(&local->mtx);
721 
722 	return ret;
723 }
724 
725 static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
726 				    const u8 *resp, size_t resp_len,
727 				    const struct ieee80211_csa_settings *csa)
728 {
729 	struct probe_resp *new, *old;
730 
731 	if (!resp || !resp_len)
732 		return 1;
733 
734 	old = sdata_dereference(sdata->u.ap.probe_resp, sdata);
735 
736 	new = kzalloc(sizeof(struct probe_resp) + resp_len, GFP_KERNEL);
737 	if (!new)
738 		return -ENOMEM;
739 
740 	new->len = resp_len;
741 	memcpy(new->data, resp, resp_len);
742 
743 	if (csa)
744 		memcpy(new->csa_counter_offsets, csa->counter_offsets_presp,
745 		       csa->n_counter_offsets_presp *
746 		       sizeof(new->csa_counter_offsets[0]));
747 
748 	rcu_assign_pointer(sdata->u.ap.probe_resp, new);
749 	if (old)
750 		kfree_rcu(old, rcu_head);
751 
752 	return 0;
753 }
754 
755 static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
756 				   struct cfg80211_beacon_data *params,
757 				   const struct ieee80211_csa_settings *csa)
758 {
759 	struct beacon_data *new, *old;
760 	int new_head_len, new_tail_len;
761 	int size, err;
762 	u32 changed = BSS_CHANGED_BEACON;
763 
764 	old = sdata_dereference(sdata->u.ap.beacon, sdata);
765 
766 
767 	/* Need to have a beacon head if we don't have one yet */
768 	if (!params->head && !old)
769 		return -EINVAL;
770 
771 	/* new or old head? */
772 	if (params->head)
773 		new_head_len = params->head_len;
774 	else
775 		new_head_len = old->head_len;
776 
777 	/* new or old tail? */
778 	if (params->tail || !old)
779 		/* params->tail_len will be zero for !params->tail */
780 		new_tail_len = params->tail_len;
781 	else
782 		new_tail_len = old->tail_len;
783 
784 	size = sizeof(*new) + new_head_len + new_tail_len;
785 
786 	new = kzalloc(size, GFP_KERNEL);
787 	if (!new)
788 		return -ENOMEM;
789 
790 	/* start filling the new info now */
791 
792 	/*
793 	 * pointers go into the block we allocated,
794 	 * memory is | beacon_data | head | tail |
795 	 */
796 	new->head = ((u8 *) new) + sizeof(*new);
797 	new->tail = new->head + new_head_len;
798 	new->head_len = new_head_len;
799 	new->tail_len = new_tail_len;
800 
801 	if (csa) {
802 		new->csa_current_counter = csa->count;
803 		memcpy(new->csa_counter_offsets, csa->counter_offsets_beacon,
804 		       csa->n_counter_offsets_beacon *
805 		       sizeof(new->csa_counter_offsets[0]));
806 	}
807 
808 	/* copy in head */
809 	if (params->head)
810 		memcpy(new->head, params->head, new_head_len);
811 	else
812 		memcpy(new->head, old->head, new_head_len);
813 
814 	/* copy in optional tail */
815 	if (params->tail)
816 		memcpy(new->tail, params->tail, new_tail_len);
817 	else
818 		if (old)
819 			memcpy(new->tail, old->tail, new_tail_len);
820 
821 	err = ieee80211_set_probe_resp(sdata, params->probe_resp,
822 				       params->probe_resp_len, csa);
823 	if (err < 0)
824 		return err;
825 	if (err == 0)
826 		changed |= BSS_CHANGED_AP_PROBE_RESP;
827 
828 	rcu_assign_pointer(sdata->u.ap.beacon, new);
829 
830 	if (old)
831 		kfree_rcu(old, rcu_head);
832 
833 	return changed;
834 }
835 
836 static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
837 			      struct cfg80211_ap_settings *params)
838 {
839 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
840 	struct ieee80211_local *local = sdata->local;
841 	struct beacon_data *old;
842 	struct ieee80211_sub_if_data *vlan;
843 	u32 changed = BSS_CHANGED_BEACON_INT |
844 		      BSS_CHANGED_BEACON_ENABLED |
845 		      BSS_CHANGED_BEACON |
846 		      BSS_CHANGED_SSID |
847 		      BSS_CHANGED_P2P_PS |
848 		      BSS_CHANGED_TXPOWER;
849 	int err;
850 
851 	old = sdata_dereference(sdata->u.ap.beacon, sdata);
852 	if (old)
853 		return -EALREADY;
854 
855 	switch (params->smps_mode) {
856 	case NL80211_SMPS_OFF:
857 		sdata->smps_mode = IEEE80211_SMPS_OFF;
858 		break;
859 	case NL80211_SMPS_STATIC:
860 		sdata->smps_mode = IEEE80211_SMPS_STATIC;
861 		break;
862 	case NL80211_SMPS_DYNAMIC:
863 		sdata->smps_mode = IEEE80211_SMPS_DYNAMIC;
864 		break;
865 	default:
866 		return -EINVAL;
867 	}
868 	sdata->needed_rx_chains = sdata->local->rx_chains;
869 
870 	mutex_lock(&local->mtx);
871 	err = ieee80211_vif_use_channel(sdata, &params->chandef,
872 					IEEE80211_CHANCTX_SHARED);
873 	if (!err)
874 		ieee80211_vif_copy_chanctx_to_vlans(sdata, false);
875 	mutex_unlock(&local->mtx);
876 	if (err)
877 		return err;
878 
879 	/*
880 	 * Apply control port protocol, this allows us to
881 	 * not encrypt dynamic WEP control frames.
882 	 */
883 	sdata->control_port_protocol = params->crypto.control_port_ethertype;
884 	sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt;
885 	sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local,
886 							&params->crypto,
887 							sdata->vif.type);
888 
889 	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) {
890 		vlan->control_port_protocol =
891 			params->crypto.control_port_ethertype;
892 		vlan->control_port_no_encrypt =
893 			params->crypto.control_port_no_encrypt;
894 		vlan->encrypt_headroom =
895 			ieee80211_cs_headroom(sdata->local,
896 					      &params->crypto,
897 					      vlan->vif.type);
898 	}
899 
900 	sdata->vif.bss_conf.beacon_int = params->beacon_interval;
901 	sdata->vif.bss_conf.dtim_period = params->dtim_period;
902 	sdata->vif.bss_conf.enable_beacon = true;
903 	sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
904 
905 	sdata->vif.bss_conf.ssid_len = params->ssid_len;
906 	if (params->ssid_len)
907 		memcpy(sdata->vif.bss_conf.ssid, params->ssid,
908 		       params->ssid_len);
909 	sdata->vif.bss_conf.hidden_ssid =
910 		(params->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE);
911 
912 	memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
913 	       sizeof(sdata->vif.bss_conf.p2p_noa_attr));
914 	sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow =
915 		params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
916 	if (params->p2p_opp_ps)
917 		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
918 					IEEE80211_P2P_OPPPS_ENABLE_BIT;
919 
920 	err = ieee80211_assign_beacon(sdata, &params->beacon, NULL);
921 	if (err < 0) {
922 		ieee80211_vif_release_channel(sdata);
923 		return err;
924 	}
925 	changed |= err;
926 
927 	err = drv_start_ap(sdata->local, sdata);
928 	if (err) {
929 		old = sdata_dereference(sdata->u.ap.beacon, sdata);
930 
931 		if (old)
932 			kfree_rcu(old, rcu_head);
933 		RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
934 		ieee80211_vif_release_channel(sdata);
935 		return err;
936 	}
937 
938 	ieee80211_recalc_dtim(local, sdata);
939 	ieee80211_bss_info_change_notify(sdata, changed);
940 
941 	netif_carrier_on(dev);
942 	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
943 		netif_carrier_on(vlan->dev);
944 
945 	return 0;
946 }
947 
948 static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
949 				   struct cfg80211_beacon_data *params)
950 {
951 	struct ieee80211_sub_if_data *sdata;
952 	struct beacon_data *old;
953 	int err;
954 
955 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
956 	sdata_assert_lock(sdata);
957 
958 	/* don't allow changing the beacon while CSA is in place - offset
959 	 * of channel switch counter may change
960 	 */
961 	if (sdata->vif.csa_active)
962 		return -EBUSY;
963 
964 	old = sdata_dereference(sdata->u.ap.beacon, sdata);
965 	if (!old)
966 		return -ENOENT;
967 
968 	err = ieee80211_assign_beacon(sdata, params, NULL);
969 	if (err < 0)
970 		return err;
971 	ieee80211_bss_info_change_notify(sdata, err);
972 	return 0;
973 }
974 
975 static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
976 {
977 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
978 	struct ieee80211_sub_if_data *vlan;
979 	struct ieee80211_local *local = sdata->local;
980 	struct beacon_data *old_beacon;
981 	struct probe_resp *old_probe_resp;
982 	struct cfg80211_chan_def chandef;
983 
984 	sdata_assert_lock(sdata);
985 
986 	old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata);
987 	if (!old_beacon)
988 		return -ENOENT;
989 	old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata);
990 
991 	/* abort any running channel switch */
992 	mutex_lock(&local->mtx);
993 	sdata->vif.csa_active = false;
994 	if (sdata->csa_block_tx) {
995 		ieee80211_wake_vif_queues(local, sdata,
996 					  IEEE80211_QUEUE_STOP_REASON_CSA);
997 		sdata->csa_block_tx = false;
998 	}
999 
1000 	mutex_unlock(&local->mtx);
1001 
1002 	kfree(sdata->u.ap.next_beacon);
1003 	sdata->u.ap.next_beacon = NULL;
1004 
1005 	/* turn off carrier for this interface and dependent VLANs */
1006 	list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
1007 		netif_carrier_off(vlan->dev);
1008 	netif_carrier_off(dev);
1009 
1010 	/* remove beacon and probe response */
1011 	RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
1012 	RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL);
1013 	kfree_rcu(old_beacon, rcu_head);
1014 	if (old_probe_resp)
1015 		kfree_rcu(old_probe_resp, rcu_head);
1016 	sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
1017 
1018 	__sta_info_flush(sdata, true);
1019 	ieee80211_free_keys(sdata, true);
1020 
1021 	sdata->vif.bss_conf.enable_beacon = false;
1022 	sdata->vif.bss_conf.ssid_len = 0;
1023 	clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
1024 	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
1025 
1026 	if (sdata->wdev.cac_started) {
1027 		chandef = sdata->vif.bss_conf.chandef;
1028 		cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
1029 		cfg80211_cac_event(sdata->dev, &chandef,
1030 				   NL80211_RADAR_CAC_ABORTED,
1031 				   GFP_KERNEL);
1032 	}
1033 
1034 	drv_stop_ap(sdata->local, sdata);
1035 
1036 	/* free all potentially still buffered bcast frames */
1037 	local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf);
1038 	ieee80211_purge_tx_queue(&local->hw, &sdata->u.ap.ps.bc_buf);
1039 
1040 	mutex_lock(&local->mtx);
1041 	ieee80211_vif_copy_chanctx_to_vlans(sdata, true);
1042 	ieee80211_vif_release_channel(sdata);
1043 	mutex_unlock(&local->mtx);
1044 
1045 	return 0;
1046 }
1047 
1048 /* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
1049 struct iapp_layer2_update {
1050 	u8 da[ETH_ALEN];	/* broadcast */
1051 	u8 sa[ETH_ALEN];	/* STA addr */
1052 	__be16 len;		/* 6 */
1053 	u8 dsap;		/* 0 */
1054 	u8 ssap;		/* 0 */
1055 	u8 control;
1056 	u8 xid_info[3];
1057 } __packed;
1058 
1059 static void ieee80211_send_layer2_update(struct sta_info *sta)
1060 {
1061 	struct iapp_layer2_update *msg;
1062 	struct sk_buff *skb;
1063 
1064 	/* Send Level 2 Update Frame to update forwarding tables in layer 2
1065 	 * bridge devices */
1066 
1067 	skb = dev_alloc_skb(sizeof(*msg));
1068 	if (!skb)
1069 		return;
1070 	msg = (struct iapp_layer2_update *)skb_put(skb, sizeof(*msg));
1071 
1072 	/* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
1073 	 * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
1074 
1075 	eth_broadcast_addr(msg->da);
1076 	memcpy(msg->sa, sta->sta.addr, ETH_ALEN);
1077 	msg->len = htons(6);
1078 	msg->dsap = 0;
1079 	msg->ssap = 0x01;	/* NULL LSAP, CR Bit: Response */
1080 	msg->control = 0xaf;	/* XID response lsb.1111F101.
1081 				 * F=0 (no poll command; unsolicited frame) */
1082 	msg->xid_info[0] = 0x81;	/* XID format identifier */
1083 	msg->xid_info[1] = 1;	/* LLC types/classes: Type 1 LLC */
1084 	msg->xid_info[2] = 0;	/* XID sender's receive window size (RW) */
1085 
1086 	skb->dev = sta->sdata->dev;
1087 	skb->protocol = eth_type_trans(skb, sta->sdata->dev);
1088 	memset(skb->cb, 0, sizeof(skb->cb));
1089 	netif_rx_ni(skb);
1090 }
1091 
1092 static int sta_apply_auth_flags(struct ieee80211_local *local,
1093 				struct sta_info *sta,
1094 				u32 mask, u32 set)
1095 {
1096 	int ret;
1097 
1098 	if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
1099 	    set & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
1100 	    !test_sta_flag(sta, WLAN_STA_AUTH)) {
1101 		ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
1102 		if (ret)
1103 			return ret;
1104 	}
1105 
1106 	if (mask & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
1107 	    set & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
1108 	    !test_sta_flag(sta, WLAN_STA_ASSOC)) {
1109 		/*
1110 		 * When peer becomes associated, init rate control as
1111 		 * well. Some drivers require rate control initialized
1112 		 * before drv_sta_state() is called.
1113 		 */
1114 		if (!test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
1115 			rate_control_rate_init(sta);
1116 
1117 		ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
1118 		if (ret)
1119 			return ret;
1120 	}
1121 
1122 	if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1123 		if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
1124 			ret = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
1125 		else if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
1126 			ret = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
1127 		else
1128 			ret = 0;
1129 		if (ret)
1130 			return ret;
1131 	}
1132 
1133 	if (mask & BIT(NL80211_STA_FLAG_ASSOCIATED) &&
1134 	    !(set & BIT(NL80211_STA_FLAG_ASSOCIATED)) &&
1135 	    test_sta_flag(sta, WLAN_STA_ASSOC)) {
1136 		ret = sta_info_move_state(sta, IEEE80211_STA_AUTH);
1137 		if (ret)
1138 			return ret;
1139 	}
1140 
1141 	if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED) &&
1142 	    !(set & BIT(NL80211_STA_FLAG_AUTHENTICATED)) &&
1143 	    test_sta_flag(sta, WLAN_STA_AUTH)) {
1144 		ret = sta_info_move_state(sta, IEEE80211_STA_NONE);
1145 		if (ret)
1146 			return ret;
1147 	}
1148 
1149 	return 0;
1150 }
1151 
1152 static void sta_apply_mesh_params(struct ieee80211_local *local,
1153 				  struct sta_info *sta,
1154 				  struct station_parameters *params)
1155 {
1156 #ifdef CONFIG_MAC80211_MESH
1157 	struct ieee80211_sub_if_data *sdata = sta->sdata;
1158 	u32 changed = 0;
1159 
1160 	if (params->sta_modify_mask & STATION_PARAM_APPLY_PLINK_STATE) {
1161 		switch (params->plink_state) {
1162 		case NL80211_PLINK_ESTAB:
1163 			if (sta->mesh->plink_state != NL80211_PLINK_ESTAB)
1164 				changed = mesh_plink_inc_estab_count(sdata);
1165 			sta->mesh->plink_state = params->plink_state;
1166 			sta->mesh->aid = params->peer_aid;
1167 
1168 			ieee80211_mps_sta_status_update(sta);
1169 			changed |= ieee80211_mps_set_sta_local_pm(sta,
1170 				      sdata->u.mesh.mshcfg.power_mode);
1171 			break;
1172 		case NL80211_PLINK_LISTEN:
1173 		case NL80211_PLINK_BLOCKED:
1174 		case NL80211_PLINK_OPN_SNT:
1175 		case NL80211_PLINK_OPN_RCVD:
1176 		case NL80211_PLINK_CNF_RCVD:
1177 		case NL80211_PLINK_HOLDING:
1178 			if (sta->mesh->plink_state == NL80211_PLINK_ESTAB)
1179 				changed = mesh_plink_dec_estab_count(sdata);
1180 			sta->mesh->plink_state = params->plink_state;
1181 
1182 			ieee80211_mps_sta_status_update(sta);
1183 			changed |= ieee80211_mps_set_sta_local_pm(sta,
1184 					NL80211_MESH_POWER_UNKNOWN);
1185 			break;
1186 		default:
1187 			/*  nothing  */
1188 			break;
1189 		}
1190 	}
1191 
1192 	switch (params->plink_action) {
1193 	case NL80211_PLINK_ACTION_NO_ACTION:
1194 		/* nothing */
1195 		break;
1196 	case NL80211_PLINK_ACTION_OPEN:
1197 		changed |= mesh_plink_open(sta);
1198 		break;
1199 	case NL80211_PLINK_ACTION_BLOCK:
1200 		changed |= mesh_plink_block(sta);
1201 		break;
1202 	}
1203 
1204 	if (params->local_pm)
1205 		changed |= ieee80211_mps_set_sta_local_pm(sta,
1206 							  params->local_pm);
1207 
1208 	ieee80211_mbss_info_change_notify(sdata, changed);
1209 #endif
1210 }
1211 
1212 static int sta_apply_parameters(struct ieee80211_local *local,
1213 				struct sta_info *sta,
1214 				struct station_parameters *params)
1215 {
1216 	int ret = 0;
1217 	struct ieee80211_supported_band *sband;
1218 	struct ieee80211_sub_if_data *sdata = sta->sdata;
1219 	enum nl80211_band band = ieee80211_get_sdata_band(sdata);
1220 	u32 mask, set;
1221 
1222 	sband = local->hw.wiphy->bands[band];
1223 
1224 	mask = params->sta_flags_mask;
1225 	set = params->sta_flags_set;
1226 
1227 	if (ieee80211_vif_is_mesh(&sdata->vif)) {
1228 		/*
1229 		 * In mesh mode, ASSOCIATED isn't part of the nl80211
1230 		 * API but must follow AUTHENTICATED for driver state.
1231 		 */
1232 		if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED))
1233 			mask |= BIT(NL80211_STA_FLAG_ASSOCIATED);
1234 		if (set & BIT(NL80211_STA_FLAG_AUTHENTICATED))
1235 			set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
1236 	} else if (test_sta_flag(sta, WLAN_STA_TDLS_PEER)) {
1237 		/*
1238 		 * TDLS -- everything follows authorized, but
1239 		 * only becoming authorized is possible, not
1240 		 * going back
1241 		 */
1242 		if (set & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1243 			set |= BIT(NL80211_STA_FLAG_AUTHENTICATED) |
1244 			       BIT(NL80211_STA_FLAG_ASSOCIATED);
1245 			mask |= BIT(NL80211_STA_FLAG_AUTHENTICATED) |
1246 				BIT(NL80211_STA_FLAG_ASSOCIATED);
1247 		}
1248 	}
1249 
1250 	if (mask & BIT(NL80211_STA_FLAG_WME) &&
1251 	    local->hw.queues >= IEEE80211_NUM_ACS)
1252 		sta->sta.wme = set & BIT(NL80211_STA_FLAG_WME);
1253 
1254 	/* auth flags will be set later for TDLS,
1255 	 * and for unassociated stations that move to assocaited */
1256 	if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1257 	    !((mask & BIT(NL80211_STA_FLAG_ASSOCIATED)) &&
1258 	      (set & BIT(NL80211_STA_FLAG_ASSOCIATED)))) {
1259 		ret = sta_apply_auth_flags(local, sta, mask, set);
1260 		if (ret)
1261 			return ret;
1262 	}
1263 
1264 	if (mask & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE)) {
1265 		if (set & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE))
1266 			set_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE);
1267 		else
1268 			clear_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE);
1269 	}
1270 
1271 	if (mask & BIT(NL80211_STA_FLAG_MFP)) {
1272 		sta->sta.mfp = !!(set & BIT(NL80211_STA_FLAG_MFP));
1273 		if (set & BIT(NL80211_STA_FLAG_MFP))
1274 			set_sta_flag(sta, WLAN_STA_MFP);
1275 		else
1276 			clear_sta_flag(sta, WLAN_STA_MFP);
1277 	}
1278 
1279 	if (mask & BIT(NL80211_STA_FLAG_TDLS_PEER)) {
1280 		if (set & BIT(NL80211_STA_FLAG_TDLS_PEER))
1281 			set_sta_flag(sta, WLAN_STA_TDLS_PEER);
1282 		else
1283 			clear_sta_flag(sta, WLAN_STA_TDLS_PEER);
1284 	}
1285 
1286 	/* mark TDLS channel switch support, if the AP allows it */
1287 	if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1288 	    !sdata->u.mgd.tdls_chan_switch_prohibited &&
1289 	    params->ext_capab_len >= 4 &&
1290 	    params->ext_capab[3] & WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH)
1291 		set_sta_flag(sta, WLAN_STA_TDLS_CHAN_SWITCH);
1292 
1293 	if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1294 	    !sdata->u.mgd.tdls_wider_bw_prohibited &&
1295 	    ieee80211_hw_check(&local->hw, TDLS_WIDER_BW) &&
1296 	    params->ext_capab_len >= 8 &&
1297 	    params->ext_capab[7] & WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED)
1298 		set_sta_flag(sta, WLAN_STA_TDLS_WIDER_BW);
1299 
1300 	if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) {
1301 		sta->sta.uapsd_queues = params->uapsd_queues;
1302 		sta->sta.max_sp = params->max_sp;
1303 	}
1304 
1305 	/* The sender might not have sent the last bit, consider it to be 0 */
1306 	if (params->ext_capab_len >= 8) {
1307 		u8 val = (params->ext_capab[7] &
1308 			  WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB) >> 7;
1309 
1310 		/* we did get all the bits, take the MSB as well */
1311 		if (params->ext_capab_len >= 9) {
1312 			u8 val_msb = params->ext_capab[8] &
1313 				WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB;
1314 			val_msb <<= 1;
1315 			val |= val_msb;
1316 		}
1317 
1318 		switch (val) {
1319 		case 1:
1320 			sta->sta.max_amsdu_subframes = 32;
1321 			break;
1322 		case 2:
1323 			sta->sta.max_amsdu_subframes = 16;
1324 			break;
1325 		case 3:
1326 			sta->sta.max_amsdu_subframes = 8;
1327 			break;
1328 		default:
1329 			sta->sta.max_amsdu_subframes = 0;
1330 		}
1331 	}
1332 
1333 	/*
1334 	 * cfg80211 validates this (1-2007) and allows setting the AID
1335 	 * only when creating a new station entry
1336 	 */
1337 	if (params->aid)
1338 		sta->sta.aid = params->aid;
1339 
1340 	/*
1341 	 * Some of the following updates would be racy if called on an
1342 	 * existing station, via ieee80211_change_station(). However,
1343 	 * all such changes are rejected by cfg80211 except for updates
1344 	 * changing the supported rates on an existing but not yet used
1345 	 * TDLS peer.
1346 	 */
1347 
1348 	if (params->listen_interval >= 0)
1349 		sta->listen_interval = params->listen_interval;
1350 
1351 	if (params->supported_rates) {
1352 		ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
1353 					 sband, params->supported_rates,
1354 					 params->supported_rates_len,
1355 					 &sta->sta.supp_rates[band]);
1356 	}
1357 
1358 	if (params->ht_capa)
1359 		ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
1360 						  params->ht_capa, sta);
1361 
1362 	/* VHT can override some HT caps such as the A-MSDU max length */
1363 	if (params->vht_capa)
1364 		ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
1365 						    params->vht_capa, sta);
1366 
1367 	if (params->opmode_notif_used) {
1368 		/* returned value is only needed for rc update, but the
1369 		 * rc isn't initialized here yet, so ignore it
1370 		 */
1371 		__ieee80211_vht_handle_opmode(sdata, sta,
1372 					      params->opmode_notif, band);
1373 	}
1374 
1375 	if (params->support_p2p_ps >= 0)
1376 		sta->sta.support_p2p_ps = params->support_p2p_ps;
1377 
1378 	if (ieee80211_vif_is_mesh(&sdata->vif))
1379 		sta_apply_mesh_params(local, sta, params);
1380 
1381 	/* set the STA state after all sta info from usermode has been set */
1382 	if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) ||
1383 	    set & BIT(NL80211_STA_FLAG_ASSOCIATED)) {
1384 		ret = sta_apply_auth_flags(local, sta, mask, set);
1385 		if (ret)
1386 			return ret;
1387 	}
1388 
1389 	return 0;
1390 }
1391 
1392 static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
1393 				 const u8 *mac,
1394 				 struct station_parameters *params)
1395 {
1396 	struct ieee80211_local *local = wiphy_priv(wiphy);
1397 	struct sta_info *sta;
1398 	struct ieee80211_sub_if_data *sdata;
1399 	int err;
1400 	int layer2_update;
1401 
1402 	if (params->vlan) {
1403 		sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
1404 
1405 		if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
1406 		    sdata->vif.type != NL80211_IFTYPE_AP)
1407 			return -EINVAL;
1408 	} else
1409 		sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1410 
1411 	if (ether_addr_equal(mac, sdata->vif.addr))
1412 		return -EINVAL;
1413 
1414 	if (is_multicast_ether_addr(mac))
1415 		return -EINVAL;
1416 
1417 	sta = sta_info_alloc(sdata, mac, GFP_KERNEL);
1418 	if (!sta)
1419 		return -ENOMEM;
1420 
1421 	if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
1422 		sta->sta.tdls = true;
1423 
1424 	err = sta_apply_parameters(local, sta, params);
1425 	if (err) {
1426 		sta_info_free(local, sta);
1427 		return err;
1428 	}
1429 
1430 	/*
1431 	 * for TDLS and for unassociated station, rate control should be
1432 	 * initialized only when rates are known and station is marked
1433 	 * authorized/associated
1434 	 */
1435 	if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER) &&
1436 	    test_sta_flag(sta, WLAN_STA_ASSOC))
1437 		rate_control_rate_init(sta);
1438 
1439 	layer2_update = sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
1440 		sdata->vif.type == NL80211_IFTYPE_AP;
1441 
1442 	err = sta_info_insert_rcu(sta);
1443 	if (err) {
1444 		rcu_read_unlock();
1445 		return err;
1446 	}
1447 
1448 	if (layer2_update)
1449 		ieee80211_send_layer2_update(sta);
1450 
1451 	rcu_read_unlock();
1452 
1453 	return 0;
1454 }
1455 
1456 static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
1457 				 struct station_del_parameters *params)
1458 {
1459 	struct ieee80211_sub_if_data *sdata;
1460 
1461 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1462 
1463 	if (params->mac)
1464 		return sta_info_destroy_addr_bss(sdata, params->mac);
1465 
1466 	sta_info_flush(sdata);
1467 	return 0;
1468 }
1469 
1470 static int ieee80211_change_station(struct wiphy *wiphy,
1471 				    struct net_device *dev, const u8 *mac,
1472 				    struct station_parameters *params)
1473 {
1474 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1475 	struct ieee80211_local *local = wiphy_priv(wiphy);
1476 	struct sta_info *sta;
1477 	struct ieee80211_sub_if_data *vlansdata;
1478 	enum cfg80211_station_type statype;
1479 	int err;
1480 
1481 	mutex_lock(&local->sta_mtx);
1482 
1483 	sta = sta_info_get_bss(sdata, mac);
1484 	if (!sta) {
1485 		err = -ENOENT;
1486 		goto out_err;
1487 	}
1488 
1489 	switch (sdata->vif.type) {
1490 	case NL80211_IFTYPE_MESH_POINT:
1491 		if (sdata->u.mesh.user_mpm)
1492 			statype = CFG80211_STA_MESH_PEER_USER;
1493 		else
1494 			statype = CFG80211_STA_MESH_PEER_KERNEL;
1495 		break;
1496 	case NL80211_IFTYPE_ADHOC:
1497 		statype = CFG80211_STA_IBSS;
1498 		break;
1499 	case NL80211_IFTYPE_STATION:
1500 		if (!test_sta_flag(sta, WLAN_STA_TDLS_PEER)) {
1501 			statype = CFG80211_STA_AP_STA;
1502 			break;
1503 		}
1504 		if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
1505 			statype = CFG80211_STA_TDLS_PEER_ACTIVE;
1506 		else
1507 			statype = CFG80211_STA_TDLS_PEER_SETUP;
1508 		break;
1509 	case NL80211_IFTYPE_AP:
1510 	case NL80211_IFTYPE_AP_VLAN:
1511 		if (test_sta_flag(sta, WLAN_STA_ASSOC))
1512 			statype = CFG80211_STA_AP_CLIENT;
1513 		else
1514 			statype = CFG80211_STA_AP_CLIENT_UNASSOC;
1515 		break;
1516 	default:
1517 		err = -EOPNOTSUPP;
1518 		goto out_err;
1519 	}
1520 
1521 	err = cfg80211_check_station_change(wiphy, params, statype);
1522 	if (err)
1523 		goto out_err;
1524 
1525 	if (params->vlan && params->vlan != sta->sdata->dev) {
1526 		bool prev_4addr = false;
1527 		bool new_4addr = false;
1528 
1529 		vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
1530 
1531 		if (params->vlan->ieee80211_ptr->use_4addr) {
1532 			if (vlansdata->u.vlan.sta) {
1533 				err = -EBUSY;
1534 				goto out_err;
1535 			}
1536 
1537 			rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
1538 			new_4addr = true;
1539 			__ieee80211_check_fast_rx_iface(vlansdata);
1540 		}
1541 
1542 		if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
1543 		    sta->sdata->u.vlan.sta) {
1544 			RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL);
1545 			prev_4addr = true;
1546 		}
1547 
1548 		sta->sdata = vlansdata;
1549 		ieee80211_check_fast_xmit(sta);
1550 
1551 		if (sta->sta_state == IEEE80211_STA_AUTHORIZED &&
1552 		    prev_4addr != new_4addr) {
1553 			if (new_4addr)
1554 				atomic_dec(&sta->sdata->bss->num_mcast_sta);
1555 			else
1556 				atomic_inc(&sta->sdata->bss->num_mcast_sta);
1557 		}
1558 
1559 		ieee80211_send_layer2_update(sta);
1560 	}
1561 
1562 	err = sta_apply_parameters(local, sta, params);
1563 	if (err)
1564 		goto out_err;
1565 
1566 	mutex_unlock(&local->sta_mtx);
1567 
1568 	if ((sdata->vif.type == NL80211_IFTYPE_AP ||
1569 	     sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
1570 	    sta->known_smps_mode != sta->sdata->bss->req_smps &&
1571 	    test_sta_flag(sta, WLAN_STA_AUTHORIZED) &&
1572 	    sta_info_tx_streams(sta) != 1) {
1573 		ht_dbg(sta->sdata,
1574 		       "%pM just authorized and MIMO capable - update SMPS\n",
1575 		       sta->sta.addr);
1576 		ieee80211_send_smps_action(sta->sdata,
1577 			sta->sdata->bss->req_smps,
1578 			sta->sta.addr,
1579 			sta->sdata->vif.bss_conf.bssid);
1580 	}
1581 
1582 	if (sdata->vif.type == NL80211_IFTYPE_STATION &&
1583 	    params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
1584 		ieee80211_recalc_ps(local);
1585 		ieee80211_recalc_ps_vif(sdata);
1586 	}
1587 
1588 	return 0;
1589 out_err:
1590 	mutex_unlock(&local->sta_mtx);
1591 	return err;
1592 }
1593 
1594 #ifdef CONFIG_MAC80211_MESH
1595 static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
1596 			       const u8 *dst, const u8 *next_hop)
1597 {
1598 	struct ieee80211_sub_if_data *sdata;
1599 	struct mesh_path *mpath;
1600 	struct sta_info *sta;
1601 
1602 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1603 
1604 	rcu_read_lock();
1605 	sta = sta_info_get(sdata, next_hop);
1606 	if (!sta) {
1607 		rcu_read_unlock();
1608 		return -ENOENT;
1609 	}
1610 
1611 	mpath = mesh_path_add(sdata, dst);
1612 	if (IS_ERR(mpath)) {
1613 		rcu_read_unlock();
1614 		return PTR_ERR(mpath);
1615 	}
1616 
1617 	mesh_path_fix_nexthop(mpath, sta);
1618 
1619 	rcu_read_unlock();
1620 	return 0;
1621 }
1622 
1623 static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev,
1624 			       const u8 *dst)
1625 {
1626 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1627 
1628 	if (dst)
1629 		return mesh_path_del(sdata, dst);
1630 
1631 	mesh_path_flush_by_iface(sdata);
1632 	return 0;
1633 }
1634 
1635 static int ieee80211_change_mpath(struct wiphy *wiphy, struct net_device *dev,
1636 				  const u8 *dst, const u8 *next_hop)
1637 {
1638 	struct ieee80211_sub_if_data *sdata;
1639 	struct mesh_path *mpath;
1640 	struct sta_info *sta;
1641 
1642 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1643 
1644 	rcu_read_lock();
1645 
1646 	sta = sta_info_get(sdata, next_hop);
1647 	if (!sta) {
1648 		rcu_read_unlock();
1649 		return -ENOENT;
1650 	}
1651 
1652 	mpath = mesh_path_lookup(sdata, dst);
1653 	if (!mpath) {
1654 		rcu_read_unlock();
1655 		return -ENOENT;
1656 	}
1657 
1658 	mesh_path_fix_nexthop(mpath, sta);
1659 
1660 	rcu_read_unlock();
1661 	return 0;
1662 }
1663 
1664 static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
1665 			    struct mpath_info *pinfo)
1666 {
1667 	struct sta_info *next_hop_sta = rcu_dereference(mpath->next_hop);
1668 
1669 	if (next_hop_sta)
1670 		memcpy(next_hop, next_hop_sta->sta.addr, ETH_ALEN);
1671 	else
1672 		eth_zero_addr(next_hop);
1673 
1674 	memset(pinfo, 0, sizeof(*pinfo));
1675 
1676 	pinfo->generation = mpath->sdata->u.mesh.mesh_paths_generation;
1677 
1678 	pinfo->filled = MPATH_INFO_FRAME_QLEN |
1679 			MPATH_INFO_SN |
1680 			MPATH_INFO_METRIC |
1681 			MPATH_INFO_EXPTIME |
1682 			MPATH_INFO_DISCOVERY_TIMEOUT |
1683 			MPATH_INFO_DISCOVERY_RETRIES |
1684 			MPATH_INFO_FLAGS;
1685 
1686 	pinfo->frame_qlen = mpath->frame_queue.qlen;
1687 	pinfo->sn = mpath->sn;
1688 	pinfo->metric = mpath->metric;
1689 	if (time_before(jiffies, mpath->exp_time))
1690 		pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies);
1691 	pinfo->discovery_timeout =
1692 			jiffies_to_msecs(mpath->discovery_timeout);
1693 	pinfo->discovery_retries = mpath->discovery_retries;
1694 	if (mpath->flags & MESH_PATH_ACTIVE)
1695 		pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE;
1696 	if (mpath->flags & MESH_PATH_RESOLVING)
1697 		pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
1698 	if (mpath->flags & MESH_PATH_SN_VALID)
1699 		pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID;
1700 	if (mpath->flags & MESH_PATH_FIXED)
1701 		pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
1702 	if (mpath->flags & MESH_PATH_RESOLVED)
1703 		pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED;
1704 }
1705 
1706 static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
1707 			       u8 *dst, u8 *next_hop, struct mpath_info *pinfo)
1708 
1709 {
1710 	struct ieee80211_sub_if_data *sdata;
1711 	struct mesh_path *mpath;
1712 
1713 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1714 
1715 	rcu_read_lock();
1716 	mpath = mesh_path_lookup(sdata, dst);
1717 	if (!mpath) {
1718 		rcu_read_unlock();
1719 		return -ENOENT;
1720 	}
1721 	memcpy(dst, mpath->dst, ETH_ALEN);
1722 	mpath_set_pinfo(mpath, next_hop, pinfo);
1723 	rcu_read_unlock();
1724 	return 0;
1725 }
1726 
1727 static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
1728 				int idx, u8 *dst, u8 *next_hop,
1729 				struct mpath_info *pinfo)
1730 {
1731 	struct ieee80211_sub_if_data *sdata;
1732 	struct mesh_path *mpath;
1733 
1734 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1735 
1736 	rcu_read_lock();
1737 	mpath = mesh_path_lookup_by_idx(sdata, idx);
1738 	if (!mpath) {
1739 		rcu_read_unlock();
1740 		return -ENOENT;
1741 	}
1742 	memcpy(dst, mpath->dst, ETH_ALEN);
1743 	mpath_set_pinfo(mpath, next_hop, pinfo);
1744 	rcu_read_unlock();
1745 	return 0;
1746 }
1747 
1748 static void mpp_set_pinfo(struct mesh_path *mpath, u8 *mpp,
1749 			  struct mpath_info *pinfo)
1750 {
1751 	memset(pinfo, 0, sizeof(*pinfo));
1752 	memcpy(mpp, mpath->mpp, ETH_ALEN);
1753 
1754 	pinfo->generation = mpath->sdata->u.mesh.mpp_paths_generation;
1755 }
1756 
1757 static int ieee80211_get_mpp(struct wiphy *wiphy, struct net_device *dev,
1758 			     u8 *dst, u8 *mpp, struct mpath_info *pinfo)
1759 
1760 {
1761 	struct ieee80211_sub_if_data *sdata;
1762 	struct mesh_path *mpath;
1763 
1764 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1765 
1766 	rcu_read_lock();
1767 	mpath = mpp_path_lookup(sdata, dst);
1768 	if (!mpath) {
1769 		rcu_read_unlock();
1770 		return -ENOENT;
1771 	}
1772 	memcpy(dst, mpath->dst, ETH_ALEN);
1773 	mpp_set_pinfo(mpath, mpp, pinfo);
1774 	rcu_read_unlock();
1775 	return 0;
1776 }
1777 
1778 static int ieee80211_dump_mpp(struct wiphy *wiphy, struct net_device *dev,
1779 			      int idx, u8 *dst, u8 *mpp,
1780 			      struct mpath_info *pinfo)
1781 {
1782 	struct ieee80211_sub_if_data *sdata;
1783 	struct mesh_path *mpath;
1784 
1785 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1786 
1787 	rcu_read_lock();
1788 	mpath = mpp_path_lookup_by_idx(sdata, idx);
1789 	if (!mpath) {
1790 		rcu_read_unlock();
1791 		return -ENOENT;
1792 	}
1793 	memcpy(dst, mpath->dst, ETH_ALEN);
1794 	mpp_set_pinfo(mpath, mpp, pinfo);
1795 	rcu_read_unlock();
1796 	return 0;
1797 }
1798 
1799 static int ieee80211_get_mesh_config(struct wiphy *wiphy,
1800 				struct net_device *dev,
1801 				struct mesh_config *conf)
1802 {
1803 	struct ieee80211_sub_if_data *sdata;
1804 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1805 
1806 	memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config));
1807 	return 0;
1808 }
1809 
1810 static inline bool _chg_mesh_attr(enum nl80211_meshconf_params parm, u32 mask)
1811 {
1812 	return (mask >> (parm-1)) & 0x1;
1813 }
1814 
1815 static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh,
1816 		const struct mesh_setup *setup)
1817 {
1818 	u8 *new_ie;
1819 	const u8 *old_ie;
1820 	struct ieee80211_sub_if_data *sdata = container_of(ifmsh,
1821 					struct ieee80211_sub_if_data, u.mesh);
1822 
1823 	/* allocate information elements */
1824 	new_ie = NULL;
1825 	old_ie = ifmsh->ie;
1826 
1827 	if (setup->ie_len) {
1828 		new_ie = kmemdup(setup->ie, setup->ie_len,
1829 				GFP_KERNEL);
1830 		if (!new_ie)
1831 			return -ENOMEM;
1832 	}
1833 	ifmsh->ie_len = setup->ie_len;
1834 	ifmsh->ie = new_ie;
1835 	kfree(old_ie);
1836 
1837 	/* now copy the rest of the setup parameters */
1838 	ifmsh->mesh_id_len = setup->mesh_id_len;
1839 	memcpy(ifmsh->mesh_id, setup->mesh_id, ifmsh->mesh_id_len);
1840 	ifmsh->mesh_sp_id = setup->sync_method;
1841 	ifmsh->mesh_pp_id = setup->path_sel_proto;
1842 	ifmsh->mesh_pm_id = setup->path_metric;
1843 	ifmsh->user_mpm = setup->user_mpm;
1844 	ifmsh->mesh_auth_id = setup->auth_id;
1845 	ifmsh->security = IEEE80211_MESH_SEC_NONE;
1846 	if (setup->is_authenticated)
1847 		ifmsh->security |= IEEE80211_MESH_SEC_AUTHED;
1848 	if (setup->is_secure)
1849 		ifmsh->security |= IEEE80211_MESH_SEC_SECURED;
1850 
1851 	/* mcast rate setting in Mesh Node */
1852 	memcpy(sdata->vif.bss_conf.mcast_rate, setup->mcast_rate,
1853 						sizeof(setup->mcast_rate));
1854 	sdata->vif.bss_conf.basic_rates = setup->basic_rates;
1855 
1856 	sdata->vif.bss_conf.beacon_int = setup->beacon_interval;
1857 	sdata->vif.bss_conf.dtim_period = setup->dtim_period;
1858 
1859 	return 0;
1860 }
1861 
1862 static int ieee80211_update_mesh_config(struct wiphy *wiphy,
1863 					struct net_device *dev, u32 mask,
1864 					const struct mesh_config *nconf)
1865 {
1866 	struct mesh_config *conf;
1867 	struct ieee80211_sub_if_data *sdata;
1868 	struct ieee80211_if_mesh *ifmsh;
1869 
1870 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1871 	ifmsh = &sdata->u.mesh;
1872 
1873 	/* Set the config options which we are interested in setting */
1874 	conf = &(sdata->u.mesh.mshcfg);
1875 	if (_chg_mesh_attr(NL80211_MESHCONF_RETRY_TIMEOUT, mask))
1876 		conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout;
1877 	if (_chg_mesh_attr(NL80211_MESHCONF_CONFIRM_TIMEOUT, mask))
1878 		conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout;
1879 	if (_chg_mesh_attr(NL80211_MESHCONF_HOLDING_TIMEOUT, mask))
1880 		conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout;
1881 	if (_chg_mesh_attr(NL80211_MESHCONF_MAX_PEER_LINKS, mask))
1882 		conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks;
1883 	if (_chg_mesh_attr(NL80211_MESHCONF_MAX_RETRIES, mask))
1884 		conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries;
1885 	if (_chg_mesh_attr(NL80211_MESHCONF_TTL, mask))
1886 		conf->dot11MeshTTL = nconf->dot11MeshTTL;
1887 	if (_chg_mesh_attr(NL80211_MESHCONF_ELEMENT_TTL, mask))
1888 		conf->element_ttl = nconf->element_ttl;
1889 	if (_chg_mesh_attr(NL80211_MESHCONF_AUTO_OPEN_PLINKS, mask)) {
1890 		if (ifmsh->user_mpm)
1891 			return -EBUSY;
1892 		conf->auto_open_plinks = nconf->auto_open_plinks;
1893 	}
1894 	if (_chg_mesh_attr(NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR, mask))
1895 		conf->dot11MeshNbrOffsetMaxNeighbor =
1896 			nconf->dot11MeshNbrOffsetMaxNeighbor;
1897 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, mask))
1898 		conf->dot11MeshHWMPmaxPREQretries =
1899 			nconf->dot11MeshHWMPmaxPREQretries;
1900 	if (_chg_mesh_attr(NL80211_MESHCONF_PATH_REFRESH_TIME, mask))
1901 		conf->path_refresh_time = nconf->path_refresh_time;
1902 	if (_chg_mesh_attr(NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, mask))
1903 		conf->min_discovery_timeout = nconf->min_discovery_timeout;
1904 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, mask))
1905 		conf->dot11MeshHWMPactivePathTimeout =
1906 			nconf->dot11MeshHWMPactivePathTimeout;
1907 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask))
1908 		conf->dot11MeshHWMPpreqMinInterval =
1909 			nconf->dot11MeshHWMPpreqMinInterval;
1910 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, mask))
1911 		conf->dot11MeshHWMPperrMinInterval =
1912 			nconf->dot11MeshHWMPperrMinInterval;
1913 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
1914 			   mask))
1915 		conf->dot11MeshHWMPnetDiameterTraversalTime =
1916 			nconf->dot11MeshHWMPnetDiameterTraversalTime;
1917 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) {
1918 		conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode;
1919 		ieee80211_mesh_root_setup(ifmsh);
1920 	}
1921 	if (_chg_mesh_attr(NL80211_MESHCONF_GATE_ANNOUNCEMENTS, mask)) {
1922 		/* our current gate announcement implementation rides on root
1923 		 * announcements, so require this ifmsh to also be a root node
1924 		 * */
1925 		if (nconf->dot11MeshGateAnnouncementProtocol &&
1926 		    !(conf->dot11MeshHWMPRootMode > IEEE80211_ROOTMODE_ROOT)) {
1927 			conf->dot11MeshHWMPRootMode = IEEE80211_PROACTIVE_RANN;
1928 			ieee80211_mesh_root_setup(ifmsh);
1929 		}
1930 		conf->dot11MeshGateAnnouncementProtocol =
1931 			nconf->dot11MeshGateAnnouncementProtocol;
1932 	}
1933 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_RANN_INTERVAL, mask))
1934 		conf->dot11MeshHWMPRannInterval =
1935 			nconf->dot11MeshHWMPRannInterval;
1936 	if (_chg_mesh_attr(NL80211_MESHCONF_FORWARDING, mask))
1937 		conf->dot11MeshForwarding = nconf->dot11MeshForwarding;
1938 	if (_chg_mesh_attr(NL80211_MESHCONF_RSSI_THRESHOLD, mask)) {
1939 		/* our RSSI threshold implementation is supported only for
1940 		 * devices that report signal in dBm.
1941 		 */
1942 		if (!ieee80211_hw_check(&sdata->local->hw, SIGNAL_DBM))
1943 			return -ENOTSUPP;
1944 		conf->rssi_threshold = nconf->rssi_threshold;
1945 	}
1946 	if (_chg_mesh_attr(NL80211_MESHCONF_HT_OPMODE, mask)) {
1947 		conf->ht_opmode = nconf->ht_opmode;
1948 		sdata->vif.bss_conf.ht_operation_mode = nconf->ht_opmode;
1949 		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT);
1950 	}
1951 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT, mask))
1952 		conf->dot11MeshHWMPactivePathToRootTimeout =
1953 			nconf->dot11MeshHWMPactivePathToRootTimeout;
1954 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOT_INTERVAL, mask))
1955 		conf->dot11MeshHWMProotInterval =
1956 			nconf->dot11MeshHWMProotInterval;
1957 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL, mask))
1958 		conf->dot11MeshHWMPconfirmationInterval =
1959 			nconf->dot11MeshHWMPconfirmationInterval;
1960 	if (_chg_mesh_attr(NL80211_MESHCONF_POWER_MODE, mask)) {
1961 		conf->power_mode = nconf->power_mode;
1962 		ieee80211_mps_local_status_update(sdata);
1963 	}
1964 	if (_chg_mesh_attr(NL80211_MESHCONF_AWAKE_WINDOW, mask))
1965 		conf->dot11MeshAwakeWindowDuration =
1966 			nconf->dot11MeshAwakeWindowDuration;
1967 	if (_chg_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask))
1968 		conf->plink_timeout = nconf->plink_timeout;
1969 	ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
1970 	return 0;
1971 }
1972 
1973 static int ieee80211_join_mesh(struct wiphy *wiphy, struct net_device *dev,
1974 			       const struct mesh_config *conf,
1975 			       const struct mesh_setup *setup)
1976 {
1977 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1978 	struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1979 	int err;
1980 
1981 	memcpy(&ifmsh->mshcfg, conf, sizeof(struct mesh_config));
1982 	err = copy_mesh_setup(ifmsh, setup);
1983 	if (err)
1984 		return err;
1985 
1986 	/* can mesh use other SMPS modes? */
1987 	sdata->smps_mode = IEEE80211_SMPS_OFF;
1988 	sdata->needed_rx_chains = sdata->local->rx_chains;
1989 
1990 	mutex_lock(&sdata->local->mtx);
1991 	err = ieee80211_vif_use_channel(sdata, &setup->chandef,
1992 					IEEE80211_CHANCTX_SHARED);
1993 	mutex_unlock(&sdata->local->mtx);
1994 	if (err)
1995 		return err;
1996 
1997 	return ieee80211_start_mesh(sdata);
1998 }
1999 
2000 static int ieee80211_leave_mesh(struct wiphy *wiphy, struct net_device *dev)
2001 {
2002 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2003 
2004 	ieee80211_stop_mesh(sdata);
2005 	mutex_lock(&sdata->local->mtx);
2006 	ieee80211_vif_release_channel(sdata);
2007 	mutex_unlock(&sdata->local->mtx);
2008 
2009 	return 0;
2010 }
2011 #endif
2012 
2013 static int ieee80211_change_bss(struct wiphy *wiphy,
2014 				struct net_device *dev,
2015 				struct bss_parameters *params)
2016 {
2017 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2018 	enum nl80211_band band;
2019 	u32 changed = 0;
2020 
2021 	if (!sdata_dereference(sdata->u.ap.beacon, sdata))
2022 		return -ENOENT;
2023 
2024 	band = ieee80211_get_sdata_band(sdata);
2025 
2026 	if (params->use_cts_prot >= 0) {
2027 		sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
2028 		changed |= BSS_CHANGED_ERP_CTS_PROT;
2029 	}
2030 	if (params->use_short_preamble >= 0) {
2031 		sdata->vif.bss_conf.use_short_preamble =
2032 			params->use_short_preamble;
2033 		changed |= BSS_CHANGED_ERP_PREAMBLE;
2034 	}
2035 
2036 	if (!sdata->vif.bss_conf.use_short_slot &&
2037 	    band == NL80211_BAND_5GHZ) {
2038 		sdata->vif.bss_conf.use_short_slot = true;
2039 		changed |= BSS_CHANGED_ERP_SLOT;
2040 	}
2041 
2042 	if (params->use_short_slot_time >= 0) {
2043 		sdata->vif.bss_conf.use_short_slot =
2044 			params->use_short_slot_time;
2045 		changed |= BSS_CHANGED_ERP_SLOT;
2046 	}
2047 
2048 	if (params->basic_rates) {
2049 		ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
2050 					 wiphy->bands[band],
2051 					 params->basic_rates,
2052 					 params->basic_rates_len,
2053 					 &sdata->vif.bss_conf.basic_rates);
2054 		changed |= BSS_CHANGED_BASIC_RATES;
2055 	}
2056 
2057 	if (params->ap_isolate >= 0) {
2058 		if (params->ap_isolate)
2059 			sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
2060 		else
2061 			sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
2062 		ieee80211_check_fast_rx_iface(sdata);
2063 	}
2064 
2065 	if (params->ht_opmode >= 0) {
2066 		sdata->vif.bss_conf.ht_operation_mode =
2067 			(u16) params->ht_opmode;
2068 		changed |= BSS_CHANGED_HT;
2069 	}
2070 
2071 	if (params->p2p_ctwindow >= 0) {
2072 		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
2073 					~IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
2074 		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
2075 			params->p2p_ctwindow & IEEE80211_P2P_OPPPS_CTWINDOW_MASK;
2076 		changed |= BSS_CHANGED_P2P_PS;
2077 	}
2078 
2079 	if (params->p2p_opp_ps > 0) {
2080 		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
2081 					IEEE80211_P2P_OPPPS_ENABLE_BIT;
2082 		changed |= BSS_CHANGED_P2P_PS;
2083 	} else if (params->p2p_opp_ps == 0) {
2084 		sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow &=
2085 					~IEEE80211_P2P_OPPPS_ENABLE_BIT;
2086 		changed |= BSS_CHANGED_P2P_PS;
2087 	}
2088 
2089 	ieee80211_bss_info_change_notify(sdata, changed);
2090 
2091 	return 0;
2092 }
2093 
2094 static int ieee80211_set_txq_params(struct wiphy *wiphy,
2095 				    struct net_device *dev,
2096 				    struct ieee80211_txq_params *params)
2097 {
2098 	struct ieee80211_local *local = wiphy_priv(wiphy);
2099 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2100 	struct ieee80211_tx_queue_params p;
2101 
2102 	if (!local->ops->conf_tx)
2103 		return -EOPNOTSUPP;
2104 
2105 	if (local->hw.queues < IEEE80211_NUM_ACS)
2106 		return -EOPNOTSUPP;
2107 
2108 	memset(&p, 0, sizeof(p));
2109 	p.aifs = params->aifs;
2110 	p.cw_max = params->cwmax;
2111 	p.cw_min = params->cwmin;
2112 	p.txop = params->txop;
2113 
2114 	/*
2115 	 * Setting tx queue params disables u-apsd because it's only
2116 	 * called in master mode.
2117 	 */
2118 	p.uapsd = false;
2119 
2120 	sdata->tx_conf[params->ac] = p;
2121 	if (drv_conf_tx(local, sdata, params->ac, &p)) {
2122 		wiphy_debug(local->hw.wiphy,
2123 			    "failed to set TX queue parameters for AC %d\n",
2124 			    params->ac);
2125 		return -EINVAL;
2126 	}
2127 
2128 	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
2129 
2130 	return 0;
2131 }
2132 
2133 #ifdef CONFIG_PM
2134 static int ieee80211_suspend(struct wiphy *wiphy,
2135 			     struct cfg80211_wowlan *wowlan)
2136 {
2137 	return __ieee80211_suspend(wiphy_priv(wiphy), wowlan);
2138 }
2139 
2140 static int ieee80211_resume(struct wiphy *wiphy)
2141 {
2142 	return __ieee80211_resume(wiphy_priv(wiphy));
2143 }
2144 #else
2145 #define ieee80211_suspend NULL
2146 #define ieee80211_resume NULL
2147 #endif
2148 
2149 static int ieee80211_scan(struct wiphy *wiphy,
2150 			  struct cfg80211_scan_request *req)
2151 {
2152 	struct ieee80211_sub_if_data *sdata;
2153 
2154 	sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev);
2155 
2156 	switch (ieee80211_vif_type_p2p(&sdata->vif)) {
2157 	case NL80211_IFTYPE_STATION:
2158 	case NL80211_IFTYPE_ADHOC:
2159 	case NL80211_IFTYPE_MESH_POINT:
2160 	case NL80211_IFTYPE_P2P_CLIENT:
2161 	case NL80211_IFTYPE_P2P_DEVICE:
2162 		break;
2163 	case NL80211_IFTYPE_P2P_GO:
2164 		if (sdata->local->ops->hw_scan)
2165 			break;
2166 		/*
2167 		 * FIXME: implement NoA while scanning in software,
2168 		 * for now fall through to allow scanning only when
2169 		 * beaconing hasn't been configured yet
2170 		 */
2171 	case NL80211_IFTYPE_AP:
2172 		/*
2173 		 * If the scan has been forced (and the driver supports
2174 		 * forcing), don't care about being beaconing already.
2175 		 * This will create problems to the attached stations (e.g. all
2176 		 * the  frames sent while scanning on other channel will be
2177 		 * lost)
2178 		 */
2179 		if (sdata->u.ap.beacon &&
2180 		    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
2181 		     !(req->flags & NL80211_SCAN_FLAG_AP)))
2182 			return -EOPNOTSUPP;
2183 		break;
2184 	case NL80211_IFTYPE_NAN:
2185 	default:
2186 		return -EOPNOTSUPP;
2187 	}
2188 
2189 	return ieee80211_request_scan(sdata, req);
2190 }
2191 
2192 static void ieee80211_abort_scan(struct wiphy *wiphy, struct wireless_dev *wdev)
2193 {
2194 	ieee80211_scan_cancel(wiphy_priv(wiphy));
2195 }
2196 
2197 static int
2198 ieee80211_sched_scan_start(struct wiphy *wiphy,
2199 			   struct net_device *dev,
2200 			   struct cfg80211_sched_scan_request *req)
2201 {
2202 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2203 
2204 	if (!sdata->local->ops->sched_scan_start)
2205 		return -EOPNOTSUPP;
2206 
2207 	return ieee80211_request_sched_scan_start(sdata, req);
2208 }
2209 
2210 static int
2211 ieee80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev)
2212 {
2213 	struct ieee80211_local *local = wiphy_priv(wiphy);
2214 
2215 	if (!local->ops->sched_scan_stop)
2216 		return -EOPNOTSUPP;
2217 
2218 	return ieee80211_request_sched_scan_stop(local);
2219 }
2220 
2221 static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
2222 			  struct cfg80211_auth_request *req)
2223 {
2224 	return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req);
2225 }
2226 
2227 static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
2228 			   struct cfg80211_assoc_request *req)
2229 {
2230 	return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
2231 }
2232 
2233 static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev,
2234 			    struct cfg80211_deauth_request *req)
2235 {
2236 	return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev), req);
2237 }
2238 
2239 static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev,
2240 			      struct cfg80211_disassoc_request *req)
2241 {
2242 	return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
2243 }
2244 
2245 static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
2246 			       struct cfg80211_ibss_params *params)
2247 {
2248 	return ieee80211_ibss_join(IEEE80211_DEV_TO_SUB_IF(dev), params);
2249 }
2250 
2251 static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
2252 {
2253 	return ieee80211_ibss_leave(IEEE80211_DEV_TO_SUB_IF(dev));
2254 }
2255 
2256 static int ieee80211_join_ocb(struct wiphy *wiphy, struct net_device *dev,
2257 			      struct ocb_setup *setup)
2258 {
2259 	return ieee80211_ocb_join(IEEE80211_DEV_TO_SUB_IF(dev), setup);
2260 }
2261 
2262 static int ieee80211_leave_ocb(struct wiphy *wiphy, struct net_device *dev)
2263 {
2264 	return ieee80211_ocb_leave(IEEE80211_DEV_TO_SUB_IF(dev));
2265 }
2266 
2267 static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,
2268 				    int rate[NUM_NL80211_BANDS])
2269 {
2270 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2271 
2272 	memcpy(sdata->vif.bss_conf.mcast_rate, rate,
2273 	       sizeof(int) * NUM_NL80211_BANDS);
2274 
2275 	return 0;
2276 }
2277 
2278 static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
2279 {
2280 	struct ieee80211_local *local = wiphy_priv(wiphy);
2281 	int err;
2282 
2283 	if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
2284 		ieee80211_check_fast_xmit_all(local);
2285 
2286 		err = drv_set_frag_threshold(local, wiphy->frag_threshold);
2287 
2288 		if (err) {
2289 			ieee80211_check_fast_xmit_all(local);
2290 			return err;
2291 		}
2292 	}
2293 
2294 	if ((changed & WIPHY_PARAM_COVERAGE_CLASS) ||
2295 	    (changed & WIPHY_PARAM_DYN_ACK)) {
2296 		s16 coverage_class;
2297 
2298 		coverage_class = changed & WIPHY_PARAM_COVERAGE_CLASS ?
2299 					wiphy->coverage_class : -1;
2300 		err = drv_set_coverage_class(local, coverage_class);
2301 
2302 		if (err)
2303 			return err;
2304 	}
2305 
2306 	if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
2307 		err = drv_set_rts_threshold(local, wiphy->rts_threshold);
2308 
2309 		if (err)
2310 			return err;
2311 	}
2312 
2313 	if (changed & WIPHY_PARAM_RETRY_SHORT) {
2314 		if (wiphy->retry_short > IEEE80211_MAX_TX_RETRY)
2315 			return -EINVAL;
2316 		local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
2317 	}
2318 	if (changed & WIPHY_PARAM_RETRY_LONG) {
2319 		if (wiphy->retry_long > IEEE80211_MAX_TX_RETRY)
2320 			return -EINVAL;
2321 		local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
2322 	}
2323 	if (changed &
2324 	    (WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
2325 		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
2326 
2327 	return 0;
2328 }
2329 
2330 static int ieee80211_set_tx_power(struct wiphy *wiphy,
2331 				  struct wireless_dev *wdev,
2332 				  enum nl80211_tx_power_setting type, int mbm)
2333 {
2334 	struct ieee80211_local *local = wiphy_priv(wiphy);
2335 	struct ieee80211_sub_if_data *sdata;
2336 	enum nl80211_tx_power_setting txp_type = type;
2337 	bool update_txp_type = false;
2338 
2339 	if (wdev) {
2340 		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2341 
2342 		switch (type) {
2343 		case NL80211_TX_POWER_AUTOMATIC:
2344 			sdata->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
2345 			txp_type = NL80211_TX_POWER_LIMITED;
2346 			break;
2347 		case NL80211_TX_POWER_LIMITED:
2348 		case NL80211_TX_POWER_FIXED:
2349 			if (mbm < 0 || (mbm % 100))
2350 				return -EOPNOTSUPP;
2351 			sdata->user_power_level = MBM_TO_DBM(mbm);
2352 			break;
2353 		}
2354 
2355 		if (txp_type != sdata->vif.bss_conf.txpower_type) {
2356 			update_txp_type = true;
2357 			sdata->vif.bss_conf.txpower_type = txp_type;
2358 		}
2359 
2360 		ieee80211_recalc_txpower(sdata, update_txp_type);
2361 
2362 		return 0;
2363 	}
2364 
2365 	switch (type) {
2366 	case NL80211_TX_POWER_AUTOMATIC:
2367 		local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
2368 		txp_type = NL80211_TX_POWER_LIMITED;
2369 		break;
2370 	case NL80211_TX_POWER_LIMITED:
2371 	case NL80211_TX_POWER_FIXED:
2372 		if (mbm < 0 || (mbm % 100))
2373 			return -EOPNOTSUPP;
2374 		local->user_power_level = MBM_TO_DBM(mbm);
2375 		break;
2376 	}
2377 
2378 	mutex_lock(&local->iflist_mtx);
2379 	list_for_each_entry(sdata, &local->interfaces, list) {
2380 		sdata->user_power_level = local->user_power_level;
2381 		if (txp_type != sdata->vif.bss_conf.txpower_type)
2382 			update_txp_type = true;
2383 		sdata->vif.bss_conf.txpower_type = txp_type;
2384 	}
2385 	list_for_each_entry(sdata, &local->interfaces, list)
2386 		ieee80211_recalc_txpower(sdata, update_txp_type);
2387 	mutex_unlock(&local->iflist_mtx);
2388 
2389 	return 0;
2390 }
2391 
2392 static int ieee80211_get_tx_power(struct wiphy *wiphy,
2393 				  struct wireless_dev *wdev,
2394 				  int *dbm)
2395 {
2396 	struct ieee80211_local *local = wiphy_priv(wiphy);
2397 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2398 
2399 	if (local->ops->get_txpower)
2400 		return drv_get_txpower(local, sdata, dbm);
2401 
2402 	if (!local->use_chanctx)
2403 		*dbm = local->hw.conf.power_level;
2404 	else
2405 		*dbm = sdata->vif.bss_conf.txpower;
2406 
2407 	return 0;
2408 }
2409 
2410 static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
2411 				  const u8 *addr)
2412 {
2413 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2414 
2415 	memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN);
2416 
2417 	return 0;
2418 }
2419 
2420 static void ieee80211_rfkill_poll(struct wiphy *wiphy)
2421 {
2422 	struct ieee80211_local *local = wiphy_priv(wiphy);
2423 
2424 	drv_rfkill_poll(local);
2425 }
2426 
2427 #ifdef CONFIG_NL80211_TESTMODE
2428 static int ieee80211_testmode_cmd(struct wiphy *wiphy,
2429 				  struct wireless_dev *wdev,
2430 				  void *data, int len)
2431 {
2432 	struct ieee80211_local *local = wiphy_priv(wiphy);
2433 	struct ieee80211_vif *vif = NULL;
2434 
2435 	if (!local->ops->testmode_cmd)
2436 		return -EOPNOTSUPP;
2437 
2438 	if (wdev) {
2439 		struct ieee80211_sub_if_data *sdata;
2440 
2441 		sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
2442 		if (sdata->flags & IEEE80211_SDATA_IN_DRIVER)
2443 			vif = &sdata->vif;
2444 	}
2445 
2446 	return local->ops->testmode_cmd(&local->hw, vif, data, len);
2447 }
2448 
2449 static int ieee80211_testmode_dump(struct wiphy *wiphy,
2450 				   struct sk_buff *skb,
2451 				   struct netlink_callback *cb,
2452 				   void *data, int len)
2453 {
2454 	struct ieee80211_local *local = wiphy_priv(wiphy);
2455 
2456 	if (!local->ops->testmode_dump)
2457 		return -EOPNOTSUPP;
2458 
2459 	return local->ops->testmode_dump(&local->hw, skb, cb, data, len);
2460 }
2461 #endif
2462 
2463 int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata,
2464 				enum ieee80211_smps_mode smps_mode)
2465 {
2466 	struct sta_info *sta;
2467 	enum ieee80211_smps_mode old_req;
2468 
2469 	if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP))
2470 		return -EINVAL;
2471 
2472 	if (sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
2473 		return 0;
2474 
2475 	old_req = sdata->u.ap.req_smps;
2476 	sdata->u.ap.req_smps = smps_mode;
2477 
2478 	/* AUTOMATIC doesn't mean much for AP - don't allow it */
2479 	if (old_req == smps_mode ||
2480 	    smps_mode == IEEE80211_SMPS_AUTOMATIC)
2481 		return 0;
2482 
2483 	 /* If no associated stations, there's no need to do anything */
2484 	if (!atomic_read(&sdata->u.ap.num_mcast_sta)) {
2485 		sdata->smps_mode = smps_mode;
2486 		ieee80211_queue_work(&sdata->local->hw, &sdata->recalc_smps);
2487 		return 0;
2488 	}
2489 
2490 	ht_dbg(sdata,
2491 	       "SMPS %d requested in AP mode, sending Action frame to %d stations\n",
2492 	       smps_mode, atomic_read(&sdata->u.ap.num_mcast_sta));
2493 
2494 	mutex_lock(&sdata->local->sta_mtx);
2495 	list_for_each_entry(sta, &sdata->local->sta_list, list) {
2496 		/*
2497 		 * Only stations associated to our AP and
2498 		 * associated VLANs
2499 		 */
2500 		if (sta->sdata->bss != &sdata->u.ap)
2501 			continue;
2502 
2503 		/* This station doesn't support MIMO - skip it */
2504 		if (sta_info_tx_streams(sta) == 1)
2505 			continue;
2506 
2507 		/*
2508 		 * Don't wake up a STA just to send the action frame
2509 		 * unless we are getting more restrictive.
2510 		 */
2511 		if (test_sta_flag(sta, WLAN_STA_PS_STA) &&
2512 		    !ieee80211_smps_is_restrictive(sta->known_smps_mode,
2513 						   smps_mode)) {
2514 			ht_dbg(sdata, "Won't send SMPS to sleeping STA %pM\n",
2515 			       sta->sta.addr);
2516 			continue;
2517 		}
2518 
2519 		/*
2520 		 * If the STA is not authorized, wait until it gets
2521 		 * authorized and the action frame will be sent then.
2522 		 */
2523 		if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED))
2524 			continue;
2525 
2526 		ht_dbg(sdata, "Sending SMPS to %pM\n", sta->sta.addr);
2527 		ieee80211_send_smps_action(sdata, smps_mode, sta->sta.addr,
2528 					   sdata->vif.bss_conf.bssid);
2529 	}
2530 	mutex_unlock(&sdata->local->sta_mtx);
2531 
2532 	sdata->smps_mode = smps_mode;
2533 	ieee80211_queue_work(&sdata->local->hw, &sdata->recalc_smps);
2534 
2535 	return 0;
2536 }
2537 
2538 int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
2539 				 enum ieee80211_smps_mode smps_mode)
2540 {
2541 	const u8 *ap;
2542 	enum ieee80211_smps_mode old_req;
2543 	int err;
2544 	struct sta_info *sta;
2545 	bool tdls_peer_found = false;
2546 
2547 	lockdep_assert_held(&sdata->wdev.mtx);
2548 
2549 	if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION))
2550 		return -EINVAL;
2551 
2552 	old_req = sdata->u.mgd.req_smps;
2553 	sdata->u.mgd.req_smps = smps_mode;
2554 
2555 	if (old_req == smps_mode &&
2556 	    smps_mode != IEEE80211_SMPS_AUTOMATIC)
2557 		return 0;
2558 
2559 	/*
2560 	 * If not associated, or current association is not an HT
2561 	 * association, there's no need to do anything, just store
2562 	 * the new value until we associate.
2563 	 */
2564 	if (!sdata->u.mgd.associated ||
2565 	    sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
2566 		return 0;
2567 
2568 	ap = sdata->u.mgd.associated->bssid;
2569 
2570 	rcu_read_lock();
2571 	list_for_each_entry_rcu(sta, &sdata->local->sta_list, list) {
2572 		if (!sta->sta.tdls || sta->sdata != sdata || !sta->uploaded ||
2573 		    !test_sta_flag(sta, WLAN_STA_AUTHORIZED))
2574 			continue;
2575 
2576 		tdls_peer_found = true;
2577 		break;
2578 	}
2579 	rcu_read_unlock();
2580 
2581 	if (smps_mode == IEEE80211_SMPS_AUTOMATIC) {
2582 		if (tdls_peer_found || !sdata->u.mgd.powersave)
2583 			smps_mode = IEEE80211_SMPS_OFF;
2584 		else
2585 			smps_mode = IEEE80211_SMPS_DYNAMIC;
2586 	}
2587 
2588 	/* send SM PS frame to AP */
2589 	err = ieee80211_send_smps_action(sdata, smps_mode,
2590 					 ap, ap);
2591 	if (err)
2592 		sdata->u.mgd.req_smps = old_req;
2593 	else if (smps_mode != IEEE80211_SMPS_OFF && tdls_peer_found)
2594 		ieee80211_teardown_tdls_peers(sdata);
2595 
2596 	return err;
2597 }
2598 
2599 static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
2600 				    bool enabled, int timeout)
2601 {
2602 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2603 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
2604 
2605 	if (sdata->vif.type != NL80211_IFTYPE_STATION)
2606 		return -EOPNOTSUPP;
2607 
2608 	if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS))
2609 		return -EOPNOTSUPP;
2610 
2611 	if (enabled == sdata->u.mgd.powersave &&
2612 	    timeout == local->dynamic_ps_forced_timeout)
2613 		return 0;
2614 
2615 	sdata->u.mgd.powersave = enabled;
2616 	local->dynamic_ps_forced_timeout = timeout;
2617 
2618 	/* no change, but if automatic follow powersave */
2619 	sdata_lock(sdata);
2620 	__ieee80211_request_smps_mgd(sdata, sdata->u.mgd.req_smps);
2621 	sdata_unlock(sdata);
2622 
2623 	if (ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))
2624 		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
2625 
2626 	ieee80211_recalc_ps(local);
2627 	ieee80211_recalc_ps_vif(sdata);
2628 
2629 	return 0;
2630 }
2631 
2632 static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
2633 					 struct net_device *dev,
2634 					 s32 rssi_thold, u32 rssi_hyst)
2635 {
2636 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2637 	struct ieee80211_vif *vif = &sdata->vif;
2638 	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
2639 
2640 	if (rssi_thold == bss_conf->cqm_rssi_thold &&
2641 	    rssi_hyst == bss_conf->cqm_rssi_hyst)
2642 		return 0;
2643 
2644 	if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER &&
2645 	    !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI))
2646 		return -EOPNOTSUPP;
2647 
2648 	bss_conf->cqm_rssi_thold = rssi_thold;
2649 	bss_conf->cqm_rssi_hyst = rssi_hyst;
2650 	sdata->u.mgd.last_cqm_event_signal = 0;
2651 
2652 	/* tell the driver upon association, unless already associated */
2653 	if (sdata->u.mgd.associated &&
2654 	    sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)
2655 		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
2656 
2657 	return 0;
2658 }
2659 
2660 static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
2661 				      struct net_device *dev,
2662 				      const u8 *addr,
2663 				      const struct cfg80211_bitrate_mask *mask)
2664 {
2665 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2666 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
2667 	int i, ret;
2668 
2669 	if (!ieee80211_sdata_running(sdata))
2670 		return -ENETDOWN;
2671 
2672 	if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
2673 		ret = drv_set_bitrate_mask(local, sdata, mask);
2674 		if (ret)
2675 			return ret;
2676 	}
2677 
2678 	for (i = 0; i < NUM_NL80211_BANDS; i++) {
2679 		struct ieee80211_supported_band *sband = wiphy->bands[i];
2680 		int j;
2681 
2682 		sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
2683 		memcpy(sdata->rc_rateidx_mcs_mask[i], mask->control[i].ht_mcs,
2684 		       sizeof(mask->control[i].ht_mcs));
2685 		memcpy(sdata->rc_rateidx_vht_mcs_mask[i],
2686 		       mask->control[i].vht_mcs,
2687 		       sizeof(mask->control[i].vht_mcs));
2688 
2689 		sdata->rc_has_mcs_mask[i] = false;
2690 		sdata->rc_has_vht_mcs_mask[i] = false;
2691 		if (!sband)
2692 			continue;
2693 
2694 		for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) {
2695 			if (~sdata->rc_rateidx_mcs_mask[i][j]) {
2696 				sdata->rc_has_mcs_mask[i] = true;
2697 				break;
2698 			}
2699 		}
2700 
2701 		for (j = 0; j < NL80211_VHT_NSS_MAX; j++) {
2702 			if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) {
2703 				sdata->rc_has_vht_mcs_mask[i] = true;
2704 				break;
2705 			}
2706 		}
2707 	}
2708 
2709 	return 0;
2710 }
2711 
2712 static int ieee80211_start_radar_detection(struct wiphy *wiphy,
2713 					   struct net_device *dev,
2714 					   struct cfg80211_chan_def *chandef,
2715 					   u32 cac_time_ms)
2716 {
2717 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
2718 	struct ieee80211_local *local = sdata->local;
2719 	int err;
2720 
2721 	mutex_lock(&local->mtx);
2722 	if (!list_empty(&local->roc_list) || local->scanning) {
2723 		err = -EBUSY;
2724 		goto out_unlock;
2725 	}
2726 
2727 	/* whatever, but channel contexts should not complain about that one */
2728 	sdata->smps_mode = IEEE80211_SMPS_OFF;
2729 	sdata->needed_rx_chains = local->rx_chains;
2730 
2731 	err = ieee80211_vif_use_channel(sdata, chandef,
2732 					IEEE80211_CHANCTX_SHARED);
2733 	if (err)
2734 		goto out_unlock;
2735 
2736 	ieee80211_queue_delayed_work(&sdata->local->hw,
2737 				     &sdata->dfs_cac_timer_work,
2738 				     msecs_to_jiffies(cac_time_ms));
2739 
2740  out_unlock:
2741 	mutex_unlock(&local->mtx);
2742 	return err;
2743 }
2744 
2745 static struct cfg80211_beacon_data *
2746 cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
2747 {
2748 	struct cfg80211_beacon_data *new_beacon;
2749 	u8 *pos;
2750 	int len;
2751 
2752 	len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len +
2753 	      beacon->proberesp_ies_len + beacon->assocresp_ies_len +
2754 	      beacon->probe_resp_len;
2755 
2756 	new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL);
2757 	if (!new_beacon)
2758 		return NULL;
2759 
2760 	pos = (u8 *)(new_beacon + 1);
2761 	if (beacon->head_len) {
2762 		new_beacon->head_len = beacon->head_len;
2763 		new_beacon->head = pos;
2764 		memcpy(pos, beacon->head, beacon->head_len);
2765 		pos += beacon->head_len;
2766 	}
2767 	if (beacon->tail_len) {
2768 		new_beacon->tail_len = beacon->tail_len;
2769 		new_beacon->tail = pos;
2770 		memcpy(pos, beacon->tail, beacon->tail_len);
2771 		pos += beacon->tail_len;
2772 	}
2773 	if (beacon->beacon_ies_len) {
2774 		new_beacon->beacon_ies_len = beacon->beacon_ies_len;
2775 		new_beacon->beacon_ies = pos;
2776 		memcpy(pos, beacon->beacon_ies, beacon->beacon_ies_len);
2777 		pos += beacon->beacon_ies_len;
2778 	}
2779 	if (beacon->proberesp_ies_len) {
2780 		new_beacon->proberesp_ies_len = beacon->proberesp_ies_len;
2781 		new_beacon->proberesp_ies = pos;
2782 		memcpy(pos, beacon->proberesp_ies, beacon->proberesp_ies_len);
2783 		pos += beacon->proberesp_ies_len;
2784 	}
2785 	if (beacon->assocresp_ies_len) {
2786 		new_beacon->assocresp_ies_len = beacon->assocresp_ies_len;
2787 		new_beacon->assocresp_ies = pos;
2788 		memcpy(pos, beacon->assocresp_ies, beacon->assocresp_ies_len);
2789 		pos += beacon->assocresp_ies_len;
2790 	}
2791 	if (beacon->probe_resp_len) {
2792 		new_beacon->probe_resp_len = beacon->probe_resp_len;
2793 		beacon->probe_resp = pos;
2794 		memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
2795 		pos += beacon->probe_resp_len;
2796 	}
2797 
2798 	return new_beacon;
2799 }
2800 
2801 void ieee80211_csa_finish(struct ieee80211_vif *vif)
2802 {
2803 	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2804 
2805 	ieee80211_queue_work(&sdata->local->hw,
2806 			     &sdata->csa_finalize_work);
2807 }
2808 EXPORT_SYMBOL(ieee80211_csa_finish);
2809 
2810 static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
2811 					  u32 *changed)
2812 {
2813 	int err;
2814 
2815 	switch (sdata->vif.type) {
2816 	case NL80211_IFTYPE_AP:
2817 		err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
2818 					      NULL);
2819 		kfree(sdata->u.ap.next_beacon);
2820 		sdata->u.ap.next_beacon = NULL;
2821 
2822 		if (err < 0)
2823 			return err;
2824 		*changed |= err;
2825 		break;
2826 	case NL80211_IFTYPE_ADHOC:
2827 		err = ieee80211_ibss_finish_csa(sdata);
2828 		if (err < 0)
2829 			return err;
2830 		*changed |= err;
2831 		break;
2832 #ifdef CONFIG_MAC80211_MESH
2833 	case NL80211_IFTYPE_MESH_POINT:
2834 		err = ieee80211_mesh_finish_csa(sdata);
2835 		if (err < 0)
2836 			return err;
2837 		*changed |= err;
2838 		break;
2839 #endif
2840 	default:
2841 		WARN_ON(1);
2842 		return -EINVAL;
2843 	}
2844 
2845 	return 0;
2846 }
2847 
2848 static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
2849 {
2850 	struct ieee80211_local *local = sdata->local;
2851 	u32 changed = 0;
2852 	int err;
2853 
2854 	sdata_assert_lock(sdata);
2855 	lockdep_assert_held(&local->mtx);
2856 	lockdep_assert_held(&local->chanctx_mtx);
2857 
2858 	/*
2859 	 * using reservation isn't immediate as it may be deferred until later
2860 	 * with multi-vif. once reservation is complete it will re-schedule the
2861 	 * work with no reserved_chanctx so verify chandef to check if it
2862 	 * completed successfully
2863 	 */
2864 
2865 	if (sdata->reserved_chanctx) {
2866 		/*
2867 		 * with multi-vif csa driver may call ieee80211_csa_finish()
2868 		 * many times while waiting for other interfaces to use their
2869 		 * reservations
2870 		 */
2871 		if (sdata->reserved_ready)
2872 			return 0;
2873 
2874 		return ieee80211_vif_use_reserved_context(sdata);
2875 	}
2876 
2877 	if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef,
2878 					&sdata->csa_chandef))
2879 		return -EINVAL;
2880 
2881 	sdata->vif.csa_active = false;
2882 
2883 	err = ieee80211_set_after_csa_beacon(sdata, &changed);
2884 	if (err)
2885 		return err;
2886 
2887 	ieee80211_bss_info_change_notify(sdata, changed);
2888 
2889 	if (sdata->csa_block_tx) {
2890 		ieee80211_wake_vif_queues(local, sdata,
2891 					  IEEE80211_QUEUE_STOP_REASON_CSA);
2892 		sdata->csa_block_tx = false;
2893 	}
2894 
2895 	err = drv_post_channel_switch(sdata);
2896 	if (err)
2897 		return err;
2898 
2899 	cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef);
2900 
2901 	return 0;
2902 }
2903 
2904 static void ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
2905 {
2906 	if (__ieee80211_csa_finalize(sdata)) {
2907 		sdata_info(sdata, "failed to finalize CSA, disconnecting\n");
2908 		cfg80211_stop_iface(sdata->local->hw.wiphy, &sdata->wdev,
2909 				    GFP_KERNEL);
2910 	}
2911 }
2912 
2913 void ieee80211_csa_finalize_work(struct work_struct *work)
2914 {
2915 	struct ieee80211_sub_if_data *sdata =
2916 		container_of(work, struct ieee80211_sub_if_data,
2917 			     csa_finalize_work);
2918 	struct ieee80211_local *local = sdata->local;
2919 
2920 	sdata_lock(sdata);
2921 	mutex_lock(&local->mtx);
2922 	mutex_lock(&local->chanctx_mtx);
2923 
2924 	/* AP might have been stopped while waiting for the lock. */
2925 	if (!sdata->vif.csa_active)
2926 		goto unlock;
2927 
2928 	if (!ieee80211_sdata_running(sdata))
2929 		goto unlock;
2930 
2931 	ieee80211_csa_finalize(sdata);
2932 
2933 unlock:
2934 	mutex_unlock(&local->chanctx_mtx);
2935 	mutex_unlock(&local->mtx);
2936 	sdata_unlock(sdata);
2937 }
2938 
2939 static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata,
2940 				    struct cfg80211_csa_settings *params,
2941 				    u32 *changed)
2942 {
2943 	struct ieee80211_csa_settings csa = {};
2944 	int err;
2945 
2946 	switch (sdata->vif.type) {
2947 	case NL80211_IFTYPE_AP:
2948 		sdata->u.ap.next_beacon =
2949 			cfg80211_beacon_dup(&params->beacon_after);
2950 		if (!sdata->u.ap.next_beacon)
2951 			return -ENOMEM;
2952 
2953 		/*
2954 		 * With a count of 0, we don't have to wait for any
2955 		 * TBTT before switching, so complete the CSA
2956 		 * immediately.  In theory, with a count == 1 we
2957 		 * should delay the switch until just before the next
2958 		 * TBTT, but that would complicate things so we switch
2959 		 * immediately too.  If we would delay the switch
2960 		 * until the next TBTT, we would have to set the probe
2961 		 * response here.
2962 		 *
2963 		 * TODO: A channel switch with count <= 1 without
2964 		 * sending a CSA action frame is kind of useless,
2965 		 * because the clients won't know we're changing
2966 		 * channels.  The action frame must be implemented
2967 		 * either here or in the userspace.
2968 		 */
2969 		if (params->count <= 1)
2970 			break;
2971 
2972 		if ((params->n_counter_offsets_beacon >
2973 		     IEEE80211_MAX_CSA_COUNTERS_NUM) ||
2974 		    (params->n_counter_offsets_presp >
2975 		     IEEE80211_MAX_CSA_COUNTERS_NUM))
2976 			return -EINVAL;
2977 
2978 		csa.counter_offsets_beacon = params->counter_offsets_beacon;
2979 		csa.counter_offsets_presp = params->counter_offsets_presp;
2980 		csa.n_counter_offsets_beacon = params->n_counter_offsets_beacon;
2981 		csa.n_counter_offsets_presp = params->n_counter_offsets_presp;
2982 		csa.count = params->count;
2983 
2984 		err = ieee80211_assign_beacon(sdata, &params->beacon_csa, &csa);
2985 		if (err < 0) {
2986 			kfree(sdata->u.ap.next_beacon);
2987 			return err;
2988 		}
2989 		*changed |= err;
2990 
2991 		break;
2992 	case NL80211_IFTYPE_ADHOC:
2993 		if (!sdata->vif.bss_conf.ibss_joined)
2994 			return -EINVAL;
2995 
2996 		if (params->chandef.width != sdata->u.ibss.chandef.width)
2997 			return -EINVAL;
2998 
2999 		switch (params->chandef.width) {
3000 		case NL80211_CHAN_WIDTH_40:
3001 			if (cfg80211_get_chandef_type(&params->chandef) !=
3002 			    cfg80211_get_chandef_type(&sdata->u.ibss.chandef))
3003 				return -EINVAL;
3004 		case NL80211_CHAN_WIDTH_5:
3005 		case NL80211_CHAN_WIDTH_10:
3006 		case NL80211_CHAN_WIDTH_20_NOHT:
3007 		case NL80211_CHAN_WIDTH_20:
3008 			break;
3009 		default:
3010 			return -EINVAL;
3011 		}
3012 
3013 		/* changes into another band are not supported */
3014 		if (sdata->u.ibss.chandef.chan->band !=
3015 		    params->chandef.chan->band)
3016 			return -EINVAL;
3017 
3018 		/* see comments in the NL80211_IFTYPE_AP block */
3019 		if (params->count > 1) {
3020 			err = ieee80211_ibss_csa_beacon(sdata, params);
3021 			if (err < 0)
3022 				return err;
3023 			*changed |= err;
3024 		}
3025 
3026 		ieee80211_send_action_csa(sdata, params);
3027 
3028 		break;
3029 #ifdef CONFIG_MAC80211_MESH
3030 	case NL80211_IFTYPE_MESH_POINT: {
3031 		struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
3032 
3033 		if (params->chandef.width != sdata->vif.bss_conf.chandef.width)
3034 			return -EINVAL;
3035 
3036 		/* changes into another band are not supported */
3037 		if (sdata->vif.bss_conf.chandef.chan->band !=
3038 		    params->chandef.chan->band)
3039 			return -EINVAL;
3040 
3041 		if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_NONE) {
3042 			ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_INIT;
3043 			if (!ifmsh->pre_value)
3044 				ifmsh->pre_value = 1;
3045 			else
3046 				ifmsh->pre_value++;
3047 		}
3048 
3049 		/* see comments in the NL80211_IFTYPE_AP block */
3050 		if (params->count > 1) {
3051 			err = ieee80211_mesh_csa_beacon(sdata, params);
3052 			if (err < 0) {
3053 				ifmsh->csa_role = IEEE80211_MESH_CSA_ROLE_NONE;
3054 				return err;
3055 			}
3056 			*changed |= err;
3057 		}
3058 
3059 		if (ifmsh->csa_role == IEEE80211_MESH_CSA_ROLE_INIT)
3060 			ieee80211_send_action_csa(sdata, params);
3061 
3062 		break;
3063 		}
3064 #endif
3065 	default:
3066 		return -EOPNOTSUPP;
3067 	}
3068 
3069 	return 0;
3070 }
3071 
3072 static int
3073 __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
3074 			   struct cfg80211_csa_settings *params)
3075 {
3076 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3077 	struct ieee80211_local *local = sdata->local;
3078 	struct ieee80211_channel_switch ch_switch;
3079 	struct ieee80211_chanctx_conf *conf;
3080 	struct ieee80211_chanctx *chanctx;
3081 	u32 changed = 0;
3082 	int err;
3083 
3084 	sdata_assert_lock(sdata);
3085 	lockdep_assert_held(&local->mtx);
3086 
3087 	if (!list_empty(&local->roc_list) || local->scanning)
3088 		return -EBUSY;
3089 
3090 	if (sdata->wdev.cac_started)
3091 		return -EBUSY;
3092 
3093 	if (cfg80211_chandef_identical(&params->chandef,
3094 				       &sdata->vif.bss_conf.chandef))
3095 		return -EINVAL;
3096 
3097 	/* don't allow another channel switch if one is already active. */
3098 	if (sdata->vif.csa_active)
3099 		return -EBUSY;
3100 
3101 	mutex_lock(&local->chanctx_mtx);
3102 	conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
3103 					 lockdep_is_held(&local->chanctx_mtx));
3104 	if (!conf) {
3105 		err = -EBUSY;
3106 		goto out;
3107 	}
3108 
3109 	chanctx = container_of(conf, struct ieee80211_chanctx, conf);
3110 
3111 	ch_switch.timestamp = 0;
3112 	ch_switch.device_timestamp = 0;
3113 	ch_switch.block_tx = params->block_tx;
3114 	ch_switch.chandef = params->chandef;
3115 	ch_switch.count = params->count;
3116 
3117 	err = drv_pre_channel_switch(sdata, &ch_switch);
3118 	if (err)
3119 		goto out;
3120 
3121 	err = ieee80211_vif_reserve_chanctx(sdata, &params->chandef,
3122 					    chanctx->mode,
3123 					    params->radar_required);
3124 	if (err)
3125 		goto out;
3126 
3127 	/* if reservation is invalid then this will fail */
3128 	err = ieee80211_check_combinations(sdata, NULL, chanctx->mode, 0);
3129 	if (err) {
3130 		ieee80211_vif_unreserve_chanctx(sdata);
3131 		goto out;
3132 	}
3133 
3134 	err = ieee80211_set_csa_beacon(sdata, params, &changed);
3135 	if (err) {
3136 		ieee80211_vif_unreserve_chanctx(sdata);
3137 		goto out;
3138 	}
3139 
3140 	sdata->csa_chandef = params->chandef;
3141 	sdata->csa_block_tx = params->block_tx;
3142 	sdata->vif.csa_active = true;
3143 
3144 	if (sdata->csa_block_tx)
3145 		ieee80211_stop_vif_queues(local, sdata,
3146 					  IEEE80211_QUEUE_STOP_REASON_CSA);
3147 
3148 	cfg80211_ch_switch_started_notify(sdata->dev, &sdata->csa_chandef,
3149 					  params->count);
3150 
3151 	if (changed) {
3152 		ieee80211_bss_info_change_notify(sdata, changed);
3153 		drv_channel_switch_beacon(sdata, &params->chandef);
3154 	} else {
3155 		/* if the beacon didn't change, we can finalize immediately */
3156 		ieee80211_csa_finalize(sdata);
3157 	}
3158 
3159 out:
3160 	mutex_unlock(&local->chanctx_mtx);
3161 	return err;
3162 }
3163 
3164 int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
3165 			     struct cfg80211_csa_settings *params)
3166 {
3167 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3168 	struct ieee80211_local *local = sdata->local;
3169 	int err;
3170 
3171 	mutex_lock(&local->mtx);
3172 	err = __ieee80211_channel_switch(wiphy, dev, params);
3173 	mutex_unlock(&local->mtx);
3174 
3175 	return err;
3176 }
3177 
3178 u64 ieee80211_mgmt_tx_cookie(struct ieee80211_local *local)
3179 {
3180 	lockdep_assert_held(&local->mtx);
3181 
3182 	local->roc_cookie_counter++;
3183 
3184 	/* wow, you wrapped 64 bits ... more likely a bug */
3185 	if (WARN_ON(local->roc_cookie_counter == 0))
3186 		local->roc_cookie_counter++;
3187 
3188 	return local->roc_cookie_counter;
3189 }
3190 
3191 int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
3192 			     u64 *cookie, gfp_t gfp)
3193 {
3194 	unsigned long spin_flags;
3195 	struct sk_buff *ack_skb;
3196 	int id;
3197 
3198 	ack_skb = skb_copy(skb, gfp);
3199 	if (!ack_skb)
3200 		return -ENOMEM;
3201 
3202 	spin_lock_irqsave(&local->ack_status_lock, spin_flags);
3203 	id = idr_alloc(&local->ack_status_frames, ack_skb,
3204 		       1, 0x10000, GFP_ATOMIC);
3205 	spin_unlock_irqrestore(&local->ack_status_lock, spin_flags);
3206 
3207 	if (id < 0) {
3208 		kfree_skb(ack_skb);
3209 		return -ENOMEM;
3210 	}
3211 
3212 	IEEE80211_SKB_CB(skb)->ack_frame_id = id;
3213 
3214 	*cookie = ieee80211_mgmt_tx_cookie(local);
3215 	IEEE80211_SKB_CB(ack_skb)->ack.cookie = *cookie;
3216 
3217 	return 0;
3218 }
3219 
3220 static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
3221 					  struct wireless_dev *wdev,
3222 					  u16 frame_type, bool reg)
3223 {
3224 	struct ieee80211_local *local = wiphy_priv(wiphy);
3225 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3226 
3227 	switch (frame_type) {
3228 	case IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ:
3229 		if (reg) {
3230 			local->probe_req_reg++;
3231 			sdata->vif.probe_req_reg++;
3232 		} else {
3233 			if (local->probe_req_reg)
3234 				local->probe_req_reg--;
3235 
3236 			if (sdata->vif.probe_req_reg)
3237 				sdata->vif.probe_req_reg--;
3238 		}
3239 
3240 		if (!local->open_count)
3241 			break;
3242 
3243 		if (sdata->vif.probe_req_reg == 1)
3244 			drv_config_iface_filter(local, sdata, FIF_PROBE_REQ,
3245 						FIF_PROBE_REQ);
3246 		else if (sdata->vif.probe_req_reg == 0)
3247 			drv_config_iface_filter(local, sdata, 0,
3248 						FIF_PROBE_REQ);
3249 
3250 		ieee80211_configure_filter(local);
3251 		break;
3252 	default:
3253 		break;
3254 	}
3255 }
3256 
3257 static int ieee80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
3258 {
3259 	struct ieee80211_local *local = wiphy_priv(wiphy);
3260 
3261 	if (local->started)
3262 		return -EOPNOTSUPP;
3263 
3264 	return drv_set_antenna(local, tx_ant, rx_ant);
3265 }
3266 
3267 static int ieee80211_get_antenna(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant)
3268 {
3269 	struct ieee80211_local *local = wiphy_priv(wiphy);
3270 
3271 	return drv_get_antenna(local, tx_ant, rx_ant);
3272 }
3273 
3274 static int ieee80211_set_rekey_data(struct wiphy *wiphy,
3275 				    struct net_device *dev,
3276 				    struct cfg80211_gtk_rekey_data *data)
3277 {
3278 	struct ieee80211_local *local = wiphy_priv(wiphy);
3279 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3280 
3281 	if (!local->ops->set_rekey_data)
3282 		return -EOPNOTSUPP;
3283 
3284 	drv_set_rekey_data(local, sdata, data);
3285 
3286 	return 0;
3287 }
3288 
3289 static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
3290 				  const u8 *peer, u64 *cookie)
3291 {
3292 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3293 	struct ieee80211_local *local = sdata->local;
3294 	struct ieee80211_qos_hdr *nullfunc;
3295 	struct sk_buff *skb;
3296 	int size = sizeof(*nullfunc);
3297 	__le16 fc;
3298 	bool qos;
3299 	struct ieee80211_tx_info *info;
3300 	struct sta_info *sta;
3301 	struct ieee80211_chanctx_conf *chanctx_conf;
3302 	enum nl80211_band band;
3303 	int ret;
3304 
3305 	/* the lock is needed to assign the cookie later */
3306 	mutex_lock(&local->mtx);
3307 
3308 	rcu_read_lock();
3309 	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3310 	if (WARN_ON(!chanctx_conf)) {
3311 		ret = -EINVAL;
3312 		goto unlock;
3313 	}
3314 	band = chanctx_conf->def.chan->band;
3315 	sta = sta_info_get_bss(sdata, peer);
3316 	if (sta) {
3317 		qos = sta->sta.wme;
3318 	} else {
3319 		ret = -ENOLINK;
3320 		goto unlock;
3321 	}
3322 
3323 	if (qos) {
3324 		fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
3325 				 IEEE80211_STYPE_QOS_NULLFUNC |
3326 				 IEEE80211_FCTL_FROMDS);
3327 	} else {
3328 		size -= 2;
3329 		fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
3330 				 IEEE80211_STYPE_NULLFUNC |
3331 				 IEEE80211_FCTL_FROMDS);
3332 	}
3333 
3334 	skb = dev_alloc_skb(local->hw.extra_tx_headroom + size);
3335 	if (!skb) {
3336 		ret = -ENOMEM;
3337 		goto unlock;
3338 	}
3339 
3340 	skb->dev = dev;
3341 
3342 	skb_reserve(skb, local->hw.extra_tx_headroom);
3343 
3344 	nullfunc = (void *) skb_put(skb, size);
3345 	nullfunc->frame_control = fc;
3346 	nullfunc->duration_id = 0;
3347 	memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN);
3348 	memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
3349 	memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN);
3350 	nullfunc->seq_ctrl = 0;
3351 
3352 	info = IEEE80211_SKB_CB(skb);
3353 
3354 	info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS |
3355 		       IEEE80211_TX_INTFL_NL80211_FRAME_TX;
3356 	info->band = band;
3357 
3358 	skb_set_queue_mapping(skb, IEEE80211_AC_VO);
3359 	skb->priority = 7;
3360 	if (qos)
3361 		nullfunc->qos_ctrl = cpu_to_le16(7);
3362 
3363 	ret = ieee80211_attach_ack_skb(local, skb, cookie, GFP_ATOMIC);
3364 	if (ret) {
3365 		kfree_skb(skb);
3366 		goto unlock;
3367 	}
3368 
3369 	local_bh_disable();
3370 	ieee80211_xmit(sdata, sta, skb);
3371 	local_bh_enable();
3372 
3373 	ret = 0;
3374 unlock:
3375 	rcu_read_unlock();
3376 	mutex_unlock(&local->mtx);
3377 
3378 	return ret;
3379 }
3380 
3381 static int ieee80211_cfg_get_channel(struct wiphy *wiphy,
3382 				     struct wireless_dev *wdev,
3383 				     struct cfg80211_chan_def *chandef)
3384 {
3385 	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3386 	struct ieee80211_local *local = wiphy_priv(wiphy);
3387 	struct ieee80211_chanctx_conf *chanctx_conf;
3388 	int ret = -ENODATA;
3389 
3390 	rcu_read_lock();
3391 	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3392 	if (chanctx_conf) {
3393 		*chandef = sdata->vif.bss_conf.chandef;
3394 		ret = 0;
3395 	} else if (local->open_count > 0 &&
3396 		   local->open_count == local->monitors &&
3397 		   sdata->vif.type == NL80211_IFTYPE_MONITOR) {
3398 		if (local->use_chanctx)
3399 			*chandef = local->monitor_chandef;
3400 		else
3401 			*chandef = local->_oper_chandef;
3402 		ret = 0;
3403 	}
3404 	rcu_read_unlock();
3405 
3406 	return ret;
3407 }
3408 
3409 #ifdef CONFIG_PM
3410 static void ieee80211_set_wakeup(struct wiphy *wiphy, bool enabled)
3411 {
3412 	drv_set_wakeup(wiphy_priv(wiphy), enabled);
3413 }
3414 #endif
3415 
3416 static int ieee80211_set_qos_map(struct wiphy *wiphy,
3417 				 struct net_device *dev,
3418 				 struct cfg80211_qos_map *qos_map)
3419 {
3420 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3421 	struct mac80211_qos_map *new_qos_map, *old_qos_map;
3422 
3423 	if (qos_map) {
3424 		new_qos_map = kzalloc(sizeof(*new_qos_map), GFP_KERNEL);
3425 		if (!new_qos_map)
3426 			return -ENOMEM;
3427 		memcpy(&new_qos_map->qos_map, qos_map, sizeof(*qos_map));
3428 	} else {
3429 		/* A NULL qos_map was passed to disable QoS mapping */
3430 		new_qos_map = NULL;
3431 	}
3432 
3433 	old_qos_map = sdata_dereference(sdata->qos_map, sdata);
3434 	rcu_assign_pointer(sdata->qos_map, new_qos_map);
3435 	if (old_qos_map)
3436 		kfree_rcu(old_qos_map, rcu_head);
3437 
3438 	return 0;
3439 }
3440 
3441 static int ieee80211_set_ap_chanwidth(struct wiphy *wiphy,
3442 				      struct net_device *dev,
3443 				      struct cfg80211_chan_def *chandef)
3444 {
3445 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3446 	int ret;
3447 	u32 changed = 0;
3448 
3449 	ret = ieee80211_vif_change_bandwidth(sdata, chandef, &changed);
3450 	if (ret == 0)
3451 		ieee80211_bss_info_change_notify(sdata, changed);
3452 
3453 	return ret;
3454 }
3455 
3456 static int ieee80211_add_tx_ts(struct wiphy *wiphy, struct net_device *dev,
3457 			       u8 tsid, const u8 *peer, u8 up,
3458 			       u16 admitted_time)
3459 {
3460 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3461 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3462 	int ac = ieee802_1d_to_ac[up];
3463 
3464 	if (sdata->vif.type != NL80211_IFTYPE_STATION)
3465 		return -EOPNOTSUPP;
3466 
3467 	if (!(sdata->wmm_acm & BIT(up)))
3468 		return -EINVAL;
3469 
3470 	if (ifmgd->tx_tspec[ac].admitted_time)
3471 		return -EBUSY;
3472 
3473 	if (admitted_time) {
3474 		ifmgd->tx_tspec[ac].admitted_time = 32 * admitted_time;
3475 		ifmgd->tx_tspec[ac].tsid = tsid;
3476 		ifmgd->tx_tspec[ac].up = up;
3477 	}
3478 
3479 	return 0;
3480 }
3481 
3482 static int ieee80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev,
3483 			       u8 tsid, const u8 *peer)
3484 {
3485 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
3486 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3487 	struct ieee80211_local *local = wiphy_priv(wiphy);
3488 	int ac;
3489 
3490 	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
3491 		struct ieee80211_sta_tx_tspec *tx_tspec = &ifmgd->tx_tspec[ac];
3492 
3493 		/* skip unused entries */
3494 		if (!tx_tspec->admitted_time)
3495 			continue;
3496 
3497 		if (tx_tspec->tsid != tsid)
3498 			continue;
3499 
3500 		/* due to this new packets will be reassigned to non-ACM ACs */
3501 		tx_tspec->up = -1;
3502 
3503 		/* Make sure that all packets have been sent to avoid to
3504 		 * restore the QoS params on packets that are still on the
3505 		 * queues.
3506 		 */
3507 		synchronize_net();
3508 		ieee80211_flush_queues(local, sdata, false);
3509 
3510 		/* restore the normal QoS parameters
3511 		 * (unconditionally to avoid races)
3512 		 */
3513 		tx_tspec->action = TX_TSPEC_ACTION_STOP_DOWNGRADE;
3514 		tx_tspec->downgraded = false;
3515 		ieee80211_sta_handle_tspec_ac_params(sdata);
3516 
3517 		/* finally clear all the data */
3518 		memset(tx_tspec, 0, sizeof(*tx_tspec));
3519 
3520 		return 0;
3521 	}
3522 
3523 	return -ENOENT;
3524 }
3525 
3526 void ieee80211_nan_func_terminated(struct ieee80211_vif *vif,
3527 				   u8 inst_id,
3528 				   enum nl80211_nan_func_term_reason reason,
3529 				   gfp_t gfp)
3530 {
3531 	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3532 	struct cfg80211_nan_func *func;
3533 	u64 cookie;
3534 
3535 	if (WARN_ON(vif->type != NL80211_IFTYPE_NAN))
3536 		return;
3537 
3538 	spin_lock_bh(&sdata->u.nan.func_lock);
3539 
3540 	func = idr_find(&sdata->u.nan.function_inst_ids, inst_id);
3541 	if (WARN_ON(!func)) {
3542 		spin_unlock_bh(&sdata->u.nan.func_lock);
3543 		return;
3544 	}
3545 
3546 	cookie = func->cookie;
3547 	idr_remove(&sdata->u.nan.function_inst_ids, inst_id);
3548 
3549 	spin_unlock_bh(&sdata->u.nan.func_lock);
3550 
3551 	cfg80211_free_nan_func(func);
3552 
3553 	cfg80211_nan_func_terminated(ieee80211_vif_to_wdev(vif), inst_id,
3554 				     reason, cookie, gfp);
3555 }
3556 EXPORT_SYMBOL(ieee80211_nan_func_terminated);
3557 
3558 void ieee80211_nan_func_match(struct ieee80211_vif *vif,
3559 			      struct cfg80211_nan_match_params *match,
3560 			      gfp_t gfp)
3561 {
3562 	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3563 	struct cfg80211_nan_func *func;
3564 
3565 	if (WARN_ON(vif->type != NL80211_IFTYPE_NAN))
3566 		return;
3567 
3568 	spin_lock_bh(&sdata->u.nan.func_lock);
3569 
3570 	func = idr_find(&sdata->u.nan.function_inst_ids,  match->inst_id);
3571 	if (WARN_ON(!func)) {
3572 		spin_unlock_bh(&sdata->u.nan.func_lock);
3573 		return;
3574 	}
3575 	match->cookie = func->cookie;
3576 
3577 	spin_unlock_bh(&sdata->u.nan.func_lock);
3578 
3579 	cfg80211_nan_match(ieee80211_vif_to_wdev(vif), match, gfp);
3580 }
3581 EXPORT_SYMBOL(ieee80211_nan_func_match);
3582 
3583 const struct cfg80211_ops mac80211_config_ops = {
3584 	.add_virtual_intf = ieee80211_add_iface,
3585 	.del_virtual_intf = ieee80211_del_iface,
3586 	.change_virtual_intf = ieee80211_change_iface,
3587 	.start_p2p_device = ieee80211_start_p2p_device,
3588 	.stop_p2p_device = ieee80211_stop_p2p_device,
3589 	.add_key = ieee80211_add_key,
3590 	.del_key = ieee80211_del_key,
3591 	.get_key = ieee80211_get_key,
3592 	.set_default_key = ieee80211_config_default_key,
3593 	.set_default_mgmt_key = ieee80211_config_default_mgmt_key,
3594 	.start_ap = ieee80211_start_ap,
3595 	.change_beacon = ieee80211_change_beacon,
3596 	.stop_ap = ieee80211_stop_ap,
3597 	.add_station = ieee80211_add_station,
3598 	.del_station = ieee80211_del_station,
3599 	.change_station = ieee80211_change_station,
3600 	.get_station = ieee80211_get_station,
3601 	.dump_station = ieee80211_dump_station,
3602 	.dump_survey = ieee80211_dump_survey,
3603 #ifdef CONFIG_MAC80211_MESH
3604 	.add_mpath = ieee80211_add_mpath,
3605 	.del_mpath = ieee80211_del_mpath,
3606 	.change_mpath = ieee80211_change_mpath,
3607 	.get_mpath = ieee80211_get_mpath,
3608 	.dump_mpath = ieee80211_dump_mpath,
3609 	.get_mpp = ieee80211_get_mpp,
3610 	.dump_mpp = ieee80211_dump_mpp,
3611 	.update_mesh_config = ieee80211_update_mesh_config,
3612 	.get_mesh_config = ieee80211_get_mesh_config,
3613 	.join_mesh = ieee80211_join_mesh,
3614 	.leave_mesh = ieee80211_leave_mesh,
3615 #endif
3616 	.join_ocb = ieee80211_join_ocb,
3617 	.leave_ocb = ieee80211_leave_ocb,
3618 	.change_bss = ieee80211_change_bss,
3619 	.set_txq_params = ieee80211_set_txq_params,
3620 	.set_monitor_channel = ieee80211_set_monitor_channel,
3621 	.suspend = ieee80211_suspend,
3622 	.resume = ieee80211_resume,
3623 	.scan = ieee80211_scan,
3624 	.abort_scan = ieee80211_abort_scan,
3625 	.sched_scan_start = ieee80211_sched_scan_start,
3626 	.sched_scan_stop = ieee80211_sched_scan_stop,
3627 	.auth = ieee80211_auth,
3628 	.assoc = ieee80211_assoc,
3629 	.deauth = ieee80211_deauth,
3630 	.disassoc = ieee80211_disassoc,
3631 	.join_ibss = ieee80211_join_ibss,
3632 	.leave_ibss = ieee80211_leave_ibss,
3633 	.set_mcast_rate = ieee80211_set_mcast_rate,
3634 	.set_wiphy_params = ieee80211_set_wiphy_params,
3635 	.set_tx_power = ieee80211_set_tx_power,
3636 	.get_tx_power = ieee80211_get_tx_power,
3637 	.set_wds_peer = ieee80211_set_wds_peer,
3638 	.rfkill_poll = ieee80211_rfkill_poll,
3639 	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
3640 	CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump)
3641 	.set_power_mgmt = ieee80211_set_power_mgmt,
3642 	.set_bitrate_mask = ieee80211_set_bitrate_mask,
3643 	.remain_on_channel = ieee80211_remain_on_channel,
3644 	.cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
3645 	.mgmt_tx = ieee80211_mgmt_tx,
3646 	.mgmt_tx_cancel_wait = ieee80211_mgmt_tx_cancel_wait,
3647 	.set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
3648 	.mgmt_frame_register = ieee80211_mgmt_frame_register,
3649 	.set_antenna = ieee80211_set_antenna,
3650 	.get_antenna = ieee80211_get_antenna,
3651 	.set_rekey_data = ieee80211_set_rekey_data,
3652 	.tdls_oper = ieee80211_tdls_oper,
3653 	.tdls_mgmt = ieee80211_tdls_mgmt,
3654 	.tdls_channel_switch = ieee80211_tdls_channel_switch,
3655 	.tdls_cancel_channel_switch = ieee80211_tdls_cancel_channel_switch,
3656 	.probe_client = ieee80211_probe_client,
3657 	.set_noack_map = ieee80211_set_noack_map,
3658 #ifdef CONFIG_PM
3659 	.set_wakeup = ieee80211_set_wakeup,
3660 #endif
3661 	.get_channel = ieee80211_cfg_get_channel,
3662 	.start_radar_detection = ieee80211_start_radar_detection,
3663 	.channel_switch = ieee80211_channel_switch,
3664 	.set_qos_map = ieee80211_set_qos_map,
3665 	.set_ap_chanwidth = ieee80211_set_ap_chanwidth,
3666 	.add_tx_ts = ieee80211_add_tx_ts,
3667 	.del_tx_ts = ieee80211_del_tx_ts,
3668 	.start_nan = ieee80211_start_nan,
3669 	.stop_nan = ieee80211_stop_nan,
3670 	.nan_change_conf = ieee80211_nan_change_conf,
3671 	.add_nan_func = ieee80211_add_nan_func,
3672 	.del_nan_func = ieee80211_del_nan_func,
3673 };
3674