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