Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.37-rc2 497 lines 16 kB view raw
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 "key.h" 17 18/** 19 * enum ieee80211_sta_info_flags - Stations flags 20 * 21 * These flags are used with &struct sta_info's @flags member. 22 * 23 * @WLAN_STA_AUTH: Station is authenticated. 24 * @WLAN_STA_ASSOC: Station is associated. 25 * @WLAN_STA_PS_STA: Station is in power-save mode 26 * @WLAN_STA_AUTHORIZED: Station is authorized to send/receive traffic. 27 * This bit is always checked so needs to be enabled for all stations 28 * when virtual port control is not in use. 29 * @WLAN_STA_SHORT_PREAMBLE: Station is capable of receiving short-preamble 30 * frames. 31 * @WLAN_STA_ASSOC_AP: We're associated to that station, it is an AP. 32 * @WLAN_STA_WME: Station is a QoS-STA. 33 * @WLAN_STA_WDS: Station is one of our WDS peers. 34 * @WLAN_STA_CLEAR_PS_FILT: Clear PS filter in hardware (using the 35 * IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next 36 * frame to this station is transmitted. 37 * @WLAN_STA_MFP: Management frame protection is used with this STA. 38 * @WLAN_STA_BLOCK_BA: Used to deny ADDBA requests (both TX and RX) 39 * during suspend/resume and station removal. 40 * @WLAN_STA_PS_DRIVER: driver requires keeping this station in 41 * power-save mode logically to flush frames that might still 42 * be in the queues 43 * @WLAN_STA_PSPOLL: Station sent PS-poll while driver was keeping 44 * station in power-save mode, reply when the driver unblocks. 45 */ 46enum ieee80211_sta_info_flags { 47 WLAN_STA_AUTH = 1<<0, 48 WLAN_STA_ASSOC = 1<<1, 49 WLAN_STA_PS_STA = 1<<2, 50 WLAN_STA_AUTHORIZED = 1<<3, 51 WLAN_STA_SHORT_PREAMBLE = 1<<4, 52 WLAN_STA_ASSOC_AP = 1<<5, 53 WLAN_STA_WME = 1<<6, 54 WLAN_STA_WDS = 1<<7, 55 WLAN_STA_CLEAR_PS_FILT = 1<<9, 56 WLAN_STA_MFP = 1<<10, 57 WLAN_STA_BLOCK_BA = 1<<11, 58 WLAN_STA_PS_DRIVER = 1<<12, 59 WLAN_STA_PSPOLL = 1<<13, 60}; 61 62#define STA_TID_NUM 16 63#define ADDBA_RESP_INTERVAL HZ 64#define HT_AGG_MAX_RETRIES 0x3 65 66#define HT_AGG_STATE_DRV_READY 0 67#define HT_AGG_STATE_RESPONSE_RECEIVED 1 68#define HT_AGG_STATE_OPERATIONAL 2 69#define HT_AGG_STATE_STOPPING 3 70#define HT_AGG_STATE_WANT_START 4 71#define HT_AGG_STATE_WANT_STOP 5 72 73/** 74 * struct tid_ampdu_tx - TID aggregation information (Tx). 75 * 76 * @rcu_head: rcu head for freeing structure 77 * @addba_resp_timer: timer for peer's response to addba request 78 * @pending: pending frames queue -- use sta's spinlock to protect 79 * @dialog_token: dialog token for aggregation session 80 * @state: session state (see above) 81 * @stop_initiator: initiator of a session stop 82 * @tx_stop: TX DelBA frame when stopping 83 * 84 * This structure is protected by RCU and the per-station 85 * spinlock. Assignments to the array holding it must hold 86 * the spinlock, only the TX path can access it under RCU 87 * lock-free if, and only if, the state has the flag 88 * %HT_AGG_STATE_OPERATIONAL set. Otherwise, the TX path 89 * must also acquire the spinlock and re-check the state, 90 * see comments in the tx code touching it. 91 */ 92struct tid_ampdu_tx { 93 struct rcu_head rcu_head; 94 struct timer_list addba_resp_timer; 95 struct sk_buff_head pending; 96 unsigned long state; 97 u8 dialog_token; 98 u8 stop_initiator; 99 bool tx_stop; 100}; 101 102/** 103 * struct tid_ampdu_rx - TID aggregation information (Rx). 104 * 105 * @reorder_buf: buffer to reorder incoming aggregated MPDUs 106 * @reorder_time: jiffies when skb was added 107 * @session_timer: check if peer keeps Tx-ing on the TID (by timeout value) 108 * @reorder_timer: releases expired frames from the reorder buffer. 109 * @head_seq_num: head sequence number in reordering buffer. 110 * @stored_mpdu_num: number of MPDUs in reordering buffer 111 * @ssn: Starting Sequence Number expected to be aggregated. 112 * @buf_size: buffer size for incoming A-MPDUs 113 * @timeout: reset timer value (in TUs). 114 * @dialog_token: dialog token for aggregation session 115 * @rcu_head: RCU head used for freeing this struct 116 * @reorder_lock: serializes access to reorder buffer, see below. 117 * 118 * This structure is protected by RCU and the per-station 119 * spinlock. Assignments to the array holding it must hold 120 * the spinlock. 121 * 122 * The @reorder_lock is used to protect the variables and 123 * arrays such as @reorder_buf, @reorder_time, @head_seq_num, 124 * @stored_mpdu_num and @reorder_time from being corrupted by 125 * concurrent access of the RX path and the expired frame 126 * release timer. 127 */ 128struct tid_ampdu_rx { 129 struct rcu_head rcu_head; 130 spinlock_t reorder_lock; 131 struct sk_buff **reorder_buf; 132 unsigned long *reorder_time; 133 struct timer_list session_timer; 134 struct timer_list reorder_timer; 135 u16 head_seq_num; 136 u16 stored_mpdu_num; 137 u16 ssn; 138 u16 buf_size; 139 u16 timeout; 140 u8 dialog_token; 141}; 142 143/** 144 * struct sta_ampdu_mlme - STA aggregation information. 145 * 146 * @tid_rx: aggregation info for Rx per TID -- RCU protected 147 * @tid_tx: aggregation info for Tx per TID 148 * @addba_req_num: number of times addBA request has been sent. 149 * @dialog_token_allocator: dialog token enumerator for each new session; 150 * @work: work struct for starting/stopping aggregation 151 * @tid_rx_timer_expired: bitmap indicating on which TIDs the 152 * RX timer expired until the work for it runs 153 * @mtx: mutex to protect all TX data (except non-NULL assignments 154 * to tid_tx[idx], which are protected by the sta spinlock) 155 */ 156struct sta_ampdu_mlme { 157 struct mutex mtx; 158 /* rx */ 159 struct tid_ampdu_rx *tid_rx[STA_TID_NUM]; 160 unsigned long tid_rx_timer_expired[BITS_TO_LONGS(STA_TID_NUM)]; 161 /* tx */ 162 struct work_struct work; 163 struct tid_ampdu_tx *tid_tx[STA_TID_NUM]; 164 u8 addba_req_num[STA_TID_NUM]; 165 u8 dialog_token_allocator; 166}; 167 168 169/** 170 * enum plink_state - state of a mesh peer link finite state machine 171 * 172 * @PLINK_LISTEN: initial state, considered the implicit state of non existant 173 * mesh peer links 174 * @PLINK_OPN_SNT: mesh plink open frame has been sent to this mesh peer 175 * @PLINK_OPN_RCVD: mesh plink open frame has been received from this mesh peer 176 * @PLINK_CNF_RCVD: mesh plink confirm frame has been received from this mesh 177 * peer 178 * @PLINK_ESTAB: mesh peer link is established 179 * @PLINK_HOLDING: mesh peer link is being closed or cancelled 180 * @PLINK_BLOCKED: all frames transmitted from this mesh plink are discarded 181 */ 182enum plink_state { 183 PLINK_LISTEN, 184 PLINK_OPN_SNT, 185 PLINK_OPN_RCVD, 186 PLINK_CNF_RCVD, 187 PLINK_ESTAB, 188 PLINK_HOLDING, 189 PLINK_BLOCKED 190}; 191 192/** 193 * struct sta_info - STA information 194 * 195 * This structure collects information about a station that 196 * mac80211 is communicating with. 197 * 198 * @list: global linked list entry 199 * @hnext: hash table linked list pointer 200 * @local: pointer to the global information 201 * @sdata: virtual interface this station belongs to 202 * @ptk: peer key negotiated with this station, if any 203 * @gtk: group keys negotiated with this station, if any 204 * @rate_ctrl: rate control algorithm reference 205 * @rate_ctrl_priv: rate control private per-STA pointer 206 * @last_tx_rate: rate used for last transmit, to report to userspace as 207 * "the" transmit rate 208 * @lock: used for locking all fields that require locking, see comments 209 * in the header file. 210 * @flaglock: spinlock for flags accesses 211 * @drv_unblock_wk: used for driver PS unblocking 212 * @listen_interval: listen interval of this station, when we're acting as AP 213 * @flags: STA flags, see &enum ieee80211_sta_info_flags 214 * @ps_tx_buf: buffer of frames to transmit to this station 215 * when it leaves power saving state 216 * @tx_filtered: buffer of frames we already tried to transmit 217 * but were filtered by hardware due to STA having entered 218 * power saving state 219 * @rx_packets: Number of MSDUs received from this STA 220 * @rx_bytes: Number of bytes received from this STA 221 * @wep_weak_iv_count: number of weak WEP IVs received from this station 222 * @last_rx: time (in jiffies) when last frame was received from this STA 223 * @num_duplicates: number of duplicate frames received from this STA 224 * @rx_fragments: number of received MPDUs 225 * @rx_dropped: number of dropped MPDUs from this STA 226 * @last_signal: signal of last received frame from this STA 227 * @last_seq_ctrl: last received seq/frag number from this STA (per RX queue) 228 * @tx_filtered_count: number of frames the hardware filtered for this STA 229 * @tx_retry_failed: number of frames that failed retry 230 * @tx_retry_count: total number of retries for frames to this STA 231 * @fail_avg: moving percentage of failed MSDUs 232 * @tx_packets: number of RX/TX MSDUs 233 * @tx_bytes: number of bytes transmitted to this STA 234 * @tx_fragments: number of transmitted MPDUs 235 * @tid_seq: per-TID sequence numbers for sending to this STA 236 * @ampdu_mlme: A-MPDU state machine state 237 * @timer_to_tid: identity mapping to ID timers 238 * @llid: Local link ID 239 * @plid: Peer link ID 240 * @reason: Cancel reason on PLINK_HOLDING state 241 * @plink_retries: Retries in establishment 242 * @ignore_plink_timer: ignore the peer-link timer (used internally) 243 * @plink_state: peer link state 244 * @plink_timeout: timeout of peer link 245 * @plink_timer: peer link watch timer 246 * @plink_timer_was_running: used by suspend/resume to restore timers 247 * @debugfs: debug filesystem info 248 * @sta: station information we share with the driver 249 * @dead: set to true when sta is unlinked 250 * @uploaded: set to true when sta is uploaded to the driver 251 */ 252struct sta_info { 253 /* General information, mostly static */ 254 struct list_head list; 255 struct sta_info *hnext; 256 struct ieee80211_local *local; 257 struct ieee80211_sub_if_data *sdata; 258 struct ieee80211_key *gtk[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS]; 259 struct ieee80211_key *ptk; 260 struct rate_control_ref *rate_ctrl; 261 void *rate_ctrl_priv; 262 spinlock_t lock; 263 spinlock_t flaglock; 264 265 struct work_struct drv_unblock_wk; 266 267 u16 listen_interval; 268 269 bool dead; 270 271 bool uploaded; 272 273 /* 274 * frequently updated, locked with own spinlock (flaglock), 275 * use the accessors defined below 276 */ 277 u32 flags; 278 279 /* 280 * STA powersave frame queues, no more than the internal 281 * locking required. 282 */ 283 struct sk_buff_head ps_tx_buf; 284 struct sk_buff_head tx_filtered; 285 286 /* Updated from RX path only, no locking requirements */ 287 unsigned long rx_packets, rx_bytes; 288 unsigned long wep_weak_iv_count; 289 unsigned long last_rx; 290 unsigned long num_duplicates; 291 unsigned long rx_fragments; 292 unsigned long rx_dropped; 293 int last_signal; 294 __le16 last_seq_ctrl[NUM_RX_DATA_QUEUES]; 295 296 /* Updated from TX status path only, no locking requirements */ 297 unsigned long tx_filtered_count; 298 unsigned long tx_retry_failed, tx_retry_count; 299 /* moving percentage of failed MSDUs */ 300 unsigned int fail_avg; 301 302 /* Updated from TX path only, no locking requirements */ 303 unsigned long tx_packets; 304 unsigned long tx_bytes; 305 unsigned long tx_fragments; 306 struct ieee80211_tx_rate last_tx_rate; 307 u16 tid_seq[IEEE80211_QOS_CTL_TID_MASK + 1]; 308 309 /* 310 * Aggregation information, locked with lock. 311 */ 312 struct sta_ampdu_mlme ampdu_mlme; 313 u8 timer_to_tid[STA_TID_NUM]; 314 315#ifdef CONFIG_MAC80211_MESH 316 /* 317 * Mesh peer link attributes 318 * TODO: move to a sub-structure that is referenced with pointer? 319 */ 320 __le16 llid; 321 __le16 plid; 322 __le16 reason; 323 u8 plink_retries; 324 bool ignore_plink_timer; 325 bool plink_timer_was_running; 326 enum plink_state plink_state; 327 u32 plink_timeout; 328 struct timer_list plink_timer; 329#endif 330 331#ifdef CONFIG_MAC80211_DEBUGFS 332 struct sta_info_debugfsdentries { 333 struct dentry *dir; 334 bool add_has_run; 335 } debugfs; 336#endif 337 338 /* keep last! */ 339 struct ieee80211_sta sta; 340}; 341 342static inline enum plink_state sta_plink_state(struct sta_info *sta) 343{ 344#ifdef CONFIG_MAC80211_MESH 345 return sta->plink_state; 346#endif 347 return PLINK_LISTEN; 348} 349 350static inline void set_sta_flags(struct sta_info *sta, const u32 flags) 351{ 352 unsigned long irqfl; 353 354 spin_lock_irqsave(&sta->flaglock, irqfl); 355 sta->flags |= flags; 356 spin_unlock_irqrestore(&sta->flaglock, irqfl); 357} 358 359static inline void clear_sta_flags(struct sta_info *sta, const u32 flags) 360{ 361 unsigned long irqfl; 362 363 spin_lock_irqsave(&sta->flaglock, irqfl); 364 sta->flags &= ~flags; 365 spin_unlock_irqrestore(&sta->flaglock, irqfl); 366} 367 368static inline u32 test_sta_flags(struct sta_info *sta, const u32 flags) 369{ 370 u32 ret; 371 unsigned long irqfl; 372 373 spin_lock_irqsave(&sta->flaglock, irqfl); 374 ret = sta->flags & flags; 375 spin_unlock_irqrestore(&sta->flaglock, irqfl); 376 377 return ret; 378} 379 380static inline u32 test_and_clear_sta_flags(struct sta_info *sta, 381 const u32 flags) 382{ 383 u32 ret; 384 unsigned long irqfl; 385 386 spin_lock_irqsave(&sta->flaglock, irqfl); 387 ret = sta->flags & flags; 388 sta->flags &= ~flags; 389 spin_unlock_irqrestore(&sta->flaglock, irqfl); 390 391 return ret; 392} 393 394static inline u32 get_sta_flags(struct sta_info *sta) 395{ 396 u32 ret; 397 unsigned long irqfl; 398 399 spin_lock_irqsave(&sta->flaglock, irqfl); 400 ret = sta->flags; 401 spin_unlock_irqrestore(&sta->flaglock, irqfl); 402 403 return ret; 404} 405 406 407 408#define STA_HASH_SIZE 256 409#define STA_HASH(sta) (sta[5]) 410 411 412/* Maximum number of frames to buffer per power saving station */ 413#define STA_MAX_TX_BUFFER 128 414 415/* Minimum buffered frame expiry time. If STA uses listen interval that is 416 * smaller than this value, the minimum value here is used instead. */ 417#define STA_TX_BUFFER_EXPIRE (10 * HZ) 418 419/* How often station data is cleaned up (e.g., expiration of buffered frames) 420 */ 421#define STA_INFO_CLEANUP_INTERVAL (10 * HZ) 422 423/* 424 * Get a STA info, must be under RCU read lock. 425 */ 426struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata, 427 const u8 *addr); 428 429struct sta_info *sta_info_get_bss(struct ieee80211_sub_if_data *sdata, 430 const u8 *addr); 431 432static inline 433void for_each_sta_info_type_check(struct ieee80211_local *local, 434 const u8 *addr, 435 struct sta_info *sta, 436 struct sta_info *nxt) 437{ 438} 439 440#define for_each_sta_info(local, _addr, _sta, nxt) \ 441 for ( /* initialise loop */ \ 442 _sta = rcu_dereference(local->sta_hash[STA_HASH(_addr)]),\ 443 nxt = _sta ? rcu_dereference(_sta->hnext) : NULL; \ 444 /* typecheck */ \ 445 for_each_sta_info_type_check(local, (_addr), _sta, nxt),\ 446 /* continue condition */ \ 447 _sta; \ 448 /* advance loop */ \ 449 _sta = nxt, \ 450 nxt = _sta ? rcu_dereference(_sta->hnext) : NULL \ 451 ) \ 452 /* compare address and run code only if it matches */ \ 453 if (memcmp(_sta->sta.addr, (_addr), ETH_ALEN) == 0) 454 455/* 456 * Get STA info by index, BROKEN! 457 */ 458struct sta_info *sta_info_get_by_idx(struct ieee80211_sub_if_data *sdata, 459 int idx); 460/* 461 * Create a new STA info, caller owns returned structure 462 * until sta_info_insert(). 463 */ 464struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, 465 u8 *addr, gfp_t gfp); 466/* 467 * Insert STA info into hash table/list, returns zero or a 468 * -EEXIST if (if the same MAC address is already present). 469 * 470 * Calling the non-rcu version makes the caller relinquish, 471 * the _rcu version calls read_lock_rcu() and must be called 472 * without it held. 473 */ 474int sta_info_insert(struct sta_info *sta); 475int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU); 476int sta_info_insert_atomic(struct sta_info *sta); 477 478int sta_info_destroy_addr(struct ieee80211_sub_if_data *sdata, 479 const u8 *addr); 480int sta_info_destroy_addr_bss(struct ieee80211_sub_if_data *sdata, 481 const u8 *addr); 482 483void sta_info_set_tim_bit(struct sta_info *sta); 484void sta_info_clear_tim_bit(struct sta_info *sta); 485 486void sta_info_init(struct ieee80211_local *local); 487int sta_info_start(struct ieee80211_local *local); 488void sta_info_stop(struct ieee80211_local *local); 489int sta_info_flush(struct ieee80211_local *local, 490 struct ieee80211_sub_if_data *sdata); 491void ieee80211_sta_expire(struct ieee80211_sub_if_data *sdata, 492 unsigned long exp_time); 493 494void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta); 495void ieee80211_sta_ps_deliver_poll_response(struct sta_info *sta); 496 497#endif /* STA_INFO_H */