static void ap_beacon_process( tpAniSirGlobal pMac, tANI_U8* pRxPacketInfo, tpSchBeaconStruct pBcnStruct, tpUpdateBeaconParams pBeaconParams, tpPESession psessionEntry) { tpSirMacMgmtHdr pMh = WDA_GET_RX_MAC_HEADER(pRxPacketInfo); tANI_U32 phyMode; tSirRFBand rfBand = SIR_BAND_UNKNOWN; //Get RF band from psessionEntry rfBand = psessionEntry->limRFBand; limGetPhyMode(pMac, &phyMode, psessionEntry); if(SIR_BAND_5_GHZ == rfBand) { if (psessionEntry->htCapability) { if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel) { //11a (non HT) AP overlaps or //HT AP with HT op mode as mixed overlaps. //HT AP with HT op mode as overlap legacy overlaps. if ((!pBcnStruct->HTInfo.present) || (eSIR_HT_OP_MODE_MIXED == pBcnStruct->HTInfo.opMode) || (eSIR_HT_OP_MODE_OVERLAP_LEGACY == pBcnStruct->HTInfo.opMode)) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(pMac->lim.gLimOverlap11aParams)); if (pMac->lim.gLimOverlap11aParams.numSta && !pMac->lim.gLimOverlap11aParams.protectionEnabled) { limEnable11aProtection(pMac, true, true, pBeaconParams,psessionEntry); } } //HT AP with HT20 op mode overlaps. else if(eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT == pBcnStruct->HTInfo.opMode) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(pMac->lim.gLimOverlapHt20Params)); if (pMac->lim.gLimOverlapHt20Params.numSta && !pMac->lim.gLimOverlapHt20Params.protectionEnabled) { limEnableHT20Protection(pMac, true, true, pBeaconParams,psessionEntry); } } } } } else if(SIR_BAND_2_4_GHZ == rfBand) { //We are 11G AP. if ((phyMode == WNI_CFG_PHY_MODE_11G) && (false == psessionEntry->htCapability)) { if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel) { if (((!(pBcnStruct->erpPresent)) && !(pBcnStruct->HTInfo.present))|| //if erp not present then 11B AP overlapping (pBcnStruct->erpPresent && (pBcnStruct->erpIEInfo.useProtection || pBcnStruct->erpIEInfo.nonErpPresent))) { #ifdef FEATURE_WLAN_ESE if( psessionEntry->isESEconnection ) { VOS_TRACE (VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, "%s: [INFOLOG]ESE 11g erpPresent=%d useProtection=%d nonErpPresent=%d", __func__, pBcnStruct->erpPresent, pBcnStruct->erpIEInfo.useProtection, pBcnStruct->erpIEInfo.nonErpPresent); } #endif limEnableOverlap11gProtection(pMac, pBeaconParams, pMh,psessionEntry); } } } // handling the case when HT AP has overlapping legacy BSS. else if(psessionEntry->htCapability) { if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel) { if (((!(pBcnStruct->erpPresent)) && !(pBcnStruct->HTInfo.present))|| //if erp not present then 11B AP overlapping (pBcnStruct->erpPresent && (pBcnStruct->erpIEInfo.useProtection || pBcnStruct->erpIEInfo.nonErpPresent))) { #ifdef FEATURE_WLAN_ESE if( psessionEntry->isESEconnection ) { VOS_TRACE (VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, "%s: [INFOLOG]ESE 11g erpPresent=%d useProtection=%d nonErpPresent=%d", __func__, pBcnStruct->erpPresent, pBcnStruct->erpIEInfo.useProtection, pBcnStruct->erpIEInfo.nonErpPresent); } #endif limEnableOverlap11gProtection(pMac, pBeaconParams, pMh,psessionEntry); } //11g device overlaps if (pBcnStruct->erpPresent && !(pBcnStruct->erpIEInfo.useProtection || pBcnStruct->erpIEInfo.nonErpPresent) && !(pBcnStruct->HTInfo.present)) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(psessionEntry->gLimOverlap11gParams)); if (psessionEntry->gLimOverlap11gParams.numSta && !psessionEntry->gLimOverlap11gParams.protectionEnabled) { limEnableHtProtectionFrom11g(pMac, true, true, pBeaconParams,psessionEntry); } } //ht device overlaps. //here we will check for HT related devices only which might need protection. //check for 11b and 11g is already done in the previous blocks. //so we will not check for HT operating mode as MIXED. if (pBcnStruct->HTInfo.present) { //if we are not already in mixed mode or legacy mode as HT operating mode //and received beacon has HT operating mode as legacy //then we need to enable protection from 11g station. //we don't need protection from 11b because if that's needed then our operating //mode would have already been set to legacy in the previous blocks. if(eSIR_HT_OP_MODE_OVERLAP_LEGACY == pBcnStruct->HTInfo.opMode) { if((eSIR_HT_OP_MODE_MIXED != pMac->lim.gHTOperMode) && (eSIR_HT_OP_MODE_OVERLAP_LEGACY != pMac->lim.gHTOperMode)) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(psessionEntry->gLimOverlap11gParams)); if (psessionEntry->gLimOverlap11gParams.numSta && !psessionEntry->gLimOverlap11gParams.protectionEnabled) { limEnableHtProtectionFrom11g(pMac, true, true, pBeaconParams,psessionEntry); } } } else if(eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT == pBcnStruct->HTInfo.opMode) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(psessionEntry->gLimOverlapHt20Params)); if (psessionEntry->gLimOverlapHt20Params.numSta && !psessionEntry->gLimOverlapHt20Params.protectionEnabled) { limEnableHT20Protection(pMac, true, true, pBeaconParams,psessionEntry); } } } } } } pMac->sch.gSchBcnIgnored++; }
static void ap_beacon_process( tpAniSirGlobal pMac, tANI_U8* pRxPacketInfo, tpSchBeaconStruct pBcnStruct, tpUpdateBeaconParams pBeaconParams, tpPESession psessionEntry) { tpSirMacMgmtHdr pMh = WDA_GET_RX_MAC_HEADER(pRxPacketInfo); tANI_U32 phyMode; tSirRFBand rfBand = SIR_BAND_UNKNOWN; rfBand = psessionEntry->limRFBand; limGetPhyMode(pMac, &phyMode, psessionEntry); if(SIR_BAND_5_GHZ == rfBand) { if (psessionEntry->htCapability) { if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel) { if ((!pBcnStruct->HTInfo.present) || (eSIR_HT_OP_MODE_MIXED == pBcnStruct->HTInfo.opMode) || (eSIR_HT_OP_MODE_OVERLAP_LEGACY == pBcnStruct->HTInfo.opMode)) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(pMac->lim.gLimOverlap11aParams)); if (pMac->lim.gLimOverlap11aParams.numSta && !pMac->lim.gLimOverlap11aParams.protectionEnabled) { limEnable11aProtection(pMac, true, true, pBeaconParams,psessionEntry); } } else if(eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT == pBcnStruct->HTInfo.opMode) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(pMac->lim.gLimOverlapHt20Params)); if (pMac->lim.gLimOverlapHt20Params.numSta && !pMac->lim.gLimOverlapHt20Params.protectionEnabled) { limEnableHT20Protection(pMac, true, true, pBeaconParams,psessionEntry); } } } } } else if(SIR_BAND_2_4_GHZ == rfBand) { if ((phyMode == WNI_CFG_PHY_MODE_11G) && (false == psessionEntry->htCapability)) { if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel) { if (((!(pBcnStruct->erpPresent)) && !(pBcnStruct->HTInfo.present))|| (pBcnStruct->erpPresent && (pBcnStruct->erpIEInfo.useProtection || pBcnStruct->erpIEInfo.nonErpPresent))) { #ifdef FEATURE_WLAN_CCX if( psessionEntry->isCCXconnection ) { VOS_TRACE (VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, "%s: [INFOLOG]CCX 11g erpPresent=%d useProtection=%d nonErpPresent=%d", __func__, pBcnStruct->erpPresent, pBcnStruct->erpIEInfo.useProtection, pBcnStruct->erpIEInfo.nonErpPresent); } #endif limEnableOverlap11gProtection(pMac, pBeaconParams, pMh,psessionEntry); } } } else if(psessionEntry->htCapability) { if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel) { if (((!(pBcnStruct->erpPresent)) && !(pBcnStruct->HTInfo.present))|| (pBcnStruct->erpPresent && (pBcnStruct->erpIEInfo.useProtection || pBcnStruct->erpIEInfo.nonErpPresent))) { #ifdef FEATURE_WLAN_CCX if( psessionEntry->isCCXconnection ) { VOS_TRACE (VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, "%s: [INFOLOG]CCX 11g erpPresent=%d useProtection=%d nonErpPresent=%d", __func__, pBcnStruct->erpPresent, pBcnStruct->erpIEInfo.useProtection, pBcnStruct->erpIEInfo.nonErpPresent); } #endif limEnableOverlap11gProtection(pMac, pBeaconParams, pMh,psessionEntry); } if (pBcnStruct->erpPresent && !(pBcnStruct->erpIEInfo.useProtection || pBcnStruct->erpIEInfo.nonErpPresent) && !(pBcnStruct->HTInfo.present)) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(psessionEntry->gLimOverlap11gParams)); if (psessionEntry->gLimOverlap11gParams.numSta && !psessionEntry->gLimOverlap11gParams.protectionEnabled) { limEnableHtProtectionFrom11g(pMac, true, true, pBeaconParams,psessionEntry); } } if (pBcnStruct->HTInfo.present) { if(eSIR_HT_OP_MODE_OVERLAP_LEGACY == pBcnStruct->HTInfo.opMode) { if((eSIR_HT_OP_MODE_MIXED != pMac->lim.gHTOperMode) && (eSIR_HT_OP_MODE_OVERLAP_LEGACY != pMac->lim.gHTOperMode)) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(psessionEntry->gLimOverlap11gParams)); if (psessionEntry->gLimOverlap11gParams.numSta && !psessionEntry->gLimOverlap11gParams.protectionEnabled) { limEnableHtProtectionFrom11g(pMac, true, true, pBeaconParams,psessionEntry); } } } else if(eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT == pBcnStruct->HTInfo.opMode) { limUpdateOverlapStaParam(pMac, pMh->bssId, &(psessionEntry->gLimOverlapHt20Params)); if (psessionEntry->gLimOverlapHt20Params.numSta && !psessionEntry->gLimOverlapHt20Params.protectionEnabled) { limEnableHT20Protection(pMac, true, true, pBeaconParams,psessionEntry); } } } } } } pMac->sch.gSchBcnIgnored++; }