wlan: CCX upload support for statically linked driver
jb_mr2 enforces drivers must be statically linked and
does not support dynamically linked driver. CCX feature
has 7 proprietary files which cannot be pushed to public domain.
The changes in the 7 files are pushed to wpa_supplicant.
These are the changes required to support uploaded
approach and as well as support backward compatibility.
1. Traffic stream Metrics and TSR IE structures are moved
to common header files
2. Forwarding the IAPP data frame to wpa_supplicant incase
of CCX connection along with LLC header
3. Implementation of driver private commands
3.1 SETCCKMIE
3.2 GETTSMSTATS
3.3 SETCCXROAMSCANCHANNELS
4. Implementation of IWEVCUSTOM events
4.1 Sending CCKMPREAUTHNOTIFY event with bssid and TSF
4.2 Sending TSMIE event
4.3 Sending CCXADJAPREP event with roam delay info
5. New feature macro FEATURE_WLAN_CCX_UPLOAD added
Change-Id: Ic185d531de6e5b13984df1c563b0453f313afa27
CRs-Fixed: 555470
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 85b97e3..55bd804 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -343,6 +343,15 @@
} tCsrCcxCckmInfo;
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+#define CSR_DOT11F_IE_RSN_MAX_LEN (114) /*TODO: duplicate one in dot11f.h */
+
+typedef struct tagCsrCcxCckmIe
+{
+ tANI_U8 cckmIe[CSR_DOT11F_IE_RSN_MAX_LEN];
+ tANI_U8 cckmIeLen;
+} tCsrCcxCckmIe;
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
typedef struct tagCsrScanResultFilter
{
@@ -468,6 +477,11 @@
eCSR_ROAM_UNPROT_MGMT_FRAME_IND,
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ eCSR_ROAM_TSM_IE_IND,
+ eCSR_ROAM_CCKM_PREAUTH_NOTIFY,
+ eCSR_ROAM_CCX_ADJ_AP_REPORT_IND,
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
}eRoamCmdStatus;
@@ -1167,6 +1181,11 @@
#ifdef FEATURE_WLAN_CCX
tANI_BOOLEAN isCCXAssoc;
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ tSirTsmIE tsmIe;
+ tANI_U32 timestamp[2];
+ tANI_U16 tsmRoamDelay;
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
#endif
void* pRemainCtx;
tANI_U32 rxChan;
@@ -1529,6 +1548,21 @@
typedef void ( *tCsrRssiCallback) (v_S7_t rssi, tANI_U32 staId, void *pContext);
+
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/*---------------------------------------------------------------------------
+ This is the type for a tsm stats callback to be registered with SME
+ for getting tsm stats
+
+ \param tsmMetrics - tsmMetrics
+ \param pContext - any user data given at callback registration.
+ \return None
+
+---------------------------------------------------------------------------*/
+
+typedef void ( *tCsrTsmStatsCallback) (tAniTrafStrmMetrics tsmMetrics, tANI_U32 staId, void *pContext);
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
/*---------------------------------------------------------------------------
This is the type for a snr callback to be registered with SME
for getting snr
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index 69a1ad4..bf954e3 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -930,6 +930,9 @@
tANI_U8 prevOpChannel;
tANI_U16 clientDissSecs;
tANI_U32 roamTS1;
+#if defined(FEATURE_WLAN_CCX_UPLOAD)
+ tCsrCcxCckmIe suppCckmIeInfo;
+#endif
#endif
tANI_U8 bRefAssocStartCnt; //Tracking assoc start indication
/* to force the AP initiate fresh 802.1x authentication after re-association need to clear
@@ -1245,6 +1248,13 @@
void * pContext,
void * pVosContext);
#endif
+
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+eHalStatus csrGetTsmStats(tpAniSirGlobal pMac, tCsrTsmStatsCallback callback, tANI_U8 staId,
+ tCsrBssid bssId, void *pContext, void* pVosContext,
+ tANI_U8 tid);
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
eHalStatus csrRoamRegisterCallback(tpAniSirGlobal pMac, csrRoamCompleteCallback callback, void *pContext);
/* ---------------------------------------------------------------------------
\fn csrGetConfigParam
@@ -1363,6 +1373,8 @@
#ifdef FEATURE_WLAN_CCX
//Returns whether the current association is a CCX assoc or not
tANI_BOOLEAN csrRoamIsCCXAssoc(tpAniSirGlobal pMac);
+tANI_BOOLEAN csrRoamIsCcxIniFeatureEnabled(tpAniSirGlobal pMac);
+tANI_BOOLEAN csrNeighborRoamIsCCXAssoc(tpAniSirGlobal pMac);
#endif
//Remove this code once SLM_Sessionization is supported
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index 3d46c51..62a11c6 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -248,14 +248,21 @@
VOS_STATUS csrNeighborRoamChannelsFilterByCurrentBand(
tpAniSirGlobal pMac,
tANI_U8* pInputChannelList,
- int inputNumOfChannels,
+ tANI_U8 inputNumOfChannels,
tANI_U8* pOutputChannelList,
- int* pMergedOutputNumOfChannels
+ tANI_U8* pMergedOutputNumOfChannels
);
VOS_STATUS csrNeighborRoamReassocIndCallback(v_PVOID_t pAdapter,
v_U8_t trafficStatus,
v_PVOID_t pUserCtxt,
v_S7_t avgRssi);
+VOS_STATUS csrNeighborRoamMergeChannelLists(tpAniSirGlobal pMac,
+ tANI_U8 *pInputChannelList,
+ tANI_U8 inputNumOfChannels,
+ tANI_U8 *pOutputChannelList,
+ tANI_U8 outputNumOfChannels,
+ tANI_U8 *pMergedOutputNumOfChannels);
+
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
#define ROAM_SCAN_OFFLOAD_START 1
#define ROAM_SCAN_OFFLOAD_STOP 2
@@ -287,6 +294,15 @@
eHalStatus csrNeighborRoamStartLfrScan(tpAniSirGlobal pMac);
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+VOS_STATUS csrSetCCKMIe(tpAniSirGlobal pMac, const tANI_U8 sessionId,
+ const tANI_U8 *pCckmIe,
+ const tANI_U8 ccKmIeLen);
+VOS_STATUS csrRoamReadTSF(tpAniSirGlobal pMac, tANI_U8 *pTimestamp);
+
+
+#endif /*FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index d93fc96..a107768 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -327,12 +327,18 @@
#endif /* FEATURE_WLAN_TDLS */
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
-eHalStatus csrFlushBgScanRoamChannelList(tpAniSirGlobal pMac);
+eHalStatus csrFlushCfgBgScanRoamChannelList(tpAniSirGlobal pMac);
eHalStatus csrCreateBgScanRoamChannelList(tpAniSirGlobal pMac,
const tANI_U8 *pChannelList,
const tANI_U8 numChannels);
eHalStatus csrUpdateBgScanConfigIniChannelList(tpAniSirGlobal pMac, eCsrBand eBand);
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+eHalStatus csrCreateRoamScanChannelList(tpAniSirGlobal pMac,
+ tANI_U8 *pChannelList,
+ tANI_U8 numChannels,
+ const eCsrBand eBand);
+#endif
#endif //#if !defined( __SMEINSIDE_H )
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 47830a7..35b9756 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -824,6 +824,36 @@
void *pContext,
void* pVosContext);
#endif
+
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/* ---------------------------------------------------------------------------
+ \fn sme_GetTsmStats
+ \brief a wrapper function that client calls to register a callback to get TSM Stats
+
+ \param callback - SME sends back the requested stats using the callback
+ \param staId - The station ID for which the stats is requested for
+ \param pContext - user context to be passed back along with the callback
+ \param pVosContext - vos context
+ \return eHalStatus
+ ---------------------------------------------------------------------------*/
+eHalStatus sme_GetTsmStats(tHalHandle hHal,
+ tCsrTsmStatsCallback callback,
+ tANI_U8 staId, tCsrBssid bssId,
+ void *pContext, void* pVosContext, tANI_U8 tid);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_SetCCKMIe
+ \brief function to store the CCKM IE passed from supplicant and use it while packing
+ reassociation request
+ \param hHal - HAL handle for device
+ \param pCckmIe - pointer to CCKM IE data
+ \param pCckmIeLen - length of the CCKM IE
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_SetCCKMIe(tHalHandle hHal, tANI_U8 sessionId, tANI_U8 *pCckmIe, tANI_U8 cckmIeLen);
+
+
+#endif /*FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
/* ---------------------------------------------------------------------------
\fn sme_CfgSetInt
\brief a wrapper function that HDD calls to set parameters in CFG.
@@ -2664,6 +2694,20 @@
eHalStatus sme_ChangeRoamScanChannelList(tHalHandle hHal, tANI_U8 *pChannelList,
tANI_U8 numChannels);
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+/*--------------------------------------------------------------------------
+ \brief sme_SetCcxRoamScanChannelList() - set ccx roam scan channel list
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_SetCcxRoamScanChannelList(tHalHandle hHal,
+ tANI_U8 *pChannelList,
+ tANI_U8 numChannels);
+#endif
+
/*--------------------------------------------------------------------------
\brief csrUpdateBgScanConfigIniChannelList() - Update bgscan roam cache
This is a synchronuous call
diff --git a/CORE/SME/src/QoS/sme_Qos.c b/CORE/SME/src/QoS/sme_Qos.c
index c5ee863..e13e563 100644
--- a/CORE/SME/src/QoS/sme_Qos.c
+++ b/CORE/SME/src/QoS/sme_Qos.c
@@ -64,7 +64,7 @@
#include "smsDebug.h"
#include "utilsParser.h"
#endif
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include <csrCcx.h>
#endif
@@ -2491,7 +2491,7 @@
{
// this is the only flow aggregated in this TSPEC
status = SME_QOS_STATUS_RELEASE_SUCCESS_RSP;
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
if (ac == SME_QOS_EDCA_AC_VO)
{
// Indicate to neighbor roam logic of the new required VO
@@ -5473,7 +5473,7 @@
}
WLAN_VOS_DIAG_LOG_REPORT(log_ptr);
#endif //FEATURE_WLAN_DIAG_SUPPORT
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
if (ac == SME_QOS_EDCA_AC_VO)
{
// Indicate to neighbor roam logic of the new required VO
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 3c822a6..c692528 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -81,9 +81,9 @@
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
#include "csrNeighborRoam.h"
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "csrCcx.h"
-#endif /* FEATURE_WLAN_CCX */
+#endif /* FEATURE_WLAN_CCX && !FEATURE_WLAN_CCX_UPLOAD */
#define CSR_NUM_IBSS_START_CHANNELS_50 4
#define CSR_NUM_IBSS_START_CHANNELS_24 3
#define CSR_DEF_IBSS_START_CHANNEL_50 36
@@ -1035,11 +1035,33 @@
return pMac->roam.configParam.bandCapability;
}
+
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/*
+ This function flushes the roam scan cache
+*/
+eHalStatus csrFlushRoamScanRoamChannelList(tpAniSirGlobal pMac)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+
+ /* Free up the memory first (if required) */
+ if (NULL != pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList)
+ {
+ vos_mem_free(pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList);
+ pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList = NULL;
+ pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.numOfChannels = 0;
+ }
+ return status;
+}
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
+
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
/*
This function flushes the roam scan cache
*/
-eHalStatus csrFlushBgScanRoamChannelList(tpAniSirGlobal pMac)
+eHalStatus csrFlushCfgBgScanRoamChannelList(tpAniSirGlobal pMac)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
@@ -1124,7 +1146,7 @@
ChannelList[outNumChannels++] = inPtr[i];
}
}
- csrFlushBgScanRoamChannelList(pMac);
+ csrFlushCfgBgScanRoamChannelList(pMac);
csrCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
}
else if (eCSR_BAND_5G == eBand)
@@ -1139,7 +1161,7 @@
ChannelList[outNumChannels++] = inPtr[i];
}
}
- csrFlushBgScanRoamChannelList(pMac);
+ csrFlushCfgBgScanRoamChannelList(pMac);
csrCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
}
else if (eCSR_BAND_ALL == eBand)
@@ -1152,7 +1174,7 @@
ChannelList[outNumChannels++] = inPtr[i];
}
}
- csrFlushBgScanRoamChannelList(pMac);
+ csrFlushCfgBgScanRoamChannelList(pMac);
csrCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
}
else
@@ -1166,6 +1188,129 @@
}
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/* This function modifies the roam scan channel list as per AP neighbor
+ report; AP neighbor report may be empty or may include only other AP
+ channels; in any case, we merge the channel list with the learned occupied
+ channels list.
+ if the band is 2.4G, then make sure channel list contains only 2.4G valid channels
+ if the band is 5G, then make sure channel list contains only 5G valid channels
+*/
+eHalStatus csrCreateRoamScanChannelList(tpAniSirGlobal pMac,
+ tANI_U8 *pChannelList,
+ tANI_U8 numChannels,
+ const eCsrBand eBand)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ tANI_U8 outNumChannels = 0;
+ tANI_U8 inNumChannels = numChannels;
+ tANI_U8 *inPtr = pChannelList;
+ tANI_U8 i = 0;
+ tANI_U8 ChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0};
+ tANI_U8 tmpChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0};
+ tANI_U8 mergedOutputNumOfChannels = 0;
+ tpCsrChannelInfo currChannelListInfo = &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
+
+ /* Create a Union of occupied channel list learnt by the DUT along with the Neighbor
+ * report Channels. This increases the chances of the DUT to get a candidate AP while
+ * roaming even if the Neighbor Report is not able to provide sufficient information. */
+ if (pMac->scan.occupiedChannels.numChannels)
+ {
+ csrNeighborRoamMergeChannelLists(pMac,
+ &pMac->scan.occupiedChannels.channelList[0],
+ pMac->scan.occupiedChannels.numChannels,
+ inPtr,
+ inNumChannels,
+ &mergedOutputNumOfChannels);
+ inNumChannels = mergedOutputNumOfChannels;
+ }
+
+ if (eCSR_BAND_24 == eBand)
+ {
+ for (i = 0; i < inNumChannels; i++)
+ {
+ if (CSR_IS_CHANNEL_24GHZ(inPtr[i]) && csrRoamIsChannelValid(pMac, inPtr[i]))
+ {
+ ChannelList[outNumChannels++] = inPtr[i];
+ }
+ }
+ }
+ else if (eCSR_BAND_5G == eBand)
+ {
+ for (i = 0; i < inNumChannels; i++)
+ {
+ /* Add 5G Non-DFS channel */
+ if (CSR_IS_CHANNEL_5GHZ(inPtr[i]) &&
+ csrRoamIsChannelValid(pMac, inPtr[i]) &&
+ !CSR_IS_CHANNEL_DFS(inPtr[i]))
+ {
+ ChannelList[outNumChannels++] = inPtr[i];
+ }
+ }
+ }
+ else if (eCSR_BAND_ALL == eBand)
+ {
+ for (i = 0; i < inNumChannels; i++)
+ {
+ if (csrRoamIsChannelValid(pMac, inPtr[i]) &&
+ !CSR_IS_CHANNEL_DFS(inPtr[i]))
+ {
+ ChannelList[outNumChannels++] = inPtr[i];
+ }
+ }
+ }
+ else
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_WARN,
+ "Invalid band, No operation carried out (Band %d)", eBand);
+ return eHAL_STATUS_INVALID_PARAMETER;
+ }
+
+ /* if roaming within band is enabled, then select only the
+ in band channels .
+ This is required only if the band capability is set to ALL,
+ E.g., if band capability is only 2.4G then all the channels in the
+ list are already filtered for 2.4G channels, hence ignore this check*/
+
+ if ((eCSR_BAND_ALL == eBand) && CSR_IS_ROAM_INTRA_BAND_ENABLED(pMac))
+ {
+ csrNeighborRoamChannelsFilterByCurrentBand(
+ pMac,
+ ChannelList,
+ outNumChannels,
+ tmpChannelList,
+ &outNumChannels);
+ palCopyMemory(pMac->hHdd, ChannelList,
+ tmpChannelList, outNumChannels);
+ }
+
+ /* Prepare final roam scan channel list */
+ if(outNumChannels)
+ {
+ /* Clear the channel list first */
+ if (NULL != currChannelListInfo->ChannelList)
+ {
+ vos_mem_free(currChannelListInfo->ChannelList);
+ currChannelListInfo->ChannelList = NULL;
+ currChannelListInfo->numOfChannels = 0;
+ }
+
+ currChannelListInfo->ChannelList = vos_mem_malloc(outNumChannels * sizeof(tANI_U8));
+ if (NULL == currChannelListInfo->ChannelList)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_FATAL,
+ "Failed to allocate memory for roam scan channel list");
+ currChannelListInfo->numOfChannels = 0;
+ return VOS_STATUS_E_RESOURCES;
+ }
+ palCopyMemory(pMac->hHdd, currChannelListInfo->ChannelList,
+ ChannelList, outNumChannels);
+ }
+ return status;
+}
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
eHalStatus csrSetBand(tHalHandle hHal, eCsrBand eBand)
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
@@ -4489,7 +4634,7 @@
status = csrRoamIssueDisassociate( pMac, sessionId, eCSR_ROAM_SUBSTATE_DISCONNECT_CONTINUE_ROAMING, FALSE);
break;
case eCsrSmeIssuedFTReassoc:
- smsLog(pMac, LOGE, FL("received FT Reassoc Req "));
+ smsLog(pMac, LOG1, FL("received FT Reassoc Req "));
status = csrProcessFTReassocRoamCommand(pMac, pCommand);
break;
@@ -4995,6 +5140,24 @@
}
}
+#ifdef FEATURE_WLAN_CCX
+/* ---------------------------------------------------------------------------
+
+ \fn csrNeighborRoamIsCCXAssoc
+
+ \brief This function returns whether the current association is a CCX assoc or not
+
+ \param pMac - The handle returned by macOpen.
+
+ \return eANI_BOOLEAN_TRUE if current assoc is CCX, eANI_BOOLEAN_FALSE otherwise
+
+---------------------------------------------------------------------------*/
+tANI_BOOLEAN csrNeighborRoamIsCCXAssoc(tpAniSirGlobal pMac)
+{
+ return pMac->roam.neighborRoamInfo.isCCXAssoc;
+}
+#endif /* FEATURE_WLAN_CCX */
+
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
//Returns whether "FW based BG scan" is currently enabled...or not
tANI_BOOLEAN csrRoamIsRoamOffloadScanEnabled(tpAniSirGlobal pMac)
@@ -5004,6 +5167,13 @@
#endif
#endif
+#if defined(FEATURE_WLAN_CCX)
+tANI_BOOLEAN csrRoamIsCcxIniFeatureEnabled(tpAniSirGlobal pMac)
+{
+ return pMac->roam.configParam.isCcxIniFeatureEnabled;
+}
+#endif /*FEATURE_WLAN_CCX*/
+
//Return true means the command can be release, else not
static tANI_BOOLEAN csrRoamProcessResults( tpAniSirGlobal pMac, tSmeCmd *pCommand,
eCsrRoamCompleteResult Result, void *Context )
@@ -8812,6 +8982,62 @@
}
#endif
+
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+void csrTsmStatsRspProcessor(tpAniSirGlobal pMac, void* pMsg)
+{
+ tAniGetTsmStatsRsp* pTsmStatsRsp = (tAniGetTsmStatsRsp*)pMsg;
+
+ if (NULL != pTsmStatsRsp)
+ {
+ /* Get roam Rssi request is backed up and passed back to the response,
+ Extract the request message to fetch callback */
+ tpAniGetTsmStatsReq reqBkp = (tAniGetTsmStatsReq*)pTsmStatsRsp->tsmStatsReq;
+
+ if (NULL != reqBkp)
+ {
+ if (NULL != reqBkp->tsmStatsCallback)
+ {
+ ((tCsrTsmStatsCallback)(reqBkp->tsmStatsCallback))(pTsmStatsRsp->tsmMetrics,
+ pTsmStatsRsp->staId, reqBkp->pDevContext);
+ reqBkp->tsmStatsCallback = NULL;
+ }
+ vos_mem_free(reqBkp);
+ }
+ else
+ {
+ smsLog( pMac, LOGE, FL("reqBkp is NULL"));
+ if (NULL != reqBkp)
+ {
+ vos_mem_free(reqBkp);
+ }
+ }
+ }
+ else
+ {
+ smsLog( pMac, LOGE, FL("pTsmStatsRsp is NULL"));
+ }
+ return;
+}
+
+void csrSendCcxAdjacentApRepInd(tpAniSirGlobal pMac, tCsrRoamSession *pSession)
+{
+ tANI_U32 roamTS2 = 0;
+ tCsrRoamInfo roamInfo;
+
+ if (NULL == pSession)
+ {
+ return;
+ }
+
+ roamTS2 = vos_timer_get_system_time();
+ roamInfo.tsmRoamDelay = roamTS2 - pSession->roamTS1;
+
+ csrRoamCallCallback(pMac, pSession->sessionId, &roamInfo,
+ 0, eCSR_ROAM_CCX_ADJ_AP_REPORT_IND, 0);
+}
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
static void csrRoamRssiIndHdlr(tpAniSirGlobal pMac, void* pMsg)
{
WLANTL_TlIndicationReq *pTlRssiInd = (WLANTL_TlIndicationReq*)pMsg;
@@ -9660,7 +9886,9 @@
pSession->isPrevApInfoValid &&
pSession->connectedProfile.isCCXAssoc)
{
-#ifdef WLAN_FEATURE_VOWIFI
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ csrSendCcxAdjacentApRepInd(pMac, pSession);
+#else
csrCcxSendAdjacentApRepMsg(pMac, pSession);
#endif
pSession->isPrevApInfoValid = FALSE;
@@ -9764,6 +9992,12 @@
csrRoamRssiRspProcessor( pMac, pSirMsg );
break;
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ case eWNI_SME_GET_TSM_STATS_RSP:
+ smsLog( pMac, LOG2, FL("TSM Stats rsp from PE"));
+ csrTsmStatsRspProcessor( pMac, pSirMsg );
+ break;
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
case eWNI_SME_GET_RSSI_REQ:
smsLog( pMac, LOG2, FL("GetRssiReq from self"));
csrUpdateRssi( pMac, pSirMsg );
@@ -12333,6 +12567,11 @@
if( csrIsProfileCCX( pProfile ) )
{
// Insert the CCKM IE into the join request
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ ieLen = pSession->suppCckmIeInfo.cckmIeLen;
+ palCopyMemory(pMac->hHdd, (void *) (wpaRsnIE),
+ pSession->suppCckmIeInfo.cckmIe, ieLen);
+#else
ieLen = csrConstructCcxCckmIe( pMac,
pSession,
pProfile,
@@ -12340,6 +12579,7 @@
pSession->pWpaRsnReqIE,
pSession->nWpaRsnReqIeLength,
(void *)( wpaRsnIE ) );
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
}
else
{
@@ -14805,6 +15045,47 @@
}
#endif
+
+
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+eHalStatus csrGetTsmStats(tpAniSirGlobal pMac,
+ tCsrTsmStatsCallback callback,
+ tANI_U8 staId,
+ tCsrBssid bssId,
+ void *pContext,
+ void* pVosContext,
+ tANI_U8 tid)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tAniGetTsmStatsReq *pMsg = NULL;
+
+ status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tAniGetTsmStatsReq));
+ if ( !HAL_STATUS_SUCCESS(status) )
+ {
+ smsLog(pMac, LOGE, "csrGetTsmStats: failed to allocate mem for req");
+ return status;
+ }
+ // need to initiate a stats request to PE
+ pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_TSM_STATS_REQ);
+ pMsg->msgLen = (tANI_U16)sizeof(tAniGetTsmStatsReq);
+ pMsg->staId = staId;
+ pMsg->tid = tid;
+ palCopyMemory(pMac->hHdd, pMsg->bssId, bssId, sizeof(tSirMacAddr));
+ pMsg->tsmStatsCallback = callback;
+ pMsg->pDevContext = pContext;
+ pMsg->pVosContext = pVosContext;
+ status = palSendMBMessage(pMac->hHdd, pMsg );
+ if(!HAL_STATUS_SUCCESS(status))
+ {
+ smsLog(pMac, LOG1, " csrGetTsmStats: failed to send down the rssi req");
+ //pMsg is freed by palSendMBMessage
+ status = eHAL_STATUS_FAILURE;
+ }
+ return status;
+}
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
+
/* ---------------------------------------------------------------------------
\fn csrGetTLSTAState
\helper function to get teh TL STA State whenever the function is called.
@@ -16261,7 +16542,7 @@
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
eHalStatus status = eHAL_STATUS_SUCCESS;
-#ifdef FEATURE_WLAN_LFR
+#if defined(FEATURE_WLAN_LFR) || defined(FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_CCX_UPLOAD)
tCsrRoamInfo roamInfo;
#endif
@@ -16306,7 +16587,17 @@
csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, NULL, 0,
eCSR_ROAM_FT_RESPONSE, eCSR_ROAM_RESULT_NONE);
- // Currently we dont do anything special for CCX connection.
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ if (csrRoamIsCCXAssoc(pMac))
+ {
+ /* read TSF */
+ csrRoamReadTSF(pMac, (tANI_U8 *)roamInfo.timestamp);
+
+ // Save the bssid from the received response
+ palCopyMemory(pMac->hHdd, (void *)&roamInfo.bssid, (void *)pFTPreAuthRsp->preAuthbssId, sizeof(tCsrBssid));
+ csrRoamCallCallback(pMac, pFTPreAuthRsp->smeSessionId, &roamInfo, 0, eCSR_ROAM_CCKM_PREAUTH_NOTIFY, 0);
+ }
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
#ifdef FEATURE_WLAN_LFR
// If Legacy Fast Roaming is enabled, signal the supplicant
// So he can send us a PMK-ID for this candidate AP.
@@ -16537,3 +16828,68 @@
return status;
}
#endif /* WLAN_FEATURE_ROAM_SCAN_OFFLOAD */
+
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/* ---------------------------------------------------------------------------
+ \fn csrSetCCKMIe
+ \brief This function stores the CCKM IE passed by the supplicant in a place holder
+ data structure and this IE will be packed inside reassociation request
+ \param pMac - pMac global structure
+ \param sessionId - Current session id
+ \param pCckmIe - pointer to CCKM IE data
+ \param ccKmIeLen - length of the CCKM IE
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+VOS_STATUS csrSetCCKMIe(tpAniSirGlobal pMac, const tANI_U8 sessionId,
+ const tANI_U8 *pCckmIe,
+ const tANI_U8 ccKmIeLen)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tCsrRoamSession *pSession = CSR_GET_SESSION(pMac, sessionId);
+
+ if (!pSession)
+ {
+ smsLog(pMac, LOGE, FL(" session %d not found "), sessionId);
+ return eHAL_STATUS_FAILURE;
+ }
+ palCopyMemory(pMac->hHdd, pSession->suppCckmIeInfo.cckmIe, pCckmIe, ccKmIeLen);
+ pSession->suppCckmIeInfo.cckmIeLen = ccKmIeLen;
+ return status;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn csrRoamReadTSF
+ \brief This function reads the TSF; and also add the time elapsed since last beacon or
+ probe response reception from the hand off AP to arrive at the latest TSF value.
+ \param pMac - pMac global structure
+ \param pTimestamp - output TSF timestamp
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+VOS_STATUS csrRoamReadTSF(tpAniSirGlobal pMac, tANI_U8 *pTimestamp)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tCsrNeighborRoamBSSInfo handoffNode;
+ tANI_U32 timer_diff = 0;
+ tANI_U32 timeStamp[2];
+ tpSirBssDescription pBssDescription = NULL;
+
+ csrNeighborRoamGetHandoffAPInfo(pMac, &handoffNode);
+ pBssDescription = handoffNode.pBssDescription;
+
+ // Get the time diff in milli seconds
+ timer_diff = vos_timer_get_system_time() - pBssDescription->scanSysTimeMsec;
+ // Convert msec to micro sec timer
+ timer_diff = (tANI_U32)(timer_diff * SYSTEM_TIME_MSEC_TO_USEC);
+
+ timeStamp[0] = pBssDescription->timeStamp[0];
+ timeStamp[1] = pBssDescription->timeStamp[1];
+
+ UpdateCCKMTSF(&(timeStamp[0]), &(timeStamp[1]), &timer_diff);
+
+ palCopyMemory(pMac->hHdd, pTimestamp, (void *) &timeStamp[0],
+ sizeof (tANI_U32) * 2);
+ return status;
+}
+
+#endif /*FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index bc7616a..48eeee3 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -8094,3 +8094,15 @@
}
return status;
}
+
+#ifdef FEATURE_WLAN_CCX
+// Update the TSF with the difference in system time
+void UpdateCCKMTSF(tANI_U32 *timeStamp0, tANI_U32 *timeStamp1, tANI_U32 *incr)
+{
+ tANI_U64 timeStamp64 = ((tANI_U64)*timeStamp1 << 32) | (*timeStamp0);
+
+ timeStamp64 = (tANI_U64)(timeStamp64 + (tANI_U64)*incr);
+ *timeStamp0 = (tANI_U32)(timeStamp64 & 0xffffffff);
+ *timeStamp1 = (tANI_U32)((timeStamp64 >> 32) & 0xffffffff);
+}
+#endif
diff --git a/CORE/SME/src/csr/csrInsideApi.h b/CORE/SME/src/csr/csrInsideApi.h
index 5458361..952e103 100644
--- a/CORE/SME/src/csr/csrInsideApi.h
+++ b/CORE/SME/src/csr/csrInsideApi.h
@@ -85,6 +85,7 @@
#define CSR_MAX_2_4_GHZ_SUPPORTED_CHANNELS 14
#define CSR_MAX_BSS_SUPPORT 250
+#define SYSTEM_TIME_MSEC_TO_USEC 1000
//This number minus 1 means the number of times a channel is scanned before a BSS is remvoed from
//cache scan result
@@ -957,10 +958,14 @@
void csrRoamFTPreAuthRspProcessor( tHalHandle hHal, tpSirFTPreAuthRsp pFTPreAuthRsp );
#endif
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
void csrCcxSendAdjacentApRepMsg(tpAniSirGlobal pMac, tCsrRoamSession *pSession);
#endif
+#if defined(FEATURE_WLAN_CCX)
+void UpdateCCKMTSF(tANI_U32 *timeStamp0, tANI_U32 *timeStamp1, tANI_U32 *incr);
+#endif
+
eHalStatus csrGetDefaultCountryCodeFrmNv(tpAniSirGlobal pMac, tANI_U8 *pCountry);
eHalStatus csrGetCurrentCountryCode(tpAniSirGlobal pMac, tANI_U8 *pCountry);
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index 30d03d7..9813640 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -82,7 +82,7 @@
#include "wlan_qct_tl.h"
#include "sme_Api.h"
#include "csrNeighborRoam.h"
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "csrCcx.h"
#endif
@@ -1119,7 +1119,7 @@
}
if ((eSIR_SUCCESS == limStatus) && (NULL != pPreauthRspNode))
{
- NEIGHBOR_ROAM_DEBUG(pMac, LOGE, FL("Preauth completed successfully after %d tries"), pNeighborRoamInfo->FTRoamInfo.numPreAuthRetries);
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG1, FL("Preauth completed successfully after %d tries"), pNeighborRoamInfo->FTRoamInfo.numPreAuthRetries);
smsLog(pMac, LOG1, FL("After Pre-Auth: BSSID %02x:%02x:%02x:%02x:%02x:%02x, Ch:%d"),
pPreauthRspNode->pBssDescription->bssId[0],
@@ -1332,7 +1332,7 @@
pScanFilter->SSIDs.SSIDList->SSID.length = pCurProfile->SSID.length;
vos_mem_copy((void *)pScanFilter->SSIDs.SSIDList->SSID.ssId, (void *)pCurProfile->SSID.ssId, pCurProfile->SSID.length);
- NEIGHBOR_ROAM_DEBUG(pMac, LOGE, FL("Filtering for SSID %.*s from scan results,"
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG1, FL("Filtering for SSID %.*s from scan results,"
"length of SSID = %u"),
pScanFilter->SSIDs.SSIDList->SSID.length,
pScanFilter->SSIDs.SSIDList->SSID.ssId,
@@ -2565,7 +2565,7 @@
{
eHalStatus status = eHAL_STATUS_SUCCESS;
tCsrBGScanRequest bgScanParams;
- int numOfChannels = 0, i = 0;
+ tANI_U8 numOfChannels = 0, i = 0;
tANI_U8 *channelList = NULL;
tANI_U8 *pInChannelList = NULL;
tANI_U8 tmpChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN];
@@ -2843,13 +2843,13 @@
VOS_STATUS csrNeighborRoamChannelsFilterByCurrentBand(
tpAniSirGlobal pMac,
tANI_U8* pInputChannelList,
- int inputNumOfChannels,
+ tANI_U8 inputNumOfChannels,
tANI_U8* pOutputChannelList,
- int* pMergedOutputNumOfChannels
+ tANI_U8* pMergedOutputNumOfChannels
)
{
- int i = 0;
- int numChannels = 0;
+ tANI_U8 i = 0;
+ tANI_U8 numChannels = 0;
tANI_U8 currAPoperationChannel = pMac->roam.neighborRoamInfo.currAPoperationChannel;
// Check for NULL pointer
if (!pInputChannelList) return VOS_STATUS_E_INVAL;
@@ -2900,15 +2900,15 @@
VOS_STATUS csrNeighborRoamMergeChannelLists(
tpAniSirGlobal pMac,
tANI_U8 *pInputChannelList,
- int inputNumOfChannels,
+ tANI_U8 inputNumOfChannels,
tANI_U8 *pOutputChannelList,
- int outputNumOfChannels,
- int *pMergedOutputNumOfChannels
+ tANI_U8 outputNumOfChannels,
+ tANI_U8 *pMergedOutputNumOfChannels
)
{
- int i = 0;
- int j = 0;
- int numChannels = outputNumOfChannels;
+ tANI_U8 i = 0;
+ tANI_U8 j = 0;
+ tANI_U8 numChannels = outputNumOfChannels;
// Check for NULL pointer
if (!pInputChannelList) return VOS_STATUS_E_INVAL;
@@ -2970,7 +2970,7 @@
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
tANI_U8 numChannels = 0, i = 0;
tANI_U8 channelList[MAX_BSS_IN_NEIGHBOR_RPT];
- int mergedOutputNumOfChannels = 0;
+ tANI_U8 mergedOutputNumOfChannels = 0;
#if 0
eHalStatus status = eHAL_STATUS_SUCCESS;
#endif
@@ -3354,13 +3354,13 @@
VOS_STATUS csrNeighborRoamPrepareNonOccupiedChannelList(
tpAniSirGlobal pMac,
tANI_U8 *pInputChannelList,
- int numOfChannels,
+ tANI_U8 numOfChannels,
tANI_U8 *pOutputChannelList,
- int *pOutputNumOfChannels
+ tANI_U8 *pOutputNumOfChannels
)
{
- int i = 0;
- int outputNumOfChannels = 0; // Clear the output number of channels
+ tANI_U8 i = 0;
+ tANI_U8 outputNumOfChannels = 0; // Clear the output number of channels
tANI_U8 numOccupiedChannels = pMac->scan.occupiedChannels.numChannels;
tANI_U8 *pOccupiedChannelList = pMac->scan.occupiedChannels.channelList;
@@ -3403,7 +3403,7 @@
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
eHalStatus status = eHAL_STATUS_SUCCESS;
int i = 0;
- int numOfChannels = 0;
+ tANI_U8 numOfChannels = 0;
tANI_U8 channelList[WNI_CFG_VALID_CHANNEL_LIST_LEN];
tpCsrChannelInfo currChannelListInfo;
#ifdef FEATURE_WLAN_LFR
diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c
index c84947a..8b8afb5 100644
--- a/CORE/SME/src/csr/csrUtil.c
+++ b/CORE/SME/src/csr/csrUtil.c
@@ -64,10 +64,10 @@
#include "smeQosInternal.h"
#include "wlan_qct_wda.h"
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "vos_utils.h"
#include "csrCcx.h"
-#endif /* FEATURE_WLAN_CCX */
+#endif /* FEATURE_WLAN_CCX && !FEATURE_WLAN_CCX_UPLOAD*/
tANI_U8 csrWpaOui[][ CSR_WPA_OUI_SIZE ] = {
{ 0x00, 0x50, 0xf2, 0x00 },
diff --git a/CORE/SME/src/rrm/sme_rrm.c b/CORE/SME/src/rrm/sme_rrm.c
index 975ded8..aa2a67c 100644
--- a/CORE/SME/src/rrm/sme_rrm.c
+++ b/CORE/SME/src/rrm/sme_rrm.c
@@ -72,7 +72,7 @@
#include "rrmGlobal.h"
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "csrCcx.h"
#endif
@@ -159,7 +159,7 @@
/* Call the callback with the status received from caller */
if (callback)
callback(callbackContext, vosStatus);
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
// We came here with IAPP AP List
// Make sure we inform CSR of the neighbor list
// for CCX Associations. First clear the cache.
@@ -1350,7 +1350,7 @@
return pTempBssEntry;
}
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
void csrCcxSendAdjacentApRepMsg(tpAniSirGlobal pMac, tCsrRoamSession *pSession)
{
tpSirAdjacentApRepInd pAdjRep;
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index f36968e..8041cf4 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -1642,6 +1642,56 @@
}
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/*------------------------------------------------------------------
+ *
+ * Handle the tsm ie indication from LIM and forward it to HDD.
+ *
+ *------------------------------------------------------------------*/
+
+eHalStatus sme_TsmIeInd(tHalHandle hHal, tSirSmeTsmIEInd *pSmeTsmIeInd)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tCsrRoamInfo pRoamInfo = {0};
+ tANI_U32 SessionId = pSmeTsmIeInd->sessionId;
+
+ pRoamInfo.tsmIe.tsid= pSmeTsmIeInd->tsmIe.tsid;
+ pRoamInfo.tsmIe.state= pSmeTsmIeInd->tsmIe.state;
+ pRoamInfo.tsmIe.msmt_interval= pSmeTsmIeInd->tsmIe.msmt_interval;
+
+ /* forward the tsm ie information to HDD */
+ csrRoamCallCallback(pMac, SessionId, &pRoamInfo, 0, eCSR_ROAM_TSM_IE_IND, 0);
+
+ return status;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_SetCCKMIe
+ \brief function to store the CCKM IE passed from supplicant and use it while packing
+ reassociation request
+ \param hHal - HAL handle for device
+ \param pCckmIe - pointer to CCKM IE data
+ \param pCckmIeLen - length of the CCKM IE
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_SetCCKMIe(tHalHandle hHal, tANI_U8 sessionId,
+ tANI_U8 *pCckmIe, tANI_U8 cckmIeLen)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ csrSetCCKMIe(pMac, sessionId, pCckmIe, cckmIeLen);
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+ return status;
+}
+
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
/*--------------------------------------------------------------------------
@@ -1965,6 +2015,21 @@
}
break;
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ case eWNI_SME_TSM_IE_IND:
+ {
+ if (pMsg->bodyptr)
+ {
+ sme_TsmIeInd(pMac, pMsg->bodyptr);
+ vos_mem_free(pMsg->bodyptr);
+ }
+ else
+ {
+ smsLog(pMac, LOGE, "Empty rsp message for (eWNI_SME_TSM_IE_IND), nothing to process");
+ }
+ break;
+ }
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
case eWNI_SME_ROAM_SCAN_OFFLOAD_RSP:
status = csrRoamOffloadScanRspHdlr((void *)pMac, pMsg->bodyval);
@@ -4232,6 +4297,37 @@
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/* ---------------------------------------------------------------------------
+ \fn sme_GetTsmStats
+ \brief a wrapper function that client calls to register a callback to get TSM Stats
+
+ \param callback - SME sends back the requested stats using the callback
+ \param staId - The station ID for which the stats is requested for
+ \param pContext - user context to be passed back along with the callback
+ \param pVosContext - vos context
+ \return eHalStatus
+ ---------------------------------------------------------------------------*/
+eHalStatus sme_GetTsmStats(tHalHandle hHal,
+ tCsrTsmStatsCallback callback,
+ tANI_U8 staId, tCsrBssid bssId,
+ void *pContext, void* pVosContext, tANI_U8 tid)
+{
+ eHalStatus status = eHAL_STATUS_FAILURE;
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ status = csrGetTsmStats( pMac, callback,
+ staId, bssId, pContext, pVosContext, tid);
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+ return (status);
+}
+#endif
+
+
/* ---------------------------------------------------------------------------
\fn sme_GetStatistics
\brief a wrapper function that client calls to register a callback to get
@@ -7764,7 +7860,7 @@
{
VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
"LFR runtime successfully cleared roam scan cache");
- csrFlushBgScanRoamChannelList(pMac);
+ csrFlushCfgBgScanRoamChannelList(pMac);
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
if (pMac->roam.configParam.isRoamOffloadScanEnabled)
{
@@ -8330,7 +8426,7 @@
pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i]);
}
}
- csrFlushBgScanRoamChannelList(pMac);
+ csrFlushCfgBgScanRoamChannelList(pMac);
csrCreateBgScanRoamChannelList(pMac, pChannelList, numChannels);
status = csrUpdateBgScanConfigIniChannelList(pMac, csrGetCurrentBand(hHal));
@@ -8364,6 +8460,71 @@
return status ;
}
+
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+/*--------------------------------------------------------------------------
+ \brief sme_SetCcxRoamScanChannelList() - set ccx roam scan channel list
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_SetCcxRoamScanChannelList(tHalHandle hHal,
+ tANI_U8 *pChannelList,
+ tANI_U8 numChannels)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ tpCsrChannelInfo currChannelListInfo = &pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo;
+ tANI_U8 oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN*2] = {0};
+ tANI_U8 newChannelList[128] = {0};
+ tANI_U8 i = 0, j = 0;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ if (NULL != currChannelListInfo->ChannelList)
+ {
+ for (i = 0; i < currChannelListInfo->numOfChannels; i++)
+ {
+ j += snprintf(oldChannelList + j, sizeof(oldChannelList) - j," %d",
+ currChannelListInfo->ChannelList[i]);
+ }
+ }
+ status = csrCreateRoamScanChannelList(pMac, pChannelList, numChannels, csrGetCurrentBand(hHal));
+
+ if ( HAL_STATUS_SUCCESS( status ))
+ {
+ if (NULL != currChannelListInfo->ChannelList)
+ {
+ j = 0;
+ for (i = 0; i < currChannelListInfo->numOfChannels; i++)
+ {
+ j += snprintf(newChannelList + j, sizeof(newChannelList) - j," %d",
+ currChannelListInfo->ChannelList[i]);
+ }
+ }
+
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "CCX roam scan channel list successfully set to %s - old value is %s - roam state is %d",
+ newChannelList, oldChannelList,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ }
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ if (pMac->roam.configParam.isRoamOffloadScanEnabled)
+ {
+ csrRoamOffloadScan(pMac, ROAM_SCAN_OFFLOAD_UPDATE_CFG, REASON_CHANNEL_LIST_CHANGED);
+ }
+#endif
+
+ return status ;
+}
+#endif
+
/*--------------------------------------------------------------------------
\brief csrUpdateBgScanConfigIniChannelList() - Update bgscan roam cache
This is a synchronous call
@@ -8431,7 +8592,7 @@
{
#ifdef FEATURE_WLAN_CCX
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
- return pMac->roam.configParam.isCcxIniFeatureEnabled;
+ return csrRoamIsCcxIniFeatureEnabled(pMac);
#else
return eANI_BOOLEAN_FALSE;
#endif