diff options
| author | Leela Venkata Kiran Kumar Reddy Chirala <kchirala@qca.qualcomm.com> | 2014-04-07 17:48:08 -0700 |
|---|---|---|
| committer | Pitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com> | 2014-04-22 11:48:41 +0530 |
| commit | 8bfa8e1c950acd006bb4645a11b9a8cb50259928 (patch) | |
| tree | 1daa9a200d84b1b72bca0954c3a5bc69c33ff4e0 | |
| parent | 5d47259ba02d0c2fd7411ac655724b8dc6d127a7 (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.h | 5 | ||||
| -rw-r--r-- | CORE/MAC/inc/sirMacProtDef.h | 2 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessTdls.c | 101 |
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; |
