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