Commit | Line | Data |
---|---|---|
f0706e82 JB |
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/kref.h> | |
16 | #include "ieee80211_key.h" | |
17 | ||
238814fd JB |
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: Station is in power-save mode | |
238814fd JB |
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. | |
4a9a66e9 | 34 | * @WLAN_STA_PSPOLL: Station has just PS-polled us. |
238814fd JB |
35 | */ |
36 | enum ieee80211_sta_info_flags { | |
37 | WLAN_STA_AUTH = 1<<0, | |
38 | WLAN_STA_ASSOC = 1<<1, | |
39 | WLAN_STA_PS = 1<<2, | |
836341a7 JB |
40 | WLAN_STA_AUTHORIZED = 1<<3, |
41 | WLAN_STA_SHORT_PREAMBLE = 1<<4, | |
42 | WLAN_STA_ASSOC_AP = 1<<5, | |
43 | WLAN_STA_WME = 1<<6, | |
44 | WLAN_STA_WDS = 1<<7, | |
45 | WLAN_STA_PSPOLL = 1<<8, | |
238814fd | 46 | }; |
f0706e82 | 47 | |
5aae2880 RR |
48 | #define STA_TID_NUM 16 |
49 | #define ADDBA_RESP_INTERVAL HZ | |
80656c20 | 50 | #define HT_AGG_MAX_RETRIES (0x3) |
5aae2880 RR |
51 | |
52 | #define HT_AGG_STATE_INITIATOR_SHIFT (4) | |
53 | ||
80656c20 RR |
54 | #define HT_ADDBA_REQUESTED_MSK BIT(0) |
55 | #define HT_ADDBA_DRV_READY_MSK BIT(1) | |
56 | #define HT_ADDBA_RECEIVED_MSK BIT(2) | |
5aae2880 | 57 | #define HT_AGG_STATE_REQ_STOP_BA_MSK BIT(3) |
80656c20 | 58 | #define HT_AGG_STATE_INITIATOR_MSK BIT(HT_AGG_STATE_INITIATOR_SHIFT) |
5aae2880 | 59 | #define HT_AGG_STATE_IDLE (0x0) |
80656c20 RR |
60 | #define HT_AGG_STATE_OPERATIONAL (HT_ADDBA_REQUESTED_MSK | \ |
61 | HT_ADDBA_DRV_READY_MSK | \ | |
62 | HT_ADDBA_RECEIVED_MSK) | |
63 | ||
64 | /** | |
65 | * struct tid_ampdu_tx - TID aggregation information (Tx). | |
66 | * | |
67 | * @state: TID's state in session state machine. | |
68 | * @dialog_token: dialog token for aggregation session | |
69 | * @ssn: Starting Sequence Number expected to be aggregated. | |
70 | * @addba_resp_timer: timer for peer's response to addba request | |
71 | * @addba_req_num: number of times addBA request has been sent. | |
72 | */ | |
73 | struct tid_ampdu_tx { | |
74 | u8 state; | |
75 | u8 dialog_token; | |
76 | u16 ssn; | |
77 | struct timer_list addba_resp_timer; | |
78 | u8 addba_req_num; | |
79 | }; | |
5aae2880 RR |
80 | |
81 | /** | |
82 | * struct tid_ampdu_rx - TID aggregation information (Rx). | |
83 | * | |
84 | * @state: TID's state in session state machine. | |
85 | * @dialog_token: dialog token for aggregation session | |
86 | * @ssn: Starting Sequence Number expected to be aggregated. | |
87 | * @buf_size: buffer size for incoming A-MPDUs | |
88 | * @timeout: reset timer value. | |
89 | * @head_seq_num: head sequence number in reordering buffer. | |
90 | * @stored_mpdu_num: number of MPDUs in reordering buffer | |
91 | * @reorder_buf: buffer to reorder incoming aggregated MPDUs | |
92 | * @session_timer: check if peer keeps Tx-ing on the TID (by timeout value) | |
93 | */ | |
94 | struct tid_ampdu_rx { | |
95 | u8 state; | |
96 | u8 dialog_token; | |
97 | u16 ssn; | |
98 | u16 buf_size; | |
99 | u16 timeout; | |
100 | u16 head_seq_num; | |
101 | u16 stored_mpdu_num; | |
102 | struct sk_buff **reorder_buf; | |
103 | struct timer_list session_timer; | |
104 | }; | |
105 | ||
106 | /** | |
107 | * struct sta_ampdu_mlme - STA aggregation information. | |
108 | * | |
80656c20 RR |
109 | * @tid_rx: aggregation info for Rx per TID |
110 | * @tid_tx: aggregation info for Tx per TID | |
5aae2880 | 111 | * @ampdu_rx: for locking sections in aggregation Rx flow |
80656c20 RR |
112 | * @ampdu_tx: for locking sectionsi in aggregation Tx flow |
113 | * @dialog_token_allocator: dialog token enumerator for each new session; | |
5aae2880 RR |
114 | */ |
115 | struct sta_ampdu_mlme { | |
116 | struct tid_ampdu_rx tid_rx[STA_TID_NUM]; | |
80656c20 | 117 | struct tid_ampdu_tx tid_tx[STA_TID_NUM]; |
5aae2880 | 118 | spinlock_t ampdu_rx; |
80656c20 RR |
119 | spinlock_t ampdu_tx; |
120 | u8 dialog_token_allocator; | |
5aae2880 | 121 | }; |
f0706e82 JB |
122 | |
123 | struct sta_info { | |
124 | struct kref kref; | |
125 | struct list_head list; | |
126 | struct sta_info *hnext; /* next entry in hash table list */ | |
127 | ||
128 | struct ieee80211_local *local; | |
129 | ||
130 | u8 addr[ETH_ALEN]; | |
131 | u16 aid; /* STA's unique AID (1..2007), 0 = not yet assigned */ | |
132 | u32 flags; /* WLAN_STA_ */ | |
133 | ||
134 | struct sk_buff_head ps_tx_buf; /* buffer of TX frames for station in | |
135 | * power saving state */ | |
f0706e82 JB |
136 | struct sk_buff_head tx_filtered; /* buffer of TX frames that were |
137 | * already given to low-level driver, | |
138 | * but were filtered */ | |
139 | int clear_dst_mask; | |
140 | ||
141 | unsigned long rx_packets, tx_packets; /* number of RX/TX MSDUs */ | |
142 | unsigned long rx_bytes, tx_bytes; | |
143 | unsigned long tx_retry_failed, tx_retry_count; | |
144 | unsigned long tx_filtered_count; | |
145 | ||
146 | unsigned int wep_weak_iv_count; /* number of RX frames with weak IV */ | |
147 | ||
148 | unsigned long last_rx; | |
8318d78a JB |
149 | /* bitmap of supported rates per band */ |
150 | u64 supp_rates[IEEE80211_NUM_BANDS]; | |
151 | int txrate_idx; | |
152 | /* last rates used to send a frame to this STA */ | |
153 | int last_txrate_idx, last_nonerp_txrate_idx; | |
f0706e82 JB |
154 | |
155 | struct net_device *dev; /* which net device is this station associated | |
156 | * to */ | |
157 | ||
158 | struct ieee80211_key *key; | |
159 | ||
160 | u32 tx_num_consecutive_failures; | |
161 | u32 tx_num_mpdu_ok; | |
162 | u32 tx_num_mpdu_fail; | |
163 | ||
164 | struct rate_control_ref *rate_ctrl; | |
165 | void *rate_ctrl_priv; | |
166 | ||
167 | /* last received seq/frag number from this STA (per RX queue) */ | |
168 | __le16 last_seq_ctrl[NUM_RX_DATA_QUEUES]; | |
169 | unsigned long num_duplicates; /* number of duplicate frames received | |
170 | * from this STA */ | |
171 | unsigned long tx_fragments; /* number of transmitted MPDUs */ | |
172 | unsigned long rx_fragments; /* number of received MPDUs */ | |
173 | unsigned long rx_dropped; /* number of dropped MPDUs from this STA */ | |
174 | ||
175 | int last_rssi; /* RSSI of last received frame from this STA */ | |
176 | int last_signal; /* signal of last received frame from this STA */ | |
177 | int last_noise; /* noise of last received frame from this STA */ | |
178 | int last_ack_rssi[3]; /* RSSI of last received ACKs from this STA */ | |
179 | unsigned long last_ack; | |
180 | int channel_use; | |
181 | int channel_use_raw; | |
182 | ||
f0706e82 JB |
183 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS |
184 | unsigned int wme_rx_queue[NUM_RX_DATA_QUEUES]; | |
185 | unsigned int wme_tx_queue[NUM_RX_DATA_QUEUES]; | |
186 | #endif /* CONFIG_MAC80211_DEBUG_COUNTERS */ | |
187 | ||
f0706e82 | 188 | u16 listen_interval; |
e9f207f0 | 189 | |
10816d40 RR |
190 | struct ieee80211_ht_info ht_info; /* 802.11n HT capabilities |
191 | of this STA */ | |
5aae2880 RR |
192 | struct sta_ampdu_mlme ampdu_mlme; |
193 | u8 timer_to_tid[STA_TID_NUM]; /* convert timer id to tid */ | |
80656c20 | 194 | u8 tid_to_tx_q[STA_TID_NUM]; /* map tid to tx queue */ |
10816d40 | 195 | |
e9f207f0 JB |
196 | #ifdef CONFIG_MAC80211_DEBUGFS |
197 | struct sta_info_debugfsdentries { | |
198 | struct dentry *dir; | |
199 | struct dentry *flags; | |
200 | struct dentry *num_ps_buf_frames; | |
201 | struct dentry *last_ack_rssi; | |
202 | struct dentry *last_ack_ms; | |
203 | struct dentry *inactive_ms; | |
204 | struct dentry *last_seq_ctrl; | |
205 | #ifdef CONFIG_MAC80211_DEBUG_COUNTERS | |
206 | struct dentry *wme_rx_queue; | |
207 | struct dentry *wme_tx_queue; | |
208 | #endif | |
eb2ba62e | 209 | struct dentry *agg_status; |
e9f207f0 JB |
210 | } debugfs; |
211 | #endif | |
f0706e82 JB |
212 | }; |
213 | ||
214 | ||
215 | /* Maximum number of concurrently registered stations */ | |
216 | #define MAX_STA_COUNT 2007 | |
217 | ||
218 | #define STA_HASH_SIZE 256 | |
219 | #define STA_HASH(sta) (sta[5]) | |
220 | ||
221 | ||
222 | /* Maximum number of frames to buffer per power saving station */ | |
223 | #define STA_MAX_TX_BUFFER 128 | |
224 | ||
225 | /* Minimum buffered frame expiry time. If STA uses listen interval that is | |
226 | * smaller than this value, the minimum value here is used instead. */ | |
227 | #define STA_TX_BUFFER_EXPIRE (10 * HZ) | |
228 | ||
229 | /* How often station data is cleaned up (e.g., expiration of buffered frames) | |
230 | */ | |
231 | #define STA_INFO_CLEANUP_INTERVAL (10 * HZ) | |
232 | ||
be8755e1 MW |
233 | static inline void __sta_info_get(struct sta_info *sta) |
234 | { | |
235 | kref_get(&sta->kref); | |
236 | } | |
237 | ||
f0706e82 | 238 | struct sta_info * sta_info_get(struct ieee80211_local *local, u8 *addr); |
f0706e82 JB |
239 | void sta_info_put(struct sta_info *sta); |
240 | struct sta_info * sta_info_add(struct ieee80211_local *local, | |
241 | struct net_device *dev, u8 *addr, gfp_t gfp); | |
be8755e1 MW |
242 | void sta_info_remove(struct sta_info *sta); |
243 | void sta_info_free(struct sta_info *sta); | |
f0706e82 JB |
244 | void sta_info_init(struct ieee80211_local *local); |
245 | int sta_info_start(struct ieee80211_local *local); | |
246 | void sta_info_stop(struct ieee80211_local *local); | |
247 | void sta_info_remove_aid_ptr(struct sta_info *sta); | |
248 | void sta_info_flush(struct ieee80211_local *local, struct net_device *dev); | |
249 | ||
250 | #endif /* STA_INFO_H */ |