// Description: Get RSNIE in parsing EAPOL-key packet. // Output: OCTET_STRING: RSNIE string. // Modify: Annie, 2005-07-11 // Reference: PacketGetElement(), which is only used for management frame. // In fact, this two function should be merged and reused. <AnnieTodo> // OCTET_STRING EAPOLkeyGetRSNIE( IN OCTET_STRING eapolkeypkt, IN ELEMENT_ID ID ) { u2Byte offset; //u2Byte length = eapolkeypkt.Length; OCTET_STRING ret={0,0}; u1Byte WPATag[] = {0x00, 0x50, 0xf2, 0x01}; u1Byte WPA2Tag[] = {0x00, 0x0f, 0xac}; u1Byte temp; offset = 95; temp = eapolkeypkt.Octet[offset]; if( (temp==ID) && (!PlatformCompareMemory(eapolkeypkt.Octet+offset+2, WPATag, sizeof(WPATag) )) ) { ret.Length = eapolkeypkt.Octet[offset+1]; // RSNIE header ret.Octet = eapolkeypkt.Octet + offset +2; // RSNIE Length field } if( (temp==ID) && (!PlatformCompareMemory(eapolkeypkt.Octet+offset+4, WPA2Tag, sizeof(WPA2Tag) )) ) { ret.Length = eapolkeypkt.Octet[offset+1]; // RSNIE header ret.Octet = eapolkeypkt.Octet + offset +2; // RSNIE Length field } RT_TRACE(COMP_AUTHENTICATOR, DBG_LOUD, ("PacketGetRSNIE(): Length=%d\n", ret.Length )); return ret; }
bool HTIOTActIsDisableMCSTwoSpatialStream(struct ieee80211_device* ieee) { bool retValue = false; #ifdef TODO // Apply for 819u only //#if (HAL_CODE_BASE==RTL8192) //This rule only apply to Belkin(Ralink) AP if(IS_UNDER_11N_AES_MODE(Adapter)) { if((PlatformCompareMemory(PeerMacAddr, BELKINF5D8233V1_RALINK, 3)==0) || (PlatformCompareMemory(PeerMacAddr, PCI_RALINK, 3)==0) || (PlatformCompareMemory(PeerMacAddr, EDIMAX_RALINK, 3)==0)) { //Set True to disable this function. Disable by default, Emily, 2008.04.23 retValue = false; } } //#endif #endif #if 1 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo; if(ieee->is_ap_in_wep_tkip && ieee->is_ap_in_wep_tkip(ieee->dev)) { if( (pHTInfo->IOTPeer != HT_IOT_PEER_ATHEROS) && (pHTInfo->IOTPeer != HT_IOT_PEER_UNKNOWN) && (pHTInfo->IOTPeer != HT_IOT_PEER_MARVELL) ) retValue = true; } #endif return retValue; }
bool HTIOTActIsDisableMCSTwoSpatialStream(struct ieee80211_device* ieee) { bool retValue = false; #ifdef TODO if(IS_UNDER_11N_AES_MODE(Adapter)) { if((PlatformCompareMemory(PeerMacAddr, BELKINF5D8233V1_RALINK, 3)==0) || (PlatformCompareMemory(PeerMacAddr, PCI_RALINK, 3)==0) || (PlatformCompareMemory(PeerMacAddr, EDIMAX_RALINK, 3)==0)) { retValue = false; } } #endif #if 1 PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo; if(ieee->is_ap_in_wep_tkip && ieee->is_ap_in_wep_tkip(ieee->dev)) { if( (pHTInfo->IOTPeer != HT_IOT_PEER_ATHEROS) && (pHTInfo->IOTPeer != HT_IOT_PEER_UNKNOWN) && (pHTInfo->IOTPeer != HT_IOT_PEER_MARVELL) ) retValue = true; } #endif return retValue; }
// // Description: // Determine the packet type of the action frame. // Argument: // [in] posMpdu - // The full 802.11 packet. // Return: // If this packet is determined successfully, return the ACT_PKT_xxx. // If this function cannot recognize this packet, return ACT_PKT_TYPE_UNKNOWN. // Remark: // It checks the category, action field (if there is such one) and OUI information to determine the type. // Do not input non-action frame to this function and it doesn't check if this packet is action frame. // By Bruce, 2012-03-09. // ACT_PKT_TYPE PacketGetActionFrameType( IN POCTET_STRING posMpdu ) { u4Byte idx = 0; if(posMpdu->Length <= sMacHdrLng) { RT_TRACE_F(COMP_DBG, DBG_WARNING, ("[WARNING] Invalid length (%d) for this packet!\n", posMpdu->Length)); return ACT_PKT_TYPE_UNKNOWN; } //Retrieve the table and check the patterns for(idx = 0; ACT_PKT_TYPE_UNKNOWN != (ACT_PKT_TYPE)(PktActPatternsMap[idx].PktType); idx ++) { // Packet length mismatch if((posMpdu->Length - sMacHdrLng) < PktActPatternsMap[idx].PatternLen) continue; // Compare pattern if(0 == PlatformCompareMemory(Frame_FrameBody(*posMpdu), PktActPatternsMap[idx].Pattern, PktActPatternsMap[idx].PatternLen)) { return (ACT_PKT_TYPE)(PktActPatternsMap[idx].PktType); } } return ACT_PKT_TYPE_UNKNOWN; }
BOOLEAN p2psvc_MatchSvcNameHash( IN PP2PSVC_REQ_INFO_ENTRY pInfoEntry, IN POCTET_STRING posSvcNameHash ) { BOOLEAN bMatch = FALSE; PRT_OBJECT_HEADER pSvcNameHashObj = NULL; u4Byte nHashes = posSvcNameHash->Length / 6; u4Byte iterReqHash = 0; if(NULL == (pSvcNameHashObj = P2PSvc_GetParam(&pInfoEntry->objList, P2PSVC_OBJ_HDR_ID_DATA_SVC_NAME_HASH, 0))) {// shall not happen since we have validated when set this req return FALSE; } RT_PRINT_DATA(COMP_P2P, DBG_TRACE, "adv svc hash:\n", pSvcNameHashObj->Value, pSvcNameHashObj->Length); for(iterReqHash = 0; iterReqHash < nHashes; iterReqHash++) { if(0 == PlatformCompareMemory(posSvcNameHash->Octet + (6 * iterReqHash), pSvcNameHashObj->Value, 6)) { RT_PRINT_DATA(COMP_P2P, DBG_TRACE, "Match svc-name-hash:\n", pSvcNameHashObj->Value, pSvcNameHashObj->Length); bMatch = TRUE; break; } } return bMatch; }
RT_STATUS GAS_OnInitReq( IN PADAPTER pAdapter, IN PRT_RFD pRfd, IN POCTET_STRING posMpdu ) { RT_STATUS RtStatus = RT_STATUS_SUCCESS; pu1Byte pOUI = NULL; FunctionIn(COMP_MLME); PlatformIndicateActionFrame(pAdapter, (PVOID)posMpdu); pOUI = Frame_GAS_QueryReq_OUI(*posMpdu); RT_PRINT_DATA(COMP_MLME, DBG_LOUD, ("GAS Initial request: "), pOUI, 3); if( PlatformCompareMemory(pOUI, WFA_OUI, SIZE_OUI) == 0 ) { pOUI = Frame_GAS_QueryReq_Type(*posMpdu); if(0x09 == *pOUI) P2P_OnSDReq(pAdapter, pRfd, posMpdu); } else { RT_TRACE(COMP_MLME, DBG_WARNING, ("No matched OUI: %2x:%2x:%2x\n", pOUI[0], pOUI[1], pOUI[2])); } FunctionOut(COMP_MLME); return RtStatus; }
RT_STATUS GAS_OnComebackRsp( IN PADAPTER pAdapter, IN PRT_RFD pRfd, IN POCTET_STRING posMpdu ) { RT_STATUS RtStatus = RT_STATUS_SUCCESS; pu1Byte pOUI = NULL; FunctionIn(COMP_MLME); PlatformIndicateActionFrame(pAdapter, (PVOID)posMpdu); pOUI = Frame_GAS_ComebackRsp_OUI(*posMpdu); if( PlatformCompareMemory(pOUI, WFA_OUI, SIZE_OUI) == 0 ) { pOUI = Frame_GAS_ComebackRsp_Type(*posMpdu); if(0x09 == *pOUI) P2P_OnSDComebackRsp(pAdapter, pRfd, posMpdu); } else { RT_TRACE(COMP_MLME, DBG_WARNING, ("No matched OUI: %2x:%2x:%2x\n", pOUI[0], pOUI[1], pOUI[2])); } FunctionOut(COMP_MLME); return RtStatus; }
BOOLEAN EqualOS( IN OCTET_STRING os1, IN OCTET_STRING os2 ) { if( os1.Length!=os2.Length ) return FALSE; if( os1.Length==0 ) return FALSE; return (PlatformCompareMemory(os1.Octet,os2.Octet,os1.Length)==0) ? TRUE:FALSE; }
s4Byte ODM_CompareMemory( IN PDM_ODM_T pDM_Odm, IN PVOID pBuf1, IN PVOID pBuf2, IN u4Byte length ) { #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) return memcmp(pBuf1,pBuf2,length); #elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) return _rtw_memcmp(pBuf1,pBuf2,length); #elif(DM_ODM_SUPPORT_TYPE & ODM_MP) return PlatformCompareMemory(pBuf1,pBuf2,length); #endif }
BOOLEAN CompareSSID( pu1Byte ssidbuf1, u2Byte ssidlen1, pu1Byte ssidbuf2, u2Byte ssidlen2 ) { if(ssidlen1 == ssidlen2) { if((ssidlen1 == 0) || ( PlatformCompareMemory(ssidbuf1, ssidbuf2, ssidlen1) == 0 )) return TRUE; } return FALSE; }
BOOLEAN p2psvc_MatchSvcNameHash_org_wi_fi_wfds( IN POCTET_STRING posSvcNameHash ) { BOOLEAN bMatched = FALSE; u4Byte nHashes = posSvcNameHash->Length / 6; u4Byte iterReqHash = 0; for(iterReqHash = 0; iterReqHash < nHashes; iterReqHash++) { if(0 == PlatformCompareMemory(posSvcNameHash->Octet + (6 * iterReqHash), gP2PSVC_NameHashTab[0].hash, 6)) {// check if it is prefix search bMatched = TRUE; break; } } return bMatched; }
// // Description: // Determine the packet type of the encapsulated data frame. // Argument: // [in] posDataContent - // The full data content after 802.11 header(including Qos + Security header + HC control header). // It should be the header of LLC. // Return: // If this packet is determined successfully, return the ENCAP_DATA_PKT_xxx. // If this function cannot recognize this packet, return ENCAP_DATA_PKT_UNKNOWN. // Remark: // It checks the LLC/SNAP header, and the following patters. // This function does not check the security or any 802.11 condition. // By Bruce, 2012-03-23. // ENCAP_DATA_PKT_TYPE PacketGetEncapDataFrameType( IN POCTET_STRING posDataContent ) { u4Byte idx = 0; //Retrieve the table and check the patterns for(idx = 0; ENCAP_DATA_PKT_UNKNOWN != (ACT_PKT_TYPE)(PktEncapDataPatternsMap[idx].PktType); idx ++) { // Packet length mismatch if(posDataContent->Length < PktEncapDataPatternsMap[idx].PatternLen) continue; // Compare pattern if(0 == PlatformCompareMemory(posDataContent->Octet, PktEncapDataPatternsMap[idx].Pattern, PktEncapDataPatternsMap[idx].PatternLen)) { return (ENCAP_DATA_PKT_TYPE)(PktEncapDataPatternsMap[idx].PktType); } } return ENCAP_DATA_PKT_UNKNOWN; }
BOOLEAN ODM_PathDiversityBeforeLink92C( //IN PADAPTER Adapter IN PDM_ODM_T pDM_Odm ) { #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM) PADAPTER Adapter = pDM_Odm->Adapter; HAL_DATA_TYPE* pHalData = NULL; PMGNT_INFO pMgntInfo = NULL; //pSWAT_T pDM_SWAT_Table = &Adapter->DM_SWAT_Table; pPD_T pDM_PDTable = NULL; s1Byte Score = 0; PRT_WLAN_BSS pTmpBssDesc; PRT_WLAN_BSS pTestBssDesc; u1Byte target_chnl = 0; u2Byte index; if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413 { // The ODM structure is not initialized. return FALSE; } pHalData = GET_HAL_DATA(Adapter); pMgntInfo = &Adapter->MgntInfo; pDM_PDTable = &Adapter->DM_PDTable; // Condition that does not need to use path diversity. if((!(pHalData->CVID_Version==VERSION_1_BEFORE_8703B && IS_92C_SERIAL(pHalData->VersionID))) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest ) { RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): No PathDiv Mechanism before link.\n")); return FALSE; } // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF. PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK); if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect) { PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK); RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): RFChangeInProgress(%x), eRFPowerState(%x)\n", pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState)); //pDM_SWAT_Table->SWAS_NoLink_State = 0; pDM_PDTable->PathDiv_NoLink_State = 0; return FALSE; } else { PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK); } //1 Run AntDiv mechanism "Before Link" part. //if(pDM_SWAT_Table->SWAS_NoLink_State == 0) if(pDM_PDTable->PathDiv_NoLink_State == 0) { //1 Prepare to do Scan again to check current antenna state. // Set check state to next step. //pDM_SWAT_Table->SWAS_NoLink_State = 1; pDM_PDTable->PathDiv_NoLink_State = 1; // Copy Current Scan list. Adapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc; PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC); // Switch Antenna to another one. if(pDM_PDTable->DefaultRespPath == 0) { PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x05); // TRX path = PathB odm_SetRespPath_92C(Adapter, 1); pDM_PDTable->OFDMTXPath = 0xFFFFFFFF; pDM_PDTable->CCKTXPath = 0xFFFFFFFF; } else { PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x00); // TRX path = PathA odm_SetRespPath_92C(Adapter, 0); pDM_PDTable->OFDMTXPath = 0x0; pDM_PDTable->CCKTXPath = 0x0; } #if 0 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna; pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A; RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B")); //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna); pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8)); PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860); #endif // Go back to scan function again. RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Scan one more time\n")); pMgntInfo->ScanStep=0; target_chnl = odm_SwAntDivSelectScanChnl(Adapter); odm_SwAntDivConstructScanChnl(Adapter, target_chnl); PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5); return TRUE; } else { //1 ScanComple() is called after antenna swiched. //1 Check scan result and determine which antenna is going //1 to be used. for(index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++) { pTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]); pTestBssDesc = &(pMgntInfo->bssDesc[index]); if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0) { RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\n")); continue; } if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower) { RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\n")); RT_PRINT_STR(COMP_INIT, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen); RT_TRACE(COMP_INIT, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower)); Score++; PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS)); } else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower) { RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\n")); RT_PRINT_STR(COMP_INIT, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen); RT_TRACE(COMP_INIT, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower)); Score--; } } if(pMgntInfo->NumBssDesc!=0 && Score<=0) { RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath)); //pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna; } else { RT_TRACE(COMP_INIT, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath)); if(pDM_PDTable->DefaultRespPath == 0) { pDM_PDTable->OFDMTXPath = 0xFFFFFFFF; pDM_PDTable->CCKTXPath = 0xFFFFFFFF; odm_SetRespPath_92C(Adapter, 1); } else { pDM_PDTable->OFDMTXPath = 0x0; pDM_PDTable->CCKTXPath = 0x0; odm_SetRespPath_92C(Adapter, 0); } PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x01); // RX path = PathAB //pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna; //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna); //pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8)); //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860); } // Check state reset to default and wait for next time. //pDM_SWAT_Table->SWAS_NoLink_State = 0; pDM_PDTable->PathDiv_NoLink_State = 0; return FALSE; } #else return FALSE; #endif }
// // Description: // Parse the IE elements and extract the interested element for return. // Arguments: // IEs - // The IE elements to be retrived. // ID - // The referenced element ID in the IEs to be extracted. // OUISubType - // Vendor specified OUI to be determined in the element. // Revised by Bruce, 2009-02-12. // OCTET_STRING IEGetElement( IN OCTET_STRING IEs, IN ELEMENT_ID ID, IN OUI_TYPE OUIType, IN u1Byte OUISubType ) { u2Byte offset = 0; u2Byte length = IEs.Length; OCTET_STRING ret={0,0}; // used for return u1Byte temp; BOOLEAN bIEMatched = FALSE; OCTET_STRING osOuiSub; u1Byte MaxElementLen; static u1Byte WPATag[] = {0x00, 0x50, 0xf2, 0x01}; static u1Byte WMMTag[] = {0x00, 0x50, 0xf2, 0x02}; // Added by Annie, 2005-11-08. static u1Byte Simpleconf[]={0x00, 0x50, 0xF2, 0x04}; //added by David, 2006-10-02 static u1Byte CcxRmCapTag[] = {0x00, 0x40, 0x96, 0x01}; // For CCX 2 S36, Radio Management Capability element, 2006.05.15, by rcnjko. static u1Byte CcxVerNumTag[] = {0x00, 0x40, 0x96, 0x03}; // For CCX 2 S38, WLAN Device Version Number element. Annie, 2006-08-20. static u1Byte WPA2GTKTag[] = {0x00, 0x0f, 0xac, 0x01}; // For MAC GTK data IE by CCW static u1Byte CcxTsmTag[] = {0x00, 0x40, 0x96, 0x07}; // For CCX4 S56, Traffic Stream Metrics, 070615, by rcnjko. static u1Byte CcxSSIDLTag[] = {0x00, 0x50, 0xf2, 0x05}; static u1Byte RealtekTurboModeTag[] = {0x00, 0xE0, 0x4C, 0x01}; // Added by Annie, 2005-12-27 static u1Byte RealtekAggModeTag[] = {0x00, 0xe0, 0x4c, 0x02}; static u1Byte RealtekBTIOTModeTag[] = {0x00, 0xe0, 0x4c, 0x03}; // Add for BT IOT static u1Byte RealtekBtHsTag[] = {0x00, 0xe0, 0x4c, 0x04}; // Add for BT HS static u1Byte Epigram[] = {0x00,0x90,0x4c}; static u1Byte EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x033}; // For 11n EWC definition, 2007.07.17, by Emily static u1Byte EWC11NHTInfo[] = {0x00, 0x90, 0x4c, 0x034}; // For 11n EWC definition, 2007.07.17, by Emily static u1Byte Epigram11ACCap[] = {0x00, 0x90, 0x4c, 0x04, 0x08, 0xBF, 0x0C}; // For 11ac Epigram definition static u1Byte BroadcomCap_1[] = {0x00, 0x10, 0x18}; static u1Byte BroadcomCap_2[] = {0x00, 0x0a, 0xf7}; static u1Byte BroadcomCap_3[] = {0x00, 0x05, 0xb5}; static u1Byte BroadcomLinksysE4200Cap_1[] = {0x00, 0x10, 0x18,0x02,0x00,0xf0,0x3c}; // for Linksys E4200 static u1Byte BroadcomLinksysE4200Cap_2[] = {0x00, 0x10, 0x18,0x02,0x01,0xf0,0x3c}; static u1Byte BroadcomLinksysE4200Cap_3[] = {0x00, 0x10, 0x18,0x02,0x00,0xf0,0x2c}; static u1Byte CiscoCap[] = {0x00, 0x40, 0x96}; // For Cisco AP IOT issue, by Emily static u1Byte MeruCap[] = {0x00, 0x0c, 0xe6}; static u1Byte RalinkCap[] ={0x00, 0x0c, 0x43}; static u1Byte AtherosCap_1[] = {0x00,0x03,0x7F}; static u1Byte AtherosCap_2[] = {0x00,0x13,0x74}; static u1Byte MarvellCap[] = {0x00, 0x50, 0x43}; static u1Byte AirgoCap[] = {0x00, 0x0a, 0xf5}; static u1Byte CcxSFA[] = {0x00, 0x40, 0x96, 0x14}; static u1Byte CcxDiagReqReason[] = {0x00, 0x40, 0x96, 0x12}; static u1Byte CcxMHDR[] = {0x00, 0x40, 0x96, 0x10}; static u1Byte P2P_OUI_WITH_TYPE[] = {0x50, 0x6F, 0x9A, WLAN_PA_VENDOR_SPECIFIC}; static u1Byte WFD_OUI_WITH_TYPE[] = {0x50, 0x6F, 0x9A, WFD_OUI_TYPE}; static u1Byte NAN_OUI_WITH_TYPE[] = {0x50, 0x6F, 0x9A, 0x13}; static u1Byte RealtekTDLSTag[] = {0x00, 0xe0, 0x4c, 0x03}; //Mix mode can't get DHCP in MacOS Driver. CCW revice offset 2008-04-15 //offset = 12; do { if( (offset + 2) >= length ) { return ret; } temp = IEs.Octet[offset]; // Get current Element ID. if( temp == ID ) { if( ID == EID_Vendor ) { // EID_Vendor(=0xDD=221): Vendor Specific, currently we have to consider WPA and WMM Information Element. switch(OUIType) { case OUI_SUB_WPA: FillOctetString(osOuiSub, WPATag, sizeof(WPATag)); break; case OUI_SUB_WPA2GTK: FillOctetString(osOuiSub, WPA2GTKTag, sizeof(WPA2GTKTag)); break; case OUI_SUB_CCX_TSM: FillOctetString(osOuiSub, CcxTsmTag, sizeof(CcxTsmTag)); break; case OUI_SUB_SSIDL: FillOctetString(osOuiSub, CcxSSIDLTag, sizeof(CcxSSIDLTag)); break; case OUI_SUB_WMM: FillOctetString(osOuiSub, WMMTag, sizeof(WMMTag)); break; case OUI_SUB_REALTEK_TURBO: FillOctetString(osOuiSub, RealtekTurboModeTag, sizeof(RealtekTurboModeTag)); break; case OUI_SUB_REALTEK_AGG: FillOctetString(osOuiSub, RealtekAggModeTag, sizeof(RealtekAggModeTag)); break; case OUI_SUB_SimpleConfig: FillOctetString(osOuiSub, Simpleconf, sizeof(Simpleconf)); break; case OUI_SUB_CCX_RM_CAP: FillOctetString(osOuiSub, CcxRmCapTag, sizeof(CcxRmCapTag)); break; case OUI_SUB_CCX_VER_NUM: FillOctetString(osOuiSub, CcxVerNumTag, sizeof(CcxVerNumTag)); break; case OUI_SUB_EPIG_IE: FillOctetString(osOuiSub, Epigram, sizeof(Epigram)); break; case OUI_SUB_11N_EWC_HT_CAP: FillOctetString(osOuiSub, EWC11NHTCap, sizeof(EWC11NHTCap)); break; case OUI_SUB_11N_EWC_HT_INFO: FillOctetString(osOuiSub, EWC11NHTInfo, sizeof(EWC11NHTInfo)); break; case OUI_SUB_11AC_EPIG_VHT_CAP: FillOctetString(osOuiSub, Epigram11ACCap, sizeof(Epigram11ACCap)); break; case OUI_SUB_BROADCOM_IE_1: FillOctetString(osOuiSub, BroadcomCap_1, sizeof(BroadcomCap_1)); break; case OUI_SUB_BROADCOM_IE_2: FillOctetString(osOuiSub, BroadcomCap_2, sizeof(BroadcomCap_2)); break; case OUI_SUB_BROADCOM_IE_3: FillOctetString(osOuiSub, BroadcomCap_3, sizeof(BroadcomCap_3)); break; case OUI_SUB_BROADCOM_LINKSYSE4200_IE_1: FillOctetString(osOuiSub, BroadcomLinksysE4200Cap_1, sizeof(BroadcomLinksysE4200Cap_1)); break; case OUI_SUB_BROADCOM_LINKSYSE4200_IE_2: FillOctetString(osOuiSub, BroadcomLinksysE4200Cap_2, sizeof(BroadcomLinksysE4200Cap_2)); break; case OUI_SUB_BROADCOM_LINKSYSE4200_IE_3: FillOctetString(osOuiSub, BroadcomLinksysE4200Cap_3, sizeof(BroadcomLinksysE4200Cap_3)); break; case OUI_SUB_CISCO_IE: FillOctetString(osOuiSub, CiscoCap, sizeof(CiscoCap)); break; case OUI_SUB_MERU_IE: FillOctetString(osOuiSub, MeruCap, sizeof(MeruCap)); break; case OUI_SUB_RALINK_IE: FillOctetString(osOuiSub, RalinkCap, sizeof(RalinkCap)); break; case OUI_SUB_ATHEROS_IE_1: FillOctetString(osOuiSub, AtherosCap_1, sizeof(AtherosCap_1)); break; case OUI_SUB_ATHEROS_IE_2: FillOctetString(osOuiSub, AtherosCap_2, sizeof(AtherosCap_2)); break; case OUI_SUB_MARVELL: FillOctetString(osOuiSub, MarvellCap, sizeof(MarvellCap)); break; case OUI_SUB_AIRGO: FillOctetString(osOuiSub, AirgoCap, sizeof(AirgoCap)); break; case OUI_SUB_CCX_SFA: FillOctetString(osOuiSub, CcxSFA, sizeof(CcxSFA)); break; case OUI_SUB_CCX_DIAG_REQ_REASON: FillOctetString(osOuiSub, CcxDiagReqReason, sizeof(CcxDiagReqReason)); break; case OUI_SUB_CCX_MFP_MHDR: FillOctetString(osOuiSub, CcxMHDR, sizeof(CcxMHDR)); break; case OUI_SUB_WIFI_DIRECT: FillOctetString(osOuiSub, P2P_OUI_WITH_TYPE, sizeof(P2P_OUI_WITH_TYPE)); break; case OUI_SUB_WIFI_DISPLAY: FillOctetString(osOuiSub, WFD_OUI_WITH_TYPE, sizeof(WFD_OUI_WITH_TYPE)); break; case OUI_SUB_NAN: FillOctetString(osOuiSub, NAN_OUI_WITH_TYPE, sizeof(NAN_OUI_WITH_TYPE)); break; case OUI_SUB_REALTEK_TDLS: FillOctetString(osOuiSub, RealtekTDLSTag, sizeof(RealtekTDLSTag)); break; case OUI_SUB_REALTEK_BT_IOT : FillOctetString(osOuiSub, RealtekBTIOTModeTag, sizeof(RealtekBTIOTModeTag)); break; case OUI_SUB_REALTEK_BT_HS: FillOctetString(osOuiSub, RealtekBtHsTag, sizeof(RealtekBtHsTag)); break; default: FillOctetString(osOuiSub, NULL, 0); break; } if( osOuiSub.Length > 0 && (length >= (offset + 2 + osOuiSub.Length)) ) // Prevent malicious attack. { if( PlatformCompareMemory( (IEs.Octet + offset + 2), osOuiSub.Octet, osOuiSub.Length) == 0 ) { // OUI field and subtype field are matched bIEMatched = TRUE; // // 060801, Isaiah: // [UAPSD Logo] Marvel AP has similar element, [DD 07 00 50 F2 02 05 01 24]. // if( (OUI_SUB_WMM == OUIType) && (length >= (offset + 2 + osOuiSub.Length + 1)) ) { // WMM-IE Matched! u1Byte WmmSubtype = *(IEs.Octet+offset+2+sizeof(WMMTag)); if(WmmSubtype != OUISubType) bIEMatched = FALSE; } } } } else { // Other ID: Matched! bIEMatched = TRUE; } } if(bIEMatched && (length >= offset + 2 + IEs.Octet[offset+1]) ) // Prevent malicious attack. { // IE matched! break to return. // // Get the length of current IE. // We also perform length checking here to pervent malicious attack. // switch(ID) { case EID_SsId: MaxElementLen = MAX_SSID_LEN; break; case EID_SupRates: MaxElementLen = 12; //Because Belkin 11AC on g Mode only has 12 Octets in this IE break; case EID_FHParms: MaxElementLen = MAX_FH_PARM_LEN; break; case EID_DSParms: MaxElementLen = MAX_DS_PARM_LEN; break; case EID_CFParms: MaxElementLen = MAX_CF_PARM_LEN; break; case EID_Tim: MaxElementLen = MAX_TIM_PARM_LEN; break; case EID_IbssParms: MaxElementLen = MAX_IBSS_PARM_LEN; break; case EID_QBSSLoad: MaxElementLen = MAX_QBSS_LOAD_LEN; break; case EID_EDCAParms: MaxElementLen = MAX_EDCA_PARM_LEN; break; case EID_TSpec: MaxElementLen = MAX_TSPEC_LEN; break; case EID_Schedule: MaxElementLen = MAX_SCHEDULE_LEN; break; case EID_Ctext: MaxElementLen = MAX_CTEXT_LEN; break; case EID_ERPInfo: MaxElementLen = MAX_ERP_INFO_LEN; break; case EID_TSDelay: MaxElementLen = MAX_TS_DELAY_LEN; break; case EID_TCLASProc: MaxElementLen = MAX_TC_PROC_LEN; break; case EID_HTCapability: MaxElementLen = MAX_HT_CAP_LEN; break; case EID_HTInfo: MaxElementLen = MAX_HT_INFO_LEN; break; case EID_QoSCap: MaxElementLen = MAX_QOS_CAP; break; case EID_ExtSupRates: MaxElementLen = MAX_EXT_SUP_RATE_LEN; break; case EID_WAPI: MaxElementLen = MAX_WAPI_IE_LEN; break; case EID_LinkIdentifier: MaxElementLen = MAX_LINKID_LEN; break; case EID_SupportedChannels: MaxElementLen = MAX_SUPCHNL_LEN; break; case EID_SupRegulatory: MaxElementLen = MAX_SUPREGULATORY_LEN; break; case EID_SecondaryChnlOffset: MaxElementLen = MAX_SECONDARYOFFSET_LEN; break; case EID_ChnlSwitchTimeing: MaxElementLen = MAX_CHNLSWITCHTIMING_LEN; break; case EID_VHTCapability: MaxElementLen = MAX_VHT_CAP_LEN; break; default: MaxElementLen = MAX_IE_LEN; break; } ret.Length = (IEs.Octet[offset+1] <= MaxElementLen) ? IEs.Octet[offset+1] : MaxElementLen; // // Get pointer to the first byte (ElementID and length are not included). // ret.Octet = IEs.Octet + offset + 2; break; } else { // Different. temp = IEs.Octet[offset+1]; // Get the length of current IE. offset += (temp+2); // Jump to the position of length of next IE. (2 byte is for the ID and length field.) } }while(1); return ret; }
BOOLEAN ODM_SwAntDivCheckBeforeLink( IN PVOID pDM_VOID ) { #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM) PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PADAPTER Adapter = pDM_Odm->Adapter; HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter); PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable; s1Byte Score = 0; PRT_WLAN_BSS pTmpBssDesc, pTestBssDesc; u1Byte power_target = 10, power_target_L = 9, power_target_H = 16; u1Byte tmp_power_diff = 0,power_diff = 0,avg_power_diff = 0,max_power_diff = 0,min_power_diff = 0xff; u2Byte index, counter = 0; static u1Byte ScanChannel; u8Byte tStamp_diff = 0; u4Byte tmp_SWAS_NoLink_BK_Reg948; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ANTA_ON = (( %d )) , ANTB_ON = (( %d )) \n",pDM_Odm->DM_SWAT_Table.ANTA_ON ,pDM_Odm->DM_SWAT_Table.ANTB_ON )); //if(HP id) { if(pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult==TRUE && pDM_Odm->SupportICType == ODM_RTL8723B) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("8723B RSSI-based Antenna Detection is done\n")); return FALSE; } if(pDM_Odm->SupportICType == ODM_RTL8723B) { if(pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 == 0xff) pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch ); } } if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413 { // The ODM structure is not initialized. return FALSE; } // Retrieve antenna detection registry info, added by Roger, 2012.11.27. if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter)) { return FALSE; } else { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Antenna Detection: RSSI Method\n")); } // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF. PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK); if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect) { PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\n", pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState)); pDM_SWAT_Table->SWAS_NoLink_State = 0; return FALSE; } else { PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK); } ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("pDM_SWAT_Table->SWAS_NoLink_State = %d\n", pDM_SWAT_Table->SWAS_NoLink_State)); //1 Run AntDiv mechanism "Before Link" part. if(pDM_SWAT_Table->SWAS_NoLink_State == 0) { //1 Prepare to do Scan again to check current antenna state. // Set check state to next step. pDM_SWAT_Table->SWAS_NoLink_State = 1; // Copy Current Scan list. pMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc; PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC); // Go back to scan function again. ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Scan one more time\n")); pMgntInfo->ScanStep=0; pMgntInfo->bScanAntDetect = TRUE; ScanChannel = odm_SwAntDivSelectScanChnl(Adapter); if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821)) { if(pDM_FatTable->RxIdleAnt == MAIN_ANT) ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); else ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); if(ScanChannel == 0) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT")); if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode)) { pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); } else { pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); } return FALSE; } ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT"))); } else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723B)) { if(pDM_Odm->SupportICType == ODM_RTL8192C) { // Switch Antenna to another one. pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna; pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT; pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8)); ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860); } else if(pDM_Odm->SupportICType == ODM_RTL8723B) { // Switch Antenna to another one. tmp_SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch ); if( (pDM_SWAT_Table->CurAntenna = MAIN_ANT) && (tmp_SWAS_NoLink_BK_Reg948==0x200)) { ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, 0x280); ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x1); pDM_SWAT_Table->CurAntenna = AUX_ANT; } else { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Reg[948]= (( %x )) was in wrong state\n", tmp_SWAS_NoLink_BK_Reg948 )); return FALSE; } ODM_StallExecution(10); } ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Change to (( %s-ant)) for testing.\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX")); } odm_SwAntDivConstructScanChnl(Adapter, ScanChannel); PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5); return TRUE; } else //pDM_SWAT_Table->SWAS_NoLink_State == 1 { //1 ScanComple() is called after antenna swiched. //1 Check scan result and determine which antenna is going //1 to be used. ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" tmpNumBssDesc= (( %d )) \n",pMgntInfo->tmpNumBssDesc));// debug for Dino for(index = 0; index < pMgntInfo->tmpNumBssDesc; index++) { pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1 pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2 if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n")); continue; } if(pDM_Odm->SupportICType != ODM_RTL8723B) { if(pTmpBssDesc->ChannelNumber == ScanChannel) { if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\n")); RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower)); Score++; PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS)); } else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\n")); RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower)); Score--; } else { if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000) { RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("The 2nd Antenna didn't get this AP\n\n")); } } } } else // 8723B { if(pTmpBssDesc->ChannelNumber == ScanChannel) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ChannelNumber == ScanChannel -> (( %d )) \n", pTmpBssDesc->ChannelNumber )); if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower) // Pow(Ant1) > Pow(Ant2) { counter++; tmp_power_diff=(u1Byte)(pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower); power_diff = power_diff + tmp_power_diff; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower)); ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf); ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf); //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("tmp_power_diff: (( %d)),max_power_diff: (( %d)),min_power_diff: (( %d)) \n", tmp_power_diff,max_power_diff,min_power_diff)); if(tmp_power_diff > max_power_diff) max_power_diff=tmp_power_diff; if(tmp_power_diff < min_power_diff) min_power_diff=tmp_power_diff; //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("max_power_diff: (( %d)),min_power_diff: (( %d)) \n",max_power_diff,min_power_diff)); PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS)); } else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower) // Pow(Ant1) < Pow(Ant2) { counter++; tmp_power_diff=(u1Byte)(pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower); power_diff = power_diff + tmp_power_diff; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower)); ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf); ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf); if(tmp_power_diff > max_power_diff) max_power_diff=tmp_power_diff; if(tmp_power_diff < min_power_diff) min_power_diff=tmp_power_diff; } else // Pow(Ant1) = Pow(Ant2) { if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp) // Stamp(Ant1) < Stamp(Ant2) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000)); if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000) { counter++; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower)); ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf); ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf); min_power_diff = 0; } } else { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Error !!!]: Time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000)); } } } } } if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821)) { if(pMgntInfo->NumBssDesc!=0 && Score<0) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); } else { ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT")); if(pDM_FatTable->RxIdleAnt == MAIN_ANT) ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT); else ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT); } if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode)) { pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); } else { pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); } } else if(pDM_Odm->SupportICType == ODM_RTL8723B) { if(counter == 0) { if(pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec == FALSE) { pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = TRUE; pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Counter=(( 0 )) , [[ Cannot find any AP with Aux-ant ]] -> Scan Target-channel again \n")); //3 [ Scan again ] odm_SwAntDivConstructScanChnl(Adapter, ScanChannel); PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5); return TRUE; } else// Pre_Aux_FailDetec == TRUE { //2 [ Single Antenna ] pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE; pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Counter=(( 0 )) , [[ Still cannot find any AP ]] \n")); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n")); } pDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter++; } else { pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE; if(counter==3) { avg_power_diff = ((power_diff-max_power_diff - min_power_diff)>>1)+ ((max_power_diff + min_power_diff)>>2); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: (( %d )) , power_diff: (( %d )) \n", counter, power_diff)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ counter==3 ] Modified avg_power_diff: (( %d )) , max_power_diff: (( %d )) , min_power_diff: (( %d )) \n", avg_power_diff,max_power_diff, min_power_diff)); } else if(counter>=4) { avg_power_diff=(power_diff-max_power_diff - min_power_diff) / (counter - 2); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: (( %d )) , power_diff: (( %d )) \n", counter, power_diff)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ counter>=4 ] Modified avg_power_diff: (( %d )) , max_power_diff: (( %d )) , min_power_diff: (( %d )) \n", avg_power_diff,max_power_diff, min_power_diff)); } else//counter==1,2 { avg_power_diff=power_diff/counter; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("avg_power_diff: (( %d )) , counter: (( %d )) , power_diff: (( %d )) \n", avg_power_diff,counter, power_diff)); } //2 [ Retry ] if( (avg_power_diff >=power_target_L) && (avg_power_diff <=power_target_H) ) { pDM_Odm->DM_SWAT_Table.Retry_Counter++; if(pDM_Odm->DM_SWAT_Table.Retry_Counter<=3) { pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[[ Low confidence result ]] avg_power_diff= (( %d )) -> Scan Target-channel again ]] \n", avg_power_diff)); //3 [ Scan again ] odm_SwAntDivConstructScanChnl(Adapter, ScanChannel); PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5); return TRUE; } else { pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE; ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[[ Still Low confidence result ]] (( Retry_Counter > 3 )) \n")); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n")); } } //2 [ Dual Antenna ] else if( (pMgntInfo->NumBssDesc != 0) && (avg_power_diff < power_target_L) ) { pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE; if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE) { pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE; pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE; } ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n")); pDM_Odm->DM_SWAT_Table.Dual_Ant_Counter++; // set bt coexDM from 1ant coexDM to 2ant coexDM BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 2); //3 [ Init antenna diversity ] pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; ODM_AntDivInit(pDM_Odm); } //2 [ Single Antenna ] else if(avg_power_diff > power_target_H) { pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE; if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE) { pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE; pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE; //BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1); } ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n")); pDM_Odm->DM_SWAT_Table.Single_Ant_Counter++; } } //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("bResult=(( %d ))\n",pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Dual_Ant_Counter = (( %d )), Single_Ant_Counter = (( %d )) , Retry_Counter = (( %d )) , Aux_FailDetec_Counter = (( %d ))\n\n\n", pDM_Odm->DM_SWAT_Table.Dual_Ant_Counter,pDM_Odm->DM_SWAT_Table.Single_Ant_Counter,pDM_Odm->DM_SWAT_Table.Retry_Counter,pDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter)); //2 recover the antenna setting if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE) ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, (pDM_SWAT_Table->SWAS_NoLink_BK_Reg948)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("bResult=(( %d )), Recover Reg[948]= (( %x )) \n\n",pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult, pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 )); }
VOID IndicateRxReorderList( IN PADAPTER Adapter, IN PRX_TS_RECORD pTS, IN BOOLEAN bForced ) { PMGNT_INFO pMgntInfo = &Adapter->MgntInfo; PRT_HIGH_THROUGHPUT pHTInfo = pMgntInfo->pHTInfo; PRX_REORDER_ENTRY pReorderEntry = NULL; u2Byte index = 0; BOOLEAN bPktInBuf = FALSE; // PRT_RFD pRfdIndicateArray[REORDER_WIN_SIZE]; PRT_RFD *pRfdIndicateArray; PRT_GEN_TEMP_BUFFER pGenBuf; Adapter->rxReorderIndEnterCnt++; if(PlatformAtomicExchange(&Adapter->rxReorderRefCount, TRUE) == TRUE) { Adapter->rxReorderIndRejectCnt[0]++; RT_TRACE(COMP_INIT, DBG_LOUD, ("IndicateRxReorderList(): There is already another thread running by AtomicExchange, happened %d times!!!\n", Adapter->rxReorderIndRejectCnt[0])); return; } // Check if there is any other indication thread running. if(pTS->RxIndicateState == RXTS_INDICATE_PROCESSING) { PlatformAtomicExchange(&Adapter->rxReorderRefCount, FALSE); Adapter->rxReorderIndRejectCnt[1]++; RT_TRACE(COMP_INIT, DBG_LOUD, ("IndicateRxReorderList(): There is already another thread running by RXTS_INDICATE_PROCESSING, happened %d times!!!\n", Adapter->rxReorderIndRejectCnt[1])); return; } // Handling some condition for forced indicate case. if(bForced) { if(RTIsListEmpty(&pTS->RxPendingPktList)) { PlatformAtomicExchange(&Adapter->rxReorderRefCount, FALSE); Adapter->rxReorderIndRejectCnt[2]++; RT_TRACE(COMP_INIT, DBG_LOUD, ("IndicateRxReorderList(): There is already another thread running by ListEmpty, happened %d times!!!\n", Adapter->rxReorderIndRejectCnt[2])); return; } else { pReorderEntry = (PRX_REORDER_ENTRY)RTGetHeadList(&pTS->RxPendingPktList); pTS->RxIndicateSeq = pReorderEntry->SeqNum; } } Adapter->rxReorderIndAllowCnt++; pGenBuf = GetGenTempBuffer (Adapter, sizeof(PRT_RFD)*REORDER_WIN_SIZE); pRfdIndicateArray = (PRT_RFD *)pGenBuf->Buffer.Ptr; // Prepare indication list and indication. do{ // Check if there is any packet need indicate. while(!RTIsListEmpty(&pTS->RxPendingPktList)) { pReorderEntry = (PRX_REORDER_ENTRY)RTGetHeadList(&pTS->RxPendingPktList); if(!SN_LESS(pTS->RxIndicateSeq, pReorderEntry->SeqNum)) { // This protect buffer from overflow. if(index >= REORDER_WIN_SIZE) { RT_ASSERT(FALSE, ("IndicateRxReorderList(): Buffer overflow!! \n")); bPktInBuf = TRUE; break; } if(index > 0) { if(PlatformCompareMemory(pReorderEntry->pRfd->Address3,pRfdIndicateArray[index-1]->Address3,6) != 0) { bPktInBuf = TRUE; break; } } pReorderEntry = (PRX_REORDER_ENTRY)RTRemoveHeadList(&pTS->RxPendingPktList); if(SN_EQUAL(pReorderEntry->SeqNum, pTS->RxIndicateSeq)) pTS->RxIndicateSeq = (pTS->RxIndicateSeq + 1) % 4096; RT_TRACE(COMP_RX_REORDER, DBG_LOUD, ("RxReorderIndicatePacket(): Packets indication!! IndicateSeq: %d\n", pReorderEntry->SeqNum)); pRfdIndicateArray[index] = pReorderEntry->pRfd; index++; RTInsertTailList(&pMgntInfo->RxReorder_Unused_List, &pReorderEntry->List); } else { bPktInBuf = TRUE; break; } } // Handling pending timer. Set this timer to prevent from long time Rx buffering. if(index>0) { // Cancel previous pending timer. { PlatformCancelTimer(Adapter, &pTS->RxPktPendingTimer); // Set this as a lock to make sure that only one thread is indicating packet. pTS->RxIndicateState = RXTS_INDICATE_PROCESSING; } // Indicate packets RT_ASSERT((index<=REORDER_WIN_SIZE), ("RxReorderIndicatePacket(): Rx Reorder buffer full!! \n")); // Packets indication. DrvIFIndicatePackets(Adapter, pRfdIndicateArray, index); // Update local variables. //bPktInBuf = FALSE; index = 0; } else { break; } }while(TRUE); ReturnGenTempBuffer(Adapter, pGenBuf); // Release the indication lock and set to new indication step. if(bPktInBuf) { u1Byte set_penf_timer=FALSE; { if(pTS->RxIndicateState != RXTS_INDICATE_REORDER) set_penf_timer = TRUE; } if (set_penf_timer == TRUE) { // Set new pending timer. pTS->RxIndicateState = RXTS_INDICATE_REORDER; PlatformSetTimer(Adapter, &pTS->RxPktPendingTimer, pHTInfo->RxReorderPendingTime); } } else { pTS->RxIndicateState = RXTS_INDICATE_IDLE; } PlatformAtomicExchange(&Adapter->rxReorderRefCount, FALSE); }