TDLS: Consider peer capabilities to frame tdls setup cnf frame
While framing the TDLS Setup Confirmation frame, the driver needs to
know if the TDLS peer is VHT/HT capable. The information is passed
by Supplicant to the driver after determining tdls peer capabilities
by parsing respective IEs in TDLS Setup Response frame.
CRs-Fixed: 605665
Change-Id: I5755d40b24042147bc76427883949473d71e7cdb
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index eb92606..078177f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -8868,7 +8868,7 @@
INIT_COMPLETION(pAdapter->tdls_mgmt_comp);
status = sme_SendTdlsMgmtFrame(WLAN_HDD_GET_HAL_CTX(pAdapter), pAdapter->sessionId,
- peerMac, action_code, dialog_token, status_code, (tANI_U8 *)buf, len, responder);
+ peerMac, action_code, dialog_token, status_code, peer_capability, (tANI_U8 *)buf, len, responder);
if (VOS_STATUS_SUCCESS != status)
{
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index 08a88f7..7fa2242 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -211,7 +211,7 @@
pHddTdlsCtx->pAdapter->sessionId,
curr_peer->peerMac,
WLAN_TDLS_DISCOVERY_REQUEST,
- 1, 0, NULL, 0, 0);
+ 1, 0, 0, NULL, 0, 0);
curr_peer->discovery_attempt++;
}
else
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index f182a2b..4936aec 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -4056,6 +4056,7 @@
tANI_U8 dialog;
tANI_U16 statusCode;
tANI_U8 responder;
+ tANI_U32 peerCapability;
tSirMacAddr bssid; // For multi-session, for PE to locate peSession ID
tSirMacAddr peerMac;
tANI_U8 addIe[1]; //Variable lenght. Dont add any field after this.
diff --git a/CORE/MAC/src/pe/lim/limProcessTdls.c b/CORE/MAC/src/pe/lim/limProcessTdls.c
index a844055..e02e73e 100644
--- a/CORE/MAC/src/pe/lim/limProcessTdls.c
+++ b/CORE/MAC/src/pe/lim/limProcessTdls.c
@@ -179,6 +179,15 @@
TDLS_SETUP_STATUS_FAILURE = 37
}etdlsLinkSetupStatus ;
+/* These maps to Kernel TDLS peer capability
+ * flags and should get changed as and when necessary
+ */
+enum tdls_peer_capability {
+ TDLS_PEER_HT_CAP = 0,
+ TDLS_PEER_VHT_CAP = 1,
+ TDLS_PEER_WMM_CAP = 2
+} eTdlsPeerCapability;
+
/* some local defines */
#define LINK_IDEN_BSSID_OFFSET (0)
#define PEER_MAC_OFFSET (12)
@@ -1282,7 +1291,6 @@
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
* let TDLS setup response to come, and we will set our caps based
@@ -1843,7 +1851,7 @@
*/
tSirRetStatus limSendTdlsLinkSetupCnfFrame(tpAniSirGlobal pMac, tSirMacAddr peerMac,
- tANI_U8 dialog, tpPESession psessionEntry, tANI_U8* addIe, tANI_U16 addIeLen)
+ tANI_U8 dialog, tANI_U32 peerCapability, tpPESession psessionEntry, tANI_U8* addIe, tANI_U16 addIeLen)
{
tDot11fTDLSSetupCnf tdlsSetupCnf ;
tANI_U32 status = 0 ;
@@ -1886,15 +1894,15 @@
* AP link and we wanted to QOS on direct link.
*/
- /* Include HT Info IE */
- /* Need to also check the Self Capability ??? TODO Sunil */
- if ( true == psessionEntry->htCapability)
+ /* Check peer is VHT capable*/
+ if (CHECK_BIT(peerCapability, TDLS_PEER_VHT_CAP))
{
- PopulateDot11fHTInfo( pMac, &tdlsSetupCnf.HTInfo, psessionEntry );
+ PopulateDot11fVHTOperation( pMac, &tdlsSetupCnf.VHTOperation);
+ PopulateDot11fHTInfo( pMac, &tdlsSetupCnf.HTInfo, psessionEntry );
}
- if ( true == psessionEntry->vhtCapability)
+ else if (CHECK_BIT(peerCapability, TDLS_PEER_HT_CAP)) /* Check peer is HT capable */
{
- PopulateDot11fVHTOperation( pMac, &tdlsSetupCnf.VHTOperation);
+ PopulateDot11fHTInfo( pMac, &tdlsSetupCnf.HTInfo, psessionEntry );
}
/*
@@ -3546,7 +3554,7 @@
/* send TDLS confim frame to TDLS Peer STA */
- limSendTdlsLinkSetupCnfFrame(pMac, peerMac, tdlsSetupRsp.DialogToken.token, psessionEntry, NULL, 0) ;
+ limSendTdlsLinkSetupCnfFrame(pMac, peerMac, tdlsSetupRsp.DialogToken.token, 0, psessionEntry, NULL, 0) ;
/*
* set the tdls_link_state to TDLS_LINK_SETUP_RSP_WAIT_STATE, and
@@ -5106,7 +5114,7 @@
break;
case SIR_MAC_TDLS_SETUP_CNF:
{
- limSendTdlsLinkSetupCnfFrame(pMac, pSendMgmtReq->peerMac, pSendMgmtReq->dialog,
+ limSendTdlsLinkSetupCnfFrame(pMac, pSendMgmtReq->peerMac, pSendMgmtReq->dialog, pSendMgmtReq->peerCapability,
psessionEntry, &pSendMgmtReq->addIe[0], (pSendMgmtReq->length - sizeof(tSirTdlsSendMgmtReq)));
resultCode = eSIR_SME_SUCCESS;
}
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 7f83a79..d7d4be6 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1389,6 +1389,7 @@
tANI_U8 dialog;
tANI_U16 statusCode;
tANI_U8 responder;
+ tANI_U32 peerCapability;
tANI_U8 *buf;
tANI_U8 len;
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index 83ce767..839b800 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -115,6 +115,7 @@
tANI_U8 dialog;
tANI_U16 statusCode;
tANI_U8 responder;
+ tANI_U32 peerCapability;
tANI_U8 *buf;
tANI_U8 len;
} tTdlsSendMgmtCmdInfo;
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 660be59..4de0d80 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2953,13 +2953,14 @@
\param frame_type - Type of TDLS mgmt frame to be sent.
\param dialog - dialog token used in the frame.
\param status - status to be incuded in the frame.
+ \param peerCapability - peerCapability to be incuded in the frame.
\param buf - additional IEs to be included
\param len - lenght of additional Ies
\param responder - Tdls request type
\- return VOS_STATUS_SUCCES
-------------------------------------------------------------------------*/
VOS_STATUS sme_SendTdlsMgmtFrame(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac,
- tANI_U8 frame_type, tANI_U8 dialog, tANI_U16 status, tANI_U8 *buf, tANI_U8 len, tANI_U8 responder);
+ tANI_U8 frame_type, tANI_U8 dialog, tANI_U16 status, tANI_U32 peerCapability, tANI_U8 *buf, tANI_U8 len, tANI_U8 responder);
/* ---------------------------------------------------------------------------
\fn sme_ChangeTdlsPeerSta
\brief API to Update TDLS peer sta parameters.
diff --git a/CORE/SME/src/csr/csrTdlsProcess.c b/CORE/SME/src/csr/csrTdlsProcess.c
index ed56b12..6a52320 100644
--- a/CORE/SME/src/csr/csrTdlsProcess.c
+++ b/CORE/SME/src/csr/csrTdlsProcess.c
@@ -106,7 +106,7 @@
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
tSmeCmd *tdlsSendMgmtCmd ;
eHalStatus status = eHAL_STATUS_FAILURE ;
-
+
//If connected and in Infra. Only then allow this
if( CSR_IS_SESSION_VALID( pMac, sessionId ) &&
csrIsConnStateConnectedInfra( pMac, sessionId ) &&
@@ -125,6 +125,7 @@
tdlsSendMgmtCmdInfo->dialog = tdlsSendMgmt->dialog ;
tdlsSendMgmtCmdInfo->statusCode = tdlsSendMgmt->statusCode ;
tdlsSendMgmtCmdInfo->responder = tdlsSendMgmt->responder;
+ tdlsSendMgmtCmdInfo->peerCapability = tdlsSendMgmt->peerCapability;
vos_mem_copy(tdlsSendMgmtCmdInfo->peerMac,
tdlsSendMgmt->peerMac, sizeof(tSirMacAddr)) ;
@@ -524,6 +525,7 @@
tdlsSendMgmtReq->dialog = tdlsSendMgmtCmdInfo->dialog ;
tdlsSendMgmtReq->statusCode = tdlsSendMgmtCmdInfo->statusCode ;
tdlsSendMgmtReq->responder = tdlsSendMgmtCmdInfo->responder;
+ tdlsSendMgmtReq->peerCapability = tdlsSendMgmtCmdInfo->peerCapability;
vos_mem_copy(tdlsSendMgmtReq->bssid,
pSession->pConnectBssDesc->bssId, sizeof (tSirMacAddr));
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 4ad459b..95a4fdd 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -9597,13 +9597,14 @@
\param frame_type - Type of TDLS mgmt frame to be sent.
\param dialog - dialog token used in the frame.
\param status - status to be incuded in the frame.
+ \param peerCapability - peer cpabilities
\param buf - additional IEs to be included
\param len - lenght of additional Ies
\param responder - Tdls request type
\- return VOS_STATUS_SUCCES
-------------------------------------------------------------------------*/
VOS_STATUS sme_SendTdlsMgmtFrame(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac,
- tANI_U8 frame_type, tANI_U8 dialog, tANI_U16 statusCode, tANI_U8 *buf, tANI_U8 len, tANI_U8 responder)
+ tANI_U8 frame_type, tANI_U8 dialog, tANI_U16 statusCode, tANI_U32 peerCapability, tANI_U8 *buf, tANI_U8 len, tANI_U8 responder)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
tCsrTdlsSendMgmt sendTdlsReq = {{0}} ;
@@ -9619,6 +9620,7 @@
sendTdlsReq.dialog = dialog;
sendTdlsReq.statusCode = statusCode;
sendTdlsReq.responder = responder;
+ sendTdlsReq.peerCapability = peerCapability;
status = csrTdlsSendMgmtReq(hHal, sessionId, &sendTdlsReq) ;