summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMasti, Narayanraddi <c_nmasti@qti.qualcomm.com>2014-09-25 12:18:24 +0530
committerAnjaneeDevi Kapparapu <c_akappa@qti.qualcomm.com>2014-10-07 17:38:29 +0530
commit265561eced488422f80c145e896ba73409351e4c (patch)
treeeda89204ecf2653d97f7624ce1c61b06a4cd301e
parent80b94387ba027f2866d7c8ae5fb6c90d1deb4e01 (diff)
qcacld: TDLS: Send WMM Elements in tdls setup frames
Advertize WMM capability by including WMM IE's in TDLS Setup Request/Response and WMM Parameter Element in TDLS Setup Confirmation frames. This capability shall be enabled based on the gEnableTDLSWmmMode parameter and WMM IE's shall be added based on TDLS UAPSD mask. Also, ensure to include the WMM Parameter Element in TDLS Setup Confirmation frames only when the peer is WMM capable. Change-Id: I3af1c7acb6360760f29c11165202461ae91005b8 CRs-Fixed: 727965
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h6
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c16
-rw-r--r--CORE/MAC/inc/aniGlobal.h2
-rw-r--r--CORE/MAC/inc/wniCfgAp.h15
-rw-r--r--CORE/MAC/inc/wniCfgSta.h9
-rw-r--r--CORE/MAC/src/cfg/cfgParamName.c2
-rw-r--r--CORE/MAC/src/cfg/cfgUtil/cfg.txt12
-rw-r--r--CORE/MAC/src/pe/lim/limApi.c7
-rw-r--r--CORE/MAC/src/pe/lim/limProcessTdls.c121
-rw-r--r--firmware_bin/WCNSS_cfg.datbin10330 -> 10362 bytes
10 files changed, 152 insertions, 38 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index e5a04db89a5e..60879fd3d08d 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2024,6 +2024,11 @@ typedef enum
#define CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE_MAX (1)
#define CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE_DEFAULT (0)
+#define CFG_TDLS_WMM_MODE_ENABLE "gEnableTDLSWmmMode"
+#define CFG_TDLS_WMM_MODE_ENABLE_MIN (0)
+#define CFG_TDLS_WMM_MODE_ENABLE_MAX (1)
+#define CFG_TDLS_WMM_MODE_ENABLE_DEFAULT (0)
+
#define CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM "gTDLSPrefOffChanNum"
#define CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM_MIN (0)
#define CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM_MAX (0xFF)
@@ -3226,6 +3231,7 @@ typedef struct
v_U32_t fTDLSPuapsdPTRTimeout;
v_BOOL_t fTDLSExternalControl;
v_U32_t fEnableTDLSOffChannel;
+ v_U32_t fEnableTDLSWmmMode;
v_U8_t fTDLSPrefOffChanNum;
v_U8_t fTDLSPrefOffChanBandwidth;
#endif
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index c4d7ec634cec..3647431152bd 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2878,6 +2878,13 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_TDLS_EXTERNAL_CONTROL_DEFAULT,
CFG_TDLS_EXTERNAL_CONTROL_MIN,
CFG_TDLS_EXTERNAL_CONTROL_MAX ),
+
+ REG_VARIABLE( CFG_TDLS_WMM_MODE_ENABLE, WLAN_PARAM_Integer,
+ hdd_config_t, fEnableTDLSWmmMode,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_TDLS_WMM_MODE_ENABLE_DEFAULT,
+ CFG_TDLS_WMM_MODE_ENABLE_MIN,
+ CFG_TDLS_WMM_MODE_ENABLE_MAX ),
#endif
#ifdef WLAN_SOFTAP_VSTA_FEATURE
@@ -4285,6 +4292,7 @@ void print_hdd_cfg(hdd_context_t *pHddCtx)
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [fTDLSExternalControl] Value = [%u] ",pHddCtx->cfg_ini->fTDLSExternalControl);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [fTDLSUapsdMask] Value = [%u] ",pHddCtx->cfg_ini->fTDLSUapsdMask);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [fEnableTDLSBufferSta] Value = [%u] ",pHddCtx->cfg_ini->fEnableTDLSBufferSta);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [fEnableTDLSWmmMode] Value = [%u] ",pHddCtx->cfg_ini->fEnableTDLSWmmMode);
#endif
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [InfraDirAcVo] Value = [%u] ",pHddCtx->cfg_ini->InfraDirAcVo);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [InfraNomMsduSizeAcVo] Value = [0x%x] ",pHddCtx->cfg_ini->InfraNomMsduSizeAcVo);
@@ -6013,6 +6021,14 @@ v_BOOL_t hdd_update_config_dat( hdd_context_t *pHddCtx )
hddLog(LOGE, "Could not pass on WNI_CFG_TDLS_BUF_STA_ENABLED to CCM");
}
+ if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_TDLS_WMM_MODE_ENABLED,
+ pConfig->fEnableTDLSWmmMode, NULL,
+ eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
+ {
+ fStatus = FALSE;
+ hddLog(LOGE, "Could not pass on WNI_CFG_TDLS_WMM_MODE_ENABLED to CCM");
+ }
+
#endif
if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_ENABLE_ADAPT_RX_DRAIN,
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index cc589eca3ce7..03aa9ef825c2 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -644,6 +644,8 @@ typedef struct sAniSirLim
tANI_U8 gLimTDLSBufStaEnabled;
tANI_U8 gLimTDLSUapsdMask;
tANI_U8 gLimTDLSOffChannelEnabled;
+ // TDLS WMM Mode
+ tANI_U8 gLimTDLSWmmMode;
#endif
////////////////////////////////////////// MISC RELATED END ///////////////////////////////////////////
diff --git a/CORE/MAC/inc/wniCfgAp.h b/CORE/MAC/inc/wniCfgAp.h
index e40adaaace6b..b5b2ce4121ce 100644
--- a/CORE/MAC/inc/wniCfgAp.h
+++ b/CORE/MAC/inc/wniCfgAp.h
@@ -348,6 +348,7 @@
#define WNI_CFG_IBSS_ATIM_WIN_SIZE 301
#define WNI_CFG_DFS_MASTER_ENABLED 302
#define WNI_CFG_VHT_ENABLE_TXBF_20MHZ 303
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED 304
/*
* String parameter lengths
@@ -2569,10 +2570,18 @@
#define WNI_CFG_VHT_ENABLE_TXBF_20MHZ_APMAX 1
#define WNI_CFG_VHT_ENABLE_TXBF_20MHZ_APDEF 0
-#define CFG_PARAM_MAX_NUM 304
-#define CFG_AP_IBUF_MAX_SIZE 252
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED_STAMIN 0
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED_STAMAX 1
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED_STADEF 0
+
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED_APMIN 0
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED_APMAX 1
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED_APDEF 0
+
+#define CFG_PARAM_MAX_NUM 305
+#define CFG_AP_IBUF_MAX_SIZE 253
#define CFG_AP_SBUF_MAX_SIZE 3238
-#define CFG_STA_IBUF_MAX_SIZE 247
+#define CFG_STA_IBUF_MAX_SIZE 248
#define CFG_STA_SBUF_MAX_SIZE 3204
#define CFG_SEM_MAX_NUM 19
diff --git a/CORE/MAC/inc/wniCfgSta.h b/CORE/MAC/inc/wniCfgSta.h
index 88bd6d96923c..10cb585692b2 100644
--- a/CORE/MAC/inc/wniCfgSta.h
+++ b/CORE/MAC/inc/wniCfgSta.h
@@ -342,6 +342,7 @@
#define WNI_CFG_IBSS_ATIM_WIN_SIZE 301
#define WNI_CFG_DFS_MASTER_ENABLED 302
#define WNI_CFG_VHT_ENABLE_TXBF_20MHZ 303
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED 304
/*
* String parameter lengths
@@ -1642,8 +1643,12 @@
#define WNI_CFG_VHT_ENABLE_TXBF_20MHZ_STAMAX 1
#define WNI_CFG_VHT_ENABLE_TXBF_20MHZ_STADEF 0
-#define CFG_PARAM_MAX_NUM 304
-#define CFG_STA_IBUF_MAX_SIZE 247
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED_STAMIN 0
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED_STAMAX 1
+#define WNI_CFG_TDLS_WMM_MODE_ENABLED_STADEF 0
+
+#define CFG_PARAM_MAX_NUM 305
+#define CFG_STA_IBUF_MAX_SIZE 248
#define CFG_STA_SBUF_MAX_SIZE 3204
#define CFG_SEM_MAX_NUM 19
diff --git a/CORE/MAC/src/cfg/cfgParamName.c b/CORE/MAC/src/cfg/cfgParamName.c
index 205ad84f9e06..07f3eb2b1bac 100644
--- a/CORE/MAC/src/cfg/cfgParamName.c
+++ b/CORE/MAC/src/cfg/cfgParamName.c
@@ -339,5 +339,5 @@ unsigned char *gCfgParamName[] = {
(unsigned char *)"IBSS_ATIM_WIN_SIZE",
(unsigned char *)"DFS_MASTER_ENABLED",
(unsigned char *)"VHT_ENABLE_TXBF_20MHZ",
+ (unsigned char *)"TDLS_WMM_MODE_ENABLED",
};
-
diff --git a/CORE/MAC/src/cfg/cfgUtil/cfg.txt b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
index 9f3f59e7a25f..0b49d79ce106 100644
--- a/CORE/MAC/src/cfg/cfgUtil/cfg.txt
+++ b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
@@ -4497,3 +4497,15 @@ NONE
V RW NP
NONE
0 1 0
+
+*
+*TDLS WMM Mode
+*
+*
+WNI_CFG_TDLS_WMM_MODE_ENABLED I 4 7
+V RW NP
+LIM
+0 1 0
+V RW NP
+LIM
+0 1 0
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index d49cde92e132..6d8638201bea 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -552,6 +552,13 @@ static tSirRetStatus __limInitConfig( tpAniSirGlobal pMac )
limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
return eSIR_FAILURE;
}
+
+ if (eSIR_SUCCESS != wlan_cfgGetInt(pMac, WNI_CFG_TDLS_WMM_MODE_ENABLED,
+ (tANI_U32 *) &pMac->lim.gLimTDLSWmmMode))
+ {
+ limLog(pMac, LOGP, FL("cfg get LimTDLSWmmMode failed"));
+ return eSIR_FAILURE;
+ }
#endif
return eSIR_SUCCESS;
}
diff --git a/CORE/MAC/src/pe/lim/limProcessTdls.c b/CORE/MAC/src/pe/lim/limProcessTdls.c
index 0a9e3556d1d5..20a075aa452c 100644
--- a/CORE/MAC/src/pe/lim/limProcessTdls.c
+++ b/CORE/MAC/src/pe/lim/limProcessTdls.c
@@ -897,22 +897,47 @@ tSirRetStatus limSendTdlsLinkSetupReqFrame(tpAniSirGlobal pMac,
/* Populate extended supported rates */
PopulateDot11fTdlsExtCapability( pMac, &tdlsSetupReq.ExtCap );
- /*
- * TODO: we need to see if we have to support conditions where we have
- * EDCA parameter info element is needed a) if we need different QOS
- * parameters for off channel operations or QOS is not supported on
- * AP link and we wanted to QOS on direct link.
- */
- /* Populate QOS info, needed for Peer U-APSD session */
- /* TODO: Now hardcoded, because PopulateDot11fQOSCapsStation() depends on AP's capability, and
- TDLS doesn't want to depend on AP's capability */
- tdlsSetupReq.QOSCapsStation.present = 1;
- tdlsSetupReq.QOSCapsStation.max_sp_length = 0;
- tdlsSetupReq.QOSCapsStation.qack = 0;
- tdlsSetupReq.QOSCapsStation.acbe_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x08) >> 3) ;
- tdlsSetupReq.QOSCapsStation.acbk_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x04)>> 2);
- tdlsSetupReq.QOSCapsStation.acvi_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x02)>> 1);
- tdlsSetupReq.QOSCapsStation.acvo_uapsd = (pMac->lim.gLimTDLSUapsdMask & 0x01);
+ if (1 == pMac->lim.gLimTDLSWmmMode)
+ {
+ tANI_U32 val = 0;
+
+ /* include WMM IE */
+ tdlsSetupReq.WMMInfoStation.version = SIR_MAC_OUI_VERSION_1;
+ tdlsSetupReq.WMMInfoStation.acvo_uapsd =
+ (pMac->lim.gLimTDLSUapsdMask & 0x01);
+ tdlsSetupReq.WMMInfoStation.acvi_uapsd =
+ ((pMac->lim.gLimTDLSUapsdMask & 0x02) >> 1);
+ tdlsSetupReq.WMMInfoStation.acbk_uapsd =
+ ((pMac->lim.gLimTDLSUapsdMask & 0x04) >> 2);
+ tdlsSetupReq.WMMInfoStation.acbe_uapsd =
+ ((pMac->lim.gLimTDLSUapsdMask & 0x08) >> 3);
+
+ if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_SP_LENGTH, &val) != eSIR_SUCCESS)
+ PELOGE(limLog(pMac, LOGE,
+ FL("could not retrieve Max SP Length"));)
+
+ tdlsSetupReq.WMMInfoStation.max_sp_length = (tANI_U8)val;
+ tdlsSetupReq.WMMInfoStation.present = 1;
+ }
+ else
+ {
+ /*
+ * TODO: we need to see if we have to support conditions where we have
+ * EDCA parameter info element is needed a) if we need different QOS
+ * parameters for off channel operations or QOS is not supported on
+ * AP link and we wanted to QOS on direct link.
+ */
+ /* Populate QOS info, needed for Peer U-APSD session */
+ /* TODO: Now hardcoded, because PopulateDot11fQOSCapsStation() depends
+ on AP's capability, and TDLS doesn't want to depend on AP's capability */
+ tdlsSetupReq.QOSCapsStation.present = 1;
+ tdlsSetupReq.QOSCapsStation.max_sp_length = 0;
+ tdlsSetupReq.QOSCapsStation.qack = 0;
+ tdlsSetupReq.QOSCapsStation.acbe_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x08) >> 3);
+ tdlsSetupReq.QOSCapsStation.acbk_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x04) >> 2);
+ tdlsSetupReq.QOSCapsStation.acvi_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x02) >> 1);
+ tdlsSetupReq.QOSCapsStation.acvo_uapsd = (pMac->lim.gLimTDLSUapsdMask & 0x01);
+ }
/*
* we will always try to init TDLS link with 11n capabilities
@@ -1328,22 +1353,47 @@ static tSirRetStatus limSendTdlsSetupRspFrame(tpAniSirGlobal pMac,
/* Populate extended supported rates */
PopulateDot11fTdlsExtCapability( pMac, &tdlsSetupRsp.ExtCap );
- /*
- * TODO: we need to see if we have to support conditions where we have
- * EDCA parameter info element is needed a) if we need different QOS
- * parameters for off channel operations or QOS is not supported on
- * AP link and we wanted to QOS on direct link.
- */
- /* Populate QOS info, needed for Peer U-APSD session */
- /* TODO: Now hardcoded, because PopulateDot11fQOSCapsStation() depends on AP's capability, and
- TDLS doesn't want to depend on AP's capability */
- tdlsSetupRsp.QOSCapsStation.present = 1;
- tdlsSetupRsp.QOSCapsStation.max_sp_length = 0;
- tdlsSetupRsp.QOSCapsStation.qack = 0;
- tdlsSetupRsp.QOSCapsStation.acbe_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x08) >> 3);
- tdlsSetupRsp.QOSCapsStation.acbk_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x04) >> 2);
- tdlsSetupRsp.QOSCapsStation.acvi_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x02) >> 1);
- tdlsSetupRsp.QOSCapsStation.acvo_uapsd = (pMac->lim.gLimTDLSUapsdMask & 0x01);
+ if (1 == pMac->lim.gLimTDLSWmmMode)
+ {
+ tANI_U32 val = 0;
+
+ /* include WMM IE */
+ tdlsSetupRsp.WMMInfoStation.version = SIR_MAC_OUI_VERSION_1;
+ tdlsSetupRsp.WMMInfoStation.acvo_uapsd =
+ (pMac->lim.gLimTDLSUapsdMask & 0x01);
+ tdlsSetupRsp.WMMInfoStation.acvi_uapsd =
+ ((pMac->lim.gLimTDLSUapsdMask & 0x02) >> 1);
+ tdlsSetupRsp.WMMInfoStation.acbk_uapsd =
+ ((pMac->lim.gLimTDLSUapsdMask & 0x04) >> 2);
+ tdlsSetupRsp.WMMInfoStation.acbe_uapsd =
+ ((pMac->lim.gLimTDLSUapsdMask & 0x08) >> 3);
+
+ if(wlan_cfgGetInt(pMac, WNI_CFG_MAX_SP_LENGTH, &val) != eSIR_SUCCESS)
+ PELOGE(limLog(pMac, LOGE,
+ FL("could not retrieve Max SP Length"));)
+
+ tdlsSetupRsp.WMMInfoStation.max_sp_length = (tANI_U8)val;
+ tdlsSetupRsp.WMMInfoStation.present = 1;
+ }
+ else
+ {
+ /*
+ * TODO: we need to see if we have to support conditions where we have
+ * EDCA parameter info element is needed a) if we need different QOS
+ * parameters for off channel operations or QOS is not supported on
+ * AP link and we wanted to QOS on direct link.
+ */
+ /* Populate QOS info, needed for Peer U-APSD session */
+ /* TODO: Now hardcoded, because PopulateDot11fQOSCapsStation() depends on AP's capability, and
+ TDLS doesn't want to depend on AP's capability */
+ tdlsSetupRsp.QOSCapsStation.present = 1;
+ tdlsSetupRsp.QOSCapsStation.max_sp_length = 0;
+ tdlsSetupRsp.QOSCapsStation.qack = 0;
+ tdlsSetupRsp.QOSCapsStation.acbe_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x08) >> 3);
+ tdlsSetupRsp.QOSCapsStation.acbk_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x04) >> 2);
+ tdlsSetupRsp.QOSCapsStation.acvi_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x02) >> 1);
+ tdlsSetupRsp.QOSCapsStation.acvo_uapsd = (pMac->lim.gLimTDLSUapsdMask & 0x01);
+ }
wlan_cfgGetInt(pMac,WNI_CFG_DOT11_MODE,&selfDot11Mode);
@@ -1532,6 +1582,13 @@ tSirRetStatus limSendTdlsLinkSetupCnfFrame(tpAniSirGlobal pMac,
* AP link and we wanted to QOS on direct link.
*/
+ /* Check self and peer WMM capable */
+ if ((1 == pMac->lim.gLimTDLSWmmMode) &&
+ (CHECK_BIT(peerCapability, TDLS_PEER_WMM_CAP)))
+ {
+ PopulateDot11fWMMParams(pMac, &tdlsSetupCnf.WMMParams, psessionEntry);
+ }
+
/* Check peer is VHT capable*/
if (CHECK_BIT(peerCapability, TDLS_PEER_VHT_CAP))
{
diff --git a/firmware_bin/WCNSS_cfg.dat b/firmware_bin/WCNSS_cfg.dat
index a22533264e65..ec818c3fd5b3 100644
--- a/firmware_bin/WCNSS_cfg.dat
+++ b/firmware_bin/WCNSS_cfg.dat
Binary files differ