xref: /openbmc/linux/net/mac80211/mlme.c (revision b627b4ed)
1 /*
2  * BSS client mode implementation
3  * Copyright 2003-2008, Jouni Malinen <j@w1.fi>
4  * Copyright 2004, Instant802 Networks, Inc.
5  * Copyright 2005, Devicescape Software, Inc.
6  * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
7  * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  */
13 
14 #include <linux/delay.h>
15 #include <linux/if_ether.h>
16 #include <linux/skbuff.h>
17 #include <linux/if_arp.h>
18 #include <linux/etherdevice.h>
19 #include <linux/rtnetlink.h>
20 #include <net/mac80211.h>
21 #include <asm/unaligned.h>
22 
23 #include "ieee80211_i.h"
24 #include "rate.h"
25 #include "led.h"
26 
27 #define IEEE80211_ASSOC_SCANS_MAX_TRIES 2
28 #define IEEE80211_AUTH_TIMEOUT (HZ / 5)
29 #define IEEE80211_AUTH_MAX_TRIES 3
30 #define IEEE80211_ASSOC_TIMEOUT (HZ / 5)
31 #define IEEE80211_ASSOC_MAX_TRIES 3
32 #define IEEE80211_MONITORING_INTERVAL (2 * HZ)
33 #define IEEE80211_PROBE_IDLE_TIME (60 * HZ)
34 #define IEEE80211_RETRY_AUTH_INTERVAL (1 * HZ)
35 
36 /* utils */
37 static int ecw2cw(int ecw)
38 {
39 	return (1 << ecw) - 1;
40 }
41 
42 static u8 *ieee80211_bss_get_ie(struct ieee80211_bss *bss, u8 ie)
43 {
44 	u8 *end, *pos;
45 
46 	pos = bss->cbss.information_elements;
47 	if (pos == NULL)
48 		return NULL;
49 	end = pos + bss->cbss.len_information_elements;
50 
51 	while (pos + 1 < end) {
52 		if (pos + 2 + pos[1] > end)
53 			break;
54 		if (pos[0] == ie)
55 			return pos;
56 		pos += 2 + pos[1];
57 	}
58 
59 	return NULL;
60 }
61 
62 static int ieee80211_compatible_rates(struct ieee80211_bss *bss,
63 				      struct ieee80211_supported_band *sband,
64 				      u32 *rates)
65 {
66 	int i, j, count;
67 	*rates = 0;
68 	count = 0;
69 	for (i = 0; i < bss->supp_rates_len; i++) {
70 		int rate = (bss->supp_rates[i] & 0x7F) * 5;
71 
72 		for (j = 0; j < sband->n_bitrates; j++)
73 			if (sband->bitrates[j].bitrate == rate) {
74 				*rates |= BIT(j);
75 				count++;
76 				break;
77 			}
78 	}
79 
80 	return count;
81 }
82 
83 /* frame sending functions */
84 
85 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
86 {
87 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
88 	struct ieee80211_local *local = sdata->local;
89 	struct sk_buff *skb;
90 	struct ieee80211_mgmt *mgmt;
91 	u8 *pos, *ies, *ht_ie;
92 	int i, len, count, rates_len, supp_rates_len;
93 	u16 capab;
94 	struct ieee80211_bss *bss;
95 	int wmm = 0;
96 	struct ieee80211_supported_band *sband;
97 	u32 rates = 0;
98 
99 	skb = dev_alloc_skb(local->hw.extra_tx_headroom +
100 			    sizeof(*mgmt) + 200 + ifmgd->extra_ie_len +
101 			    ifmgd->ssid_len);
102 	if (!skb) {
103 		printk(KERN_DEBUG "%s: failed to allocate buffer for assoc "
104 		       "frame\n", sdata->dev->name);
105 		return;
106 	}
107 	skb_reserve(skb, local->hw.extra_tx_headroom);
108 
109 	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
110 
111 	capab = ifmgd->capab;
112 
113 	if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ) {
114 		if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE))
115 			capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME;
116 		if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE))
117 			capab |= WLAN_CAPABILITY_SHORT_PREAMBLE;
118 	}
119 
120 	bss = ieee80211_rx_bss_get(local, ifmgd->bssid,
121 				   local->hw.conf.channel->center_freq,
122 				   ifmgd->ssid, ifmgd->ssid_len);
123 	if (bss) {
124 		if (bss->cbss.capability & WLAN_CAPABILITY_PRIVACY)
125 			capab |= WLAN_CAPABILITY_PRIVACY;
126 		if (bss->wmm_used)
127 			wmm = 1;
128 
129 		/* get all rates supported by the device and the AP as
130 		 * some APs don't like getting a superset of their rates
131 		 * in the association request (e.g. D-Link DAP 1353 in
132 		 * b-only mode) */
133 		rates_len = ieee80211_compatible_rates(bss, sband, &rates);
134 
135 		if ((bss->cbss.capability & WLAN_CAPABILITY_SPECTRUM_MGMT) &&
136 		    (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT))
137 			capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
138 
139 		ieee80211_rx_bss_put(local, bss);
140 	} else {
141 		rates = ~0;
142 		rates_len = sband->n_bitrates;
143 	}
144 
145 	mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
146 	memset(mgmt, 0, 24);
147 	memcpy(mgmt->da, ifmgd->bssid, ETH_ALEN);
148 	memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
149 	memcpy(mgmt->bssid, ifmgd->bssid, ETH_ALEN);
150 
151 	if (ifmgd->flags & IEEE80211_STA_PREV_BSSID_SET) {
152 		skb_put(skb, 10);
153 		mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
154 						  IEEE80211_STYPE_REASSOC_REQ);
155 		mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab);
156 		mgmt->u.reassoc_req.listen_interval =
157 				cpu_to_le16(local->hw.conf.listen_interval);
158 		memcpy(mgmt->u.reassoc_req.current_ap, ifmgd->prev_bssid,
159 		       ETH_ALEN);
160 	} else {
161 		skb_put(skb, 4);
162 		mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
163 						  IEEE80211_STYPE_ASSOC_REQ);
164 		mgmt->u.assoc_req.capab_info = cpu_to_le16(capab);
165 		mgmt->u.assoc_req.listen_interval =
166 				cpu_to_le16(local->hw.conf.listen_interval);
167 	}
168 
169 	/* SSID */
170 	ies = pos = skb_put(skb, 2 + ifmgd->ssid_len);
171 	*pos++ = WLAN_EID_SSID;
172 	*pos++ = ifmgd->ssid_len;
173 	memcpy(pos, ifmgd->ssid, ifmgd->ssid_len);
174 
175 	/* add all rates which were marked to be used above */
176 	supp_rates_len = rates_len;
177 	if (supp_rates_len > 8)
178 		supp_rates_len = 8;
179 
180 	len = sband->n_bitrates;
181 	pos = skb_put(skb, supp_rates_len + 2);
182 	*pos++ = WLAN_EID_SUPP_RATES;
183 	*pos++ = supp_rates_len;
184 
185 	count = 0;
186 	for (i = 0; i < sband->n_bitrates; i++) {
187 		if (BIT(i) & rates) {
188 			int rate = sband->bitrates[i].bitrate;
189 			*pos++ = (u8) (rate / 5);
190 			if (++count == 8)
191 				break;
192 		}
193 	}
194 
195 	if (rates_len > count) {
196 		pos = skb_put(skb, rates_len - count + 2);
197 		*pos++ = WLAN_EID_EXT_SUPP_RATES;
198 		*pos++ = rates_len - count;
199 
200 		for (i++; i < sband->n_bitrates; i++) {
201 			if (BIT(i) & rates) {
202 				int rate = sband->bitrates[i].bitrate;
203 				*pos++ = (u8) (rate / 5);
204 			}
205 		}
206 	}
207 
208 	if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT) {
209 		/* 1. power capabilities */
210 		pos = skb_put(skb, 4);
211 		*pos++ = WLAN_EID_PWR_CAPABILITY;
212 		*pos++ = 2;
213 		*pos++ = 0; /* min tx power */
214 		*pos++ = local->hw.conf.channel->max_power; /* max tx power */
215 
216 		/* 2. supported channels */
217 		/* TODO: get this in reg domain format */
218 		pos = skb_put(skb, 2 * sband->n_channels + 2);
219 		*pos++ = WLAN_EID_SUPPORTED_CHANNELS;
220 		*pos++ = 2 * sband->n_channels;
221 		for (i = 0; i < sband->n_channels; i++) {
222 			*pos++ = ieee80211_frequency_to_channel(
223 					sband->channels[i].center_freq);
224 			*pos++ = 1; /* one channel in the subband*/
225 		}
226 	}
227 
228 	if (ifmgd->extra_ie) {
229 		pos = skb_put(skb, ifmgd->extra_ie_len);
230 		memcpy(pos, ifmgd->extra_ie, ifmgd->extra_ie_len);
231 	}
232 
233 	if (wmm && (ifmgd->flags & IEEE80211_STA_WMM_ENABLED)) {
234 		pos = skb_put(skb, 9);
235 		*pos++ = WLAN_EID_VENDOR_SPECIFIC;
236 		*pos++ = 7; /* len */
237 		*pos++ = 0x00; /* Microsoft OUI 00:50:F2 */
238 		*pos++ = 0x50;
239 		*pos++ = 0xf2;
240 		*pos++ = 2; /* WME */
241 		*pos++ = 0; /* WME info */
242 		*pos++ = 1; /* WME ver */
243 		*pos++ = 0;
244 	}
245 
246 	/* wmm support is a must to HT */
247 	/*
248 	 * IEEE802.11n does not allow TKIP/WEP as pairwise
249 	 * ciphers in HT mode. We still associate in non-ht
250 	 * mode (11a/b/g) if any one of these ciphers is
251 	 * configured as pairwise.
252 	 */
253 	if (wmm && (ifmgd->flags & IEEE80211_STA_WMM_ENABLED) &&
254 	    sband->ht_cap.ht_supported &&
255 	    (ht_ie = ieee80211_bss_get_ie(bss, WLAN_EID_HT_INFORMATION)) &&
256 	    ht_ie[1] >= sizeof(struct ieee80211_ht_info) &&
257 	    (!(ifmgd->flags & IEEE80211_STA_TKIP_WEP_USED))) {
258 		struct ieee80211_ht_info *ht_info =
259 			(struct ieee80211_ht_info *)(ht_ie + 2);
260 		u16 cap = sband->ht_cap.cap;
261 		__le16 tmp;
262 		u32 flags = local->hw.conf.channel->flags;
263 
264 		switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
265 		case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
266 			if (flags & IEEE80211_CHAN_NO_FAT_ABOVE) {
267 				cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
268 				cap &= ~IEEE80211_HT_CAP_SGI_40;
269 			}
270 			break;
271 		case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
272 			if (flags & IEEE80211_CHAN_NO_FAT_BELOW) {
273 				cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
274 				cap &= ~IEEE80211_HT_CAP_SGI_40;
275 			}
276 			break;
277 		}
278 
279 		tmp = cpu_to_le16(cap);
280 		pos = skb_put(skb, sizeof(struct ieee80211_ht_cap)+2);
281 		*pos++ = WLAN_EID_HT_CAPABILITY;
282 		*pos++ = sizeof(struct ieee80211_ht_cap);
283 		memset(pos, 0, sizeof(struct ieee80211_ht_cap));
284 		memcpy(pos, &tmp, sizeof(u16));
285 		pos += sizeof(u16);
286 		/* TODO: needs a define here for << 2 */
287 		*pos++ = sband->ht_cap.ampdu_factor |
288 			 (sband->ht_cap.ampdu_density << 2);
289 		memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs));
290 	}
291 
292 	kfree(ifmgd->assocreq_ies);
293 	ifmgd->assocreq_ies_len = (skb->data + skb->len) - ies;
294 	ifmgd->assocreq_ies = kmalloc(ifmgd->assocreq_ies_len, GFP_KERNEL);
295 	if (ifmgd->assocreq_ies)
296 		memcpy(ifmgd->assocreq_ies, ies, ifmgd->assocreq_ies_len);
297 
298 	ieee80211_tx_skb(sdata, skb, 0);
299 }
300 
301 
302 static void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata,
303 					   u16 stype, u16 reason)
304 {
305 	struct ieee80211_local *local = sdata->local;
306 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
307 	struct sk_buff *skb;
308 	struct ieee80211_mgmt *mgmt;
309 
310 	skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*mgmt));
311 	if (!skb) {
312 		printk(KERN_DEBUG "%s: failed to allocate buffer for "
313 		       "deauth/disassoc frame\n", sdata->dev->name);
314 		return;
315 	}
316 	skb_reserve(skb, local->hw.extra_tx_headroom);
317 
318 	mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
319 	memset(mgmt, 0, 24);
320 	memcpy(mgmt->da, ifmgd->bssid, ETH_ALEN);
321 	memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
322 	memcpy(mgmt->bssid, ifmgd->bssid, ETH_ALEN);
323 	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype);
324 	skb_put(skb, 2);
325 	/* u.deauth.reason_code == u.disassoc.reason_code */
326 	mgmt->u.deauth.reason_code = cpu_to_le16(reason);
327 
328 	ieee80211_tx_skb(sdata, skb, ifmgd->flags & IEEE80211_STA_MFP_ENABLED);
329 }
330 
331 void ieee80211_send_pspoll(struct ieee80211_local *local,
332 			   struct ieee80211_sub_if_data *sdata)
333 {
334 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
335 	struct ieee80211_pspoll *pspoll;
336 	struct sk_buff *skb;
337 	u16 fc;
338 
339 	skb = dev_alloc_skb(local->hw.extra_tx_headroom + sizeof(*pspoll));
340 	if (!skb) {
341 		printk(KERN_DEBUG "%s: failed to allocate buffer for "
342 		       "pspoll frame\n", sdata->dev->name);
343 		return;
344 	}
345 	skb_reserve(skb, local->hw.extra_tx_headroom);
346 
347 	pspoll = (struct ieee80211_pspoll *) skb_put(skb, sizeof(*pspoll));
348 	memset(pspoll, 0, sizeof(*pspoll));
349 	fc = IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL | IEEE80211_FCTL_PM;
350 	pspoll->frame_control = cpu_to_le16(fc);
351 	pspoll->aid = cpu_to_le16(ifmgd->aid);
352 
353 	/* aid in PS-Poll has its two MSBs each set to 1 */
354 	pspoll->aid |= cpu_to_le16(1 << 15 | 1 << 14);
355 
356 	memcpy(pspoll->bssid, ifmgd->bssid, ETH_ALEN);
357 	memcpy(pspoll->ta, sdata->dev->dev_addr, ETH_ALEN);
358 
359 	ieee80211_tx_skb(sdata, skb, 0);
360 }
361 
362 /* MLME */
363 static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
364 				     struct ieee80211_if_managed *ifmgd,
365 				     u8 *wmm_param, size_t wmm_param_len)
366 {
367 	struct ieee80211_tx_queue_params params;
368 	size_t left;
369 	int count;
370 	u8 *pos;
371 
372 	if (!(ifmgd->flags & IEEE80211_STA_WMM_ENABLED))
373 		return;
374 
375 	if (!wmm_param)
376 		return;
377 
378 	if (wmm_param_len < 8 || wmm_param[5] /* version */ != 1)
379 		return;
380 	count = wmm_param[6] & 0x0f;
381 	if (count == ifmgd->wmm_last_param_set)
382 		return;
383 	ifmgd->wmm_last_param_set = count;
384 
385 	pos = wmm_param + 8;
386 	left = wmm_param_len - 8;
387 
388 	memset(&params, 0, sizeof(params));
389 
390 	local->wmm_acm = 0;
391 	for (; left >= 4; left -= 4, pos += 4) {
392 		int aci = (pos[0] >> 5) & 0x03;
393 		int acm = (pos[0] >> 4) & 0x01;
394 		int queue;
395 
396 		switch (aci) {
397 		case 1: /* AC_BK */
398 			queue = 3;
399 			if (acm)
400 				local->wmm_acm |= BIT(1) | BIT(2); /* BK/- */
401 			break;
402 		case 2: /* AC_VI */
403 			queue = 1;
404 			if (acm)
405 				local->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */
406 			break;
407 		case 3: /* AC_VO */
408 			queue = 0;
409 			if (acm)
410 				local->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */
411 			break;
412 		case 0: /* AC_BE */
413 		default:
414 			queue = 2;
415 			if (acm)
416 				local->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */
417 			break;
418 		}
419 
420 		params.aifs = pos[0] & 0x0f;
421 		params.cw_max = ecw2cw((pos[1] & 0xf0) >> 4);
422 		params.cw_min = ecw2cw(pos[1] & 0x0f);
423 		params.txop = get_unaligned_le16(pos + 2);
424 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
425 		printk(KERN_DEBUG "%s: WMM queue=%d aci=%d acm=%d aifs=%d "
426 		       "cWmin=%d cWmax=%d txop=%d\n",
427 		       local->mdev->name, queue, aci, acm, params.aifs, params.cw_min,
428 		       params.cw_max, params.txop);
429 #endif
430 		if (local->ops->conf_tx &&
431 		    local->ops->conf_tx(local_to_hw(local), queue, &params)) {
432 			printk(KERN_DEBUG "%s: failed to set TX queue "
433 			       "parameters for queue %d\n", local->mdev->name, queue);
434 		}
435 	}
436 }
437 
438 static bool ieee80211_check_tim(struct ieee802_11_elems *elems, u16 aid)
439 {
440 	u8 mask;
441 	u8 index, indexn1, indexn2;
442 	struct ieee80211_tim_ie *tim = (struct ieee80211_tim_ie *) elems->tim;
443 
444 	aid &= 0x3fff;
445 	index = aid / 8;
446 	mask  = 1 << (aid & 7);
447 
448 	indexn1 = tim->bitmap_ctrl & 0xfe;
449 	indexn2 = elems->tim_len + indexn1 - 4;
450 
451 	if (index < indexn1 || index > indexn2)
452 		return false;
453 
454 	index -= indexn1;
455 
456 	return !!(tim->virtual_map[index] & mask);
457 }
458 
459 static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata,
460 					   u16 capab, bool erp_valid, u8 erp)
461 {
462 	struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
463 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
464 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
465 #endif
466 	u32 changed = 0;
467 	bool use_protection;
468 	bool use_short_preamble;
469 	bool use_short_slot;
470 
471 	if (erp_valid) {
472 		use_protection = (erp & WLAN_ERP_USE_PROTECTION) != 0;
473 		use_short_preamble = (erp & WLAN_ERP_BARKER_PREAMBLE) == 0;
474 	} else {
475 		use_protection = false;
476 		use_short_preamble = !!(capab & WLAN_CAPABILITY_SHORT_PREAMBLE);
477 	}
478 
479 	use_short_slot = !!(capab & WLAN_CAPABILITY_SHORT_SLOT_TIME);
480 
481 	if (use_protection != bss_conf->use_cts_prot) {
482 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
483 		if (net_ratelimit()) {
484 			printk(KERN_DEBUG "%s: CTS protection %s (BSSID=%pM)\n",
485 			       sdata->dev->name,
486 			       use_protection ? "enabled" : "disabled",
487 			       ifmgd->bssid);
488 		}
489 #endif
490 		bss_conf->use_cts_prot = use_protection;
491 		changed |= BSS_CHANGED_ERP_CTS_PROT;
492 	}
493 
494 	if (use_short_preamble != bss_conf->use_short_preamble) {
495 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
496 		if (net_ratelimit()) {
497 			printk(KERN_DEBUG "%s: switched to %s barker preamble"
498 			       " (BSSID=%pM)\n",
499 			       sdata->dev->name,
500 			       use_short_preamble ? "short" : "long",
501 			       ifmgd->bssid);
502 		}
503 #endif
504 		bss_conf->use_short_preamble = use_short_preamble;
505 		changed |= BSS_CHANGED_ERP_PREAMBLE;
506 	}
507 
508 	if (use_short_slot != bss_conf->use_short_slot) {
509 #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
510 		if (net_ratelimit()) {
511 			printk(KERN_DEBUG "%s: switched to %s slot time"
512 			       " (BSSID=%pM)\n",
513 			       sdata->dev->name,
514 			       use_short_slot ? "short" : "long",
515 			       ifmgd->bssid);
516 		}
517 #endif
518 		bss_conf->use_short_slot = use_short_slot;
519 		changed |= BSS_CHANGED_ERP_SLOT;
520 	}
521 
522 	return changed;
523 }
524 
525 static void ieee80211_sta_send_apinfo(struct ieee80211_sub_if_data *sdata)
526 {
527 	union iwreq_data wrqu;
528 
529 	memset(&wrqu, 0, sizeof(wrqu));
530 	if (sdata->u.mgd.flags & IEEE80211_STA_ASSOCIATED)
531 		memcpy(wrqu.ap_addr.sa_data, sdata->u.mgd.bssid, ETH_ALEN);
532 	wrqu.ap_addr.sa_family = ARPHRD_ETHER;
533 	wireless_send_event(sdata->dev, SIOCGIWAP, &wrqu, NULL);
534 }
535 
536 static void ieee80211_sta_send_associnfo(struct ieee80211_sub_if_data *sdata)
537 {
538 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
539 	char *buf;
540 	size_t len;
541 	int i;
542 	union iwreq_data wrqu;
543 
544 	if (!ifmgd->assocreq_ies && !ifmgd->assocresp_ies)
545 		return;
546 
547 	buf = kmalloc(50 + 2 * (ifmgd->assocreq_ies_len +
548 				ifmgd->assocresp_ies_len), GFP_KERNEL);
549 	if (!buf)
550 		return;
551 
552 	len = sprintf(buf, "ASSOCINFO(");
553 	if (ifmgd->assocreq_ies) {
554 		len += sprintf(buf + len, "ReqIEs=");
555 		for (i = 0; i < ifmgd->assocreq_ies_len; i++) {
556 			len += sprintf(buf + len, "%02x",
557 				       ifmgd->assocreq_ies[i]);
558 		}
559 	}
560 	if (ifmgd->assocresp_ies) {
561 		if (ifmgd->assocreq_ies)
562 			len += sprintf(buf + len, " ");
563 		len += sprintf(buf + len, "RespIEs=");
564 		for (i = 0; i < ifmgd->assocresp_ies_len; i++) {
565 			len += sprintf(buf + len, "%02x",
566 				       ifmgd->assocresp_ies[i]);
567 		}
568 	}
569 	len += sprintf(buf + len, ")");
570 
571 	if (len > IW_CUSTOM_MAX) {
572 		len = sprintf(buf, "ASSOCRESPIE=");
573 		for (i = 0; i < ifmgd->assocresp_ies_len; i++) {
574 			len += sprintf(buf + len, "%02x",
575 				       ifmgd->assocresp_ies[i]);
576 		}
577 	}
578 
579 	if (len <= IW_CUSTOM_MAX) {
580 		memset(&wrqu, 0, sizeof(wrqu));
581 		wrqu.data.length = len;
582 		wireless_send_event(sdata->dev, IWEVCUSTOM, &wrqu, buf);
583 	}
584 
585 	kfree(buf);
586 }
587 
588 
589 static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
590 				     u32 bss_info_changed)
591 {
592 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
593 	struct ieee80211_local *local = sdata->local;
594 	struct ieee80211_conf *conf = &local_to_hw(local)->conf;
595 
596 	struct ieee80211_bss *bss;
597 
598 	bss_info_changed |= BSS_CHANGED_ASSOC;
599 	ifmgd->flags |= IEEE80211_STA_ASSOCIATED;
600 
601 	bss = ieee80211_rx_bss_get(local, ifmgd->bssid,
602 				   conf->channel->center_freq,
603 				   ifmgd->ssid, ifmgd->ssid_len);
604 	if (bss) {
605 		/* set timing information */
606 		sdata->vif.bss_conf.beacon_int = bss->cbss.beacon_interval;
607 		sdata->vif.bss_conf.timestamp = bss->cbss.tsf;
608 		sdata->vif.bss_conf.dtim_period = bss->dtim_period;
609 
610 		bss_info_changed |= ieee80211_handle_bss_capability(sdata,
611 			bss->cbss.capability, bss->has_erp_value, bss->erp_value);
612 
613 		cfg80211_hold_bss(&bss->cbss);
614 
615 		ieee80211_rx_bss_put(local, bss);
616 	}
617 
618 	ifmgd->flags |= IEEE80211_STA_PREV_BSSID_SET;
619 	memcpy(ifmgd->prev_bssid, sdata->u.mgd.bssid, ETH_ALEN);
620 	ieee80211_sta_send_associnfo(sdata);
621 
622 	ifmgd->last_probe = jiffies;
623 	ieee80211_led_assoc(local, 1);
624 
625 	sdata->vif.bss_conf.assoc = 1;
626 	/*
627 	 * For now just always ask the driver to update the basic rateset
628 	 * when we have associated, we aren't checking whether it actually
629 	 * changed or not.
630 	 */
631 	bss_info_changed |= BSS_CHANGED_BASIC_RATES;
632 	ieee80211_bss_info_change_notify(sdata, bss_info_changed);
633 
634 	if (local->powersave) {
635 		if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS) &&
636 		    local->hw.conf.dynamic_ps_timeout > 0) {
637 			mod_timer(&local->dynamic_ps_timer, jiffies +
638 				  msecs_to_jiffies(
639 					local->hw.conf.dynamic_ps_timeout));
640 		} else {
641 			if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
642 				ieee80211_send_nullfunc(local, sdata, 1);
643 			conf->flags |= IEEE80211_CONF_PS;
644 			ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
645 		}
646 	}
647 
648 	netif_tx_start_all_queues(sdata->dev);
649 	netif_carrier_on(sdata->dev);
650 
651 	ieee80211_sta_send_apinfo(sdata);
652 }
653 
654 static void ieee80211_direct_probe(struct ieee80211_sub_if_data *sdata)
655 {
656 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
657 	struct ieee80211_local *local = sdata->local;
658 
659 	ifmgd->direct_probe_tries++;
660 	if (ifmgd->direct_probe_tries > IEEE80211_AUTH_MAX_TRIES) {
661 		printk(KERN_DEBUG "%s: direct probe to AP %pM timed out\n",
662 		       sdata->dev->name, ifmgd->bssid);
663 		ifmgd->state = IEEE80211_STA_MLME_DISABLED;
664 		ieee80211_sta_send_apinfo(sdata);
665 
666 		/*
667 		 * Most likely AP is not in the range so remove the
668 		 * bss information associated to the AP
669 		 */
670 		ieee80211_rx_bss_remove(sdata, ifmgd->bssid,
671 				sdata->local->hw.conf.channel->center_freq,
672 				ifmgd->ssid, ifmgd->ssid_len);
673 
674 		/*
675 		 * We might have a pending scan which had no chance to run yet
676 		 * due to state == IEEE80211_STA_MLME_DIRECT_PROBE.
677 		 * Hence, queue the STAs work again
678 		 */
679 		queue_work(local->hw.workqueue, &ifmgd->work);
680 		return;
681 	}
682 
683 	printk(KERN_DEBUG "%s: direct probe to AP %pM try %d\n",
684 			sdata->dev->name, ifmgd->bssid,
685 			ifmgd->direct_probe_tries);
686 
687 	ifmgd->state = IEEE80211_STA_MLME_DIRECT_PROBE;
688 
689 	set_bit(IEEE80211_STA_REQ_DIRECT_PROBE, &ifmgd->request);
690 
691 	/* Direct probe is sent to broadcast address as some APs
692 	 * will not answer to direct packet in unassociated state.
693 	 */
694 	ieee80211_send_probe_req(sdata, NULL,
695 				 ifmgd->ssid, ifmgd->ssid_len, NULL, 0);
696 
697 	mod_timer(&ifmgd->timer, jiffies + IEEE80211_AUTH_TIMEOUT);
698 }
699 
700 
701 static void ieee80211_authenticate(struct ieee80211_sub_if_data *sdata)
702 {
703 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
704 	struct ieee80211_local *local = sdata->local;
705 	u8 *ies;
706 	size_t ies_len;
707 
708 	ifmgd->auth_tries++;
709 	if (ifmgd->auth_tries > IEEE80211_AUTH_MAX_TRIES) {
710 		printk(KERN_DEBUG "%s: authentication with AP %pM"
711 		       " timed out\n",
712 		       sdata->dev->name, ifmgd->bssid);
713 		ifmgd->state = IEEE80211_STA_MLME_DISABLED;
714 		ieee80211_sta_send_apinfo(sdata);
715 		ieee80211_rx_bss_remove(sdata, ifmgd->bssid,
716 				sdata->local->hw.conf.channel->center_freq,
717 				ifmgd->ssid, ifmgd->ssid_len);
718 
719 		/*
720 		 * We might have a pending scan which had no chance to run yet
721 		 * due to state == IEEE80211_STA_MLME_AUTHENTICATE.
722 		 * Hence, queue the STAs work again
723 		 */
724 		queue_work(local->hw.workqueue, &ifmgd->work);
725 		return;
726 	}
727 
728 	ifmgd->state = IEEE80211_STA_MLME_AUTHENTICATE;
729 	printk(KERN_DEBUG "%s: authenticate with AP %pM\n",
730 	       sdata->dev->name, ifmgd->bssid);
731 
732 	if (ifmgd->flags & IEEE80211_STA_EXT_SME) {
733 		ies = ifmgd->sme_auth_ie;
734 		ies_len = ifmgd->sme_auth_ie_len;
735 	} else {
736 		ies = NULL;
737 		ies_len = 0;
738 	}
739 	ieee80211_send_auth(sdata, 1, ifmgd->auth_alg, ies, ies_len,
740 			    ifmgd->bssid, 0);
741 	ifmgd->auth_transaction = 2;
742 
743 	mod_timer(&ifmgd->timer, jiffies + IEEE80211_AUTH_TIMEOUT);
744 }
745 
746 /*
747  * The disassoc 'reason' argument can be either our own reason
748  * if self disconnected or a reason code from the AP.
749  */
750 static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
751 				   bool deauth, bool self_disconnected,
752 				   u16 reason)
753 {
754 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
755 	struct ieee80211_local *local = sdata->local;
756 	struct ieee80211_conf *conf = &local_to_hw(local)->conf;
757 	struct ieee80211_bss *bss;
758 	struct sta_info *sta;
759 	u32 changed = 0, config_changed = 0;
760 
761 	rcu_read_lock();
762 
763 	sta = sta_info_get(local, ifmgd->bssid);
764 	if (!sta) {
765 		rcu_read_unlock();
766 		return;
767 	}
768 
769 	if (deauth) {
770 		ifmgd->direct_probe_tries = 0;
771 		ifmgd->auth_tries = 0;
772 	}
773 	ifmgd->assoc_scan_tries = 0;
774 	ifmgd->assoc_tries = 0;
775 
776 	netif_tx_stop_all_queues(sdata->dev);
777 	netif_carrier_off(sdata->dev);
778 
779 	ieee80211_sta_tear_down_BA_sessions(sta);
780 
781 	bss = ieee80211_rx_bss_get(local, ifmgd->bssid,
782 				   conf->channel->center_freq,
783 				   ifmgd->ssid, ifmgd->ssid_len);
784 
785 	if (bss) {
786 		cfg80211_unhold_bss(&bss->cbss);
787 		ieee80211_rx_bss_put(local, bss);
788 	}
789 
790 	if (self_disconnected) {
791 		if (deauth)
792 			ieee80211_send_deauth_disassoc(sdata,
793 				IEEE80211_STYPE_DEAUTH, reason);
794 		else
795 			ieee80211_send_deauth_disassoc(sdata,
796 				IEEE80211_STYPE_DISASSOC, reason);
797 	}
798 
799 	ifmgd->flags &= ~IEEE80211_STA_ASSOCIATED;
800 	changed |= ieee80211_reset_erp_info(sdata);
801 
802 	ieee80211_led_assoc(local, 0);
803 	changed |= BSS_CHANGED_ASSOC;
804 	sdata->vif.bss_conf.assoc = false;
805 
806 	ieee80211_sta_send_apinfo(sdata);
807 
808 	if (self_disconnected || reason == WLAN_REASON_DISASSOC_STA_HAS_LEFT) {
809 		ifmgd->state = IEEE80211_STA_MLME_DISABLED;
810 		ieee80211_rx_bss_remove(sdata, ifmgd->bssid,
811 				sdata->local->hw.conf.channel->center_freq,
812 				ifmgd->ssid, ifmgd->ssid_len);
813 	}
814 
815 	rcu_read_unlock();
816 
817 	/* channel(_type) changes are handled by ieee80211_hw_config */
818 	local->oper_channel_type = NL80211_CHAN_NO_HT;
819 
820 	local->power_constr_level = 0;
821 
822 	del_timer_sync(&local->dynamic_ps_timer);
823 	cancel_work_sync(&local->dynamic_ps_enable_work);
824 
825 	if (local->hw.conf.flags & IEEE80211_CONF_PS) {
826 		local->hw.conf.flags &= ~IEEE80211_CONF_PS;
827 		config_changed |= IEEE80211_CONF_CHANGE_PS;
828 	}
829 
830 	ieee80211_hw_config(local, config_changed);
831 	ieee80211_bss_info_change_notify(sdata, changed);
832 
833 	rcu_read_lock();
834 
835 	sta = sta_info_get(local, ifmgd->bssid);
836 	if (!sta) {
837 		rcu_read_unlock();
838 		return;
839 	}
840 
841 	sta_info_unlink(&sta);
842 
843 	rcu_read_unlock();
844 
845 	sta_info_destroy(sta);
846 }
847 
848 static int ieee80211_sta_wep_configured(struct ieee80211_sub_if_data *sdata)
849 {
850 	if (!sdata || !sdata->default_key ||
851 	    sdata->default_key->conf.alg != ALG_WEP)
852 		return 0;
853 	return 1;
854 }
855 
856 static int ieee80211_privacy_mismatch(struct ieee80211_sub_if_data *sdata)
857 {
858 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
859 	struct ieee80211_local *local = sdata->local;
860 	struct ieee80211_bss *bss;
861 	int bss_privacy;
862 	int wep_privacy;
863 	int privacy_invoked;
864 
865 	if (!ifmgd || (ifmgd->flags & IEEE80211_STA_EXT_SME))
866 		return 0;
867 
868 	bss = ieee80211_rx_bss_get(local, ifmgd->bssid,
869 				   local->hw.conf.channel->center_freq,
870 				   ifmgd->ssid, ifmgd->ssid_len);
871 	if (!bss)
872 		return 0;
873 
874 	bss_privacy = !!(bss->cbss.capability & WLAN_CAPABILITY_PRIVACY);
875 	wep_privacy = !!ieee80211_sta_wep_configured(sdata);
876 	privacy_invoked = !!(ifmgd->flags & IEEE80211_STA_PRIVACY_INVOKED);
877 
878 	ieee80211_rx_bss_put(local, bss);
879 
880 	if ((bss_privacy == wep_privacy) || (bss_privacy == privacy_invoked))
881 		return 0;
882 
883 	return 1;
884 }
885 
886 static void ieee80211_associate(struct ieee80211_sub_if_data *sdata)
887 {
888 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
889 	struct ieee80211_local *local = sdata->local;
890 
891 	ifmgd->assoc_tries++;
892 	if (ifmgd->assoc_tries > IEEE80211_ASSOC_MAX_TRIES) {
893 		printk(KERN_DEBUG "%s: association with AP %pM"
894 		       " timed out\n",
895 		       sdata->dev->name, ifmgd->bssid);
896 		ifmgd->state = IEEE80211_STA_MLME_DISABLED;
897 		ieee80211_sta_send_apinfo(sdata);
898 		ieee80211_rx_bss_remove(sdata, ifmgd->bssid,
899 				sdata->local->hw.conf.channel->center_freq,
900 				ifmgd->ssid, ifmgd->ssid_len);
901 		/*
902 		 * We might have a pending scan which had no chance to run yet
903 		 * due to state == IEEE80211_STA_MLME_ASSOCIATE.
904 		 * Hence, queue the STAs work again
905 		 */
906 		queue_work(local->hw.workqueue, &ifmgd->work);
907 		return;
908 	}
909 
910 	ifmgd->state = IEEE80211_STA_MLME_ASSOCIATE;
911 	printk(KERN_DEBUG "%s: associate with AP %pM\n",
912 	       sdata->dev->name, ifmgd->bssid);
913 	if (ieee80211_privacy_mismatch(sdata)) {
914 		printk(KERN_DEBUG "%s: mismatch in privacy configuration and "
915 		       "mixed-cell disabled - abort association\n", sdata->dev->name);
916 		ifmgd->state = IEEE80211_STA_MLME_DISABLED;
917 		return;
918 	}
919 
920 	ieee80211_send_assoc(sdata);
921 
922 	mod_timer(&ifmgd->timer, jiffies + IEEE80211_ASSOC_TIMEOUT);
923 }
924 
925 void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata,
926 			     struct ieee80211_hdr *hdr)
927 {
928 	/*
929 	 * We can postpone the mgd.timer whenever receiving unicast frames
930 	 * from AP because we know that the connection is working both ways
931 	 * at that time. But multicast frames (and hence also beacons) must
932 	 * be ignored here, because we need to trigger the timer during
933 	 * data idle periods for sending the periodical probe request to
934 	 * the AP.
935 	 */
936 	if (!is_multicast_ether_addr(hdr->addr1))
937 		mod_timer(&sdata->u.mgd.timer,
938 			  jiffies + IEEE80211_MONITORING_INTERVAL);
939 }
940 
941 void ieee80211_beacon_loss_work(struct work_struct *work)
942 {
943 	struct ieee80211_sub_if_data *sdata =
944 		container_of(work, struct ieee80211_sub_if_data,
945 			     u.mgd.beacon_loss_work);
946 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
947 
948 	printk(KERN_DEBUG "%s: driver reports beacon loss from AP %pM "
949 	       "- sending probe request\n", sdata->dev->name,
950 	       sdata->u.mgd.bssid);
951 
952 	ifmgd->flags |= IEEE80211_STA_PROBEREQ_POLL;
953 	ieee80211_send_probe_req(sdata, ifmgd->bssid, ifmgd->ssid,
954 				 ifmgd->ssid_len, NULL, 0);
955 
956 	mod_timer(&ifmgd->timer, jiffies + IEEE80211_MONITORING_INTERVAL);
957 }
958 
959 void ieee80211_beacon_loss(struct ieee80211_vif *vif)
960 {
961 	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
962 
963 	queue_work(sdata->local->hw.workqueue,
964 		   &sdata->u.mgd.beacon_loss_work);
965 }
966 EXPORT_SYMBOL(ieee80211_beacon_loss);
967 
968 static void ieee80211_associated(struct ieee80211_sub_if_data *sdata)
969 {
970 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
971 	struct ieee80211_local *local = sdata->local;
972 	struct sta_info *sta;
973 	bool disassoc = false;
974 
975 	/* TODO: start monitoring current AP signal quality and number of
976 	 * missed beacons. Scan other channels every now and then and search
977 	 * for better APs. */
978 	/* TODO: remove expired BSSes */
979 
980 	ifmgd->state = IEEE80211_STA_MLME_ASSOCIATED;
981 
982 	rcu_read_lock();
983 
984 	sta = sta_info_get(local, ifmgd->bssid);
985 	if (!sta) {
986 		printk(KERN_DEBUG "%s: No STA entry for own AP %pM\n",
987 		       sdata->dev->name, ifmgd->bssid);
988 		disassoc = true;
989 		goto unlock;
990 	}
991 
992 	if ((ifmgd->flags & IEEE80211_STA_PROBEREQ_POLL) &&
993 	    time_after(jiffies, sta->last_rx + IEEE80211_MONITORING_INTERVAL)) {
994 		printk(KERN_DEBUG "%s: no probe response from AP %pM "
995 		       "- disassociating\n",
996 		       sdata->dev->name, ifmgd->bssid);
997 		disassoc = true;
998 		ifmgd->flags &= ~IEEE80211_STA_PROBEREQ_POLL;
999 		goto unlock;
1000 	}
1001 
1002 	/*
1003 	 * Beacon filtering is only enabled with power save and then the
1004 	 * stack should not check for beacon loss.
1005 	 */
1006 	if (!((local->hw.flags & IEEE80211_HW_BEACON_FILTER) &&
1007 	      (local->hw.conf.flags & IEEE80211_CONF_PS)) &&
1008 	    time_after(jiffies,
1009 		       ifmgd->last_beacon + IEEE80211_MONITORING_INTERVAL)) {
1010 		printk(KERN_DEBUG "%s: beacon loss from AP %pM "
1011 		       "- sending probe request\n",
1012 		       sdata->dev->name, ifmgd->bssid);
1013 		ifmgd->flags |= IEEE80211_STA_PROBEREQ_POLL;
1014 		ieee80211_send_probe_req(sdata, ifmgd->bssid, ifmgd->ssid,
1015 					 ifmgd->ssid_len, NULL, 0);
1016 		goto unlock;
1017 
1018 	}
1019 
1020 	if (time_after(jiffies, sta->last_rx + IEEE80211_PROBE_IDLE_TIME)) {
1021 		ifmgd->flags |= IEEE80211_STA_PROBEREQ_POLL;
1022 		ieee80211_send_probe_req(sdata, ifmgd->bssid, ifmgd->ssid,
1023 					 ifmgd->ssid_len, NULL, 0);
1024 	}
1025 
1026  unlock:
1027 	rcu_read_unlock();
1028 
1029 	if (disassoc)
1030 		ieee80211_set_disassoc(sdata, true, true,
1031 					WLAN_REASON_PREV_AUTH_NOT_VALID);
1032 	else
1033 		mod_timer(&ifmgd->timer, jiffies +
1034 				      IEEE80211_MONITORING_INTERVAL);
1035 }
1036 
1037 
1038 static void ieee80211_auth_completed(struct ieee80211_sub_if_data *sdata)
1039 {
1040 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1041 
1042 	printk(KERN_DEBUG "%s: authenticated\n", sdata->dev->name);
1043 	ifmgd->flags |= IEEE80211_STA_AUTHENTICATED;
1044 	if (ifmgd->flags & IEEE80211_STA_EXT_SME) {
1045 		/* Wait for SME to request association */
1046 		ifmgd->state = IEEE80211_STA_MLME_DISABLED;
1047 	} else
1048 		ieee80211_associate(sdata);
1049 }
1050 
1051 
1052 static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
1053 				     struct ieee80211_mgmt *mgmt,
1054 				     size_t len)
1055 {
1056 	u8 *pos;
1057 	struct ieee802_11_elems elems;
1058 
1059 	pos = mgmt->u.auth.variable;
1060 	ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
1061 	if (!elems.challenge)
1062 		return;
1063 	ieee80211_send_auth(sdata, 3, sdata->u.mgd.auth_alg,
1064 			    elems.challenge - 2, elems.challenge_len + 2,
1065 			    sdata->u.mgd.bssid, 1);
1066 	sdata->u.mgd.auth_transaction = 4;
1067 }
1068 
1069 static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
1070 				   struct ieee80211_mgmt *mgmt,
1071 				   size_t len)
1072 {
1073 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1074 	u16 auth_alg, auth_transaction, status_code;
1075 
1076 	if (ifmgd->state != IEEE80211_STA_MLME_AUTHENTICATE)
1077 		return;
1078 
1079 	if (len < 24 + 6)
1080 		return;
1081 
1082 	if (memcmp(ifmgd->bssid, mgmt->sa, ETH_ALEN) != 0)
1083 		return;
1084 
1085 	if (memcmp(ifmgd->bssid, mgmt->bssid, ETH_ALEN) != 0)
1086 		return;
1087 
1088 	auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
1089 	auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
1090 	status_code = le16_to_cpu(mgmt->u.auth.status_code);
1091 
1092 	if (auth_alg != ifmgd->auth_alg ||
1093 	    auth_transaction != ifmgd->auth_transaction)
1094 		return;
1095 
1096 	if (status_code != WLAN_STATUS_SUCCESS) {
1097 		if (status_code == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG) {
1098 			u8 algs[3];
1099 			const int num_algs = ARRAY_SIZE(algs);
1100 			int i, pos;
1101 			algs[0] = algs[1] = algs[2] = 0xff;
1102 			if (ifmgd->auth_algs & IEEE80211_AUTH_ALG_OPEN)
1103 				algs[0] = WLAN_AUTH_OPEN;
1104 			if (ifmgd->auth_algs & IEEE80211_AUTH_ALG_SHARED_KEY)
1105 				algs[1] = WLAN_AUTH_SHARED_KEY;
1106 			if (ifmgd->auth_algs & IEEE80211_AUTH_ALG_LEAP)
1107 				algs[2] = WLAN_AUTH_LEAP;
1108 			if (ifmgd->auth_alg == WLAN_AUTH_OPEN)
1109 				pos = 0;
1110 			else if (ifmgd->auth_alg == WLAN_AUTH_SHARED_KEY)
1111 				pos = 1;
1112 			else
1113 				pos = 2;
1114 			for (i = 0; i < num_algs; i++) {
1115 				pos++;
1116 				if (pos >= num_algs)
1117 					pos = 0;
1118 				if (algs[pos] == ifmgd->auth_alg ||
1119 				    algs[pos] == 0xff)
1120 					continue;
1121 				if (algs[pos] == WLAN_AUTH_SHARED_KEY &&
1122 				    !ieee80211_sta_wep_configured(sdata))
1123 					continue;
1124 				ifmgd->auth_alg = algs[pos];
1125 				break;
1126 			}
1127 		}
1128 		return;
1129 	}
1130 
1131 	switch (ifmgd->auth_alg) {
1132 	case WLAN_AUTH_OPEN:
1133 	case WLAN_AUTH_LEAP:
1134 	case WLAN_AUTH_FT:
1135 		ieee80211_auth_completed(sdata);
1136 		cfg80211_send_rx_auth(sdata->dev, (u8 *) mgmt, len);
1137 		break;
1138 	case WLAN_AUTH_SHARED_KEY:
1139 		if (ifmgd->auth_transaction == 4) {
1140 			ieee80211_auth_completed(sdata);
1141 			cfg80211_send_rx_auth(sdata->dev, (u8 *) mgmt, len);
1142 		} else
1143 			ieee80211_auth_challenge(sdata, mgmt, len);
1144 		break;
1145 	}
1146 }
1147 
1148 
1149 static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
1150 				     struct ieee80211_mgmt *mgmt,
1151 				     size_t len)
1152 {
1153 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1154 	u16 reason_code;
1155 
1156 	if (len < 24 + 2)
1157 		return;
1158 
1159 	if (memcmp(ifmgd->bssid, mgmt->sa, ETH_ALEN))
1160 		return;
1161 
1162 	reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
1163 
1164 	if (ifmgd->flags & IEEE80211_STA_AUTHENTICATED)
1165 		printk(KERN_DEBUG "%s: deauthenticated (Reason: %u)\n",
1166 				sdata->dev->name, reason_code);
1167 
1168 	if (!(ifmgd->flags & IEEE80211_STA_EXT_SME) &&
1169 	    (ifmgd->state == IEEE80211_STA_MLME_AUTHENTICATE ||
1170 	     ifmgd->state == IEEE80211_STA_MLME_ASSOCIATE ||
1171 	     ifmgd->state == IEEE80211_STA_MLME_ASSOCIATED)) {
1172 		ifmgd->state = IEEE80211_STA_MLME_DIRECT_PROBE;
1173 		mod_timer(&ifmgd->timer, jiffies +
1174 				      IEEE80211_RETRY_AUTH_INTERVAL);
1175 	}
1176 
1177 	ieee80211_set_disassoc(sdata, true, false, 0);
1178 	ifmgd->flags &= ~IEEE80211_STA_AUTHENTICATED;
1179 	cfg80211_send_rx_deauth(sdata->dev, (u8 *) mgmt, len);
1180 }
1181 
1182 
1183 static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
1184 				       struct ieee80211_mgmt *mgmt,
1185 				       size_t len)
1186 {
1187 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1188 	u16 reason_code;
1189 
1190 	if (len < 24 + 2)
1191 		return;
1192 
1193 	if (memcmp(ifmgd->bssid, mgmt->sa, ETH_ALEN))
1194 		return;
1195 
1196 	reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
1197 
1198 	if (ifmgd->flags & IEEE80211_STA_ASSOCIATED)
1199 		printk(KERN_DEBUG "%s: disassociated (Reason: %u)\n",
1200 				sdata->dev->name, reason_code);
1201 
1202 	if (!(ifmgd->flags & IEEE80211_STA_EXT_SME) &&
1203 	    ifmgd->state == IEEE80211_STA_MLME_ASSOCIATED) {
1204 		ifmgd->state = IEEE80211_STA_MLME_ASSOCIATE;
1205 		mod_timer(&ifmgd->timer, jiffies +
1206 				      IEEE80211_RETRY_AUTH_INTERVAL);
1207 	}
1208 
1209 	ieee80211_set_disassoc(sdata, false, false, reason_code);
1210 	cfg80211_send_rx_disassoc(sdata->dev, (u8 *) mgmt, len);
1211 }
1212 
1213 
1214 static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
1215 					 struct ieee80211_mgmt *mgmt,
1216 					 size_t len,
1217 					 int reassoc)
1218 {
1219 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1220 	struct ieee80211_local *local = sdata->local;
1221 	struct ieee80211_supported_band *sband;
1222 	struct sta_info *sta;
1223 	u32 rates, basic_rates;
1224 	u16 capab_info, status_code, aid;
1225 	struct ieee802_11_elems elems;
1226 	struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
1227 	u8 *pos;
1228 	u32 changed = 0;
1229 	int i, j;
1230 	bool have_higher_than_11mbit = false, newsta = false;
1231 	u16 ap_ht_cap_flags;
1232 
1233 	/* AssocResp and ReassocResp have identical structure, so process both
1234 	 * of them in this function. */
1235 
1236 	if (ifmgd->state != IEEE80211_STA_MLME_ASSOCIATE)
1237 		return;
1238 
1239 	if (len < 24 + 6)
1240 		return;
1241 
1242 	if (memcmp(ifmgd->bssid, mgmt->sa, ETH_ALEN) != 0)
1243 		return;
1244 
1245 	capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
1246 	status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code);
1247 	aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
1248 
1249 	printk(KERN_DEBUG "%s: RX %sssocResp from %pM (capab=0x%x "
1250 	       "status=%d aid=%d)\n",
1251 	       sdata->dev->name, reassoc ? "Rea" : "A", mgmt->sa,
1252 	       capab_info, status_code, (u16)(aid & ~(BIT(15) | BIT(14))));
1253 
1254 	pos = mgmt->u.assoc_resp.variable;
1255 	ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
1256 
1257 	if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY &&
1258 	    elems.timeout_int && elems.timeout_int_len == 5 &&
1259 	    elems.timeout_int[0] == WLAN_TIMEOUT_ASSOC_COMEBACK) {
1260 		u32 tu, ms;
1261 		tu = get_unaligned_le32(elems.timeout_int + 1);
1262 		ms = tu * 1024 / 1000;
1263 		printk(KERN_DEBUG "%s: AP rejected association temporarily; "
1264 		       "comeback duration %u TU (%u ms)\n",
1265 		       sdata->dev->name, tu, ms);
1266 		if (ms > IEEE80211_ASSOC_TIMEOUT)
1267 			mod_timer(&ifmgd->timer,
1268 				  jiffies + msecs_to_jiffies(ms));
1269 		return;
1270 	}
1271 
1272 	if (status_code != WLAN_STATUS_SUCCESS) {
1273 		printk(KERN_DEBUG "%s: AP denied association (code=%d)\n",
1274 		       sdata->dev->name, status_code);
1275 		/* if this was a reassociation, ensure we try a "full"
1276 		 * association next time. This works around some broken APs
1277 		 * which do not correctly reject reassociation requests. */
1278 		ifmgd->flags &= ~IEEE80211_STA_PREV_BSSID_SET;
1279 		return;
1280 	}
1281 
1282 	if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14)))
1283 		printk(KERN_DEBUG "%s: invalid aid value %d; bits 15:14 not "
1284 		       "set\n", sdata->dev->name, aid);
1285 	aid &= ~(BIT(15) | BIT(14));
1286 
1287 	if (!elems.supp_rates) {
1288 		printk(KERN_DEBUG "%s: no SuppRates element in AssocResp\n",
1289 		       sdata->dev->name);
1290 		return;
1291 	}
1292 
1293 	printk(KERN_DEBUG "%s: associated\n", sdata->dev->name);
1294 	ifmgd->aid = aid;
1295 	ifmgd->ap_capab = capab_info;
1296 
1297 	kfree(ifmgd->assocresp_ies);
1298 	ifmgd->assocresp_ies_len = len - (pos - (u8 *) mgmt);
1299 	ifmgd->assocresp_ies = kmalloc(ifmgd->assocresp_ies_len, GFP_KERNEL);
1300 	if (ifmgd->assocresp_ies)
1301 		memcpy(ifmgd->assocresp_ies, pos, ifmgd->assocresp_ies_len);
1302 
1303 	rcu_read_lock();
1304 
1305 	/* Add STA entry for the AP */
1306 	sta = sta_info_get(local, ifmgd->bssid);
1307 	if (!sta) {
1308 		newsta = true;
1309 
1310 		sta = sta_info_alloc(sdata, ifmgd->bssid, GFP_ATOMIC);
1311 		if (!sta) {
1312 			printk(KERN_DEBUG "%s: failed to alloc STA entry for"
1313 			       " the AP\n", sdata->dev->name);
1314 			rcu_read_unlock();
1315 			return;
1316 		}
1317 
1318 		/* update new sta with its last rx activity */
1319 		sta->last_rx = jiffies;
1320 	}
1321 
1322 	/*
1323 	 * FIXME: Do we really need to update the sta_info's information here?
1324 	 *	  We already know about the AP (we found it in our list) so it
1325 	 *	  should already be filled with the right info, no?
1326 	 *	  As is stands, all this is racy because typically we assume
1327 	 *	  the information that is filled in here (except flags) doesn't
1328 	 *	  change while a STA structure is alive. As such, it should move
1329 	 *	  to between the sta_info_alloc() and sta_info_insert() above.
1330 	 */
1331 
1332 	set_sta_flags(sta, WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_ASSOC_AP |
1333 			   WLAN_STA_AUTHORIZED);
1334 
1335 	rates = 0;
1336 	basic_rates = 0;
1337 	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
1338 
1339 	for (i = 0; i < elems.supp_rates_len; i++) {
1340 		int rate = (elems.supp_rates[i] & 0x7f) * 5;
1341 		bool is_basic = !!(elems.supp_rates[i] & 0x80);
1342 
1343 		if (rate > 110)
1344 			have_higher_than_11mbit = true;
1345 
1346 		for (j = 0; j < sband->n_bitrates; j++) {
1347 			if (sband->bitrates[j].bitrate == rate) {
1348 				rates |= BIT(j);
1349 				if (is_basic)
1350 					basic_rates |= BIT(j);
1351 				break;
1352 			}
1353 		}
1354 	}
1355 
1356 	for (i = 0; i < elems.ext_supp_rates_len; i++) {
1357 		int rate = (elems.ext_supp_rates[i] & 0x7f) * 5;
1358 		bool is_basic = !!(elems.supp_rates[i] & 0x80);
1359 
1360 		if (rate > 110)
1361 			have_higher_than_11mbit = true;
1362 
1363 		for (j = 0; j < sband->n_bitrates; j++) {
1364 			if (sband->bitrates[j].bitrate == rate) {
1365 				rates |= BIT(j);
1366 				if (is_basic)
1367 					basic_rates |= BIT(j);
1368 				break;
1369 			}
1370 		}
1371 	}
1372 
1373 	sta->sta.supp_rates[local->hw.conf.channel->band] = rates;
1374 	sdata->vif.bss_conf.basic_rates = basic_rates;
1375 
1376 	/* cf. IEEE 802.11 9.2.12 */
1377 	if (local->hw.conf.channel->band == IEEE80211_BAND_2GHZ &&
1378 	    have_higher_than_11mbit)
1379 		sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
1380 	else
1381 		sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
1382 
1383 	/* If TKIP/WEP is used, no need to parse AP's HT capabilities */
1384 	if (elems.ht_cap_elem && !(ifmgd->flags & IEEE80211_STA_TKIP_WEP_USED))
1385 		ieee80211_ht_cap_ie_to_sta_ht_cap(sband,
1386 				elems.ht_cap_elem, &sta->sta.ht_cap);
1387 
1388 	ap_ht_cap_flags = sta->sta.ht_cap.cap;
1389 
1390 	rate_control_rate_init(sta);
1391 
1392 	if (ifmgd->flags & IEEE80211_STA_MFP_ENABLED)
1393 		set_sta_flags(sta, WLAN_STA_MFP);
1394 
1395 	if (elems.wmm_param)
1396 		set_sta_flags(sta, WLAN_STA_WME);
1397 
1398 	if (newsta) {
1399 		int err = sta_info_insert(sta);
1400 		if (err) {
1401 			printk(KERN_DEBUG "%s: failed to insert STA entry for"
1402 			       " the AP (error %d)\n", sdata->dev->name, err);
1403 			rcu_read_unlock();
1404 			return;
1405 		}
1406 	}
1407 
1408 	rcu_read_unlock();
1409 
1410 	if (elems.wmm_param)
1411 		ieee80211_sta_wmm_params(local, ifmgd, elems.wmm_param,
1412 					 elems.wmm_param_len);
1413 
1414 	if (elems.ht_info_elem && elems.wmm_param &&
1415 	    (ifmgd->flags & IEEE80211_STA_WMM_ENABLED) &&
1416 	    !(ifmgd->flags & IEEE80211_STA_TKIP_WEP_USED))
1417 		changed |= ieee80211_enable_ht(sdata, elems.ht_info_elem,
1418 					       ap_ht_cap_flags);
1419 
1420 	/* set AID and assoc capability,
1421 	 * ieee80211_set_associated() will tell the driver */
1422 	bss_conf->aid = aid;
1423 	bss_conf->assoc_capability = capab_info;
1424 	ieee80211_set_associated(sdata, changed);
1425 
1426 	/*
1427 	 * initialise the time of last beacon to be the association time,
1428 	 * otherwise beacon loss check will trigger immediately
1429 	 */
1430 	ifmgd->last_beacon = jiffies;
1431 
1432 	ieee80211_associated(sdata);
1433 	cfg80211_send_rx_assoc(sdata->dev, (u8 *) mgmt, len);
1434 }
1435 
1436 
1437 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
1438 				  struct ieee80211_mgmt *mgmt,
1439 				  size_t len,
1440 				  struct ieee80211_rx_status *rx_status,
1441 				  struct ieee802_11_elems *elems,
1442 				  bool beacon)
1443 {
1444 	struct ieee80211_local *local = sdata->local;
1445 	int freq;
1446 	struct ieee80211_bss *bss;
1447 	struct ieee80211_channel *channel;
1448 
1449 	if (elems->ds_params && elems->ds_params_len == 1)
1450 		freq = ieee80211_channel_to_frequency(elems->ds_params[0]);
1451 	else
1452 		freq = rx_status->freq;
1453 
1454 	channel = ieee80211_get_channel(local->hw.wiphy, freq);
1455 
1456 	if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
1457 		return;
1458 
1459 	bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems,
1460 					channel, beacon);
1461 	if (!bss)
1462 		return;
1463 
1464 	if (elems->ch_switch_elem && (elems->ch_switch_elem_len == 3) &&
1465 	    (memcmp(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN) == 0)) {
1466 		struct ieee80211_channel_sw_ie *sw_elem =
1467 			(struct ieee80211_channel_sw_ie *)elems->ch_switch_elem;
1468 		ieee80211_process_chanswitch(sdata, sw_elem, bss);
1469 	}
1470 
1471 	ieee80211_rx_bss_put(local, bss);
1472 }
1473 
1474 
1475 static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
1476 					 struct ieee80211_mgmt *mgmt,
1477 					 size_t len,
1478 					 struct ieee80211_rx_status *rx_status)
1479 {
1480 	struct ieee80211_if_managed *ifmgd;
1481 	size_t baselen;
1482 	struct ieee802_11_elems elems;
1483 
1484 	ifmgd = &sdata->u.mgd;
1485 
1486 	if (memcmp(mgmt->da, sdata->dev->dev_addr, ETH_ALEN))
1487 		return; /* ignore ProbeResp to foreign address */
1488 
1489 	baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
1490 	if (baselen > len)
1491 		return;
1492 
1493 	ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
1494 				&elems);
1495 
1496 	ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, false);
1497 
1498 	/* direct probe may be part of the association flow */
1499 	if (test_and_clear_bit(IEEE80211_STA_REQ_DIRECT_PROBE,
1500 			       &ifmgd->request)) {
1501 		printk(KERN_DEBUG "%s direct probe responded\n",
1502 		       sdata->dev->name);
1503 		ieee80211_authenticate(sdata);
1504 	}
1505 
1506 	if (ifmgd->flags & IEEE80211_STA_PROBEREQ_POLL)
1507 		ifmgd->flags &= ~IEEE80211_STA_PROBEREQ_POLL;
1508 }
1509 
1510 static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
1511 				     struct ieee80211_mgmt *mgmt,
1512 				     size_t len,
1513 				     struct ieee80211_rx_status *rx_status)
1514 {
1515 	struct ieee80211_if_managed *ifmgd;
1516 	size_t baselen;
1517 	struct ieee802_11_elems elems;
1518 	struct ieee80211_local *local = sdata->local;
1519 	u32 changed = 0;
1520 	bool erp_valid, directed_tim;
1521 	u8 erp_value = 0;
1522 
1523 	/* Process beacon from the current BSS */
1524 	baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt;
1525 	if (baselen > len)
1526 		return;
1527 
1528 	ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
1529 
1530 	ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, true);
1531 
1532 	if (sdata->vif.type != NL80211_IFTYPE_STATION)
1533 		return;
1534 
1535 	ifmgd = &sdata->u.mgd;
1536 
1537 	if (!(ifmgd->flags & IEEE80211_STA_ASSOCIATED) ||
1538 	    memcmp(ifmgd->bssid, mgmt->bssid, ETH_ALEN) != 0)
1539 		return;
1540 
1541 	if (rx_status->freq != local->hw.conf.channel->center_freq)
1542 		return;
1543 
1544 	ieee80211_sta_wmm_params(local, ifmgd, elems.wmm_param,
1545 				 elems.wmm_param_len);
1546 
1547 	if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) {
1548 		directed_tim = ieee80211_check_tim(&elems, ifmgd->aid);
1549 
1550 		if (directed_tim) {
1551 			if (local->hw.conf.dynamic_ps_timeout > 0) {
1552 				local->hw.conf.flags &= ~IEEE80211_CONF_PS;
1553 				ieee80211_hw_config(local,
1554 						    IEEE80211_CONF_CHANGE_PS);
1555 				ieee80211_send_nullfunc(local, sdata, 0);
1556 			} else {
1557 				local->pspolling = true;
1558 
1559 				/*
1560 				 * Here is assumed that the driver will be
1561 				 * able to send ps-poll frame and receive a
1562 				 * response even though power save mode is
1563 				 * enabled, but some drivers might require
1564 				 * to disable power save here. This needs
1565 				 * to be investigated.
1566 				 */
1567 				ieee80211_send_pspoll(local, sdata);
1568 			}
1569 		}
1570 	}
1571 
1572 	if (elems.erp_info && elems.erp_info_len >= 1) {
1573 		erp_valid = true;
1574 		erp_value = elems.erp_info[0];
1575 	} else {
1576 		erp_valid = false;
1577 	}
1578 	changed |= ieee80211_handle_bss_capability(sdata,
1579 			le16_to_cpu(mgmt->u.beacon.capab_info),
1580 			erp_valid, erp_value);
1581 
1582 
1583 	if (elems.ht_cap_elem && elems.ht_info_elem && elems.wmm_param &&
1584 	    !(ifmgd->flags & IEEE80211_STA_TKIP_WEP_USED)) {
1585 		struct sta_info *sta;
1586 		struct ieee80211_supported_band *sband;
1587 		u16 ap_ht_cap_flags;
1588 
1589 		rcu_read_lock();
1590 
1591 		sta = sta_info_get(local, ifmgd->bssid);
1592 		if (!sta) {
1593 			rcu_read_unlock();
1594 			return;
1595 		}
1596 
1597 		sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
1598 
1599 		ieee80211_ht_cap_ie_to_sta_ht_cap(sband,
1600 				elems.ht_cap_elem, &sta->sta.ht_cap);
1601 
1602 		ap_ht_cap_flags = sta->sta.ht_cap.cap;
1603 
1604 		rcu_read_unlock();
1605 
1606 		changed |= ieee80211_enable_ht(sdata, elems.ht_info_elem,
1607 					       ap_ht_cap_flags);
1608 	}
1609 
1610 	if (elems.country_elem) {
1611 		/* Note we are only reviewing this on beacons
1612 		 * for the BSSID we are associated to */
1613 		regulatory_hint_11d(local->hw.wiphy,
1614 			elems.country_elem, elems.country_elem_len);
1615 
1616 		/* TODO: IBSS also needs this */
1617 		if (elems.pwr_constr_elem)
1618 			ieee80211_handle_pwr_constr(sdata,
1619 				le16_to_cpu(mgmt->u.probe_resp.capab_info),
1620 				elems.pwr_constr_elem,
1621 				elems.pwr_constr_elem_len);
1622 	}
1623 
1624 	ieee80211_bss_info_change_notify(sdata, changed);
1625 }
1626 
1627 ieee80211_rx_result ieee80211_sta_rx_mgmt(struct ieee80211_sub_if_data *sdata,
1628 					  struct sk_buff *skb,
1629 					  struct ieee80211_rx_status *rx_status)
1630 {
1631 	struct ieee80211_local *local = sdata->local;
1632 	struct ieee80211_mgmt *mgmt;
1633 	u16 fc;
1634 
1635 	if (skb->len < 24)
1636 		return RX_DROP_MONITOR;
1637 
1638 	mgmt = (struct ieee80211_mgmt *) skb->data;
1639 	fc = le16_to_cpu(mgmt->frame_control);
1640 
1641 	switch (fc & IEEE80211_FCTL_STYPE) {
1642 	case IEEE80211_STYPE_PROBE_REQ:
1643 	case IEEE80211_STYPE_PROBE_RESP:
1644 	case IEEE80211_STYPE_BEACON:
1645 		memcpy(skb->cb, rx_status, sizeof(*rx_status));
1646 	case IEEE80211_STYPE_AUTH:
1647 	case IEEE80211_STYPE_ASSOC_RESP:
1648 	case IEEE80211_STYPE_REASSOC_RESP:
1649 	case IEEE80211_STYPE_DEAUTH:
1650 	case IEEE80211_STYPE_DISASSOC:
1651 		skb_queue_tail(&sdata->u.mgd.skb_queue, skb);
1652 		queue_work(local->hw.workqueue, &sdata->u.mgd.work);
1653 		return RX_QUEUED;
1654 	}
1655 
1656 	return RX_DROP_MONITOR;
1657 }
1658 
1659 static void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
1660 					 struct sk_buff *skb)
1661 {
1662 	struct ieee80211_rx_status *rx_status;
1663 	struct ieee80211_mgmt *mgmt;
1664 	u16 fc;
1665 
1666 	rx_status = (struct ieee80211_rx_status *) skb->cb;
1667 	mgmt = (struct ieee80211_mgmt *) skb->data;
1668 	fc = le16_to_cpu(mgmt->frame_control);
1669 
1670 	switch (fc & IEEE80211_FCTL_STYPE) {
1671 	case IEEE80211_STYPE_PROBE_RESP:
1672 		ieee80211_rx_mgmt_probe_resp(sdata, mgmt, skb->len,
1673 					     rx_status);
1674 		break;
1675 	case IEEE80211_STYPE_BEACON:
1676 		ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len,
1677 					 rx_status);
1678 		break;
1679 	case IEEE80211_STYPE_AUTH:
1680 		ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len);
1681 		break;
1682 	case IEEE80211_STYPE_ASSOC_RESP:
1683 		ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len, 0);
1684 		break;
1685 	case IEEE80211_STYPE_REASSOC_RESP:
1686 		ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len, 1);
1687 		break;
1688 	case IEEE80211_STYPE_DEAUTH:
1689 		ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len);
1690 		break;
1691 	case IEEE80211_STYPE_DISASSOC:
1692 		ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len);
1693 		break;
1694 	}
1695 
1696 	kfree_skb(skb);
1697 }
1698 
1699 static void ieee80211_sta_timer(unsigned long data)
1700 {
1701 	struct ieee80211_sub_if_data *sdata =
1702 		(struct ieee80211_sub_if_data *) data;
1703 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1704 	struct ieee80211_local *local = sdata->local;
1705 
1706 	set_bit(IEEE80211_STA_REQ_RUN, &ifmgd->request);
1707 	queue_work(local->hw.workqueue, &ifmgd->work);
1708 }
1709 
1710 static void ieee80211_sta_reset_auth(struct ieee80211_sub_if_data *sdata)
1711 {
1712 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1713 	struct ieee80211_local *local = sdata->local;
1714 
1715 	if (local->ops->reset_tsf) {
1716 		/* Reset own TSF to allow time synchronization work. */
1717 		local->ops->reset_tsf(local_to_hw(local));
1718 	}
1719 
1720 	ifmgd->wmm_last_param_set = -1; /* allow any WMM update */
1721 
1722 
1723 	if (ifmgd->auth_algs & IEEE80211_AUTH_ALG_OPEN)
1724 		ifmgd->auth_alg = WLAN_AUTH_OPEN;
1725 	else if (ifmgd->auth_algs & IEEE80211_AUTH_ALG_SHARED_KEY)
1726 		ifmgd->auth_alg = WLAN_AUTH_SHARED_KEY;
1727 	else if (ifmgd->auth_algs & IEEE80211_AUTH_ALG_LEAP)
1728 		ifmgd->auth_alg = WLAN_AUTH_LEAP;
1729 	else if (ifmgd->auth_algs & IEEE80211_AUTH_ALG_FT)
1730 		ifmgd->auth_alg = WLAN_AUTH_FT;
1731 	else
1732 		ifmgd->auth_alg = WLAN_AUTH_OPEN;
1733 	ifmgd->auth_transaction = -1;
1734 	ifmgd->flags &= ~IEEE80211_STA_ASSOCIATED;
1735 	ifmgd->assoc_scan_tries = 0;
1736 	ifmgd->direct_probe_tries = 0;
1737 	ifmgd->auth_tries = 0;
1738 	ifmgd->assoc_tries = 0;
1739 	netif_tx_stop_all_queues(sdata->dev);
1740 	netif_carrier_off(sdata->dev);
1741 }
1742 
1743 static int ieee80211_sta_config_auth(struct ieee80211_sub_if_data *sdata)
1744 {
1745 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1746 	struct ieee80211_local *local = sdata->local;
1747 	struct ieee80211_bss *bss;
1748 	u8 *bssid = ifmgd->bssid, *ssid = ifmgd->ssid;
1749 	u8 ssid_len = ifmgd->ssid_len;
1750 	u16 capa_mask = WLAN_CAPABILITY_ESS;
1751 	u16 capa_val = WLAN_CAPABILITY_ESS;
1752 	struct ieee80211_channel *chan = local->oper_channel;
1753 
1754 	if (!(ifmgd->flags & IEEE80211_STA_EXT_SME) &&
1755 	    ifmgd->flags & (IEEE80211_STA_AUTO_SSID_SEL |
1756 			    IEEE80211_STA_AUTO_BSSID_SEL |
1757 			    IEEE80211_STA_AUTO_CHANNEL_SEL)) {
1758 		capa_mask |= WLAN_CAPABILITY_PRIVACY;
1759 		if (sdata->default_key)
1760 			capa_val |= WLAN_CAPABILITY_PRIVACY;
1761 	}
1762 
1763 	if (ifmgd->flags & IEEE80211_STA_AUTO_CHANNEL_SEL)
1764 		chan = NULL;
1765 
1766 	if (ifmgd->flags & IEEE80211_STA_AUTO_BSSID_SEL)
1767 		bssid = NULL;
1768 
1769 	if (ifmgd->flags & IEEE80211_STA_AUTO_SSID_SEL) {
1770 		ssid = NULL;
1771 		ssid_len = 0;
1772 	}
1773 
1774 	bss = (void *)cfg80211_get_bss(local->hw.wiphy, chan,
1775 				       bssid, ssid, ssid_len,
1776 				       capa_mask, capa_val);
1777 
1778 	if (bss) {
1779 		ieee80211_set_freq(sdata, bss->cbss.channel->center_freq);
1780 		if (!(ifmgd->flags & IEEE80211_STA_SSID_SET))
1781 			ieee80211_sta_set_ssid(sdata, bss->ssid,
1782 					       bss->ssid_len);
1783 		ieee80211_sta_set_bssid(sdata, bss->cbss.bssid);
1784 		ieee80211_sta_def_wmm_params(sdata, bss->supp_rates_len,
1785 						    bss->supp_rates);
1786 		if (sdata->u.mgd.mfp == IEEE80211_MFP_REQUIRED)
1787 			sdata->u.mgd.flags |= IEEE80211_STA_MFP_ENABLED;
1788 		else
1789 			sdata->u.mgd.flags &= ~IEEE80211_STA_MFP_ENABLED;
1790 
1791 		/* Send out direct probe if no probe resp was received or
1792 		 * the one we have is outdated
1793 		 */
1794 		if (!bss->last_probe_resp ||
1795 		    time_after(jiffies, bss->last_probe_resp
1796 					+ IEEE80211_SCAN_RESULT_EXPIRE))
1797 			ifmgd->state = IEEE80211_STA_MLME_DIRECT_PROBE;
1798 		else
1799 			ifmgd->state = IEEE80211_STA_MLME_AUTHENTICATE;
1800 
1801 		ieee80211_rx_bss_put(local, bss);
1802 		ieee80211_sta_reset_auth(sdata);
1803 		return 0;
1804 	} else {
1805 		if (ifmgd->assoc_scan_tries < IEEE80211_ASSOC_SCANS_MAX_TRIES) {
1806 			ifmgd->assoc_scan_tries++;
1807 			/* XXX maybe racy? */
1808 			if (local->scan_req)
1809 				return -1;
1810 			memcpy(local->int_scan_req.ssids[0].ssid,
1811 			       ifmgd->ssid, IEEE80211_MAX_SSID_LEN);
1812 			if (ifmgd->flags & IEEE80211_STA_AUTO_SSID_SEL)
1813 				local->int_scan_req.ssids[0].ssid_len = 0;
1814 			else
1815 				local->int_scan_req.ssids[0].ssid_len = ifmgd->ssid_len;
1816 
1817 			if (ieee80211_start_scan(sdata, &local->int_scan_req))
1818 				ieee80211_scan_failed(local);
1819 
1820 			ifmgd->state = IEEE80211_STA_MLME_AUTHENTICATE;
1821 			set_bit(IEEE80211_STA_REQ_AUTH, &ifmgd->request);
1822 		} else {
1823 			ifmgd->assoc_scan_tries = 0;
1824 			ifmgd->state = IEEE80211_STA_MLME_DISABLED;
1825 		}
1826 	}
1827 	return -1;
1828 }
1829 
1830 
1831 static void ieee80211_sta_work(struct work_struct *work)
1832 {
1833 	struct ieee80211_sub_if_data *sdata =
1834 		container_of(work, struct ieee80211_sub_if_data, u.mgd.work);
1835 	struct ieee80211_local *local = sdata->local;
1836 	struct ieee80211_if_managed *ifmgd;
1837 	struct sk_buff *skb;
1838 
1839 	if (!netif_running(sdata->dev))
1840 		return;
1841 
1842 	if (local->sw_scanning || local->hw_scanning)
1843 		return;
1844 
1845 	if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
1846 		return;
1847 	ifmgd = &sdata->u.mgd;
1848 
1849 	while ((skb = skb_dequeue(&ifmgd->skb_queue)))
1850 		ieee80211_sta_rx_queued_mgmt(sdata, skb);
1851 
1852 	if (ifmgd->state != IEEE80211_STA_MLME_DIRECT_PROBE &&
1853 	    ifmgd->state != IEEE80211_STA_MLME_AUTHENTICATE &&
1854 	    ifmgd->state != IEEE80211_STA_MLME_ASSOCIATE &&
1855 	    test_and_clear_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request)) {
1856 		/*
1857 		 * The call to ieee80211_start_scan can fail but ieee80211_request_scan
1858 		 * (which queued ieee80211_sta_work) did not return an error. Thus, call
1859 		 * ieee80211_scan_failed here if ieee80211_start_scan fails in order to
1860 		 * notify the scan requester.
1861 		 */
1862 		if (ieee80211_start_scan(sdata, local->scan_req))
1863 			ieee80211_scan_failed(local);
1864 		return;
1865 	}
1866 
1867 	if (test_and_clear_bit(IEEE80211_STA_REQ_AUTH, &ifmgd->request)) {
1868 		if (ieee80211_sta_config_auth(sdata))
1869 			return;
1870 		clear_bit(IEEE80211_STA_REQ_RUN, &ifmgd->request);
1871 	} else if (!test_and_clear_bit(IEEE80211_STA_REQ_RUN, &ifmgd->request))
1872 		return;
1873 
1874 	switch (ifmgd->state) {
1875 	case IEEE80211_STA_MLME_DISABLED:
1876 		break;
1877 	case IEEE80211_STA_MLME_DIRECT_PROBE:
1878 		ieee80211_direct_probe(sdata);
1879 		break;
1880 	case IEEE80211_STA_MLME_AUTHENTICATE:
1881 		ieee80211_authenticate(sdata);
1882 		break;
1883 	case IEEE80211_STA_MLME_ASSOCIATE:
1884 		ieee80211_associate(sdata);
1885 		break;
1886 	case IEEE80211_STA_MLME_ASSOCIATED:
1887 		ieee80211_associated(sdata);
1888 		break;
1889 	default:
1890 		WARN_ON(1);
1891 		break;
1892 	}
1893 
1894 	if (ieee80211_privacy_mismatch(sdata)) {
1895 		printk(KERN_DEBUG "%s: privacy configuration mismatch and "
1896 		       "mixed-cell disabled - disassociate\n", sdata->dev->name);
1897 
1898 		ieee80211_set_disassoc(sdata, false, true,
1899 					WLAN_REASON_UNSPECIFIED);
1900 	}
1901 }
1902 
1903 static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
1904 {
1905 	if (sdata->vif.type == NL80211_IFTYPE_STATION)
1906 		queue_work(sdata->local->hw.workqueue,
1907 			   &sdata->u.mgd.work);
1908 }
1909 
1910 /* interface setup */
1911 void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
1912 {
1913 	struct ieee80211_if_managed *ifmgd;
1914 
1915 	ifmgd = &sdata->u.mgd;
1916 	INIT_WORK(&ifmgd->work, ieee80211_sta_work);
1917 	INIT_WORK(&ifmgd->chswitch_work, ieee80211_chswitch_work);
1918 	INIT_WORK(&ifmgd->beacon_loss_work, ieee80211_beacon_loss_work);
1919 	setup_timer(&ifmgd->timer, ieee80211_sta_timer,
1920 		    (unsigned long) sdata);
1921 	setup_timer(&ifmgd->chswitch_timer, ieee80211_chswitch_timer,
1922 		    (unsigned long) sdata);
1923 	skb_queue_head_init(&ifmgd->skb_queue);
1924 
1925 	ifmgd->capab = WLAN_CAPABILITY_ESS;
1926 	ifmgd->auth_algs = IEEE80211_AUTH_ALG_OPEN |
1927 		IEEE80211_AUTH_ALG_SHARED_KEY;
1928 	ifmgd->flags |= IEEE80211_STA_CREATE_IBSS |
1929 		IEEE80211_STA_AUTO_BSSID_SEL |
1930 		IEEE80211_STA_AUTO_CHANNEL_SEL;
1931 	if (sdata->local->hw.queues >= 4)
1932 		ifmgd->flags |= IEEE80211_STA_WMM_ENABLED;
1933 }
1934 
1935 /* configuration hooks */
1936 void ieee80211_sta_req_auth(struct ieee80211_sub_if_data *sdata)
1937 {
1938 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1939 	struct ieee80211_local *local = sdata->local;
1940 
1941 	if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
1942 		return;
1943 
1944 	if ((ifmgd->flags & (IEEE80211_STA_BSSID_SET |
1945 			     IEEE80211_STA_AUTO_BSSID_SEL)) &&
1946 	    (ifmgd->flags & (IEEE80211_STA_SSID_SET |
1947 			     IEEE80211_STA_AUTO_SSID_SEL))) {
1948 
1949 		if (ifmgd->state == IEEE80211_STA_MLME_ASSOCIATED)
1950 			ieee80211_set_disassoc(sdata, true, true,
1951 					       WLAN_REASON_DEAUTH_LEAVING);
1952 
1953 		if (!(ifmgd->flags & IEEE80211_STA_EXT_SME) ||
1954 		    ifmgd->state != IEEE80211_STA_MLME_ASSOCIATE)
1955 			set_bit(IEEE80211_STA_REQ_AUTH, &ifmgd->request);
1956 		else if (ifmgd->flags & IEEE80211_STA_EXT_SME)
1957 			set_bit(IEEE80211_STA_REQ_RUN, &ifmgd->request);
1958 		queue_work(local->hw.workqueue, &ifmgd->work);
1959 	}
1960 }
1961 
1962 int ieee80211_sta_commit(struct ieee80211_sub_if_data *sdata)
1963 {
1964 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1965 
1966 	if (ifmgd->ssid_len)
1967 		ifmgd->flags |= IEEE80211_STA_SSID_SET;
1968 	else
1969 		ifmgd->flags &= ~IEEE80211_STA_SSID_SET;
1970 
1971 	return 0;
1972 }
1973 
1974 int ieee80211_sta_set_ssid(struct ieee80211_sub_if_data *sdata, char *ssid, size_t len)
1975 {
1976 	struct ieee80211_if_managed *ifmgd;
1977 
1978 	if (len > IEEE80211_MAX_SSID_LEN)
1979 		return -EINVAL;
1980 
1981 	ifmgd = &sdata->u.mgd;
1982 
1983 	if (ifmgd->ssid_len != len || memcmp(ifmgd->ssid, ssid, len) != 0) {
1984 		/*
1985 		 * Do not use reassociation if SSID is changed (different ESS).
1986 		 */
1987 		ifmgd->flags &= ~IEEE80211_STA_PREV_BSSID_SET;
1988 		memset(ifmgd->ssid, 0, sizeof(ifmgd->ssid));
1989 		memcpy(ifmgd->ssid, ssid, len);
1990 		ifmgd->ssid_len = len;
1991 	}
1992 
1993 	return ieee80211_sta_commit(sdata);
1994 }
1995 
1996 int ieee80211_sta_get_ssid(struct ieee80211_sub_if_data *sdata, char *ssid, size_t *len)
1997 {
1998 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1999 	memcpy(ssid, ifmgd->ssid, ifmgd->ssid_len);
2000 	*len = ifmgd->ssid_len;
2001 	return 0;
2002 }
2003 
2004 int ieee80211_sta_set_bssid(struct ieee80211_sub_if_data *sdata, u8 *bssid)
2005 {
2006 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2007 
2008 	if (is_valid_ether_addr(bssid)) {
2009 		memcpy(ifmgd->bssid, bssid, ETH_ALEN);
2010 		ifmgd->flags |= IEEE80211_STA_BSSID_SET;
2011 	} else {
2012 		memset(ifmgd->bssid, 0, ETH_ALEN);
2013 		ifmgd->flags &= ~IEEE80211_STA_BSSID_SET;
2014 	}
2015 
2016 	if (netif_running(sdata->dev)) {
2017 		if (ieee80211_if_config(sdata, IEEE80211_IFCC_BSSID)) {
2018 			printk(KERN_DEBUG "%s: Failed to config new BSSID to "
2019 			       "the low-level driver\n", sdata->dev->name);
2020 		}
2021 	}
2022 
2023 	return ieee80211_sta_commit(sdata);
2024 }
2025 
2026 int ieee80211_sta_set_extra_ie(struct ieee80211_sub_if_data *sdata,
2027 			       const char *ie, size_t len)
2028 {
2029 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2030 
2031 	kfree(ifmgd->extra_ie);
2032 	if (len == 0) {
2033 		ifmgd->extra_ie = NULL;
2034 		ifmgd->extra_ie_len = 0;
2035 		return 0;
2036 	}
2037 	ifmgd->extra_ie = kmalloc(len, GFP_KERNEL);
2038 	if (!ifmgd->extra_ie) {
2039 		ifmgd->extra_ie_len = 0;
2040 		return -ENOMEM;
2041 	}
2042 	memcpy(ifmgd->extra_ie, ie, len);
2043 	ifmgd->extra_ie_len = len;
2044 	return 0;
2045 }
2046 
2047 int ieee80211_sta_deauthenticate(struct ieee80211_sub_if_data *sdata, u16 reason)
2048 {
2049 	printk(KERN_DEBUG "%s: deauthenticating by local choice (reason=%d)\n",
2050 	       sdata->dev->name, reason);
2051 
2052 	if (sdata->vif.type != NL80211_IFTYPE_STATION)
2053 		return -EINVAL;
2054 
2055 	ieee80211_set_disassoc(sdata, true, true, reason);
2056 	return 0;
2057 }
2058 
2059 int ieee80211_sta_disassociate(struct ieee80211_sub_if_data *sdata, u16 reason)
2060 {
2061 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2062 
2063 	printk(KERN_DEBUG "%s: disassociating by local choice (reason=%d)\n",
2064 	       sdata->dev->name, reason);
2065 
2066 	if (sdata->vif.type != NL80211_IFTYPE_STATION)
2067 		return -EINVAL;
2068 
2069 	if (!(ifmgd->flags & IEEE80211_STA_ASSOCIATED))
2070 		return -ENOLINK;
2071 
2072 	ieee80211_set_disassoc(sdata, false, true, reason);
2073 	return 0;
2074 }
2075 
2076 /* scan finished notification */
2077 void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local)
2078 {
2079 	struct ieee80211_sub_if_data *sdata = local->scan_sdata;
2080 
2081 	/* Restart STA timers */
2082 	rcu_read_lock();
2083 	list_for_each_entry_rcu(sdata, &local->interfaces, list)
2084 		ieee80211_restart_sta_timer(sdata);
2085 	rcu_read_unlock();
2086 }
2087 
2088 void ieee80211_dynamic_ps_disable_work(struct work_struct *work)
2089 {
2090 	struct ieee80211_local *local =
2091 		container_of(work, struct ieee80211_local,
2092 			     dynamic_ps_disable_work);
2093 
2094 	if (local->hw.conf.flags & IEEE80211_CONF_PS) {
2095 		local->hw.conf.flags &= ~IEEE80211_CONF_PS;
2096 		ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
2097 	}
2098 
2099 	ieee80211_wake_queues_by_reason(&local->hw,
2100 					IEEE80211_QUEUE_STOP_REASON_PS);
2101 }
2102 
2103 void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
2104 {
2105 	struct ieee80211_local *local =
2106 		container_of(work, struct ieee80211_local,
2107 			     dynamic_ps_enable_work);
2108 	struct ieee80211_sub_if_data *sdata = local->scan_sdata;
2109 
2110 	if (local->hw.conf.flags & IEEE80211_CONF_PS)
2111 		return;
2112 
2113 	if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
2114 		ieee80211_send_nullfunc(local, sdata, 1);
2115 
2116 	local->hw.conf.flags |= IEEE80211_CONF_PS;
2117 	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
2118 }
2119 
2120 void ieee80211_dynamic_ps_timer(unsigned long data)
2121 {
2122 	struct ieee80211_local *local = (void *) data;
2123 
2124 	queue_work(local->hw.workqueue, &local->dynamic_ps_enable_work);
2125 }
2126 
2127 void ieee80211_send_nullfunc(struct ieee80211_local *local,
2128 			     struct ieee80211_sub_if_data *sdata,
2129 			     int powersave)
2130 {
2131 	struct sk_buff *skb;
2132 	struct ieee80211_hdr *nullfunc;
2133 	__le16 fc;
2134 
2135 	if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
2136 		return;
2137 
2138 	skb = dev_alloc_skb(local->hw.extra_tx_headroom + 24);
2139 	if (!skb) {
2140 		printk(KERN_DEBUG "%s: failed to allocate buffer for nullfunc "
2141 		       "frame\n", sdata->dev->name);
2142 		return;
2143 	}
2144 	skb_reserve(skb, local->hw.extra_tx_headroom);
2145 
2146 	nullfunc = (struct ieee80211_hdr *) skb_put(skb, 24);
2147 	memset(nullfunc, 0, 24);
2148 	fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC |
2149 			 IEEE80211_FCTL_TODS);
2150 	if (powersave)
2151 		fc |= cpu_to_le16(IEEE80211_FCTL_PM);
2152 	nullfunc->frame_control = fc;
2153 	memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN);
2154 	memcpy(nullfunc->addr2, sdata->dev->dev_addr, ETH_ALEN);
2155 	memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN);
2156 
2157 	ieee80211_tx_skb(sdata, skb, 0);
2158 }
2159