summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGupta, Kapil <kapgupta@qti.qualcomm.com>2015-10-16 17:50:48 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-04-13 15:00:00 +0530
commit0444eefe3da3d5a618d383d4da49107a1ba85754 (patch)
tree1c7ef019a0cf49ab65207d2822a579e9c723125b
parentc697a5ef9d5a8743a03421ea5fa4c8f3dc514b80 (diff)
qcacld-2.0: Add support for 2.4G VHT Interop in SAP
In 2.4GHz some stations advertise VHT capability IE in Assoc Req frame. Add support to detect the VHT capability in vendor specific IE in Assoc Req frame and establish the connection with VHT mode to improve the performance. Change-Id: I08dbcb3ce1895aa2108924d7a672e5d9be514e3d CRs-Fixed: 924814
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h13
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c12
-rw-r--r--CORE/MAC/inc/sirApi.h1
-rw-r--r--CORE/MAC/src/include/parserApi.h1
-rw-r--r--CORE/MAC/src/pe/include/limSession.h1
-rw-r--r--CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c28
-rw-r--r--CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c2
-rw-r--r--CORE/MAC/src/pe/lim/limSendManagementFrames.c17
-rw-r--r--CORE/MAC/src/pe/lim/limSerDesUtils.c6
-rw-r--r--CORE/SME/inc/csrApi.h1
-rw-r--r--CORE/SME/inc/csrInternal.h1
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c6
-rw-r--r--CORE/SYS/legacy/src/utils/src/parserApi.c16
13 files changed, 95 insertions, 10 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index f9ad21a47f9b..be0368b05dd1 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2343,6 +2343,16 @@ typedef enum
#define CFG_ENABLE_VHT_FOR_24GHZ_MAX (1)
#define CFG_ENABLE_VHT_FOR_24GHZ_DEFAULT (0)
+/*
+ * Parameter to control VHT support based on vendor ie in 2.4 GHz band
+ * This parameter will enable SAP to read VHT capability in vendor ie in Assoc
+ * Req and send VHT caps in Resp to establish connection in VHT Mode.
+ */
+#define CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_NAME "gEnableVendorVhtFor24GHzBand"
+#define CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_MIN (0)
+#define CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_MAX (1)
+#define CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_DEFAULT (1)
+
#define CFG_MAX_MEDIUM_TIME "gMaxMediumTime"
#define CFG_MAX_MEDIUM_TIME_STAMIN WNI_CFG_MAX_MEDIUM_TIME_STAMIN
@@ -4234,7 +4244,6 @@ struct hdd_config {
char listOfNonDfsCountryCode[128];
v_BOOL_t enableSSR;
v_U32_t cfgMaxMediumTime;
- v_BOOL_t enableVhtFor24GHzBand;
v_U8_t fScanOffload;
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
/* Flag indicating whether legacy fast roam during concurrency is enabled in cfg.ini or not */
@@ -4275,6 +4284,8 @@ struct hdd_config {
#ifdef WLAN_FEATURE_11AC
v_U8_t fVhtAmpduLenExponent;
v_U32_t vhtMpduLen;
+ bool enableVhtFor24GHzBand;
+ bool enable_vendor_vht_for_24ghz_band;
#endif
#ifdef IPA_OFFLOAD
v_U32_t IpaConfig;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index ac583a18170f..37cb84326fb6 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2767,6 +2767,13 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_ENABLE_VHT_FOR_24GHZ_DEFAULT,
CFG_ENABLE_VHT_FOR_24GHZ_MIN,
CFG_ENABLE_VHT_FOR_24GHZ_MAX),
+
+ REG_VARIABLE( CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, enable_vendor_vht_for_24ghz_band,
+ VAR_FLAGS_OPTIONAL,
+ CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_DEFAULT,
+ CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_MIN,
+ CFG_ENABLE_VENDOR_VHT_FOR_24GHZ_MAX),
#endif
REG_VARIABLE( CFG_SCAN_OFFLOAD_NAME, WLAN_PARAM_Integer,
@@ -5056,6 +5063,9 @@ void print_hdd_cfg(hdd_context_t *pHddCtx)
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableLpwrImgTransition] Value = [%u] ",pHddCtx->cfg_ini->enableLpwrImgTransition);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableSSR] Value = [%u] ",pHddCtx->cfg_ini->enableSSR);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableVhtFor24GHzBand] Value = [%u] ",pHddCtx->cfg_ini->enableVhtFor24GHzBand);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [gEnableVendorVhtFor24GHzBand] Value = [%u] ",
+ pHddCtx->cfg_ini->enable_vendor_vht_for_24ghz_band);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gFlexConnectPowerFactor] Value = [%u] ", pHddCtx->cfg_ini->flexConnectPowerFactor);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableIbssHeartBeatOffload] Value = [%u] ", pHddCtx->cfg_ini->enableIbssHeartBeatOffload);
@@ -7039,6 +7049,8 @@ VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx )
smeConfig->csrConfig.txBFCsnValue = pConfig->txBFCsnValue;
smeConfig->csrConfig.enable2x2 = pConfig->enable2x2;
smeConfig->csrConfig.enableVhtFor24GHz = pConfig->enableVhtFor24GHzBand;
+ smeConfig->csrConfig.vendor_vht_for_24ghz_sap =
+ pConfig->enable_vendor_vht_for_24ghz_band;
smeConfig->csrConfig.enableMuBformee = pConfig->enableMuBformee;
smeConfig->csrConfig.enableVhtpAid = pConfig->enableVhtpAid;
smeConfig->csrConfig.enableVhtGid = pConfig->enableVhtGid;
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 80255ca660cb..50b652975a1f 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -691,6 +691,7 @@ typedef struct sSirSmeStartBssReq
tANI_BOOLEAN obssEnabled;
uint8_t sap_dot11mc;
+ bool vendor_vht_for_24ghz_sap;
} tSirSmeStartBssReq, *tpSirSmeStartBssReq;
diff --git a/CORE/MAC/src/include/parserApi.h b/CORE/MAC/src/include/parserApi.h
index 0bddaa05e282..6da39f5b9ced 100644
--- a/CORE/MAC/src/include/parserApi.h
+++ b/CORE/MAC/src/include/parserApi.h
@@ -255,6 +255,7 @@ typedef struct sSirAssocReq
tDot11fIEOperatingMode operMode;
#endif
tDot11fIEExtCap ExtCap;
+ tDot11fIEvendor2_ie vendor2_ie;
} tSirAssocReq, *tpSirAssocReq;
diff --git a/CORE/MAC/src/pe/include/limSession.h b/CORE/MAC/src/pe/include/limSession.h
index e9a1f881935d..5d7e390b5036 100644
--- a/CORE/MAC/src/pe/include/limSession.h
+++ b/CORE/MAC/src/pe/include/limSession.h
@@ -504,6 +504,7 @@ typedef struct sPESession // Added to Support BT-AMP
bool is_vendor_specific_vhtcaps;
uint8_t vendor_specific_vht_ie_type;
uint8_t vendor_specific_vht_ie_sub_type;
+ bool vendor_vht_for_24ghz_sap;
} tPESession, *tpPESession;
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
index 4e7fbe234181..4d6fb1f821bb 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocReqFrame.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -249,6 +249,7 @@ limProcessAssocReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,
#endif
tANI_U16 assocId = 0;
bool assoc_req_copied = false;
+ tDot11fIEVHTCaps *vht_caps;
limGetPhyMode(pMac, &phyMode, psessionEntry);
@@ -398,6 +399,14 @@ limProcessAssocReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,
(tANI_U8 *) pBody, framelen);
pAssocReq->assocReqFrameLength = framelen;
+ if (pAssocReq->VHTCaps.present)
+ vht_caps = &pAssocReq->VHTCaps;
+ else if (pAssocReq->vendor2_ie.VHTCaps.present &&
+ psessionEntry->vendor_vht_for_24ghz_sap)
+ vht_caps = &pAssocReq->vendor2_ie.VHTCaps;
+ else
+ vht_caps = NULL;
+
if (cfgGetCapabilityInfo(pMac, &temp,psessionEntry) != eSIR_SUCCESS)
{
limLog(pMac, LOGP, FL("could not retrieve Capabilities"));
@@ -517,7 +526,7 @@ limProcessAssocReqFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo,
if (LIM_IS_AP_ROLE(psessionEntry) &&
(psessionEntry->dot11mode == WNI_CFG_DOT11_MODE_11AC_ONLY) &&
- (!pAssocReq->VHTCaps.present)) {
+ (vht_caps != NULL) && (!vht_caps->present)) {
limSendAssocRspMgmtFrame( pMac, eSIR_MAC_CAPABILITIES_NOT_SUPPORTED_STATUS,
1, pHdr->sa, subType, 0, psessionEntry );
limLog(pMac, LOGE, FL("SOFTAP was in 11AC only mode, reject"));
@@ -1149,7 +1158,10 @@ sendIndToSme:
pStaDs->mlmStaContext.htCapability = pAssocReq->HTCaps.present;
#ifdef WLAN_FEATURE_11AC
- pStaDs->mlmStaContext.vhtCapability = pAssocReq->VHTCaps.present;
+ if ((vht_caps != NULL) && vht_caps->present)
+ pStaDs->mlmStaContext.vhtCapability = vht_caps->present;
+ else
+ pStaDs->mlmStaContext.vhtCapability = false;
#endif
pStaDs->qos.addtsPresent = (pAssocReq->addtsPresent==0) ? false : true;
pStaDs->qos.addts = pAssocReq->addtsReq;
@@ -1234,7 +1246,7 @@ sendIndToSme:
pStaDs->vhtSupportedChannelWidthSet = (tANI_U8)((pAssocReq->operMode.chanWidth == eHT_CHANNEL_WIDTH_80MHZ) ? WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ : WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ);
pStaDs->htSupportedChannelWidthSet = (tANI_U8)(pAssocReq->operMode.chanWidth ? eHT_CHANNEL_WIDTH_40MHZ : eHT_CHANNEL_WIDTH_20MHZ);
}
- else if (pAssocReq->VHTCaps.present)
+ else if ((vht_caps != NULL) && vht_caps->present)
{
// Check if STA has enabled it's channel bonding mode.
// If channel bonding mode is enabled, we decide based on SAP's current configuration.
@@ -1242,7 +1254,7 @@ sendIndToSme:
pStaDs->vhtSupportedChannelWidthSet = (tANI_U8)((pStaDs->htSupportedChannelWidthSet == eHT_CHANNEL_WIDTH_20MHZ) ?
WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ :
psessionEntry->vhtTxChannelWidthSet );
- pStaDs->htMaxRxAMpduFactor = pAssocReq->VHTCaps.maxAMPDULenExp;
+ pStaDs->htMaxRxAMpduFactor = vht_caps->maxAMPDULenExp;
}
// Lesser among the AP and STA bandwidth of operation.
@@ -1255,9 +1267,9 @@ sendIndToSme:
pStaDs->htLdpcCapable = (tANI_U8)pAssocReq->HTCaps.advCodingCap;
}
- if(pAssocReq->VHTCaps.present && pAssocReq->wmeInfoPresent)
+ if((vht_caps != NULL) && vht_caps->present && pAssocReq->wmeInfoPresent)
{
- pStaDs->vhtLdpcCapable = (tANI_U8)pAssocReq->VHTCaps.ldpcCodingCap;
+ pStaDs->vhtLdpcCapable = (tANI_U8)vht_caps->ldpcCodingCap;
}
if (!pAssocReq->wmeInfoPresent) {
@@ -1272,7 +1284,7 @@ if (limPopulateMatchingRateSet(pMac,
&(pAssocReq->supportedRates),
&(pAssocReq->extendedRates),
pAssocReq->HTCaps.supportedMCSSet,
- psessionEntry, &pAssocReq->VHTCaps)
+ psessionEntry, vht_caps)
!= eSIR_SUCCESS)
#else
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 8206922f1e1f..74ef4c369234 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -743,6 +743,8 @@ __limHandleSmeStartBssRequest(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
psessionEntry->ssidHidden = pSmeStartBssReq->ssidHidden;
psessionEntry->wps_state = pSmeStartBssReq->wps_state;
psessionEntry->sap_dot11mc = pSmeStartBssReq->sap_dot11mc;
+ psessionEntry->vendor_vht_for_24ghz_sap =
+ pSmeStartBssReq->vendor_vht_for_24ghz_sap;
limGetShortSlotFromPhyMode(pMac, psessionEntry,
psessionEntry->gLimPhyMode,
&psessionEntry->shortSlotTimeSupported);
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 8da95bcb97d4..9af329a2d573 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -1342,6 +1342,23 @@ limSendAssocRspMgmtFrame(tpAniSirGlobal pMac,
PopulateDot11fVHTOperation( pMac, psessionEntry, &frm.VHTOperation);
isVHTEnabled = eANI_BOOLEAN_TRUE;
}
+
+ if (psessionEntry->vhtCapability &&
+ psessionEntry->vendor_vht_for_24ghz_sap &&
+ (pAssocReq != NULL) && pAssocReq->vendor2_ie.VHTCaps.present) {
+ limLog(pMac, LOG1,
+ FL("Populate Vendor VHT IEs in Assoc Response"));
+ frm.vendor2_ie.present = 1;
+ frm.vendor2_ie.type =
+ psessionEntry->vendor_specific_vht_ie_type;
+ frm.vendor2_ie.sub_type =
+ psessionEntry->vendor_specific_vht_ie_sub_type;
+
+ frm.vendor2_ie.VHTCaps.present = 1;
+ PopulateDot11fVHTCaps(pMac, psessionEntry,
+ &frm.vendor2_ie.VHTCaps);
+ isVHTEnabled = true;
+ }
#endif
PopulateDot11fExtCap(pMac, isVHTEnabled, &frm.ExtCap, psessionEntry);
diff --git a/CORE/MAC/src/pe/lim/limSerDesUtils.c b/CORE/MAC/src/pe/lim/limSerDesUtils.c
index 56b43e248919..de6cb081cebe 100644
--- a/CORE/MAC/src/pe/lim/limSerDesUtils.c
+++ b/CORE/MAC/src/pe/lim/limSerDesUtils.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -694,6 +694,10 @@ limStartBssReqSerDes(tpAniSirGlobal pMac, tpSirSmeStartBssReq pStartBssReq, tANI
pStartBssReq->sap_dot11mc = *pBuf++;
len--;
+ /* extract vendor_vht_for_24ghz_sap */
+ pStartBssReq->vendor_vht_for_24ghz_sap = *pBuf++;
+ len--;
+
if (len)
{
limLog(pMac, LOGW, FL("Extra bytes left in SME_START_BSS_REQ, len=%d"), len);
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 2a7da87b6733..9f5b04bbfb60 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1262,6 +1262,7 @@ typedef struct tagCsrConfigParam
tANI_U8 txBFCsnValue;
tANI_U8 enable2x2;
tANI_BOOLEAN enableVhtFor24GHz;
+ bool vendor_vht_for_24ghz_sap;
tANI_U8 enableMuBformee;
tANI_U8 enableVhtpAid;
tANI_U8 enableVhtGid;
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index d70c6ac424ef..9fc218b936bd 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -726,6 +726,7 @@ typedef struct tagCsrConfig
uint32_t edca_vi_aifs;
uint32_t edca_bk_aifs;
uint32_t edca_be_aifs;
+ bool vendor_vht_for_24ghz_sap;
}tCsrConfig;
typedef struct tagCsrChannelPowerInfo
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 4fd7e9ccf2f3..461ef1fd4687 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -2024,6 +2024,8 @@ eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pPa
pMac->roam.configParam.ignore_peer_ht_opmode =
pParam->ignore_peer_ht_opmode;
pMac->roam.configParam.obssEnabled = pParam->obssEnabled;
+ pMac->roam.configParam.vendor_vht_for_24ghz_sap =
+ pParam->vendor_vht_for_24ghz_sap;
pMac->roam.configParam.conc_custom_rule1 =
pParam->conc_custom_rule1;
pMac->roam.configParam.conc_custom_rule2 =
@@ -2219,6 +2221,9 @@ eHalStatus csrGetConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
pParam->obssEnabled = pMac->roam.configParam.obssEnabled;
+ pParam->vendor_vht_for_24ghz_sap =
+ pMac->roam.configParam.vendor_vht_for_24ghz_sap;
+
pParam->conc_custom_rule1 =
pMac->roam.configParam.conc_custom_rule1;
pParam->conc_custom_rule2 =
@@ -15295,6 +15300,7 @@ eHalStatus csrSendMBStartBssReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, eCs
*pBuf++ = (tANI_U8)pMac->roam.configParam.obssEnabled;
*pBuf++ = (tANI_U8)pParam->sap_dot11mc;
+ *pBuf++ = (tANI_U8)pMac->roam.configParam.vendor_vht_for_24ghz_sap;
msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
pMsg->length = pal_cpu_to_be16(msgLen);
diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c
index 9a0a2a850e78..f1c5a2082fe3 100644
--- a/CORE/SYS/legacy/src/utils/src/parserApi.c
+++ b/CORE/SYS/legacy/src/utils/src/parserApi.c
@@ -2724,6 +2724,22 @@ sirConvertAssocReqFrame2Struct(tpAniSirGlobal pMac,
p_ext_cap->timingMeas, p_ext_cap->fine_time_meas_initiator,
p_ext_cap->fine_time_meas_responder);
}
+
+ pAssocReq->vendor2_ie.present = ar->vendor2_ie.present;
+ if (ar->vendor2_ie.present) {
+ pAssocReq->vendor2_ie.type = ar->vendor2_ie.type;
+ pAssocReq->vendor2_ie.sub_type = ar->vendor2_ie.sub_type;
+
+ if (ar->vendor2_ie.VHTCaps.present) {
+ vos_mem_copy(&pAssocReq->vendor2_ie.VHTCaps,
+ &ar->vendor2_ie.VHTCaps,
+ sizeof(tDot11fIEVHTCaps));
+ limLog(pMac, LOG1,
+ FL("Received Assoc Request with Vendor specific VHT Cap"));
+ limLogVHTCap(pMac, &pAssocReq->VHTCaps);
+ }
+ }
+
vos_mem_free(ar);
return eSIR_SUCCESS;