1 /*
2  * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3  * All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  *
20  * File: bssdb.h
21  *
22  * Purpose: Handles the Basic Service Set & Node Database functions
23  *
24  * Author: Lyndon Chen
25  *
26  * Date: July 16, 2002
27  *
28  */
29 
30 #ifndef __BSSDB_H__
31 #define __BSSDB_H__
32 
33 #include <linux/skbuff.h>
34 #include "80211hdr.h"
35 #include "80211mgr.h"
36 #include "card.h"
37 #include "mib.h"
38 
39 /*---------------------  Export Definitions -------------------------*/
40 
41 #define MAX_NODE_NUM             64
42 #define MAX_BSS_NUM              42
43 #define LOST_BEACON_COUNT        10   /* 10 sec, XP defined */
44 #define MAX_PS_TX_BUF            32   // sta max power saving tx buf
45 #define ADHOC_LOST_BEACON_COUNT  30   // 30 sec, beacon lost for adhoc only
46 #define MAX_INACTIVE_COUNT       300  // 300 sec, inactive STA node refresh
47 
48 #define USE_PROTECT_PERIOD       10   // 10 sec, Use protect mode check period
49 #define ERP_RECOVER_COUNT        30   // 30 sec, ERP support callback check
50 #define BSS_CLEAR_COUNT           1
51 
52 #define RSSI_STAT_COUNT          10
53 #define MAX_CHECK_RSSI_COUNT     8
54 
55 // STA dwflags
56 #define WLAN_STA_AUTH            BIT0
57 #define WLAN_STA_ASSOC           BIT1
58 #define WLAN_STA_PS              BIT2
59 #define WLAN_STA_TIM             BIT3
60 // permanent; do not remove entry on expiration
61 #define WLAN_STA_PERM            BIT4
62 // If 802.1X is used, this flag is
63 // controlling whether STA is authorized to
64 // send and receive non-IEEE 802.1X frames
65 #define WLAN_STA_AUTHORIZED      BIT5
66 
67 //#define MAX_RATE            12
68 
69 #define MAX_WPA_IE_LEN      64
70 
71 
72 /*---------------------  Export Classes  ----------------------------*/
73 
74 /*---------------------  Export Variables  --------------------------*/
75 
76 
77 /*---------------------  Export Types  ------------------------------*/
78 
79 //
80 // IEEE 802.11 Structures and definitions
81 //
82 
83 typedef struct tagSERPObject {
84     BOOL    bERPExist;
85     BYTE    byERP;
86 } ERPObject, *PERPObject;
87 
88 
89 typedef struct tagSRSNCapObject {
90     BOOL    bRSNCapExist;
91     WORD    wRSNCap;
92 } SRSNCapObject, *PSRSNCapObject;
93 
94 // BSS info(AP)
95 #pragma pack(1)
96 typedef struct tagKnownBSS {
97     // BSS info
98     BOOL            bActive;
99     BYTE            abyBSSID[WLAN_BSSID_LEN];
100     unsigned int            uChannel;
101     BYTE            abySuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
102     BYTE            abyExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
103     unsigned int            uRSSI;
104     BYTE            bySQ;
105     WORD            wBeaconInterval;
106     WORD            wCapInfo;
107     BYTE            abySSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
108     BYTE            byRxRate;
109 
110 //    WORD            wATIMWindow;
111     BYTE            byRSSIStatCnt;
112     signed long            ldBmMAX;
113     signed long            ldBmAverage[RSSI_STAT_COUNT];
114     signed long            ldBmAverRange;
115     //For any BSSID selection improvment
116     BOOL            bSelected;
117 
118     //++ WPA informations
119     BOOL            bWPAValid;
120     BYTE            byGKType;
121     BYTE            abyPKType[4];
122     WORD            wPKCount;
123     BYTE            abyAuthType[4];
124     WORD            wAuthCount;
125     BYTE            byDefaultK_as_PK;
126     BYTE            byReplayIdx;
127     //--
128 
129     //++ WPA2 informations
130     BOOL            bWPA2Valid;
131     BYTE            byCSSGK;
132     WORD            wCSSPKCount;
133     BYTE            abyCSSPK[4];
134     WORD            wAKMSSAuthCount;
135     BYTE            abyAKMSSAuthType[4];
136 
137     //++  wpactl
138     BYTE            byWPAIE[MAX_WPA_IE_LEN];
139     BYTE            byRSNIE[MAX_WPA_IE_LEN];
140     WORD            wWPALen;
141     WORD            wRSNLen;
142 
143     // Clear count
144     unsigned int            uClearCount;
145 //    BYTE            abyIEs[WLAN_BEACON_FR_MAXLEN];
146     unsigned int            uIELength;
147     QWORD           qwBSSTimestamp;
148     QWORD           qwLocalTSF;     // local TSF timer
149 
150     CARD_PHY_TYPE   eNetworkTypeInUse;
151 
152     ERPObject       sERP;
153     SRSNCapObject   sRSNCapObj;
154     BYTE            abyIEs[1024];   // don't move this field !!
155 
156 } __attribute__ ((__packed__))
157 KnownBSS , *PKnownBSS;
158 
159 
160 
161 typedef enum tagNODE_STATE {
162     NODE_FREE,
163     NODE_AGED,
164     NODE_KNOWN,
165     NODE_AUTH,
166     NODE_ASSOC
167 } NODE_STATE, *PNODE_STATE;
168 
169 
170 // STA node info
171 typedef struct tagKnownNodeDB {
172     // STA info
173     BOOL            bActive;
174     BYTE            abyMACAddr[WLAN_ADDR_LEN];
175     BYTE            abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
176     BYTE            abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN];
177     WORD            wTxDataRate;
178     BOOL            bShortPreamble;
179     BOOL            bERPExist;
180     BOOL            bShortSlotTime;
181     unsigned int            uInActiveCount;
182     WORD            wMaxBasicRate;     //Get from byTopOFDMBasicRate or byTopCCKBasicRate which depends on packetTyp.
183     WORD            wMaxSuppRate;      //Records the highest supported rate getting from SuppRates IE and ExtSuppRates IE in Beacon.
184     WORD            wSuppRate;
185     BYTE            byTopOFDMBasicRate;//Records the highest basic rate in OFDM mode
186     BYTE            byTopCCKBasicRate; //Records the highest basic rate in CCK mode
187 
188     // For AP mode
189     struct sk_buff_head sTxPSQueue;
190     WORD            wCapInfo;
191     WORD            wListenInterval;
192     WORD            wAID;
193     NODE_STATE      eNodeState;
194     BOOL            bPSEnable;
195     BOOL            bRxPSPoll;
196     BYTE            byAuthSequence;
197     unsigned long           ulLastRxJiffer;
198     BYTE            bySuppRate;
199     DWORD           dwFlags;
200     WORD            wEnQueueCnt;
201 
202     BOOL            bOnFly;
203     unsigned long long       KeyRSC;
204     BYTE            byKeyIndex;
205     DWORD           dwKeyIndex;
206     BYTE            byCipherSuite;
207     DWORD           dwTSC47_16;
208     WORD            wTSC15_0;
209     unsigned int            uWepKeyLength;
210     BYTE            abyWepKey[WLAN_WEPMAX_KEYLEN];
211     //
212     // Auto rate fallback vars
213     BOOL            bIsInFallback;
214     unsigned int            uAverageRSSI;
215     unsigned int            uRateRecoveryTimeout;
216     unsigned int            uRatePollTimeout;
217     unsigned int            uTxFailures;
218     unsigned int            uTxAttempts;
219 
220     unsigned int            uTxRetry;
221     unsigned int            uFailureRatio;
222     unsigned int            uRetryRatio;
223     unsigned int            uTxOk[MAX_RATE+1];
224     unsigned int            uTxFail[MAX_RATE+1];
225     unsigned int            uTimeCount;
226 
227 } KnownNodeDB, *PKnownNodeDB;
228 
229 /*---------------------  Export Functions  --------------------------*/
230 
231 PKnownBSS BSSpSearchBSSList(void *hDeviceContext,
232 			    PBYTE pbyDesireBSSID,
233 			    PBYTE pbyDesireSSID,
234 			    CARD_PHY_TYPE ePhyType);
235 
236 PKnownBSS BSSpAddrIsInBSSList(void *hDeviceContext,
237 			      PBYTE abyBSSID,
238 			      PWLAN_IE_SSID pSSID);
239 
240 void BSSvClearBSSList(void *hDeviceContext, BOOL bKeepCurrBSSID);
241 
242 BOOL BSSbInsertToBSSList(void *hDeviceContext,
243 			 PBYTE abyBSSIDAddr,
244 			 QWORD qwTimestamp,
245 			 WORD wBeaconInterval,
246 			 WORD wCapInfo,
247 			 BYTE byCurrChannel,
248 			 PWLAN_IE_SSID pSSID,
249 			 PWLAN_IE_SUPP_RATES pSuppRates,
250 			 PWLAN_IE_SUPP_RATES pExtSuppRates,
251 			 PERPObject psERP,
252 			 PWLAN_IE_RSN pRSN,
253 			 PWLAN_IE_RSN_EXT pRSNWPA,
254 			 PWLAN_IE_COUNTRY pIE_Country,
255 			 PWLAN_IE_QUIET pIE_Quiet,
256 			 unsigned int uIELength,
257 			 PBYTE pbyIEs,
258 			 void *pRxPacketContext);
259 
260 BOOL BSSbUpdateToBSSList(void *hDeviceContext,
261 			 QWORD qwTimestamp,
262 			 WORD wBeaconInterval,
263 			 WORD wCapInfo,
264 			 BYTE byCurrChannel,
265 			 BOOL bChannelHit,
266 			 PWLAN_IE_SSID pSSID,
267 			 PWLAN_IE_SUPP_RATES pSuppRates,
268 			 PWLAN_IE_SUPP_RATES pExtSuppRates,
269 			 PERPObject psERP,
270 			 PWLAN_IE_RSN pRSN,
271 			 PWLAN_IE_RSN_EXT pRSNWPA,
272 			 PWLAN_IE_COUNTRY pIE_Country,
273 			 PWLAN_IE_QUIET pIE_Quiet,
274 			 PKnownBSS pBSSList,
275 			 unsigned int uIELength,
276 			 PBYTE pbyIEs,
277 			 void *pRxPacketContext);
278 
279 BOOL BSSbIsSTAInNodeDB(void *hDeviceContext,
280 		       PBYTE abyDstAddr,
281 		       unsigned int *puNodeIndex);
282 
283 void BSSvCreateOneNode(void *hDeviceContext, unsigned int *puNodeIndex);
284 
285 void BSSvUpdateAPNode(void *hDeviceContext,
286 		      PWORD pwCapInfo,
287 		      PWLAN_IE_SUPP_RATES pItemRates,
288 		      PWLAN_IE_SUPP_RATES pExtSuppRates);
289 
290 void BSSvSecondCallBack(void *hDeviceContext);
291 
292 void BSSvUpdateNodeTxCounter(void *hDeviceContext,
293 			     PSStatCounter pStatistic,
294 			     BYTE byTSR,
295 			     BYTE byPktNO);
296 
297 void BSSvRemoveOneNode(void *hDeviceContext,
298 		       unsigned int uNodeIndex);
299 
300 void BSSvAddMulticastNode(void *hDeviceContext);
301 
302 void BSSvClearNodeDBTable(void *hDeviceContext,
303 			  unsigned int uStartIndex);
304 
305 void BSSvClearAnyBSSJoinRecord(void *hDeviceContext);
306 
307 #endif /* __BSSDB_H__ */
308