📄 bssdb.c
字号:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) pDevice->skb->mac_header = pDevice->skb->data;#else pDevice->skb->mac.raw = pDevice->skb->data;#endif pDevice->skb->pkt_type = PACKET_HOST; pDevice->skb->protocol = htons(ETH_P_802_2); memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb)); netif_rx(pDevice->skb); pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);// } } else if ((pDevice->bRoaming == FALSE)&&(pDevice->bIsRoaming == TRUE)) { pDevice->uIsroamingTime++; if (pDevice->uIsroamingTime >= 20) pDevice->bIsRoaming = FALSE; } }else { if (pDevice->uAutoReConnectTime < 10) { pDevice->uAutoReConnectTime++; #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT //network manager support need not do Roaming scan??? if(pDevice->bWPASuppWextEnabled ==TRUE) pDevice->uAutoReConnectTime = 0; #endif } else { //mike use old encryption status for wpa reauthen if(pDevice->bWPADevEnable) pDevice->eEncryptionStatus = pDevice->eOldEncryptionStatus; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Roaming ...\n"); BSSvClearBSSList((HANDLE)pDevice, pDevice->bLinkPass); bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, pMgmt->abyDesireSSID); bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, pMgmt->abyDesireSSID); pDevice->uAutoReConnectTime = 0; } } } } if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { // if adhoc started which essid is NULL string, rescaning. if ((pMgmt->eCurrState == WMAC_STATE_STARTED) && (pCurrSSID->len == 0)) { if (pDevice->uAutoReConnectTime < 10) { pDevice->uAutoReConnectTime++; } else { DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Adhoc re-scaning ...\n"); bScheduleCommand((HANDLE) pDevice, WLAN_CMD_BSSID_SCAN, NULL); bScheduleCommand((HANDLE) pDevice, WLAN_CMD_SSID, NULL); pDevice->uAutoReConnectTime = 0; }; } if (pMgmt->eCurrState == WMAC_STATE_JOINTED) { if (pDevice->bUpdateBBVGA) { //s_vCheckSensitivity((HANDLE) pDevice); s_vCheckPreEDThreshold((HANDLE)pDevice); } if (pMgmt->sNodeDBTable[0].uInActiveCount >=ADHOC_LOST_BEACON_COUNT) { DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Lost other STA beacon [%d] sec, started !\n", pMgmt->sNodeDBTable[0].uInActiveCount); pMgmt->sNodeDBTable[0].uInActiveCount = 0; pMgmt->eCurrState = WMAC_STATE_STARTED; netif_stop_queue(pDevice->dev); pDevice->bLinkPass = FALSE; ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW); } } } if (pDevice->bLinkPass == TRUE) { if (netif_queue_stopped(pDevice->dev)) netif_wake_queue(pDevice->dev); } spin_unlock_irq(&pDevice->lock); pMgmt->sTimerSecondCallback.expires = RUN_AT(HZ); add_timer(&pMgmt->sTimerSecondCallback); return;} /*+ * * Routine Description: * * * Update Tx attemps, Tx failure counter in Node DB * * * Return Value: * none. *-*/VOIDBSSvUpdateNodeTxCounter( IN HANDLE hDeviceContext, IN PSStatCounter pStatistic, IN BYTE byTSR, IN BYTE byPktNO ){ PSDevice pDevice = (PSDevice)hDeviceContext; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); UINT uNodeIndex = 0; BYTE byTxRetry; WORD wRate; WORD wFallBackRate = RATE_1M; BYTE byFallBack; UINT ii; PBYTE pbyDestAddr; BYTE byPktNum; WORD wFIFOCtl; byPktNum = (byPktNO & 0x0F) >> 4; byTxRetry = (byTSR & 0xF0) >> 4; wRate = (WORD) (byPktNO & 0xF0) >> 4; wFIFOCtl = pStatistic->abyTxPktInfo[byPktNum].wFIFOCtl; pbyDestAddr = (PBYTE) &( pStatistic->abyTxPktInfo[byPktNum].abyDestAddr[0]); if (wFIFOCtl & FIFOCTL_AUTO_FB_0) { byFallBack = AUTO_FB_0; } else if (wFIFOCtl & FIFOCTL_AUTO_FB_1) { byFallBack = AUTO_FB_1; } else { byFallBack = AUTO_FB_NONE; } // Only Unicast using support rates if (wFIFOCtl & FIFOCTL_NEEDACK) { //DBG_PRN_GRP21(("Device %08X, wRate %04X, byTSR %02X\n", hDeviceContext, wRate, byTSR)); if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) { pMgmt->sNodeDBTable[0].uTxAttempts += 1; if (BITbIsAllBitsOff(byTSR, (TSR_TMO | TSR_RETRYTMO))) { // transmit success, TxAttempts at least plus one pMgmt->sNodeDBTable[0].uTxOk[MAX_RATE]++; if ( (byFallBack == AUTO_FB_NONE) || (wRate < RATE_18M) ) { wFallBackRate = wRate; } else if (byFallBack == AUTO_FB_0) { if (byTxRetry < 5) wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry]; else wFallBackRate = awHWRetry0[wRate-RATE_18M][4]; } else if (byFallBack == AUTO_FB_1) { if (byTxRetry < 5) wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry]; else wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; } pMgmt->sNodeDBTable[0].uTxOk[wFallBackRate]++; } else { pMgmt->sNodeDBTable[0].uTxFailures ++; } pMgmt->sNodeDBTable[0].uTxRetry += byTxRetry; if (byTxRetry != 0) { pMgmt->sNodeDBTable[0].uTxFail[MAX_RATE]+=byTxRetry; if ( (byFallBack == AUTO_FB_NONE) || (wRate < RATE_18M) ) { pMgmt->sNodeDBTable[0].uTxFail[wRate]+=byTxRetry; } else if (byFallBack == AUTO_FB_0) { for(ii=0;ii<byTxRetry;ii++) { if (ii < 5) wFallBackRate = awHWRetry0[wRate-RATE_18M][ii]; else wFallBackRate = awHWRetry0[wRate-RATE_18M][4]; pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++; } } else if (byFallBack == AUTO_FB_1) { for(ii=0;ii<byTxRetry;ii++) { if (ii < 5) wFallBackRate = awHWRetry1[wRate-RATE_18M][ii]; else wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++; } } } }; if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) || (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) { if (BSSbIsSTAInNodeDB((HANDLE)pDevice, pbyDestAddr, &uNodeIndex)){ pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts += 1; if (BITbIsAllBitsOff(byTSR, (TSR_TMO | TSR_RETRYTMO))) { // transmit success, TxAttempts at least plus one pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++; if ( (byFallBack == AUTO_FB_NONE) || (wRate < RATE_18M) ) { wFallBackRate = wRate; } else if (byFallBack == AUTO_FB_0) { if (byTxRetry < 5) wFallBackRate = awHWRetry0[wRate-RATE_18M][byTxRetry]; else wFallBackRate = awHWRetry0[wRate-RATE_18M][4]; } else if (byFallBack == AUTO_FB_1) { if (byTxRetry < 5) wFallBackRate = awHWRetry1[wRate-RATE_18M][byTxRetry]; else wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; } pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wFallBackRate]++; } else { pMgmt->sNodeDBTable[uNodeIndex].uTxFailures ++; } pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += byTxRetry; if (byTxRetry != 0) { pMgmt->sNodeDBTable[uNodeIndex].uTxFail[MAX_RATE]+=byTxRetry; if ( (byFallBack == AUTO_FB_NONE) || (wRate < RATE_18M) ) { pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wRate]+=byTxRetry; } else if (byFallBack == AUTO_FB_0) { for(ii=0;ii<byTxRetry;ii++) { if (ii < 5) wFallBackRate = awHWRetry0[wRate-RATE_18M][ii]; else wFallBackRate = awHWRetry0[wRate-RATE_18M][4]; pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++; } } else if (byFallBack == AUTO_FB_1) { for(ii=0;ii<byTxRetry;ii++) { if (ii < 5) wFallBackRate = awHWRetry1[wRate-RATE_18M][ii]; else wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++; } } } }; } }; return;} /*+ * * Routine Description: * Clear Nodes & skb in DB Table * * * Parameters: * In: * hDeviceContext - The adapter context. * uStartIndex - starting index * Out: * none * * Return Value: * None. *-*/VOIDBSSvClearNodeDBTable( IN HANDLE hDeviceContext, IN UINT uStartIndex ){ PSDevice pDevice = (PSDevice)hDeviceContext; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); struct sk_buff *skb; UINT ii; for (ii = uStartIndex; ii < (MAX_NODE_NUM + 1); ii++) { if (pMgmt->sNodeDBTable[ii].bActive) { // check if sTxPSQueue has been initial if (pMgmt->sNodeDBTable[ii].sTxPSQueue.next != NULL) { while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[ii].sTxPSQueue)) != NULL){ DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "PS skb != NULL %d\n", ii); dev_kfree_skb(skb); } } memset(&pMgmt->sNodeDBTable[ii], 0, sizeof(KnownNodeDB)); } } return;};VOID s_vCheckSensitivity( IN HANDLE hDeviceContext ){ PSDevice pDevice = (PSDevice)hDeviceContext; PKnownBSS pBSSList = NULL; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); int ii; if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) || ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) { pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID); if (pBSSList != NULL) { // Updata BB Reg if RSSI is too strong. LONG LocalldBmAverage = 0; LONG uNumofdBm = 0; for (ii = 0; ii < RSSI_STAT_COUNT; ii++) { if (pBSSList->ldBmAverage[ii] != 0) { uNumofdBm ++; LocalldBmAverage += pBSSList->ldBmAverage[ii]; } } if (uNumofdBm > 0) { LocalldBmAverage = LocalldBmAverage/uNumofdBm; for (ii=0;ii<BB_VGA_LEVEL;ii++) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"LocalldBmAverage:%ld, %ld %02x\n", LocalldBmAverage, pDevice->ldBmThreshold[ii], pDevice->abyBBVGA[ii]); if (LocalldBmAverage < pDevice->ldBmThreshold[ii]) { pDevice->byBBVGANew = pDevice->abyBBVGA[ii]; break; } } if (pDevice->byBBVGANew != pDevice->byBBVGACurrent) { pDevice->uBBVGADiffCount++; if (pDevice->uBBVGADiffCount >= BB_VGA_CHANGE_THRESHOLD) bScheduleCommand((HANDLE) pDevice, WLAN_CMD_CHANGE_BBSENSITIVITY, NULL); } else { pDevice->uBBVGADiffCount = 0; } } } }}#ifdef Calcu_LinkQualVOID s_uCalculateLinkQual( IN HANDLE hDeviceContext ){ PSDevice pDevice = (PSDevice)hDeviceContext; ULONG TxOkRatio, TxCnt; ULONG RxOkRatio,RxCnt; ULONG RssiRatio; long ldBm;TxCnt = pDevice->scStatistic.TxNoRetryOkCount + pDevice->scStatistic.TxRetryOkCount + pDevice->scStatistic.TxFailCount;RxCnt = pDevice->scStatistic.RxFcsErrCnt + pDevice->scStatistic.RxOkCnt;TxOkRatio = (TxCnt < 6) ? 4000:((pDevice->scStatistic.TxNoRetryOkCount * 4000) / TxCnt);RxOkRatio = (RxCnt < 6) ? 2000:((pDevice->scStatistic.RxOkCnt * 2000) / RxCnt); //decide link quality if(pDevice->bLinkPass !=TRUE){ // printk("s_uCalculateLinkQual-->Link disconnect and Poor quality**\n"); pDevice->scStatistic.LinkQuality = 0; pDevice->scStatistic.SignalStren = 0;}else{ RFvRSSITodBm(pDevice, (BYTE)(pDevice->uCurrRSSI), &ldBm); if(-ldBm < 50) { RssiRatio = 4000; } else if(-ldBm > 90) { RssiRatio = 0; } else { RssiRatio = (40-(-ldBm-50))*4000/40; } pDevice->scStatistic.SignalStren = RssiRatio/40; pDevice->scStatistic.LinkQuality = (RssiRatio+TxOkRatio+RxOkRatio)/100;} pDevice->scStatistic.RxFcsErrCnt = 0; pDevice->scStatistic.RxOkCnt = 0; pDevice->scStatistic.TxFailCount = 0; pDevice->scStatistic.TxNoRetryOkCount = 0; pDevice->scStatistic.TxRetryOkCount = 0; return;}#endifVOIDBSSvClearAnyBSSJoinRecord ( IN HANDLE hDeviceContext ){ PSDevice pDevice = (PSDevice)hDeviceContext; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); UINT ii; for (ii = 0; ii < MAX_BSS_NUM; ii++) { pMgmt->sBSSList[ii].bSelected = FALSE; } return;}VOID s_vCheckPreEDThreshold( IN HANDLE hDeviceContext ){ PSDevice pDevice = (PSDevice)hDeviceContext; PKnownBSS pBSSList = NULL; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) || ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) { pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, (PWLAN_IE_SSID)pMgmt->abyCurrSSID); if (pBSSList != NULL) { pDevice->byBBPreEDRSSI = (BYTE) (~(pBSSList->ldBmAverRange) + 1); BBvUpdatePreEDThreshold(pDevice, FALSE); } } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -