Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
bssdb.c
Go to the documentation of this file.
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  * File: bssdb.c
20  *
21  * Purpose: Handles the Basic Service Set & Node Database functions
22  *
23  * Functions:
24  * BSSpSearchBSSList - Search known BSS list for Desire SSID or BSSID
25  * BSSvClearBSSList - Clear BSS List
26  * BSSbInsertToBSSList - Insert a BSS set into known BSS list
27  * BSSbUpdateToBSSList - Update BSS set in known BSS list
28  * BSSDBbIsSTAInNodeDB - Search Node DB table to find the index of matched DstAddr
29  * BSSvCreateOneNode - Allocate an Node for Node DB
30  * BSSvUpdateAPNode - Update AP Node content in Index 0 of KnownNodeDB
31  * BSSvSecondCallBack - One second timer callback function to update Node DB info & AP link status
32  * BSSvUpdateNodeTxCounter - Update Tx attemps, Tx failure counter in Node DB for auto-fall back rate control
33  *
34  * Revision History:
35  *
36  * Author: Lyndon Chen
37  *
38  * Date: July 17, 2002
39  *
40  */
41 
42 #include "ttype.h"
43 #include "tmacro.h"
44 #include "tether.h"
45 #include "device.h"
46 #include "80211hdr.h"
47 #include "bssdb.h"
48 #include "wmgr.h"
49 #include "datarate.h"
50 #include "desc.h"
51 #include "wcmd.h"
52 #include "wpa.h"
53 #include "baseband.h"
54 #include "rf.h"
55 #include "card.h"
56 #include "channel.h"
57 #include "mac.h"
58 #include "wpa2.h"
59 #include "iowpa.h"
60 
61 /*--------------------- Static Definitions -------------------------*/
62 
63 
64 
65 
66 /*--------------------- Static Classes ----------------------------*/
67 
68 /*--------------------- Static Variables --------------------------*/
69 static int msglevel =MSG_LEVEL_INFO;
70 //static int msglevel =MSG_LEVEL_DEBUG;
71 
72 
73 
74 const unsigned short awHWRetry0[5][5] = {
75  {RATE_18M, RATE_18M, RATE_12M, RATE_12M, RATE_12M},
76  {RATE_24M, RATE_24M, RATE_18M, RATE_12M, RATE_12M},
77  {RATE_36M, RATE_36M, RATE_24M, RATE_18M, RATE_18M},
78  {RATE_48M, RATE_48M, RATE_36M, RATE_24M, RATE_24M},
79  {RATE_54M, RATE_54M, RATE_48M, RATE_36M, RATE_36M}
80  };
81 const unsigned short awHWRetry1[5][5] = {
82  {RATE_18M, RATE_18M, RATE_12M, RATE_6M, RATE_6M},
83  {RATE_24M, RATE_24M, RATE_18M, RATE_6M, RATE_6M},
84  {RATE_36M, RATE_36M, RATE_24M, RATE_12M, RATE_12M},
85  {RATE_48M, RATE_48M, RATE_24M, RATE_12M, RATE_12M},
86  {RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M}
87  };
88 
89 
90 
91 /*--------------------- Static Functions --------------------------*/
92 
94  void *hDeviceContext
95  );
96 
97 #ifdef Calcu_LinkQual
99  void *hDeviceContext
100  );
101 #endif
102 
103 
105  void *hDeviceContext
106  );
107 /*--------------------- Export Variables --------------------------*/
108 
109 
110 /*--------------------- Export Functions --------------------------*/
111 
112 
113 
114 
115 
116 /*+
117  *
118  * Routine Description:
119  * Search known BSS list for Desire SSID or BSSID.
120  *
121  * Return Value:
122  * PTR to KnownBSS or NULL
123  *
124 -*/
125 
126 PKnownBSS
128  void *hDeviceContext,
129  unsigned char *pbyDesireBSSID,
130  unsigned char *pbyDesireSSID,
131  CARD_PHY_TYPE ePhyType
132  )
133 {
134  PSDevice pDevice = (PSDevice)hDeviceContext;
135  PSMgmtObject pMgmt = pDevice->pMgmt;
136  unsigned char *pbyBSSID = NULL;
137  PWLAN_IE_SSID pSSID = NULL;
138  PKnownBSS pCurrBSS = NULL;
139  PKnownBSS pSelect = NULL;
140  unsigned char ZeroBSSID[WLAN_BSSID_LEN]={0x00,0x00,0x00,0x00,0x00,0x00};
141  unsigned int ii = 0;
142 
143  if (pbyDesireBSSID != NULL) {
145  "BSSpSearchBSSList BSSID[%pM]\n", pbyDesireBSSID);
146  if ((!is_broadcast_ether_addr(pbyDesireBSSID)) &&
147  (memcmp(pbyDesireBSSID, ZeroBSSID, 6)!= 0)){
148  pbyBSSID = pbyDesireBSSID;
149  }
150  }
151  if (pbyDesireSSID != NULL) {
152  if (((PWLAN_IE_SSID)pbyDesireSSID)->len != 0) {
153  pSSID = (PWLAN_IE_SSID) pbyDesireSSID;
154  }
155  }
156 
157  if (pbyBSSID != NULL) {
158  // match BSSID first
159  for (ii = 0; ii <MAX_BSS_NUM; ii++) {
160  pCurrBSS = &(pMgmt->sBSSList[ii]);
161 if(pDevice->bLinkPass==false) pCurrBSS->bSelected = false;
162  if ((pCurrBSS->bActive) &&
163  (pCurrBSS->bSelected == false)) {
164  if (!compare_ether_addr(pCurrBSS->abyBSSID, pbyBSSID)) {
165  if (pSSID != NULL) {
166  // compare ssid
167  if ( !memcmp(pSSID->abySSID,
168  ((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID,
169  pSSID->len)) {
170  if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) ||
171  ((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) ||
172  ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo))
173  ) {
174  pCurrBSS->bSelected = true;
175  return(pCurrBSS);
176  }
177  }
178  } else {
179  if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) ||
180  ((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) ||
181  ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo))
182  ) {
183  pCurrBSS->bSelected = true;
184  return(pCurrBSS);
185  }
186  }
187  }
188  }
189  }
190  } else {
191  // ignore BSSID
192  for (ii = 0; ii <MAX_BSS_NUM; ii++) {
193  pCurrBSS = &(pMgmt->sBSSList[ii]);
194  //2007-0721-01<Add>by MikeLiu
195  pCurrBSS->bSelected = false;
196  if (pCurrBSS->bActive) {
197 
198  if (pSSID != NULL) {
199  // matched SSID
200  if (! !memcmp(pSSID->abySSID,
201  ((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID,
202  pSSID->len) ||
203  (pSSID->len != ((PWLAN_IE_SSID)pCurrBSS->abySSID)->len)) {
204  // SSID not match skip this BSS
205  continue;
206  }
207  }
208  if (((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) ||
209  ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo))
210  ){
211  // Type not match skip this BSS
212  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSS type mismatch.... Config[%d] BSS[0x%04x]\n", pMgmt->eConfigMode, pCurrBSS->wCapInfo);
213  continue;
214  }
215 
216  if (ePhyType != PHY_TYPE_AUTO) {
217  if (((ePhyType == PHY_TYPE_11A) && (PHY_TYPE_11A != pCurrBSS->eNetworkTypeInUse)) ||
218  ((ePhyType != PHY_TYPE_11A) && (PHY_TYPE_11A == pCurrBSS->eNetworkTypeInUse))) {
219  // PhyType not match skip this BSS
220  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Physical type mismatch.... ePhyType[%d] BSS[%d]\n", ePhyType, pCurrBSS->eNetworkTypeInUse);
221  continue;
222  }
223  }
224 /*
225  if (pMgmt->eAuthenMode < WMAC_AUTH_WPA) {
226  if (pCurrBSS->bWPAValid == true) {
227  // WPA AP will reject connection of station without WPA enable.
228  continue;
229  }
230  } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
231  (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) {
232  if (pCurrBSS->bWPAValid == false) {
233  // station with WPA enable can't join NonWPA AP.
234  continue;
235  }
236  } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
237  (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) {
238  if (pCurrBSS->bWPA2Valid == false) {
239  // station with WPA2 enable can't join NonWPA2 AP.
240  continue;
241  }
242  }
243 */
244  if (pSelect == NULL) {
245  pSelect = pCurrBSS;
246  } else {
247  // compare RSSI, select signal strong one
248  if (pCurrBSS->uRSSI < pSelect->uRSSI) {
249  pSelect = pCurrBSS;
250  }
251  }
252  }
253  }
254  if (pSelect != NULL) {
255  pSelect->bSelected = true;
256 /*
257  if (pDevice->bRoaming == false) {
258  // Einsn Add @20070907
259  memset(pbyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
260  memcpy(pbyDesireSSID,pCurrBSS->abySSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1) ;
261  }*/
262 
263  return(pSelect);
264  }
265  }
266  return(NULL);
267 
268 }
269 
270 
271 /*+
272  *
273  * Routine Description:
274  * Clear BSS List
275  *
276  * Return Value:
277  * None.
278  *
279 -*/
280 
281 
282 void
284  void *hDeviceContext,
285  bool bKeepCurrBSSID
286  )
287 {
288  PSDevice pDevice = (PSDevice)hDeviceContext;
289  PSMgmtObject pMgmt = pDevice->pMgmt;
290  unsigned int ii;
291 
292  for (ii = 0; ii < MAX_BSS_NUM; ii++) {
293  if (bKeepCurrBSSID) {
294  if (pMgmt->sBSSList[ii].bActive &&
295  !compare_ether_addr(pMgmt->sBSSList[ii].abyBSSID, pMgmt->abyCurrBSSID)) {
296  // bKeepCurrBSSID = false;
297  continue;
298  }
299  }
300 
301  if ((pMgmt->sBSSList[ii].bActive) && (pMgmt->sBSSList[ii].uClearCount < BSS_CLEAR_COUNT)) {
302  pMgmt->sBSSList[ii].uClearCount ++;
303  continue;
304  }
305 
306  pMgmt->sBSSList[ii].bActive = false;
307  memset(&pMgmt->sBSSList[ii], 0, sizeof(KnownBSS));
308  }
309  BSSvClearAnyBSSJoinRecord(pDevice);
310 
311  return;
312 }
313 
314 
315 
316 /*+
317  *
318  * Routine Description:
319  * search BSS list by BSSID & SSID if matched
320  *
321  * Return Value:
322  * true if found.
323  *
324 -*/
325 PKnownBSS
327  void *hDeviceContext,
328  unsigned char *abyBSSID,
329  PWLAN_IE_SSID pSSID
330  )
331 {
332  PSDevice pDevice = (PSDevice)hDeviceContext;
333  PSMgmtObject pMgmt = pDevice->pMgmt;
334  PKnownBSS pBSSList = NULL;
335  unsigned int ii;
336 
337  for (ii = 0; ii < MAX_BSS_NUM; ii++) {
338  pBSSList = &(pMgmt->sBSSList[ii]);
339  if (pBSSList->bActive) {
340  if (!compare_ether_addr(pBSSList->abyBSSID, abyBSSID)) {
341 // if (pSSID == NULL)
342 // return pBSSList;
343  if (pSSID->len == ((PWLAN_IE_SSID)pBSSList->abySSID)->len){
344  if (memcmp(pSSID->abySSID,
345  ((PWLAN_IE_SSID)pBSSList->abySSID)->abySSID,
346  pSSID->len) == 0)
347  return pBSSList;
348  }
349  }
350  }
351  }
352 
353  return NULL;
354 };
355 
356 
357 
358 /*+
359  *
360  * Routine Description:
361  * Insert a BSS set into known BSS list
362  *
363  * Return Value:
364  * true if success.
365  *
366 -*/
367 
368 bool
370  void *hDeviceContext,
371  unsigned char *abyBSSIDAddr,
372  QWORD qwTimestamp,
373  unsigned short wBeaconInterval,
374  unsigned short wCapInfo,
375  unsigned char byCurrChannel,
376  PWLAN_IE_SSID pSSID,
377  PWLAN_IE_SUPP_RATES pSuppRates,
378  PWLAN_IE_SUPP_RATES pExtSuppRates,
379  PERPObject psERP,
380  PWLAN_IE_RSN pRSN,
381  PWLAN_IE_RSN_EXT pRSNWPA,
382  PWLAN_IE_COUNTRY pIE_Country,
383  PWLAN_IE_QUIET pIE_Quiet,
384  unsigned int uIELength,
385  unsigned char *pbyIEs,
386  void *pRxPacketContext
387  )
388 {
389 
390  PSDevice pDevice = (PSDevice)hDeviceContext;
391  PSMgmtObject pMgmt = pDevice->pMgmt;
392  PSRxMgmtPacket pRxPacket = (PSRxMgmtPacket)pRxPacketContext;
393  PKnownBSS pBSSList = NULL;
394  unsigned int ii;
395  bool bParsingQuiet = false;
396  PWLAN_IE_QUIET pQuiet = NULL;
397 
398 
399 
400  pBSSList = (PKnownBSS)&(pMgmt->sBSSList[0]);
401 
402  for (ii = 0; ii < MAX_BSS_NUM; ii++) {
403  pBSSList = (PKnownBSS)&(pMgmt->sBSSList[ii]);
404  if (!pBSSList->bActive)
405  break;
406  }
407 
408  if (ii == MAX_BSS_NUM){
409  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get free KnowBSS node failed.\n");
410  return false;
411  }
412  // save the BSS info
413  pBSSList->bActive = true;
414  memcpy( pBSSList->abyBSSID, abyBSSIDAddr, WLAN_BSSID_LEN);
415  HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp));
416  LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp));
417  pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval);
418  pBSSList->wCapInfo = cpu_to_le16(wCapInfo);
419  pBSSList->uClearCount = 0;
420 
421  if (pSSID->len > WLAN_SSID_MAXLEN)
422  pSSID->len = WLAN_SSID_MAXLEN;
423  memcpy( pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN);
424 
425  pBSSList->uChannel = byCurrChannel;
426 
427  if (pSuppRates->len > WLAN_RATES_MAXLEN)
428  pSuppRates->len = WLAN_RATES_MAXLEN;
429  memcpy( pBSSList->abySuppRates, pSuppRates, pSuppRates->len + WLAN_IEHDR_LEN);
430 
431  if (pExtSuppRates != NULL) {
432  if (pExtSuppRates->len > WLAN_RATES_MAXLEN)
433  pExtSuppRates->len = WLAN_RATES_MAXLEN;
434  memcpy(pBSSList->abyExtSuppRates, pExtSuppRates, pExtSuppRates->len + WLAN_IEHDR_LEN);
435  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSbInsertToBSSList: pExtSuppRates->len = %d\n", pExtSuppRates->len);
436 
437  } else {
438  memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
439  }
440  pBSSList->sERP.byERP = psERP->byERP;
441  pBSSList->sERP.bERPExist = psERP->bERPExist;
442 
443  // Check if BSS is 802.11a/b/g
444  if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) {
445  pBSSList->eNetworkTypeInUse = PHY_TYPE_11A;
446  } else {
447  if (pBSSList->sERP.bERPExist == true) {
448  pBSSList->eNetworkTypeInUse = PHY_TYPE_11G;
449  } else {
450  pBSSList->eNetworkTypeInUse = PHY_TYPE_11B;
451  }
452  }
453 
454  pBSSList->byRxRate = pRxPacket->byRxRate;
455  pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF;
456  pBSSList->uRSSI = pRxPacket->uRSSI;
457  pBSSList->bySQ = pRxPacket->bySQ;
458 
459  if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
460  (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
461  // assoc with BSS
462  if (pBSSList == pMgmt->pCurrBSS) {
463  bParsingQuiet = true;
464  }
465  }
466 
467  WPA_ClearRSN(pBSSList);
468 
469  if (pRSNWPA != NULL) {
470  unsigned int uLen = pRSNWPA->len + 2;
471 
472  if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSNWPA - pbyIEs))) {
473  pBSSList->wWPALen = uLen;
474  memcpy(pBSSList->byWPAIE, pRSNWPA, uLen);
475  WPA_ParseRSN(pBSSList, pRSNWPA);
476  }
477  }
478 
479  WPA2_ClearRSN(pBSSList);
480 
481  if (pRSN != NULL) {
482  unsigned int uLen = pRSN->len + 2;
483  if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSN - pbyIEs))) {
484  pBSSList->wRSNLen = uLen;
485  memcpy(pBSSList->byRSNIE, pRSN, uLen);
486  WPA2vParseRSN(pBSSList, pRSN);
487  }
488  }
489 
490  if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || (pBSSList->bWPA2Valid == true)) {
491 
492  PSKeyItem pTransmitKey = NULL;
493  bool bIs802_1x = false;
494 
495  for (ii = 0; ii < pBSSList->wAKMSSAuthCount; ii ++) {
496  if (pBSSList->abyAKMSSAuthType[ii] == WLAN_11i_AKMSS_802_1X) {
497  bIs802_1x = true;
498  break;
499  }
500  }
501  if ((bIs802_1x == true) && (pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len) &&
502  ( !memcmp(pSSID->abySSID, ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->abySSID, pSSID->len))) {
503 
504  bAdd_PMKID_Candidate((void *)pDevice, pBSSList->abyBSSID, &pBSSList->sRSNCapObj);
505 
506  if ((pDevice->bLinkPass == true) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
507  if ((KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, PAIRWISE_KEY, &pTransmitKey) == true) ||
508  (KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, GROUP_KEY, &pTransmitKey) == true)) {
510  pDevice->gsPMKIDCandidate.Version = 1;
511 
512  }
513 
514  }
515  }
516  }
517 
518  if (pDevice->bUpdateBBVGA) {
519  // Moniter if RSSI is too strong.
520  pBSSList->byRSSIStatCnt = 0;
521  RFvRSSITodBm(pDevice, (unsigned char)(pRxPacket->uRSSI), &pBSSList->ldBmMAX);
522  pBSSList->ldBmAverage[0] = pBSSList->ldBmMAX;
523  for (ii = 1; ii < RSSI_STAT_COUNT; ii++)
524  pBSSList->ldBmAverage[ii] = 0;
525  }
526 
527  if ((pIE_Country != NULL) &&
528  (pMgmt->b11hEnable == true)) {
529  set_country_info(pMgmt->pAdapter, pBSSList->eNetworkTypeInUse,
530  pIE_Country);
531  }
532 
533  if ((bParsingQuiet == true) && (pIE_Quiet != NULL)) {
534  if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) &&
535  (((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) {
536  // valid EID
537  if (pQuiet == NULL) {
538  pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
539  CARDbSetQuiet( pMgmt->pAdapter,
540  true,
541  pQuiet->byQuietCount,
542  pQuiet->byQuietPeriod,
543  *((unsigned short *)pQuiet->abyQuietDuration),
544  *((unsigned short *)pQuiet->abyQuietOffset)
545  );
546  } else {
547  pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
548  CARDbSetQuiet( pMgmt->pAdapter,
549  false,
550  pQuiet->byQuietCount,
551  pQuiet->byQuietPeriod,
552  *((unsigned short *)pQuiet->abyQuietDuration),
553  *((unsigned short *)pQuiet->abyQuietOffset)
554  );
555  }
556  }
557  }
558 
559  if ((bParsingQuiet == true) &&
560  (pQuiet != NULL)) {
561  CARDbStartQuiet(pMgmt->pAdapter);
562  }
563 
564  pBSSList->uIELength = uIELength;
565  if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN)
566  pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN;
567  memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength);
568 
569  return true;
570 }
571 
572 
573 /*+
574  *
575  * Routine Description:
576  * Update BSS set in known BSS list
577  *
578  * Return Value:
579  * true if success.
580  *
581 -*/
582 // TODO: input structure modify
583 
584 bool
586  void *hDeviceContext,
587  QWORD qwTimestamp,
588  unsigned short wBeaconInterval,
589  unsigned short wCapInfo,
590  unsigned char byCurrChannel,
591  bool bChannelHit,
592  PWLAN_IE_SSID pSSID,
593  PWLAN_IE_SUPP_RATES pSuppRates,
594  PWLAN_IE_SUPP_RATES pExtSuppRates,
595  PERPObject psERP,
596  PWLAN_IE_RSN pRSN,
597  PWLAN_IE_RSN_EXT pRSNWPA,
598  PWLAN_IE_COUNTRY pIE_Country,
599  PWLAN_IE_QUIET pIE_Quiet,
600  PKnownBSS pBSSList,
601  unsigned int uIELength,
602  unsigned char *pbyIEs,
603  void *pRxPacketContext
604  )
605 {
606  int ii;
607  PSDevice pDevice = (PSDevice)hDeviceContext;
608  PSMgmtObject pMgmt = pDevice->pMgmt;
609  PSRxMgmtPacket pRxPacket = (PSRxMgmtPacket)pRxPacketContext;
610  long ldBm;
611  bool bParsingQuiet = false;
612  PWLAN_IE_QUIET pQuiet = NULL;
613 
614 
615 
616  if (pBSSList == NULL)
617  return false;
618 
619 
620  HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp));
621  LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp));
622  pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval);
623  pBSSList->wCapInfo = cpu_to_le16(wCapInfo);
624  pBSSList->uClearCount = 0;
625  pBSSList->uChannel = byCurrChannel;
626 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSbUpdateToBSSList: pBSSList->uChannel: %d\n", pBSSList->uChannel);
627 
628  if (pSSID->len > WLAN_SSID_MAXLEN)
629  pSSID->len = WLAN_SSID_MAXLEN;
630 
631  if ((pSSID->len != 0) && (pSSID->abySSID[0] != 0))
632  memcpy(pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN);
633  memcpy(pBSSList->abySuppRates, pSuppRates,pSuppRates->len + WLAN_IEHDR_LEN);
634 
635  if (pExtSuppRates != NULL) {
636  memcpy(pBSSList->abyExtSuppRates, pExtSuppRates,pExtSuppRates->len + WLAN_IEHDR_LEN);
637  } else {
638  memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
639  }
640  pBSSList->sERP.byERP = psERP->byERP;
641  pBSSList->sERP.bERPExist = psERP->bERPExist;
642 
643  // Check if BSS is 802.11a/b/g
644  if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) {
645  pBSSList->eNetworkTypeInUse = PHY_TYPE_11A;
646  } else {
647  if (pBSSList->sERP.bERPExist == true) {
648  pBSSList->eNetworkTypeInUse = PHY_TYPE_11G;
649  } else {
650  pBSSList->eNetworkTypeInUse = PHY_TYPE_11B;
651  }
652  }
653 
654  pBSSList->byRxRate = pRxPacket->byRxRate;
655  pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF;
656  if(bChannelHit)
657  pBSSList->uRSSI = pRxPacket->uRSSI;
658  pBSSList->bySQ = pRxPacket->bySQ;
659 
660  if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
661  (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
662  // assoc with BSS
663  if (pBSSList == pMgmt->pCurrBSS) {
664  bParsingQuiet = true;
665  }
666  }
667 
668  WPA_ClearRSN(pBSSList); //mike update
669 
670  if (pRSNWPA != NULL) {
671  unsigned int uLen = pRSNWPA->len + 2;
672  if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSNWPA - pbyIEs))) {
673  pBSSList->wWPALen = uLen;
674  memcpy(pBSSList->byWPAIE, pRSNWPA, uLen);
675  WPA_ParseRSN(pBSSList, pRSNWPA);
676  }
677  }
678 
679  WPA2_ClearRSN(pBSSList); //mike update
680 
681  if (pRSN != NULL) {
682  unsigned int uLen = pRSN->len + 2;
683  if (uLen <= (uIELength - (unsigned int)((unsigned char *)pRSN - pbyIEs))) {
684  pBSSList->wRSNLen = uLen;
685  memcpy(pBSSList->byRSNIE, pRSN, uLen);
686  WPA2vParseRSN(pBSSList, pRSN);
687  }
688  }
689 
690  if (pRxPacket->uRSSI != 0) {
691  RFvRSSITodBm(pDevice, (unsigned char)(pRxPacket->uRSSI), &ldBm);
692  // Moniter if RSSI is too strong.
693  pBSSList->byRSSIStatCnt++;
694  pBSSList->byRSSIStatCnt %= RSSI_STAT_COUNT;
695  pBSSList->ldBmAverage[pBSSList->byRSSIStatCnt] = ldBm;
696  for(ii=0;ii<RSSI_STAT_COUNT;ii++) {
697  if (pBSSList->ldBmAverage[ii] != 0) {
698  pBSSList->ldBmMAX = max(pBSSList->ldBmAverage[ii], ldBm);
699  }
700  }
701  }
702 
703  if ((pIE_Country != NULL) &&
704  (pMgmt->b11hEnable == true)) {
705  set_country_info(pMgmt->pAdapter, pBSSList->eNetworkTypeInUse,
706  pIE_Country);
707  }
708 
709  if ((bParsingQuiet == true) && (pIE_Quiet != NULL)) {
710  if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) &&
711  (((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) {
712  // valid EID
713  if (pQuiet == NULL) {
714  pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
715  CARDbSetQuiet( pMgmt->pAdapter,
716  true,
717  pQuiet->byQuietCount,
718  pQuiet->byQuietPeriod,
719  *((unsigned short *)pQuiet->abyQuietDuration),
720  *((unsigned short *)pQuiet->abyQuietOffset)
721  );
722  } else {
723  pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
724  CARDbSetQuiet( pMgmt->pAdapter,
725  false,
726  pQuiet->byQuietCount,
727  pQuiet->byQuietPeriod,
728  *((unsigned short *)pQuiet->abyQuietDuration),
729  *((unsigned short *)pQuiet->abyQuietOffset)
730  );
731  }
732  }
733  }
734 
735  if ((bParsingQuiet == true) &&
736  (pQuiet != NULL)) {
737  CARDbStartQuiet(pMgmt->pAdapter);
738  }
739 
740  pBSSList->uIELength = uIELength;
741  if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN)
742  pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN;
743  memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength);
744 
745  return true;
746 }
747 
748 
749 
750 
751 
752 /*+
753  *
754  * Routine Description:
755  * Search Node DB table to find the index of matched DstAddr
756  *
757  * Return Value:
758  * None
759  *
760 -*/
761 
762 bool
763 BSSDBbIsSTAInNodeDB(void *pMgmtObject, unsigned char *abyDstAddr,
764  unsigned int *puNodeIndex)
765 {
766  PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
767  unsigned int ii;
768 
769  // Index = 0 reserved for AP Node
770  for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
771  if (pMgmt->sNodeDBTable[ii].bActive) {
772  if (!compare_ether_addr(abyDstAddr, pMgmt->sNodeDBTable[ii].abyMACAddr)) {
773  *puNodeIndex = ii;
774  return true;
775  }
776  }
777  }
778 
779  return false;
780 };
781 
782 
783 
784 /*+
785  *
786  * Routine Description:
787  * Find an empty node and allocat it; if there is no empty node,
788  * then use the most inactive one.
789  *
790  * Return Value:
791  * None
792  *
793 -*/
794 void
795 BSSvCreateOneNode(void *hDeviceContext, unsigned int *puNodeIndex)
796 {
797 
798  PSDevice pDevice = (PSDevice)hDeviceContext;
799  PSMgmtObject pMgmt = pDevice->pMgmt;
800  unsigned int ii;
801  unsigned int BigestCount = 0;
802  unsigned int SelectIndex;
803  struct sk_buff *skb;
804  // Index = 0 reserved for AP Node (In STA mode)
805  // Index = 0 reserved for Broadcast/MultiCast (In AP mode)
806  SelectIndex = 1;
807  for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {
808  if (pMgmt->sNodeDBTable[ii].bActive) {
809  if (pMgmt->sNodeDBTable[ii].uInActiveCount > BigestCount) {
810  BigestCount = pMgmt->sNodeDBTable[ii].uInActiveCount;
811  SelectIndex = ii;
812  }
813  }
814  else {
815  break;
816  }
817  }
818 
819  // if not found replace uInActiveCount is largest one.
820  if ( ii == (MAX_NODE_NUM + 1)) {
821  *puNodeIndex = SelectIndex;
822  DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Replace inactive node = %d\n", SelectIndex);
823  // clear ps buffer
824  if (pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue.next != NULL) {
825  while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue)) != NULL)
826  dev_kfree_skb(skb);
827  }
828  }
829  else {
830  *puNodeIndex = ii;
831  }
832 
833  memset(&pMgmt->sNodeDBTable[*puNodeIndex], 0, sizeof(KnownNodeDB));
834  pMgmt->sNodeDBTable[*puNodeIndex].bActive = true;
835  pMgmt->sNodeDBTable[*puNodeIndex].uRatePollTimeout = FALLBACK_POLL_SECOND;
836  // for AP mode PS queue
837  skb_queue_head_init(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue);
838  pMgmt->sNodeDBTable[*puNodeIndex].byAuthSequence = 0;
839  pMgmt->sNodeDBTable[*puNodeIndex].wEnQueueCnt = 0;
840  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Create node index = %d\n", ii);
841  return;
842 };
843 
844 
845 
846 /*+
847  *
848  * Routine Description:
849  * Remove Node by NodeIndex
850  *
851  *
852  * Return Value:
853  * None
854  *
855 -*/
856 void
858  void *hDeviceContext,
859  unsigned int uNodeIndex
860  )
861 {
862 
863  PSDevice pDevice = (PSDevice)hDeviceContext;
864  PSMgmtObject pMgmt = pDevice->pMgmt;
865  unsigned char byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
866  struct sk_buff *skb;
867 
868 
869  while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue)) != NULL)
870  dev_kfree_skb(skb);
871  // clear context
872  memset(&pMgmt->sNodeDBTable[uNodeIndex], 0, sizeof(KnownNodeDB));
873  // clear tx bit map
874  pMgmt->abyPSTxMap[pMgmt->sNodeDBTable[uNodeIndex].wAID >> 3] &= ~byMask[pMgmt->sNodeDBTable[uNodeIndex].wAID & 7];
875 
876  return;
877 };
878 /*+
879  *
880  * Routine Description:
881  * Update AP Node content in Index 0 of KnownNodeDB
882  *
883  *
884  * Return Value:
885  * None
886  *
887 -*/
888 
889 void
891  void *hDeviceContext,
892  unsigned short *pwCapInfo,
893  PWLAN_IE_SUPP_RATES pSuppRates,
894  PWLAN_IE_SUPP_RATES pExtSuppRates
895  )
896 {
897  PSDevice pDevice = (PSDevice)hDeviceContext;
898  PSMgmtObject pMgmt = pDevice->pMgmt;
899  unsigned int uRateLen = WLAN_RATES_MAXLEN;
900 
901  memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB));
902 
903  pMgmt->sNodeDBTable[0].bActive = true;
904  if (pDevice->eCurrentPHYType == PHY_TYPE_11B) {
905  uRateLen = WLAN_RATES_MAXLEN_11B;
906  }
907  pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pSuppRates,
909  uRateLen);
910  pMgmt->abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pExtSuppRates,
912  uRateLen);
913  RATEvParseMaxRate((void *)pDevice,
916  true,
917  &(pMgmt->sNodeDBTable[0].wMaxBasicRate),
918  &(pMgmt->sNodeDBTable[0].wMaxSuppRate),
919  &(pMgmt->sNodeDBTable[0].wSuppRate),
920  &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate),
921  &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)
922  );
924  pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxSuppRate;
927 #ifdef PLICE_DEBUG
928  printk("BSSvUpdateAPNode:MaxSuppRate is %d\n",pMgmt->sNodeDBTable[0].wMaxSuppRate);
929 #endif
930  // Auto rate fallback function initiation.
931  // RATEbInit(pDevice);
932  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pMgmt->sNodeDBTable[0].wTxDataRate = %d \n", pMgmt->sNodeDBTable[0].wTxDataRate);
933 
934 };
935 
936 
937 
938 
939 
940 /*+
941  *
942  * Routine Description:
943  * Add Multicast Node content in Index 0 of KnownNodeDB
944  *
945  *
946  * Return Value:
947  * None
948  *
949 -*/
950 
951 
952 void
954  void *hDeviceContext
955  )
956 {
957  PSDevice pDevice = (PSDevice)hDeviceContext;
958  PSMgmtObject pMgmt = pDevice->pMgmt;
959 
960  if (!pDevice->bEnableHostWEP)
961  memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB));
962  memset(pMgmt->sNodeDBTable[0].abyMACAddr, 0xff, WLAN_ADDR_LEN);
963  pMgmt->sNodeDBTable[0].bActive = true;
964  pMgmt->sNodeDBTable[0].bPSEnable = false;
965  skb_queue_head_init(&pMgmt->sNodeDBTable[0].sTxPSQueue);
966  RATEvParseMaxRate((void *)pDevice,
969  true,
970  &(pMgmt->sNodeDBTable[0].wMaxBasicRate),
971  &(pMgmt->sNodeDBTable[0].wMaxSuppRate),
972  &(pMgmt->sNodeDBTable[0].wSuppRate),
973  &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate),
974  &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)
975  );
976  pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxBasicRate;
977 #ifdef PLICE_DEBUG
978  printk("BSSvAddMultiCastNode:pMgmt->sNodeDBTable[0].wTxDataRate is %d\n",pMgmt->sNodeDBTable[0].wTxDataRate);
979 #endif
981 
982 };
983 
984 
985 
986 
987 
988 /*+
989  *
990  * Routine Description:
991  *
992  *
993  * Second call back function to update Node DB info & AP link status
994  *
995  *
996  * Return Value:
997  * none.
998  *
999 -*/
1000  //2008-4-14 <add> by chester for led issue
1001  #ifdef FOR_LED_ON_NOTEBOOK
1002 bool cc=false;
1003 unsigned int status;
1004 #endif
1005 void
1007  void *hDeviceContext
1008  )
1009 {
1010  PSDevice pDevice = (PSDevice)hDeviceContext;
1011  PSMgmtObject pMgmt = pDevice->pMgmt;
1012  unsigned int ii;
1013  PWLAN_IE_SSID pItemSSID, pCurrSSID;
1014  unsigned int uSleepySTACnt = 0;
1015  unsigned int uNonShortSlotSTACnt = 0;
1016  unsigned int uLongPreambleSTACnt = 0;
1017  viawget_wpa_header* wpahdr; //DavidWang
1018 
1019  spin_lock_irq(&pDevice->lock);
1020 
1021  pDevice->uAssocCount = 0;
1022 
1023  pDevice->byERPFlag &=
1025  //2008-4-14 <add> by chester for led issue
1026 #ifdef FOR_LED_ON_NOTEBOOK
1027 MACvGPIOIn(pDevice->PortOffset, &pDevice->byGPIO);
1028 if ((( !(pDevice->byGPIO & GPIO0_DATA)&&(pDevice->bHWRadioOff == false))||((pDevice->byGPIO & GPIO0_DATA)&&(pDevice->bHWRadioOff == true)))&&(cc==false)){
1029 cc=true;
1030 }
1031 else if(cc==true){
1032 
1033 if(pDevice->bHWRadioOff == true){
1034  if ( !(pDevice->byGPIO & GPIO0_DATA))
1035 //||( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
1036 {if(status==1) goto start;
1037 status=1;
1038 CARDbRadioPowerOff(pDevice);
1039  pMgmt->sNodeDBTable[0].bActive = false;
1040  pMgmt->eCurrMode = WMAC_MODE_STANDBY;
1041  pMgmt->eCurrState = WMAC_STATE_IDLE;
1042  //netif_stop_queue(pDevice->dev);
1043  pDevice->bLinkPass = false;
1044 
1045 }
1046  if (pDevice->byGPIO &GPIO0_DATA)
1047 //||( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
1048 {if(status==2) goto start;
1049 status=2;
1050 CARDbRadioPowerOn(pDevice);
1051 } }
1052 else{
1053  if (pDevice->byGPIO & GPIO0_DATA)
1054 //||( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
1055 {if(status==3) goto start;
1056 status=3;
1057 CARDbRadioPowerOff(pDevice);
1058  pMgmt->sNodeDBTable[0].bActive = false;
1059  pMgmt->eCurrMode = WMAC_MODE_STANDBY;
1060  pMgmt->eCurrState = WMAC_STATE_IDLE;
1061  //netif_stop_queue(pDevice->dev);
1062  pDevice->bLinkPass = false;
1063 
1064 }
1065  if ( !(pDevice->byGPIO & GPIO0_DATA))
1066 //||( !(pDevice->byGPIO & GPIO0_DATA) && (pDevice->byRadioCtl & EEP_RADIOCTL_INV)))
1067 {if(status==4) goto start;
1068 status=4;
1069 CARDbRadioPowerOn(pDevice);
1070 } }
1071 }
1072 start:
1073 #endif
1074 
1075 
1076  if (pDevice->wUseProtectCntDown > 0) {
1077  pDevice->wUseProtectCntDown --;
1078  }
1079  else {
1080  // disable protect mode
1081  pDevice->byERPFlag &= ~(WLAN_SET_ERP_USE_PROTECTION(1));
1082  }
1083 
1084 {
1085  pDevice->byReAssocCount++;
1086  if((pDevice->byReAssocCount > 10) && (pDevice->bLinkPass != true)) { //10 sec timeout
1087  printk("Re-association timeout!!!\n");
1088  pDevice->byReAssocCount = 0;
1089  #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1090  // if(pDevice->bWPASuppWextEnabled == true)
1091  {
1092  union iwreq_data wrqu;
1093  memset(&wrqu, 0, sizeof (wrqu));
1094  wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1095  PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
1096  wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1097  }
1098  #endif
1099  }
1100  else if(pDevice->bLinkPass == true)
1101  pDevice->byReAssocCount = 0;
1102 }
1103 
1104 #ifdef Calcu_LinkQual
1105  s_uCalculateLinkQual((void *)pDevice);
1106 #endif
1107 
1108  for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) {
1109 
1110  if (pMgmt->sNodeDBTable[ii].bActive) {
1111  // Increase in-activity counter
1112  pMgmt->sNodeDBTable[ii].uInActiveCount++;
1113 
1114  if (ii > 0) {
1115  if (pMgmt->sNodeDBTable[ii].uInActiveCount > MAX_INACTIVE_COUNT) {
1116  BSSvRemoveOneNode(pDevice, ii);
1118  "Inactive timeout [%d] sec, STA index = [%d] remove\n", MAX_INACTIVE_COUNT, ii);
1119  continue;
1120  }
1121 
1122  if (pMgmt->sNodeDBTable[ii].eNodeState >= NODE_ASSOC) {
1123 
1124  pDevice->uAssocCount++;
1125 
1126  // check if Non ERP exist
1127  if (pMgmt->sNodeDBTable[ii].uInActiveCount < ERP_RECOVER_COUNT) {
1128  if (!pMgmt->sNodeDBTable[ii].bShortPreamble) {
1129  pDevice->byERPFlag |= WLAN_SET_ERP_BARKER_MODE(1);
1130  uLongPreambleSTACnt ++;
1131  }
1132  if (!pMgmt->sNodeDBTable[ii].bERPExist) {
1133  pDevice->byERPFlag |= WLAN_SET_ERP_NONERP_PRESENT(1);
1134  pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1);
1135  }
1136  if (!pMgmt->sNodeDBTable[ii].bShortSlotTime)
1137  uNonShortSlotSTACnt++;
1138  }
1139  }
1140 
1141  // check if any STA in PS mode
1142  if (pMgmt->sNodeDBTable[ii].bPSEnable)
1143  uSleepySTACnt++;
1144 
1145 
1146  }
1147 
1148  // Rate fallback check
1149  if (!pDevice->bFixRate) {
1150 /*
1151  if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (ii == 0))
1152  RATEvTxRateFallBack(pDevice, &(pMgmt->sNodeDBTable[ii]));
1153 */
1154  if (ii > 0) {
1155  // ii = 0 for multicast node (AP & Adhoc)
1156  RATEvTxRateFallBack((void *)pDevice, &(pMgmt->sNodeDBTable[ii]));
1157  }
1158  else {
1159  // ii = 0 reserved for unicast AP node (Infra STA)
1160  if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA)
1161 #ifdef PLICE_DEBUG
1162  printk("SecondCallback:Before:TxDataRate is %d\n",pMgmt->sNodeDBTable[0].wTxDataRate);
1163 #endif
1164  RATEvTxRateFallBack((void *)pDevice, &(pMgmt->sNodeDBTable[ii]));
1165 #ifdef PLICE_DEBUG
1166  printk("SecondCallback:After:TxDataRate is %d\n",pMgmt->sNodeDBTable[0].wTxDataRate);
1167 #endif
1168 
1169  }
1170 
1171  }
1172 
1173  // check if pending PS queue
1174  if (pMgmt->sNodeDBTable[ii].wEnQueueCnt != 0) {
1175  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Index= %d, Queue = %d pending \n",
1176  ii, pMgmt->sNodeDBTable[ii].wEnQueueCnt);
1177  if ((ii >0) && (pMgmt->sNodeDBTable[ii].wEnQueueCnt > 15)) {
1178  BSSvRemoveOneNode(pDevice, ii);
1179  DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Pending many queues PS STA Index = %d remove \n", ii);
1180  continue;
1181  }
1182  }
1183  }
1184 
1185  }
1186 
1187 
1188  if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->eCurrentPHYType == PHY_TYPE_11G)) {
1189 
1190  // on/off protect mode
1191  if (WLAN_GET_ERP_USE_PROTECTION(pDevice->byERPFlag)) {
1192  if (!pDevice->bProtectMode) {
1193  MACvEnableProtectMD(pDevice->PortOffset);
1194  pDevice->bProtectMode = true;
1195  }
1196  }
1197  else {
1198  if (pDevice->bProtectMode) {
1199  MACvDisableProtectMD(pDevice->PortOffset);
1200  pDevice->bProtectMode = false;
1201  }
1202  }
1203  // on/off short slot time
1204 
1205  if (uNonShortSlotSTACnt > 0) {
1206  if (pDevice->bShortSlotTime) {
1207  pDevice->bShortSlotTime = false;
1208  BBvSetShortSlotTime(pDevice);
1209  vUpdateIFS((void *)pDevice);
1210  }
1211  }
1212  else {
1213  if (!pDevice->bShortSlotTime) {
1214  pDevice->bShortSlotTime = true;
1215  BBvSetShortSlotTime(pDevice);
1216  vUpdateIFS((void *)pDevice);
1217  }
1218  }
1219 
1220  // on/off barker long preamble mode
1221 
1222  if (uLongPreambleSTACnt > 0) {
1223  if (!pDevice->bBarkerPreambleMd) {
1225  pDevice->bBarkerPreambleMd = true;
1226  }
1227  }
1228  else {
1229  if (pDevice->bBarkerPreambleMd) {
1231  pDevice->bBarkerPreambleMd = false;
1232  }
1233  }
1234 
1235  }
1236 
1237 
1238  // Check if any STA in PS mode, enable DTIM multicast deliver
1239  if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
1240  if (uSleepySTACnt > 0)
1241  pMgmt->sNodeDBTable[0].bPSEnable = true;
1242  else
1243  pMgmt->sNodeDBTable[0].bPSEnable = false;
1244  }
1245 
1246  pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
1247  pCurrSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
1248 
1249  if ((pMgmt->eCurrMode == WMAC_MODE_STANDBY) ||
1250  (pMgmt->eCurrMode == WMAC_MODE_ESS_STA)) {
1251 
1252  if (pMgmt->sNodeDBTable[0].bActive) { // Assoc with BSS
1253  // DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Callback inactive Count = [%d]\n", pMgmt->sNodeDBTable[0].uInActiveCount);
1254  //if (pDevice->bUpdateBBVGA) {
1255  // s_vCheckSensitivity((void *) pDevice);
1256  //}
1257 
1258  if (pDevice->bUpdateBBVGA) {
1259  // s_vCheckSensitivity((void *) pDevice);
1260  s_vCheckPreEDThreshold((void *)pDevice);
1261  }
1262 
1263  if ((pMgmt->sNodeDBTable[0].uInActiveCount >= (LOST_BEACON_COUNT/2)) &&
1264  (pDevice->byBBVGACurrent != pDevice->abyBBVGA[0]) ) {
1265  pDevice->byBBVGANew = pDevice->abyBBVGA[0];
1267  }
1268 
1269  if (pMgmt->sNodeDBTable[0].uInActiveCount >= LOST_BEACON_COUNT) {
1270  pMgmt->sNodeDBTable[0].bActive = false;
1271  pMgmt->eCurrMode = WMAC_MODE_STANDBY;
1272  pMgmt->eCurrState = WMAC_STATE_IDLE;
1273  netif_stop_queue(pDevice->dev);
1274  pDevice->bLinkPass = false;
1275  pDevice->bRoaming = true;
1276  DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Lost AP beacon [%d] sec, disconnected !\n", pMgmt->sNodeDBTable[0].uInActiveCount);
1277  if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
1278  wpahdr = (viawget_wpa_header *)pDevice->skb->data;
1279  wpahdr->type = VIAWGET_DISASSOC_MSG;
1280  wpahdr->resp_ie_len = 0;
1281  wpahdr->req_ie_len = 0;
1282  skb_put(pDevice->skb, sizeof(viawget_wpa_header));
1283  pDevice->skb->dev = pDevice->wpadev;
1284  skb_reset_mac_header(pDevice->skb);
1285  pDevice->skb->pkt_type = PACKET_HOST;
1286  pDevice->skb->protocol = htons(ETH_P_802_2);
1287  memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
1288  netif_rx(pDevice->skb);
1289  pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
1290  }
1291  #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1292  // if(pDevice->bWPASuppWextEnabled == true)
1293  {
1294  union iwreq_data wrqu;
1295  memset(&wrqu, 0, sizeof (wrqu));
1296  wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1297  PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
1298  wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
1299  }
1300  #endif
1301  }
1302  }
1303  else if (pItemSSID->len != 0) {
1304  if (pDevice->uAutoReConnectTime < 10) {
1305  pDevice->uAutoReConnectTime++;
1306  #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1307  //network manager support need not do Roaming scan???
1308  if(pDevice->bWPASuppWextEnabled ==true)
1309  pDevice->uAutoReConnectTime = 0;
1310  #endif
1311  }
1312  else {
1313  //mike use old encryption status for wpa reauthen
1314  if(pDevice->bWPADEVUp)
1315  pDevice->eEncryptionStatus = pDevice->eOldEncryptionStatus;
1316 
1317  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Roaming ...\n");
1318  BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass);
1319  pMgmt->eScanType = WMAC_SCAN_ACTIVE;
1320  bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID);
1321  bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, pMgmt->abyDesireSSID);
1322  pDevice->uAutoReConnectTime = 0;
1323  }
1324  }
1325  }
1326 
1327  if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
1328  // if adhoc started which essid is NULL string, rescanning.
1329  if ((pMgmt->eCurrState == WMAC_STATE_STARTED) && (pCurrSSID->len == 0)) {
1330  if (pDevice->uAutoReConnectTime < 10) {
1331  pDevice->uAutoReConnectTime++;
1332  }
1333  else {
1334  DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Adhoc re-scanning ...\n");
1335  pMgmt->eScanType = WMAC_SCAN_ACTIVE;
1336  bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL);
1337  bScheduleCommand((void *) pDevice, WLAN_CMD_SSID, NULL);
1338  pDevice->uAutoReConnectTime = 0;
1339  };
1340  }
1341  if (pMgmt->eCurrState == WMAC_STATE_JOINTED) {
1342 
1343  if (pDevice->bUpdateBBVGA) {
1344  //s_vCheckSensitivity((void *) pDevice);
1345  s_vCheckPreEDThreshold((void *)pDevice);
1346  }
1348  DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Lost other STA beacon [%d] sec, started !\n", pMgmt->sNodeDBTable[0].uInActiveCount);
1349  pMgmt->sNodeDBTable[0].uInActiveCount = 0;
1350  pMgmt->eCurrState = WMAC_STATE_STARTED;
1351  netif_stop_queue(pDevice->dev);
1352  pDevice->bLinkPass = false;
1353  }
1354  }
1355  }
1356 
1357  spin_unlock_irq(&pDevice->lock);
1358 
1359  pMgmt->sTimerSecondCallback.expires = RUN_AT(HZ);
1361  return;
1362 }
1363 
1364 
1365 
1366 
1367 /*+
1368  *
1369  * Routine Description:
1370  *
1371  *
1372  * Update Tx attemps, Tx failure counter in Node DB
1373  *
1374  *
1375  * Return Value:
1376  * none.
1377  *
1378 -*/
1379 
1380 
1381 
1382 void
1384  void *hDeviceContext,
1385  unsigned char byTsr0,
1386  unsigned char byTsr1,
1387  unsigned char *pbyBuffer,
1388  unsigned int uFIFOHeaderSize
1389  )
1390 {
1391  PSDevice pDevice = (PSDevice)hDeviceContext;
1392  PSMgmtObject pMgmt = pDevice->pMgmt;
1393  unsigned int uNodeIndex = 0;
1394  unsigned char byTxRetry = (byTsr0 & TSR0_NCR);
1395  PSTxBufHead pTxBufHead;
1396  PS802_11Header pMACHeader;
1397  unsigned short wRate;
1398  unsigned short wFallBackRate = RATE_1M;
1399  unsigned char byFallBack;
1400  unsigned int ii;
1401 // unsigned int txRetryTemp;
1402 //PLICE_DEBUG->
1403  //txRetryTemp = byTxRetry;
1404  //if (txRetryTemp== 8)
1405  //txRetryTemp -=3;
1406 //PLICE_DEBUG <-
1407  pTxBufHead = (PSTxBufHead) pbyBuffer;
1408  if (pTxBufHead->wFIFOCtl & FIFOCTL_AUTO_FB_0) {
1409  byFallBack = AUTO_FB_0;
1410  } else if (pTxBufHead->wFIFOCtl & FIFOCTL_AUTO_FB_1) {
1411  byFallBack = AUTO_FB_1;
1412  } else {
1413  byFallBack = AUTO_FB_NONE;
1414  }
1415  wRate = pTxBufHead->wReserved; //?wRate
1416  //printk("BSSvUpdateNodeTxCounter:byTxRetry is %d\n",byTxRetry);
1417 
1418 //printk("BSSvUpdateNodeTx:wRate is %d,byFallback is %d\n",wRate,byFallBack);
1419 //#ifdef PLICE_DEBUG
1420  //printk("BSSvUpdateNodeTx: wRate is %d\n",wRate);
1422  // Only Unicast using support rates
1423  if (pTxBufHead->wFIFOCtl & FIFOCTL_NEEDACK) {
1424  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wRate %04X, byTsr0 %02X, byTsr1 %02X\n", wRate, byTsr0, byTsr1);
1425  if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) {
1426  pMgmt->sNodeDBTable[0].uTxAttempts += 1;
1427  if ((byTsr1 & TSR1_TERR) == 0) {
1428  // transmit success, TxAttempts at least plus one
1429  pMgmt->sNodeDBTable[0].uTxOk[MAX_RATE]++;
1430  if ( (byFallBack == AUTO_FB_NONE) ||
1431  (wRate < RATE_18M) ) {
1432  wFallBackRate = wRate;
1433  } else if (byFallBack == AUTO_FB_0) {
1434 //PLICE_DEBUG
1435  if (byTxRetry < 5)
1436  //if (txRetryTemp < 5)
1437  wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry];
1438  //wFallBackRate = awHWRetry0[wRate-RATE_12M][byTxRetry];
1439  //wFallBackRate = awHWRetry0[wRate-RATE_18M][txRetryTemp] +1;
1440  else
1441  wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
1442  //wFallBackRate = awHWRetry0[wRate-RATE_12M][4];
1443  } else if (byFallBack == AUTO_FB_1) {
1444  if (byTxRetry < 5)
1445  wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry];
1446  else
1447  wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
1448  }
1449  pMgmt->sNodeDBTable[0].uTxOk[wFallBackRate]++;
1450  } else {
1451  pMgmt->sNodeDBTable[0].uTxFailures ++;
1452  }
1453  pMgmt->sNodeDBTable[0].uTxRetry += byTxRetry;
1454  if (byTxRetry != 0) {
1455  pMgmt->sNodeDBTable[0].uTxFail[MAX_RATE]+=byTxRetry;
1456  if ( (byFallBack == AUTO_FB_NONE) ||
1457  (wRate < RATE_18M) ) {
1458  pMgmt->sNodeDBTable[0].uTxFail[wRate]+=byTxRetry;
1459  } else if (byFallBack == AUTO_FB_0) {
1460 //PLICE_DEBUG
1461  for(ii=0;ii<byTxRetry;ii++)
1462  //for (ii=0;ii<txRetryTemp;ii++)
1463  {
1464  if (ii < 5)
1465  {
1466 
1467 //PLICE_DEBUG
1468  wFallBackRate = awHWRetry0[wRate-RATE_18M][ii];
1469  //printk(" II is %d:BSSvUpdateNodeTx:wFallBackRate is %d\n",ii,wFallBackRate);
1470  //wFallBackRate = awHWRetry0[wRate-RATE_12M][ii];
1471  }
1472  else
1473  {
1474  wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
1475  //printk("ii is %d BSSvUpdateNodeTx:wFallBackRate is %d\n",ii,wFallBackRate);
1476  //wFallBackRate = awHWRetry0[wRate-RATE_12M][4];
1477  }
1478  pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++;
1479  }
1480  } else if (byFallBack == AUTO_FB_1) {
1481  for(ii=0;ii<byTxRetry;ii++) {
1482  if (ii < 5)
1483  wFallBackRate = awHWRetry1[wRate-RATE_18M][ii];
1484  else
1485  wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
1486  pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++;
1487  }
1488  }
1489  }
1490  }
1491 
1492  if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
1493  (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
1494 
1495  pMACHeader = (PS802_11Header)(pbyBuffer + uFIFOHeaderSize);
1496 
1497  if (BSSDBbIsSTAInNodeDB((void *)pMgmt, &(pMACHeader->abyAddr1[0]), &uNodeIndex)){
1498  pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts += 1;
1499  if ((byTsr1 & TSR1_TERR) == 0) {
1500  // transmit success, TxAttempts at least plus one
1501  pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++;
1502  if ( (byFallBack == AUTO_FB_NONE) ||
1503  (wRate < RATE_18M) ) {
1504  wFallBackRate = wRate;
1505  } else if (byFallBack == AUTO_FB_0) {
1506  if (byTxRetry < 5)
1507  wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry];
1508  else
1509  wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
1510  } else if (byFallBack == AUTO_FB_1) {
1511  if (byTxRetry < 5)
1512  wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry];
1513  else
1514  wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
1515  }
1516  pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wFallBackRate]++;
1517  } else {
1518  pMgmt->sNodeDBTable[uNodeIndex].uTxFailures ++;
1519  }
1520  pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += byTxRetry;
1521  if (byTxRetry != 0) {
1522  pMgmt->sNodeDBTable[uNodeIndex].uTxFail[MAX_RATE]+=byTxRetry;
1523  if ( (byFallBack == AUTO_FB_NONE) ||
1524  (wRate < RATE_18M) ) {
1525  pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wRate]+=byTxRetry;
1526  } else if (byFallBack == AUTO_FB_0) {
1527  for(ii=0;ii<byTxRetry;ii++) {
1528  if (ii < 5)
1529  wFallBackRate = awHWRetry0[wRate-RATE_18M][ii];
1530  else
1531  wFallBackRate = awHWRetry0[wRate-RATE_18M][4];
1532  pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++;
1533  }
1534  } else if (byFallBack == AUTO_FB_1) {
1535  for(ii=0;ii<byTxRetry;ii++) {
1536  if (ii < 5)
1537  wFallBackRate = awHWRetry1[wRate-RATE_18M][ii];
1538  else
1539  wFallBackRate = awHWRetry1[wRate-RATE_18M][4];
1540  pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++;
1541  }
1542  }
1543  }
1544  }
1545  }
1546  }
1547 
1548  return;
1549 
1550 
1551 }
1552 
1553 
1554 
1555 
1556 /*+
1557  *
1558  * Routine Description:
1559  * Clear Nodes & skb in DB Table
1560  *
1561  *
1562  * Parameters:
1563  * In:
1564  * hDeviceContext - The adapter context.
1565  * uStartIndex - starting index
1566  * Out:
1567  * none
1568  *
1569  * Return Value:
1570  * None.
1571  *
1572 -*/
1573 
1574 
1575 void
1577  void *hDeviceContext,
1578  unsigned int uStartIndex
1579  )
1580 
1581 {
1582  PSDevice pDevice = (PSDevice)hDeviceContext;
1583  PSMgmtObject pMgmt = pDevice->pMgmt;
1584  struct sk_buff *skb;
1585  unsigned int ii;
1586 
1587  for (ii = uStartIndex; ii < (MAX_NODE_NUM + 1); ii++) {
1588  if (pMgmt->sNodeDBTable[ii].bActive) {
1589  // check if sTxPSQueue has been initial
1590  if (pMgmt->sNodeDBTable[ii].sTxPSQueue.next != NULL) {
1591  while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[ii].sTxPSQueue)) != NULL){
1592  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "PS skb != NULL %d\n", ii);
1593  dev_kfree_skb(skb);
1594  }
1595  }
1596  memset(&pMgmt->sNodeDBTable[ii], 0, sizeof(KnownNodeDB));
1597  }
1598  }
1599 
1600  return;
1601 };
1602 
1603 
1605  void *hDeviceContext
1606  )
1607 {
1608  PSDevice pDevice = (PSDevice)hDeviceContext;
1609  PKnownBSS pBSSList = NULL;
1610  PSMgmtObject pMgmt = pDevice->pMgmt;
1611  int ii;
1612 
1613  if ((pDevice->byLocalID <= REV_ID_VT3253_A1) && (pDevice->byRFType == RF_RFMD2959) &&
1614  (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) {
1615  return;
1616  }
1617 
1618  if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) ||
1619  ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) {
1620  pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID);
1621  if (pBSSList != NULL) {
1622  // Updata BB Reg if RSSI is too strong.
1623  long LocalldBmAverage = 0;
1624  long uNumofdBm = 0;
1625  for (ii = 0; ii < RSSI_STAT_COUNT; ii++) {
1626  if (pBSSList->ldBmAverage[ii] != 0) {
1627  uNumofdBm ++;
1628  LocalldBmAverage += pBSSList->ldBmAverage[ii];
1629  }
1630  }
1631  if (uNumofdBm > 0) {
1632  LocalldBmAverage = LocalldBmAverage/uNumofdBm;
1633  for (ii=0;ii<BB_VGA_LEVEL;ii++) {
1634  DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LocalldBmAverage:%ld, %ld %02x\n", LocalldBmAverage, pDevice->ldBmThreshold[ii], pDevice->abyBBVGA[ii]);
1635  if (LocalldBmAverage < pDevice->ldBmThreshold[ii]) {
1636  pDevice->byBBVGANew = pDevice->abyBBVGA[ii];
1637  break;
1638  }
1639  }
1640  if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) {
1641  pDevice->uBBVGADiffCount++;
1642  if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD)
1644  } else {
1645  pDevice->uBBVGADiffCount = 0;
1646  }
1647  }
1648  }
1649  }
1650 }
1651 
1652 
1653 void
1655  void *hDeviceContext
1656  )
1657 {
1658  PSDevice pDevice = (PSDevice)hDeviceContext;
1659  PSMgmtObject pMgmt = pDevice->pMgmt;
1660  unsigned int ii;
1661 
1662  for (ii = 0; ii < MAX_BSS_NUM; ii++) {
1663  pMgmt->sBSSList[ii].bSelected = false;
1664  }
1665  return;
1666 }
1667 
1668 #ifdef Calcu_LinkQual
1670  void *hDeviceContext
1671  )
1672 {
1673  PSDevice pDevice = (PSDevice)hDeviceContext;
1674  unsigned long TxOkRatio, TxCnt;
1675  unsigned long RxOkRatio,RxCnt;
1676  unsigned long RssiRatio;
1677  long ldBm;
1678 
1679 TxCnt = pDevice->scStatistic.TxNoRetryOkCount +
1680  pDevice->scStatistic.TxRetryOkCount +
1681  pDevice->scStatistic.TxFailCount;
1682 RxCnt = pDevice->scStatistic.RxFcsErrCnt +
1683  pDevice->scStatistic.RxOkCnt;
1684 TxOkRatio = (TxCnt < 6) ? 4000:((pDevice->scStatistic.TxNoRetryOkCount * 4000) / TxCnt);
1685 RxOkRatio = (RxCnt < 6) ? 2000:((pDevice->scStatistic.RxOkCnt * 2000) / RxCnt);
1686 //decide link quality
1687 if(pDevice->bLinkPass !=true)
1688 {
1689  // printk("s_uCalculateLinkQual-->Link disconnect and Poor quality**\n");
1690  pDevice->scStatistic.LinkQuality = 0;
1691  pDevice->scStatistic.SignalStren = 0;
1692 }
1693 else
1694 {
1695  RFvRSSITodBm(pDevice, (unsigned char)(pDevice->uCurrRSSI), &ldBm);
1696  if(-ldBm < 50) {
1697  RssiRatio = 4000;
1698  }
1699  else if(-ldBm > 90) {
1700  RssiRatio = 0;
1701  }
1702  else {
1703  RssiRatio = (40-(-ldBm-50))*4000/40;
1704  }
1705  pDevice->scStatistic.SignalStren = RssiRatio/40;
1706  pDevice->scStatistic.LinkQuality = (RssiRatio+TxOkRatio+RxOkRatio)/100;
1707 }
1708  pDevice->scStatistic.RxFcsErrCnt = 0;
1709  pDevice->scStatistic.RxOkCnt = 0;
1710  pDevice->scStatistic.TxFailCount = 0;
1711  pDevice->scStatistic.TxNoRetryOkCount = 0;
1712  pDevice->scStatistic.TxRetryOkCount = 0;
1713  return;
1714 }
1715 #endif
1716 
1718  void *hDeviceContext
1719  )
1720 {
1721  PSDevice pDevice = (PSDevice)hDeviceContext;
1722  PKnownBSS pBSSList = NULL;
1723  PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
1724 
1725  if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) ||
1726  ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) {
1727  pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID);
1728  if (pBSSList != NULL) {
1729  pDevice->byBBPreEDRSSI = (unsigned char) (~(pBSSList->ldBmAverRange) + 1);
1730  //BBvUpdatePreEDThreshold(pDevice, false);
1731  }
1732  }
1733  return;
1734 }
1735