wlan: Send Management frames at 11G rates
If AP is configured in 11g only mode
STAUT sending directed Probe request,
Association request at 1 Mbps.To fix
it indicate firmware with flag to send
directed Probe request and Association
request at 11g rates if AP is configured
in 11g only mode.
Change-Id: I564438604603e995a4a325d5757b16a3db1895e8
CRs-Fixed: 775294
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index ca53f10..cb3ab65 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -1051,6 +1051,7 @@
tSirMacRateSet operationalRateSet;// Has 11a or 11b rates
tSirMacRateSet extendedRateSet; // Has 11g rates
+ tANI_U16 rateBitMap;
tSirRSNie rsnIE; // RSN IE to be sent in
// (Re) Association Request
#ifdef FEATURE_WLAN_ESE
diff --git a/CORE/MAC/src/pe/include/limSession.h b/CORE/MAC/src/pe/include/limSession.h
index 8238f48..2ba3fcb 100644
--- a/CORE/MAC/src/pe/include/limSession.h
+++ b/CORE/MAC/src/pe/include/limSession.h
@@ -356,6 +356,7 @@
/* DSCP to UP mapping for HS 2.0 */
tSirQosMapSet QosMapSet;
tANI_U8 isKeyInstalled;
+ tANI_BOOLEAN is11Gonly;
}tPESession, *tpPESession;
#define LIM_MAX_ACTIVE_SESSIONS 4
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 648caa8..098a06f 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -1739,7 +1739,14 @@
else
limLog(pMac,LOG1,FL("SessionId:%d New session created"),
sessionId);
- }
+ }
+
+ if(psessionEntry != NULL && pSmeJoinReq->operationalRateSet.numRates > 0 ){
+ if(!limCheck11BRateBitmap(pSmeJoinReq->rateBitMap)){
+ psessionEntry->is11Gonly = true;
+ }
+ }
+
handleHTCapabilityandHTInfo(pMac, psessionEntry);
psessionEntry->isAmsduSupportInAMPDU = pSmeJoinReq->isAmsduSupportInAMPDU;
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 1b9692f..774c82f 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -62,7 +62,7 @@
#include "wlan_qct_wda.h"
-
+#define IS_BROADCAST_MAC(x) (((x[0] & x[1] & x[2] & x[3] & x[4] & x[5]) == 0xff) ? 1 : 0)
////////////////////////////////////////////////////////////////////////
tSirRetStatus limStripOffExtCapIE(tpAniSirGlobal pMac,
@@ -525,6 +525,11 @@
txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
}
+ if( ( psessionEntry != NULL ) && ( psessionEntry->is11Gonly == true ) &&
+ ( !IS_BROADCAST_MAC(bssid) ) ){
+ txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
+ }
+
halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) sizeof(tSirMacMgmtHdr) + nPayload,
HAL_TXRX_FRM_802_11_MGMT,
ANI_TXDIR_TODS,
@@ -2601,6 +2606,11 @@
// enable caching
WLANTL_EnableCaching(psessionEntry->staId);
+ if( ( psessionEntry->is11Gonly == true ) &&
+ ( !IS_BROADCAST_MAC(pMlmAssocReq->peerMacAddr) ) ){
+ txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
+ }
+
halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) (sizeof(tSirMacMgmtHdr) + nPayload),
HAL_TXRX_FRM_802_11_MGMT,
ANI_TXDIR_TODS,
@@ -3748,6 +3758,12 @@
MTRACE(macTrace(pMac, TRACE_CODE_TX_MGMT,
psessionEntry->peSessionId,
pMacHdr->fc.subType));
+
+ if( ( psessionEntry->is11Gonly == true ) &&
+ ( !IS_BROADCAST_MAC(peerMacAddr) ) ){
+ txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
+ }
+
/// Queue Authentication frame in high priority WQ
halstatus = halTxFrame( pMac, pPacket, ( tANI_U16 ) frameLen,
HAL_TXRX_FRM_802_11_MGMT,
diff --git a/CORE/MAC/src/pe/lim/limSerDesUtils.c b/CORE/MAC/src/pe/lim/limSerDesUtils.c
index ec57df8..8790703 100644
--- a/CORE/MAC/src/pe/lim/limSerDesUtils.c
+++ b/CORE/MAC/src/pe/lim/limSerDesUtils.c
@@ -1018,6 +1018,11 @@
}
}
+ //Extract rateBitMap
+ pJoinReq->rateBitMap = limGetU16(pBuf);
+ pBuf += sizeof(tANI_U16);
+ len -= sizeof(tANI_U16);
+
// Extract RSN IE
pJoinReq->rsnIE.length = limGetU16(pBuf);
pBuf += sizeof(tANI_U16);
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index 4f2bd03..c68ecf4 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -88,6 +88,20 @@
eHalStatus status,
tANI_U32 *ctx);
/** -------------------------------------------------------------
+\fn limCheck11BRateBitmap
+\brief Verifies if basic rates are set.
+\param tANI_U16 pRateBitmap
+\return tANI_BOOLEAN - true or false
+ -------------------------------------------------------------*/
+
+tANI_BOOLEAN limCheck11BRateBitmap(tANI_U16 pRateBitmap)
+{
+ return ( ( pRateBitmap & ( 1 << 0 ) ) || ( pRateBitmap & ( 1 << 1 ) ) ||
+ ( pRateBitmap & ( 1 << 2 ) ) ||
+ ( pRateBitmap & ( 1 << 3 ) ) ? 1 : 0 ) ;
+}
+
+/** -------------------------------------------------------------
\fn limAssignDialogueToken
\brief Assigns dialogue token.
\param tpAniSirGlobal pMac
diff --git a/CORE/MAC/src/pe/lim/limUtils.h b/CORE/MAC/src/pe/lim/limUtils.h
index 241506d..3eaa6ca 100644
--- a/CORE/MAC/src/pe/lim/limUtils.h
+++ b/CORE/MAC/src/pe/lim/limUtils.h
@@ -113,6 +113,7 @@
tANI_U8 channels[15];
}op_class_map_t;
// LIM utility functions
+tANI_BOOLEAN limCheck11BRateBitmap(tANI_U16 RateBitmap);
void limGetBssidFromPkt(tpAniSirGlobal, tANI_U8 *, tANI_U8 *, tANI_U32 *);
char * limMlmStateStr(tLimMlmStates state);
char * limSmeStateStr(tLimSmeStates state);
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 89df25e..dd59af0 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -3496,7 +3496,7 @@
return (status);
}
static eHalStatus csrGetRateSet( tpAniSirGlobal pMac, tCsrRoamProfile *pProfile, eCsrPhyMode phyMode, tSirBssDescription *pBssDesc,
- tDot11fBeaconIEs *pIes, tSirMacRateSet *pOpRateSet, tSirMacRateSet *pExRateSet)
+ tDot11fBeaconIEs *pIes, tSirMacRateSet *pOpRateSet, tSirMacRateSet *pExRateSet, tANI_U16 *pRateBitmap)
{
eHalStatus status = eHAL_STATUS_FAILURE;
int i;
@@ -3549,6 +3549,7 @@
{
if (!csrIsRateAlreadyPresent(pIes->ExtSuppRates.rates[ i ], rateBitmap))
{
+ csrAddRateBitmap(pIes->ExtSuppRates.rates[ i ], &rateBitmap);
*pDstRate++ = pIes->ExtSuppRates.rates[ i ];
pExRateSet->numRates++;
}
@@ -3556,6 +3557,7 @@
}
}
}
+ *pRateBitmap = rateBitmap;
}//Parsing BSSDesc
else
{
@@ -12871,6 +12873,7 @@
tANI_U8 wpaRsnIE[DOT11F_IE_RSN_MAX_LEN]; //RSN MAX is bigger than WPA MAX
tANI_U32 ucDot11Mode = 0;
tANI_U8 txBFCsnValue = 0;
+ tANI_U16 rateBitmap = 0;
if(!pSession)
{
@@ -12966,7 +12969,7 @@
- status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, pBssDescription, pIes, &OpRateSet, &ExRateSet);
+ status = csrGetRateSet(pMac, pProfile, (eCsrPhyMode)pProfile->phyMode, pBssDescription, pIes, &OpRateSet, &ExRateSet,&rateBitmap);
if (HAL_STATUS_SUCCESS(status) )
{
// OperationalRateSet
@@ -12987,6 +12990,11 @@
*pBuf++ = 0;
*pBuf++ = 0;
}
+
+ //rateBitmap
+ vos_mem_copy(pBuf, &rateBitmap, sizeof(tANI_U16));
+ pBuf += sizeof(tANI_U16);
+
// rsnIE
if ( csrIsProfileWpa( pProfile ) )
{