Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
mac80211
sta_info.h
Go to the documentation of this file.
1
/*
2
* Copyright 2002-2005, Devicescape Software, Inc.
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 2 as
6
* published by the Free Software Foundation.
7
*/
8
9
#ifndef STA_INFO_H
10
#define STA_INFO_H
11
12
#include <linux/list.h>
13
#include <linux/types.h>
14
#include <linux/if_ether.h>
15
#include <
linux/workqueue.h
>
16
#include <
linux/average.h
>
17
#include <
linux/etherdevice.h
>
18
#include "
key.h
"
19
60
enum
ieee80211_sta_info_flags
{
61
WLAN_STA_AUTH
,
62
WLAN_STA_ASSOC
,
63
WLAN_STA_PS_STA
,
64
WLAN_STA_AUTHORIZED
,
65
WLAN_STA_SHORT_PREAMBLE
,
66
WLAN_STA_WME
,
67
WLAN_STA_WDS
,
68
WLAN_STA_CLEAR_PS_FILT
,
69
WLAN_STA_MFP
,
70
WLAN_STA_BLOCK_BA
,
71
WLAN_STA_PS_DRIVER
,
72
WLAN_STA_PSPOLL
,
73
WLAN_STA_TDLS_PEER
,
74
WLAN_STA_TDLS_PEER_AUTH
,
75
WLAN_STA_UAPSD
,
76
WLAN_STA_SP
,
77
WLAN_STA_4ADDR_EVENT
,
78
WLAN_STA_INSERTED
,
79
WLAN_STA_RATE_CONTROL
,
80
WLAN_STA_TOFFSET_KNOWN
,
81
};
82
83
#define STA_TID_NUM 16
84
#define ADDBA_RESP_INTERVAL HZ
85
#define HT_AGG_MAX_RETRIES 15
86
#define HT_AGG_BURST_RETRIES 3
87
#define HT_AGG_RETRIES_PERIOD (15 * HZ)
88
89
#define HT_AGG_STATE_DRV_READY 0
90
#define HT_AGG_STATE_RESPONSE_RECEIVED 1
91
#define HT_AGG_STATE_OPERATIONAL 2
92
#define HT_AGG_STATE_STOPPING 3
93
#define HT_AGG_STATE_WANT_START 4
94
#define HT_AGG_STATE_WANT_STOP 5
95
122
struct
tid_ampdu_tx
{
123
struct
rcu_head
rcu_head
;
124
struct
timer_list
session_timer
;
125
struct
timer_list
addba_resp_timer
;
126
struct
sk_buff_head
pending
;
127
unsigned
long
state
;
128
unsigned
long
last_tx
;
129
u16
timeout
;
130
u8
dialog_token
;
131
u8
stop_initiator
;
132
bool
tx_stop
;
133
u8
buf_size
;
134
135
u16
failed_bar_ssn
;
136
bool
bar_pending
;
137
};
138
164
struct
tid_ampdu_rx
{
165
struct
rcu_head
rcu_head
;
166
spinlock_t
reorder_lock
;
167
struct
sk_buff
**
reorder_buf
;
168
unsigned
long
*
reorder_time
;
169
struct
timer_list
session_timer
;
170
struct
timer_list
reorder_timer
;
171
unsigned
long
last_rx
;
172
u16
head_seq_num
;
173
u16
stored_mpdu_num
;
174
u16
ssn
;
175
u16
buf_size
;
176
u16
timeout
;
177
u8
dialog_token
;
178
};
179
197
struct
sta_ampdu_mlme
{
198
struct
mutex
mtx
;
199
/* rx */
200
struct
tid_ampdu_rx
__rcu
*
tid_rx
[
STA_TID_NUM
];
201
unsigned
long
tid_rx_timer_expired
[
BITS_TO_LONGS
(
STA_TID_NUM
)];
202
unsigned
long
tid_rx_stop_requested
[
BITS_TO_LONGS
(
STA_TID_NUM
)];
203
/* tx */
204
struct
work_struct
work
;
205
struct
tid_ampdu_tx
__rcu
*
tid_tx
[
STA_TID_NUM
];
206
struct
tid_ampdu_tx
*
tid_start_tx
[
STA_TID_NUM
];
207
unsigned
long
last_addba_req_time
[
STA_TID_NUM
];
208
u8
addba_req_num
[
STA_TID_NUM
];
209
u8
dialog_token_allocator
;
210
};
211
212
287
struct
sta_info
{
288
/* General information, mostly static */
289
struct
list_head
list;
290
struct
rcu_head
rcu_head
;
291
struct
sta_info
__rcu
*
hnext
;
292
struct
ieee80211_local
*
local
;
293
struct
ieee80211_sub_if_data
*
sdata
;
294
struct
ieee80211_key
__rcu
*
gtk
[
NUM_DEFAULT_KEYS
+
NUM_DEFAULT_MGMT_KEYS
];
295
struct
ieee80211_key
__rcu
*
ptk
;
296
struct
rate_control_ref
*
rate_ctrl
;
297
void
*
rate_ctrl_priv
;
298
spinlock_t
lock
;
299
300
struct
work_struct
drv_unblock_wk
;
301
struct
work_struct
free_sta_wk
;
302
303
u16
listen_interval
;
304
305
bool
dead
;
306
307
bool
uploaded
;
308
309
enum
ieee80211_sta_state
sta_state
;
310
311
/* use the accessors defined below */
312
unsigned
long
_flags
;
313
314
/*
315
* STA powersave frame queues, no more than the internal
316
* locking required.
317
*/
318
struct
sk_buff_head
ps_tx_buf
[
IEEE80211_NUM_ACS
];
319
struct
sk_buff_head
tx_filtered
[
IEEE80211_NUM_ACS
];
320
unsigned
long
driver_buffered_tids
;
321
322
/* Updated from RX path only, no locking requirements */
323
unsigned
long
rx_packets
,
rx_bytes
;
324
unsigned
long
wep_weak_iv_count
;
325
unsigned
long
last_rx
;
326
long
last_connected
;
327
unsigned
long
num_duplicates
;
328
unsigned
long
rx_fragments
;
329
unsigned
long
rx_dropped
;
330
int
last_signal
;
331
struct
ewma
avg_signal
;
332
/* Plus 1 for non-QoS frames */
333
__le16
last_seq_ctrl
[
NUM_RX_DATA_QUEUES
+ 1];
334
335
/* Updated from TX status path only, no locking requirements */
336
unsigned
long
tx_filtered_count
;
337
unsigned
long
tx_retry_failed
,
tx_retry_count
;
338
/* moving percentage of failed MSDUs */
339
unsigned
int
fail_avg
;
340
341
/* Updated from TX path only, no locking requirements */
342
unsigned
long
tx_packets
;
343
unsigned
long
tx_bytes
;
344
unsigned
long
tx_fragments
;
345
struct
ieee80211_tx_rate
last_tx_rate
;
346
int
last_rx_rate_idx
;
347
int
last_rx_rate_flag
;
348
u16
tid_seq
[
IEEE80211_QOS_CTL_TID_MASK
+ 1];
349
350
/*
351
* Aggregation information, locked with lock.
352
*/
353
struct
sta_ampdu_mlme
ampdu_mlme
;
354
u8
timer_to_tid
[
STA_TID_NUM
];
355
356
#ifdef CONFIG_MAC80211_MESH
357
/*
358
* Mesh peer link attributes
359
* TODO: move to a sub-structure that is referenced with pointer?
360
*/
361
__le16
llid;
362
__le16
plid;
363
__le16
reason
;
364
u8
plink_retries;
365
bool
ignore_plink_timer;
366
bool
plink_timer_was_running;
367
enum
nl80211_plink_state
plink_state;
368
u32
plink_timeout;
369
struct
timer_list
plink_timer;
370
s64
t_offset;
371
s64
t_offset_setpoint;
372
enum
nl80211_channel_type
ch_type;
373
#endif
374
375
#ifdef CONFIG_MAC80211_DEBUGFS
376
struct
sta_info_debugfsdentries {
377
struct
dentry
*
dir
;
378
bool
add_has_run;
379
} debugfs;
380
#endif
381
382
unsigned
int
lost_packets
;
383
unsigned
int
beacon_loss_count
;
384
385
bool
supports_40mhz
;
386
387
/* keep last! */
388
struct
ieee80211_sta
sta
;
389
};
390
391
static
inline
enum
nl80211_plink_state
sta_plink_state(
struct
sta_info
*sta)
392
{
393
#ifdef CONFIG_MAC80211_MESH
394
return
sta->plink_state;
395
#endif
396
return
NL80211_PLINK_LISTEN
;
397
}
398
399
static
inline
void
set_sta_flag(
struct
sta_info
*sta,
400
enum
ieee80211_sta_info_flags
flag
)
401
{
402
WARN_ON
(flag ==
WLAN_STA_AUTH
||
403
flag ==
WLAN_STA_ASSOC
||
404
flag ==
WLAN_STA_AUTHORIZED
);
405
set_bit
(flag, &sta->
_flags
);
406
}
407
408
static
inline
void
clear_sta_flag(
struct
sta_info
*sta,
409
enum
ieee80211_sta_info_flags
flag
)
410
{
411
WARN_ON
(flag ==
WLAN_STA_AUTH
||
412
flag ==
WLAN_STA_ASSOC
||
413
flag ==
WLAN_STA_AUTHORIZED
);
414
clear_bit
(flag, &sta->
_flags
);
415
}
416
417
static
inline
int
test_sta_flag(
struct
sta_info
*sta,
418
enum
ieee80211_sta_info_flags
flag
)
419
{
420
return
test_bit
(flag, &sta->
_flags
);
421
}
422
423
static
inline
int
test_and_clear_sta_flag(
struct
sta_info
*sta,
424
enum
ieee80211_sta_info_flags
flag
)
425
{
426
WARN_ON
(flag ==
WLAN_STA_AUTH
||
427
flag ==
WLAN_STA_ASSOC
||
428
flag ==
WLAN_STA_AUTHORIZED
);
429
return
test_and_clear_bit
(flag, &sta->
_flags
);
430
}
431
432
static
inline
int
test_and_set_sta_flag(
struct
sta_info
*sta,
433
enum
ieee80211_sta_info_flags
flag
)
434
{
435
WARN_ON
(flag ==
WLAN_STA_AUTH
||
436
flag ==
WLAN_STA_ASSOC
||
437
flag ==
WLAN_STA_AUTHORIZED
);
438
return
test_and_set_bit
(flag, &sta->
_flags
);
439
}
440
441
int
sta_info_move_state
(
struct
sta_info
*sta,
442
enum
ieee80211_sta_state
new_state
);
443
444
static
inline
void
sta_info_pre_move_state(
struct
sta_info
*sta,
445
enum
ieee80211_sta_state
new_state
)
446
{
447
int
ret
;
448
449
WARN_ON_ONCE
(test_sta_flag(sta,
WLAN_STA_INSERTED
));
450
451
ret =
sta_info_move_state
(sta, new_state);
452
WARN_ON_ONCE
(ret);
453
}
454
455
456
void
ieee80211_assign_tid_tx
(
struct
sta_info
*sta,
int
tid,
457
struct
tid_ampdu_tx
*tid_tx);
458
459
static
inline
struct
tid_ampdu_tx
*
460
rcu_dereference_protected_tid_tx(
struct
sta_info
*sta,
int
tid)
461
{
462
return
rcu_dereference_protected
(sta->
ampdu_mlme
.tid_tx[tid],
463
lockdep_is_held(&sta->
lock
) ||
464
lockdep_is_held(&sta->
ampdu_mlme
.mtx));
465
}
466
467
#define STA_HASH_SIZE 256
468
#define STA_HASH(sta) (sta[5])
469
470
471
/* Maximum number of frames to buffer per power saving station per AC */
472
#define STA_MAX_TX_BUFFER 64
473
474
/* Minimum buffered frame expiry time. If STA uses listen interval that is
475
* smaller than this value, the minimum value here is used instead. */
476
#define STA_TX_BUFFER_EXPIRE (10 * HZ)
477
478
/* How often station data is cleaned up (e.g., expiration of buffered frames)
479
*/
480
#define STA_INFO_CLEANUP_INTERVAL (10 * HZ)
481
482
/*
483
* Get a STA info, must be under RCU read lock.
484
*/
485
struct
sta_info
*
sta_info_get
(
struct
ieee80211_sub_if_data
*
sdata
,
486
const
u8
*
addr
);
487
488
struct
sta_info
*
sta_info_get_bss
(
struct
ieee80211_sub_if_data
*
sdata
,
489
const
u8
*
addr
);
490
491
static
inline
492
void
for_each_sta_info_type_check(
struct
ieee80211_local
*
local
,
493
const
u8
*
addr
,
494
struct
sta_info
*sta,
495
struct
sta_info
*nxt)
496
{
497
}
498
499
#define for_each_sta_info(local, _addr, _sta, nxt) \
500
for (
/* initialise loop */
\
501
_sta = rcu_dereference(local->sta_hash[STA_HASH(_addr)]),\
502
nxt = _sta ? rcu_dereference(_sta->hnext) : NULL; \
503
/* typecheck */
\
504
for_each_sta_info_type_check(local, (_addr), _sta, nxt),\
505
/* continue condition */
\
506
_sta; \
507
/* advance loop */
\
508
_sta = nxt, \
509
nxt = _sta ? rcu_dereference(_sta->hnext) : NULL \
510
) \
511
/* compare address and run code only if it matches */
\
512
if (ether_addr_equal(_sta->sta.addr, (_addr)))
513
514
/*
515
* Get STA info by index, BROKEN!
516
*/
517
struct
sta_info
*
sta_info_get_by_idx
(
struct
ieee80211_sub_if_data
*
sdata
,
518
int
idx
);
519
/*
520
* Create a new STA info, caller owns returned structure
521
* until sta_info_insert().
522
*/
523
struct
sta_info
*
sta_info_alloc
(
struct
ieee80211_sub_if_data
*
sdata
,
524
const
u8
*
addr
,
gfp_t
gfp);
525
526
void
sta_info_free
(
struct
ieee80211_local
*
local
,
struct
sta_info
*sta);
527
528
/*
529
* Insert STA info into hash table/list, returns zero or a
530
* -EEXIST if (if the same MAC address is already present).
531
*
532
* Calling the non-rcu version makes the caller relinquish,
533
* the _rcu version calls read_lock_rcu() and must be called
534
* without it held.
535
*/
536
int
sta_info_insert
(
struct
sta_info
*sta);
537
int
sta_info_insert_rcu
(
struct
sta_info
*sta)
__acquires
(RCU);
538
539
int
__must_check
__sta_info_destroy
(
struct
sta_info
*sta);
540
int
sta_info_destroy_addr
(
struct
ieee80211_sub_if_data
*
sdata
,
541
const
u8
*
addr
);
542
int
sta_info_destroy_addr_bss
(
struct
ieee80211_sub_if_data
*
sdata
,
543
const
u8
*
addr
);
544
545
void
sta_info_recalc_tim
(
struct
sta_info
*sta);
546
547
void
sta_info_init
(
struct
ieee80211_local
*
local
);
548
void
sta_info_stop
(
struct
ieee80211_local
*
local
);
549
int
sta_info_flush
(
struct
ieee80211_local
*
local
,
550
struct
ieee80211_sub_if_data
*
sdata
);
551
void
sta_set_rate_info_tx
(
struct
sta_info
*sta,
552
const
struct
ieee80211_tx_rate
*
rate
,
553
struct
rate_info
*rinfo);
554
void
ieee80211_sta_expire
(
struct
ieee80211_sub_if_data
*
sdata
,
555
unsigned
long
exp_time);
556
557
void
ieee80211_sta_ps_deliver_wakeup
(
struct
sta_info
*sta);
558
void
ieee80211_sta_ps_deliver_poll_response
(
struct
sta_info
*sta);
559
void
ieee80211_sta_ps_deliver_uapsd
(
struct
sta_info
*sta);
560
561
#endif
/* STA_INFO_H */
Generated on Thu Jan 10 2013 14:31:14 for Linux Kernel by
1.8.2