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