summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeela Venkata Kiran Kumar Reddy Chirala <kchirala@qca.qualcomm.com>2014-04-07 17:48:08 -0700
committerPitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com>2014-04-22 11:48:41 +0530
commit8bfa8e1c950acd006bb4645a11b9a8cb50259928 (patch)
tree1daa9a200d84b1b72bca0954c3a5bc69c33ff4e0
parent5d47259ba02d0c2fd7411ac655724b8dc6d127a7 (diff)
LIM: Pass Operating Channel and Class information to the firmware
This commit ensures to pass the TDLS peer's operating channel to the firmware in TdlsLinkEstablishReq. Change-Id: Iaf017fe29f4134846dc2b14cfc1496aa27446b9b CRs-fixed: 646569
-rw-r--r--CORE/MAC/inc/sirApi.h5
-rw-r--r--CORE/MAC/inc/sirMacProtDef.h2
-rw-r--r--CORE/MAC/src/pe/lim/limProcessTdls.c101
3 files changed, 106 insertions, 2 deletions
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index f5d0807041e0..8bf81bf404d1 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -4202,9 +4202,14 @@ typedef struct
tANI_U8 uapsdQueues; // Peer's uapsd Queues Information
tANI_U8 maxSp; // Peer's Supported Maximum Service Period
tANI_U8 isBufSta; // Does Peer Support as Buffer Station.
+ tANI_U8 isOffChannelSupported; // Does Peer Support as TDLS Off Channel.
tANI_U8 isResponder; // Is Peer a responder.
tSirMacAddr bssid; // For multi-session, for PE to locate peSession ID
tSirMacAddr peerMac;
+ tANI_U8 supportedChannelsLen;
+ tANI_U8 supportedChannels[SIR_MAC_MAX_SUPP_CHANNELS];
+ tANI_U8 supportedOperClassesLen;
+ tANI_U8 supportedOperClasses[SIR_MAC_MAX_SUPP_OPER_CLASSES];
}tSirTdlsLinkEstablishReq, *tpSirTdlsLinkEstablishReq;
/* TDLS Request struct SME-->PE */
diff --git a/CORE/MAC/inc/sirMacProtDef.h b/CORE/MAC/inc/sirMacProtDef.h
index f5ae017fde8b..8ebc47de24fb 100644
--- a/CORE/MAC/inc/sirMacProtDef.h
+++ b/CORE/MAC/inc/sirMacProtDef.h
@@ -1684,6 +1684,8 @@ typedef struct sSirMacRpiReportIE
#define SIR_MAC_MAX_SUPP_RATES 32
+#define SIR_MAC_MAX_SUPP_CHANNELS 100
+#define SIR_MAC_MAX_SUPP_OPER_CLASSES 32
#define SIR_MAC_MAX_EXTN_CAP 8
// VHT Capabilities Info
diff --git a/CORE/MAC/src/pe/lim/limProcessTdls.c b/CORE/MAC/src/pe/lim/limProcessTdls.c
index c5352fdf8d60..8a2cfcffe730 100644
--- a/CORE/MAC/src/pe/lim/limProcessTdls.c
+++ b/CORE/MAC/src/pe/lim/limProcessTdls.c
@@ -126,6 +126,10 @@ void PopulateDot11fLinkIden(tpAniSirGlobal pMac, tpPESession psessionEntry,
void PopulateDot11fTdlsExtCapability(tpAniSirGlobal pMac,
tDot11fIEExtCap *extCapability) ;
+void PopulateDot11fTdlsOffchannelParams(tpAniSirGlobal pMac,
+ tpPESession psessionEntry,
+ tDot11fIESuppChannels *suppChannels,
+ tDot11fIESuppOperatingClasses *suppOperClasses);
void limLogVHTCap(tpAniSirGlobal pMac,
tDot11fIEVHTCaps *pDot11f);
tSirRetStatus limPopulateVhtMcsSet(tpAniSirGlobal pMac,
@@ -1045,6 +1049,10 @@ static tSirRetStatus limSendTdlsDisRspFrame(tpAniSirGlobal pMac,
PopulateDot11fTdlsHtVhtCap( pMac, selfDot11Mode, &tdlsDisRsp.HTCaps,
&tdlsDisRsp.VHTCaps, psessionEntry );
+ if ( 1 == pMac->lim.gLimTDLSOffChannelEnabled )
+ PopulateDot11fTdlsOffchannelParams( pMac, psessionEntry,
+ &tdlsDisRsp.SuppChannels,
+ &tdlsDisRsp.SuppOperatingClasses);
/*
* now we pack it. First, how much space are we going to need?
*/
@@ -1331,6 +1339,10 @@ tSirRetStatus limSendTdlsLinkSetupReqFrame(tpAniSirGlobal pMac,
PopulateDotfTdlsVhtAID( pMac, selfDot11Mode, peerMac,
&tdlsSetupReq.AID, psessionEntry );
+ if ( 1 == pMac->lim.gLimTDLSOffChannelEnabled )
+ PopulateDot11fTdlsOffchannelParams( pMac, psessionEntry,
+ &tdlsSetupReq.SuppChannels,
+ &tdlsSetupReq.SuppOperatingClasses);
/*
* now we pack it. First, how much space are we going to need?
*/
@@ -1756,6 +1768,10 @@ static tSirRetStatus limSendTdlsSetupRspFrame(tpAniSirGlobal pMac,
PopulateDotfTdlsVhtAID( pMac, selfDot11Mode, peerMac,
&tdlsSetupRsp.AID, psessionEntry );
+ if ( 1 == pMac->lim.gLimTDLSOffChannelEnabled )
+ PopulateDot11fTdlsOffchannelParams( pMac, psessionEntry,
+ &tdlsSetupRsp.SuppChannels,
+ &tdlsSetupRsp.SuppOperatingClasses);
tdlsSetupRsp.Status.status = setupStatus ;
/*
@@ -4934,6 +4950,34 @@ add_sta_error:
return status ;
}
+void PopulateDot11fTdlsOffchannelParams(tpAniSirGlobal pMac,
+ tpPESession psessionEntry,
+ tDot11fIESuppChannels *suppChannels,
+ tDot11fIESuppOperatingClasses *suppOperClasses)
+{
+ tANI_U32 numChans = WNI_CFG_VALID_CHANNEL_LIST_LEN;
+ tANI_U8 validChan[WNI_CFG_VALID_CHANNEL_LIST_LEN];
+ tANI_U8 i;
+ if (wlan_cfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
+ validChan, &numChans) != eSIR_SUCCESS)
+ {
+ /**
+ * Could not get Valid channel list from CFG.
+ * Log error.
+ */
+ limLog(pMac, LOGP,
+ FL("could not retrieve Valid channel list"));
+ }
+ suppChannels->num_bands = (tANI_U8) numChans;
+
+ for ( i = 0U; i < suppChannels->num_bands; i++)
+ {
+ suppChannels->bands[i][0] = validChan[i];
+ suppChannels->bands[i][1] = 1;
+ }
+ suppChannels->present = 1 ;
+ return ;
+}
/*
* FUNCTION: Populate Link Identifier element IE
*
@@ -4971,7 +5015,7 @@ void PopulateDot11fTdlsExtCapability(tpAniSirGlobal pMac,
{
extCapability->TDLSPeerPSMSupp = PEER_PSM_SUPPORT ;
extCapability->TDLSPeerUAPSDBufferSTA = pMac->lim.gLimTDLSBufStaEnabled;
- extCapability->TDLSChannelSwitching = CH_SWITCH_SUPPORT ;
+ extCapability->TDLSChannelSwitching = pMac->lim.gLimTDLSOffChannelEnabled ;
extCapability->TDLSSupport = TDLS_SUPPORT ;
extCapability->TDLSProhibited = TDLS_PROHIBITED ;
extCapability->TDLSChanSwitProhibited = TDLS_CH_SWITCH_PROHIBITED ;
@@ -5384,7 +5428,32 @@ lim_tdls_del_sta_error:
return eSIR_SUCCESS;
}
-
+/* Intersects the two input arrays and outputs an array */
+/* For now the array length of tANI_U8 suffices */
+static void limTdlsGetIntersection(tANI_U8 *input_array1,tANI_U8 input1_length,
+ tANI_U8 *input_array2,tANI_U8 input2_length,
+ tANI_U8 *output_array,tANI_U8 *output_length)
+{
+ tANI_U8 i,j,k=0,flag=0;
+ for(i=0;i<input1_length;i++)
+ {
+ flag=0;
+ for(j=0;j<input2_length;j++)
+ {
+ if(input_array1[i]==input_array2[j])
+ {
+ flag=1;
+ break;
+ }
+ }
+ if(flag==1)
+ {
+ output_array[k]=input_array1[i];
+ k++;
+ }
+ }
+ *output_length = k;
+}
/*
* Process Link Establishment Request from SME .
*/
@@ -5459,6 +5528,34 @@ tSirRetStatus limProcesSmeTdlsLinkEstablishReq(tpAniSirGlobal pMac,
pMsgTdlsLinkEstablishReq->uapsdQueues = pTdlsLinkEstablishReq->uapsdQueues;
pMsgTdlsLinkEstablishReq->maxSp = pTdlsLinkEstablishReq->maxSp;
pMsgTdlsLinkEstablishReq->isBufsta = pTdlsLinkEstablishReq->isBufSta;
+ pMsgTdlsLinkEstablishReq->isOffChannelSupported =
+ pTdlsLinkEstablishReq->isOffChannelSupported;
+ pMsgTdlsLinkEstablishReq->isOffChannelSupported = 1;
+
+ if ( 0 != pTdlsLinkEstablishReq->supportedChannelsLen)
+ {
+ tANI_U32 selfNumChans = WNI_CFG_VALID_CHANNEL_LIST_LEN;
+ tANI_U8 selfSupportedChannels[WNI_CFG_VALID_CHANNEL_LIST_LEN];
+ if (wlan_cfgGetStr(pMac, WNI_CFG_VALID_CHANNEL_LIST,
+ selfSupportedChannels, &selfNumChans) != eSIR_SUCCESS)
+ {
+ /**
+ * Could not get Valid channel list from CFG.
+ * Log error.
+ */
+ limLog(pMac, LOGP,
+ FL("could not retrieve Valid channel list"));
+ }
+ limTdlsGetIntersection(selfSupportedChannels, selfNumChans,
+ pTdlsLinkEstablishReq->supportedChannels,
+ pTdlsLinkEstablishReq->supportedChannelsLen,
+ pMsgTdlsLinkEstablishReq->validChannels,
+ &pMsgTdlsLinkEstablishReq->validChannelsLen);
+ }
+ vos_mem_copy(pMsgTdlsLinkEstablishReq->validOperClasses,
+ pTdlsLinkEstablishReq->supportedOperClasses, pTdlsLinkEstablishReq->supportedOperClassesLen);
+ pMsgTdlsLinkEstablishReq->validOperClassesLen =
+ pTdlsLinkEstablishReq->supportedOperClassesLen;
msg.type = WDA_SET_TDLS_LINK_ESTABLISH_REQ;
msg.reserved = 0;
msg.bodyptr = pMsgTdlsLinkEstablishReq;