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