📄 bssdb.c
字号:
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 + -