2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
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.
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.
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.
21 * Purpose: Handles the Basic Service Set & Node Database 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 * BSSbIsSTAInNodeDB - 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
44 #if !defined(__TTYPE_H__)
47 #if !defined(__TMACRO_H__)
50 #if !defined(__TETHER_H__)
53 #if !defined(__DEVICE_H__)
56 #if !defined(__80211HDR_H__)
59 #if !defined(__BSSDB_H__)
62 #if !defined(__WMGR_H__)
65 #if !defined(__DATARATE_H__)
68 #if !defined(__DESC_H__)
71 #if !defined(__WCMD_H__)
74 #if !defined(__WPA_H__)
77 #if !defined(__BASEBAND_H__)
80 #if !defined(__RF_H__)
83 #if !defined(__CARD_H__)
86 #if !defined(__MAC_H__)
89 #if !defined(__WPA2_H__)
92 #if !defined(__UMEM_H__)
95 #if !defined(__TBIT_H__)
98 #if !defined(__CONTROL_H__)
101 #if !defined(__RNDIS_H__)
105 #if !defined(__IOWPA_H__)
109 /*--------------------- Static Definitions -------------------------*/
114 /*--------------------- Static Classes ----------------------------*/
116 /*--------------------- Static Variables --------------------------*/
117 static int msglevel
=MSG_LEVEL_INFO
;
118 //static int msglevel =MSG_LEVEL_DEBUG;
122 const WORD awHWRetry0
[5][5] = {
123 {RATE_18M
, RATE_18M
, RATE_12M
, RATE_12M
, RATE_12M
},
124 {RATE_24M
, RATE_24M
, RATE_18M
, RATE_12M
, RATE_12M
},
125 {RATE_36M
, RATE_36M
, RATE_24M
, RATE_18M
, RATE_18M
},
126 {RATE_48M
, RATE_48M
, RATE_36M
, RATE_24M
, RATE_24M
},
127 {RATE_54M
, RATE_54M
, RATE_48M
, RATE_36M
, RATE_36M
}
129 const WORD awHWRetry1
[5][5] = {
130 {RATE_18M
, RATE_18M
, RATE_12M
, RATE_6M
, RATE_6M
},
131 {RATE_24M
, RATE_24M
, RATE_18M
, RATE_6M
, RATE_6M
},
132 {RATE_36M
, RATE_36M
, RATE_24M
, RATE_12M
, RATE_12M
},
133 {RATE_48M
, RATE_48M
, RATE_24M
, RATE_12M
, RATE_12M
},
134 {RATE_54M
, RATE_54M
, RATE_36M
, RATE_18M
, RATE_18M
}
139 /*--------------------- Static Functions --------------------------*/
141 VOID
s_vCheckSensitivity(
142 IN HANDLE hDeviceContext
145 VOID
s_vCheckPreEDThreshold(
146 IN HANDLE hDeviceContext
149 #ifdef Calcu_LinkQual
150 VOID
s_uCalculateLinkQual(
151 IN HANDLE hDeviceContext
154 /*--------------------- Export Variables --------------------------*/
157 /*--------------------- Export Functions --------------------------*/
165 * Routine Description:
166 * Search known BSS list for Desire SSID or BSSID.
169 * PTR to KnownBSS or NULL
175 IN HANDLE hDeviceContext
,
176 IN PBYTE pbyDesireBSSID
,
177 IN PBYTE pbyDesireSSID
,
178 IN CARD_PHY_TYPE ePhyType
181 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
182 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
183 PBYTE pbyBSSID
= NULL
;
184 PWLAN_IE_SSID pSSID
= NULL
;
185 PKnownBSS pCurrBSS
= NULL
;
186 PKnownBSS pSelect
= NULL
;
187 BYTE ZeroBSSID
[WLAN_BSSID_LEN
]={0x00,0x00,0x00,0x00,0x00,0x00};
189 UINT jj
= 0; //DavidWang
190 if (pbyDesireBSSID
!= NULL
) {
191 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"BSSpSearchBSSList BSSID[%02X %02X %02X-%02X %02X %02X]\n",
192 *pbyDesireBSSID
,*(pbyDesireBSSID
+1),*(pbyDesireBSSID
+2),
193 *(pbyDesireBSSID
+3),*(pbyDesireBSSID
+4),*(pbyDesireBSSID
+5));
194 if ((!IS_BROADCAST_ADDRESS(pbyDesireBSSID
)) &&
195 (memcmp(pbyDesireBSSID
, ZeroBSSID
, 6)!= 0)){
196 pbyBSSID
= pbyDesireBSSID
;
199 if (pbyDesireSSID
!= NULL
) {
200 if (((PWLAN_IE_SSID
)pbyDesireSSID
)->len
!= 0) {
201 pSSID
= (PWLAN_IE_SSID
) pbyDesireSSID
;
205 if ((pbyBSSID
!= NULL
)&&(pDevice
->bRoaming
== FALSE
)) {
207 for (ii
= 0; ii
<MAX_BSS_NUM
; ii
++) {
208 pCurrBSS
= &(pMgmt
->sBSSList
[ii
]);
210 //2008-0718-01<Add>by MikeLiu
211 pCurrBSS
->bSelected
= FALSE
;
213 if ((pCurrBSS
->bActive
) &&
214 (pCurrBSS
->bSelected
== FALSE
)) {
215 if (IS_ETH_ADDRESS_EQUAL(pCurrBSS
->abyBSSID
, pbyBSSID
)) {
218 if (MEMEqualMemory(pSSID
->abySSID
,
219 ((PWLAN_IE_SSID
)pCurrBSS
->abySSID
)->abySSID
,
221 if ((pMgmt
->eConfigMode
== WMAC_CONFIG_AUTO
) ||
222 ((pMgmt
->eConfigMode
== WMAC_CONFIG_IBSS_STA
) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS
->wCapInfo
)) ||
223 ((pMgmt
->eConfigMode
== WMAC_CONFIG_ESS_STA
) && WLAN_GET_CAP_INFO_ESS(pCurrBSS
->wCapInfo
))
225 pCurrBSS
->bSelected
= TRUE
;
230 if ((pMgmt
->eConfigMode
== WMAC_CONFIG_AUTO
) ||
231 ((pMgmt
->eConfigMode
== WMAC_CONFIG_IBSS_STA
) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS
->wCapInfo
)) ||
232 ((pMgmt
->eConfigMode
== WMAC_CONFIG_ESS_STA
) && WLAN_GET_CAP_INFO_ESS(pCurrBSS
->wCapInfo
))
234 pCurrBSS
->bSelected
= TRUE
;
243 for (ii
= 0; ii
<MAX_BSS_NUM
; ii
++) {
244 pCurrBSS
= &(pMgmt
->sBSSList
[ii
]);
246 //2007-0721-01<Mark>by MikeLiu
247 // if ((pCurrBSS->bActive) &&
248 // (pCurrBSS->bSelected == FALSE)) {
250 //2007-0721-01<Add>by MikeLiu
251 pCurrBSS
->bSelected
= FALSE
;
252 if (pCurrBSS
->bActive
) {
256 if (!MEMEqualMemory(pSSID
->abySSID
,
257 ((PWLAN_IE_SSID
)pCurrBSS
->abySSID
)->abySSID
,
259 (pSSID
->len
!= ((PWLAN_IE_SSID
)pCurrBSS
->abySSID
)->len
)) {
260 // SSID not match skip this BSS
264 if (((pMgmt
->eConfigMode
== WMAC_CONFIG_IBSS_STA
) && WLAN_GET_CAP_INFO_ESS(pCurrBSS
->wCapInfo
)) ||
265 ((pMgmt
->eConfigMode
== WMAC_CONFIG_ESS_STA
) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS
->wCapInfo
))
267 // Type not match skip this BSS
268 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"BSS type mismatch.... Config[%d] BSS[0x%04x]\n", pMgmt
->eConfigMode
, pCurrBSS
->wCapInfo
);
272 if (ePhyType
!= PHY_TYPE_AUTO
) {
273 if (((ePhyType
== PHY_TYPE_11A
) && (PHY_TYPE_11A
!= pCurrBSS
->eNetworkTypeInUse
)) ||
274 ((ePhyType
!= PHY_TYPE_11A
) && (PHY_TYPE_11A
== pCurrBSS
->eNetworkTypeInUse
))) {
275 // PhyType not match skip this BSS
276 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Physical type mismatch.... ePhyType[%d] BSS[%d]\n", ePhyType
, pCurrBSS
->eNetworkTypeInUse
);
281 if (pMgmt->eAuthenMode < WMAC_AUTH_WPA) {
282 if (pCurrBSS->bWPAValid == TRUE) {
283 // WPA AP will reject connection of station without WPA enable.
286 } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
287 (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) {
288 if (pCurrBSS->bWPAValid == FALSE) {
289 // station with WPA enable can't join NonWPA AP.
292 } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
293 (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) {
294 if (pCurrBSS->bWPA2Valid == FALSE) {
295 // station with WPA2 enable can't join NonWPA2 AP.
301 pMgmt
->pSameBSS
[jj
].uChannel
= pCurrBSS
->uChannel
;
302 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"BSSpSearchBSSList pSelect1[%02X %02X %02X-%02X %02X %02X]\n",*pCurrBSS
->abyBSSID
,*(pCurrBSS
->abyBSSID
+1),*(pCurrBSS
->abyBSSID
+2),*(pCurrBSS
->abyBSSID
+3),*(pCurrBSS
->abyBSSID
+4),*(pCurrBSS
->abyBSSID
+5));
306 if (pSelect
== NULL
) {
309 // compare RSSI, select signal strong one
310 if (pCurrBSS
->uRSSI
< pSelect
->uRSSI
) {
317 pDevice
->bSameBSSMaxNum
= jj
;
319 if (pSelect
!= NULL
) {
320 pSelect
->bSelected
= TRUE
;
321 if (pDevice
->bRoaming
== FALSE
) {
322 // Einsn Add @20070907
323 ZERO_MEMORY(pbyDesireSSID
, WLAN_IEHDR_LEN
+ WLAN_SSID_MAXLEN
+ 1);
324 MEMvCopy(pbyDesireSSID
,pCurrBSS
->abySSID
,WLAN_IEHDR_LEN
+ WLAN_SSID_MAXLEN
+ 1) ;
337 * Routine Description:
348 IN HANDLE hDeviceContext
,
349 IN BOOL bKeepCurrBSSID
352 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
353 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
356 for (ii
= 0; ii
< MAX_BSS_NUM
; ii
++) {
357 if (bKeepCurrBSSID
) {
358 if (pMgmt
->sBSSList
[ii
].bActive
&&
359 IS_ETH_ADDRESS_EQUAL(pMgmt
->sBSSList
[ii
].abyBSSID
, pMgmt
->abyCurrBSSID
)) {
360 //mike mark: there are two same BSSID in list if that AP is in hidden ssid mode,one 's SSID is null,
361 // but other's is obvious, so if it acssociate with your STA exactly,you must keep two
363 // bKeepCurrBSSID = FALSE;
368 if ((pMgmt->sBSSList[ii].bActive) && (pMgmt->sBSSList[ii].uClearCount < BSS_CLEAR_COUNT)) {
369 pMgmt->sBSSList[ii].uClearCount ++;
373 pMgmt
->sBSSList
[ii
].bActive
= FALSE
;
374 memset(&pMgmt
->sBSSList
[ii
], 0, sizeof(KnownBSS
));
376 BSSvClearAnyBSSJoinRecord(pDevice
);
385 * Routine Description:
386 * search BSS list by BSSID & SSID if matched
394 IN HANDLE hDeviceContext
,
396 IN PWLAN_IE_SSID pSSID
399 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
400 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
401 PKnownBSS pBSSList
= NULL
;
404 for (ii
= 0; ii
< MAX_BSS_NUM
; ii
++) {
405 pBSSList
= &(pMgmt
->sBSSList
[ii
]);
406 if (pBSSList
->bActive
) {
407 if (IS_ETH_ADDRESS_EQUAL(pBSSList
->abyBSSID
, abyBSSID
)) {
408 if (pSSID
->len
== ((PWLAN_IE_SSID
)pBSSList
->abySSID
)->len
){
409 if (memcmp(pSSID
->abySSID
,
410 ((PWLAN_IE_SSID
)pBSSList
->abySSID
)->abySSID
,
425 * Routine Description:
426 * Insert a BSS set into known BSS list
434 BSSbInsertToBSSList (
435 IN HANDLE hDeviceContext
,
436 IN PBYTE abyBSSIDAddr
,
437 IN QWORD qwTimestamp
,
438 IN WORD wBeaconInterval
,
440 IN BYTE byCurrChannel
,
441 IN PWLAN_IE_SSID pSSID
,
442 IN PWLAN_IE_SUPP_RATES pSuppRates
,
443 IN PWLAN_IE_SUPP_RATES pExtSuppRates
,
445 IN PWLAN_IE_RSN pRSN
,
446 IN PWLAN_IE_RSN_EXT pRSNWPA
,
447 IN PWLAN_IE_COUNTRY pIE_Country
,
448 IN PWLAN_IE_QUIET pIE_Quiet
,
451 IN HANDLE pRxPacketContext
455 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
456 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
457 PSRxMgmtPacket pRxPacket
= (PSRxMgmtPacket
)pRxPacketContext
;
458 PKnownBSS pBSSList
= NULL
;
460 BOOL bParsingQuiet
= FALSE
;
464 pBSSList
= (PKnownBSS
)&(pMgmt
->sBSSList
[0]);
466 for (ii
= 0; ii
< MAX_BSS_NUM
; ii
++) {
467 pBSSList
= (PKnownBSS
)&(pMgmt
->sBSSList
[ii
]);
468 if (!pBSSList
->bActive
)
472 if (ii
== MAX_BSS_NUM
){
473 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Get free KnowBSS node failed.\n");
477 pBSSList
->bActive
= TRUE
;
478 memcpy( pBSSList
->abyBSSID
, abyBSSIDAddr
, WLAN_BSSID_LEN
);
479 HIDWORD(pBSSList
->qwBSSTimestamp
) = cpu_to_le32(HIDWORD(qwTimestamp
));
480 LODWORD(pBSSList
->qwBSSTimestamp
) = cpu_to_le32(LODWORD(qwTimestamp
));
481 pBSSList
->wBeaconInterval
= cpu_to_le16(wBeaconInterval
);
482 pBSSList
->wCapInfo
= cpu_to_le16(wCapInfo
);
483 pBSSList
->uClearCount
= 0;
485 if (pSSID
->len
> WLAN_SSID_MAXLEN
)
486 pSSID
->len
= WLAN_SSID_MAXLEN
;
487 memcpy( pBSSList
->abySSID
, pSSID
, pSSID
->len
+ WLAN_IEHDR_LEN
);
489 pBSSList
->uChannel
= byCurrChannel
;
491 if (pSuppRates
->len
> WLAN_RATES_MAXLEN
)
492 pSuppRates
->len
= WLAN_RATES_MAXLEN
;
493 memcpy( pBSSList
->abySuppRates
, pSuppRates
, pSuppRates
->len
+ WLAN_IEHDR_LEN
);
495 if (pExtSuppRates
!= NULL
) {
496 if (pExtSuppRates
->len
> WLAN_RATES_MAXLEN
)
497 pExtSuppRates
->len
= WLAN_RATES_MAXLEN
;
498 memcpy(pBSSList
->abyExtSuppRates
, pExtSuppRates
, pExtSuppRates
->len
+ WLAN_IEHDR_LEN
);
499 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"BSSbInsertToBSSList: pExtSuppRates->len = %d\n", pExtSuppRates
->len
);
502 memset(pBSSList
->abyExtSuppRates
, 0, WLAN_IEHDR_LEN
+ WLAN_RATES_MAXLEN
+ 1);
504 pBSSList
->sERP
.byERP
= psERP
->byERP
;
505 pBSSList
->sERP
.bERPExist
= psERP
->bERPExist
;
507 // Check if BSS is 802.11a/b/g
508 if (pBSSList
->uChannel
> CB_MAX_CHANNEL_24G
) {
509 pBSSList
->eNetworkTypeInUse
= PHY_TYPE_11A
;
511 if (pBSSList
->sERP
.bERPExist
== TRUE
) {
512 pBSSList
->eNetworkTypeInUse
= PHY_TYPE_11G
;
514 pBSSList
->eNetworkTypeInUse
= PHY_TYPE_11B
;
518 pBSSList
->byRxRate
= pRxPacket
->byRxRate
;
519 pBSSList
->qwLocalTSF
= pRxPacket
->qwLocalTSF
;
520 pBSSList
->uRSSI
= pRxPacket
->uRSSI
;
521 pBSSList
->bySQ
= pRxPacket
->bySQ
;
523 if ((pMgmt
->eCurrMode
== WMAC_MODE_ESS_STA
) &&
524 (pMgmt
->eCurrState
== WMAC_STATE_ASSOC
)) {
526 if (pBSSList
== pMgmt
->pCurrBSS
) {
527 bParsingQuiet
= TRUE
;
531 WPA_ClearRSN(pBSSList
);
533 if (pRSNWPA
!= NULL
) {
534 UINT uLen
= pRSNWPA
->len
+ 2;
536 if (uLen
<= (uIELength
- (UINT
)(ULONG_PTR
)((PBYTE
)pRSNWPA
- pbyIEs
))) {
537 pBSSList
->wWPALen
= uLen
;
538 memcpy(pBSSList
->byWPAIE
, pRSNWPA
, uLen
);
539 WPA_ParseRSN(pBSSList
, pRSNWPA
);
543 WPA2_ClearRSN(pBSSList
);
546 UINT uLen
= pRSN
->len
+ 2;
547 if (uLen
<= (uIELength
- (UINT
)(ULONG_PTR
)((PBYTE
)pRSN
- pbyIEs
))) {
548 pBSSList
->wRSNLen
= uLen
;
549 memcpy(pBSSList
->byRSNIE
, pRSN
, uLen
);
550 WPA2vParseRSN(pBSSList
, pRSN
);
554 if ((pMgmt
->eAuthenMode
== WMAC_AUTH_WPA2
) || (pBSSList
->bWPA2Valid
== TRUE
)) {
556 PSKeyItem pTransmitKey
= NULL
;
557 BOOL bIs802_1x
= FALSE
;
559 for (ii
= 0; ii
< pBSSList
->wAKMSSAuthCount
; ii
++) {
560 if (pBSSList
->abyAKMSSAuthType
[ii
] == WLAN_11i_AKMSS_802_1X
) {
565 if ((bIs802_1x
== TRUE
) && (pSSID
->len
== ((PWLAN_IE_SSID
)pMgmt
->abyDesireSSID
)->len
) &&
566 (MEMEqualMemory(pSSID
->abySSID
, ((PWLAN_IE_SSID
)pMgmt
->abyDesireSSID
)->abySSID
, pSSID
->len
))) {
568 bAdd_PMKID_Candidate((HANDLE
)pDevice
, pBSSList
->abyBSSID
, &pBSSList
->sRSNCapObj
);
570 if ((pDevice
->bLinkPass
== TRUE
) && (pMgmt
->eCurrState
== WMAC_STATE_ASSOC
)) {
571 if ((KeybGetTransmitKey(&(pDevice
->sKey
), pDevice
->abyBSSID
, PAIRWISE_KEY
, &pTransmitKey
) == TRUE
) ||
572 (KeybGetTransmitKey(&(pDevice
->sKey
), pDevice
->abyBSSID
, GROUP_KEY
, &pTransmitKey
) == TRUE
)) {
573 pDevice
->gsPMKIDCandidate
.StatusType
= Ndis802_11StatusType_PMKID_CandidateList
;
574 pDevice
->gsPMKIDCandidate
.Version
= 1;
582 if (pDevice
->bUpdateBBVGA
) {
583 // Moniter if RSSI is too strong.
584 pBSSList
->byRSSIStatCnt
= 0;
585 RFvRSSITodBm(pDevice
, (BYTE
)(pRxPacket
->uRSSI
), &pBSSList
->ldBmMAX
);
586 pBSSList
->ldBmAverage
[0] = pBSSList
->ldBmMAX
;
587 pBSSList
->ldBmAverRange
= pBSSList
->ldBmMAX
;
588 for (ii
= 1; ii
< RSSI_STAT_COUNT
; ii
++)
589 pBSSList
->ldBmAverage
[ii
] = 0;
593 if ((pIE_Country != NULL) &&
594 (pMgmt->b11hEnable == TRUE)) {
595 CARDvSetCountryInfo(pMgmt->pAdapter,
596 pBSSList->eNetworkTypeInUse,
600 if ((bParsingQuiet == TRUE) && (pIE_Quiet != NULL)) {
601 if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) &&
602 (((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) {
604 if (pQuiet == NULL) {
605 pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
606 CARDbSetQuiet( pMgmt->pAdapter,
608 pQuiet->byQuietCount,
609 pQuiet->byQuietPeriod,
610 *((PWORD)pQuiet->abyQuietDuration),
611 *((PWORD)pQuiet->abyQuietOffset)
614 pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;
615 CARDbSetQuiet( pMgmt->pAdapter,
617 pQuiet->byQuietCount,
618 pQuiet->byQuietPeriod,
619 *((PWORD)pQuiet->abyQuietDuration),
620 *((PWORD)pQuiet->abyQuietOffset)
626 if ((bParsingQuiet == TRUE) &&
628 CARDbStartQuiet(pMgmt->pAdapter);
632 pBSSList
->uIELength
= uIELength
;
633 if (pBSSList
->uIELength
> WLAN_BEACON_FR_MAXLEN
)
634 pBSSList
->uIELength
= WLAN_BEACON_FR_MAXLEN
;
635 MEMvCopy(pBSSList
->abyIEs
, pbyIEs
, pBSSList
->uIELength
);
643 * Routine Description:
644 * Update BSS set in known BSS list
650 // TODO: input structure modify
653 BSSbUpdateToBSSList (
654 IN HANDLE hDeviceContext
,
655 IN QWORD qwTimestamp
,
656 IN WORD wBeaconInterval
,
658 IN BYTE byCurrChannel
,
660 IN PWLAN_IE_SSID pSSID
,
661 IN PWLAN_IE_SUPP_RATES pSuppRates
,
662 IN PWLAN_IE_SUPP_RATES pExtSuppRates
,
664 IN PWLAN_IE_RSN pRSN
,
665 IN PWLAN_IE_RSN_EXT pRSNWPA
,
666 IN PWLAN_IE_COUNTRY pIE_Country
,
667 IN PWLAN_IE_QUIET pIE_Quiet
,
668 IN PKnownBSS pBSSList
,
671 IN HANDLE pRxPacketContext
675 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
676 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
677 PSRxMgmtPacket pRxPacket
= (PSRxMgmtPacket
)pRxPacketContext
;
679 BOOL bParsingQuiet
= FALSE
;
680 // BYTE abyTmpSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1];
683 if (pBSSList
== NULL
)
687 HIDWORD(pBSSList
->qwBSSTimestamp
) = cpu_to_le32(HIDWORD(qwTimestamp
));
688 LODWORD(pBSSList
->qwBSSTimestamp
) = cpu_to_le32(LODWORD(qwTimestamp
));
689 pBSSList
->wBeaconInterval
= cpu_to_le16(wBeaconInterval
);
690 pBSSList
->wCapInfo
= cpu_to_le16(wCapInfo
);
691 pBSSList
->uClearCount
= 0;
692 pBSSList
->uChannel
= byCurrChannel
;
693 // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSbUpdateToBSSList: pBSSList->uChannel: %d\n", pBSSList->uChannel);
695 if (pSSID
->len
> WLAN_SSID_MAXLEN
)
696 pSSID
->len
= WLAN_SSID_MAXLEN
;
698 if ((pSSID
->len
!= 0) && (pSSID
->abySSID
[0] != 0))
699 memcpy(pBSSList
->abySSID
, pSSID
, pSSID
->len
+ WLAN_IEHDR_LEN
);
700 memcpy(pBSSList
->abySuppRates
, pSuppRates
,pSuppRates
->len
+ WLAN_IEHDR_LEN
);
702 if (pExtSuppRates
!= NULL
) {
703 memcpy(pBSSList
->abyExtSuppRates
, pExtSuppRates
,pExtSuppRates
->len
+ WLAN_IEHDR_LEN
);
705 memset(pBSSList
->abyExtSuppRates
, 0, WLAN_IEHDR_LEN
+ WLAN_RATES_MAXLEN
+ 1);
707 pBSSList
->sERP
.byERP
= psERP
->byERP
;
708 pBSSList
->sERP
.bERPExist
= psERP
->bERPExist
;
710 // Check if BSS is 802.11a/b/g
711 if (pBSSList
->uChannel
> CB_MAX_CHANNEL_24G
) {
712 pBSSList
->eNetworkTypeInUse
= PHY_TYPE_11A
;
714 if (pBSSList
->sERP
.bERPExist
== TRUE
) {
715 pBSSList
->eNetworkTypeInUse
= PHY_TYPE_11G
;
717 pBSSList
->eNetworkTypeInUse
= PHY_TYPE_11B
;
721 pBSSList
->byRxRate
= pRxPacket
->byRxRate
;
722 pBSSList
->qwLocalTSF
= pRxPacket
->qwLocalTSF
;
724 pBSSList
->uRSSI
= pRxPacket
->uRSSI
;
725 pBSSList
->bySQ
= pRxPacket
->bySQ
;
727 if ((pMgmt
->eCurrMode
== WMAC_MODE_ESS_STA
) &&
728 (pMgmt
->eCurrState
== WMAC_STATE_ASSOC
)) {
730 if (pBSSList
== pMgmt
->pCurrBSS
) {
731 bParsingQuiet
= TRUE
;
735 WPA_ClearRSN(pBSSList
); //mike update
737 if (pRSNWPA
!= NULL
) {
738 UINT uLen
= pRSNWPA
->len
+ 2;
739 if (uLen
<= (uIELength
- (UINT
)(ULONG_PTR
)((PBYTE
)pRSNWPA
- pbyIEs
))) {
740 pBSSList
->wWPALen
= uLen
;
741 memcpy(pBSSList
->byWPAIE
, pRSNWPA
, uLen
);
742 WPA_ParseRSN(pBSSList
, pRSNWPA
);
746 WPA2_ClearRSN(pBSSList
); //mike update
749 UINT uLen
= pRSN
->len
+ 2;
750 if (uLen
<= (uIELength
- (UINT
)(ULONG_PTR
)((PBYTE
)pRSN
- pbyIEs
))) {
751 pBSSList
->wRSNLen
= uLen
;
752 memcpy(pBSSList
->byRSNIE
, pRSN
, uLen
);
753 WPA2vParseRSN(pBSSList
, pRSN
);
757 if (pRxPacket
->uRSSI
!= 0) {
758 RFvRSSITodBm(pDevice
, (BYTE
)(pRxPacket
->uRSSI
), &ldBm
);
759 // Moniter if RSSI is too strong.
760 pBSSList
->byRSSIStatCnt
++;
761 pBSSList
->byRSSIStatCnt
%= RSSI_STAT_COUNT
;
762 pBSSList
->ldBmAverage
[pBSSList
->byRSSIStatCnt
] = ldBm
;
764 for(ii
=0, jj
=0;ii
<RSSI_STAT_COUNT
;ii
++) {
765 if (pBSSList
->ldBmAverage
[ii
] != 0) {
766 pBSSList
->ldBmMAX
= max(pBSSList
->ldBmAverage
[ii
], ldBm
);
767 ldBmSum
+= pBSSList
->ldBmAverage
[ii
];
771 pBSSList
->ldBmAverRange
= ldBmSum
/jj
;
774 pBSSList
->uIELength
= uIELength
;
775 if (pBSSList
->uIELength
> WLAN_BEACON_FR_MAXLEN
)
776 pBSSList
->uIELength
= WLAN_BEACON_FR_MAXLEN
;
777 memcpy(pBSSList
->abyIEs
, pbyIEs
, pBSSList
->uIELength
);
779 //mike add: if the AP in this pBSSList is hidden ssid and we can find two of them,
780 // you need upgrade the other related pBSSList of which ssid is obvious,
781 // for these two AP is the same one!!!!
782 /********judge by:BSSID is the same,but ssid is different!*****************/
784 for (ii
= 0; ii
< MAX_BSS_NUM
; ii
++) {
785 if (IS_ETH_ADDRESS_EQUAL(pMgmt
->sBSSList
[ii
].abyBSSID
, pBSSList
->abyBSSID
)) { //BSSID is the same!
786 if (memcmp(((PWLAN_IE_SSID
)pMgmt
->sBSSList
[ii
].abySSID
)->abySSID
, //ssid is different??
787 ((PWLAN_IE_SSID
)pBSSList
->abySSID
)->abySSID
,
788 ((PWLAN_IE_SSID
)pBSSList
->abySSID
)->len
) != 0) {
790 memset(abyTmpSSID
,0,sizeof(abyTmpSSID
));
791 memcpy(abyTmpSSID
,pMgmt
->sBSSList
[ii
].abySSID
,sizeof(abyTmpSSID
));
792 //upgrade the other one pBSSList
793 memcpy(&(pMgmt
->sBSSList
[ii
]),pBSSList
,sizeof(KnownBSS
));
795 memcpy(pMgmt
->sBSSList
[ii
].abySSID
,abyTmpSSID
,sizeof(abyTmpSSID
));
810 * Routine Description:
811 * Search Node DB table to find the index of matched DstAddr
820 IN HANDLE hDeviceContext
,
822 OUT PUINT puNodeIndex
825 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
826 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
829 // Index = 0 reserved for AP Node
830 for (ii
= 1; ii
< (MAX_NODE_NUM
+ 1); ii
++) {
831 if (pMgmt
->sNodeDBTable
[ii
].bActive
) {
832 if (IS_ETH_ADDRESS_EQUAL(abyDstAddr
, pMgmt
->sNodeDBTable
[ii
].abyMACAddr
)) {
846 * Routine Description:
847 * Find an empty node and allocated; if no empty found,
848 * instand used of most inactive one.
856 IN HANDLE hDeviceContext
,
857 OUT PUINT puNodeIndex
861 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
862 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
864 UINT BigestCount
= 0;
867 // Index = 0 reserved for AP Node (In STA mode)
868 // Index = 0 reserved for Broadcast/MultiCast (In AP mode)
870 for (ii
= 1; ii
< (MAX_NODE_NUM
+ 1); ii
++) {
871 if (pMgmt
->sNodeDBTable
[ii
].bActive
) {
872 if (pMgmt
->sNodeDBTable
[ii
].uInActiveCount
> BigestCount
) {
873 BigestCount
= pMgmt
->sNodeDBTable
[ii
].uInActiveCount
;
882 // if not found replace uInActiveCount is largest one.
883 if ( ii
== (MAX_NODE_NUM
+ 1)) {
884 *puNodeIndex
= SelectIndex
;
885 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Replace inactive node = %d\n", SelectIndex
);
887 if (pMgmt
->sNodeDBTable
[*puNodeIndex
].sTxPSQueue
.next
!= NULL
) {
888 while ((skb
= skb_dequeue(&pMgmt
->sNodeDBTable
[*puNodeIndex
].sTxPSQueue
)) != NULL
)
896 memset(&pMgmt
->sNodeDBTable
[*puNodeIndex
], 0, sizeof(KnownNodeDB
));
897 pMgmt
->sNodeDBTable
[*puNodeIndex
].bActive
= TRUE
;
898 pMgmt
->sNodeDBTable
[*puNodeIndex
].uRatePollTimeout
= FALLBACK_POLL_SECOND
;
899 // for AP mode PS queue
900 skb_queue_head_init(&pMgmt
->sNodeDBTable
[*puNodeIndex
].sTxPSQueue
);
901 pMgmt
->sNodeDBTable
[*puNodeIndex
].byAuthSequence
= 0;
902 pMgmt
->sNodeDBTable
[*puNodeIndex
].wEnQueueCnt
= 0;
903 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Create node index = %d\n", ii
);
911 * Routine Description:
912 * Remove Node by NodeIndex
921 IN HANDLE hDeviceContext
,
926 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
927 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
928 BYTE byMask
[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
932 while ((skb
= skb_dequeue(&pMgmt
->sNodeDBTable
[uNodeIndex
].sTxPSQueue
)) != NULL
)
935 memset(&pMgmt
->sNodeDBTable
[uNodeIndex
], 0, sizeof(KnownNodeDB
));
937 pMgmt
->abyPSTxMap
[pMgmt
->sNodeDBTable
[uNodeIndex
].wAID
>> 3] &= ~byMask
[pMgmt
->sNodeDBTable
[uNodeIndex
].wAID
& 7];
943 * Routine Description:
944 * Update AP Node content in Index 0 of KnownNodeDB
954 IN HANDLE hDeviceContext
,
956 IN PWLAN_IE_SUPP_RATES pSuppRates
,
957 IN PWLAN_IE_SUPP_RATES pExtSuppRates
960 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
961 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
962 UINT uRateLen
= WLAN_RATES_MAXLEN
;
964 memset(&pMgmt
->sNodeDBTable
[0], 0, sizeof(KnownNodeDB
));
966 pMgmt
->sNodeDBTable
[0].bActive
= TRUE
;
967 if (pDevice
->byBBType
== BB_TYPE_11B
) {
968 uRateLen
= WLAN_RATES_MAXLEN_11B
;
970 pMgmt
->abyCurrSuppRates
[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES
)pSuppRates
,
971 (PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
,
973 pMgmt
->abyCurrExtSuppRates
[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES
)pExtSuppRates
,
974 (PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
,
976 RATEvParseMaxRate((PVOID
) pDevice
,
977 (PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
,
978 (PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
,
980 &(pMgmt
->sNodeDBTable
[0].wMaxBasicRate
),
981 &(pMgmt
->sNodeDBTable
[0].wMaxSuppRate
),
982 &(pMgmt
->sNodeDBTable
[0].wSuppRate
),
983 &(pMgmt
->sNodeDBTable
[0].byTopCCKBasicRate
),
984 &(pMgmt
->sNodeDBTable
[0].byTopOFDMBasicRate
)
986 memcpy(pMgmt
->sNodeDBTable
[0].abyMACAddr
, pMgmt
->abyCurrBSSID
, WLAN_ADDR_LEN
);
987 pMgmt
->sNodeDBTable
[0].wTxDataRate
= pMgmt
->sNodeDBTable
[0].wMaxSuppRate
;
988 pMgmt
->sNodeDBTable
[0].bShortPreamble
= WLAN_GET_CAP_INFO_SHORTPREAMBLE(*pwCapInfo
);
989 pMgmt
->sNodeDBTable
[0].uRatePollTimeout
= FALLBACK_POLL_SECOND
;
990 // Auto rate fallback function initiation.
991 // RATEbInit(pDevice);
992 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"pMgmt->sNodeDBTable[0].wTxDataRate = %d \n", pMgmt
->sNodeDBTable
[0].wTxDataRate
);
1002 * Routine Description:
1003 * Add Multicast Node content in Index 0 of KnownNodeDB
1013 BSSvAddMulticastNode(
1014 IN HANDLE hDeviceContext
1017 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
1018 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1020 if (!pDevice
->bEnableHostWEP
)
1021 memset(&pMgmt
->sNodeDBTable
[0], 0, sizeof(KnownNodeDB
));
1022 memset(pMgmt
->sNodeDBTable
[0].abyMACAddr
, 0xff, WLAN_ADDR_LEN
);
1023 pMgmt
->sNodeDBTable
[0].bActive
= TRUE
;
1024 pMgmt
->sNodeDBTable
[0].bPSEnable
= FALSE
;
1025 skb_queue_head_init(&pMgmt
->sNodeDBTable
[0].sTxPSQueue
);
1026 RATEvParseMaxRate((PVOID
) pDevice
,
1027 (PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrSuppRates
,
1028 (PWLAN_IE_SUPP_RATES
)pMgmt
->abyCurrExtSuppRates
,
1030 &(pMgmt
->sNodeDBTable
[0].wMaxBasicRate
),
1031 &(pMgmt
->sNodeDBTable
[0].wMaxSuppRate
),
1032 &(pMgmt
->sNodeDBTable
[0].wSuppRate
),
1033 &(pMgmt
->sNodeDBTable
[0].byTopCCKBasicRate
),
1034 &(pMgmt
->sNodeDBTable
[0].byTopOFDMBasicRate
)
1036 pMgmt
->sNodeDBTable
[0].wTxDataRate
= pMgmt
->sNodeDBTable
[0].wMaxBasicRate
;
1037 pMgmt
->sNodeDBTable
[0].uRatePollTimeout
= FALLBACK_POLL_SECOND
;
1047 * Routine Description:
1050 * Second call back function to update Node DB info & AP link status
1061 IN HANDLE hDeviceContext
1064 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
1065 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1067 PWLAN_IE_SSID pItemSSID
, pCurrSSID
;
1068 UINT uSleepySTACnt
= 0;
1069 UINT uNonShortSlotSTACnt
= 0;
1070 UINT uLongPreambleSTACnt
= 0;
1071 viawget_wpa_header
*wpahdr
; //DavidWang
1073 spin_lock_irq(&pDevice
->lock
);
1075 pDevice
->uAssocCount
= 0;
1077 //Power Saving Mode Tx Burst
1078 if ( pDevice
->bEnablePSMode
== TRUE
) {
1079 pDevice
->ulPSModeWaitTx
++;
1080 if ( pDevice
->ulPSModeWaitTx
>= 2 ) {
1081 pDevice
->ulPSModeWaitTx
= 0;
1082 pDevice
->bPSModeTxBurst
= FALSE
;
1086 pDevice
->byERPFlag
&=
1087 ~(WLAN_SET_ERP_BARKER_MODE(1) | WLAN_SET_ERP_NONERP_PRESENT(1));
1089 if (pDevice
->wUseProtectCntDown
> 0) {
1090 pDevice
->wUseProtectCntDown
--;
1093 // disable protect mode
1094 pDevice
->byERPFlag
&= ~(WLAN_SET_ERP_USE_PROTECTION(1));
1097 if(pDevice
->byReAssocCount
> 0) {
1098 pDevice
->byReAssocCount
++;
1099 if((pDevice
->byReAssocCount
> 10) && (pDevice
->bLinkPass
!= TRUE
)) { //10 sec timeout
1100 printk("Re-association timeout!!!\n");
1101 pDevice
->byReAssocCount
= 0;
1102 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1103 // if(pDevice->bWPASuppWextEnabled == TRUE)
1105 union iwreq_data wrqu
;
1106 memset(&wrqu
, 0, sizeof (wrqu
));
1107 wrqu
.ap_addr
.sa_family
= ARPHRD_ETHER
;
1108 PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
1109 wireless_send_event(pDevice
->dev
, SIOCGIWAP
, &wrqu
, NULL
);
1113 else if(pDevice
->bLinkPass
== TRUE
)
1114 pDevice
->byReAssocCount
= 0;
1118 if((pMgmt
->eCurrState
!=WMAC_STATE_ASSOC
) &&
1119 (pMgmt
->eLastState
==WMAC_STATE_ASSOC
))
1121 union iwreq_data wrqu
;
1122 memset(&wrqu
, 0, sizeof(wrqu
));
1123 wrqu
.data
.flags
= RT_DISCONNECTED_EVENT_FLAG
;
1124 wireless_send_event(pDevice
->dev
, IWEVCUSTOM
, &wrqu
, NULL
);
1126 pMgmt
->eLastState
= pMgmt
->eCurrState
;
1129 #ifdef Calcu_LinkQual
1130 s_uCalculateLinkQual((HANDLE
)pDevice
);
1133 for (ii
= 0; ii
< (MAX_NODE_NUM
+ 1); ii
++) {
1135 if (pMgmt
->sNodeDBTable
[ii
].bActive
) {
1136 // Increase in-activity counter
1137 pMgmt
->sNodeDBTable
[ii
].uInActiveCount
++;
1140 if (pMgmt
->sNodeDBTable
[ii
].uInActiveCount
> MAX_INACTIVE_COUNT
) {
1141 BSSvRemoveOneNode(pDevice
, ii
);
1142 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
1143 "Inactive timeout [%d] sec, STA index = [%d] remove\n", MAX_INACTIVE_COUNT
, ii
);
1147 if (pMgmt
->sNodeDBTable
[ii
].eNodeState
>= NODE_ASSOC
) {
1149 pDevice
->uAssocCount
++;
1151 // check if Non ERP exist
1152 if (pMgmt
->sNodeDBTable
[ii
].uInActiveCount
< ERP_RECOVER_COUNT
) {
1153 if (!pMgmt
->sNodeDBTable
[ii
].bShortPreamble
) {
1154 pDevice
->byERPFlag
|= WLAN_SET_ERP_BARKER_MODE(1);
1155 uLongPreambleSTACnt
++;
1157 if (!pMgmt
->sNodeDBTable
[ii
].bERPExist
) {
1158 pDevice
->byERPFlag
|= WLAN_SET_ERP_NONERP_PRESENT(1);
1159 pDevice
->byERPFlag
|= WLAN_SET_ERP_USE_PROTECTION(1);
1161 if (!pMgmt
->sNodeDBTable
[ii
].bShortSlotTime
)
1162 uNonShortSlotSTACnt
++;
1166 // check if any STA in PS mode
1167 if (pMgmt
->sNodeDBTable
[ii
].bPSEnable
)
1173 // Rate fallback check
1174 if (!pDevice
->bFixRate
) {
1176 if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (ii == 0))
1177 RATEvTxRateFallBack(pDevice, &(pMgmt->sNodeDBTable[ii]));
1180 // ii = 0 for multicast node (AP & Adhoc)
1181 RATEvTxRateFallBack((PVOID
)pDevice
, &(pMgmt
->sNodeDBTable
[ii
]));
1184 // ii = 0 reserved for unicast AP node (Infra STA)
1185 if (pMgmt
->eCurrMode
== WMAC_MODE_ESS_STA
)
1186 RATEvTxRateFallBack((PVOID
)pDevice
, &(pMgmt
->sNodeDBTable
[ii
]));
1191 // check if pending PS queue
1192 if (pMgmt
->sNodeDBTable
[ii
].wEnQueueCnt
!= 0) {
1193 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Index= %d, Queue = %d pending \n",
1194 ii
, pMgmt
->sNodeDBTable
[ii
].wEnQueueCnt
);
1195 if ((ii
>0) && (pMgmt
->sNodeDBTable
[ii
].wEnQueueCnt
> 15)) {
1196 BSSvRemoveOneNode(pDevice
, ii
);
1197 DBG_PRT(MSG_LEVEL_NOTICE
, KERN_INFO
"Pending many queues PS STA Index = %d remove \n", ii
);
1206 if ((pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
) && (pDevice
->byBBType
== BB_TYPE_11G
)) {
1208 // on/off protect mode
1209 if (WLAN_GET_ERP_USE_PROTECTION(pDevice
->byERPFlag
)) {
1210 if (!pDevice
->bProtectMode
) {
1211 MACvEnableProtectMD(pDevice
);
1212 pDevice
->bProtectMode
= TRUE
;
1216 if (pDevice
->bProtectMode
) {
1217 MACvDisableProtectMD(pDevice
);
1218 pDevice
->bProtectMode
= FALSE
;
1221 // on/off short slot time
1223 if (uNonShortSlotSTACnt
> 0) {
1224 if (pDevice
->bShortSlotTime
) {
1225 pDevice
->bShortSlotTime
= FALSE
;
1226 BBvSetShortSlotTime(pDevice
);
1227 vUpdateIFS((PVOID
)pDevice
);
1231 if (!pDevice
->bShortSlotTime
) {
1232 pDevice
->bShortSlotTime
= TRUE
;
1233 BBvSetShortSlotTime(pDevice
);
1234 vUpdateIFS((PVOID
)pDevice
);
1238 // on/off barker long preamble mode
1240 if (uLongPreambleSTACnt
> 0) {
1241 if (!pDevice
->bBarkerPreambleMd
) {
1242 MACvEnableBarkerPreambleMd(pDevice
);
1243 pDevice
->bBarkerPreambleMd
= TRUE
;
1247 if (pDevice
->bBarkerPreambleMd
) {
1248 MACvDisableBarkerPreambleMd(pDevice
);
1249 pDevice
->bBarkerPreambleMd
= FALSE
;
1256 // Check if any STA in PS mode, enable DTIM multicast deliver
1257 if (pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
) {
1258 if (uSleepySTACnt
> 0)
1259 pMgmt
->sNodeDBTable
[0].bPSEnable
= TRUE
;
1261 pMgmt
->sNodeDBTable
[0].bPSEnable
= FALSE
;
1264 pItemSSID
= (PWLAN_IE_SSID
)pMgmt
->abyDesireSSID
;
1265 pCurrSSID
= (PWLAN_IE_SSID
)pMgmt
->abyCurrSSID
;
1267 if ((pMgmt
->eCurrMode
== WMAC_MODE_STANDBY
) ||
1268 (pMgmt
->eCurrMode
== WMAC_MODE_ESS_STA
)) {
1270 if (pMgmt
->sNodeDBTable
[0].bActive
) { // Assoc with BSS
1271 // DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Callback inactive Count = [%d]\n", pMgmt->sNodeDBTable[0].uInActiveCount);
1273 if (pDevice
->bUpdateBBVGA
) {
1274 // s_vCheckSensitivity((HANDLE) pDevice);
1275 s_vCheckPreEDThreshold((HANDLE
)pDevice
);
1278 if ((pMgmt
->sNodeDBTable
[0].uInActiveCount
>= (LOST_BEACON_COUNT
/2)) &&
1279 (pDevice
->byBBVGACurrent
!= pDevice
->abyBBVGA
[0]) ) {
1280 pDevice
->byBBVGANew
= pDevice
->abyBBVGA
[0];
1281 bScheduleCommand((HANDLE
) pDevice
, WLAN_CMD_CHANGE_BBSENSITIVITY
, NULL
);
1284 if (pMgmt
->sNodeDBTable
[0].uInActiveCount
>= LOST_BEACON_COUNT
) {
1285 pMgmt
->sNodeDBTable
[0].bActive
= FALSE
;
1286 pMgmt
->eCurrMode
= WMAC_MODE_STANDBY
;
1287 pMgmt
->eCurrState
= WMAC_STATE_IDLE
;
1288 netif_stop_queue(pDevice
->dev
);
1289 pDevice
->bLinkPass
= FALSE
;
1290 ControlvMaskByte(pDevice
,MESSAGE_REQUEST_MACREG
,MAC_REG_PAPEDELAY
,LEDSTS_STS
,LEDSTS_SLOW
);
1291 pDevice
->bRoaming
= TRUE
;
1292 pDevice
->bIsRoaming
= FALSE
;
1294 DBG_PRT(MSG_LEVEL_NOTICE
, KERN_INFO
"Lost AP beacon [%d] sec, disconnected !\n", pMgmt
->sNodeDBTable
[0].uInActiveCount
);
1295 //let wpa supplicant know AP may disconnect.//20080717-01,<Add> by James Li
1296 if ((pDevice
->bWPADEVUp
) && (pDevice
->skb
!= NULL
)) {
1297 wpahdr
= (viawget_wpa_header
*)pDevice
->skb
->data
;
1298 wpahdr
->type
= VIAWGET_DISASSOC_MSG
;
1299 wpahdr
->resp_ie_len
= 0;
1300 wpahdr
->req_ie_len
= 0;
1301 skb_put(pDevice
->skb
, sizeof(viawget_wpa_header
));
1302 pDevice
->skb
->dev
= pDevice
->wpadev
;
1303 //2008-4-3 modify by Chester for wpa
1304 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
1305 pDevice
->skb
->mac_header
= pDevice
->skb
->data
;
1307 pDevice
->skb
->mac
.raw
= pDevice
->skb
->data
;
1309 pDevice
->skb
->pkt_type
= PACKET_HOST
;
1310 pDevice
->skb
->protocol
= htons(ETH_P_802_2
);
1311 memset(pDevice
->skb
->cb
, 0, sizeof(pDevice
->skb
->cb
));
1312 netif_rx(pDevice
->skb
);
1313 pDevice
->skb
= dev_alloc_skb((int)pDevice
->rx_buf_sz
);
1315 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1316 // if(pDevice->bWPASuppWextEnabled == TRUE)
1318 union iwreq_data wrqu
;
1319 memset(&wrqu
, 0, sizeof (wrqu
));
1320 wrqu
.ap_addr
.sa_family
= ARPHRD_ETHER
;
1321 PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
1322 wireless_send_event(pDevice
->dev
, SIOCGIWAP
, &wrqu
, NULL
);
1327 else if (pItemSSID
->len
!= 0) {
1329 if ((pDevice
->bEnableRoaming
== TRUE
)&&(!(pMgmt
->Cisco_cckm
))) {
1330 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"bRoaming %d, !\n", pDevice
->bRoaming
);
1331 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"bIsRoaming %d, !\n", pDevice
->bIsRoaming
);
1332 if ((pDevice
->bRoaming
== TRUE
)&&(pDevice
->bIsRoaming
== TRUE
)){
1333 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Fast Roaming ...\n");
1334 BSSvClearBSSList((HANDLE
)pDevice
, pDevice
->bLinkPass
);
1335 bScheduleCommand((HANDLE
) pDevice
, WLAN_CMD_BSSID_SCAN
, pMgmt
->abyDesireSSID
);
1336 bScheduleCommand((HANDLE
) pDevice
, WLAN_CMD_SSID
, pMgmt
->abyDesireSSID
);
1337 pDevice
->uAutoReConnectTime
= 0;
1338 pDevice
->uIsroamingTime
= 0;
1339 pDevice
->bRoaming
= FALSE
;
1341 // if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
1342 wpahdr
= (viawget_wpa_header
*)pDevice
->skb
->data
;
1343 wpahdr
->type
= VIAWGET_CCKM_ROAM_MSG
;
1344 wpahdr
->resp_ie_len
= 0;
1345 wpahdr
->req_ie_len
= 0;
1346 skb_put(pDevice
->skb
, sizeof(viawget_wpa_header
));
1347 pDevice
->skb
->dev
= pDevice
->wpadev
;
1348 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
1349 pDevice
->skb
->mac_header
= pDevice
->skb
->data
;
1351 pDevice
->skb
->mac
.raw
= pDevice
->skb
->data
;
1353 pDevice
->skb
->pkt_type
= PACKET_HOST
;
1354 pDevice
->skb
->protocol
= htons(ETH_P_802_2
);
1355 memset(pDevice
->skb
->cb
, 0, sizeof(pDevice
->skb
->cb
));
1356 netif_rx(pDevice
->skb
);
1357 pDevice
->skb
= dev_alloc_skb((int)pDevice
->rx_buf_sz
);
1361 else if ((pDevice
->bRoaming
== FALSE
)&&(pDevice
->bIsRoaming
== TRUE
)) {
1362 pDevice
->uIsroamingTime
++;
1363 if (pDevice
->uIsroamingTime
>= 20)
1364 pDevice
->bIsRoaming
= FALSE
;
1369 if (pDevice
->uAutoReConnectTime
< 10) {
1370 pDevice
->uAutoReConnectTime
++;
1371 #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
1372 //network manager support need not do Roaming scan???
1373 if(pDevice
->bWPASuppWextEnabled
==TRUE
)
1374 pDevice
->uAutoReConnectTime
= 0;
1378 //mike use old encryption status for wpa reauthen
1379 if(pDevice
->bWPADEVUp
)
1380 pDevice
->eEncryptionStatus
= pDevice
->eOldEncryptionStatus
;
1382 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"Roaming ...\n");
1383 BSSvClearBSSList((HANDLE
)pDevice
, pDevice
->bLinkPass
);
1384 pMgmt
->eScanType
= WMAC_SCAN_ACTIVE
;
1385 bScheduleCommand((HANDLE
) pDevice
, WLAN_CMD_BSSID_SCAN
, pMgmt
->abyDesireSSID
);
1386 bScheduleCommand((HANDLE
) pDevice
, WLAN_CMD_SSID
, pMgmt
->abyDesireSSID
);
1387 pDevice
->uAutoReConnectTime
= 0;
1393 if (pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) {
1394 // if adhoc started which essid is NULL string, rescaning.
1395 if ((pMgmt
->eCurrState
== WMAC_STATE_STARTED
) && (pCurrSSID
->len
== 0)) {
1396 if (pDevice
->uAutoReConnectTime
< 10) {
1397 pDevice
->uAutoReConnectTime
++;
1400 DBG_PRT(MSG_LEVEL_NOTICE
, KERN_INFO
"Adhoc re-scaning ...\n");
1401 pMgmt
->eScanType
= WMAC_SCAN_ACTIVE
;
1402 bScheduleCommand((HANDLE
) pDevice
, WLAN_CMD_BSSID_SCAN
, NULL
);
1403 bScheduleCommand((HANDLE
) pDevice
, WLAN_CMD_SSID
, NULL
);
1404 pDevice
->uAutoReConnectTime
= 0;
1407 if (pMgmt
->eCurrState
== WMAC_STATE_JOINTED
) {
1409 if (pDevice
->bUpdateBBVGA
) {
1410 //s_vCheckSensitivity((HANDLE) pDevice);
1411 s_vCheckPreEDThreshold((HANDLE
)pDevice
);
1413 if (pMgmt
->sNodeDBTable
[0].uInActiveCount
>=ADHOC_LOST_BEACON_COUNT
) {
1414 DBG_PRT(MSG_LEVEL_NOTICE
, KERN_INFO
"Lost other STA beacon [%d] sec, started !\n", pMgmt
->sNodeDBTable
[0].uInActiveCount
);
1415 pMgmt
->sNodeDBTable
[0].uInActiveCount
= 0;
1416 pMgmt
->eCurrState
= WMAC_STATE_STARTED
;
1417 netif_stop_queue(pDevice
->dev
);
1418 pDevice
->bLinkPass
= FALSE
;
1419 ControlvMaskByte(pDevice
,MESSAGE_REQUEST_MACREG
,MAC_REG_PAPEDELAY
,LEDSTS_STS
,LEDSTS_SLOW
);
1424 if (pDevice
->bLinkPass
== TRUE
) {
1425 if (netif_queue_stopped(pDevice
->dev
))
1426 netif_wake_queue(pDevice
->dev
);
1429 spin_unlock_irq(&pDevice
->lock
);
1431 pMgmt
->sTimerSecondCallback
.expires
= RUN_AT(HZ
);
1432 add_timer(&pMgmt
->sTimerSecondCallback
);
1441 * Routine Description:
1444 * Update Tx attemps, Tx failure counter in Node DB
1455 BSSvUpdateNodeTxCounter(
1456 IN HANDLE hDeviceContext
,
1457 IN PSStatCounter pStatistic
,
1462 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
1463 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1464 UINT uNodeIndex
= 0;
1467 WORD wFallBackRate
= RATE_1M
;
1476 byPktNum
= (byPktNO
& 0x0F) >> 4;
1477 byTxRetry
= (byTSR
& 0xF0) >> 4;
1478 wRate
= (WORD
) (byPktNO
& 0xF0) >> 4;
1479 wFIFOCtl
= pStatistic
->abyTxPktInfo
[byPktNum
].wFIFOCtl
;
1480 pbyDestAddr
= (PBYTE
) &( pStatistic
->abyTxPktInfo
[byPktNum
].abyDestAddr
[0]);
1482 if (wFIFOCtl
& FIFOCTL_AUTO_FB_0
) {
1483 byFallBack
= AUTO_FB_0
;
1484 } else if (wFIFOCtl
& FIFOCTL_AUTO_FB_1
) {
1485 byFallBack
= AUTO_FB_1
;
1487 byFallBack
= AUTO_FB_NONE
;
1490 // Only Unicast using support rates
1491 if (wFIFOCtl
& FIFOCTL_NEEDACK
) {
1492 //DBG_PRN_GRP21(("Device %08X, wRate %04X, byTSR %02X\n", hDeviceContext, wRate, byTSR));
1493 if (pMgmt
->eCurrMode
== WMAC_MODE_ESS_STA
) {
1494 pMgmt
->sNodeDBTable
[0].uTxAttempts
+= 1;
1495 if (BITbIsAllBitsOff(byTSR
, (TSR_TMO
| TSR_RETRYTMO
))) {
1496 // transmit success, TxAttempts at least plus one
1497 pMgmt
->sNodeDBTable
[0].uTxOk
[MAX_RATE
]++;
1498 if ( (byFallBack
== AUTO_FB_NONE
) ||
1499 (wRate
< RATE_18M
) ) {
1500 wFallBackRate
= wRate
;
1501 } else if (byFallBack
== AUTO_FB_0
) {
1503 wFallBackRate
= awHWRetry0
[wRate
-RATE_18M
][byTxRetry
];
1505 wFallBackRate
= awHWRetry0
[wRate
-RATE_18M
][4];
1506 } else if (byFallBack
== AUTO_FB_1
) {
1508 wFallBackRate
= awHWRetry1
[wRate
-RATE_18M
][byTxRetry
];
1510 wFallBackRate
= awHWRetry1
[wRate
-RATE_18M
][4];
1512 pMgmt
->sNodeDBTable
[0].uTxOk
[wFallBackRate
]++;
1514 pMgmt
->sNodeDBTable
[0].uTxFailures
++;
1516 pMgmt
->sNodeDBTable
[0].uTxRetry
+= byTxRetry
;
1517 if (byTxRetry
!= 0) {
1518 pMgmt
->sNodeDBTable
[0].uTxFail
[MAX_RATE
]+=byTxRetry
;
1519 if ( (byFallBack
== AUTO_FB_NONE
) ||
1520 (wRate
< RATE_18M
) ) {
1521 pMgmt
->sNodeDBTable
[0].uTxFail
[wRate
]+=byTxRetry
;
1522 } else if (byFallBack
== AUTO_FB_0
) {
1523 for(ii
=0;ii
<byTxRetry
;ii
++) {
1525 wFallBackRate
= awHWRetry0
[wRate
-RATE_18M
][ii
];
1527 wFallBackRate
= awHWRetry0
[wRate
-RATE_18M
][4];
1528 pMgmt
->sNodeDBTable
[0].uTxFail
[wFallBackRate
]++;
1530 } else if (byFallBack
== AUTO_FB_1
) {
1531 for(ii
=0;ii
<byTxRetry
;ii
++) {
1533 wFallBackRate
= awHWRetry1
[wRate
-RATE_18M
][ii
];
1535 wFallBackRate
= awHWRetry1
[wRate
-RATE_18M
][4];
1536 pMgmt
->sNodeDBTable
[0].uTxFail
[wFallBackRate
]++;
1542 if ((pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) ||
1543 (pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
)) {
1545 if (BSSbIsSTAInNodeDB((HANDLE
)pDevice
, pbyDestAddr
, &uNodeIndex
)){
1546 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxAttempts
+= 1;
1547 if (BITbIsAllBitsOff(byTSR
, (TSR_TMO
| TSR_RETRYTMO
))) {
1548 // transmit success, TxAttempts at least plus one
1549 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxOk
[MAX_RATE
]++;
1550 if ( (byFallBack
== AUTO_FB_NONE
) ||
1551 (wRate
< RATE_18M
) ) {
1552 wFallBackRate
= wRate
;
1553 } else if (byFallBack
== AUTO_FB_0
) {
1555 wFallBackRate
= awHWRetry0
[wRate
-RATE_18M
][byTxRetry
];
1557 wFallBackRate
= awHWRetry0
[wRate
-RATE_18M
][4];
1558 } else if (byFallBack
== AUTO_FB_1
) {
1560 wFallBackRate
= awHWRetry1
[wRate
-RATE_18M
][byTxRetry
];
1562 wFallBackRate
= awHWRetry1
[wRate
-RATE_18M
][4];
1564 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxOk
[wFallBackRate
]++;
1566 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxFailures
++;
1568 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxRetry
+= byTxRetry
;
1569 if (byTxRetry
!= 0) {
1570 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxFail
[MAX_RATE
]+=byTxRetry
;
1571 if ( (byFallBack
== AUTO_FB_NONE
) ||
1572 (wRate
< RATE_18M
) ) {
1573 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxFail
[wRate
]+=byTxRetry
;
1574 } else if (byFallBack
== AUTO_FB_0
) {
1575 for(ii
=0;ii
<byTxRetry
;ii
++) {
1577 wFallBackRate
= awHWRetry0
[wRate
-RATE_18M
][ii
];
1579 wFallBackRate
= awHWRetry0
[wRate
-RATE_18M
][4];
1580 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxFail
[wFallBackRate
]++;
1582 } else if (byFallBack
== AUTO_FB_1
) {
1583 for(ii
=0;ii
<byTxRetry
;ii
++) {
1585 wFallBackRate
= awHWRetry1
[wRate
-RATE_18M
][ii
];
1587 wFallBackRate
= awHWRetry1
[wRate
-RATE_18M
][4];
1588 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxFail
[wFallBackRate
]++;
1606 * Routine Description:
1607 * Clear Nodes & skb in DB Table
1612 * hDeviceContext - The adapter context.
1613 * uStartIndex - starting index
1624 BSSvClearNodeDBTable(
1625 IN HANDLE hDeviceContext
,
1630 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
1631 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1632 struct sk_buff
*skb
;
1635 for (ii
= uStartIndex
; ii
< (MAX_NODE_NUM
+ 1); ii
++) {
1636 if (pMgmt
->sNodeDBTable
[ii
].bActive
) {
1637 // check if sTxPSQueue has been initial
1638 if (pMgmt
->sNodeDBTable
[ii
].sTxPSQueue
.next
!= NULL
) {
1639 while ((skb
= skb_dequeue(&pMgmt
->sNodeDBTable
[ii
].sTxPSQueue
)) != NULL
){
1640 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"PS skb != NULL %d\n", ii
);
1644 memset(&pMgmt
->sNodeDBTable
[ii
], 0, sizeof(KnownNodeDB
));
1652 VOID
s_vCheckSensitivity(
1653 IN HANDLE hDeviceContext
1656 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
1657 PKnownBSS pBSSList
= NULL
;
1658 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1661 if ((pMgmt
->eCurrState
== WMAC_STATE_ASSOC
) ||
1662 ((pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) && (pMgmt
->eCurrState
== WMAC_STATE_JOINTED
))) {
1663 pBSSList
= BSSpAddrIsInBSSList(pDevice
, pMgmt
->abyCurrBSSID
, (PWLAN_IE_SSID
)pMgmt
->abyCurrSSID
);
1664 if (pBSSList
!= NULL
) {
1665 // Updata BB Reg if RSSI is too strong.
1666 LONG LocalldBmAverage
= 0;
1668 for (ii
= 0; ii
< RSSI_STAT_COUNT
; ii
++) {
1669 if (pBSSList
->ldBmAverage
[ii
] != 0) {
1671 LocalldBmAverage
+= pBSSList
->ldBmAverage
[ii
];
1674 if (uNumofdBm
> 0) {
1675 LocalldBmAverage
= LocalldBmAverage
/uNumofdBm
;
1676 for (ii
=0;ii
<BB_VGA_LEVEL
;ii
++) {
1677 DBG_PRT(MSG_LEVEL_DEBUG
, KERN_INFO
"LocalldBmAverage:%ld, %ld %02x\n", LocalldBmAverage
, pDevice
->ldBmThreshold
[ii
], pDevice
->abyBBVGA
[ii
]);
1678 if (LocalldBmAverage
< pDevice
->ldBmThreshold
[ii
]) {
1679 pDevice
->byBBVGANew
= pDevice
->abyBBVGA
[ii
];
1683 if (pDevice
->byBBVGANew
!= pDevice
->byBBVGACurrent
) {
1684 pDevice
->uBBVGADiffCount
++;
1685 if (pDevice
->uBBVGADiffCount
>= BB_VGA_CHANGE_THRESHOLD
)
1686 bScheduleCommand((HANDLE
) pDevice
, WLAN_CMD_CHANGE_BBSENSITIVITY
, NULL
);
1688 pDevice
->uBBVGADiffCount
= 0;
1695 #ifdef Calcu_LinkQual
1696 VOID
s_uCalculateLinkQual(
1697 IN HANDLE hDeviceContext
1700 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
1701 ULONG TxOkRatio
, TxCnt
;
1702 ULONG RxOkRatio
,RxCnt
;
1706 TxCnt
= pDevice
->scStatistic
.TxNoRetryOkCount
+
1707 pDevice
->scStatistic
.TxRetryOkCount
+
1708 pDevice
->scStatistic
.TxFailCount
;
1709 RxCnt
= pDevice
->scStatistic
.RxFcsErrCnt
+
1710 pDevice
->scStatistic
.RxOkCnt
;
1711 TxOkRatio
= (TxCnt
< 6) ? 4000:((pDevice
->scStatistic
.TxNoRetryOkCount
* 4000) / TxCnt
);
1712 RxOkRatio
= (RxCnt
< 6) ? 2000:((pDevice
->scStatistic
.RxOkCnt
* 2000) / RxCnt
);
1713 //decide link quality
1714 if(pDevice
->bLinkPass
!=TRUE
)
1716 // printk("s_uCalculateLinkQual-->Link disconnect and Poor quality**\n");
1717 pDevice
->scStatistic
.LinkQuality
= 0;
1718 pDevice
->scStatistic
.SignalStren
= 0;
1722 RFvRSSITodBm(pDevice
, (BYTE
)(pDevice
->uCurrRSSI
), &ldBm
);
1726 else if(-ldBm
> 90) {
1730 RssiRatio
= (40-(-ldBm
-50))*4000/40;
1732 pDevice
->scStatistic
.SignalStren
= RssiRatio
/40;
1733 pDevice
->scStatistic
.LinkQuality
= (RssiRatio
+TxOkRatio
+RxOkRatio
)/100;
1735 pDevice
->scStatistic
.RxFcsErrCnt
= 0;
1736 pDevice
->scStatistic
.RxOkCnt
= 0;
1737 pDevice
->scStatistic
.TxFailCount
= 0;
1738 pDevice
->scStatistic
.TxNoRetryOkCount
= 0;
1739 pDevice
->scStatistic
.TxRetryOkCount
= 0;
1745 BSSvClearAnyBSSJoinRecord (
1746 IN HANDLE hDeviceContext
1749 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
1750 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1753 for (ii
= 0; ii
< MAX_BSS_NUM
; ii
++) {
1754 pMgmt
->sBSSList
[ii
].bSelected
= FALSE
;
1759 VOID
s_vCheckPreEDThreshold(
1760 IN HANDLE hDeviceContext
1763 PSDevice pDevice
= (PSDevice
)hDeviceContext
;
1764 PKnownBSS pBSSList
= NULL
;
1765 PSMgmtObject pMgmt
= &(pDevice
->sMgmtObj
);
1767 if ((pMgmt
->eCurrState
== WMAC_STATE_ASSOC
) ||
1768 ((pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) && (pMgmt
->eCurrState
== WMAC_STATE_JOINTED
))) {
1769 pBSSList
= BSSpAddrIsInBSSList(pDevice
, pMgmt
->abyCurrBSSID
, (PWLAN_IE_SSID
)pMgmt
->abyCurrSSID
);
1770 if (pBSSList
!= NULL
) {
1771 pDevice
->byBBPreEDRSSI
= (BYTE
) (~(pBSSList
->ldBmAverRange
) + 1);
1772 BBvUpdatePreEDThreshold(pDevice
, FALSE
);