📄 bssdb.c
字号:
/* * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. * All rights reserved. * * This software is copyrighted by and is the sole property of * VIA Networking Technologies, Inc. This software may only be used * in accordance with the corresponding license agreement. Any unauthorized * use, duplication, transmission, distribution, or disclosure of this * software is expressly forbidden. * * This software is provided by VIA Networking Technologies, Inc. "as is" * and any express or implied warranties, including, but not limited to, the * implied warranties of merchantability and fitness for a particular purpose * are disclaimed. In no event shall VIA Networking Technologies, Inc. * be liable for any direct, indirect, incidental, special, exemplary, or * consequential damages. * * File: bssdb.c * * Purpose: Handles the Basic Service Set & Node Database functions * * Functions: * BSSpSearchBSSList - Search known BSS list for Desire SSID or BSSID * BSSvClearBSSList - Clear BSS List * BSSbInsertToBSSList - Insert a BSS set into known BSS list * BSSbUpdateToBSSList - Update BSS set in known BSS list * BSSbIsSTAInNodeDB - Search Node DB table to find the index of matched DstAddr * BSSvCreateOneNode - Allocate an Node for Node DB * BSSvUpdateAPNode - Update AP Node content in Index 0 of KnownNodeDB * BSSvSecondCallBack - One second timer callback function to update Node DB info & AP link status * BSSvUpdateNodeTxCounter - Update Tx attemps, Tx failure counter in Node DB for auto-fall back rate control * * Revision History: * * Author: Lyndon Chen * * Date: July 17, 2002 * */#if !defined(__TTYPE_H__)#include "ttype.h"#endif#if !defined(__TMACRO_H__)#include "tmacro.h"#endif#if !defined(__TETHER_H__)#include "tether.h"#endif#if !defined(__DEVICE_H__)#include "device.h"#endif#if !defined(__80211HDR_H__)#include "80211hdr.h"#endif#if !defined(__BSSDB_H__)#include "bssdb.h"#endif#if !defined(__WMGR_H__)#include "wmgr.h"#endif#if !defined(__DATARATE_H__)#include "datarate.h"#endif#if !defined(__DESC_H__)#include "desc.h"#endif#if !defined(__WCMD_H__)#include "wcmd.h"#endif#if !defined(__WPA_H__)#include "wpa.h"#endif#if !defined(__BASEBAND_H__)#include "baseband.h"#endif#if !defined(__RF_H__)#include "rf.h"#endif#if !defined(__CARD_H__)#include "card.h"#endif #if !defined(__MAC_H__)#include "mac.h"#endif#if !defined(__WPA2_H__)#include "wpa2.h"#endif#if !defined(__UMEM_H__)#include "umem.h"#endif#if !defined(__TBIT_H__)#include "tbit.h"#endif#if !defined(__CONTROL_H__)#include "control.h"#endif#if !defined(__RNDIS_H__)#include "rndis.h"#endif//DavidWang#if !defined(__IOWPA_H__)#include "iowpa.h"#endif/*--------------------- Static Definitions -------------------------*//*--------------------- Static Classes ----------------------------*//*--------------------- Static Variables --------------------------*/static int msglevel =MSG_LEVEL_INFO;//static int msglevel =MSG_LEVEL_DEBUG;const WORD awHWRetry0[5][5] = { {RATE_18M, RATE_18M, RATE_12M, RATE_12M, RATE_12M}, {RATE_24M, RATE_24M, RATE_18M, RATE_12M, RATE_12M}, {RATE_36M, RATE_36M, RATE_24M, RATE_18M, RATE_18M}, {RATE_48M, RATE_48M, RATE_36M, RATE_24M, RATE_24M}, {RATE_54M, RATE_54M, RATE_48M, RATE_36M, RATE_36M} };const WORD awHWRetry1[5][5] = { {RATE_18M, RATE_18M, RATE_12M, RATE_6M, RATE_6M}, {RATE_24M, RATE_24M, RATE_18M, RATE_6M, RATE_6M}, {RATE_36M, RATE_36M, RATE_24M, RATE_12M, RATE_12M}, {RATE_48M, RATE_48M, RATE_24M, RATE_12M, RATE_12M}, {RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M} };/*--------------------- Static Functions --------------------------*/VOID s_vCheckSensitivity( IN HANDLE hDeviceContext );VOID s_vCheckPreEDThreshold( IN HANDLE hDeviceContext );#ifdef Calcu_LinkQualVOID s_uCalculateLinkQual( IN HANDLE hDeviceContext );#endif/*--------------------- Export Variables --------------------------*//*--------------------- Export Functions --------------------------*//*+ * * Routine Description: * Search known BSS list for Desire SSID or BSSID. * * Return Value: * PTR to KnownBSS or NULL *-*/PKnownBSSBSSpSearchBSSList( IN HANDLE hDeviceContext, IN PBYTE pbyDesireBSSID, IN PBYTE pbyDesireSSID, IN CARD_PHY_TYPE ePhyType ){ PSDevice pDevice = (PSDevice)hDeviceContext; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); PBYTE pbyBSSID = NULL; PWLAN_IE_SSID pSSID = NULL; PKnownBSS pCurrBSS = NULL; PKnownBSS pSelect = NULL; BYTE ZeroBSSID[WLAN_BSSID_LEN]={0x00,0x00,0x00,0x00,0x00,0x00}; UINT ii = 0; UINT jj = 0; //DavidWang if (pbyDesireBSSID != NULL) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSpSearchBSSList BSSID[%02X %02X %02X-%02X %02X %02X]\n", *pbyDesireBSSID,*(pbyDesireBSSID+1),*(pbyDesireBSSID+2), *(pbyDesireBSSID+3),*(pbyDesireBSSID+4),*(pbyDesireBSSID+5)); if ((!IS_BROADCAST_ADDRESS(pbyDesireBSSID)) && (memcmp(pbyDesireBSSID, ZeroBSSID, 6)!= 0)){ pbyBSSID = pbyDesireBSSID; } } if (pbyDesireSSID != NULL) { if (((PWLAN_IE_SSID)pbyDesireSSID)->len != 0) { pSSID = (PWLAN_IE_SSID) pbyDesireSSID; } } if ((pbyBSSID != NULL)&&(pDevice->bRoaming == FALSE)) { // match BSSID first for (ii = 0; ii <MAX_BSS_NUM; ii++) { pCurrBSS = &(pMgmt->sBSSList[ii]); if ((pCurrBSS->bActive) && (pCurrBSS->bSelected == FALSE)) { if (IS_ETH_ADDRESS_EQUAL(pCurrBSS->abyBSSID, pbyBSSID)) { if (pSSID != NULL) { // compare ssid if (MEMEqualMemory(pSSID->abySSID, ((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID, pSSID->len)) { if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) || ((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) || ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) ) { pCurrBSS->bSelected = TRUE; return(pCurrBSS); } } } else { if ((pMgmt->eConfigMode == WMAC_CONFIG_AUTO) || ((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) || ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) ) { pCurrBSS->bSelected = TRUE; return(pCurrBSS); } } } } } } else { // ignore BSSID for (ii = 0; ii <MAX_BSS_NUM; ii++) { pCurrBSS = &(pMgmt->sBSSList[ii]); //2007-0721-01<Mark>by MikeLiu // if ((pCurrBSS->bActive) && // (pCurrBSS->bSelected == FALSE)) { //2007-0721-01<Add>by MikeLiu pCurrBSS->bSelected = FALSE; if (pCurrBSS->bActive) { if (pSSID != NULL) { // matched SSID if (!MEMEqualMemory(pSSID->abySSID, ((PWLAN_IE_SSID)pCurrBSS->abySSID)->abySSID, pSSID->len) || (pSSID->len != ((PWLAN_IE_SSID)pCurrBSS->abySSID)->len)) { // SSID not match skip this BSS continue; } } if (((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) && WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) || ((pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA) && WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) ){ // Type not match skip this BSS DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSS type mismatch.... Config[%d] BSS[0x%04x]\n", pMgmt->eConfigMode, pCurrBSS->wCapInfo); continue; } if (ePhyType != PHY_TYPE_AUTO) { if (((ePhyType == PHY_TYPE_11A) && (PHY_TYPE_11A != pCurrBSS->eNetworkTypeInUse)) || ((ePhyType != PHY_TYPE_11A) && (PHY_TYPE_11A == pCurrBSS->eNetworkTypeInUse))) { // PhyType not match skip this BSS DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Physical type mismatch.... ePhyType[%d] BSS[%d]\n", ePhyType, pCurrBSS->eNetworkTypeInUse); continue; } }/* if (pMgmt->eAuthenMode < WMAC_AUTH_WPA) { if (pCurrBSS->bWPAValid == TRUE) { // WPA AP will reject connection of station without WPA enable. continue; } } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) || (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) { if (pCurrBSS->bWPAValid == FALSE) { // station with WPA enable can't join NonWPA AP. continue; } } else if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { if (pCurrBSS->bWPA2Valid == FALSE) { // station with WPA2 enable can't join NonWPA2 AP. continue; } } */ //DavidWang pMgmt->pSameBSS[jj].uChannel = pCurrBSS->uChannel; 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)); jj++;//DavidWang if (pSelect == NULL) { pSelect = pCurrBSS; } else { // compare RSSI, select signal strong one if (pCurrBSS->uRSSI < pSelect->uRSSI) { pSelect = pCurrBSS; } } } }//DavidWangpDevice->bSameBSSMaxNum = jj;//DavidWang if (pSelect != NULL) { pSelect->bSelected = TRUE; if (pDevice->bRoaming == FALSE) { // Einsn Add @20070907 ZERO_MEMORY(pbyDesireSSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); MEMvCopy(pbyDesireSSID,pCurrBSS->abySSID,WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1) ; } return(pSelect); } } return(NULL); }/*+ * * Routine Description: * Clear BSS List * * Return Value: * None. *-*/VOIDBSSvClearBSSList( IN HANDLE hDeviceContext, IN BOOL bKeepCurrBSSID ){ PSDevice pDevice = (PSDevice)hDeviceContext; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); UINT ii; for (ii = 0; ii < MAX_BSS_NUM; ii++) { if (bKeepCurrBSSID) { if (pMgmt->sBSSList[ii].bActive && IS_ETH_ADDRESS_EQUAL(pMgmt->sBSSList[ii].abyBSSID, pMgmt->abyCurrBSSID)) { bKeepCurrBSSID = FALSE; continue; } } /* if ((pMgmt->sBSSList[ii].bActive) && (pMgmt->sBSSList[ii].uClearCount < BSS_CLEAR_COUNT)) { pMgmt->sBSSList[ii].uClearCount ++; continue; } */ pMgmt->sBSSList[ii].bActive = FALSE; memset(&pMgmt->sBSSList[ii], 0, sizeof(KnownBSS)); } BSSvClearAnyBSSJoinRecord(pDevice); return; }/*+ * * Routine Description: * search BSS list by BSSID & SSID if matched * * Return Value: * TRUE if found. *-*/PKnownBSSBSSpAddrIsInBSSList( IN HANDLE hDeviceContext, IN PBYTE abyBSSID, IN PWLAN_IE_SSID pSSID ){ PSDevice pDevice = (PSDevice)hDeviceContext; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); PKnownBSS pBSSList = NULL; UINT ii; for (ii = 0; ii < MAX_BSS_NUM; ii++) { pBSSList = &(pMgmt->sBSSList[ii]); if (pBSSList->bActive) { if (IS_ETH_ADDRESS_EQUAL(pBSSList->abyBSSID, abyBSSID)) { if (pSSID->len == ((PWLAN_IE_SSID)pBSSList->abySSID)->len){ if (memcmp(pSSID->abySSID, ((PWLAN_IE_SSID)pBSSList->abySSID)->abySSID, pSSID->len) == 0) return pBSSList; } } } } return NULL;};/*+ * * Routine Description: * Insert a BSS set into known BSS list * * Return Value: * TRUE if success. *-*/BOOLBSSbInsertToBSSList ( IN HANDLE hDeviceContext, IN PBYTE abyBSSIDAddr, IN QWORD qwTimestamp, IN WORD wBeaconInterval, IN WORD wCapInfo, IN BYTE byCurrChannel,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -