⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bssdb.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * 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 + -