]> git.karo-electronics.de Git - karo-tx-linux.git/blob - net/mac80211/work.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
[karo-tx-linux.git] / net / mac80211 / work.c
1 /*
2  * mac80211 work implementation
3  *
4  * Copyright 2003-2008, Jouni Malinen <j@w1.fi>
5  * Copyright 2004, Instant802 Networks, Inc.
6  * Copyright 2005, Devicescape Software, Inc.
7  * Copyright 2006-2007  Jiri Benc <jbenc@suse.cz>
8  * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
9  * Copyright 2009, Johannes Berg <johannes@sipsolutions.net>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  */
15
16 #include <linux/delay.h>
17 #include <linux/if_ether.h>
18 #include <linux/skbuff.h>
19 #include <linux/if_arp.h>
20 #include <linux/etherdevice.h>
21 #include <linux/crc32.h>
22 #include <linux/slab.h>
23 #include <net/mac80211.h>
24 #include <asm/unaligned.h>
25
26 #include "ieee80211_i.h"
27 #include "rate.h"
28 #include "driver-ops.h"
29
30 #define IEEE80211_AUTH_TIMEOUT (HZ / 5)
31 #define IEEE80211_AUTH_MAX_TRIES 3
32 #define IEEE80211_ASSOC_TIMEOUT (HZ / 5)
33 #define IEEE80211_ASSOC_MAX_TRIES 3
34
35 enum work_action {
36         WORK_ACT_MISMATCH,
37         WORK_ACT_NONE,
38         WORK_ACT_TIMEOUT,
39         WORK_ACT_DONE,
40 };
41
42
43 /* utils */
44 static inline void ASSERT_WORK_MTX(struct ieee80211_local *local)
45 {
46         lockdep_assert_held(&local->mtx);
47 }
48
49 /*
50  * We can have multiple work items (and connection probing)
51  * scheduling this timer, but we need to take care to only
52  * reschedule it when it should fire _earlier_ than it was
53  * asked for before, or if it's not pending right now. This
54  * function ensures that. Note that it then is required to
55  * run this function for all timeouts after the first one
56  * has happened -- the work that runs from this timer will
57  * do that.
58  */
59 static void run_again(struct ieee80211_local *local,
60                       unsigned long timeout)
61 {
62         ASSERT_WORK_MTX(local);
63
64         if (!timer_pending(&local->work_timer) ||
65             time_before(timeout, local->work_timer.expires))
66                 mod_timer(&local->work_timer, timeout);
67 }
68
69 void free_work(struct ieee80211_work *wk)
70 {
71         kfree_rcu(wk, rcu_head);
72 }
73
74 static int ieee80211_compatible_rates(const u8 *supp_rates, int supp_rates_len,
75                                       struct ieee80211_supported_band *sband,
76                                       u32 *rates)
77 {
78         int i, j, count;
79         *rates = 0;
80         count = 0;
81         for (i = 0; i < supp_rates_len; i++) {
82                 int rate = (supp_rates[i] & 0x7F) * 5;
83
84                 for (j = 0; j < sband->n_bitrates; j++)
85                         if (sband->bitrates[j].bitrate == rate) {
86                                 *rates |= BIT(j);
87                                 count++;
88                                 break;
89                         }
90         }
91
92         return count;
93 }
94
95 /* frame sending functions */
96
97 static void ieee80211_add_ht_ie(struct sk_buff *skb, const u8 *ht_info_ie,
98                                 struct ieee80211_supported_band *sband,
99                                 struct ieee80211_channel *channel,
100                                 enum ieee80211_smps_mode smps)
101 {
102         struct ieee80211_ht_info *ht_info;
103         u8 *pos;
104         u32 flags = channel->flags;
105         u16 cap = sband->ht_cap.cap;
106
107         if (!sband->ht_cap.ht_supported)
108                 return;
109
110         if (!ht_info_ie)
111                 return;
112
113         if (ht_info_ie[1] < sizeof(struct ieee80211_ht_info))
114                 return;
115
116         ht_info = (struct ieee80211_ht_info *)(ht_info_ie + 2);
117
118         /* determine capability flags */
119
120         switch (ht_info->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
121         case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
122                 if (flags & IEEE80211_CHAN_NO_HT40PLUS) {
123                         cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
124                         cap &= ~IEEE80211_HT_CAP_SGI_40;
125                 }
126                 break;
127         case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
128                 if (flags & IEEE80211_CHAN_NO_HT40MINUS) {
129                         cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
130                         cap &= ~IEEE80211_HT_CAP_SGI_40;
131                 }
132                 break;
133         }
134
135         /* set SM PS mode properly */
136         cap &= ~IEEE80211_HT_CAP_SM_PS;
137         switch (smps) {
138         case IEEE80211_SMPS_AUTOMATIC:
139         case IEEE80211_SMPS_NUM_MODES:
140                 WARN_ON(1);
141         case IEEE80211_SMPS_OFF:
142                 cap |= WLAN_HT_CAP_SM_PS_DISABLED <<
143                         IEEE80211_HT_CAP_SM_PS_SHIFT;
144                 break;
145         case IEEE80211_SMPS_STATIC:
146                 cap |= WLAN_HT_CAP_SM_PS_STATIC <<
147                         IEEE80211_HT_CAP_SM_PS_SHIFT;
148                 break;
149         case IEEE80211_SMPS_DYNAMIC:
150                 cap |= WLAN_HT_CAP_SM_PS_DYNAMIC <<
151                         IEEE80211_HT_CAP_SM_PS_SHIFT;
152                 break;
153         }
154
155         /* reserve and fill IE */
156         pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
157         ieee80211_ie_build_ht_cap(pos, sband, cap);
158 }
159
160 static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata,
161                                  struct ieee80211_work *wk)
162 {
163         struct ieee80211_local *local = sdata->local;
164         struct sk_buff *skb;
165         struct ieee80211_mgmt *mgmt;
166         u8 *pos, qos_info;
167         size_t offset = 0, noffset;
168         int i, count, rates_len, supp_rates_len;
169         u16 capab;
170         struct ieee80211_supported_band *sband;
171         u32 rates = 0;
172
173         sband = local->hw.wiphy->bands[wk->chan->band];
174
175         if (wk->assoc.supp_rates_len) {
176                 /*
177                  * Get all rates supported by the device and the AP as
178                  * some APs don't like getting a superset of their rates
179                  * in the association request (e.g. D-Link DAP 1353 in
180                  * b-only mode)...
181                  */
182                 rates_len = ieee80211_compatible_rates(wk->assoc.supp_rates,
183                                                        wk->assoc.supp_rates_len,
184                                                        sband, &rates);
185         } else {
186                 /*
187                  * In case AP not provide any supported rates information
188                  * before association, we send information element(s) with
189                  * all rates that we support.
190                  */
191                 rates = ~0;
192                 rates_len = sband->n_bitrates;
193         }
194
195         skb = alloc_skb(local->hw.extra_tx_headroom +
196                         sizeof(*mgmt) + /* bit too much but doesn't matter */
197                         2 + wk->assoc.ssid_len + /* SSID */
198                         4 + rates_len + /* (extended) rates */
199                         4 + /* power capability */
200                         2 + 2 * sband->n_channels + /* supported channels */
201                         2 + sizeof(struct ieee80211_ht_cap) + /* HT */
202                         wk->ie_len + /* extra IEs */
203                         9, /* WMM */
204                         GFP_KERNEL);
205         if (!skb)
206                 return;
207
208         skb_reserve(skb, local->hw.extra_tx_headroom);
209
210         capab = WLAN_CAPABILITY_ESS;
211
212         if (sband->band == IEEE80211_BAND_2GHZ) {
213                 if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE))
214                         capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME;
215                 if (!(local->hw.flags & IEEE80211_HW_2GHZ_SHORT_PREAMBLE_INCAPABLE))
216                         capab |= WLAN_CAPABILITY_SHORT_PREAMBLE;
217         }
218
219         if (wk->assoc.capability & WLAN_CAPABILITY_PRIVACY)
220                 capab |= WLAN_CAPABILITY_PRIVACY;
221
222         if ((wk->assoc.capability & WLAN_CAPABILITY_SPECTRUM_MGMT) &&
223             (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT))
224                 capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
225
226         mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
227         memset(mgmt, 0, 24);
228         memcpy(mgmt->da, wk->filter_ta, ETH_ALEN);
229         memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
230         memcpy(mgmt->bssid, wk->filter_ta, ETH_ALEN);
231
232         if (!is_zero_ether_addr(wk->assoc.prev_bssid)) {
233                 skb_put(skb, 10);
234                 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
235                                                   IEEE80211_STYPE_REASSOC_REQ);
236                 mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab);
237                 mgmt->u.reassoc_req.listen_interval =
238                                 cpu_to_le16(local->hw.conf.listen_interval);
239                 memcpy(mgmt->u.reassoc_req.current_ap, wk->assoc.prev_bssid,
240                        ETH_ALEN);
241         } else {
242                 skb_put(skb, 4);
243                 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
244                                                   IEEE80211_STYPE_ASSOC_REQ);
245                 mgmt->u.assoc_req.capab_info = cpu_to_le16(capab);
246                 mgmt->u.assoc_req.listen_interval =
247                                 cpu_to_le16(local->hw.conf.listen_interval);
248         }
249
250         /* SSID */
251         pos = skb_put(skb, 2 + wk->assoc.ssid_len);
252         *pos++ = WLAN_EID_SSID;
253         *pos++ = wk->assoc.ssid_len;
254         memcpy(pos, wk->assoc.ssid, wk->assoc.ssid_len);
255
256         /* add all rates which were marked to be used above */
257         supp_rates_len = rates_len;
258         if (supp_rates_len > 8)
259                 supp_rates_len = 8;
260
261         pos = skb_put(skb, supp_rates_len + 2);
262         *pos++ = WLAN_EID_SUPP_RATES;
263         *pos++ = supp_rates_len;
264
265         count = 0;
266         for (i = 0; i < sband->n_bitrates; i++) {
267                 if (BIT(i) & rates) {
268                         int rate = sband->bitrates[i].bitrate;
269                         *pos++ = (u8) (rate / 5);
270                         if (++count == 8)
271                                 break;
272                 }
273         }
274
275         if (rates_len > count) {
276                 pos = skb_put(skb, rates_len - count + 2);
277                 *pos++ = WLAN_EID_EXT_SUPP_RATES;
278                 *pos++ = rates_len - count;
279
280                 for (i++; i < sband->n_bitrates; i++) {
281                         if (BIT(i) & rates) {
282                                 int rate = sband->bitrates[i].bitrate;
283                                 *pos++ = (u8) (rate / 5);
284                         }
285                 }
286         }
287
288         if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT) {
289                 /* 1. power capabilities */
290                 pos = skb_put(skb, 4);
291                 *pos++ = WLAN_EID_PWR_CAPABILITY;
292                 *pos++ = 2;
293                 *pos++ = 0; /* min tx power */
294                 *pos++ = wk->chan->max_power; /* max tx power */
295
296                 /* 2. supported channels */
297                 /* TODO: get this in reg domain format */
298                 pos = skb_put(skb, 2 * sband->n_channels + 2);
299                 *pos++ = WLAN_EID_SUPPORTED_CHANNELS;
300                 *pos++ = 2 * sband->n_channels;
301                 for (i = 0; i < sband->n_channels; i++) {
302                         *pos++ = ieee80211_frequency_to_channel(
303                                         sband->channels[i].center_freq);
304                         *pos++ = 1; /* one channel in the subband*/
305                 }
306         }
307
308         /* if present, add any custom IEs that go before HT */
309         if (wk->ie_len && wk->ie) {
310                 static const u8 before_ht[] = {
311                         WLAN_EID_SSID,
312                         WLAN_EID_SUPP_RATES,
313                         WLAN_EID_EXT_SUPP_RATES,
314                         WLAN_EID_PWR_CAPABILITY,
315                         WLAN_EID_SUPPORTED_CHANNELS,
316                         WLAN_EID_RSN,
317                         WLAN_EID_QOS_CAPA,
318                         WLAN_EID_RRM_ENABLED_CAPABILITIES,
319                         WLAN_EID_MOBILITY_DOMAIN,
320                         WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
321                 };
322                 noffset = ieee80211_ie_split(wk->ie, wk->ie_len,
323                                              before_ht, ARRAY_SIZE(before_ht),
324                                              offset);
325                 pos = skb_put(skb, noffset - offset);
326                 memcpy(pos, wk->ie + offset, noffset - offset);
327                 offset = noffset;
328         }
329
330         if (wk->assoc.use_11n && wk->assoc.wmm_used &&
331             local->hw.queues >= 4)
332                 ieee80211_add_ht_ie(skb, wk->assoc.ht_information_ie,
333                                     sband, wk->chan, wk->assoc.smps);
334
335         /* if present, add any custom non-vendor IEs that go after HT */
336         if (wk->ie_len && wk->ie) {
337                 noffset = ieee80211_ie_split_vendor(wk->ie, wk->ie_len,
338                                                     offset);
339                 pos = skb_put(skb, noffset - offset);
340                 memcpy(pos, wk->ie + offset, noffset - offset);
341                 offset = noffset;
342         }
343
344         if (wk->assoc.wmm_used && local->hw.queues >= 4) {
345                 if (wk->assoc.uapsd_used) {
346                         qos_info = local->uapsd_queues;
347                         qos_info |= (local->uapsd_max_sp_len <<
348                                      IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT);
349                 } else {
350                         qos_info = 0;
351                 }
352
353                 pos = skb_put(skb, 9);
354                 *pos++ = WLAN_EID_VENDOR_SPECIFIC;
355                 *pos++ = 7; /* len */
356                 *pos++ = 0x00; /* Microsoft OUI 00:50:F2 */
357                 *pos++ = 0x50;
358                 *pos++ = 0xf2;
359                 *pos++ = 2; /* WME */
360                 *pos++ = 0; /* WME info */
361                 *pos++ = 1; /* WME ver */
362                 *pos++ = qos_info;
363         }
364
365         /* add any remaining custom (i.e. vendor specific here) IEs */
366         if (wk->ie_len && wk->ie) {
367                 noffset = wk->ie_len;
368                 pos = skb_put(skb, noffset - offset);
369                 memcpy(pos, wk->ie + offset, noffset - offset);
370         }
371
372         IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
373         ieee80211_tx_skb(sdata, skb);
374 }
375
376 static void ieee80211_remove_auth_bss(struct ieee80211_local *local,
377                                       struct ieee80211_work *wk)
378 {
379         struct cfg80211_bss *cbss;
380         u16 capa_val = WLAN_CAPABILITY_ESS;
381
382         if (wk->probe_auth.privacy)
383                 capa_val |= WLAN_CAPABILITY_PRIVACY;
384
385         cbss = cfg80211_get_bss(local->hw.wiphy, wk->chan, wk->filter_ta,
386                                 wk->probe_auth.ssid, wk->probe_auth.ssid_len,
387                                 WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_PRIVACY,
388                                 capa_val);
389         if (!cbss)
390                 return;
391
392         cfg80211_unlink_bss(local->hw.wiphy, cbss);
393         cfg80211_put_bss(cbss);
394 }
395
396 static enum work_action __must_check
397 ieee80211_direct_probe(struct ieee80211_work *wk)
398 {
399         struct ieee80211_sub_if_data *sdata = wk->sdata;
400         struct ieee80211_local *local = sdata->local;
401
402         if (!wk->probe_auth.synced) {
403                 int ret = drv_tx_sync(local, sdata, wk->filter_ta,
404                                       IEEE80211_TX_SYNC_AUTH);
405                 if (ret)
406                         return WORK_ACT_TIMEOUT;
407         }
408         wk->probe_auth.synced = true;
409
410         wk->probe_auth.tries++;
411         if (wk->probe_auth.tries > IEEE80211_AUTH_MAX_TRIES) {
412                 printk(KERN_DEBUG "%s: direct probe to %pM timed out\n",
413                        sdata->name, wk->filter_ta);
414
415                 /*
416                  * Most likely AP is not in the range so remove the
417                  * bss struct for that AP.
418                  */
419                 ieee80211_remove_auth_bss(local, wk);
420
421                 return WORK_ACT_TIMEOUT;
422         }
423
424         printk(KERN_DEBUG "%s: direct probe to %pM (try %d/%i)\n",
425                sdata->name, wk->filter_ta, wk->probe_auth.tries,
426                IEEE80211_AUTH_MAX_TRIES);
427
428         /*
429          * Direct probe is sent to broadcast address as some APs
430          * will not answer to direct packet in unassociated state.
431          */
432         ieee80211_send_probe_req(sdata, NULL, wk->probe_auth.ssid,
433                                  wk->probe_auth.ssid_len, NULL, 0,
434                                  (u32) -1, true, false);
435
436         wk->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
437         run_again(local, wk->timeout);
438
439         return WORK_ACT_NONE;
440 }
441
442
443 static enum work_action __must_check
444 ieee80211_authenticate(struct ieee80211_work *wk)
445 {
446         struct ieee80211_sub_if_data *sdata = wk->sdata;
447         struct ieee80211_local *local = sdata->local;
448
449         if (!wk->probe_auth.synced) {
450                 int ret = drv_tx_sync(local, sdata, wk->filter_ta,
451                                       IEEE80211_TX_SYNC_AUTH);
452                 if (ret)
453                         return WORK_ACT_TIMEOUT;
454         }
455         wk->probe_auth.synced = true;
456
457         wk->probe_auth.tries++;
458         if (wk->probe_auth.tries > IEEE80211_AUTH_MAX_TRIES) {
459                 printk(KERN_DEBUG "%s: authentication with %pM"
460                        " timed out\n", sdata->name, wk->filter_ta);
461
462                 /*
463                  * Most likely AP is not in the range so remove the
464                  * bss struct for that AP.
465                  */
466                 ieee80211_remove_auth_bss(local, wk);
467
468                 return WORK_ACT_TIMEOUT;
469         }
470
471         printk(KERN_DEBUG "%s: authenticate with %pM (try %d)\n",
472                sdata->name, wk->filter_ta, wk->probe_auth.tries);
473
474         ieee80211_send_auth(sdata, 1, wk->probe_auth.algorithm, wk->ie,
475                             wk->ie_len, wk->filter_ta, NULL, 0, 0);
476         wk->probe_auth.transaction = 2;
477
478         wk->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
479         run_again(local, wk->timeout);
480
481         return WORK_ACT_NONE;
482 }
483
484 static enum work_action __must_check
485 ieee80211_associate(struct ieee80211_work *wk)
486 {
487         struct ieee80211_sub_if_data *sdata = wk->sdata;
488         struct ieee80211_local *local = sdata->local;
489
490         if (!wk->assoc.synced) {
491                 int ret = drv_tx_sync(local, sdata, wk->filter_ta,
492                                       IEEE80211_TX_SYNC_ASSOC);
493                 if (ret)
494                         return WORK_ACT_TIMEOUT;
495         }
496         wk->assoc.synced = true;
497
498         wk->assoc.tries++;
499         if (wk->assoc.tries > IEEE80211_ASSOC_MAX_TRIES) {
500                 printk(KERN_DEBUG "%s: association with %pM"
501                        " timed out\n",
502                        sdata->name, wk->filter_ta);
503
504                 /*
505                  * Most likely AP is not in the range so remove the
506                  * bss struct for that AP.
507                  */
508                 if (wk->assoc.bss)
509                         cfg80211_unlink_bss(local->hw.wiphy, wk->assoc.bss);
510
511                 return WORK_ACT_TIMEOUT;
512         }
513
514         printk(KERN_DEBUG "%s: associate with %pM (try %d)\n",
515                sdata->name, wk->filter_ta, wk->assoc.tries);
516         ieee80211_send_assoc(sdata, wk);
517
518         wk->timeout = jiffies + IEEE80211_ASSOC_TIMEOUT;
519         run_again(local, wk->timeout);
520
521         return WORK_ACT_NONE;
522 }
523
524 static enum work_action __must_check
525 ieee80211_remain_on_channel_timeout(struct ieee80211_work *wk)
526 {
527         /*
528          * First time we run, do nothing -- the generic code will
529          * have switched to the right channel etc.
530          */
531         if (!wk->started) {
532                 wk->timeout = jiffies + msecs_to_jiffies(wk->remain.duration);
533
534                 cfg80211_ready_on_channel(wk->sdata->dev, (unsigned long) wk,
535                                           wk->chan, wk->chan_type,
536                                           wk->remain.duration, GFP_KERNEL);
537
538                 return WORK_ACT_NONE;
539         }
540
541         return WORK_ACT_TIMEOUT;
542 }
543
544 static enum work_action __must_check
545 ieee80211_offchannel_tx(struct ieee80211_work *wk)
546 {
547         if (!wk->started) {
548                 wk->timeout = jiffies + msecs_to_jiffies(wk->offchan_tx.wait);
549
550                 /*
551                  * After this, offchan_tx.frame remains but now is no
552                  * longer a valid pointer -- we still need it as the
553                  * cookie for canceling this work/status matching.
554                  */
555                 ieee80211_tx_skb(wk->sdata, wk->offchan_tx.frame);
556
557                 return WORK_ACT_NONE;
558         }
559
560         return WORK_ACT_TIMEOUT;
561 }
562
563 static enum work_action __must_check
564 ieee80211_assoc_beacon_wait(struct ieee80211_work *wk)
565 {
566         if (wk->started)
567                 return WORK_ACT_TIMEOUT;
568
569         /*
570          * Wait up to one beacon interval ...
571          * should this be more if we miss one?
572          */
573         printk(KERN_DEBUG "%s: waiting for beacon from %pM\n",
574                wk->sdata->name, wk->filter_ta);
575         wk->timeout = TU_TO_EXP_TIME(wk->assoc.bss->beacon_interval);
576         return WORK_ACT_NONE;
577 }
578
579 static void ieee80211_auth_challenge(struct ieee80211_work *wk,
580                                      struct ieee80211_mgmt *mgmt,
581                                      size_t len)
582 {
583         struct ieee80211_sub_if_data *sdata = wk->sdata;
584         u8 *pos;
585         struct ieee802_11_elems elems;
586
587         pos = mgmt->u.auth.variable;
588         ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
589         if (!elems.challenge)
590                 return;
591         ieee80211_send_auth(sdata, 3, wk->probe_auth.algorithm,
592                             elems.challenge - 2, elems.challenge_len + 2,
593                             wk->filter_ta, wk->probe_auth.key,
594                             wk->probe_auth.key_len, wk->probe_auth.key_idx);
595         wk->probe_auth.transaction = 4;
596 }
597
598 static enum work_action __must_check
599 ieee80211_rx_mgmt_auth(struct ieee80211_work *wk,
600                        struct ieee80211_mgmt *mgmt, size_t len)
601 {
602         u16 auth_alg, auth_transaction, status_code;
603
604         if (wk->type != IEEE80211_WORK_AUTH)
605                 return WORK_ACT_MISMATCH;
606
607         if (len < 24 + 6)
608                 return WORK_ACT_NONE;
609
610         auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
611         auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
612         status_code = le16_to_cpu(mgmt->u.auth.status_code);
613
614         if (auth_alg != wk->probe_auth.algorithm ||
615             auth_transaction != wk->probe_auth.transaction)
616                 return WORK_ACT_NONE;
617
618         if (status_code != WLAN_STATUS_SUCCESS) {
619                 printk(KERN_DEBUG "%s: %pM denied authentication (status %d)\n",
620                        wk->sdata->name, mgmt->sa, status_code);
621                 return WORK_ACT_DONE;
622         }
623
624         switch (wk->probe_auth.algorithm) {
625         case WLAN_AUTH_OPEN:
626         case WLAN_AUTH_LEAP:
627         case WLAN_AUTH_FT:
628                 break;
629         case WLAN_AUTH_SHARED_KEY:
630                 if (wk->probe_auth.transaction != 4) {
631                         ieee80211_auth_challenge(wk, mgmt, len);
632                         /* need another frame */
633                         return WORK_ACT_NONE;
634                 }
635                 break;
636         default:
637                 WARN_ON(1);
638                 return WORK_ACT_NONE;
639         }
640
641         printk(KERN_DEBUG "%s: authenticated\n", wk->sdata->name);
642         return WORK_ACT_DONE;
643 }
644
645 static enum work_action __must_check
646 ieee80211_rx_mgmt_assoc_resp(struct ieee80211_work *wk,
647                              struct ieee80211_mgmt *mgmt, size_t len,
648                              bool reassoc)
649 {
650         struct ieee80211_sub_if_data *sdata = wk->sdata;
651         struct ieee80211_local *local = sdata->local;
652         u16 capab_info, status_code, aid;
653         struct ieee802_11_elems elems;
654         u8 *pos;
655
656         if (wk->type != IEEE80211_WORK_ASSOC)
657                 return WORK_ACT_MISMATCH;
658
659         /*
660          * AssocResp and ReassocResp have identical structure, so process both
661          * of them in this function.
662          */
663
664         if (len < 24 + 6)
665                 return WORK_ACT_NONE;
666
667         capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
668         status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code);
669         aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
670
671         printk(KERN_DEBUG "%s: RX %sssocResp from %pM (capab=0x%x "
672                "status=%d aid=%d)\n",
673                sdata->name, reassoc ? "Rea" : "A", mgmt->sa,
674                capab_info, status_code, (u16)(aid & ~(BIT(15) | BIT(14))));
675
676         pos = mgmt->u.assoc_resp.variable;
677         ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), &elems);
678
679         if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY &&
680             elems.timeout_int && elems.timeout_int_len == 5 &&
681             elems.timeout_int[0] == WLAN_TIMEOUT_ASSOC_COMEBACK) {
682                 u32 tu, ms;
683                 tu = get_unaligned_le32(elems.timeout_int + 1);
684                 ms = tu * 1024 / 1000;
685                 printk(KERN_DEBUG "%s: %pM rejected association temporarily; "
686                        "comeback duration %u TU (%u ms)\n",
687                        sdata->name, mgmt->sa, tu, ms);
688                 wk->timeout = jiffies + msecs_to_jiffies(ms);
689                 if (ms > IEEE80211_ASSOC_TIMEOUT)
690                         run_again(local, wk->timeout);
691                 return WORK_ACT_NONE;
692         }
693
694         if (status_code != WLAN_STATUS_SUCCESS)
695                 printk(KERN_DEBUG "%s: %pM denied association (code=%d)\n",
696                        sdata->name, mgmt->sa, status_code);
697         else
698                 printk(KERN_DEBUG "%s: associated\n", sdata->name);
699
700         return WORK_ACT_DONE;
701 }
702
703 static enum work_action __must_check
704 ieee80211_rx_mgmt_probe_resp(struct ieee80211_work *wk,
705                              struct ieee80211_mgmt *mgmt, size_t len,
706                              struct ieee80211_rx_status *rx_status)
707 {
708         struct ieee80211_sub_if_data *sdata = wk->sdata;
709         struct ieee80211_local *local = sdata->local;
710         size_t baselen;
711
712         ASSERT_WORK_MTX(local);
713
714         if (wk->type != IEEE80211_WORK_DIRECT_PROBE)
715                 return WORK_ACT_MISMATCH;
716
717         if (len < 24 + 12)
718                 return WORK_ACT_NONE;
719
720         baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
721         if (baselen > len)
722                 return WORK_ACT_NONE;
723
724         printk(KERN_DEBUG "%s: direct probe responded\n", sdata->name);
725         return WORK_ACT_DONE;
726 }
727
728 static enum work_action __must_check
729 ieee80211_rx_mgmt_beacon(struct ieee80211_work *wk,
730                          struct ieee80211_mgmt *mgmt, size_t len)
731 {
732         struct ieee80211_sub_if_data *sdata = wk->sdata;
733         struct ieee80211_local *local = sdata->local;
734
735         ASSERT_WORK_MTX(local);
736
737         if (wk->type != IEEE80211_WORK_ASSOC_BEACON_WAIT)
738                 return WORK_ACT_MISMATCH;
739
740         if (len < 24 + 12)
741                 return WORK_ACT_NONE;
742
743         printk(KERN_DEBUG "%s: beacon received\n", sdata->name);
744         return WORK_ACT_DONE;
745 }
746
747 static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local,
748                                           struct sk_buff *skb)
749 {
750         struct ieee80211_rx_status *rx_status;
751         struct ieee80211_mgmt *mgmt;
752         struct ieee80211_work *wk;
753         enum work_action rma = WORK_ACT_NONE;
754         u16 fc;
755
756         rx_status = (struct ieee80211_rx_status *) skb->cb;
757         mgmt = (struct ieee80211_mgmt *) skb->data;
758         fc = le16_to_cpu(mgmt->frame_control);
759
760         mutex_lock(&local->mtx);
761
762         list_for_each_entry(wk, &local->work_list, list) {
763                 const u8 *bssid = NULL;
764
765                 switch (wk->type) {
766                 case IEEE80211_WORK_DIRECT_PROBE:
767                 case IEEE80211_WORK_AUTH:
768                 case IEEE80211_WORK_ASSOC:
769                 case IEEE80211_WORK_ASSOC_BEACON_WAIT:
770                         bssid = wk->filter_ta;
771                         break;
772                 default:
773                         continue;
774                 }
775
776                 /*
777                  * Before queuing, we already verified mgmt->sa,
778                  * so this is needed just for matching.
779                  */
780                 if (compare_ether_addr(bssid, mgmt->bssid))
781                         continue;
782
783                 switch (fc & IEEE80211_FCTL_STYPE) {
784                 case IEEE80211_STYPE_BEACON:
785                         rma = ieee80211_rx_mgmt_beacon(wk, mgmt, skb->len);
786                         break;
787                 case IEEE80211_STYPE_PROBE_RESP:
788                         rma = ieee80211_rx_mgmt_probe_resp(wk, mgmt, skb->len,
789                                                            rx_status);
790                         break;
791                 case IEEE80211_STYPE_AUTH:
792                         rma = ieee80211_rx_mgmt_auth(wk, mgmt, skb->len);
793                         break;
794                 case IEEE80211_STYPE_ASSOC_RESP:
795                         rma = ieee80211_rx_mgmt_assoc_resp(wk, mgmt,
796                                                            skb->len, false);
797                         break;
798                 case IEEE80211_STYPE_REASSOC_RESP:
799                         rma = ieee80211_rx_mgmt_assoc_resp(wk, mgmt,
800                                                            skb->len, true);
801                         break;
802                 default:
803                         WARN_ON(1);
804                         rma = WORK_ACT_NONE;
805                 }
806
807                 /*
808                  * We've either received an unexpected frame, or we have
809                  * multiple work items and need to match the frame to the
810                  * right one.
811                  */
812                 if (rma == WORK_ACT_MISMATCH)
813                         continue;
814
815                 /*
816                  * We've processed this frame for that work, so it can't
817                  * belong to another work struct.
818                  * NB: this is also required for correctness for 'rma'!
819                  */
820                 break;
821         }
822
823         switch (rma) {
824         case WORK_ACT_MISMATCH:
825                 /* ignore this unmatched frame */
826                 break;
827         case WORK_ACT_NONE:
828                 break;
829         case WORK_ACT_DONE:
830                 list_del_rcu(&wk->list);
831                 break;
832         default:
833                 WARN(1, "unexpected: %d", rma);
834         }
835
836         mutex_unlock(&local->mtx);
837
838         if (rma != WORK_ACT_DONE)
839                 goto out;
840
841         switch (wk->done(wk, skb)) {
842         case WORK_DONE_DESTROY:
843                 free_work(wk);
844                 break;
845         case WORK_DONE_REQUEUE:
846                 synchronize_rcu();
847                 wk->started = false; /* restart */
848                 mutex_lock(&local->mtx);
849                 list_add_tail(&wk->list, &local->work_list);
850                 mutex_unlock(&local->mtx);
851         }
852
853  out:
854         kfree_skb(skb);
855 }
856
857 static bool ieee80211_work_ct_coexists(enum nl80211_channel_type wk_ct,
858                                        enum nl80211_channel_type oper_ct)
859 {
860         switch (wk_ct) {
861         case NL80211_CHAN_NO_HT:
862                 return true;
863         case NL80211_CHAN_HT20:
864                 if (oper_ct != NL80211_CHAN_NO_HT)
865                         return true;
866                 return false;
867         case NL80211_CHAN_HT40MINUS:
868         case NL80211_CHAN_HT40PLUS:
869                 return (wk_ct == oper_ct);
870         }
871         WARN_ON(1); /* shouldn't get here */
872         return false;
873 }
874
875 static enum nl80211_channel_type
876 ieee80211_calc_ct(enum nl80211_channel_type wk_ct,
877                   enum nl80211_channel_type oper_ct)
878 {
879         switch (wk_ct) {
880         case NL80211_CHAN_NO_HT:
881                 return oper_ct;
882         case NL80211_CHAN_HT20:
883                 if (oper_ct != NL80211_CHAN_NO_HT)
884                         return oper_ct;
885                 return wk_ct;
886         case NL80211_CHAN_HT40MINUS:
887         case NL80211_CHAN_HT40PLUS:
888                 return wk_ct;
889         }
890         WARN_ON(1); /* shouldn't get here */
891         return wk_ct;
892 }
893
894
895 static void ieee80211_work_timer(unsigned long data)
896 {
897         struct ieee80211_local *local = (void *) data;
898
899         if (local->quiescing)
900                 return;
901
902         ieee80211_queue_work(&local->hw, &local->work_work);
903 }
904
905 static void ieee80211_work_work(struct work_struct *work)
906 {
907         struct ieee80211_local *local =
908                 container_of(work, struct ieee80211_local, work_work);
909         struct sk_buff *skb;
910         struct ieee80211_work *wk, *tmp;
911         LIST_HEAD(free_work);
912         enum work_action rma;
913         bool remain_off_channel = false;
914
915         if (local->scanning)
916                 return;
917
918         /*
919          * ieee80211_queue_work() should have picked up most cases,
920          * here we'll pick the rest.
921          */
922         if (WARN(local->suspended, "work scheduled while going to suspend\n"))
923                 return;
924
925         /* first process frames to avoid timing out while a frame is pending */
926         while ((skb = skb_dequeue(&local->work_skb_queue)))
927                 ieee80211_work_rx_queued_mgmt(local, skb);
928
929         mutex_lock(&local->mtx);
930
931         ieee80211_recalc_idle(local);
932
933         list_for_each_entry_safe(wk, tmp, &local->work_list, list) {
934                 bool started = wk->started;
935
936                 /* mark work as started if it's on the current off-channel */
937                 if (!started && local->tmp_channel &&
938                     wk->chan == local->tmp_channel &&
939                     wk->chan_type == local->tmp_channel_type) {
940                         started = true;
941                         wk->timeout = jiffies;
942                 }
943
944                 if (!started && !local->tmp_channel) {
945                         bool on_oper_chan;
946                         bool tmp_chan_changed = false;
947                         bool on_oper_chan2;
948                         enum nl80211_channel_type wk_ct;
949                         on_oper_chan = ieee80211_cfg_on_oper_channel(local);
950
951                         /* Work with existing channel type if possible. */
952                         wk_ct = wk->chan_type;
953                         if (wk->chan == local->hw.conf.channel)
954                                 wk_ct = ieee80211_calc_ct(wk->chan_type,
955                                                 local->hw.conf.channel_type);
956
957                         if (local->tmp_channel)
958                                 if ((local->tmp_channel != wk->chan) ||
959                                     (local->tmp_channel_type != wk_ct))
960                                         tmp_chan_changed = true;
961
962                         local->tmp_channel = wk->chan;
963                         local->tmp_channel_type = wk_ct;
964                         /*
965                          * Leave the station vifs in awake mode if they
966                          * happen to be on the same channel as
967                          * the requested channel.
968                          */
969                         on_oper_chan2 = ieee80211_cfg_on_oper_channel(local);
970                         if (on_oper_chan != on_oper_chan2) {
971                                 if (on_oper_chan2) {
972                                         /* going off oper channel, PS too */
973                                         ieee80211_offchannel_stop_vifs(local,
974                                                                        true);
975                                         ieee80211_hw_config(local, 0);
976                                 } else {
977                                         /* going on channel, but leave PS
978                                          * off-channel. */
979                                         ieee80211_hw_config(local, 0);
980                                         ieee80211_offchannel_return(local,
981                                                                     true,
982                                                                     false);
983                                 }
984                         } else if (tmp_chan_changed)
985                                 /* Still off-channel, but on some other
986                                  * channel, so update hardware.
987                                  * PS should already be off-channel.
988                                  */
989                                 ieee80211_hw_config(local, 0);
990
991                         started = true;
992                         wk->timeout = jiffies;
993                 }
994
995                 /* don't try to work with items that aren't started */
996                 if (!started)
997                         continue;
998
999                 if (time_is_after_jiffies(wk->timeout)) {
1000                         /*
1001                          * This work item isn't supposed to be worked on
1002                          * right now, but take care to adjust the timer
1003                          * properly.
1004                          */
1005                         run_again(local, wk->timeout);
1006                         continue;
1007                 }
1008
1009                 switch (wk->type) {
1010                 default:
1011                         WARN_ON(1);
1012                         /* nothing */
1013                         rma = WORK_ACT_NONE;
1014                         break;
1015                 case IEEE80211_WORK_ABORT:
1016                         rma = WORK_ACT_TIMEOUT;
1017                         break;
1018                 case IEEE80211_WORK_DIRECT_PROBE:
1019                         rma = ieee80211_direct_probe(wk);
1020                         break;
1021                 case IEEE80211_WORK_AUTH:
1022                         rma = ieee80211_authenticate(wk);
1023                         break;
1024                 case IEEE80211_WORK_ASSOC:
1025                         rma = ieee80211_associate(wk);
1026                         break;
1027                 case IEEE80211_WORK_REMAIN_ON_CHANNEL:
1028                         rma = ieee80211_remain_on_channel_timeout(wk);
1029                         break;
1030                 case IEEE80211_WORK_OFFCHANNEL_TX:
1031                         rma = ieee80211_offchannel_tx(wk);
1032                         break;
1033                 case IEEE80211_WORK_ASSOC_BEACON_WAIT:
1034                         rma = ieee80211_assoc_beacon_wait(wk);
1035                         break;
1036                 }
1037
1038                 wk->started = started;
1039
1040                 switch (rma) {
1041                 case WORK_ACT_NONE:
1042                         /* might have changed the timeout */
1043                         run_again(local, wk->timeout);
1044                         break;
1045                 case WORK_ACT_TIMEOUT:
1046                         list_del_rcu(&wk->list);
1047                         synchronize_rcu();
1048                         list_add(&wk->list, &free_work);
1049                         break;
1050                 default:
1051                         WARN(1, "unexpected: %d", rma);
1052                 }
1053         }
1054
1055         list_for_each_entry(wk, &local->work_list, list) {
1056                 if (!wk->started)
1057                         continue;
1058                 if (wk->chan != local->tmp_channel)
1059                         continue;
1060                 if (!ieee80211_work_ct_coexists(wk->chan_type,
1061                                                 local->tmp_channel_type))
1062                         continue;
1063                 remain_off_channel = true;
1064         }
1065
1066         if (!remain_off_channel && local->tmp_channel) {
1067                 local->tmp_channel = NULL;
1068                 /* If tmp_channel wasn't operating channel, then
1069                  * we need to go back on-channel.
1070                  * NOTE:  If we can ever be here while scannning,
1071                  * or if the hw_config() channel config logic changes,
1072                  * then we may need to do a more thorough check to see if
1073                  * we still need to do a hardware config.  Currently,
1074                  * we cannot be here while scanning, however.
1075                  */
1076                 if (!ieee80211_cfg_on_oper_channel(local))
1077                         ieee80211_hw_config(local, 0);
1078
1079                 /* At the least, we need to disable offchannel_ps,
1080                  * so just go ahead and run the entire offchannel
1081                  * return logic here.  We *could* skip enabling
1082                  * beaconing if we were already on-oper-channel
1083                  * as a future optimization.
1084                  */
1085                 ieee80211_offchannel_return(local, true, true);
1086
1087                 /* give connection some time to breathe */
1088                 run_again(local, jiffies + HZ/2);
1089         }
1090
1091         if (list_empty(&local->work_list) && local->scan_req &&
1092             !local->scanning)
1093                 ieee80211_queue_delayed_work(&local->hw,
1094                                              &local->scan_work,
1095                                              round_jiffies_relative(0));
1096
1097         ieee80211_recalc_idle(local);
1098
1099         mutex_unlock(&local->mtx);
1100
1101         list_for_each_entry_safe(wk, tmp, &free_work, list) {
1102                 wk->done(wk, NULL);
1103                 list_del(&wk->list);
1104                 kfree(wk);
1105         }
1106 }
1107
1108 void ieee80211_add_work(struct ieee80211_work *wk)
1109 {
1110         struct ieee80211_local *local;
1111
1112         if (WARN_ON(!wk->chan))
1113                 return;
1114
1115         if (WARN_ON(!wk->sdata))
1116                 return;
1117
1118         if (WARN_ON(!wk->done))
1119                 return;
1120
1121         if (WARN_ON(!ieee80211_sdata_running(wk->sdata)))
1122                 return;
1123
1124         wk->started = false;
1125
1126         local = wk->sdata->local;
1127         mutex_lock(&local->mtx);
1128         list_add_tail(&wk->list, &local->work_list);
1129         mutex_unlock(&local->mtx);
1130
1131         ieee80211_queue_work(&local->hw, &local->work_work);
1132 }
1133
1134 void ieee80211_work_init(struct ieee80211_local *local)
1135 {
1136         INIT_LIST_HEAD(&local->work_list);
1137         setup_timer(&local->work_timer, ieee80211_work_timer,
1138                     (unsigned long)local);
1139         INIT_WORK(&local->work_work, ieee80211_work_work);
1140         skb_queue_head_init(&local->work_skb_queue);
1141 }
1142
1143 void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
1144 {
1145         struct ieee80211_local *local = sdata->local;
1146         struct ieee80211_work *wk;
1147         bool cleanup = false;
1148
1149         mutex_lock(&local->mtx);
1150         list_for_each_entry(wk, &local->work_list, list) {
1151                 if (wk->sdata != sdata)
1152                         continue;
1153                 cleanup = true;
1154                 wk->type = IEEE80211_WORK_ABORT;
1155                 wk->started = true;
1156                 wk->timeout = jiffies;
1157         }
1158         mutex_unlock(&local->mtx);
1159
1160         /* run cleanups etc. */
1161         if (cleanup)
1162                 ieee80211_work_work(&local->work_work);
1163
1164         mutex_lock(&local->mtx);
1165         list_for_each_entry(wk, &local->work_list, list) {
1166                 if (wk->sdata != sdata)
1167                         continue;
1168                 WARN_ON(1);
1169                 break;
1170         }
1171         mutex_unlock(&local->mtx);
1172 }
1173
1174 ieee80211_rx_result ieee80211_work_rx_mgmt(struct ieee80211_sub_if_data *sdata,
1175                                            struct sk_buff *skb)
1176 {
1177         struct ieee80211_local *local = sdata->local;
1178         struct ieee80211_mgmt *mgmt;
1179         struct ieee80211_work *wk;
1180         u16 fc;
1181
1182         if (skb->len < 24)
1183                 return RX_DROP_MONITOR;
1184
1185         mgmt = (struct ieee80211_mgmt *) skb->data;
1186         fc = le16_to_cpu(mgmt->frame_control);
1187
1188         list_for_each_entry_rcu(wk, &local->work_list, list) {
1189                 if (sdata != wk->sdata)
1190                         continue;
1191                 if (compare_ether_addr(wk->filter_ta, mgmt->sa))
1192                         continue;
1193                 if (compare_ether_addr(wk->filter_ta, mgmt->bssid))
1194                         continue;
1195
1196                 switch (fc & IEEE80211_FCTL_STYPE) {
1197                 case IEEE80211_STYPE_AUTH:
1198                 case IEEE80211_STYPE_PROBE_RESP:
1199                 case IEEE80211_STYPE_ASSOC_RESP:
1200                 case IEEE80211_STYPE_REASSOC_RESP:
1201                 case IEEE80211_STYPE_BEACON:
1202                         skb_queue_tail(&local->work_skb_queue, skb);
1203                         ieee80211_queue_work(&local->hw, &local->work_work);
1204                         return RX_QUEUED;
1205                 }
1206         }
1207
1208         return RX_CONTINUE;
1209 }
1210
1211 static enum work_done_result ieee80211_remain_done(struct ieee80211_work *wk,
1212                                                    struct sk_buff *skb)
1213 {
1214         /*
1215          * We are done serving the remain-on-channel command.
1216          */
1217         cfg80211_remain_on_channel_expired(wk->sdata->dev, (unsigned long) wk,
1218                                            wk->chan, wk->chan_type,
1219                                            GFP_KERNEL);
1220
1221         return WORK_DONE_DESTROY;
1222 }
1223
1224 int ieee80211_wk_remain_on_channel(struct ieee80211_sub_if_data *sdata,
1225                                    struct ieee80211_channel *chan,
1226                                    enum nl80211_channel_type channel_type,
1227                                    unsigned int duration, u64 *cookie)
1228 {
1229         struct ieee80211_work *wk;
1230
1231         wk = kzalloc(sizeof(*wk), GFP_KERNEL);
1232         if (!wk)
1233                 return -ENOMEM;
1234
1235         wk->type = IEEE80211_WORK_REMAIN_ON_CHANNEL;
1236         wk->chan = chan;
1237         wk->chan_type = channel_type;
1238         wk->sdata = sdata;
1239         wk->done = ieee80211_remain_done;
1240
1241         wk->remain.duration = duration;
1242
1243         *cookie = (unsigned long) wk;
1244
1245         ieee80211_add_work(wk);
1246
1247         return 0;
1248 }
1249
1250 int ieee80211_wk_cancel_remain_on_channel(struct ieee80211_sub_if_data *sdata,
1251                                           u64 cookie)
1252 {
1253         struct ieee80211_local *local = sdata->local;
1254         struct ieee80211_work *wk, *tmp;
1255         bool found = false;
1256
1257         mutex_lock(&local->mtx);
1258         list_for_each_entry_safe(wk, tmp, &local->work_list, list) {
1259                 if ((unsigned long) wk == cookie) {
1260                         wk->timeout = jiffies;
1261                         found = true;
1262                         break;
1263                 }
1264         }
1265         mutex_unlock(&local->mtx);
1266
1267         if (!found)
1268                 return -ENOENT;
1269
1270         ieee80211_queue_work(&local->hw, &local->work_work);
1271
1272         return 0;
1273 }