xref: /linux/net/mac80211/cfg.c (revision 5d4a2e29fba5b2bef95b96a46b338ec4d76fa4fd)
1 /*
2  * mac80211 configuration hooks for cfg80211
3  *
4  * Copyright 2006-2010	Johannes Berg <johannes@sipsolutions.net>
5  *
6  * This file is GPLv2 as found in COPYING.
7  */
8 
9 #include <linux/ieee80211.h>
10 #include <linux/nl80211.h>
11 #include <linux/rtnetlink.h>
12 #include <linux/slab.h>
13 #include <net/net_namespace.h>
14 #include <linux/rcupdate.h>
15 #include <net/cfg80211.h>
16 #include "ieee80211_i.h"
17 #include "driver-ops.h"
18 #include "cfg.h"
19 #include "rate.h"
20 #include "mesh.h"
21 
22 static bool nl80211_type_check(enum nl80211_iftype type)
23 {
24 	switch (type) {
25 	case NL80211_IFTYPE_ADHOC:
26 	case NL80211_IFTYPE_STATION:
27 	case NL80211_IFTYPE_MONITOR:
28 #ifdef CONFIG_MAC80211_MESH
29 	case NL80211_IFTYPE_MESH_POINT:
30 #endif
31 	case NL80211_IFTYPE_AP:
32 	case NL80211_IFTYPE_AP_VLAN:
33 	case NL80211_IFTYPE_WDS:
34 		return true;
35 	default:
36 		return false;
37 	}
38 }
39 
40 static bool nl80211_params_check(enum nl80211_iftype type,
41 				 struct vif_params *params)
42 {
43 	if (!nl80211_type_check(type))
44 		return false;
45 
46 	return true;
47 }
48 
49 static int ieee80211_add_iface(struct wiphy *wiphy, char *name,
50 			       enum nl80211_iftype type, u32 *flags,
51 			       struct vif_params *params)
52 {
53 	struct ieee80211_local *local = wiphy_priv(wiphy);
54 	struct net_device *dev;
55 	struct ieee80211_sub_if_data *sdata;
56 	int err;
57 
58 	if (!nl80211_params_check(type, params))
59 		return -EINVAL;
60 
61 	err = ieee80211_if_add(local, name, &dev, type, params);
62 	if (err || type != NL80211_IFTYPE_MONITOR || !flags)
63 		return err;
64 
65 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
66 	sdata->u.mntr_flags = *flags;
67 	return 0;
68 }
69 
70 static int ieee80211_del_iface(struct wiphy *wiphy, struct net_device *dev)
71 {
72 	ieee80211_if_remove(IEEE80211_DEV_TO_SUB_IF(dev));
73 
74 	return 0;
75 }
76 
77 static int ieee80211_change_iface(struct wiphy *wiphy,
78 				  struct net_device *dev,
79 				  enum nl80211_iftype type, u32 *flags,
80 				  struct vif_params *params)
81 {
82 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
83 	int ret;
84 
85 	if (ieee80211_sdata_running(sdata))
86 		return -EBUSY;
87 
88 	if (!nl80211_params_check(type, params))
89 		return -EINVAL;
90 
91 	ret = ieee80211_if_change_type(sdata, type);
92 	if (ret)
93 		return ret;
94 
95 	if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
96 		ieee80211_sdata_set_mesh_id(sdata,
97 					    params->mesh_id_len,
98 					    params->mesh_id);
99 
100 	if (type == NL80211_IFTYPE_AP_VLAN &&
101 	    params && params->use_4addr == 0)
102 		rcu_assign_pointer(sdata->u.vlan.sta, NULL);
103 	else if (type == NL80211_IFTYPE_STATION &&
104 		 params && params->use_4addr >= 0)
105 		sdata->u.mgd.use_4addr = params->use_4addr;
106 
107 	if (sdata->vif.type == NL80211_IFTYPE_MONITOR && flags)
108 		sdata->u.mntr_flags = *flags;
109 
110 	return 0;
111 }
112 
113 static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
114 			     u8 key_idx, const u8 *mac_addr,
115 			     struct key_params *params)
116 {
117 	struct ieee80211_sub_if_data *sdata;
118 	struct sta_info *sta = NULL;
119 	enum ieee80211_key_alg alg;
120 	struct ieee80211_key *key;
121 	int err;
122 
123 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
124 
125 	switch (params->cipher) {
126 	case WLAN_CIPHER_SUITE_WEP40:
127 	case WLAN_CIPHER_SUITE_WEP104:
128 		alg = ALG_WEP;
129 		break;
130 	case WLAN_CIPHER_SUITE_TKIP:
131 		alg = ALG_TKIP;
132 		break;
133 	case WLAN_CIPHER_SUITE_CCMP:
134 		alg = ALG_CCMP;
135 		break;
136 	case WLAN_CIPHER_SUITE_AES_CMAC:
137 		alg = ALG_AES_CMAC;
138 		break;
139 	default:
140 		return -EINVAL;
141 	}
142 
143 	key = ieee80211_key_alloc(alg, key_idx, params->key_len, params->key,
144 				  params->seq_len, params->seq);
145 	if (!key)
146 		return -ENOMEM;
147 
148 	rcu_read_lock();
149 
150 	if (mac_addr) {
151 		sta = sta_info_get_bss(sdata, mac_addr);
152 		if (!sta) {
153 			ieee80211_key_free(key);
154 			err = -ENOENT;
155 			goto out_unlock;
156 		}
157 	}
158 
159 	ieee80211_key_link(key, sdata, sta);
160 
161 	err = 0;
162  out_unlock:
163 	rcu_read_unlock();
164 
165 	return err;
166 }
167 
168 static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
169 			     u8 key_idx, const u8 *mac_addr)
170 {
171 	struct ieee80211_sub_if_data *sdata;
172 	struct sta_info *sta;
173 	int ret;
174 
175 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
176 
177 	rcu_read_lock();
178 
179 	if (mac_addr) {
180 		ret = -ENOENT;
181 
182 		sta = sta_info_get_bss(sdata, mac_addr);
183 		if (!sta)
184 			goto out_unlock;
185 
186 		if (sta->key) {
187 			ieee80211_key_free(sta->key);
188 			WARN_ON(sta->key);
189 			ret = 0;
190 		}
191 
192 		goto out_unlock;
193 	}
194 
195 	if (!sdata->keys[key_idx]) {
196 		ret = -ENOENT;
197 		goto out_unlock;
198 	}
199 
200 	ieee80211_key_free(sdata->keys[key_idx]);
201 	WARN_ON(sdata->keys[key_idx]);
202 
203 	ret = 0;
204  out_unlock:
205 	rcu_read_unlock();
206 
207 	return ret;
208 }
209 
210 static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
211 			     u8 key_idx, const u8 *mac_addr, void *cookie,
212 			     void (*callback)(void *cookie,
213 					      struct key_params *params))
214 {
215 	struct ieee80211_sub_if_data *sdata;
216 	struct sta_info *sta = NULL;
217 	u8 seq[6] = {0};
218 	struct key_params params;
219 	struct ieee80211_key *key;
220 	u32 iv32;
221 	u16 iv16;
222 	int err = -ENOENT;
223 
224 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
225 
226 	rcu_read_lock();
227 
228 	if (mac_addr) {
229 		sta = sta_info_get_bss(sdata, mac_addr);
230 		if (!sta)
231 			goto out;
232 
233 		key = sta->key;
234 	} else
235 		key = sdata->keys[key_idx];
236 
237 	if (!key)
238 		goto out;
239 
240 	memset(&params, 0, sizeof(params));
241 
242 	switch (key->conf.alg) {
243 	case ALG_TKIP:
244 		params.cipher = WLAN_CIPHER_SUITE_TKIP;
245 
246 		iv32 = key->u.tkip.tx.iv32;
247 		iv16 = key->u.tkip.tx.iv16;
248 
249 		if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
250 			drv_get_tkip_seq(sdata->local,
251 					 key->conf.hw_key_idx,
252 					 &iv32, &iv16);
253 
254 		seq[0] = iv16 & 0xff;
255 		seq[1] = (iv16 >> 8) & 0xff;
256 		seq[2] = iv32 & 0xff;
257 		seq[3] = (iv32 >> 8) & 0xff;
258 		seq[4] = (iv32 >> 16) & 0xff;
259 		seq[5] = (iv32 >> 24) & 0xff;
260 		params.seq = seq;
261 		params.seq_len = 6;
262 		break;
263 	case ALG_CCMP:
264 		params.cipher = WLAN_CIPHER_SUITE_CCMP;
265 		seq[0] = key->u.ccmp.tx_pn[5];
266 		seq[1] = key->u.ccmp.tx_pn[4];
267 		seq[2] = key->u.ccmp.tx_pn[3];
268 		seq[3] = key->u.ccmp.tx_pn[2];
269 		seq[4] = key->u.ccmp.tx_pn[1];
270 		seq[5] = key->u.ccmp.tx_pn[0];
271 		params.seq = seq;
272 		params.seq_len = 6;
273 		break;
274 	case ALG_WEP:
275 		if (key->conf.keylen == 5)
276 			params.cipher = WLAN_CIPHER_SUITE_WEP40;
277 		else
278 			params.cipher = WLAN_CIPHER_SUITE_WEP104;
279 		break;
280 	case ALG_AES_CMAC:
281 		params.cipher = WLAN_CIPHER_SUITE_AES_CMAC;
282 		seq[0] = key->u.aes_cmac.tx_pn[5];
283 		seq[1] = key->u.aes_cmac.tx_pn[4];
284 		seq[2] = key->u.aes_cmac.tx_pn[3];
285 		seq[3] = key->u.aes_cmac.tx_pn[2];
286 		seq[4] = key->u.aes_cmac.tx_pn[1];
287 		seq[5] = key->u.aes_cmac.tx_pn[0];
288 		params.seq = seq;
289 		params.seq_len = 6;
290 		break;
291 	}
292 
293 	params.key = key->conf.key;
294 	params.key_len = key->conf.keylen;
295 
296 	callback(cookie, &params);
297 	err = 0;
298 
299  out:
300 	rcu_read_unlock();
301 	return err;
302 }
303 
304 static int ieee80211_config_default_key(struct wiphy *wiphy,
305 					struct net_device *dev,
306 					u8 key_idx)
307 {
308 	struct ieee80211_sub_if_data *sdata;
309 
310 	rcu_read_lock();
311 
312 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
313 	ieee80211_set_default_key(sdata, key_idx);
314 
315 	rcu_read_unlock();
316 
317 	return 0;
318 }
319 
320 static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
321 					     struct net_device *dev,
322 					     u8 key_idx)
323 {
324 	struct ieee80211_sub_if_data *sdata;
325 
326 	rcu_read_lock();
327 
328 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
329 	ieee80211_set_default_mgmt_key(sdata, key_idx);
330 
331 	rcu_read_unlock();
332 
333 	return 0;
334 }
335 
336 static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
337 {
338 	struct ieee80211_sub_if_data *sdata = sta->sdata;
339 
340 	sinfo->generation = sdata->local->sta_generation;
341 
342 	sinfo->filled = STATION_INFO_INACTIVE_TIME |
343 			STATION_INFO_RX_BYTES |
344 			STATION_INFO_TX_BYTES |
345 			STATION_INFO_RX_PACKETS |
346 			STATION_INFO_TX_PACKETS |
347 			STATION_INFO_TX_BITRATE;
348 
349 	sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx);
350 	sinfo->rx_bytes = sta->rx_bytes;
351 	sinfo->tx_bytes = sta->tx_bytes;
352 	sinfo->rx_packets = sta->rx_packets;
353 	sinfo->tx_packets = sta->tx_packets;
354 
355 	if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
356 	    (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
357 		sinfo->filled |= STATION_INFO_SIGNAL;
358 		sinfo->signal = (s8)sta->last_signal;
359 	}
360 
361 	sinfo->txrate.flags = 0;
362 	if (sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS)
363 		sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
364 	if (sta->last_tx_rate.flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
365 		sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
366 	if (sta->last_tx_rate.flags & IEEE80211_TX_RC_SHORT_GI)
367 		sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
368 
369 	if (!(sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS)) {
370 		struct ieee80211_supported_band *sband;
371 		sband = sta->local->hw.wiphy->bands[
372 				sta->local->hw.conf.channel->band];
373 		sinfo->txrate.legacy =
374 			sband->bitrates[sta->last_tx_rate.idx].bitrate;
375 	} else
376 		sinfo->txrate.mcs = sta->last_tx_rate.idx;
377 
378 	if (ieee80211_vif_is_mesh(&sdata->vif)) {
379 #ifdef CONFIG_MAC80211_MESH
380 		sinfo->filled |= STATION_INFO_LLID |
381 				 STATION_INFO_PLID |
382 				 STATION_INFO_PLINK_STATE;
383 
384 		sinfo->llid = le16_to_cpu(sta->llid);
385 		sinfo->plid = le16_to_cpu(sta->plid);
386 		sinfo->plink_state = sta->plink_state;
387 #endif
388 	}
389 }
390 
391 
392 static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
393 				 int idx, u8 *mac, struct station_info *sinfo)
394 {
395 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
396 	struct sta_info *sta;
397 	int ret = -ENOENT;
398 
399 	rcu_read_lock();
400 
401 	sta = sta_info_get_by_idx(sdata, idx);
402 	if (sta) {
403 		ret = 0;
404 		memcpy(mac, sta->sta.addr, ETH_ALEN);
405 		sta_set_sinfo(sta, sinfo);
406 	}
407 
408 	rcu_read_unlock();
409 
410 	return ret;
411 }
412 
413 static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
414 				 int idx, struct survey_info *survey)
415 {
416 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
417 
418 	if (!local->ops->get_survey)
419 		return -EOPNOTSUPP;
420 
421 	return drv_get_survey(local, idx, survey);
422 }
423 
424 static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
425 				 u8 *mac, struct station_info *sinfo)
426 {
427 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
428 	struct sta_info *sta;
429 	int ret = -ENOENT;
430 
431 	rcu_read_lock();
432 
433 	sta = sta_info_get_bss(sdata, mac);
434 	if (sta) {
435 		ret = 0;
436 		sta_set_sinfo(sta, sinfo);
437 	}
438 
439 	rcu_read_unlock();
440 
441 	return ret;
442 }
443 
444 /*
445  * This handles both adding a beacon and setting new beacon info
446  */
447 static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
448 				   struct beacon_parameters *params)
449 {
450 	struct beacon_data *new, *old;
451 	int new_head_len, new_tail_len;
452 	int size;
453 	int err = -EINVAL;
454 
455 	old = sdata->u.ap.beacon;
456 
457 	/* head must not be zero-length */
458 	if (params->head && !params->head_len)
459 		return -EINVAL;
460 
461 	/*
462 	 * This is a kludge. beacon interval should really be part
463 	 * of the beacon information.
464 	 */
465 	if (params->interval &&
466 	    (sdata->vif.bss_conf.beacon_int != params->interval)) {
467 		sdata->vif.bss_conf.beacon_int = params->interval;
468 		ieee80211_bss_info_change_notify(sdata,
469 						 BSS_CHANGED_BEACON_INT);
470 	}
471 
472 	/* Need to have a beacon head if we don't have one yet */
473 	if (!params->head && !old)
474 		return err;
475 
476 	/* sorry, no way to start beaconing without dtim period */
477 	if (!params->dtim_period && !old)
478 		return err;
479 
480 	/* new or old head? */
481 	if (params->head)
482 		new_head_len = params->head_len;
483 	else
484 		new_head_len = old->head_len;
485 
486 	/* new or old tail? */
487 	if (params->tail || !old)
488 		/* params->tail_len will be zero for !params->tail */
489 		new_tail_len = params->tail_len;
490 	else
491 		new_tail_len = old->tail_len;
492 
493 	size = sizeof(*new) + new_head_len + new_tail_len;
494 
495 	new = kzalloc(size, GFP_KERNEL);
496 	if (!new)
497 		return -ENOMEM;
498 
499 	/* start filling the new info now */
500 
501 	/* new or old dtim period? */
502 	if (params->dtim_period)
503 		new->dtim_period = params->dtim_period;
504 	else
505 		new->dtim_period = old->dtim_period;
506 
507 	/*
508 	 * pointers go into the block we allocated,
509 	 * memory is | beacon_data | head | tail |
510 	 */
511 	new->head = ((u8 *) new) + sizeof(*new);
512 	new->tail = new->head + new_head_len;
513 	new->head_len = new_head_len;
514 	new->tail_len = new_tail_len;
515 
516 	/* copy in head */
517 	if (params->head)
518 		memcpy(new->head, params->head, new_head_len);
519 	else
520 		memcpy(new->head, old->head, new_head_len);
521 
522 	/* copy in optional tail */
523 	if (params->tail)
524 		memcpy(new->tail, params->tail, new_tail_len);
525 	else
526 		if (old)
527 			memcpy(new->tail, old->tail, new_tail_len);
528 
529 	sdata->vif.bss_conf.dtim_period = new->dtim_period;
530 
531 	rcu_assign_pointer(sdata->u.ap.beacon, new);
532 
533 	synchronize_rcu();
534 
535 	kfree(old);
536 
537 	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
538 						BSS_CHANGED_BEACON);
539 	return 0;
540 }
541 
542 static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
543 				struct beacon_parameters *params)
544 {
545 	struct ieee80211_sub_if_data *sdata;
546 	struct beacon_data *old;
547 
548 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
549 
550 	old = sdata->u.ap.beacon;
551 
552 	if (old)
553 		return -EALREADY;
554 
555 	return ieee80211_config_beacon(sdata, params);
556 }
557 
558 static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
559 				struct beacon_parameters *params)
560 {
561 	struct ieee80211_sub_if_data *sdata;
562 	struct beacon_data *old;
563 
564 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
565 
566 	old = sdata->u.ap.beacon;
567 
568 	if (!old)
569 		return -ENOENT;
570 
571 	return ieee80211_config_beacon(sdata, params);
572 }
573 
574 static int ieee80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
575 {
576 	struct ieee80211_sub_if_data *sdata;
577 	struct beacon_data *old;
578 
579 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
580 
581 	old = sdata->u.ap.beacon;
582 
583 	if (!old)
584 		return -ENOENT;
585 
586 	rcu_assign_pointer(sdata->u.ap.beacon, NULL);
587 	synchronize_rcu();
588 	kfree(old);
589 
590 	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
591 	return 0;
592 }
593 
594 /* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
595 struct iapp_layer2_update {
596 	u8 da[ETH_ALEN];	/* broadcast */
597 	u8 sa[ETH_ALEN];	/* STA addr */
598 	__be16 len;		/* 6 */
599 	u8 dsap;		/* 0 */
600 	u8 ssap;		/* 0 */
601 	u8 control;
602 	u8 xid_info[3];
603 } __attribute__ ((packed));
604 
605 static void ieee80211_send_layer2_update(struct sta_info *sta)
606 {
607 	struct iapp_layer2_update *msg;
608 	struct sk_buff *skb;
609 
610 	/* Send Level 2 Update Frame to update forwarding tables in layer 2
611 	 * bridge devices */
612 
613 	skb = dev_alloc_skb(sizeof(*msg));
614 	if (!skb)
615 		return;
616 	msg = (struct iapp_layer2_update *)skb_put(skb, sizeof(*msg));
617 
618 	/* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
619 	 * Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
620 
621 	memset(msg->da, 0xff, ETH_ALEN);
622 	memcpy(msg->sa, sta->sta.addr, ETH_ALEN);
623 	msg->len = htons(6);
624 	msg->dsap = 0;
625 	msg->ssap = 0x01;	/* NULL LSAP, CR Bit: Response */
626 	msg->control = 0xaf;	/* XID response lsb.1111F101.
627 				 * F=0 (no poll command; unsolicited frame) */
628 	msg->xid_info[0] = 0x81;	/* XID format identifier */
629 	msg->xid_info[1] = 1;	/* LLC types/classes: Type 1 LLC */
630 	msg->xid_info[2] = 0;	/* XID sender's receive window size (RW) */
631 
632 	skb->dev = sta->sdata->dev;
633 	skb->protocol = eth_type_trans(skb, sta->sdata->dev);
634 	memset(skb->cb, 0, sizeof(skb->cb));
635 	netif_rx(skb);
636 }
637 
638 static void sta_apply_parameters(struct ieee80211_local *local,
639 				 struct sta_info *sta,
640 				 struct station_parameters *params)
641 {
642 	u32 rates;
643 	int i, j;
644 	struct ieee80211_supported_band *sband;
645 	struct ieee80211_sub_if_data *sdata = sta->sdata;
646 	u32 mask, set;
647 
648 	sband = local->hw.wiphy->bands[local->oper_channel->band];
649 
650 	spin_lock_bh(&sta->lock);
651 	mask = params->sta_flags_mask;
652 	set = params->sta_flags_set;
653 
654 	if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
655 		sta->flags &= ~WLAN_STA_AUTHORIZED;
656 		if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
657 			sta->flags |= WLAN_STA_AUTHORIZED;
658 	}
659 
660 	if (mask & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE)) {
661 		sta->flags &= ~WLAN_STA_SHORT_PREAMBLE;
662 		if (set & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE))
663 			sta->flags |= WLAN_STA_SHORT_PREAMBLE;
664 	}
665 
666 	if (mask & BIT(NL80211_STA_FLAG_WME)) {
667 		sta->flags &= ~WLAN_STA_WME;
668 		if (set & BIT(NL80211_STA_FLAG_WME))
669 			sta->flags |= WLAN_STA_WME;
670 	}
671 
672 	if (mask & BIT(NL80211_STA_FLAG_MFP)) {
673 		sta->flags &= ~WLAN_STA_MFP;
674 		if (set & BIT(NL80211_STA_FLAG_MFP))
675 			sta->flags |= WLAN_STA_MFP;
676 	}
677 	spin_unlock_bh(&sta->lock);
678 
679 	/*
680 	 * cfg80211 validates this (1-2007) and allows setting the AID
681 	 * only when creating a new station entry
682 	 */
683 	if (params->aid)
684 		sta->sta.aid = params->aid;
685 
686 	/*
687 	 * FIXME: updating the following information is racy when this
688 	 *	  function is called from ieee80211_change_station().
689 	 *	  However, all this information should be static so
690 	 *	  maybe we should just reject attemps to change it.
691 	 */
692 
693 	if (params->listen_interval >= 0)
694 		sta->listen_interval = params->listen_interval;
695 
696 	if (params->supported_rates) {
697 		rates = 0;
698 
699 		for (i = 0; i < params->supported_rates_len; i++) {
700 			int rate = (params->supported_rates[i] & 0x7f) * 5;
701 			for (j = 0; j < sband->n_bitrates; j++) {
702 				if (sband->bitrates[j].bitrate == rate)
703 					rates |= BIT(j);
704 			}
705 		}
706 		sta->sta.supp_rates[local->oper_channel->band] = rates;
707 	}
708 
709 	if (params->ht_capa)
710 		ieee80211_ht_cap_ie_to_sta_ht_cap(sband,
711 						  params->ht_capa,
712 						  &sta->sta.ht_cap);
713 
714 	if (ieee80211_vif_is_mesh(&sdata->vif) && params->plink_action) {
715 		switch (params->plink_action) {
716 		case PLINK_ACTION_OPEN:
717 			mesh_plink_open(sta);
718 			break;
719 		case PLINK_ACTION_BLOCK:
720 			mesh_plink_block(sta);
721 			break;
722 		}
723 	}
724 }
725 
726 static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
727 				 u8 *mac, struct station_parameters *params)
728 {
729 	struct ieee80211_local *local = wiphy_priv(wiphy);
730 	struct sta_info *sta;
731 	struct ieee80211_sub_if_data *sdata;
732 	int err;
733 	int layer2_update;
734 
735 	if (params->vlan) {
736 		sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
737 
738 		if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
739 		    sdata->vif.type != NL80211_IFTYPE_AP)
740 			return -EINVAL;
741 	} else
742 		sdata = IEEE80211_DEV_TO_SUB_IF(dev);
743 
744 	if (compare_ether_addr(mac, sdata->vif.addr) == 0)
745 		return -EINVAL;
746 
747 	if (is_multicast_ether_addr(mac))
748 		return -EINVAL;
749 
750 	sta = sta_info_alloc(sdata, mac, GFP_KERNEL);
751 	if (!sta)
752 		return -ENOMEM;
753 
754 	sta->flags = WLAN_STA_AUTH | WLAN_STA_ASSOC;
755 
756 	sta_apply_parameters(local, sta, params);
757 
758 	rate_control_rate_init(sta);
759 
760 	layer2_update = sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
761 		sdata->vif.type == NL80211_IFTYPE_AP;
762 
763 	err = sta_info_insert_rcu(sta);
764 	if (err) {
765 		rcu_read_unlock();
766 		return err;
767 	}
768 
769 	if (layer2_update)
770 		ieee80211_send_layer2_update(sta);
771 
772 	rcu_read_unlock();
773 
774 	return 0;
775 }
776 
777 static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
778 				 u8 *mac)
779 {
780 	struct ieee80211_local *local = wiphy_priv(wiphy);
781 	struct ieee80211_sub_if_data *sdata;
782 
783 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
784 
785 	if (mac)
786 		return sta_info_destroy_addr_bss(sdata, mac);
787 
788 	sta_info_flush(local, sdata);
789 	return 0;
790 }
791 
792 static int ieee80211_change_station(struct wiphy *wiphy,
793 				    struct net_device *dev,
794 				    u8 *mac,
795 				    struct station_parameters *params)
796 {
797 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
798 	struct ieee80211_local *local = wiphy_priv(wiphy);
799 	struct sta_info *sta;
800 	struct ieee80211_sub_if_data *vlansdata;
801 
802 	rcu_read_lock();
803 
804 	sta = sta_info_get_bss(sdata, mac);
805 	if (!sta) {
806 		rcu_read_unlock();
807 		return -ENOENT;
808 	}
809 
810 	if (params->vlan && params->vlan != sta->sdata->dev) {
811 		vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
812 
813 		if (vlansdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
814 		    vlansdata->vif.type != NL80211_IFTYPE_AP) {
815 			rcu_read_unlock();
816 			return -EINVAL;
817 		}
818 
819 		if (params->vlan->ieee80211_ptr->use_4addr) {
820 			if (vlansdata->u.vlan.sta) {
821 				rcu_read_unlock();
822 				return -EBUSY;
823 			}
824 
825 			rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
826 		}
827 
828 		sta->sdata = vlansdata;
829 		ieee80211_send_layer2_update(sta);
830 	}
831 
832 	sta_apply_parameters(local, sta, params);
833 
834 	rcu_read_unlock();
835 
836 	return 0;
837 }
838 
839 #ifdef CONFIG_MAC80211_MESH
840 static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
841 				 u8 *dst, u8 *next_hop)
842 {
843 	struct ieee80211_sub_if_data *sdata;
844 	struct mesh_path *mpath;
845 	struct sta_info *sta;
846 	int err;
847 
848 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
849 
850 	rcu_read_lock();
851 	sta = sta_info_get(sdata, next_hop);
852 	if (!sta) {
853 		rcu_read_unlock();
854 		return -ENOENT;
855 	}
856 
857 	err = mesh_path_add(dst, sdata);
858 	if (err) {
859 		rcu_read_unlock();
860 		return err;
861 	}
862 
863 	mpath = mesh_path_lookup(dst, sdata);
864 	if (!mpath) {
865 		rcu_read_unlock();
866 		return -ENXIO;
867 	}
868 	mesh_path_fix_nexthop(mpath, sta);
869 
870 	rcu_read_unlock();
871 	return 0;
872 }
873 
874 static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev,
875 				 u8 *dst)
876 {
877 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
878 
879 	if (dst)
880 		return mesh_path_del(dst, sdata);
881 
882 	mesh_path_flush(sdata);
883 	return 0;
884 }
885 
886 static int ieee80211_change_mpath(struct wiphy *wiphy,
887 				    struct net_device *dev,
888 				    u8 *dst, u8 *next_hop)
889 {
890 	struct ieee80211_sub_if_data *sdata;
891 	struct mesh_path *mpath;
892 	struct sta_info *sta;
893 
894 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
895 
896 	rcu_read_lock();
897 
898 	sta = sta_info_get(sdata, next_hop);
899 	if (!sta) {
900 		rcu_read_unlock();
901 		return -ENOENT;
902 	}
903 
904 	mpath = mesh_path_lookup(dst, sdata);
905 	if (!mpath) {
906 		rcu_read_unlock();
907 		return -ENOENT;
908 	}
909 
910 	mesh_path_fix_nexthop(mpath, sta);
911 
912 	rcu_read_unlock();
913 	return 0;
914 }
915 
916 static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
917 			    struct mpath_info *pinfo)
918 {
919 	if (mpath->next_hop)
920 		memcpy(next_hop, mpath->next_hop->sta.addr, ETH_ALEN);
921 	else
922 		memset(next_hop, 0, ETH_ALEN);
923 
924 	pinfo->generation = mesh_paths_generation;
925 
926 	pinfo->filled = MPATH_INFO_FRAME_QLEN |
927 			MPATH_INFO_SN |
928 			MPATH_INFO_METRIC |
929 			MPATH_INFO_EXPTIME |
930 			MPATH_INFO_DISCOVERY_TIMEOUT |
931 			MPATH_INFO_DISCOVERY_RETRIES |
932 			MPATH_INFO_FLAGS;
933 
934 	pinfo->frame_qlen = mpath->frame_queue.qlen;
935 	pinfo->sn = mpath->sn;
936 	pinfo->metric = mpath->metric;
937 	if (time_before(jiffies, mpath->exp_time))
938 		pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies);
939 	pinfo->discovery_timeout =
940 			jiffies_to_msecs(mpath->discovery_timeout);
941 	pinfo->discovery_retries = mpath->discovery_retries;
942 	pinfo->flags = 0;
943 	if (mpath->flags & MESH_PATH_ACTIVE)
944 		pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE;
945 	if (mpath->flags & MESH_PATH_RESOLVING)
946 		pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
947 	if (mpath->flags & MESH_PATH_SN_VALID)
948 		pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID;
949 	if (mpath->flags & MESH_PATH_FIXED)
950 		pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
951 	if (mpath->flags & MESH_PATH_RESOLVING)
952 		pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
953 
954 	pinfo->flags = mpath->flags;
955 }
956 
957 static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
958 			       u8 *dst, u8 *next_hop, struct mpath_info *pinfo)
959 
960 {
961 	struct ieee80211_sub_if_data *sdata;
962 	struct mesh_path *mpath;
963 
964 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
965 
966 	rcu_read_lock();
967 	mpath = mesh_path_lookup(dst, sdata);
968 	if (!mpath) {
969 		rcu_read_unlock();
970 		return -ENOENT;
971 	}
972 	memcpy(dst, mpath->dst, ETH_ALEN);
973 	mpath_set_pinfo(mpath, next_hop, pinfo);
974 	rcu_read_unlock();
975 	return 0;
976 }
977 
978 static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
979 				 int idx, u8 *dst, u8 *next_hop,
980 				 struct mpath_info *pinfo)
981 {
982 	struct ieee80211_sub_if_data *sdata;
983 	struct mesh_path *mpath;
984 
985 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
986 
987 	rcu_read_lock();
988 	mpath = mesh_path_lookup_by_idx(idx, sdata);
989 	if (!mpath) {
990 		rcu_read_unlock();
991 		return -ENOENT;
992 	}
993 	memcpy(dst, mpath->dst, ETH_ALEN);
994 	mpath_set_pinfo(mpath, next_hop, pinfo);
995 	rcu_read_unlock();
996 	return 0;
997 }
998 
999 static int ieee80211_get_mesh_params(struct wiphy *wiphy,
1000 				struct net_device *dev,
1001 				struct mesh_config *conf)
1002 {
1003 	struct ieee80211_sub_if_data *sdata;
1004 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1005 
1006 	memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config));
1007 	return 0;
1008 }
1009 
1010 static inline bool _chg_mesh_attr(enum nl80211_meshconf_params parm, u32 mask)
1011 {
1012 	return (mask >> (parm-1)) & 0x1;
1013 }
1014 
1015 static int ieee80211_set_mesh_params(struct wiphy *wiphy,
1016 				struct net_device *dev,
1017 				const struct mesh_config *nconf, u32 mask)
1018 {
1019 	struct mesh_config *conf;
1020 	struct ieee80211_sub_if_data *sdata;
1021 	struct ieee80211_if_mesh *ifmsh;
1022 
1023 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1024 	ifmsh = &sdata->u.mesh;
1025 
1026 	/* Set the config options which we are interested in setting */
1027 	conf = &(sdata->u.mesh.mshcfg);
1028 	if (_chg_mesh_attr(NL80211_MESHCONF_RETRY_TIMEOUT, mask))
1029 		conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout;
1030 	if (_chg_mesh_attr(NL80211_MESHCONF_CONFIRM_TIMEOUT, mask))
1031 		conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout;
1032 	if (_chg_mesh_attr(NL80211_MESHCONF_HOLDING_TIMEOUT, mask))
1033 		conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout;
1034 	if (_chg_mesh_attr(NL80211_MESHCONF_MAX_PEER_LINKS, mask))
1035 		conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks;
1036 	if (_chg_mesh_attr(NL80211_MESHCONF_MAX_RETRIES, mask))
1037 		conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries;
1038 	if (_chg_mesh_attr(NL80211_MESHCONF_TTL, mask))
1039 		conf->dot11MeshTTL = nconf->dot11MeshTTL;
1040 	if (_chg_mesh_attr(NL80211_MESHCONF_AUTO_OPEN_PLINKS, mask))
1041 		conf->auto_open_plinks = nconf->auto_open_plinks;
1042 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, mask))
1043 		conf->dot11MeshHWMPmaxPREQretries =
1044 			nconf->dot11MeshHWMPmaxPREQretries;
1045 	if (_chg_mesh_attr(NL80211_MESHCONF_PATH_REFRESH_TIME, mask))
1046 		conf->path_refresh_time = nconf->path_refresh_time;
1047 	if (_chg_mesh_attr(NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, mask))
1048 		conf->min_discovery_timeout = nconf->min_discovery_timeout;
1049 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, mask))
1050 		conf->dot11MeshHWMPactivePathTimeout =
1051 			nconf->dot11MeshHWMPactivePathTimeout;
1052 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask))
1053 		conf->dot11MeshHWMPpreqMinInterval =
1054 			nconf->dot11MeshHWMPpreqMinInterval;
1055 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
1056 			   mask))
1057 		conf->dot11MeshHWMPnetDiameterTraversalTime =
1058 			nconf->dot11MeshHWMPnetDiameterTraversalTime;
1059 	if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) {
1060 		conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode;
1061 		ieee80211_mesh_root_setup(ifmsh);
1062 	}
1063 	return 0;
1064 }
1065 
1066 #endif
1067 
1068 static int ieee80211_change_bss(struct wiphy *wiphy,
1069 				struct net_device *dev,
1070 				struct bss_parameters *params)
1071 {
1072 	struct ieee80211_sub_if_data *sdata;
1073 	u32 changed = 0;
1074 
1075 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1076 
1077 	if (params->use_cts_prot >= 0) {
1078 		sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
1079 		changed |= BSS_CHANGED_ERP_CTS_PROT;
1080 	}
1081 	if (params->use_short_preamble >= 0) {
1082 		sdata->vif.bss_conf.use_short_preamble =
1083 			params->use_short_preamble;
1084 		changed |= BSS_CHANGED_ERP_PREAMBLE;
1085 	}
1086 
1087 	if (!sdata->vif.bss_conf.use_short_slot &&
1088 	    sdata->local->hw.conf.channel->band == IEEE80211_BAND_5GHZ) {
1089 		sdata->vif.bss_conf.use_short_slot = true;
1090 		changed |= BSS_CHANGED_ERP_SLOT;
1091 	}
1092 
1093 	if (params->use_short_slot_time >= 0) {
1094 		sdata->vif.bss_conf.use_short_slot =
1095 			params->use_short_slot_time;
1096 		changed |= BSS_CHANGED_ERP_SLOT;
1097 	}
1098 
1099 	if (params->basic_rates) {
1100 		int i, j;
1101 		u32 rates = 0;
1102 		struct ieee80211_local *local = wiphy_priv(wiphy);
1103 		struct ieee80211_supported_band *sband =
1104 			wiphy->bands[local->oper_channel->band];
1105 
1106 		for (i = 0; i < params->basic_rates_len; i++) {
1107 			int rate = (params->basic_rates[i] & 0x7f) * 5;
1108 			for (j = 0; j < sband->n_bitrates; j++) {
1109 				if (sband->bitrates[j].bitrate == rate)
1110 					rates |= BIT(j);
1111 			}
1112 		}
1113 		sdata->vif.bss_conf.basic_rates = rates;
1114 		changed |= BSS_CHANGED_BASIC_RATES;
1115 	}
1116 
1117 	if (params->ap_isolate >= 0) {
1118 		if (params->ap_isolate)
1119 			sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
1120 		else
1121 			sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
1122 	}
1123 
1124 	ieee80211_bss_info_change_notify(sdata, changed);
1125 
1126 	return 0;
1127 }
1128 
1129 static int ieee80211_set_txq_params(struct wiphy *wiphy,
1130 				    struct ieee80211_txq_params *params)
1131 {
1132 	struct ieee80211_local *local = wiphy_priv(wiphy);
1133 	struct ieee80211_tx_queue_params p;
1134 
1135 	if (!local->ops->conf_tx)
1136 		return -EOPNOTSUPP;
1137 
1138 	memset(&p, 0, sizeof(p));
1139 	p.aifs = params->aifs;
1140 	p.cw_max = params->cwmax;
1141 	p.cw_min = params->cwmin;
1142 	p.txop = params->txop;
1143 
1144 	/*
1145 	 * Setting tx queue params disables u-apsd because it's only
1146 	 * called in master mode.
1147 	 */
1148 	p.uapsd = false;
1149 
1150 	if (drv_conf_tx(local, params->queue, &p)) {
1151 		printk(KERN_DEBUG "%s: failed to set TX queue "
1152 		       "parameters for queue %d\n",
1153 		       wiphy_name(local->hw.wiphy), params->queue);
1154 		return -EINVAL;
1155 	}
1156 
1157 	/* enable WMM or activate new settings */
1158 	local->hw.conf.flags |= IEEE80211_CONF_QOS;
1159 	drv_config(local, IEEE80211_CONF_CHANGE_QOS);
1160 
1161 	return 0;
1162 }
1163 
1164 static int ieee80211_set_channel(struct wiphy *wiphy,
1165 				 struct net_device *netdev,
1166 				 struct ieee80211_channel *chan,
1167 				 enum nl80211_channel_type channel_type)
1168 {
1169 	struct ieee80211_local *local = wiphy_priv(wiphy);
1170 	struct ieee80211_sub_if_data *sdata = NULL;
1171 
1172 	if (netdev)
1173 		sdata = IEEE80211_DEV_TO_SUB_IF(netdev);
1174 
1175 	switch (ieee80211_get_channel_mode(local, NULL)) {
1176 	case CHAN_MODE_HOPPING:
1177 		return -EBUSY;
1178 	case CHAN_MODE_FIXED:
1179 		if (local->oper_channel != chan)
1180 			return -EBUSY;
1181 		if (!sdata && local->_oper_channel_type == channel_type)
1182 			return 0;
1183 		break;
1184 	case CHAN_MODE_UNDEFINED:
1185 		break;
1186 	}
1187 
1188 	local->oper_channel = chan;
1189 
1190 	if (!ieee80211_set_channel_type(local, sdata, channel_type))
1191 		return -EBUSY;
1192 
1193 	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
1194 	if (sdata && sdata->vif.type != NL80211_IFTYPE_MONITOR)
1195 		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT);
1196 
1197 	return 0;
1198 }
1199 
1200 #ifdef CONFIG_PM
1201 static int ieee80211_suspend(struct wiphy *wiphy)
1202 {
1203 	return __ieee80211_suspend(wiphy_priv(wiphy));
1204 }
1205 
1206 static int ieee80211_resume(struct wiphy *wiphy)
1207 {
1208 	return __ieee80211_resume(wiphy_priv(wiphy));
1209 }
1210 #else
1211 #define ieee80211_suspend NULL
1212 #define ieee80211_resume NULL
1213 #endif
1214 
1215 static int ieee80211_scan(struct wiphy *wiphy,
1216 			  struct net_device *dev,
1217 			  struct cfg80211_scan_request *req)
1218 {
1219 	struct ieee80211_sub_if_data *sdata;
1220 
1221 	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1222 
1223 	if (sdata->vif.type != NL80211_IFTYPE_STATION &&
1224 	    sdata->vif.type != NL80211_IFTYPE_ADHOC &&
1225 	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
1226 	    (sdata->vif.type != NL80211_IFTYPE_AP || sdata->u.ap.beacon))
1227 		return -EOPNOTSUPP;
1228 
1229 	return ieee80211_request_scan(sdata, req);
1230 }
1231 
1232 static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
1233 			  struct cfg80211_auth_request *req)
1234 {
1235 	return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req);
1236 }
1237 
1238 static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
1239 			   struct cfg80211_assoc_request *req)
1240 {
1241 	struct ieee80211_local *local = wiphy_priv(wiphy);
1242 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1243 
1244 	switch (ieee80211_get_channel_mode(local, sdata)) {
1245 	case CHAN_MODE_HOPPING:
1246 		return -EBUSY;
1247 	case CHAN_MODE_FIXED:
1248 		if (local->oper_channel == req->bss->channel)
1249 			break;
1250 		return -EBUSY;
1251 	case CHAN_MODE_UNDEFINED:
1252 		break;
1253 	}
1254 
1255 	return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
1256 }
1257 
1258 static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev,
1259 			    struct cfg80211_deauth_request *req,
1260 			    void *cookie)
1261 {
1262 	return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev),
1263 				    req, cookie);
1264 }
1265 
1266 static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev,
1267 			      struct cfg80211_disassoc_request *req,
1268 			      void *cookie)
1269 {
1270 	return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev),
1271 				      req, cookie);
1272 }
1273 
1274 static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
1275 			       struct cfg80211_ibss_params *params)
1276 {
1277 	struct ieee80211_local *local = wiphy_priv(wiphy);
1278 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1279 
1280 	switch (ieee80211_get_channel_mode(local, sdata)) {
1281 	case CHAN_MODE_HOPPING:
1282 		return -EBUSY;
1283 	case CHAN_MODE_FIXED:
1284 		if (!params->channel_fixed)
1285 			return -EBUSY;
1286 		if (local->oper_channel == params->channel)
1287 			break;
1288 		return -EBUSY;
1289 	case CHAN_MODE_UNDEFINED:
1290 		break;
1291 	}
1292 
1293 	return ieee80211_ibss_join(sdata, params);
1294 }
1295 
1296 static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
1297 {
1298 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1299 
1300 	return ieee80211_ibss_leave(sdata);
1301 }
1302 
1303 static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
1304 {
1305 	struct ieee80211_local *local = wiphy_priv(wiphy);
1306 	int err;
1307 
1308 	if (changed & WIPHY_PARAM_COVERAGE_CLASS) {
1309 		err = drv_set_coverage_class(local, wiphy->coverage_class);
1310 
1311 		if (err)
1312 			return err;
1313 	}
1314 
1315 	if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
1316 		err = drv_set_rts_threshold(local, wiphy->rts_threshold);
1317 
1318 		if (err)
1319 			return err;
1320 	}
1321 
1322 	if (changed & WIPHY_PARAM_RETRY_SHORT)
1323 		local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
1324 	if (changed & WIPHY_PARAM_RETRY_LONG)
1325 		local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
1326 	if (changed &
1327 	    (WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
1328 		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
1329 
1330 	return 0;
1331 }
1332 
1333 static int ieee80211_set_tx_power(struct wiphy *wiphy,
1334 				  enum tx_power_setting type, int dbm)
1335 {
1336 	struct ieee80211_local *local = wiphy_priv(wiphy);
1337 	struct ieee80211_channel *chan = local->hw.conf.channel;
1338 	u32 changes = 0;
1339 
1340 	switch (type) {
1341 	case TX_POWER_AUTOMATIC:
1342 		local->user_power_level = -1;
1343 		break;
1344 	case TX_POWER_LIMITED:
1345 		if (dbm < 0)
1346 			return -EINVAL;
1347 		local->user_power_level = dbm;
1348 		break;
1349 	case TX_POWER_FIXED:
1350 		if (dbm < 0)
1351 			return -EINVAL;
1352 		/* TODO: move to cfg80211 when it knows the channel */
1353 		if (dbm > chan->max_power)
1354 			return -EINVAL;
1355 		local->user_power_level = dbm;
1356 		break;
1357 	}
1358 
1359 	ieee80211_hw_config(local, changes);
1360 
1361 	return 0;
1362 }
1363 
1364 static int ieee80211_get_tx_power(struct wiphy *wiphy, int *dbm)
1365 {
1366 	struct ieee80211_local *local = wiphy_priv(wiphy);
1367 
1368 	*dbm = local->hw.conf.power_level;
1369 
1370 	return 0;
1371 }
1372 
1373 static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
1374 				  u8 *addr)
1375 {
1376 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1377 
1378 	memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN);
1379 
1380 	return 0;
1381 }
1382 
1383 static void ieee80211_rfkill_poll(struct wiphy *wiphy)
1384 {
1385 	struct ieee80211_local *local = wiphy_priv(wiphy);
1386 
1387 	drv_rfkill_poll(local);
1388 }
1389 
1390 #ifdef CONFIG_NL80211_TESTMODE
1391 static int ieee80211_testmode_cmd(struct wiphy *wiphy, void *data, int len)
1392 {
1393 	struct ieee80211_local *local = wiphy_priv(wiphy);
1394 
1395 	if (!local->ops->testmode_cmd)
1396 		return -EOPNOTSUPP;
1397 
1398 	return local->ops->testmode_cmd(&local->hw, data, len);
1399 }
1400 #endif
1401 
1402 int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
1403 			     enum ieee80211_smps_mode smps_mode)
1404 {
1405 	const u8 *ap;
1406 	enum ieee80211_smps_mode old_req;
1407 	int err;
1408 
1409 	old_req = sdata->u.mgd.req_smps;
1410 	sdata->u.mgd.req_smps = smps_mode;
1411 
1412 	if (old_req == smps_mode &&
1413 	    smps_mode != IEEE80211_SMPS_AUTOMATIC)
1414 		return 0;
1415 
1416 	/*
1417 	 * If not associated, or current association is not an HT
1418 	 * association, there's no need to send an action frame.
1419 	 */
1420 	if (!sdata->u.mgd.associated ||
1421 	    sdata->vif.bss_conf.channel_type == NL80211_CHAN_NO_HT) {
1422 		mutex_lock(&sdata->local->iflist_mtx);
1423 		ieee80211_recalc_smps(sdata->local, sdata);
1424 		mutex_unlock(&sdata->local->iflist_mtx);
1425 		return 0;
1426 	}
1427 
1428 	ap = sdata->u.mgd.associated->bssid;
1429 
1430 	if (smps_mode == IEEE80211_SMPS_AUTOMATIC) {
1431 		if (sdata->u.mgd.powersave)
1432 			smps_mode = IEEE80211_SMPS_DYNAMIC;
1433 		else
1434 			smps_mode = IEEE80211_SMPS_OFF;
1435 	}
1436 
1437 	/* send SM PS frame to AP */
1438 	err = ieee80211_send_smps_action(sdata, smps_mode,
1439 					 ap, ap);
1440 	if (err)
1441 		sdata->u.mgd.req_smps = old_req;
1442 
1443 	return err;
1444 }
1445 
1446 static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
1447 				    bool enabled, int timeout)
1448 {
1449 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1450 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1451 	struct ieee80211_conf *conf = &local->hw.conf;
1452 
1453 	if (sdata->vif.type != NL80211_IFTYPE_STATION)
1454 		return -EOPNOTSUPP;
1455 
1456 	if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
1457 		return -EOPNOTSUPP;
1458 
1459 	if (enabled == sdata->u.mgd.powersave &&
1460 	    timeout == conf->dynamic_ps_forced_timeout)
1461 		return 0;
1462 
1463 	sdata->u.mgd.powersave = enabled;
1464 	conf->dynamic_ps_forced_timeout = timeout;
1465 
1466 	/* no change, but if automatic follow powersave */
1467 	mutex_lock(&sdata->u.mgd.mtx);
1468 	__ieee80211_request_smps(sdata, sdata->u.mgd.req_smps);
1469 	mutex_unlock(&sdata->u.mgd.mtx);
1470 
1471 	if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)
1472 		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1473 
1474 	ieee80211_recalc_ps(local, -1);
1475 
1476 	return 0;
1477 }
1478 
1479 static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
1480 					 struct net_device *dev,
1481 					 s32 rssi_thold, u32 rssi_hyst)
1482 {
1483 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1484 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1485 	struct ieee80211_vif *vif = &sdata->vif;
1486 	struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
1487 
1488 	if (rssi_thold == bss_conf->cqm_rssi_thold &&
1489 	    rssi_hyst == bss_conf->cqm_rssi_hyst)
1490 		return 0;
1491 
1492 	bss_conf->cqm_rssi_thold = rssi_thold;
1493 	bss_conf->cqm_rssi_hyst = rssi_hyst;
1494 
1495 	if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_CQM_RSSI)) {
1496 		if (sdata->vif.type != NL80211_IFTYPE_STATION)
1497 			return -EOPNOTSUPP;
1498 		return 0;
1499 	}
1500 
1501 	/* tell the driver upon association, unless already associated */
1502 	if (sdata->u.mgd.associated)
1503 		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
1504 
1505 	return 0;
1506 }
1507 
1508 static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
1509 				      struct net_device *dev,
1510 				      const u8 *addr,
1511 				      const struct cfg80211_bitrate_mask *mask)
1512 {
1513 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1514 	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1515 	int i;
1516 
1517 	/*
1518 	 * This _could_ be supported by providing a hook for
1519 	 * drivers for this function, but at this point it
1520 	 * doesn't seem worth bothering.
1521 	 */
1522 	if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL)
1523 		return -EOPNOTSUPP;
1524 
1525 
1526 	for (i = 0; i < IEEE80211_NUM_BANDS; i++)
1527 		sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
1528 
1529 	return 0;
1530 }
1531 
1532 static int ieee80211_remain_on_channel(struct wiphy *wiphy,
1533 				       struct net_device *dev,
1534 				       struct ieee80211_channel *chan,
1535 				       enum nl80211_channel_type channel_type,
1536 				       unsigned int duration,
1537 				       u64 *cookie)
1538 {
1539 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1540 
1541 	return ieee80211_wk_remain_on_channel(sdata, chan, channel_type,
1542 					      duration, cookie);
1543 }
1544 
1545 static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
1546 					      struct net_device *dev,
1547 					      u64 cookie)
1548 {
1549 	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1550 
1551 	return ieee80211_wk_cancel_remain_on_channel(sdata, cookie);
1552 }
1553 
1554 static int ieee80211_action(struct wiphy *wiphy, struct net_device *dev,
1555 			    struct ieee80211_channel *chan,
1556 			    enum nl80211_channel_type channel_type,
1557 			    const u8 *buf, size_t len, u64 *cookie)
1558 {
1559 	return ieee80211_mgd_action(IEEE80211_DEV_TO_SUB_IF(dev), chan,
1560 				    channel_type, buf, len, cookie);
1561 }
1562 
1563 struct cfg80211_ops mac80211_config_ops = {
1564 	.add_virtual_intf = ieee80211_add_iface,
1565 	.del_virtual_intf = ieee80211_del_iface,
1566 	.change_virtual_intf = ieee80211_change_iface,
1567 	.add_key = ieee80211_add_key,
1568 	.del_key = ieee80211_del_key,
1569 	.get_key = ieee80211_get_key,
1570 	.set_default_key = ieee80211_config_default_key,
1571 	.set_default_mgmt_key = ieee80211_config_default_mgmt_key,
1572 	.add_beacon = ieee80211_add_beacon,
1573 	.set_beacon = ieee80211_set_beacon,
1574 	.del_beacon = ieee80211_del_beacon,
1575 	.add_station = ieee80211_add_station,
1576 	.del_station = ieee80211_del_station,
1577 	.change_station = ieee80211_change_station,
1578 	.get_station = ieee80211_get_station,
1579 	.dump_station = ieee80211_dump_station,
1580 	.dump_survey = ieee80211_dump_survey,
1581 #ifdef CONFIG_MAC80211_MESH
1582 	.add_mpath = ieee80211_add_mpath,
1583 	.del_mpath = ieee80211_del_mpath,
1584 	.change_mpath = ieee80211_change_mpath,
1585 	.get_mpath = ieee80211_get_mpath,
1586 	.dump_mpath = ieee80211_dump_mpath,
1587 	.set_mesh_params = ieee80211_set_mesh_params,
1588 	.get_mesh_params = ieee80211_get_mesh_params,
1589 #endif
1590 	.change_bss = ieee80211_change_bss,
1591 	.set_txq_params = ieee80211_set_txq_params,
1592 	.set_channel = ieee80211_set_channel,
1593 	.suspend = ieee80211_suspend,
1594 	.resume = ieee80211_resume,
1595 	.scan = ieee80211_scan,
1596 	.auth = ieee80211_auth,
1597 	.assoc = ieee80211_assoc,
1598 	.deauth = ieee80211_deauth,
1599 	.disassoc = ieee80211_disassoc,
1600 	.join_ibss = ieee80211_join_ibss,
1601 	.leave_ibss = ieee80211_leave_ibss,
1602 	.set_wiphy_params = ieee80211_set_wiphy_params,
1603 	.set_tx_power = ieee80211_set_tx_power,
1604 	.get_tx_power = ieee80211_get_tx_power,
1605 	.set_wds_peer = ieee80211_set_wds_peer,
1606 	.rfkill_poll = ieee80211_rfkill_poll,
1607 	CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
1608 	.set_power_mgmt = ieee80211_set_power_mgmt,
1609 	.set_bitrate_mask = ieee80211_set_bitrate_mask,
1610 	.remain_on_channel = ieee80211_remain_on_channel,
1611 	.cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
1612 	.action = ieee80211_action,
1613 	.set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
1614 };
1615