GNU Linux-libre 4.9.318-gnu1
[releases.git] / drivers / staging / rtl8188eu / include / sta_info.h
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 #ifndef __STA_INFO_H_
16 #define __STA_INFO_H_
17
18 #include <osdep_service.h>
19 #include <drv_types.h>
20 #include <wifi.h>
21
22 #define IBSS_START_MAC_ID       2
23 #define NUM_STA 32
24 #define NUM_ACL 16
25
26 /* if mode ==0, then the sta is allowed once the addr is hit. */
27 /* if mode ==1, then the sta is rejected once the addr is non-hit. */
28 struct rtw_wlan_acl_node {
29         struct list_head list;
30         u8       addr[ETH_ALEN];
31         u8       valid;
32 };
33
34 /* mode=0, disable */
35 /* mode=1, accept unless in deny list */
36 /* mode=2, deny unless in accept list */
37 struct wlan_acl_pool {
38         int mode;
39         int num;
40         struct rtw_wlan_acl_node aclnode[NUM_ACL];
41         struct __queue acl_node_q;
42 };
43
44 struct rssi_sta {
45         s32     UndecoratedSmoothedPWDB;
46         s32     UndecoratedSmoothedCCK;
47         s32     UndecoratedSmoothedOFDM;
48         u64     PacketMap;
49         u8      ValidBit;
50 };
51
52 struct  stainfo_stats   {
53         u64 rx_mgnt_pkts;
54         u64 rx_beacon_pkts;
55         u64 rx_probereq_pkts;
56         u64 rx_probersp_pkts;
57         u64 rx_probersp_bm_pkts;
58         u64 rx_probersp_uo_pkts;
59         u64 rx_ctrl_pkts;
60         u64 rx_data_pkts;
61
62         u64     last_rx_mgnt_pkts;
63         u64 last_rx_beacon_pkts;
64         u64 last_rx_probereq_pkts;
65         u64 last_rx_probersp_pkts;
66         u64 last_rx_probersp_bm_pkts;
67         u64 last_rx_probersp_uo_pkts;
68         u64     last_rx_ctrl_pkts;
69         u64     last_rx_data_pkts;
70         u64     rx_bytes;
71         u64     rx_drops;
72         u64     tx_pkts;
73         u64     tx_bytes;
74         u64  tx_drops;
75 };
76
77 struct sta_info {
78         spinlock_t lock;
79         struct list_head list; /* free_sta_queue */
80         struct list_head hash_list; /* sta_hash */
81
82         struct sta_xmit_priv sta_xmitpriv;
83         struct sta_recv_priv sta_recvpriv;
84
85         struct __queue sleep_q;
86         unsigned int sleepq_len;
87
88         uint state;
89         uint aid;
90         uint mac_id;
91         uint qos_option;
92         u8      hwaddr[ETH_ALEN];
93
94         uint    ieee8021x_blocked;      /* 0: allowed, 1:blocked */
95         uint    dot118021XPrivacy; /* aes, tkip... */
96         union Keytype   dot11tkiptxmickey;
97         union Keytype   dot11tkiprxmickey;
98         union Keytype   dot118021x_UncstKey;
99         union pn48              dot11txpn;                      /*  PN48 used for Unicast xmit. */
100         union pn48              dot11rxpn;                      /*  PN48 used for Unicast recv. */
101         u8      bssrateset[16];
102         u32     bssratelen;
103         s32  rssi;
104         s32     signal_quality;
105
106         u8      cts2self;
107         u8      rtsen;
108
109         u8      raid;
110         u8      init_rate;
111         u8      wireless_mode;  /*  NETWORK_TYPE */
112         struct stainfo_stats sta_stats;
113
114         /* for A-MPDU TX, ADDBA timeout check */
115         struct timer_list addba_retry_timer;
116
117         /* for A-MPDU Rx reordering buffer control */
118         struct recv_reorder_ctrl recvreorder_ctrl[16];
119
120         /* for A-MPDU Tx */
121         /* unsigned char                ampdu_txen_bitmap; */
122         u16     BA_starting_seqctrl[16];
123
124         struct ht_priv  htpriv;
125
126         /* Notes: */
127         /* STA_Mode: */
128         /* curr_network(mlme_priv/security_priv/qos/ht) +
129          * sta_info: (STA & AP) CAP/INFO */
130         /* scan_q: AP CAP/INFO */
131
132         /* AP_Mode: */
133         /* curr_network(mlme_priv/security_priv/qos/ht) : AP CAP/INFO */
134         /* sta_info: (AP & STA) CAP/INFO */
135
136         struct list_head asoc_list;
137 #ifdef CONFIG_88EU_AP_MODE
138         struct list_head auth_list;
139
140         unsigned int expire_to;
141         unsigned int auth_seq;
142         unsigned int authalg;
143         unsigned char chg_txt[128];
144
145         u16 capability;
146         int flags;
147
148         int dot8021xalg;/* 0:disable, 1:psk, 2:802.1x */
149         int wpa_psk;/* 0:disable, bit(0): WPA, bit(1):WPA2 */
150         int wpa_group_cipher;
151         int wpa2_group_cipher;
152         int wpa_pairwise_cipher;
153         int wpa2_pairwise_cipher;
154
155         u8 bpairwise_key_installed;
156
157         u8 wpa_ie[32];
158
159         u8 nonerp_set;
160         u8 no_short_slot_time_set;
161         u8 no_short_preamble_set;
162         u8 no_ht_gf_set;
163         u8 no_ht_set;
164         u8 ht_20mhz_set;
165
166         unsigned int tx_ra_bitmap;
167         u8 qos_info;
168
169         u8 max_sp_len;
170         u8 uapsd_bk;/* BIT(0): Delivery enabled, BIT(1): Trigger enabled */
171         u8 uapsd_be;
172         u8 uapsd_vi;
173         u8 uapsd_vo;
174
175         u8 has_legacy_ac;
176         unsigned int sleepq_ac_len;
177 #endif  /*  CONFIG_88EU_AP_MODE */
178
179         u8 under_exist_checking;
180         u8 keep_alive_trycnt;
181
182         /* for DM */
183         struct rssi_sta rssi_stat;
184
185         /*  ================ODM Relative Info======================= */
186         /*  Please be careful, don't declare too much structure here.
187          *  It will cost memory * STA support num. */
188         /*  2011/10/20 MH Add for ODM STA info. */
189         /*  Driver Write */
190         u8      bValid;         /*  record the sta status link or not? */
191         u8      IOTPeer;        /*  Enum value. HT_IOT_PEER_E */
192         u8      rssi_level;     /* for Refresh RA mask */
193         /*  ODM Write */
194         /* 1 PHY_STATUS_INFO */
195         u8              RSSI_Path[4];           /*  */
196         u8              RSSI_Ave;
197         u8              RXEVM[4];
198         u8              RXSNR[4];
199
200         /*  ================ODM Relative Info======================= */
201         /*  */
202
203         /* To store the sequence number of received management frame */
204         u16 RxMgmtFrameSeqNum;
205 };
206
207 #define sta_rx_pkts(sta) \
208         (sta->sta_stats.rx_mgnt_pkts \
209         + sta->sta_stats.rx_ctrl_pkts \
210         + sta->sta_stats.rx_data_pkts)
211
212 #define sta_last_rx_pkts(sta) \
213         (sta->sta_stats.last_rx_mgnt_pkts \
214         + sta->sta_stats.last_rx_ctrl_pkts \
215         + sta->sta_stats.last_rx_data_pkts)
216
217 #define sta_rx_data_pkts(sta) \
218         (sta->sta_stats.rx_data_pkts)
219
220 #define sta_last_rx_data_pkts(sta) \
221         (sta->sta_stats.last_rx_data_pkts)
222
223 #define sta_rx_mgnt_pkts(sta) \
224         (sta->sta_stats.rx_mgnt_pkts)
225
226 #define sta_last_rx_mgnt_pkts(sta) \
227         (sta->sta_stats.last_rx_mgnt_pkts)
228
229 #define sta_rx_beacon_pkts(sta) \
230         (sta->sta_stats.rx_beacon_pkts)
231
232 #define sta_last_rx_beacon_pkts(sta) \
233         (sta->sta_stats.last_rx_beacon_pkts)
234
235 #define sta_rx_probereq_pkts(sta) \
236         (sta->sta_stats.rx_probereq_pkts)
237
238 #define sta_last_rx_probereq_pkts(sta) \
239         (sta->sta_stats.last_rx_probereq_pkts)
240
241 #define sta_rx_probersp_pkts(sta) \
242         (sta->sta_stats.rx_probersp_pkts)
243
244 #define sta_last_rx_probersp_pkts(sta) \
245         (sta->sta_stats.last_rx_probersp_pkts)
246
247 #define sta_rx_probersp_bm_pkts(sta) \
248         (sta->sta_stats.rx_probersp_bm_pkts)
249
250 #define sta_last_rx_probersp_bm_pkts(sta) \
251         (sta->sta_stats.last_rx_probersp_bm_pkts)
252
253 #define sta_rx_probersp_uo_pkts(sta) \
254         (sta->sta_stats.rx_probersp_uo_pkts)
255
256 #define sta_last_rx_probersp_uo_pkts(sta) \
257         (sta->sta_stats.last_rx_probersp_uo_pkts)
258
259 #define sta_update_last_rx_pkts(sta) \
260 do { \
261         sta->sta_stats.last_rx_mgnt_pkts = sta->sta_stats.rx_mgnt_pkts; \
262         sta->sta_stats.last_rx_beacon_pkts = sta->sta_stats.rx_beacon_pkts; \
263         sta->sta_stats.last_rx_probereq_pkts = sta->sta_stats.rx_probereq_pkts; \
264         sta->sta_stats.last_rx_probersp_pkts = sta->sta_stats.rx_probersp_pkts; \
265         sta->sta_stats.last_rx_probersp_bm_pkts = sta->sta_stats.rx_probersp_bm_pkts; \
266         sta->sta_stats.last_rx_probersp_uo_pkts = sta->sta_stats.rx_probersp_uo_pkts; \
267         sta->sta_stats.last_rx_ctrl_pkts = sta->sta_stats.rx_ctrl_pkts; \
268         sta->sta_stats.last_rx_data_pkts = sta->sta_stats.rx_data_pkts; \
269 } while (0)
270
271 #define STA_RX_PKTS_ARG(sta) \
272         sta->sta_stats.rx_mgnt_pkts \
273         , sta->sta_stats.rx_ctrl_pkts \
274         , sta->sta_stats.rx_data_pkts
275
276 #define STA_LAST_RX_PKTS_ARG(sta) \
277         sta->sta_stats.last_rx_mgnt_pkts \
278         , sta->sta_stats.last_rx_ctrl_pkts \
279         , sta->sta_stats.last_rx_data_pkts
280
281 #define STA_RX_PKTS_DIFF_ARG(sta) \
282         sta->sta_stats.rx_mgnt_pkts - sta->sta_stats.last_rx_mgnt_pkts \
283         , sta->sta_stats.rx_ctrl_pkts - sta->sta_stats.last_rx_ctrl_pkts \
284         , sta->sta_stats.rx_data_pkts - sta->sta_stats.last_rx_data_pkts
285
286 #define STA_PKTS_FMT "(m:%llu, c:%llu, d:%llu)"
287
288 struct  sta_priv {
289         u8 *pallocated_stainfo_buf;
290         u8 *pstainfo_buf;
291         struct __queue free_sta_queue;
292
293         spinlock_t sta_hash_lock;
294         struct list_head sta_hash[NUM_STA];
295         int asoc_sta_count;
296         struct __queue sleep_q;
297         struct __queue wakeup_q;
298
299         struct adapter *padapter;
300
301         spinlock_t asoc_list_lock;
302         struct list_head asoc_list;
303
304 #ifdef CONFIG_88EU_AP_MODE
305         struct list_head auth_list;
306         spinlock_t auth_list_lock;
307         u8 asoc_list_cnt;
308         u8 auth_list_cnt;
309
310         unsigned int auth_to;  /* sec, time to expire in authenticating. */
311         unsigned int assoc_to; /* sec, time to expire before associating. */
312         unsigned int expire_to; /* sec , time to expire after associated. */
313
314         /* pointers to STA info; based on allocated AID or NULL if AID free
315          * AID is in the range 1-2007, so sta_aid[0] corresponders to AID 1
316          * and so on
317          */
318         struct sta_info *sta_aid[NUM_STA];
319
320         u16 sta_dz_bitmap;/* only support 15 stations, station aid bitmap
321                            * for sleeping sta. */
322         u16 tim_bitmap; /* only support 15 stations, aid=0~15 mapping
323                          * bit0~bit15 */
324
325         u16 max_num_sta;
326
327         struct wlan_acl_pool acl_list;
328 #endif
329
330 };
331
332 static inline u32 wifi_mac_hash(u8 *mac)
333 {
334         u32 x;
335
336         x = mac[0];
337         x = (x << 2) ^ mac[1];
338         x = (x << 2) ^ mac[2];
339         x = (x << 2) ^ mac[3];
340         x = (x << 2) ^ mac[4];
341         x = (x << 2) ^ mac[5];
342
343         x ^= x >> 8;
344         x  = x & (NUM_STA - 1);
345         return x;
346 }
347
348 u32 _rtw_init_sta_priv(struct sta_priv *pstapriv);
349 u32 _rtw_free_sta_priv(struct sta_priv *pstapriv);
350
351 #define stainfo_offset_valid(offset) (offset < NUM_STA && offset >= 0)
352 int rtw_stainfo_offset(struct sta_priv *stapriv, struct sta_info *sta);
353 struct sta_info *rtw_get_stainfo_by_offset(struct sta_priv *stapriv, int off);
354
355 struct sta_info *rtw_alloc_stainfo(struct sta_priv *stapriv, u8 *hwaddr);
356 u32 rtw_free_stainfo(struct adapter *adapt, struct sta_info *psta);
357 void rtw_free_all_stainfo(struct adapter *adapt);
358 struct sta_info *rtw_get_stainfo(struct sta_priv *stapriv, u8 *hwaddr);
359 u32 rtw_init_bcmc_stainfo(struct adapter *adapt);
360 struct sta_info *rtw_get_bcmc_stainfo(struct adapter *padapter);
361 u8 rtw_access_ctrl(struct adapter *padapter, u8 *mac_addr);
362
363 #endif /* _STA_INFO_H_ */