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 "ieee80211_key.h" 16 17 /** 18 * enum ieee80211_sta_info_flags - Stations flags 19 * 20 * These flags are used with &struct sta_info's @flags member. 21 * 22 * @WLAN_STA_AUTH: Station is authenticated. 23 * @WLAN_STA_ASSOC: Station is associated. 24 * @WLAN_STA_PS: Station is in power-save mode 25 * @WLAN_STA_AUTHORIZED: Station is authorized to send/receive traffic. 26 * This bit is always checked so needs to be enabled for all stations 27 * when virtual port control is not in use. 28 * @WLAN_STA_SHORT_PREAMBLE: Station is capable of receiving short-preamble 29 * frames. 30 * @WLAN_STA_ASSOC_AP: We're associated to that station, it is an AP. 31 * @WLAN_STA_WME: Station is a QoS-STA. 32 * @WLAN_STA_WDS: Station is one of our WDS peers. 33 * @WLAN_STA_PSPOLL: Station has just PS-polled us. 34 * @WLAN_STA_CLEAR_PS_FILT: Clear PS filter in hardware (using the 35 * IEEE80211_TXCTL_CLEAR_PS_FILT control flag) when the next 36 * frame to this station is transmitted. 37 */ 38 enum ieee80211_sta_info_flags { 39 WLAN_STA_AUTH = 1<<0, 40 WLAN_STA_ASSOC = 1<<1, 41 WLAN_STA_PS = 1<<2, 42 WLAN_STA_AUTHORIZED = 1<<3, 43 WLAN_STA_SHORT_PREAMBLE = 1<<4, 44 WLAN_STA_ASSOC_AP = 1<<5, 45 WLAN_STA_WME = 1<<6, 46 WLAN_STA_WDS = 1<<7, 47 WLAN_STA_PSPOLL = 1<<8, 48 WLAN_STA_CLEAR_PS_FILT = 1<<9, 49 }; 50 51 #define STA_TID_NUM 16 52 #define ADDBA_RESP_INTERVAL HZ 53 #define HT_AGG_MAX_RETRIES (0x3) 54 55 #define HT_AGG_STATE_INITIATOR_SHIFT (4) 56 57 #define HT_ADDBA_REQUESTED_MSK BIT(0) 58 #define HT_ADDBA_DRV_READY_MSK BIT(1) 59 #define HT_ADDBA_RECEIVED_MSK BIT(2) 60 #define HT_AGG_STATE_REQ_STOP_BA_MSK BIT(3) 61 #define HT_AGG_STATE_INITIATOR_MSK BIT(HT_AGG_STATE_INITIATOR_SHIFT) 62 #define HT_AGG_STATE_IDLE (0x0) 63 #define HT_AGG_STATE_OPERATIONAL (HT_ADDBA_REQUESTED_MSK | \ 64 HT_ADDBA_DRV_READY_MSK | \ 65 HT_ADDBA_RECEIVED_MSK) 66 67 /** 68 * struct tid_ampdu_tx - TID aggregation information (Tx). 69 * 70 * @state: TID's state in session state machine. 71 * @dialog_token: dialog token for aggregation session 72 * @ssn: Starting Sequence Number expected to be aggregated. 73 * @addba_resp_timer: timer for peer's response to addba request 74 * @addba_req_num: number of times addBA request has been sent. 75 */ 76 struct tid_ampdu_tx { 77 u8 state; 78 u8 dialog_token; 79 u16 ssn; 80 struct timer_list addba_resp_timer; 81 u8 addba_req_num; 82 }; 83 84 /** 85 * struct tid_ampdu_rx - TID aggregation information (Rx). 86 * 87 * @state: TID's state in session state machine. 88 * @dialog_token: dialog token for aggregation session 89 * @ssn: Starting Sequence Number expected to be aggregated. 90 * @buf_size: buffer size for incoming A-MPDUs 91 * @timeout: reset timer value. 92 * @head_seq_num: head sequence number in reordering buffer. 93 * @stored_mpdu_num: number of MPDUs in reordering buffer 94 * @reorder_buf: buffer to reorder incoming aggregated MPDUs 95 * @session_timer: check if peer keeps Tx-ing on the TID (by timeout value) 96 */ 97 struct tid_ampdu_rx { 98 u8 state; 99 u8 dialog_token; 100 u16 ssn; 101 u16 buf_size; 102 u16 timeout; 103 u16 head_seq_num; 104 u16 stored_mpdu_num; 105 struct sk_buff **reorder_buf; 106 struct timer_list session_timer; 107 }; 108 109 enum plink_state { 110 LISTEN, 111 OPN_SNT, 112 OPN_RCVD, 113 CNF_RCVD, 114 ESTAB, 115 HOLDING, 116 BLOCKED 117 }; 118 119 /** 120 * struct sta_ampdu_mlme - STA aggregation information. 121 * 122 * @tid_rx: aggregation info for Rx per TID 123 * @tid_tx: aggregation info for Tx per TID 124 * @ampdu_rx: for locking sections in aggregation Rx flow 125 * @ampdu_tx: for locking sectionsi in aggregation Tx flow 126 * @dialog_token_allocator: dialog token enumerator for each new session; 127 */ 128 struct sta_ampdu_mlme { 129 struct tid_ampdu_rx tid_rx[STA_TID_NUM]; 130 struct tid_ampdu_tx tid_tx[STA_TID_NUM]; 131 spinlock_t ampdu_rx; 132 spinlock_t ampdu_tx; 133 u8 dialog_token_allocator; 134 }; 135 136 137 /* see __sta_info_unlink */ 138 #define STA_INFO_PIN_STAT_NORMAL 0 139 #define STA_INFO_PIN_STAT_PINNED 1 140 #define STA_INFO_PIN_STAT_DESTROY 2 141 142 143 struct sta_info { 144 struct list_head list; 145 struct sta_info *hnext; /* next entry in hash table list */ 146 147 struct ieee80211_local *local; 148 149 u8 addr[ETH_ALEN]; 150 u16 aid; /* STA's unique AID (1..2007), 0 = not yet assigned */ 151 u32 flags; /* WLAN_STA_ */ 152 153 struct sk_buff_head ps_tx_buf; /* buffer of TX frames for station in 154 * power saving state */ 155 struct sk_buff_head tx_filtered; /* buffer of TX frames that were 156 * already given to low-level driver, 157 * but were filtered */ 158 unsigned long rx_packets, tx_packets; /* number of RX/TX MSDUs */ 159 unsigned long rx_bytes, tx_bytes; 160 unsigned long tx_retry_failed, tx_retry_count; 161 unsigned long tx_filtered_count; 162 /* moving percentage of failed MSDUs */ 163 unsigned int fail_avg; 164 165 unsigned int wep_weak_iv_count; /* number of RX frames with weak IV */ 166 167 unsigned long last_rx; 168 /* bitmap of supported rates per band */ 169 u64 supp_rates[IEEE80211_NUM_BANDS]; 170 int txrate_idx; 171 /* last rates used to send a frame to this STA */ 172 int last_txrate_idx, last_nonerp_txrate_idx; 173 174 /* sub_if_data this sta belongs to */ 175 struct ieee80211_sub_if_data *sdata; 176 177 struct ieee80211_key *key; 178 179 u32 tx_num_consecutive_failures; 180 u32 tx_num_mpdu_ok; 181 u32 tx_num_mpdu_fail; 182 183 struct rate_control_ref *rate_ctrl; 184 void *rate_ctrl_priv; 185 186 /* last received seq/frag number from this STA (per RX queue) */ 187 __le16 last_seq_ctrl[NUM_RX_DATA_QUEUES]; 188 unsigned long num_duplicates; /* number of duplicate frames received 189 * from this STA */ 190 unsigned long tx_fragments; /* number of transmitted MPDUs */ 191 unsigned long rx_fragments; /* number of received MPDUs */ 192 unsigned long rx_dropped; /* number of dropped MPDUs from this STA */ 193 194 int last_rssi; /* RSSI of last received frame from this STA */ 195 int last_signal; /* signal of last received frame from this STA */ 196 int last_noise; /* noise of last received frame from this STA */ 197 int channel_use; 198 int channel_use_raw; 199 200 #ifdef CONFIG_MAC80211_DEBUG_COUNTERS 201 unsigned int wme_rx_queue[NUM_RX_DATA_QUEUES]; 202 unsigned int wme_tx_queue[NUM_RX_DATA_QUEUES]; 203 #endif /* CONFIG_MAC80211_DEBUG_COUNTERS */ 204 205 u16 listen_interval; 206 207 /* 208 * for use by the internal lifetime management, 209 * see __sta_info_unlink 210 */ 211 u8 pin_status; 212 213 struct ieee80211_ht_info ht_info; /* 802.11n HT capabilities 214 of this STA */ 215 struct sta_ampdu_mlme ampdu_mlme; 216 u8 timer_to_tid[STA_TID_NUM]; /* convert timer id to tid */ 217 u8 tid_to_tx_q[STA_TID_NUM]; /* map tid to tx queue */ 218 #ifdef CONFIG_MAC80211_MESH 219 /* mesh peer link attributes */ 220 __le16 llid; /* Local link ID */ 221 __le16 plid; /* Peer link ID */ 222 __le16 reason; /* Buffer for cancel reason on HOLDING state */ 223 u8 plink_retries; /* Retries in establishment */ 224 bool ignore_plink_timer; 225 enum plink_state plink_state; 226 u32 plink_timeout; 227 struct timer_list plink_timer; 228 spinlock_t plink_lock; /* For peer_state reads / updates and other 229 updates in the structure. Ensures robust 230 transitions for the peerlink FSM */ 231 #endif 232 233 #ifdef CONFIG_MAC80211_DEBUGFS 234 struct sta_info_debugfsdentries { 235 struct dentry *dir; 236 struct dentry *flags; 237 struct dentry *num_ps_buf_frames; 238 struct dentry *inactive_ms; 239 struct dentry *last_seq_ctrl; 240 #ifdef CONFIG_MAC80211_DEBUG_COUNTERS 241 struct dentry *wme_rx_queue; 242 struct dentry *wme_tx_queue; 243 #endif 244 struct dentry *agg_status; 245 } debugfs; 246 #endif 247 }; 248 249 static inline enum plink_state sta_plink_state(struct sta_info *sta) 250 { 251 #ifdef CONFIG_MAC80211_MESH 252 return sta->plink_state; 253 #endif 254 return LISTEN; 255 } 256 257 258 /* Maximum number of concurrently registered stations */ 259 #define MAX_STA_COUNT 2007 260 261 #define STA_HASH_SIZE 256 262 #define STA_HASH(sta) (sta[5]) 263 264 265 /* Maximum number of frames to buffer per power saving station */ 266 #define STA_MAX_TX_BUFFER 128 267 268 /* Minimum buffered frame expiry time. If STA uses listen interval that is 269 * smaller than this value, the minimum value here is used instead. */ 270 #define STA_TX_BUFFER_EXPIRE (10 * HZ) 271 272 /* How often station data is cleaned up (e.g., expiration of buffered frames) 273 */ 274 #define STA_INFO_CLEANUP_INTERVAL (10 * HZ) 275 276 /* 277 * Get a STA info, must have be under RCU read lock. 278 */ 279 struct sta_info *sta_info_get(struct ieee80211_local *local, u8 *addr); 280 /* 281 * Get STA info by index, BROKEN! 282 */ 283 struct sta_info *sta_info_get_by_idx(struct ieee80211_local *local, int idx, 284 struct net_device *dev); 285 /* 286 * Add a new STA info, must be under RCU read lock 287 * because otherwise the returned reference isn't 288 * necessarily valid long enough. 289 */ 290 struct sta_info *sta_info_add(struct ieee80211_sub_if_data *sdata, 291 u8 *addr); 292 /* 293 * Unlink a STA info from the hash table/list. 294 * This can NULL the STA pointer if somebody else 295 * has already unlinked it. 296 */ 297 void sta_info_unlink(struct sta_info **sta); 298 299 void sta_info_destroy(struct sta_info *sta); 300 void sta_info_set_tim_bit(struct sta_info *sta); 301 void sta_info_clear_tim_bit(struct sta_info *sta); 302 303 void sta_info_init(struct ieee80211_local *local); 304 int sta_info_start(struct ieee80211_local *local); 305 void sta_info_stop(struct ieee80211_local *local); 306 void sta_info_flush(struct ieee80211_local *local, 307 struct ieee80211_sub_if_data *sdata); 308 309 #endif /* STA_INFO_H */ 310