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