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