~ubuntu-branches/ubuntu/quantal/linux-backports-modules-3.5.0/quantal-updates

« back to all changes in this revision

Viewing changes to updates/cw-3.6/net/mac80211/scan.c

  • Committer: Package Import Robot
  • Author(s): Leann Ogasawara
  • Date: 2012-10-10 22:28:55 UTC
  • Revision ID: package-import@ubuntu.com-20121010222855-qepocc61xktv6gs9
Tags: 3.5.0-17.1
* Open Quantal LBM
* Add compat-wireless 3.6
  -LP: #1066123

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Scanning implementation
 
3
 *
 
4
 * Copyright 2003, Jouni Malinen <jkmaline@cc.hut.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
 *
 
10
 * This program is free software; you can redistribute it and/or modify
 
11
 * it under the terms of the GNU General Public License version 2 as
 
12
 * published by the Free Software Foundation.
 
13
 */
 
14
 
 
15
#include <linux/if_arp.h>
 
16
#include <linux/etherdevice.h>
 
17
#include <linux/rtnetlink.h>
 
18
#include <linux/pm_qos.h>
 
19
#include <net/sch_generic.h>
 
20
#include <linux/slab.h>
 
21
#include <linux/export.h>
 
22
#include <net/mac80211.h>
 
23
 
 
24
#include "ieee80211_i.h"
 
25
#include "driver-ops.h"
 
26
#include "mesh.h"
 
27
 
 
28
#define IEEE80211_PROBE_DELAY (HZ / 33)
 
29
#define IEEE80211_CHANNEL_TIME (HZ / 33)
 
30
#define IEEE80211_PASSIVE_CHANNEL_TIME (HZ / 8)
 
31
 
 
32
static void ieee80211_rx_bss_free(struct cfg80211_bss *cbss)
 
33
{
 
34
        struct ieee80211_bss *bss = (void *)cbss->priv;
 
35
 
 
36
        kfree(bss_mesh_id(bss));
 
37
        kfree(bss_mesh_cfg(bss));
 
38
}
 
39
 
 
40
void ieee80211_rx_bss_put(struct ieee80211_local *local,
 
41
                          struct ieee80211_bss *bss)
 
42
{
 
43
        if (!bss)
 
44
                return;
 
45
        cfg80211_put_bss(container_of((void *)bss, struct cfg80211_bss, priv));
 
46
}
 
47
 
 
48
static bool is_uapsd_supported(struct ieee802_11_elems *elems)
 
49
{
 
50
        u8 qos_info;
 
51
 
 
52
        if (elems->wmm_info && elems->wmm_info_len == 7
 
53
            && elems->wmm_info[5] == 1)
 
54
                qos_info = elems->wmm_info[6];
 
55
        else if (elems->wmm_param && elems->wmm_param_len == 24
 
56
                 && elems->wmm_param[5] == 1)
 
57
                qos_info = elems->wmm_param[6];
 
58
        else
 
59
                /* no valid wmm information or parameter element found */
 
60
                return false;
 
61
 
 
62
        return qos_info & IEEE80211_WMM_IE_AP_QOSINFO_UAPSD;
 
63
}
 
64
 
 
65
struct ieee80211_bss *
 
66
ieee80211_bss_info_update(struct ieee80211_local *local,
 
67
                          struct ieee80211_rx_status *rx_status,
 
68
                          struct ieee80211_mgmt *mgmt,
 
69
                          size_t len,
 
70
                          struct ieee802_11_elems *elems,
 
71
                          struct ieee80211_channel *channel,
 
72
                          bool beacon)
 
73
{
 
74
        struct cfg80211_bss *cbss;
 
75
        struct ieee80211_bss *bss;
 
76
        int clen, srlen;
 
77
        s32 signal = 0;
 
78
 
 
79
        if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
 
80
                signal = rx_status->signal * 100;
 
81
        else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)
 
82
                signal = (rx_status->signal * 100) / local->hw.max_signal;
 
83
 
 
84
        cbss = cfg80211_inform_bss_frame(local->hw.wiphy, channel,
 
85
                                         mgmt, len, signal, GFP_ATOMIC);
 
86
        if (!cbss)
 
87
                return NULL;
 
88
 
 
89
        cbss->free_priv = ieee80211_rx_bss_free;
 
90
        bss = (void *)cbss->priv;
 
91
 
 
92
        bss->device_ts = rx_status->device_timestamp;
 
93
 
 
94
        if (elems->parse_error) {
 
95
                if (beacon)
 
96
                        bss->corrupt_data |= IEEE80211_BSS_CORRUPT_BEACON;
 
97
                else
 
98
                        bss->corrupt_data |= IEEE80211_BSS_CORRUPT_PROBE_RESP;
 
99
        } else {
 
100
                if (beacon)
 
101
                        bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_BEACON;
 
102
                else
 
103
                        bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_PROBE_RESP;
 
104
        }
 
105
 
 
106
        /* save the ERP value so that it is available at association time */
 
107
        if (elems->erp_info && elems->erp_info_len >= 1 &&
 
108
                        (!elems->parse_error ||
 
109
                         !(bss->valid_data & IEEE80211_BSS_VALID_ERP))) {
 
110
                bss->erp_value = elems->erp_info[0];
 
111
                bss->has_erp_value = true;
 
112
                if (!elems->parse_error)
 
113
                        bss->valid_data |= IEEE80211_BSS_VALID_ERP;
 
114
        }
 
115
 
 
116
        if (elems->tim && (!elems->parse_error ||
 
117
                           !(bss->valid_data & IEEE80211_BSS_VALID_DTIM))) {
 
118
                struct ieee80211_tim_ie *tim_ie = elems->tim;
 
119
                bss->dtim_period = tim_ie->dtim_period;
 
120
                if (!elems->parse_error)
 
121
                                bss->valid_data |= IEEE80211_BSS_VALID_DTIM;
 
122
        }
 
123
 
 
124
        /* If the beacon had no TIM IE, or it was invalid, use 1 */
 
125
        if (beacon && !bss->dtim_period)
 
126
                bss->dtim_period = 1;
 
127
 
 
128
        /* replace old supported rates if we get new values */
 
129
        if (!elems->parse_error ||
 
130
            !(bss->valid_data & IEEE80211_BSS_VALID_RATES)) {
 
131
                srlen = 0;
 
132
                if (elems->supp_rates) {
 
133
                        clen = IEEE80211_MAX_SUPP_RATES;
 
134
                        if (clen > elems->supp_rates_len)
 
135
                                clen = elems->supp_rates_len;
 
136
                        memcpy(bss->supp_rates, elems->supp_rates, clen);
 
137
                        srlen += clen;
 
138
                }
 
139
                if (elems->ext_supp_rates) {
 
140
                        clen = IEEE80211_MAX_SUPP_RATES - srlen;
 
141
                        if (clen > elems->ext_supp_rates_len)
 
142
                                clen = elems->ext_supp_rates_len;
 
143
                        memcpy(bss->supp_rates + srlen, elems->ext_supp_rates,
 
144
                               clen);
 
145
                        srlen += clen;
 
146
                }
 
147
                if (srlen) {
 
148
                        bss->supp_rates_len = srlen;
 
149
                        if (!elems->parse_error)
 
150
                                bss->valid_data |= IEEE80211_BSS_VALID_RATES;
 
151
                }
 
152
        }
 
153
 
 
154
        if (!elems->parse_error ||
 
155
            !(bss->valid_data & IEEE80211_BSS_VALID_WMM)) {
 
156
                bss->wmm_used = elems->wmm_param || elems->wmm_info;
 
157
                bss->uapsd_supported = is_uapsd_supported(elems);
 
158
                if (!elems->parse_error)
 
159
                        bss->valid_data |= IEEE80211_BSS_VALID_WMM;
 
160
        }
 
161
 
 
162
        if (!beacon)
 
163
                bss->last_probe_resp = jiffies;
 
164
 
 
165
        return bss;
 
166
}
 
167
 
 
168
void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)
 
169
{
 
170
        struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
 
171
        struct ieee80211_sub_if_data *sdata1, *sdata2;
 
172
        struct ieee80211_mgmt *mgmt = (void *)skb->data;
 
173
        struct ieee80211_bss *bss;
 
174
        u8 *elements;
 
175
        struct ieee80211_channel *channel;
 
176
        size_t baselen;
 
177
        int freq;
 
178
        bool beacon;
 
179
        struct ieee802_11_elems elems;
 
180
 
 
181
        if (skb->len < 24 ||
 
182
            (!ieee80211_is_probe_resp(mgmt->frame_control) &&
 
183
             !ieee80211_is_beacon(mgmt->frame_control)))
 
184
                return;
 
185
 
 
186
        sdata1 = rcu_dereference(local->scan_sdata);
 
187
        sdata2 = rcu_dereference(local->sched_scan_sdata);
 
188
 
 
189
        if (likely(!sdata1 && !sdata2))
 
190
                return;
 
191
 
 
192
        if (ieee80211_is_probe_resp(mgmt->frame_control)) {
 
193
                /* ignore ProbeResp to foreign address */
 
194
                if ((!sdata1 || !ether_addr_equal(mgmt->da, sdata1->vif.addr)) &&
 
195
                    (!sdata2 || !ether_addr_equal(mgmt->da, sdata2->vif.addr)))
 
196
                        return;
 
197
 
 
198
                elements = mgmt->u.probe_resp.variable;
 
199
                baselen = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
 
200
                beacon = false;
 
201
        } else {
 
202
                baselen = offsetof(struct ieee80211_mgmt, u.beacon.variable);
 
203
                elements = mgmt->u.beacon.variable;
 
204
                beacon = true;
 
205
        }
 
206
 
 
207
        if (baselen > skb->len)
 
208
                return;
 
209
 
 
210
        ieee802_11_parse_elems(elements, skb->len - baselen, &elems);
 
211
 
 
212
        if (elems.ds_params && elems.ds_params_len == 1)
 
213
                freq = ieee80211_channel_to_frequency(elems.ds_params[0],
 
214
                                                      rx_status->band);
 
215
        else
 
216
                freq = rx_status->freq;
 
217
 
 
218
        channel = ieee80211_get_channel(local->hw.wiphy, freq);
 
219
 
 
220
        if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
 
221
                return;
 
222
 
 
223
        bss = ieee80211_bss_info_update(local, rx_status,
 
224
                                        mgmt, skb->len, &elems,
 
225
                                        channel, beacon);
 
226
        if (bss)
 
227
                ieee80211_rx_bss_put(local, bss);
 
228
}
 
229
 
 
230
/* return false if no more work */
 
231
static bool ieee80211_prep_hw_scan(struct ieee80211_local *local)
 
232
{
 
233
        struct cfg80211_scan_request *req = local->scan_req;
 
234
        enum ieee80211_band band;
 
235
        int i, ielen, n_chans;
 
236
 
 
237
        do {
 
238
                if (local->hw_scan_band == IEEE80211_NUM_BANDS)
 
239
                        return false;
 
240
 
 
241
                band = local->hw_scan_band;
 
242
                n_chans = 0;
 
243
                for (i = 0; i < req->n_channels; i++) {
 
244
                        if (req->channels[i]->band == band) {
 
245
                                local->hw_scan_req->channels[n_chans] =
 
246
                                                        req->channels[i];
 
247
                                n_chans++;
 
248
                        }
 
249
                }
 
250
 
 
251
                local->hw_scan_band++;
 
252
        } while (!n_chans);
 
253
 
 
254
        local->hw_scan_req->n_channels = n_chans;
 
255
 
 
256
        ielen = ieee80211_build_preq_ies(local, (u8 *)local->hw_scan_req->ie,
 
257
                                         req->ie, req->ie_len, band,
 
258
                                         req->rates[band], 0);
 
259
        local->hw_scan_req->ie_len = ielen;
 
260
        local->hw_scan_req->no_cck = req->no_cck;
 
261
 
 
262
        return true;
 
263
}
 
264
 
 
265
static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted,
 
266
                                       bool was_hw_scan)
 
267
{
 
268
        struct ieee80211_local *local = hw_to_local(hw);
 
269
 
 
270
        lockdep_assert_held(&local->mtx);
 
271
 
 
272
        /*
 
273
         * It's ok to abort a not-yet-running scan (that
 
274
         * we have one at all will be verified by checking
 
275
         * local->scan_req next), but not to complete it
 
276
         * successfully.
 
277
         */
 
278
        if (WARN_ON(!local->scanning && !aborted))
 
279
                aborted = true;
 
280
 
 
281
        if (WARN_ON(!local->scan_req))
 
282
                return;
 
283
 
 
284
        if (was_hw_scan && !aborted && ieee80211_prep_hw_scan(local)) {
 
285
                int rc;
 
286
 
 
287
                rc = drv_hw_scan(local,
 
288
                        rcu_dereference_protected(local->scan_sdata,
 
289
                                                  lockdep_is_held(&local->mtx)),
 
290
                        local->hw_scan_req);
 
291
 
 
292
                if (rc == 0)
 
293
                        return;
 
294
        }
 
295
 
 
296
        kfree(local->hw_scan_req);
 
297
        local->hw_scan_req = NULL;
 
298
 
 
299
        if (local->scan_req != local->int_scan_req)
 
300
                cfg80211_scan_done(local->scan_req, aborted);
 
301
        local->scan_req = NULL;
 
302
        rcu_assign_pointer(local->scan_sdata, NULL);
 
303
 
 
304
        local->scanning = 0;
 
305
        local->scan_channel = NULL;
 
306
 
 
307
        /* Set power back to normal operating levels. */
 
308
        ieee80211_hw_config(local, 0);
 
309
 
 
310
        if (!was_hw_scan) {
 
311
                ieee80211_configure_filter(local);
 
312
                drv_sw_scan_complete(local);
 
313
                ieee80211_offchannel_return(local, true);
 
314
        }
 
315
 
 
316
        ieee80211_recalc_idle(local);
 
317
 
 
318
        ieee80211_mlme_notify_scan_completed(local);
 
319
        ieee80211_ibss_notify_scan_completed(local);
 
320
        ieee80211_mesh_notify_scan_completed(local);
 
321
        ieee80211_start_next_roc(local);
 
322
}
 
323
 
 
324
void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
 
325
{
 
326
        struct ieee80211_local *local = hw_to_local(hw);
 
327
 
 
328
        trace_api_scan_completed(local, aborted);
 
329
 
 
330
        set_bit(SCAN_COMPLETED, &local->scanning);
 
331
        if (aborted)
 
332
                set_bit(SCAN_ABORTED, &local->scanning);
 
333
        ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0);
 
334
}
 
335
EXPORT_SYMBOL(ieee80211_scan_completed);
 
336
 
 
337
static int ieee80211_start_sw_scan(struct ieee80211_local *local)
 
338
{
 
339
        /*
 
340
         * Hardware/driver doesn't support hw_scan, so use software
 
341
         * scanning instead. First send a nullfunc frame with power save
 
342
         * bit on so that AP will buffer the frames for us while we are not
 
343
         * listening, then send probe requests to each channel and wait for
 
344
         * the responses. After all channels are scanned, tune back to the
 
345
         * original channel and send a nullfunc frame with power save bit
 
346
         * off to trigger the AP to send us all the buffered frames.
 
347
         *
 
348
         * Note that while local->sw_scanning is true everything else but
 
349
         * nullfunc frames and probe requests will be dropped in
 
350
         * ieee80211_tx_h_check_assoc().
 
351
         */
 
352
        drv_sw_scan_start(local);
 
353
 
 
354
        local->leave_oper_channel_time = jiffies;
 
355
        local->next_scan_state = SCAN_DECISION;
 
356
        local->scan_channel_idx = 0;
 
357
 
 
358
        ieee80211_offchannel_stop_vifs(local, true);
 
359
 
 
360
        ieee80211_configure_filter(local);
 
361
 
 
362
        /* We need to set power level at maximum rate for scanning. */
 
363
        ieee80211_hw_config(local, 0);
 
364
 
 
365
        ieee80211_queue_delayed_work(&local->hw,
 
366
                                     &local->scan_work, 0);
 
367
 
 
368
        return 0;
 
369
}
 
370
 
 
371
static bool ieee80211_can_scan(struct ieee80211_local *local,
 
372
                               struct ieee80211_sub_if_data *sdata)
 
373
{
 
374
        if (!list_empty(&local->roc_list))
 
375
                return false;
 
376
 
 
377
        if (sdata->vif.type == NL80211_IFTYPE_STATION &&
 
378
            sdata->u.mgd.flags & (IEEE80211_STA_BEACON_POLL |
 
379
                                  IEEE80211_STA_CONNECTION_POLL))
 
380
                return false;
 
381
 
 
382
        return true;
 
383
}
 
384
 
 
385
void ieee80211_run_deferred_scan(struct ieee80211_local *local)
 
386
{
 
387
        lockdep_assert_held(&local->mtx);
 
388
 
 
389
        if (!local->scan_req || local->scanning)
 
390
                return;
 
391
 
 
392
        if (!ieee80211_can_scan(local,
 
393
                                rcu_dereference_protected(
 
394
                                        local->scan_sdata,
 
395
                                        lockdep_is_held(&local->mtx))))
 
396
                return;
 
397
 
 
398
        ieee80211_queue_delayed_work(&local->hw, &local->scan_work,
 
399
                                     round_jiffies_relative(0));
 
400
}
 
401
 
 
402
static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
 
403
                                            unsigned long *next_delay)
 
404
{
 
405
        int i;
 
406
        struct ieee80211_sub_if_data *sdata;
 
407
        enum ieee80211_band band = local->hw.conf.channel->band;
 
408
 
 
409
        sdata = rcu_dereference_protected(local->scan_sdata,
 
410
                                          lockdep_is_held(&local->mtx));;
 
411
 
 
412
        for (i = 0; i < local->scan_req->n_ssids; i++)
 
413
                ieee80211_send_probe_req(
 
414
                        sdata, NULL,
 
415
                        local->scan_req->ssids[i].ssid,
 
416
                        local->scan_req->ssids[i].ssid_len,
 
417
                        local->scan_req->ie, local->scan_req->ie_len,
 
418
                        local->scan_req->rates[band], false,
 
419
                        local->scan_req->no_cck);
 
420
 
 
421
        /*
 
422
         * After sending probe requests, wait for probe responses
 
423
         * on the channel.
 
424
         */
 
425
        *next_delay = IEEE80211_CHANNEL_TIME;
 
426
        local->next_scan_state = SCAN_DECISION;
 
427
}
 
428
 
 
429
static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
 
430
                                  struct cfg80211_scan_request *req)
 
431
{
 
432
        struct ieee80211_local *local = sdata->local;
 
433
        int rc;
 
434
 
 
435
        lockdep_assert_held(&local->mtx);
 
436
 
 
437
        if (local->scan_req)
 
438
                return -EBUSY;
 
439
 
 
440
        if (!ieee80211_can_scan(local, sdata)) {
 
441
                /* wait for the work to finish/time out */
 
442
                local->scan_req = req;
 
443
                rcu_assign_pointer(local->scan_sdata, sdata);
 
444
                return 0;
 
445
        }
 
446
 
 
447
        if (local->ops->hw_scan) {
 
448
                u8 *ies;
 
449
 
 
450
                local->hw_scan_req = kmalloc(
 
451
                                sizeof(*local->hw_scan_req) +
 
452
                                req->n_channels * sizeof(req->channels[0]) +
 
453
                                2 + IEEE80211_MAX_SSID_LEN + local->scan_ies_len +
 
454
                                req->ie_len, GFP_KERNEL);
 
455
                if (!local->hw_scan_req)
 
456
                        return -ENOMEM;
 
457
 
 
458
                local->hw_scan_req->ssids = req->ssids;
 
459
                local->hw_scan_req->n_ssids = req->n_ssids;
 
460
                ies = (u8 *)local->hw_scan_req +
 
461
                        sizeof(*local->hw_scan_req) +
 
462
                        req->n_channels * sizeof(req->channels[0]);
 
463
                local->hw_scan_req->ie = ies;
 
464
 
 
465
                local->hw_scan_band = 0;
 
466
 
 
467
                /*
 
468
                 * After allocating local->hw_scan_req, we must
 
469
                 * go through until ieee80211_prep_hw_scan(), so
 
470
                 * anything that might be changed here and leave
 
471
                 * this function early must not go after this
 
472
                 * allocation.
 
473
                 */
 
474
        }
 
475
 
 
476
        local->scan_req = req;
 
477
        rcu_assign_pointer(local->scan_sdata, sdata);
 
478
 
 
479
        if (local->ops->hw_scan) {
 
480
                __set_bit(SCAN_HW_SCANNING, &local->scanning);
 
481
        } else if ((req->n_channels == 1) &&
 
482
                   (req->channels[0]->center_freq ==
 
483
                    local->hw.conf.channel->center_freq)) {
 
484
 
 
485
                /* If we are scanning only on the current channel, then
 
486
                 * we do not need to stop normal activities
 
487
                 */
 
488
                unsigned long next_delay;
 
489
 
 
490
                __set_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning);
 
491
 
 
492
                ieee80211_recalc_idle(local);
 
493
 
 
494
                /* Notify driver scan is starting, keep order of operations
 
495
                 * same as normal software scan, in case that matters. */
 
496
                drv_sw_scan_start(local);
 
497
 
 
498
                ieee80211_configure_filter(local); /* accept probe-responses */
 
499
 
 
500
                /* We need to ensure power level is at max for scanning. */
 
501
                ieee80211_hw_config(local, 0);
 
502
 
 
503
                if ((req->channels[0]->flags &
 
504
                     IEEE80211_CHAN_PASSIVE_SCAN) ||
 
505
                    !local->scan_req->n_ssids) {
 
506
                        next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
 
507
                } else {
 
508
                        ieee80211_scan_state_send_probe(local, &next_delay);
 
509
                        next_delay = IEEE80211_CHANNEL_TIME;
 
510
                }
 
511
 
 
512
                /* Now, just wait a bit and we are all done! */
 
513
                ieee80211_queue_delayed_work(&local->hw, &local->scan_work,
 
514
                                             next_delay);
 
515
                return 0;
 
516
        } else {
 
517
                /* Do normal software scan */
 
518
                __set_bit(SCAN_SW_SCANNING, &local->scanning);
 
519
        }
 
520
 
 
521
        ieee80211_recalc_idle(local);
 
522
 
 
523
        if (local->ops->hw_scan) {
 
524
                WARN_ON(!ieee80211_prep_hw_scan(local));
 
525
                rc = drv_hw_scan(local, sdata, local->hw_scan_req);
 
526
        } else
 
527
                rc = ieee80211_start_sw_scan(local);
 
528
 
 
529
        if (rc) {
 
530
                kfree(local->hw_scan_req);
 
531
                local->hw_scan_req = NULL;
 
532
                local->scanning = 0;
 
533
 
 
534
                ieee80211_recalc_idle(local);
 
535
 
 
536
                local->scan_req = NULL;
 
537
                rcu_assign_pointer(local->scan_sdata, NULL);
 
538
        }
 
539
 
 
540
        return rc;
 
541
}
 
542
 
 
543
static unsigned long
 
544
ieee80211_scan_get_channel_time(struct ieee80211_channel *chan)
 
545
{
 
546
        /*
 
547
         * TODO: channel switching also consumes quite some time,
 
548
         * add that delay as well to get a better estimation
 
549
         */
 
550
        if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
 
551
                return IEEE80211_PASSIVE_CHANNEL_TIME;
 
552
        return IEEE80211_PROBE_DELAY + IEEE80211_CHANNEL_TIME;
 
553
}
 
554
 
 
555
static void ieee80211_scan_state_decision(struct ieee80211_local *local,
 
556
                                          unsigned long *next_delay)
 
557
{
 
558
        bool associated = false;
 
559
        bool tx_empty = true;
 
560
        bool bad_latency;
 
561
        bool listen_int_exceeded;
 
562
        unsigned long min_beacon_int = 0;
 
563
        struct ieee80211_sub_if_data *sdata;
 
564
        struct ieee80211_channel *next_chan;
 
565
 
 
566
        /*
 
567
         * check if at least one STA interface is associated,
 
568
         * check if at least one STA interface has pending tx frames
 
569
         * and grab the lowest used beacon interval
 
570
         */
 
571
        mutex_lock(&local->iflist_mtx);
 
572
        list_for_each_entry(sdata, &local->interfaces, list) {
 
573
                if (!ieee80211_sdata_running(sdata))
 
574
                        continue;
 
575
 
 
576
                if (sdata->vif.type == NL80211_IFTYPE_STATION) {
 
577
                        if (sdata->u.mgd.associated) {
 
578
                                associated = true;
 
579
 
 
580
                                if (sdata->vif.bss_conf.beacon_int <
 
581
                                    min_beacon_int || min_beacon_int == 0)
 
582
                                        min_beacon_int =
 
583
                                                sdata->vif.bss_conf.beacon_int;
 
584
 
 
585
                                if (!qdisc_all_tx_empty(sdata->dev)) {
 
586
                                        tx_empty = false;
 
587
                                        break;
 
588
                                }
 
589
                        }
 
590
                }
 
591
        }
 
592
        mutex_unlock(&local->iflist_mtx);
 
593
 
 
594
        next_chan = local->scan_req->channels[local->scan_channel_idx];
 
595
 
 
596
        /*
 
597
         * we're currently scanning a different channel, let's
 
598
         * see if we can scan another channel without interfering
 
599
         * with the current traffic situation.
 
600
         *
 
601
         * Since we don't know if the AP has pending frames for us
 
602
         * we can only check for our tx queues and use the current
 
603
         * pm_qos requirements for rx. Hence, if no tx traffic occurs
 
604
         * at all we will scan as many channels in a row as the pm_qos
 
605
         * latency allows us to. Additionally we also check for the
 
606
         * currently negotiated listen interval to prevent losing
 
607
         * frames unnecessarily.
 
608
         *
 
609
         * Otherwise switch back to the operating channel.
 
610
         */
 
611
 
 
612
        bad_latency = time_after(jiffies +
 
613
                        ieee80211_scan_get_channel_time(next_chan),
 
614
                        local->leave_oper_channel_time +
 
615
                        usecs_to_jiffies(pm_qos_request(PM_QOS_NETWORK_LATENCY)));
 
616
 
 
617
        listen_int_exceeded = time_after(jiffies +
 
618
                        ieee80211_scan_get_channel_time(next_chan),
 
619
                        local->leave_oper_channel_time +
 
620
                        usecs_to_jiffies(min_beacon_int * 1024) *
 
621
                        local->hw.conf.listen_interval);
 
622
 
 
623
        if (associated && (!tx_empty || bad_latency || listen_int_exceeded))
 
624
                local->next_scan_state = SCAN_SUSPEND;
 
625
        else
 
626
                local->next_scan_state = SCAN_SET_CHANNEL;
 
627
 
 
628
        *next_delay = 0;
 
629
}
 
630
 
 
631
static void ieee80211_scan_state_set_channel(struct ieee80211_local *local,
 
632
                                             unsigned long *next_delay)
 
633
{
 
634
        int skip;
 
635
        struct ieee80211_channel *chan;
 
636
 
 
637
        skip = 0;
 
638
        chan = local->scan_req->channels[local->scan_channel_idx];
 
639
 
 
640
        local->scan_channel = chan;
 
641
 
 
642
        if (ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL))
 
643
                skip = 1;
 
644
 
 
645
        /* advance state machine to next channel/band */
 
646
        local->scan_channel_idx++;
 
647
 
 
648
        if (skip) {
 
649
                /* if we skip this channel return to the decision state */
 
650
                local->next_scan_state = SCAN_DECISION;
 
651
                return;
 
652
        }
 
653
 
 
654
        /*
 
655
         * Probe delay is used to update the NAV, cf. 11.1.3.2.2
 
656
         * (which unfortunately doesn't say _why_ step a) is done,
 
657
         * but it waits for the probe delay or until a frame is
 
658
         * received - and the received frame would update the NAV).
 
659
         * For now, we do not support waiting until a frame is
 
660
         * received.
 
661
         *
 
662
         * In any case, it is not necessary for a passive scan.
 
663
         */
 
664
        if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
 
665
            !local->scan_req->n_ssids) {
 
666
                *next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
 
667
                local->next_scan_state = SCAN_DECISION;
 
668
                return;
 
669
        }
 
670
 
 
671
        /* active scan, send probes */
 
672
        *next_delay = IEEE80211_PROBE_DELAY;
 
673
        local->next_scan_state = SCAN_SEND_PROBE;
 
674
}
 
675
 
 
676
static void ieee80211_scan_state_suspend(struct ieee80211_local *local,
 
677
                                         unsigned long *next_delay)
 
678
{
 
679
        /* switch back to the operating channel */
 
680
        local->scan_channel = NULL;
 
681
        ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
 
682
 
 
683
        /*
 
684
         * Re-enable vifs and beaconing.  Leave PS
 
685
         * in off-channel state..will put that back
 
686
         * on-channel at the end of scanning.
 
687
         */
 
688
        ieee80211_offchannel_return(local, false);
 
689
 
 
690
        *next_delay = HZ / 5;
 
691
        /* afterwards, resume scan & go to next channel */
 
692
        local->next_scan_state = SCAN_RESUME;
 
693
}
 
694
 
 
695
static void ieee80211_scan_state_resume(struct ieee80211_local *local,
 
696
                                        unsigned long *next_delay)
 
697
{
 
698
        /* PS already is in off-channel mode */
 
699
        ieee80211_offchannel_stop_vifs(local, false);
 
700
 
 
701
        if (local->ops->flush) {
 
702
                drv_flush(local, false);
 
703
                *next_delay = 0;
 
704
        } else
 
705
                *next_delay = HZ / 10;
 
706
 
 
707
        /* remember when we left the operating channel */
 
708
        local->leave_oper_channel_time = jiffies;
 
709
 
 
710
        /* advance to the next channel to be scanned */
 
711
        local->next_scan_state = SCAN_SET_CHANNEL;
 
712
}
 
713
 
 
714
void ieee80211_scan_work(struct work_struct *work)
 
715
{
 
716
        struct ieee80211_local *local =
 
717
                container_of(work, struct ieee80211_local, scan_work.work);
 
718
        struct ieee80211_sub_if_data *sdata;
 
719
        unsigned long next_delay = 0;
 
720
        bool aborted, hw_scan;
 
721
 
 
722
        mutex_lock(&local->mtx);
 
723
 
 
724
        sdata = rcu_dereference_protected(local->scan_sdata,
 
725
                                          lockdep_is_held(&local->mtx));
 
726
 
 
727
        /* When scanning on-channel, the first-callback means completed. */
 
728
        if (test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning)) {
 
729
                aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning);
 
730
                goto out_complete;
 
731
        }
 
732
 
 
733
        if (test_and_clear_bit(SCAN_COMPLETED, &local->scanning)) {
 
734
                aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning);
 
735
                goto out_complete;
 
736
        }
 
737
 
 
738
        if (!sdata || !local->scan_req)
 
739
                goto out;
 
740
 
 
741
        if (local->scan_req && !local->scanning) {
 
742
                struct cfg80211_scan_request *req = local->scan_req;
 
743
                int rc;
 
744
 
 
745
                local->scan_req = NULL;
 
746
                rcu_assign_pointer(local->scan_sdata, NULL);
 
747
 
 
748
                rc = __ieee80211_start_scan(sdata, req);
 
749
                if (rc) {
 
750
                        /* need to complete scan in cfg80211 */
 
751
                        local->scan_req = req;
 
752
                        aborted = true;
 
753
                        goto out_complete;
 
754
                } else
 
755
                        goto out;
 
756
        }
 
757
 
 
758
        /*
 
759
         * Avoid re-scheduling when the sdata is going away.
 
760
         */
 
761
        if (!ieee80211_sdata_running(sdata)) {
 
762
                aborted = true;
 
763
                goto out_complete;
 
764
        }
 
765
 
 
766
        /*
 
767
         * as long as no delay is required advance immediately
 
768
         * without scheduling a new work
 
769
         */
 
770
        do {
 
771
                if (!ieee80211_sdata_running(sdata)) {
 
772
                        aborted = true;
 
773
                        goto out_complete;
 
774
                }
 
775
 
 
776
                switch (local->next_scan_state) {
 
777
                case SCAN_DECISION:
 
778
                        /* if no more bands/channels left, complete scan */
 
779
                        if (local->scan_channel_idx >= local->scan_req->n_channels) {
 
780
                                aborted = false;
 
781
                                goto out_complete;
 
782
                        }
 
783
                        ieee80211_scan_state_decision(local, &next_delay);
 
784
                        break;
 
785
                case SCAN_SET_CHANNEL:
 
786
                        ieee80211_scan_state_set_channel(local, &next_delay);
 
787
                        break;
 
788
                case SCAN_SEND_PROBE:
 
789
                        ieee80211_scan_state_send_probe(local, &next_delay);
 
790
                        break;
 
791
                case SCAN_SUSPEND:
 
792
                        ieee80211_scan_state_suspend(local, &next_delay);
 
793
                        break;
 
794
                case SCAN_RESUME:
 
795
                        ieee80211_scan_state_resume(local, &next_delay);
 
796
                        break;
 
797
                }
 
798
        } while (next_delay == 0);
 
799
 
 
800
        ieee80211_queue_delayed_work(&local->hw, &local->scan_work, next_delay);
 
801
        goto out;
 
802
 
 
803
out_complete:
 
804
        hw_scan = test_bit(SCAN_HW_SCANNING, &local->scanning);
 
805
        __ieee80211_scan_completed(&local->hw, aborted, hw_scan);
 
806
out:
 
807
        mutex_unlock(&local->mtx);
 
808
}
 
809
 
 
810
int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
 
811
                           struct cfg80211_scan_request *req)
 
812
{
 
813
        int res;
 
814
 
 
815
        mutex_lock(&sdata->local->mtx);
 
816
        res = __ieee80211_start_scan(sdata, req);
 
817
        mutex_unlock(&sdata->local->mtx);
 
818
 
 
819
        return res;
 
820
}
 
821
 
 
822
int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
 
823
                                    const u8 *ssid, u8 ssid_len,
 
824
                                    struct ieee80211_channel *chan)
 
825
{
 
826
        struct ieee80211_local *local = sdata->local;
 
827
        int ret = -EBUSY;
 
828
        enum ieee80211_band band;
 
829
 
 
830
        mutex_lock(&local->mtx);
 
831
 
 
832
        /* busy scanning */
 
833
        if (local->scan_req)
 
834
                goto unlock;
 
835
 
 
836
        /* fill internal scan request */
 
837
        if (!chan) {
 
838
                int i, nchan = 0;
 
839
 
 
840
                for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
 
841
                        if (!local->hw.wiphy->bands[band])
 
842
                                continue;
 
843
                        for (i = 0;
 
844
                             i < local->hw.wiphy->bands[band]->n_channels;
 
845
                             i++) {
 
846
                                local->int_scan_req->channels[nchan] =
 
847
                                    &local->hw.wiphy->bands[band]->channels[i];
 
848
                                nchan++;
 
849
                        }
 
850
                }
 
851
 
 
852
                local->int_scan_req->n_channels = nchan;
 
853
        } else {
 
854
                local->int_scan_req->channels[0] = chan;
 
855
                local->int_scan_req->n_channels = 1;
 
856
        }
 
857
 
 
858
        local->int_scan_req->ssids = &local->scan_ssid;
 
859
        local->int_scan_req->n_ssids = 1;
 
860
        memcpy(local->int_scan_req->ssids[0].ssid, ssid, IEEE80211_MAX_SSID_LEN);
 
861
        local->int_scan_req->ssids[0].ssid_len = ssid_len;
 
862
 
 
863
        ret = __ieee80211_start_scan(sdata, sdata->local->int_scan_req);
 
864
 unlock:
 
865
        mutex_unlock(&local->mtx);
 
866
        return ret;
 
867
}
 
868
 
 
869
/*
 
870
 * Only call this function when a scan can't be queued -- under RTNL.
 
871
 */
 
872
void ieee80211_scan_cancel(struct ieee80211_local *local)
 
873
{
 
874
        /*
 
875
         * We are canceling software scan, or deferred scan that was not
 
876
         * yet really started (see __ieee80211_start_scan ).
 
877
         *
 
878
         * Regarding hardware scan:
 
879
         * - we can not call  __ieee80211_scan_completed() as when
 
880
         *   SCAN_HW_SCANNING bit is set this function change
 
881
         *   local->hw_scan_req to operate on 5G band, what race with
 
882
         *   driver which can use local->hw_scan_req
 
883
         *
 
884
         * - we can not cancel scan_work since driver can schedule it
 
885
         *   by ieee80211_scan_completed(..., true) to finish scan
 
886
         *
 
887
         * Hence we only call the cancel_hw_scan() callback, but the low-level
 
888
         * driver is still responsible for calling ieee80211_scan_completed()
 
889
         * after the scan was completed/aborted.
 
890
         */
 
891
 
 
892
        mutex_lock(&local->mtx);
 
893
        if (!local->scan_req)
 
894
                goto out;
 
895
 
 
896
        if (test_bit(SCAN_HW_SCANNING, &local->scanning)) {
 
897
                if (local->ops->cancel_hw_scan)
 
898
                        drv_cancel_hw_scan(local,
 
899
                                rcu_dereference_protected(local->scan_sdata,
 
900
                                                lockdep_is_held(&local->mtx)));
 
901
                goto out;
 
902
        }
 
903
 
 
904
        /*
 
905
         * If the work is currently running, it must be blocked on
 
906
         * the mutex, but we'll set scan_sdata = NULL and it'll
 
907
         * simply exit once it acquires the mutex.
 
908
         */
 
909
        cancel_delayed_work(&local->scan_work);
 
910
        /* and clean up */
 
911
        __ieee80211_scan_completed(&local->hw, true, false);
 
912
out:
 
913
        mutex_unlock(&local->mtx);
 
914
}
 
915
 
 
916
int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
 
917
                                       struct cfg80211_sched_scan_request *req)
 
918
{
 
919
        struct ieee80211_local *local = sdata->local;
 
920
        int ret, i;
 
921
 
 
922
        mutex_lock(&local->mtx);
 
923
 
 
924
        if (rcu_access_pointer(local->sched_scan_sdata)) {
 
925
                ret = -EBUSY;
 
926
                goto out;
 
927
        }
 
928
 
 
929
        if (!local->ops->sched_scan_start) {
 
930
                ret = -ENOTSUPP;
 
931
                goto out;
 
932
        }
 
933
 
 
934
        for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
 
935
                if (!local->hw.wiphy->bands[i])
 
936
                        continue;
 
937
 
 
938
                local->sched_scan_ies.ie[i] = kzalloc(2 +
 
939
                                                      IEEE80211_MAX_SSID_LEN +
 
940
                                                      local->scan_ies_len +
 
941
                                                      req->ie_len,
 
942
                                                      GFP_KERNEL);
 
943
                if (!local->sched_scan_ies.ie[i]) {
 
944
                        ret = -ENOMEM;
 
945
                        goto out_free;
 
946
                }
 
947
 
 
948
                local->sched_scan_ies.len[i] =
 
949
                        ieee80211_build_preq_ies(local,
 
950
                                                 local->sched_scan_ies.ie[i],
 
951
                                                 req->ie, req->ie_len, i,
 
952
                                                 (u32) -1, 0);
 
953
        }
 
954
 
 
955
        ret = drv_sched_scan_start(local, sdata, req,
 
956
                                   &local->sched_scan_ies);
 
957
        if (ret == 0) {
 
958
                rcu_assign_pointer(local->sched_scan_sdata, sdata);
 
959
                goto out;
 
960
        }
 
961
 
 
962
out_free:
 
963
        while (i > 0)
 
964
                kfree(local->sched_scan_ies.ie[--i]);
 
965
out:
 
966
        mutex_unlock(&local->mtx);
 
967
        return ret;
 
968
}
 
969
 
 
970
int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata)
 
971
{
 
972
        struct ieee80211_local *local = sdata->local;
 
973
        int ret = 0, i;
 
974
 
 
975
        mutex_lock(&local->mtx);
 
976
 
 
977
        if (!local->ops->sched_scan_stop) {
 
978
                ret = -ENOTSUPP;
 
979
                goto out;
 
980
        }
 
981
 
 
982
        if (rcu_access_pointer(local->sched_scan_sdata)) {
 
983
                for (i = 0; i < IEEE80211_NUM_BANDS; i++)
 
984
                        kfree(local->sched_scan_ies.ie[i]);
 
985
 
 
986
                drv_sched_scan_stop(local, sdata);
 
987
        }
 
988
out:
 
989
        mutex_unlock(&local->mtx);
 
990
 
 
991
        return ret;
 
992
}
 
993
 
 
994
void ieee80211_sched_scan_results(struct ieee80211_hw *hw)
 
995
{
 
996
        struct ieee80211_local *local = hw_to_local(hw);
 
997
 
 
998
        trace_api_sched_scan_results(local);
 
999
 
 
1000
        cfg80211_sched_scan_results(hw->wiphy);
 
1001
}
 
1002
EXPORT_SYMBOL(ieee80211_sched_scan_results);
 
1003
 
 
1004
void ieee80211_sched_scan_stopped_work(struct work_struct *work)
 
1005
{
 
1006
        struct ieee80211_local *local =
 
1007
                container_of(work, struct ieee80211_local,
 
1008
                             sched_scan_stopped_work);
 
1009
        int i;
 
1010
 
 
1011
        mutex_lock(&local->mtx);
 
1012
 
 
1013
        if (!rcu_access_pointer(local->sched_scan_sdata)) {
 
1014
                mutex_unlock(&local->mtx);
 
1015
                return;
 
1016
        }
 
1017
 
 
1018
        for (i = 0; i < IEEE80211_NUM_BANDS; i++)
 
1019
                kfree(local->sched_scan_ies.ie[i]);
 
1020
 
 
1021
        rcu_assign_pointer(local->sched_scan_sdata, NULL);
 
1022
 
 
1023
        mutex_unlock(&local->mtx);
 
1024
 
 
1025
        cfg80211_sched_scan_stopped(local->hw.wiphy);
 
1026
}
 
1027
 
 
1028
void ieee80211_sched_scan_stopped(struct ieee80211_hw *hw)
 
1029
{
 
1030
        struct ieee80211_local *local = hw_to_local(hw);
 
1031
 
 
1032
        trace_api_sched_scan_stopped(local);
 
1033
 
 
1034
        ieee80211_queue_work(&local->hw, &local->sched_scan_stopped_work);
 
1035
}
 
1036
EXPORT_SYMBOL(ieee80211_sched_scan_stopped);