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