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