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

📄 bssdb.c

📁 VIA VT6656 USB linux source code.
💻 C
📖 第 1 页 / 共 4 页
字号:
    IN PWLAN_IE_SSID pSSID,    IN PWLAN_IE_SUPP_RATES pSuppRates,    IN PWLAN_IE_SUPP_RATES pExtSuppRates,    IN PERPObject psERP,    IN PWLAN_IE_RSN pRSN,    IN PWLAN_IE_RSN_EXT pRSNWPA,        IN PWLAN_IE_COUNTRY pIE_Country,    IN PWLAN_IE_QUIET pIE_Quiet,    IN UINT uIELength,    IN PBYTE pbyIEs,    IN HANDLE pRxPacketContext    ){        PSDevice     pDevice = (PSDevice)hDeviceContext;    PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);    PSRxMgmtPacket  pRxPacket = (PSRxMgmtPacket)pRxPacketContext;        PKnownBSS       pBSSList = NULL;    UINT            ii;      BOOL            bParsingQuiet = FALSE;            pBSSList = (PKnownBSS)&(pMgmt->sBSSList[0]);    for (ii = 0; ii < MAX_BSS_NUM; ii++) {        pBSSList = (PKnownBSS)&(pMgmt->sBSSList[ii]);        if (!pBSSList->bActive)                 break;    }            if (ii == MAX_BSS_NUM){        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Get free KnowBSS node failed.\n");        return FALSE;    }        // save the BSS info    pBSSList->bActive = TRUE;    memcpy( pBSSList->abyBSSID, abyBSSIDAddr, WLAN_BSSID_LEN);    HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp));    LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp));        pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval);    pBSSList->wCapInfo = cpu_to_le16(wCapInfo);    pBSSList->uClearCount = 0;        if (pSSID->len > WLAN_SSID_MAXLEN)        pSSID->len = WLAN_SSID_MAXLEN;    memcpy( pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN);    pBSSList->uChannel = byCurrChannel;        if (pSuppRates->len > WLAN_RATES_MAXLEN)        pSuppRates->len = WLAN_RATES_MAXLEN;    memcpy( pBSSList->abySuppRates, pSuppRates, pSuppRates->len + WLAN_IEHDR_LEN);    if (pExtSuppRates != NULL) {        if (pExtSuppRates->len > WLAN_RATES_MAXLEN)            pExtSuppRates->len = WLAN_RATES_MAXLEN;        memcpy(pBSSList->abyExtSuppRates, pExtSuppRates, pExtSuppRates->len + WLAN_IEHDR_LEN);        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSbInsertToBSSList: pExtSuppRates->len = %d\n", pExtSuppRates->len);             } else {        memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);    }    pBSSList->sERP.byERP = psERP->byERP;        pBSSList->sERP.bERPExist = psERP->bERPExist;        // Check if BSS is 802.11a/b/g        if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) {        pBSSList->eNetworkTypeInUse = PHY_TYPE_11A;    } else {        if (pBSSList->sERP.bERPExist == TRUE) {            pBSSList->eNetworkTypeInUse = PHY_TYPE_11G;        } else {            pBSSList->eNetworkTypeInUse = PHY_TYPE_11B;        }    }        pBSSList->byRxRate = pRxPacket->byRxRate;    pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF;    pBSSList->uRSSI = pRxPacket->uRSSI;    pBSSList->bySQ = pRxPacket->bySQ;           if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&        (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {        // assoc with BSS        if (pBSSList == pMgmt->pCurrBSS) {            bParsingQuiet = TRUE;        }    }    WPA_ClearRSN(pBSSList);        if (pRSNWPA != NULL) {        UINT uLen = pRSNWPA->len + 2;        if (uLen <= (uIELength - (UINT)(ULONG_PTR)((PBYTE)pRSNWPA - pbyIEs))) {            pBSSList->wWPALen = uLen;            memcpy(pBSSList->byWPAIE, pRSNWPA, uLen);                        WPA_ParseRSN(pBSSList, pRSNWPA);        }    }        WPA2_ClearRSN(pBSSList);        if (pRSN != NULL) {        UINT uLen = pRSN->len + 2;        if (uLen <= (uIELength - (UINT)(ULONG_PTR)((PBYTE)pRSN - pbyIEs))) {            pBSSList->wRSNLen = uLen;            memcpy(pBSSList->byRSNIE, pRSN, uLen);                        WPA2vParseRSN(pBSSList, pRSN);        }    }    if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || (pBSSList->bWPA2Valid == TRUE)) {        PSKeyItem  pTransmitKey = NULL;        BOOL       bIs802_1x = FALSE;        for (ii = 0; ii < pBSSList->wAKMSSAuthCount; ii ++) {            if (pBSSList->abyAKMSSAuthType[ii] == WLAN_11i_AKMSS_802_1X) {                bIs802_1x = TRUE;                break;            }        }        if ((bIs802_1x == TRUE) && (pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len) &&            (MEMEqualMemory(pSSID->abySSID, ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->abySSID, pSSID->len))) {            bAdd_PMKID_Candidate((HANDLE)pDevice, pBSSList->abyBSSID, &pBSSList->sRSNCapObj);            if ((pDevice->bLinkPass == TRUE) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {                if ((KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, PAIRWISE_KEY, &pTransmitKey) == TRUE) ||                    (KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBSSID, GROUP_KEY, &pTransmitKey) == TRUE)) {                    pDevice->gsPMKIDCandidate.StatusType = Ndis802_11StatusType_PMKID_CandidateList;                    pDevice->gsPMKIDCandidate.Version = 1;                                    }            }        }    }    if (pDevice->bUpdateBBVGA) {        // Moniter if RSSI is too strong.        pBSSList->byRSSIStatCnt = 0;        RFvRSSITodBm(pDevice, (BYTE)(pRxPacket->uRSSI), &pBSSList->ldBmMAX);        pBSSList->ldBmAverage[0] = pBSSList->ldBmMAX;        pBSSList->ldBmAverRange = pBSSList->ldBmMAX;                for (ii = 1; ii < RSSI_STAT_COUNT; ii++)            pBSSList->ldBmAverage[ii] = 0;    }    /*        if ((pIE_Country != NULL) &&        (pMgmt->b11hEnable == TRUE)) {        CARDvSetCountryInfo(pMgmt->pAdapter,                            pBSSList->eNetworkTypeInUse,                            pIE_Country);    }        if ((bParsingQuiet == TRUE) && (pIE_Quiet != NULL)) {        if ((((PWLAN_IE_QUIET)pIE_Quiet)->len == 8) &&                (((PWLAN_IE_QUIET)pIE_Quiet)->byQuietCount != 0)) {            // valid EID            if (pQuiet == NULL) {                pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;                CARDbSetQuiet(  pMgmt->pAdapter,                                TRUE,                                pQuiet->byQuietCount,                                pQuiet->byQuietPeriod,                                *((PWORD)pQuiet->abyQuietDuration),                                *((PWORD)pQuiet->abyQuietOffset)                                );            } else {                pQuiet = (PWLAN_IE_QUIET)pIE_Quiet;                CARDbSetQuiet(  pMgmt->pAdapter,                                FALSE,                                pQuiet->byQuietCount,                                pQuiet->byQuietPeriod,                                *((PWORD)pQuiet->abyQuietDuration),                                *((PWORD)pQuiet->abyQuietOffset)                                );            }        }        }                if ((bParsingQuiet == TRUE) &&        (pQuiet != NULL)) {        CARDbStartQuiet(pMgmt->pAdapter);    }    */            pBSSList->uIELength = uIELength;    if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN)        pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN;    MEMvCopy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength);    return TRUE;}/*+ *  * Routine Description: *    Update BSS set in known BSS list * * Return Value: *    TRUE if success. *-*/// TODO: input structure modifyBOOLBSSbUpdateToBSSList (    IN HANDLE hDeviceContext,    IN QWORD qwTimestamp,    IN WORD wBeaconInterval,    IN WORD wCapInfo,    IN BYTE byCurrChannel,     IN BOOL bChannelHit,        IN PWLAN_IE_SSID pSSID,    IN PWLAN_IE_SUPP_RATES pSuppRates,    IN PWLAN_IE_SUPP_RATES pExtSuppRates,    IN PERPObject psERP,    IN PWLAN_IE_RSN pRSN,    IN PWLAN_IE_RSN_EXT pRSNWPA,        IN PWLAN_IE_COUNTRY pIE_Country,    IN PWLAN_IE_QUIET pIE_Quiet,        IN PKnownBSS pBSSList,    IN UINT uIELength,    IN PBYTE pbyIEs,    IN HANDLE pRxPacketContext    ){    int             ii, jj;        PSDevice        pDevice = (PSDevice)hDeviceContext;        PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);    PSRxMgmtPacket  pRxPacket = (PSRxMgmtPacket)pRxPacketContext;    LONG            ldBm, ldBmSum;            BOOL            bParsingQuiet = FALSE;    if (pBSSList == NULL)        return FALSE;    HIDWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(HIDWORD(qwTimestamp));    LODWORD(pBSSList->qwBSSTimestamp) = cpu_to_le32(LODWORD(qwTimestamp));        pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval);    pBSSList->wCapInfo = cpu_to_le16(wCapInfo);    pBSSList->uClearCount = 0;    pBSSList->uChannel = byCurrChannel;//    DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BSSbUpdateToBSSList: pBSSList->uChannel: %d\n", pBSSList->uChannel);    if (pSSID->len > WLAN_SSID_MAXLEN)        pSSID->len = WLAN_SSID_MAXLEN;            if ((pSSID->len != 0) && (pSSID->abySSID[0] != 0))        memcpy(pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN);    memcpy(pBSSList->abySuppRates, pSuppRates,pSuppRates->len + WLAN_IEHDR_LEN);    if (pExtSuppRates != NULL) {        memcpy(pBSSList->abyExtSuppRates, pExtSuppRates,pExtSuppRates->len + WLAN_IEHDR_LEN);    } else {        memset(pBSSList->abyExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);    }    pBSSList->sERP.byERP = psERP->byERP;    pBSSList->sERP.bERPExist = psERP->bERPExist;        // Check if BSS is 802.11a/b/g        if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) {        pBSSList->eNetworkTypeInUse = PHY_TYPE_11A;    } else {        if (pBSSList->sERP.bERPExist == TRUE) {            pBSSList->eNetworkTypeInUse = PHY_TYPE_11G;        } else {            pBSSList->eNetworkTypeInUse = PHY_TYPE_11B;        }    }            pBSSList->byRxRate = pRxPacket->byRxRate;    pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF;    if(bChannelHit)        pBSSList->uRSSI = pRxPacket->uRSSI;            pBSSList->bySQ = pRxPacket->bySQ;       if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&        (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {        // assoc with BSS        if (pBSSList == pMgmt->pCurrBSS) {            bParsingQuiet = TRUE;        }    }                if (pRSNWPA != NULL) {        UINT uLen = pRSNWPA->len + 2;        if (uLen <= (uIELength - (UINT)(ULONG_PTR)((PBYTE)pRSNWPA - pbyIEs))) {            pBSSList->wWPALen = uLen;            memcpy(pBSSList->byWPAIE, pRSNWPA, uLen);            WPA_ParseRSN(pBSSList, pRSNWPA);        }    }    if (pRSN != NULL) {        UINT uLen = pRSN->len + 2;        if (uLen <= (uIELength - (UINT)(ULONG_PTR)((PBYTE)pRSN - pbyIEs))) {            pBSSList->wRSNLen = uLen;            memcpy(pBSSList->byRSNIE, pRSN, uLen);            WPA2vParseRSN(pBSSList, pRSN);        }    }        if (pRxPacket->uRSSI != 0) {        RFvRSSITodBm(pDevice, (BYTE)(pRxPacket->uRSSI), &ldBm);        // Moniter if RSSI is too strong.        pBSSList->byRSSIStatCnt++;        pBSSList->byRSSIStatCnt %= RSSI_STAT_COUNT;        pBSSList->ldBmAverage[pBSSList->byRSSIStatCnt] = ldBm;        ldBmSum = 0;        for(ii=0, jj=0;ii<RSSI_STAT_COUNT;ii++) {            if (pBSSList->ldBmAverage[ii] != 0) {                pBSSList->ldBmMAX = max(pBSSList->ldBmAverage[ii], ldBm);                ldBmSum += pBSSList->ldBmAverage[ii];                jj++;                            }        }        pBSSList->ldBmAverRange = ldBmSum /jj;    }                          pBSSList->uIELength = uIELength;    if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN)        pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN;    memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength);            return TRUE;}        /*+ *  * Routine Description: *    Search Node DB table to find the index of matched DstAddr *     * Return Value: *    None *-*/BOOLBSSbIsSTAInNodeDB(    IN HANDLE hDeviceContext,    IN PBYTE abyDstAddr,    OUT PUINT puNodeIndex    ){    PSDevice        pDevice = (PSDevice)hDeviceContext;        PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);    UINT            ii;        // Index = 0 reserved for AP Node           for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {        if (pMgmt->sNodeDBTable[ii].bActive) {            if (IS_ETH_ADDRESS_EQUAL(abyDstAddr, pMgmt->sNodeDBTable[ii].abyMACAddr)) {                *puNodeIndex = ii;                return TRUE;            }            }    }       return FALSE;    };/*+ *  * Routine Description: *    Find an empty node and allocated; if no empty found, *    instand used of most inactive one.  *     * Return Value: *    None *-*/VOIDBSSvCreateOneNode(    IN HANDLE hDeviceContext,    OUT PUINT puNodeIndex    ){        PSDevice     pDevice = (PSDevice)hDeviceContext;    PSMgmtObject    pMgmt = &(pDevice->sMgmtObj);    UINT            ii;    UINT            BigestCount = 0;    UINT            SelectIndex;    struct sk_buff  *skb;    // Index = 0 reserved for AP Node (In STA mode)      // Index = 0 reserved for Broadcast/MultiCast (In AP mode)    SelectIndex = 1;     for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) {        if (pMgmt->sNodeDBTable[ii].bActive) {            if (pMgmt->sNodeDBTable[ii].uInActiveCount > BigestCount) {                BigestCount = pMgmt->sNodeDBTable[ii].uInActiveCount;                SelectIndex = ii;            }        }        else {            break;        }    }        // if not found replace uInActiveCount is largest one.    if ( ii == (MAX_NODE_NUM + 1)) {        *puNodeIndex = SelectIndex;        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Replace inactive node = %d\n", SelectIndex);        // clear ps buffer        if (pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue.next != NULL) {              	    while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue)) != NULL)            dev_kfree_skb(skb);        }     }    else {        *puNodeIndex = ii;      }        memset(&pMgmt->sNodeDBTable[*puNodeIndex], 0, sizeof(KnownNodeDB));    pMgmt->sNodeDBTable[*puNodeIndex].bActive = TRUE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -