TDLS : Host Changes supporting PUAPSD implementation.
This commit has the host changes to support the PUAPSD
implementation in the firmware.
Change-Id: I60a33f8067ea316d5179374cf6ec41400ceabbf2
CRs-fixed: 488980
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index e458129..a0ba77a 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -621,7 +621,18 @@
limLog(pMac, LOGP, FL("cfg get disableLDPCWithTxbfAP failed"));
return eSIR_FAILURE;
}
-
+#ifdef FEATURE_WLAN_TDLS
+ if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_BUF_STA_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSBufStaEnabled) != eSIR_SUCCESS)
+ {
+ limLog(pMac, LOGP, FL("cfg get LimTDLSBufStaEnabled failed"));
+ return eSIR_FAILURE;
+ }
+ if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK,(tANI_U32 *) &pMac->lim.gLimTDLSUapsdMask) != eSIR_SUCCESS)
+ {
+ limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
+ return eSIR_FAILURE;
+ }
+#endif
return eSIR_SUCCESS;
}
diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
index cf7b4b0..235bb3e 100644
--- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
+++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
@@ -1202,6 +1202,7 @@
case eWNI_SME_TDLS_SEND_MGMT_REQ:
case eWNI_SME_TDLS_ADD_STA_REQ:
case eWNI_SME_TDLS_DEL_STA_REQ:
+ case eWNI_SME_TDLS_LINK_ESTABLISH_REQ:
#endif
#ifdef FEATURE_WLAN_TDLS_INTERNAL
case eWNI_SME_TDLS_DISCOVERY_START_REQ:
@@ -1349,7 +1350,41 @@
limMsg->bodyptr = NULL;
}
break;
+#ifdef FEATURE_WLAN_TDLS
+ case SIR_HAL_TDLS_IND:
+ {
+ tSirTdlsInd *pTdlsInd = (tpSirTdlsInd)limMsg->bodyptr ;
+ tpDphHashNode pStaDs = NULL ;
+ tpPESession psessionEntry = NULL;
+ tANI_U8 sessionId;
+ if((psessionEntry = peFindSessionByStaId(pMac,pTdlsInd->staIdx,&sessionId))== NULL)
+ {
+ limLog(pMac, LOG1, FL("session does not exist for given bssId\n"));
+ palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
+ limMsg->bodyptr = NULL;
+ return;
+ }
+ if ((pStaDs = dphGetHashEntry(pMac, pTdlsInd->assocId, &psessionEntry->dph.dphHashTable)) == NULL)
+ {
+ limLog(pMac, LOG1, FL("pStaDs Does not exist for given staId\n"));
+ palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
+ limMsg->bodyptr = NULL;
+ return;
+ }
+ if ((STA_ENTRY_TDLS_PEER == pStaDs->staType))
+ {
+ limLog(pMac, LOGE,
+ FL("received TDLS Indication from the Firmware with Reason Code %d "),
+ pTdlsInd->reasonCode);
+ limSendSmeTDLSDelStaInd(pMac, pStaDs, psessionEntry,
+ /*pTdlsInd->reasonCode*/eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE);
+ }
+ palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
+ limMsg->bodyptr = NULL;
+ }
+ break;
+#endif
case SIR_HAL_P2P_NOA_ATTR_IND:
{
tpPESession psessionEntry = &pMac->lim.gpSession[0];
@@ -1888,6 +1923,14 @@
#endif
}
break;
+#ifdef FEATURE_WLAN_TDLS
+ case WDA_SET_TDLS_LINK_ESTABLISH_REQ_RSP:
+ {
+ /*TODO Sunil , See how do you enhance this , Reason Code ???*/
+ limSendSmeTdlsLinkEstablishReqRsp(pMac, 0 , NULL, NULL, eSIR_SUCCESS ) ;
+ break;
+ }
+#endif
default:
vos_mem_free((v_VOID_t*)limMsg->bodyptr);
limMsg->bodyptr = NULL;
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index ae2c512..3196621 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -5406,6 +5406,9 @@
case eWNI_SME_TDLS_DEL_STA_REQ:
limProcessSmeTdlsDelStaReq(pMac, pMsgBuf);
break;
+ case eWNI_SME_TDLS_LINK_ESTABLISH_REQ:
+ limProcesSmeTdlsLinkEstablishReq(pMac, pMsgBuf);
+ break;
#endif
#ifdef FEATURE_WLAN_TDLS_INTERNAL
case eWNI_SME_TDLS_DISCOVERY_START_REQ:
diff --git a/CORE/MAC/src/pe/lim/limProcessTdls.c b/CORE/MAC/src/pe/lim/limProcessTdls.c
index 73f3762..cb15591 100644
--- a/CORE/MAC/src/pe/lim/limProcessTdls.c
+++ b/CORE/MAC/src/pe/lim/limProcessTdls.c
@@ -1,44 +1,23 @@
/*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
+ * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+*/
/*===========================================================================
limProcessTdls.c
@@ -49,10 +28,9 @@
Are listed for each API below.
-
- Copyright (c) 2010 QUALCOMM Incorporated.
+ Copyright (c) 2010 Qualcomm Technologies, Inc.
All Rights Reserved.
- Qualcomm Confidential and Proprietary
+ Qualcomm Technologies Confidential and Proprietary
===========================================================================*/
/*===========================================================================
@@ -1199,10 +1177,10 @@
tSirRetStatus limSendTdlsLinkSetupReqFrame(tpAniSirGlobal pMac,
tSirMacAddr peerMac, tANI_U8 dialog, tpPESession psessionEntry,
- tANI_U8 *addIe, tANI_U16 addIeLen)
+ tANI_U8 *addIe, tANI_U16 addIeLen)
{
tDot11fTDLSSetupReq tdlsSetupReq ;
- tANI_U16 caps = 0 ;
+ tANI_U16 caps = 0 ;
tANI_U32 status = 0 ;
tANI_U32 nPayload = 0 ;
tANI_U32 nBytes = 0 ;
@@ -1217,12 +1195,12 @@
// As of now, we hardcoded to max channel bonding of dot11Mode (i.e HT80 for 11ac/HT40 for 11n)
// uint32 tdlsChannelBondingMode;
- /*
+ /*
* The scheme here is to fill out a 'tDot11fProbeRequest' structure
* and then hand it off to 'dot11fPackProbeRequest' (for
* serialization). We start by zero-initializing the structure:
*/
- palZeroMemory( pMac->hHdd, ( tANI_U8* )&tdlsSetupReq,
+ palZeroMemory( pMac->hHdd, ( tANI_U8* )&tdlsSetupReq,
sizeof( tDot11fTDLSSetupReq ) );
tdlsSetupReq.Category.category = SIR_MAC_ACTION_TDLS ;
tdlsSetupReq.Action.action = SIR_MAC_TDLS_SETUP_REQ ;
@@ -1244,9 +1222,9 @@
swapBitField16(caps, ( tANI_U16* )&tdlsSetupReq.Capabilities );
/* populate supported rate IE */
- PopulateDot11fSuppRates( pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
+ PopulateDot11fSuppRates( pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
&tdlsSetupReq.SuppRates, psessionEntry );
-
+
/* Populate extended supported rates */
PopulateDot11fExtSuppRates( pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
&tdlsSetupReq.ExtSuppRates, psessionEntry );
@@ -1254,10 +1232,10 @@
/* 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
+ * 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 */
@@ -1266,11 +1244,11 @@
tdlsSetupReq.QOSCapsStation.present = 1;
tdlsSetupReq.QOSCapsStation.max_sp_length = 0;
tdlsSetupReq.QOSCapsStation.qack = 0;
- tdlsSetupReq.QOSCapsStation.acbe_uapsd = 0;
- tdlsSetupReq.QOSCapsStation.acbk_uapsd = 0;
- tdlsSetupReq.QOSCapsStation.acvi_uapsd = 0;
- tdlsSetupReq.QOSCapsStation.acvo_uapsd = 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
@@ -1338,10 +1316,10 @@
}
#endif
}
- /*
+ /*
* now we pack it. First, how much space are we going to need?
*/
- status = dot11fGetPackedTDLSSetupReqSize( pMac, &tdlsSetupReq,
+ status = dot11fGetPackedTDLSSetupReqSize( pMac, &tdlsSetupReq,
&nPayload);
if ( DOT11F_FAILED( status ) )
{
@@ -1362,7 +1340,7 @@
* This frame is going out from PE as data frames with special ethertype
* 89-0d.
* 8 bytes of RFC 1042 header
- */
+ */
nBytes = nPayload + ((IS_QOS_ENABLED(psessionEntry))
@@ -1386,28 +1364,28 @@
/* zero out the memory */
palZeroMemory( pMac->hHdd, pFrame, nBytes );
- /*
+ /*
* IE formation, memory allocation is completed, Now form TDLS discovery
* request frame
*/
/* fill out the buffer descriptor */
- header_offset = limPrepareTdlsFrameHeader(pMac, pFrame,
+ header_offset = limPrepareTdlsFrameHeader(pMac, pFrame,
LINK_IDEN_ADDR_OFFSET(tdlsSetupReq), TDLS_LINK_AP, TDLS_INITIATOR, TID_AC_BK, psessionEntry) ;
#ifdef FEATURE_WLAN_TDLS_NEGATIVE
if(pMac->lim.gLimTdlsNegativeBehavior & LIM_TDLS_NEGATIVE_WRONG_BSSID_IN_SETUP_REQ)
{
tdlsSetupReq.LinkIdentifier.bssid[4] = 0xde;
- tdlsSetupReq.LinkIdentifier.bssid[5] = 0xad;
- VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
+ tdlsSetupReq.LinkIdentifier.bssid[5] = 0xad;
+ VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
("TDLS negative running: wrong BSSID %02x:%02x:%02x:%02x:%02x:%02x in TDLS Setup Req"), \
- tdlsSetupReq.LinkIdentifier.bssid[0],
- tdlsSetupReq.LinkIdentifier.bssid[1],
- tdlsSetupReq.LinkIdentifier.bssid[2],
- tdlsSetupReq.LinkIdentifier.bssid[3],
- tdlsSetupReq.LinkIdentifier.bssid[4],
+ tdlsSetupReq.LinkIdentifier.bssid[0],
+ tdlsSetupReq.LinkIdentifier.bssid[1],
+ tdlsSetupReq.LinkIdentifier.bssid[2],
+ tdlsSetupReq.LinkIdentifier.bssid[3],
+ tdlsSetupReq.LinkIdentifier.bssid[4],
tdlsSetupReq.LinkIdentifier.bssid[5]);
}
#endif
@@ -1415,7 +1393,7 @@
__func__, tdlsSetupReq.VHTCaps.supportedChannelWidthSet, tdlsSetupReq.VHTCaps.rxMCSMap,
tdlsSetupReq.VHTCaps.txMCSMap, tdlsSetupReq.VHTCaps.txSupDataRate );
- status = dot11fPackTDLSSetupReq( pMac, &tdlsSetupReq, pFrame
+ status = dot11fPackTDLSSetupReq( pMac, &tdlsSetupReq, pFrame
+ header_offset, nPayload, &nPayload );
if ( DOT11F_FAILED( status ) )
@@ -1432,7 +1410,7 @@
"Discovery Request (0x%08x).") );
}
- //Copy the additional IE.
+ //Copy the additional IE.
//TODO : addIe is added at the end of the frame. This means it doesnt
//follow the order. This should be ok, but we should consider changing this
//if there is any IOT issue.
@@ -1471,7 +1449,7 @@
tSirRetStatus limSendTdlsTeardownFrame(tpAniSirGlobal pMac,
tSirMacAddr peerMac, tANI_U16 reason, tANI_U8 responder, tpPESession psessionEntry,
- tANI_U8 *addIe, tANI_U16 addIeLen)
+ tANI_U8 *addIe, tANI_U16 addIeLen)
{
tDot11fTDLSTeardown teardown ;
tANI_U32 status = 0 ;
@@ -1484,22 +1462,22 @@
#ifndef NO_PAD_TDLS_MIN_8023_SIZE
tANI_U32 padLen = 0;
#endif
- /*
+ /*
* The scheme here is to fill out a 'tDot11fProbeRequest' structure
* and then hand it off to 'dot11fPackProbeRequest' (for
* serialization). We start by zero-initializing the structure:
*/
- palZeroMemory( pMac->hHdd, ( tANI_U8* )&teardown,
+ palZeroMemory( pMac->hHdd, ( tANI_U8* )&teardown,
sizeof( tDot11fTDLSTeardown ) );
teardown.Category.category = SIR_MAC_ACTION_TDLS ;
teardown.Action.action = SIR_MAC_TDLS_TEARDOWN ;
teardown.Reason.code = reason ;
- PopulateDot11fLinkIden( pMac, psessionEntry, &teardown.LinkIdentifier,
+ PopulateDot11fLinkIden( pMac, psessionEntry, &teardown.LinkIdentifier,
peerMac, (responder == TRUE) ? TDLS_RESPONDER : TDLS_INITIATOR) ;
- /*
+ /*
* now we pack it. First, how much space are we going to need?
*/
status = dot11fGetPackedTDLSTeardownSize( pMac, &teardown, &nPayload);
@@ -1522,7 +1500,7 @@
* This frame is going out from PE as data frames with special ethertype
* 89-0d.
* 8 bytes of RFC 1042 header
- */
+ */
nBytes = nPayload + ((IS_QOS_ENABLED(psessionEntry))
@@ -1563,28 +1541,28 @@
/* zero out the memory */
palZeroMemory( pMac->hHdd, pFrame, nBytes );
- /*
+ /*
* IE formation, memory allocation is completed, Now form TDLS discovery
* request frame
*/
/* fill out the buffer descriptor */
- header_offset = limPrepareTdlsFrameHeader(pMac, pFrame,
- LINK_IDEN_ADDR_OFFSET(teardown),
- (reason == eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE)
+ header_offset = limPrepareTdlsFrameHeader(pMac, pFrame,
+ LINK_IDEN_ADDR_OFFSET(teardown),
+ (reason == eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE)
? TDLS_LINK_AP : TDLS_LINK_DIRECT,
(responder == TRUE) ? TDLS_RESPONDER : TDLS_INITIATOR,
TID_AC_VI, psessionEntry) ;
- status = dot11fPackTDLSTeardown( pMac, &teardown, pFrame
+ status = dot11fPackTDLSTeardown( pMac, &teardown, pFrame
+ header_offset, nPayload, &nPayload );
if ( DOT11F_FAILED( status ) )
{
limLog( pMac, LOGE, FL("Failed to pack a TDLS Teardown req \
(0x%08x)."), status );
- palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT,
+ palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT,
( void* ) pFrame, ( void* ) pPacket );
return eSIR_FAILURE;
}
@@ -1594,10 +1572,10 @@
"Teardown Request (0x%08x).") );
}
#if 0
- if(pMac->hal.pCBackFnTxComp == NULL)
+ if(pMac->hal.pCBackFnTxComp == NULL)
{
pMac->hal.pCBackFnTxComp = (tpCBackFnTxComp)limTdlsTeardownTxComplete;
- if(TX_SUCCESS != tx_timer_activate(&pMac->hal.txCompTimer))
+ if(TX_SUCCESS != tx_timer_activate(&pMac->hal.txCompTimer))
{
status = eHAL_STATUS_FAILURE;
return status;
@@ -1610,12 +1588,12 @@
return status ;
}
#endif
-
+
if( addIeLen != 0 )
{
LIM_LOG_TDLS(VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR, ("Copy Additional Ie Len = %d"),
addIeLen ));
- palCopyMemory( pMac->hHdd, pFrame + header_offset + nPayload, addIe, addIeLen );
+ palCopyMemory( pMac->hHdd, pFrame + header_offset + nPayload, addIe, addIeLen );
}
#ifndef NO_PAD_TDLS_MIN_8023_SIZE
@@ -1646,7 +1624,7 @@
HAL_TXRX_FRM_802_11_DATA,
ANI_TXDIR_TODS,
TID_AC_VI,
- limTxComplete, pFrame,
+ limTxComplete, pFrame,
limMgmtTXComplete,
HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME );
if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
@@ -1736,10 +1714,10 @@
tdlsSetupRsp.QOSCapsStation.present = 1;
tdlsSetupRsp.QOSCapsStation.max_sp_length = 0;
tdlsSetupRsp.QOSCapsStation.qack = 0;
- tdlsSetupRsp.QOSCapsStation.acbe_uapsd = 1;
- tdlsSetupRsp.QOSCapsStation.acbk_uapsd = 1;
- tdlsSetupRsp.QOSCapsStation.acvi_uapsd = 1;
- tdlsSetupRsp.QOSCapsStation.acvo_uapsd = 1;
+ 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);
@@ -5110,7 +5088,7 @@
tDot11fIEExtCap *extCapability)
{
extCapability->TDLSPeerPSMSupp = PEER_PSM_SUPPORT ;
- extCapability->TDLSPeerUAPSDBufferSTA = PEER_BUFFER_STA_SUPPORT ;
+ extCapability->TDLSPeerUAPSDBufferSTA = pMac->lim.gLimTDLSBufStaEnabled;
extCapability->TDLSChannelSwitching = CH_SWITCH_SUPPORT ;
extCapability->TDLSSupport = TDLS_SUPPORT ;
extCapability->TDLSProhibited = TDLS_PROHIBITED ;
@@ -5315,6 +5293,38 @@
}
/*
+ * Send Response to Link Establish Request to SME
+ */
+void limSendSmeTdlsLinkEstablishReqRsp(tpAniSirGlobal pMac,
+ tANI_U8 sessionId, tSirMacAddr peerMac, tDphHashNode *pStaDs,
+ tANI_U8 status)
+{
+ tSirMsgQ mmhMsg = {0} ;
+
+ tSirTdlsLinkEstablishReqRsp *pTdlsLinkEstablishReqRsp = NULL ;
+
+ if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,(void * *) &pTdlsLinkEstablishReqRsp,
+ (sizeof(tSirTdlsLinkEstablishReqRsp))))
+ {
+ PELOGE(limLog(pMac, LOGE, FL("Failed to allocate memory"));)
+ return ;
+ }
+ pTdlsLinkEstablishReqRsp->statusCode = status ;
+ if( peerMac )
+ {
+ palCopyMemory(pMac->hHdd, pTdlsLinkEstablishReqRsp->peerMac, peerMac, sizeof(tSirMacAddr));
+ }
+ pTdlsLinkEstablishReqRsp->sessionId = sessionId;
+ mmhMsg.type = eWNI_SME_TDLS_LINK_ESTABLISH_RSP ;
+ mmhMsg.bodyptr = pTdlsLinkEstablishReqRsp;
+ mmhMsg.bodyval = 0;
+ limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
+ return ;
+
+
+}
+
+/*
* Once link is teardown, send Del Peer Ind to SME
*/
static eHalStatus limSendSmeTdlsDelStaRsp(tpAniSirGlobal pMac,
@@ -5490,6 +5500,99 @@
return eSIR_SUCCESS;
}
+
+/*
+ * Process Link Establishment Request from SME .
+ */
+tSirRetStatus limProcesSmeTdlsLinkEstablishReq(tpAniSirGlobal pMac,
+ tANI_U32 *pMsgBuf)
+{
+ /* get all discovery request parameters */
+ tSirTdlsLinkEstablishReq *pTdlsLinkEstablishReq = (tSirTdlsLinkEstablishReq*) pMsgBuf ;
+ tpPESession psessionEntry;
+ tANI_U8 sessionId;
+ tpTdlsLinkEstablishParams pMsgTdlsLinkEstablishReq;
+ tSirMsgQ msg;
+ tANI_U16 peerIdx = 0 ;
+ tpDphHashNode pStaDs = NULL ;
+
+ VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
+ ("Send Mgmt Recieved\n")) ;
+
+ if((psessionEntry = peFindSessionByBssid(pMac, pTdlsLinkEstablishReq->bssid, &sessionId))
+ == NULL)
+ {
+ VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
+ "PE Session does not exist for given sme sessionId %d\n",
+ pTdlsLinkEstablishReq->sessionId);
+ limSendSmeTdlsLinkEstablishReqRsp(pMac, pTdlsLinkEstablishReq->sessionId, pTdlsLinkEstablishReq->peerMac,
+ NULL, eSIR_FAILURE) ;
+ return eSIR_FAILURE;
+ }
+
+ /* check if we are in proper state to work as TDLS client */
+ if (psessionEntry->limSystemRole != eLIM_STA_ROLE)
+ {
+ VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
+ "TDLS Link Establish Request received in wrong system Role %d\n",
+ psessionEntry->limSystemRole);
+ goto lim_tdls_link_establish_error;
+ }
+
+ /*
+ * if we are still good, go ahead and check if we are in proper state to
+ * do TDLS discovery req/rsp/....frames.
+ */
+ if ((psessionEntry->limSmeState != eLIM_SME_ASSOCIATED_STATE) &&
+ (psessionEntry->limSmeState != eLIM_SME_LINK_EST_STATE))
+ {
+
+ limLog(pMac, LOGE, "TDLS Link Establish Request received in invalid LIMsme \
+ state (%d)\n", psessionEntry->limSmeState);
+ goto lim_tdls_link_establish_error;
+ }
+ /*TODO Sunil , TDLSPeer Entry has the STA ID , Use it */
+ pStaDs = dphLookupHashEntry(pMac, pTdlsLinkEstablishReq->peerMac, &peerIdx,
+ &psessionEntry->dph.dphHashTable) ;
+ if ( NULL == pStaDs )
+ {
+ limLog( pMac, LOGE, FL( "pStaDs is NULL \n" ));
+ goto lim_tdls_link_establish_error;
+
+ }
+ if ( eHAL_STATUS_SUCCESS != palAllocateMemory(
+ pMac->hHdd, (void **) &pMsgTdlsLinkEstablishReq, sizeof( tTdlsLinkEstablishParams )))
+ {
+ limLog( pMac, LOGE,
+ FL( "Unable to allocate memory TDLS Link Establish Request \n" ));
+ return eSIR_MEM_ALLOC_FAILED;
+ }
+
+ palZeroMemory( pMac->hHdd, (tANI_U8 *)pMsgTdlsLinkEstablishReq, sizeof(tpTdlsLinkEstablishParams));
+
+ pMsgTdlsLinkEstablishReq->sta_idx = pStaDs->staIndex;
+ pMsgTdlsLinkEstablishReq->is_responder = pTdlsLinkEstablishReq->isResponder;
+ pMsgTdlsLinkEstablishReq->uapsd_queues = pTdlsLinkEstablishReq->uapsdQueues;
+ pMsgTdlsLinkEstablishReq->max_sp = pTdlsLinkEstablishReq->maxSp;
+ pMsgTdlsLinkEstablishReq->is_bufsta = pTdlsLinkEstablishReq->isBufSta;
+ msg.type = WDA_SET_TDLS_LINK_ESTABLISH_REQ;
+ msg.reserved = 0;
+ msg.bodyptr = pMsgTdlsLinkEstablishReq;
+ msg.bodyval = 0;
+ if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
+ {
+ limLog(pMac, LOGE, FL("halPostMsgApi failed\n"));
+ goto lim_tdls_link_establish_error;
+ }
+ return eSIR_SUCCESS;
+lim_tdls_link_establish_error:
+ limSendSmeTdlsLinkEstablishReqRsp(pMac, psessionEntry->smeSessionId, pTdlsLinkEstablishReq->peerMac,
+ NULL, eSIR_FAILURE) ;
+
+ return eSIR_SUCCESS;
+}
+
+
/* Delete all the TDLS peer connected before leaving the BSS */
tSirRetStatus limDeleteTDLSPeers(tpAniSirGlobal pMac, tpPESession psessionEntry)
{
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
index 3ef5351..bb7ac66 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
@@ -1,44 +1,23 @@
/*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * Copyright (c) 2012, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
+ * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+*/
/*
* Airgo Networks, Inc proprietary. All rights reserved.
* This file limSendSmeRspMessages.h contains the definitions for
@@ -124,6 +103,9 @@
void limSendSmeTdlsDisRsp(tpAniSirGlobal pMac, tSirResultCodes statusCode, tANI_U16 msgType);
void limSendSmeTdlsLinkStartRsp(tpAniSirGlobal pMac, tSirResultCodes statusCode, tSirMacAddr peerMac, tANI_U16 msgType);
void limSendSmeTdlsTeardownRsp(tpAniSirGlobal pMac, tSirResultCodes statusCode, tSirMacAddr peerMac, tANI_U16 msgType);
+void limSendSmeTdlsLinkEstablishReqRsp(tpAniSirGlobal pMac,
+ tANI_U8 sessionId, tSirMacAddr peerMac, tDphHashNode *pStaDs,
+ tANI_U8 status);
#endif
#endif /* __LIM_SEND_SME_RSP_H */
diff --git a/CORE/MAC/src/pe/lim/limTypes.h b/CORE/MAC/src/pe/lim/limTypes.h
index 00bff88..8f86cf9 100644
--- a/CORE/MAC/src/pe/lim/limTypes.h
+++ b/CORE/MAC/src/pe/lim/limTypes.h
@@ -739,6 +739,8 @@
tANI_U32 *pMsgBuf);
tSirRetStatus limProcessSmeTdlsAddStaReq(tpAniSirGlobal pMac,
tANI_U32 *pMsgBuf);
+tSirRetStatus limProcesSmeTdlsLinkEstablishReq(tpAniSirGlobal pMac,
+ tANI_U32 *pMsgBuf);
tSirRetStatus limProcessSmeTdlsDelStaReq(tpAniSirGlobal pMac,
tANI_U32 *pMsgBuf);
void limSendSmeTDLSDeleteAllPeerInd(tpAniSirGlobal pMac, tpPESession psessionEntry);