2007-05-05 11:45:53 -07:00
/*
* Copyright 2002 - 2005 , Devicescape Software , Inc .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef STA_INFO_H
# define STA_INFO_H
# include <linux/list.h>
# include <linux/types.h>
# include <linux/if_ether.h>
# include "ieee80211_key.h"
2008-01-28 17:19:37 +01:00
/**
* enum ieee80211_sta_info_flags - Stations flags
*
* These flags are used with & struct sta_info ' s @ flags member .
*
* @ WLAN_STA_AUTH : Station is authenticated .
* @ WLAN_STA_ASSOC : Station is associated .
* @ WLAN_STA_PS : Station is in power - save mode
* @ WLAN_STA_AUTHORIZED : Station is authorized to send / receive traffic .
* This bit is always checked so needs to be enabled for all stations
* when virtual port control is not in use .
* @ WLAN_STA_SHORT_PREAMBLE : Station is capable of receiving short - preamble
* frames .
* @ WLAN_STA_ASSOC_AP : We ' re associated to that station , it is an AP .
* @ WLAN_STA_WME : Station is a QoS - STA .
* @ WLAN_STA_WDS : Station is one of our WDS peers .
2008-02-19 11:31:14 +01:00
* @ WLAN_STA_PSPOLL : Station has just PS - polled us .
2008-02-20 23:59:33 +01:00
* @ WLAN_STA_CLEAR_PS_FILT : Clear PS filter in hardware ( using the
* IEEE80211_TXCTL_CLEAR_PS_FILT control flag ) when the next
* frame to this station is transmitted .
2008-01-28 17:19:37 +01:00
*/
enum ieee80211_sta_info_flags {
WLAN_STA_AUTH = 1 < < 0 ,
WLAN_STA_ASSOC = 1 < < 1 ,
WLAN_STA_PS = 1 < < 2 ,
2008-02-20 02:07:21 +01:00
WLAN_STA_AUTHORIZED = 1 < < 3 ,
WLAN_STA_SHORT_PREAMBLE = 1 < < 4 ,
WLAN_STA_ASSOC_AP = 1 < < 5 ,
WLAN_STA_WME = 1 < < 6 ,
WLAN_STA_WDS = 1 < < 7 ,
WLAN_STA_PSPOLL = 1 < < 8 ,
2008-02-20 23:59:33 +01:00
WLAN_STA_CLEAR_PS_FILT = 1 < < 9 ,
2008-01-28 17:19:37 +01:00
} ;
2007-05-05 11:45:53 -07:00
2007-12-25 17:00:32 +02:00
# define STA_TID_NUM 16
# define ADDBA_RESP_INTERVAL HZ
2008-01-28 14:07:16 +02:00
# define HT_AGG_MAX_RETRIES (0x3)
2007-12-25 17:00:32 +02:00
# define HT_AGG_STATE_INITIATOR_SHIFT (4)
2008-01-28 14:07:16 +02:00
# define HT_ADDBA_REQUESTED_MSK BIT(0)
# define HT_ADDBA_DRV_READY_MSK BIT(1)
# define HT_ADDBA_RECEIVED_MSK BIT(2)
2007-12-25 17:00:32 +02:00
# define HT_AGG_STATE_REQ_STOP_BA_MSK BIT(3)
2008-01-28 14:07:16 +02:00
# define HT_AGG_STATE_INITIATOR_MSK BIT(HT_AGG_STATE_INITIATOR_SHIFT)
2007-12-25 17:00:32 +02:00
# define HT_AGG_STATE_IDLE (0x0)
2008-01-28 14:07:16 +02:00
# define HT_AGG_STATE_OPERATIONAL (HT_ADDBA_REQUESTED_MSK | \
HT_ADDBA_DRV_READY_MSK | \
HT_ADDBA_RECEIVED_MSK )
/**
* struct tid_ampdu_tx - TID aggregation information ( Tx ) .
*
* @ state : TID ' s state in session state machine .
* @ dialog_token : dialog token for aggregation session
* @ ssn : Starting Sequence Number expected to be aggregated .
* @ addba_resp_timer : timer for peer ' s response to addba request
* @ addba_req_num : number of times addBA request has been sent .
*/
struct tid_ampdu_tx {
u8 state ;
u8 dialog_token ;
u16 ssn ;
struct timer_list addba_resp_timer ;
u8 addba_req_num ;
} ;
2007-12-25 17:00:32 +02:00
/**
* struct tid_ampdu_rx - TID aggregation information ( Rx ) .
*
* @ state : TID ' s state in session state machine .
* @ dialog_token : dialog token for aggregation session
* @ ssn : Starting Sequence Number expected to be aggregated .
* @ buf_size : buffer size for incoming A - MPDUs
* @ timeout : reset timer value .
* @ head_seq_num : head sequence number in reordering buffer .
* @ stored_mpdu_num : number of MPDUs in reordering buffer
* @ reorder_buf : buffer to reorder incoming aggregated MPDUs
* @ session_timer : check if peer keeps Tx - ing on the TID ( by timeout value )
*/
struct tid_ampdu_rx {
u8 state ;
u8 dialog_token ;
u16 ssn ;
u16 buf_size ;
u16 timeout ;
u16 head_seq_num ;
u16 stored_mpdu_num ;
struct sk_buff * * reorder_buf ;
struct timer_list session_timer ;
} ;
2008-02-23 15:17:11 +01:00
enum plink_state {
LISTEN ,
OPN_SNT ,
OPN_RCVD ,
CNF_RCVD ,
ESTAB ,
HOLDING ,
BLOCKED
} ;
2007-12-25 17:00:32 +02:00
/**
* struct sta_ampdu_mlme - STA aggregation information .
*
2008-01-28 14:07:16 +02:00
* @ tid_rx : aggregation info for Rx per TID
* @ tid_tx : aggregation info for Tx per TID
2007-12-25 17:00:32 +02:00
* @ ampdu_rx : for locking sections in aggregation Rx flow
2008-01-28 14:07:16 +02:00
* @ ampdu_tx : for locking sectionsi in aggregation Tx flow
* @ dialog_token_allocator : dialog token enumerator for each new session ;
2007-12-25 17:00:32 +02:00
*/
struct sta_ampdu_mlme {
struct tid_ampdu_rx tid_rx [ STA_TID_NUM ] ;
2008-01-28 14:07:16 +02:00
struct tid_ampdu_tx tid_tx [ STA_TID_NUM ] ;
2007-12-25 17:00:32 +02:00
spinlock_t ampdu_rx ;
2008-01-28 14:07:16 +02:00
spinlock_t ampdu_tx ;
u8 dialog_token_allocator ;
2007-12-25 17:00:32 +02:00
} ;
2007-05-05 11:45:53 -07:00
2008-02-25 16:27:46 +01:00
/* see __sta_info_unlink */
# define STA_INFO_PIN_STAT_NORMAL 0
# define STA_INFO_PIN_STAT_PINNED 1
# define STA_INFO_PIN_STAT_DESTROY 2
2007-05-05 11:45:53 -07:00
struct sta_info {
struct list_head list ;
struct sta_info * hnext ; /* next entry in hash table list */
struct ieee80211_local * local ;
u8 addr [ ETH_ALEN ] ;
u16 aid ; /* STA's unique AID (1..2007), 0 = not yet assigned */
u32 flags ; /* WLAN_STA_ */
struct sk_buff_head ps_tx_buf ; /* buffer of TX frames for station in
* power saving state */
struct sk_buff_head tx_filtered ; /* buffer of TX frames that were
* already given to low - level driver ,
* but were filtered */
unsigned long rx_packets , tx_packets ; /* number of RX/TX MSDUs */
unsigned long rx_bytes , tx_bytes ;
unsigned long tx_retry_failed , tx_retry_count ;
unsigned long tx_filtered_count ;
2008-02-23 15:17:11 +01:00
/* moving percentage of failed MSDUs */
unsigned int fail_avg ;
2007-05-05 11:45:53 -07:00
unsigned int wep_weak_iv_count ; /* number of RX frames with weak IV */
unsigned long last_rx ;
2008-01-24 19:38:38 +01:00
/* bitmap of supported rates per band */
u64 supp_rates [ IEEE80211_NUM_BANDS ] ;
int txrate_idx ;
/* last rates used to send a frame to this STA */
int last_txrate_idx , last_nonerp_txrate_idx ;
2007-05-05 11:45:53 -07:00
2008-02-25 16:27:46 +01:00
/* sub_if_data this sta belongs to */
struct ieee80211_sub_if_data * sdata ;
2007-05-05 11:45:53 -07:00
struct ieee80211_key * key ;
u32 tx_num_consecutive_failures ;
u32 tx_num_mpdu_ok ;
u32 tx_num_mpdu_fail ;
struct rate_control_ref * rate_ctrl ;
void * rate_ctrl_priv ;
/* last received seq/frag number from this STA (per RX queue) */
__le16 last_seq_ctrl [ NUM_RX_DATA_QUEUES ] ;
unsigned long num_duplicates ; /* number of duplicate frames received
* from this STA */
unsigned long tx_fragments ; /* number of transmitted MPDUs */
unsigned long rx_fragments ; /* number of received MPDUs */
unsigned long rx_dropped ; /* number of dropped MPDUs from this STA */
int last_rssi ; /* RSSI of last received frame from this STA */
int last_signal ; /* signal of last received frame from this STA */
int last_noise ; /* noise of last received frame from this STA */
int channel_use ;
int channel_use_raw ;
# ifdef CONFIG_MAC80211_DEBUG_COUNTERS
unsigned int wme_rx_queue [ NUM_RX_DATA_QUEUES ] ;
unsigned int wme_tx_queue [ NUM_RX_DATA_QUEUES ] ;
# endif /* CONFIG_MAC80211_DEBUG_COUNTERS */
u16 listen_interval ;
2007-05-05 11:46:38 -07:00
2008-02-25 16:27:46 +01:00
/*
* for use by the internal lifetime management ,
* see __sta_info_unlink
*/
u8 pin_status ;
2007-11-26 16:14:30 +02:00
struct ieee80211_ht_info ht_info ; /* 802.11n HT capabilities
of this STA */
2007-12-25 17:00:32 +02:00
struct sta_ampdu_mlme ampdu_mlme ;
u8 timer_to_tid [ STA_TID_NUM ] ; /* convert timer id to tid */
2008-01-28 14:07:16 +02:00
u8 tid_to_tx_q [ STA_TID_NUM ] ; /* map tid to tx queue */
2008-02-23 15:17:11 +01:00
# ifdef CONFIG_MAC80211_MESH
/* mesh peer link attributes */
__le16 llid ; /* Local link ID */
__le16 plid ; /* Peer link ID */
__le16 reason ; /* Buffer for cancel reason on HOLDING state */
2008-02-25 22:17:30 +01:00
u8 plink_retries ; /* Retries in establishment */
bool ignore_plink_timer ;
2008-02-23 15:17:11 +01:00
enum plink_state plink_state ;
u32 plink_timeout ;
struct timer_list plink_timer ;
spinlock_t plink_lock ; /* For peer_state reads / updates and other
updates in the structure . Ensures robust
transitions for the peerlink FSM */
# endif
2007-11-26 16:14:30 +02:00
2007-05-05 11:46:38 -07:00
# ifdef CONFIG_MAC80211_DEBUGFS
struct sta_info_debugfsdentries {
struct dentry * dir ;
struct dentry * flags ;
struct dentry * num_ps_buf_frames ;
struct dentry * inactive_ms ;
struct dentry * last_seq_ctrl ;
# ifdef CONFIG_MAC80211_DEBUG_COUNTERS
struct dentry * wme_rx_queue ;
struct dentry * wme_tx_queue ;
# endif
2008-01-28 14:07:20 +02:00
struct dentry * agg_status ;
2007-05-05 11:46:38 -07:00
} debugfs ;
# endif
2007-05-05 11:45:53 -07:00
} ;
2008-02-25 16:24:38 +01:00
static inline enum plink_state sta_plink_state ( struct sta_info * sta )
{
# ifdef CONFIG_MAC80211_MESH
return sta - > plink_state ;
# endif
return LISTEN ;
}
2007-05-05 11:45:53 -07:00
/* Maximum number of concurrently registered stations */
# define MAX_STA_COUNT 2007
# define STA_HASH_SIZE 256
# define STA_HASH(sta) (sta[5])
/* Maximum number of frames to buffer per power saving station */
# define STA_MAX_TX_BUFFER 128
/* Minimum buffered frame expiry time. If STA uses listen interval that is
* smaller than this value , the minimum value here is used instead . */
# define STA_TX_BUFFER_EXPIRE (10 * HZ)
/* How often station data is cleaned up (e.g., expiration of buffered frames)
*/
# define STA_INFO_CLEANUP_INTERVAL (10 * HZ)
2008-02-25 16:27:46 +01:00
/*
* Get a STA info , must have be under RCU read lock .
*/
struct sta_info * sta_info_get ( struct ieee80211_local * local , u8 * addr ) ;
/*
* Get STA info by index , BROKEN !
*/
2008-02-23 15:17:11 +01:00
struct sta_info * sta_info_get_by_idx ( struct ieee80211_local * local , int idx ,
struct net_device * dev ) ;
2008-02-25 16:27:46 +01:00
/*
* Add a new STA info , must be under RCU read lock
* because otherwise the returned reference isn ' t
* necessarily valid long enough .
*/
struct sta_info * sta_info_add ( struct ieee80211_sub_if_data * sdata ,
u8 * addr ) ;
/*
* Unlink a STA info from the hash table / list .
* This can NULL the STA pointer if somebody else
* has already unlinked it .
*/
void sta_info_unlink ( struct sta_info * * sta ) ;
2007-05-05 11:45:53 -07:00
2008-02-25 16:27:46 +01:00
void sta_info_destroy ( struct sta_info * sta ) ;
2008-02-20 11:21:35 +01:00
void sta_info_set_tim_bit ( struct sta_info * sta ) ;
void sta_info_clear_tim_bit ( struct sta_info * sta ) ;
2008-02-25 16:27:46 +01:00
void sta_info_init ( struct ieee80211_local * local ) ;
int sta_info_start ( struct ieee80211_local * local ) ;
void sta_info_stop ( struct ieee80211_local * local ) ;
void sta_info_flush ( struct ieee80211_local * local ,
struct ieee80211_sub_if_data * sdata ) ;
2007-05-05 11:45:53 -07:00
# endif /* STA_INFO_H */