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/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 98487f5..ea04d05 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -228,6 +228,14 @@
#endif
+struct statsContext
+{
+ struct completion completion;
+ hdd_adapter_t *pAdapter;
+ unsigned int magic;
+};
+
+#define STATS_CONTEXT_MAGIC 0x53544154 //STAT
typedef struct hdd_tx_rx_stats_s
{
@@ -950,6 +958,9 @@
eHDD_BATCH_SCAN_STATE batchScanState;
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ tAniTrafStrmMetrics tsmStats;
+#endif
};
#define WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) (&(pAdapter)->sessionCtx.station)
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index dd3838d..eff49c4 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -125,6 +125,15 @@
tANI_U8 frameType );
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+static void hdd_indicateTsmIe(hdd_adapter_t *pAdapter, tANI_U8 tid,
+ tANI_U8 state,
+ tANI_U16 measInterval );
+static void hdd_indicateCckmPreAuth(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo);
+static void hdd_indicateCcxAdjApRepInd(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo);
+
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
static eHalStatus hdd_RoamSetKeyCompleteHandler( hdd_adapter_t *pAdapter,
tCsrRoamInfo *pRoamInfo,
tANI_U32 roamId,
@@ -2691,6 +2700,28 @@
pRoamInfo->frameType);
break;
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ case eCSR_ROAM_TSM_IE_IND:
+ hdd_indicateTsmIe(pAdapter, pRoamInfo->tsmIe.tsid,
+ pRoamInfo->tsmIe.state, pRoamInfo->tsmIe.msmt_interval);
+ break;
+
+ case eCSR_ROAM_CCKM_PREAUTH_NOTIFY:
+ {
+ if (eCSR_AUTH_TYPE_CCKM_WPA == pHddStaCtx->conn_info.authType ||
+ eCSR_AUTH_TYPE_CCKM_RSN == pHddStaCtx->conn_info.authType)
+ {
+ hdd_indicateCckmPreAuth(pAdapter, pRoamInfo);
+ }
+ break;
+ }
+
+ case eCSR_ROAM_CCX_ADJ_AP_REPORT_IND:
+ {
+ hdd_indicateCcxAdjApRepInd(pAdapter, pRoamInfo);
+ break;
+ }
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
default:
break;
}
@@ -3859,3 +3890,94 @@
}
}
#endif
+
+#if defined (FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+void hdd_indicateTsmIe(hdd_adapter_t *pAdapter, tANI_U8 tid,
+ tANI_U8 state,
+ tANI_U16 measInterval )
+{
+ union iwreq_data wrqu;
+ char buf[IW_CUSTOM_MAX + 1];
+
+ if (NULL == pAdapter)
+ return;
+
+ // create the event
+ memset(&wrqu, '\0', sizeof(wrqu));
+ memset(buf, '\0', sizeof(buf));
+
+ hddLog(VOS_TRACE_LEVEL_INFO, "TSM Ind tid(%d) state(%d) MeasInt(%d)",
+ tid, state, measInterval);
+
+ snprintf(buf, IW_CUSTOM_MAX, "TSMIE=%d:%d:%d",tid,state,measInterval);
+
+ wrqu.data.pointer = buf;
+ wrqu.data.length = strlen(buf);
+ // send the event
+ wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buf);
+}
+
+void hdd_indicateCckmPreAuth(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo)
+{
+ union iwreq_data wrqu;
+ char buf[IW_CUSTOM_MAX + 1];
+ char *pos = buf;
+ int nBytes = 0, freeBytes = IW_CUSTOM_MAX;
+
+ if ((NULL == pAdapter) || (NULL == pRoamInfo))
+ return;
+
+ // create the event
+ memset(&wrqu, '\0', sizeof(wrqu));
+ memset(buf, '\0', sizeof(buf));
+
+ /* Timestamp0 is lower 32 bits and Timestamp1 is upper 32 bits */
+ hddLog(VOS_TRACE_LEVEL_INFO, "CCXPREAUTHNOTIFY=%02x:%02x:%02x:%02x:%02x:%02x %lu:%lu",
+ pRoamInfo->bssid[0], pRoamInfo->bssid[1], pRoamInfo->bssid[2],
+ pRoamInfo->bssid[3], pRoamInfo->bssid[4], pRoamInfo->bssid[5],
+ pRoamInfo->timestamp[0], pRoamInfo->timestamp[1]);
+
+ nBytes = snprintf(pos, freeBytes, "CCXPREAUTHNOTIFY=");
+ pos += nBytes;
+ freeBytes -= nBytes;
+
+ vos_mem_copy(pos, pRoamInfo->bssid, WNI_CFG_BSSID_LEN);
+ pos += WNI_CFG_BSSID_LEN;
+ freeBytes -= WNI_CFG_BSSID_LEN;
+
+ snprintf(pos, freeBytes, " %lu:%lu", pRoamInfo->timestamp[0], pRoamInfo->timestamp[1]);
+
+ wrqu.data.pointer = buf;
+ wrqu.data.length = strlen(buf);
+ hddLog(VOS_TRACE_LEVEL_ERROR, "Event data len(%d) data(%s)",
+ strlen(buf), buf);
+
+ // send the event
+ wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buf);
+}
+
+void hdd_indicateCcxAdjApRepInd(hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo)
+{
+ union iwreq_data wrqu;
+ char buf[IW_CUSTOM_MAX + 1];
+
+ if ((NULL == pAdapter) || (NULL == pRoamInfo))
+ return;
+
+ // create the event
+ memset(&wrqu, '\0', sizeof(wrqu));
+ memset(buf, '\0', sizeof(buf));
+
+ hddLog(VOS_TRACE_LEVEL_INFO, "CCXADJAPREP=%u", pRoamInfo->tsmRoamDelay);
+
+ snprintf(buf, IW_CUSTOM_MAX, "CCXADJAPREP=%u", pRoamInfo->tsmRoamDelay);
+
+ wrqu.data.pointer = buf;
+ wrqu.data.length = strlen(buf);
+
+ // send the event
+ wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, buf);
+}
+
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 309cef7..e40f792 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -106,12 +106,6 @@
*/
#define WE_SAP_MAX_STA_INFO 0x7FF
-struct statsContext
-{
- struct completion completion;
- hdd_adapter_t *pAdapter;
- unsigned int magic;
-};
#define SAP_24GHZ_CH_COUNT (14)
#define SAP_MAX_GET_ASSOC_STAS_TIMEOUT 500
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 0068dc5..a49e156 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -169,6 +169,13 @@
#define SIZE_OF_SETROAMMODE 11 /* size of SETROAMMODE */
#define SIZE_OF_GETROAMMODE 11 /* size of GETROAMMODE */
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+#define TID_MIN_VALUE 0
+#define TID_MAX_VALUE 15
+static VOS_STATUS hdd_get_tsm_stats(hdd_adapter_t *pAdapter, const tANI_U8 tid,
+ tAniTrafStrmMetrics* pTsmMetrics);
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
/*
* Driver miracast parameters 0-Disabled
* 1-Source, 2-Sink
@@ -210,6 +217,10 @@
tANI_U8 *pTargetApBssid,
tANI_U8 *pChannel);
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+VOS_STATUS hdd_parse_get_cckm_ie(tANI_U8 *pValue, tANI_U8 **pCckmIe, tANI_U8 *pCckmIeLen);
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
static int hdd_netdev_notifier_call(struct notifier_block * nb,
unsigned long state,
void *ndev)
@@ -3321,6 +3332,169 @@
ret = hdd_return_batch_scan_rsp_to_user(pAdapter, &priv_data, command);
}
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ else if (strncmp(command, "SETCCXROAMSCANCHANNELS", 22) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 ChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0};
+ tANI_U8 numChannels = 0;
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = hdd_parse_channellist(value, ChannelList, &numChannels);
+ if (eHAL_STATUS_SUCCESS != status)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: Failed to parse channel list information", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if (numChannels > WNI_CFG_VALID_CHANNEL_LIST_LEN)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: number of channels (%d) supported exceeded max (%d)", __func__,
+ numChannels, WNI_CFG_VALID_CHANNEL_LIST_LEN);
+ ret = -EINVAL;
+ goto exit;
+ }
+ status = sme_SetCcxRoamScanChannelList((tHalHandle)(pHddCtx->hHal),
+ ChannelList,
+ numChannels);
+ if (eHAL_STATUS_SUCCESS != status)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: Failed to update channel list information", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "GETTSMSTATS", 11) == 0)
+ {
+ tANI_U8 *value = command;
+ char extra[128] = {0};
+ int len = 0;
+ tANI_U8 tid = 0;
+ hdd_station_ctx_t *pHddStaCtx = NULL;
+ tAniTrafStrmMetrics tsmMetrics;
+ pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+
+ /* if not associated, return error */
+ if (eConnectionState_Associated != pHddStaCtx->conn_info.connState)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s:Not associated!",__func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ /* Move pointer to ahead of GETTSMSTATS<delimiter> */
+ value = value + 12;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &tid);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed range [%d - %d]", __func__,
+ TID_MIN_VALUE,
+ TID_MAX_VALUE);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((tid < TID_MIN_VALUE) || (tid > TID_MAX_VALUE))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "tid value %d is out of range"
+ " (Min: %d Max: %d)", tid,
+ TID_MIN_VALUE,
+ TID_MAX_VALUE);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to get tsm stats tid = %d", __func__, tid);
+
+ if (VOS_STATUS_SUCCESS != hdd_get_tsm_stats(pAdapter, tid, &tsmMetrics))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to get tsm stats", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "UplinkPktQueueDly(%d)\n"
+ "UplinkPktQueueDlyHist[0](%d)\n"
+ "UplinkPktQueueDlyHist[1](%d)\n"
+ "UplinkPktQueueDlyHist[2](%d)\n"
+ "UplinkPktQueueDlyHist[3](%d)\n"
+ "UplinkPktTxDly(%lu)\n"
+ "UplinkPktLoss(%d)\n"
+ "UplinkPktCount(%d)\n"
+ "RoamingCount(%d)\n"
+ "RoamingDly(%d)", tsmMetrics.UplinkPktQueueDly,
+ tsmMetrics.UplinkPktQueueDlyHist[0],
+ tsmMetrics.UplinkPktQueueDlyHist[1],
+ tsmMetrics.UplinkPktQueueDlyHist[2],
+ tsmMetrics.UplinkPktQueueDlyHist[3],
+ tsmMetrics.UplinkPktTxDly, tsmMetrics.UplinkPktLoss,
+ tsmMetrics.UplinkPktCount, tsmMetrics.RoamingCount, tsmMetrics.RoamingDly);
+
+ /* Output TSM stats is of the format
+ GETTSMSTATS [PktQueueDly] [PktQueueDlyHist[0]]:[PktQueueDlyHist[1]] ...[RoamingDly]
+ eg., GETTSMSTATS 10 1:0:0:161 20 1 17 8 39800 */
+ len = scnprintf(extra, sizeof(extra), "%s %d %d:%d:%d:%d %lu %d %d %d %d", command,
+ tsmMetrics.UplinkPktQueueDly, tsmMetrics.UplinkPktQueueDlyHist[0],
+ tsmMetrics.UplinkPktQueueDlyHist[1], tsmMetrics.UplinkPktQueueDlyHist[2],
+ tsmMetrics.UplinkPktQueueDlyHist[3], tsmMetrics.UplinkPktTxDly,
+ tsmMetrics.UplinkPktLoss, tsmMetrics.UplinkPktCount, tsmMetrics.RoamingCount,
+ tsmMetrics.RoamingDly);
+
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "SETCCKMIE", 9) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 *cckmIe = NULL;
+ tANI_U8 cckmIeLen = 0;
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = hdd_parse_get_cckm_ie(value, &cckmIe, &cckmIeLen);
+ if (eHAL_STATUS_SUCCESS != status)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: Failed to parse cckm ie data", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if (cckmIeLen > DOT11F_IE_RSN_MAX_LEN)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: CCKM Ie input length is more than max[%d]", __func__,
+ DOT11F_IE_RSN_MAX_LEN);
+ if (NULL != cckmIe)
+ {
+ vos_mem_free(cckmIe);
+ }
+ ret = -EINVAL;
+ goto exit;
+ }
+ sme_SetCCKMIe((tHalHandle)(pHddCtx->hHal), pAdapter->sessionId, cckmIe, cckmIeLen);
+ if (NULL != cckmIe)
+ {
+ vos_mem_free(cckmIe);
+ }
+ }
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
else {
hddLog( VOS_TRACE_LEVEL_WARN, "%s: Unsupported GUI command %s",
__func__, command);
@@ -3335,6 +3509,131 @@
return ret;
}
+
+
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+static void hdd_GetTsmStatsCB( tAniTrafStrmMetrics tsmMetrics, const tANI_U32 staId, void *pContext )
+{
+ struct statsContext *pStatsContext = NULL;
+ hdd_adapter_t *pAdapter = NULL;
+
+ if (NULL == pContext)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Bad param, pContext [%p]",
+ __func__, pContext);
+ return;
+ }
+
+ /* there is a race condition that exists between this callback function
+ and the caller since the caller could time out either before or
+ while this code is executing. we'll assume the timeout hasn't
+ occurred, but we'll verify that right before we save our work */
+
+ pStatsContext = pContext;
+ pAdapter = pStatsContext->pAdapter;
+ if ((NULL == pAdapter) || (STATS_CONTEXT_MAGIC != pStatsContext->magic))
+ {
+ /* the caller presumably timed out so there is nothing we can do */
+ hddLog(VOS_TRACE_LEVEL_WARN,
+ "%s: Invalid context, pAdapter [%p] magic [%08x]",
+ __func__, pAdapter, pStatsContext->magic);
+ return;
+ }
+
+ /* the race is on. caller could have timed out immediately after
+ we verified the magic, but if so, caller will wait a short time
+ for us to copy over the tsm stats */
+ pAdapter->tsmStats.UplinkPktQueueDly = tsmMetrics.UplinkPktQueueDly;
+ vos_mem_copy(pAdapter->tsmStats.UplinkPktQueueDlyHist,
+ tsmMetrics.UplinkPktQueueDlyHist,
+ sizeof(pAdapter->tsmStats.UplinkPktQueueDlyHist)/
+ sizeof(pAdapter->tsmStats.UplinkPktQueueDlyHist[0]));
+ pAdapter->tsmStats.UplinkPktTxDly = tsmMetrics.UplinkPktTxDly;
+ pAdapter->tsmStats.UplinkPktLoss = tsmMetrics.UplinkPktLoss;
+ pAdapter->tsmStats.UplinkPktCount = tsmMetrics.UplinkPktCount;
+ pAdapter->tsmStats.RoamingCount = tsmMetrics.RoamingCount;
+ pAdapter->tsmStats.RoamingDly = tsmMetrics.RoamingDly;
+
+ /* and notify the caller */
+ complete(&pStatsContext->completion);
+}
+
+
+
+static VOS_STATUS hdd_get_tsm_stats(hdd_adapter_t *pAdapter, const tANI_U8 tid,
+ tAniTrafStrmMetrics* pTsmMetrics)
+{
+ hdd_station_ctx_t *pHddStaCtx = NULL;
+ eHalStatus hstatus;
+ long lrc;
+ struct statsContext context;
+ hdd_context_t *pHddCtx = NULL;
+
+ if (NULL == pAdapter)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s: pAdapter is NULL", __func__);
+ return VOS_STATUS_E_FAULT;
+ }
+
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+
+ /* we are connected prepare our callback context */
+ init_completion(&context.completion);
+ context.pAdapter = pAdapter;
+ context.magic = STATS_CONTEXT_MAGIC;
+
+ /* query tsm stats */
+ hstatus = sme_GetTsmStats(pHddCtx->hHal, hdd_GetTsmStatsCB,
+ pHddStaCtx->conn_info.staId[ 0 ],
+ pHddStaCtx->conn_info.bssId,
+ &context, pHddCtx->pvosContext, tid);
+
+ if (eHAL_STATUS_SUCCESS != hstatus)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Unable to retrieve statistics", __func__);
+ return hstatus;
+ }
+ else
+ {
+ /* request was sent -- wait for the response */
+ lrc = wait_for_completion_interruptible_timeout(&context.completion,
+ msecs_to_jiffies(WLAN_WAIT_TIME_STATS));
+ /* either we have a response or we timed out
+ either way, first invalidate our magic */
+ context.magic = 0;
+ if (lrc <= 0)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: SME %s while retrieving statistics",
+ __func__, (0 == lrc) ? "timeout" : "interrupt");
+ /* there is a race condition such that the callback
+ function could be executing at the same time we are. of
+ primary concern is if the callback function had already
+ verified the "magic" but hasn't yet set the completion
+ variable. Since the completion variable is on our
+ stack, we'll delay just a bit to make sure the data is
+ still valid if that is the case */
+ msleep(50);
+ return (VOS_STATUS_E_TIMEOUT);
+ }
+ }
+ pTsmMetrics->UplinkPktQueueDly = pAdapter->tsmStats.UplinkPktQueueDly;
+ vos_mem_copy(pTsmMetrics->UplinkPktQueueDlyHist,
+ pAdapter->tsmStats.UplinkPktQueueDlyHist,
+ sizeof(pAdapter->tsmStats.UplinkPktQueueDlyHist)/
+ sizeof(pAdapter->tsmStats.UplinkPktQueueDlyHist[0]));
+ pTsmMetrics->UplinkPktTxDly = pAdapter->tsmStats.UplinkPktTxDly;
+ pTsmMetrics->UplinkPktLoss = pAdapter->tsmStats.UplinkPktLoss;
+ pTsmMetrics->UplinkPktCount = pAdapter->tsmStats.UplinkPktCount;
+ pTsmMetrics->RoamingCount = pAdapter->tsmStats.RoamingCount;
+ pTsmMetrics->RoamingDly = pAdapter->tsmStats.RoamingDly;
+
+ return VOS_STATUS_SUCCESS;
+}
+#endif /*FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
void hdd_getBand_helper(hdd_context_t *pHddCtx, int *pBand)
{
@@ -3739,6 +4038,91 @@
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/**---------------------------------------------------------------------------
+
+ \brief hdd_parse_get_cckm_ie() - HDD Parse and fetch the CCKM IE
+
+ This function parses the SETCCKM IE command
+ SETCCKMIE<space><ie data>
+
+ \param - pValue Pointer to input data
+ \param - pCckmIe Pointer to output cckm Ie
+ \param - pCckmIeLen Pointer to output cckm ie length
+
+ \return - 0 for success non-zero for failure
+
+ --------------------------------------------------------------------------*/
+VOS_STATUS hdd_parse_get_cckm_ie(tANI_U8 *pValue, tANI_U8 **pCckmIe,
+ tANI_U8 *pCckmIeLen)
+{
+ tANI_U8 *inPtr = pValue;
+ tANI_U8 *dataEnd;
+ int j = 0;
+ int i = 0;
+ tANI_U8 tempByte = 0;
+
+ inPtr = strnchr(pValue, strlen(pValue), SPACE_ASCII_VALUE);
+ /*no argument after the command*/
+ if (NULL == inPtr)
+ {
+ return -EINVAL;
+ }
+
+ /*no space after the command*/
+ else if (SPACE_ASCII_VALUE != *inPtr)
+ {
+ return -EINVAL;
+ }
+
+ /*removing empty spaces*/
+ while ((SPACE_ASCII_VALUE == *inPtr) && ('\0' != *inPtr) ) inPtr++;
+
+ /*no argument followed by spaces*/
+ if ('\0' == *inPtr)
+ {
+ return -EINVAL;
+ }
+
+ /* find the length of data */
+ dataEnd = inPtr;
+ while(('\0' != *dataEnd) )
+ {
+ dataEnd++;
+ ++(*pCckmIeLen);
+ }
+ if ( *pCckmIeLen <= 0) return -EINVAL;
+
+ /* Allocate the number of bytes based on the number of input characters
+ whether it is even or odd.
+ if the number of input characters are even, then we need N/2 byte.
+ if the number of input characters are odd, then we need do (N+1)/2 to
+ compensate rounding off.
+ For example, if N = 18, then (18 + 1)/2 = 9 bytes are enough.
+ If N = 19, then we need 10 bytes, hence (19 + 1)/2 = 10 bytes */
+ *pCckmIe = vos_mem_malloc((*pCckmIeLen + 1)/2);
+ if (NULL == *pCckmIe)
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL,
+ "%s: vos_mem_alloc failed ", __func__);
+ return -EINVAL;
+ }
+ vos_mem_zero(*pCckmIe, (*pCckmIeLen + 1)/2);
+ /* the buffer received from the upper layer is character buffer,
+ we need to prepare the buffer taking 2 characters in to a U8 hex decimal number
+ for example 7f0000f0...form a buffer to contain 7f in 0th location, 00 in 1st
+ and f0 in 3rd location */
+ for (i = 0, j = 0; j < *pCckmIeLen; j += 2)
+ {
+ tempByte = (hdd_parse_hex(inPtr[j]) << 4) | (hdd_parse_hex(inPtr[j + 1]));
+ (*pCckmIe)[i++] = tempByte;
+ }
+ *pCckmIeLen = i;
+
+ return VOS_STATUS_SUCCESS;
+}
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
/**---------------------------------------------------------------------------
\brief hdd_is_valid_mac_address() - Validate MAC address
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 91eb659..a92a066 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -131,13 +131,6 @@
static int ioctl_debug;
module_param(ioctl_debug, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
-struct statsContext
-{
- struct completion completion;
- hdd_adapter_t *pAdapter;
- unsigned int magic;
-};
-
#define STATS_CONTEXT_MAGIC 0x53544154 //STAT
#define RSSI_CONTEXT_MAGIC 0x52535349 //RSSI
#define POWER_CONTEXT_MAGIC 0x504F5752 //POWR
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index 94f90fa..e72e1cf 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -97,7 +97,7 @@
#include "smeRrmInternal.h"
#include "rrmGlobal.h"
#endif
-#if defined FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "ccxApi.h"
#include "ccxGlobal.h"
#endif
diff --git a/CORE/MAC/inc/aniSystemDefs.h b/CORE/MAC/inc/aniSystemDefs.h
index bc84d61..ea88001 100644
--- a/CORE/MAC/inc/aniSystemDefs.h
+++ b/CORE/MAC/inc/aniSystemDefs.h
@@ -244,5 +244,19 @@
tANI_U8 cmd[64];
}tBoaCommand;
+
+typedef __ani_attr_pre_packed struct sTrafStrmMetrics
+{
+ tANI_U16 UplinkPktQueueDly;
+ tANI_U16 UplinkPktQueueDlyHist[4];
+ tANI_U32 UplinkPktTxDly;
+ tANI_U16 UplinkPktLoss;
+ tANI_U16 UplinkPktCount;
+ tANI_U8 RoamingCount;
+ tANI_U16 RoamingDly;
+} __ani_attr_packed tTrafStrmMetrics, *tpTrafStrmMetrics;
+
+
+
#endif /* __ANI_SYSTEM_DEFS_H */
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index ede6ed6..3f79202 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -58,7 +58,7 @@
#include "aniSystemDefs.h"
#include "sirParams.h"
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "ccxGlobal.h"
#endif
@@ -2148,6 +2148,60 @@
} tAniGetRoamRssiRsp, *tpAniGetRoamRssiRsp;
#endif
+
+#if defined(FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_CCX_UPLOAD)
+
+typedef struct sSirTsmIE
+{
+ tANI_U8 tsid;
+ tANI_U8 state;
+ tANI_U16 msmt_interval;
+} tSirTsmIE, *tpSirTsmIE;
+
+typedef struct sSirSmeTsmIEInd
+{
+ tSirTsmIE tsmIe;
+ tANI_U8 sessionId;
+} tSirSmeTsmIEInd, *tpSirSmeTsmIEInd;
+
+
+typedef struct sAniTrafStrmMetrics
+{
+ tANI_U16 UplinkPktQueueDly;
+ tANI_U16 UplinkPktQueueDlyHist[4];
+ tANI_U32 UplinkPktTxDly;
+ tANI_U16 UplinkPktLoss;
+ tANI_U16 UplinkPktCount;
+ tANI_U8 RoamingCount;
+ tANI_U16 RoamingDly;
+} tAniTrafStrmMetrics, *tpAniTrafStrmMetrics;
+
+typedef struct sAniGetTsmStatsReq
+{
+ // Common for all types are requests
+ tANI_U16 msgType; // message type is same as the request type
+ tANI_U16 msgLen; // length of the entire request
+ tANI_U8 staId;
+ tANI_U8 tid; // traffic id
+ tSirMacAddr bssId;
+ void *tsmStatsCallback;
+ void *pDevContext; //device context
+ void *pVosContext; //voss context
+} tAniGetTsmStatsReq, *tpAniGetTsmStatsReq;
+
+typedef struct sAniGetTsmStatsRsp
+{
+ // Common for all types are responses
+ tANI_U16 msgType; // message type is same as the request type
+ tANI_U16 msgLen; // length of the entire request, includes the pStatsBuf length too
+ tANI_U8 sessionId;
+ tANI_U32 rc; //success/failure
+ tANI_U32 staId; // Per STA stats request must contain valid
+ tAniTrafStrmMetrics tsmMetrics;
+ void *tsmStatsReq; //tsm stats request backup
+} tAniGetTsmStatsRsp, *tpAniGetTsmStatsRsp;
+#endif /* FEATURE_WLAN_CCX || FEATURE_WLAN_CCX_UPLOAD */
+
/* Change country code request MSG structure */
typedef struct sAniChangeCountryCodeReq
{
@@ -2422,6 +2476,50 @@
}__ani_attr_packed tclasParams;
} __ani_attr_packed tSirTclasInfo;
+
+#if defined(FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_CCX_UPLOAD)
+#define TSRS_11AG_RATE_6MBPS 0xC
+#define TSRS_11B_RATE_5_5MBPS 0xB
+
+typedef struct sSirMacCCXTSRSIE
+{
+ tANI_U8 tsid;
+ tANI_U8 rates[8];
+} tSirMacCCXTSRSIE;
+
+typedef struct sSirMacCCXTSMIE
+{
+ tANI_U8 tsid;
+ tANI_U8 state;
+ tANI_U16 msmt_interval;
+} tSirMacCCXTSMIE;
+
+typedef struct sTSMStats
+{
+ tANI_U8 tid;
+ tSirMacAddr bssId;
+ tTrafStrmMetrics tsmMetrics;
+} tTSMStats, *tpTSMStats;
+
+typedef struct sCcxTSMContext
+{
+ tANI_U8 tid;
+ tSirMacCCXTSMIE tsmInfo;
+ tTrafStrmMetrics tsmMetrics;
+} tCcxTSMContext, *tpCcxTSMContext;
+
+typedef struct sCcxPEContext
+{
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
+ tCcxMeasReq curMeasReq;
+#endif
+ tCcxTSMContext tsm;
+} tCcxPEContext, *tpCcxPEContext;
+
+
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
+
typedef struct sSirAddtsReqInfo
{
tANI_U8 dialogToken;
@@ -2430,7 +2528,7 @@
tANI_U8 numTclas; // number of Tclas elements
tSirTclasInfo tclasInfo[SIR_MAC_TCLASIE_MAXNUM];
tANI_U8 tclasProc;
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX)
tSirMacCCXTSRSIE tsrsIE;
tANI_U8 tsrsPresent:1;
#endif
@@ -2451,7 +2549,7 @@
tSirTclasInfo tclasInfo[SIR_MAC_TCLASIE_MAXNUM];
tANI_U8 tclasProc;
tSirMacScheduleIE schedule;
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_CCX_UPLOAD)
tSirMacCCXTSMIE tsmIE;
tANI_U8 tsmPresent:1;
#endif
diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h
index 25a7973..37ad4fb 100644
--- a/CORE/MAC/inc/wniApi.h
+++ b/CORE/MAC/inc/wniApi.h
@@ -381,6 +381,11 @@
#ifdef FEATURE_WLAN_LPHB
eWNI_SME_LPHB_IND,
#endif /* FEATURE_WLAN_LPHB */
+
+ eWNI_SME_GET_TSM_STATS_REQ,
+ eWNI_SME_GET_TSM_STATS_RSP,
+ eWNI_SME_TSM_IE_IND,
+
eWNI_SME_MSG_TYPES_END
};
diff --git a/CORE/MAC/src/include/parserApi.h b/CORE/MAC/src/include/parserApi.h
index f84230a..e5b4e0a 100644
--- a/CORE/MAC/src/include/parserApi.h
+++ b/CORE/MAC/src/include/parserApi.h
@@ -708,7 +708,16 @@
void PopulateDot11fWMMCaps(tDot11fIEWMMCaps *pCaps);
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX)
+// Fill the CCX version IE
+void PopulateDot11fCCXVersion(tDot11fIECCXVersion *pCCXVersion);
+// Fill the Radio Management Capability
+void PopulateDot11fCCXRadMgmtCap(tDot11fIECCXRadMgmtCap *pCCXRadMgmtCap);
+// Fill the CCKM IE
+tSirRetStatus PopulateDot11fCCXCckmOpaque( tpAniSirGlobal pMac,
+ tpSirCCKMie pCCKMie,
+ tDot11fIECCXCckmOpaque *pDot11f );
+
void PopulateDot11TSRSIE(tpAniSirGlobal pMac,
tSirMacCCXTSRSIE *pOld,
tDot11fIECCXTrafStrmRateSet *pDot11f,
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 25db733..23ca294 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -700,9 +700,8 @@
#endif
#define SIR_LIM_BEACON_GEN_IND (SIR_LIM_TIMEOUT_MSG_START + 0x23)
#define SIR_LIM_PERIODIC_PROBE_REQ_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x24)
-#ifdef FEATURE_WLAN_CCX
+
#define SIR_LIM_CCX_TSM_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x25)
-#endif
#define SIR_LIM_DISASSOC_ACK_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x26)
#define SIR_LIM_DEAUTH_ACK_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x27)
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.c b/CORE/MAC/src/pe/lim/limAssocUtils.c
index 5b40fa9..f3c5bf6 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.c
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.c
@@ -703,7 +703,11 @@
pMac->lim.gLastBeaconDtimPeriod = 0;
#ifdef FEATURE_WLAN_CCX
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ limSendSmeTsmIEInd(pMac, psessionEntry, 0, 0, 0);
+#else
limDeactivateAndChangeTimer(pMac,eLIM_TSM_TIMER);
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
#endif
/**
@@ -2660,7 +2664,7 @@
#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
- limLog( pMac, LOGE, FL( "Sending SIR_HAL_ADD_STA_REQ... (aid %d)" ), pAddStaParams->assocId);
+ limLog( pMac, LOG1, FL( "Sending SIR_HAL_ADD_STA_REQ... (aid %d)" ), pAddStaParams->assocId);
#endif
MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
@@ -4353,3 +4357,49 @@
return;
}
#endif
+
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/** -------------------------------------------------------------
+\fn limSendSmeTsmIEInd
+\brief Forwards the TSM IE information to SME.
+\param tpAniSirGlobal pMac
+\param psessionEntry - PE session context
+\param tid - traffic id
+\param state - tsm state (enabled/disabled)
+\param measurementInterval - measurement interval
+\return none
+ -------------------------------------------------------------*/
+void limSendSmeTsmIEInd(tpAniSirGlobal pMac, tpPESession psessionEntry,
+ tANI_U8 tid, tANI_U8 state, tANI_U16 measInterval)
+{
+ tSirMsgQ mmhMsg;
+ tpSirSmeTsmIEInd pSirSmeTsmIeInd = NULL;
+
+ if (!pMac || !psessionEntry)
+ {
+ return;
+ }
+ pSirSmeTsmIeInd = vos_mem_malloc(sizeof(tSirSmeTsmIEInd));
+ if (NULL == pSirSmeTsmIeInd)
+ {
+ limLog(pMac, LOGP,
+ FL("AllocateMemory failed for tSirSmeTsmIEInd"));
+ return;
+ }
+ vos_mem_set((void*)pSirSmeTsmIeInd, sizeof(tSirSmeTsmIEInd), 0);
+
+ pSirSmeTsmIeInd->sessionId = psessionEntry->smeSessionId;
+ pSirSmeTsmIeInd->tsmIe.tsid = tid;
+ pSirSmeTsmIeInd->tsmIe.state= state;
+ pSirSmeTsmIeInd->tsmIe.msmt_interval= measInterval;
+
+ mmhMsg.type = eWNI_SME_TSM_IE_IND;
+ mmhMsg.bodyptr = pSirSmeTsmIeInd;
+ mmhMsg.bodyval = 0;
+
+ limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
+ return;
+}
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
+
diff --git a/CORE/MAC/src/pe/lim/limAssocUtils.h b/CORE/MAC/src/pe/lim/limAssocUtils.h
index 723b174..6684b99 100644
--- a/CORE/MAC/src/pe/lim/limAssocUtils.h
+++ b/CORE/MAC/src/pe/lim/limAssocUtils.h
@@ -197,6 +197,11 @@
tANI_U8 *frame, tANI_U32 frameLen, tANI_U16 sessionId, tpPESession psessionEntry);
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+void limSendSmeTsmIEInd( tpAniSirGlobal pMac, tpPESession psessionEntry,
+ tANI_U8 tid, tANI_U8 state, tANI_U16 measInterval);
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
#endif /* __LIM_ASSOC_UTILS_H */
diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c
index e35d71a..85b6be0 100644
--- a/CORE/MAC/src/pe/lim/limFT.c
+++ b/CORE/MAC/src/pe/lim/limFT.c
@@ -489,7 +489,7 @@
pAddBssParams->currentOperChannel = bssDescription->channelId;
#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
- limLog( pMac, LOGE, FL( "SIR_HAL_ADD_BSS_REQ with channel = %d..." ),
+ limLog( pMac, LOG1, FL( "SIR_HAL_ADD_BSS_REQ with channel = %d..." ),
pAddBssParams->currentOperChannel);
#endif
@@ -621,7 +621,7 @@
/* Retrieve the session that has already been created and update the entry */
pftSessionEntry = pMac->ft.ftPEContext.pftSessionEntry;
#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
- limPrintMacAddr(pMac, pbssDescription->bssId, LOGE);
+ limPrintMacAddr(pMac, pbssDescription->bssId, LOG1);
#endif
pftSessionEntry->dot11mode = psessionEntry->dot11mode;
@@ -660,7 +660,7 @@
sirCopyMacAddr(pftSessionEntry->selfMacAddr, psessionEntry->selfMacAddr);
sirCopyMacAddr(pftSessionEntry->limReAssocbssId, pbssDescription->bssId);
#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
- limPrintMacAddr(pMac, pftSessionEntry->limReAssocbssId, LOGE);
+ limPrintMacAddr(pMac, pftSessionEntry->limReAssocbssId, LOG1);
#endif
/* Store beaconInterval */
@@ -966,7 +966,7 @@
mmhMsg.bodyval = 0;
#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
- PELOGE(limLog( pMac, LOGE, "Posted Auth Rsp to SME with status of 0x%x", status);)
+ PELOGE(limLog( pMac, LOG1, "Posted Auth Rsp to SME with status of 0x%x", status);)
#endif
#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
if (status == eSIR_SUCCESS)
@@ -1040,12 +1040,12 @@
pftSessionEntry->limPrevSmeState = pftSessionEntry->limSmeState;
pftSessionEntry->limSmeState = eLIM_SME_WT_REASSOC_STATE;
pMac->ft.ftPEContext.pftSessionEntry = pftSessionEntry;
- PELOGE(limLog(pMac,LOGE,"%s:created session (%p) with id = %d",
+ PELOGE(limLog(pMac, LOG1,"%s:created session (%p) with id = %d",
__func__, pftSessionEntry, pftSessionEntry->peSessionId);)
/* Update the ReAssoc BSSID of the current session */
sirCopyMacAddr(psessionEntry->limReAssocbssId, pbssDescription->bssId);
- limPrintMacAddr(pMac, psessionEntry->limReAssocbssId, LOGE);
+ limPrintMacAddr(pMac, psessionEntry->limReAssocbssId, LOG1);
}
if (psessionEntry->currentOperChannel !=
@@ -1058,7 +1058,7 @@
else
{
#ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG
- PELOGE(limLog( pMac, LOGE, "Pre auth on same channel as connected AP channel %d",
+ PELOGE(limLog( pMac, LOG1, "Pre auth on same channel as connected AP channel %d",
pMac->ft.ftPEContext.pFTPreAuthReq->preAuthchannelNum);)
#endif
limFTProcessPreAuthResult(pMac, status, (tANI_U32 *)psessionEntry);
@@ -1194,7 +1194,7 @@
#if defined WLAN_FEATURE_VOWIFI_11R_DEBUG
- limLog( pMac, LOGE, FL( "Sending SIR_HAL_ADD_BSS_REQ..." ));
+ limLog( pMac, LOG1, FL( "Sending SIR_HAL_ADD_BSS_REQ..." ));
#endif
MTRACE(macTraceMsgTx(pMac, psessionEntry->peSessionId, msgQ.type));
diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
index 202237c..23e3f46 100644
--- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
@@ -71,7 +71,7 @@
#endif
#include "limSessionUtils.h"
-#if defined FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "ccxApi.h"
#endif
#include "wlan_qct_wda.h"
@@ -592,7 +592,12 @@
psessionEntry->ccxContext.tsm.tid = addts.tspec.tsinfo.traffic.userPrio;
vos_mem_copy(&psessionEntry->ccxContext.tsm.tsmInfo,
&addts.tsmIE,sizeof(tSirMacCCXTSMIE));
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ limSendSmeTsmIEInd(pMac, psessionEntry, addts.tsmIE.tsid,
+ addts.tsmIE.state, addts.tsmIE.msmt_interval);
+#else
limActivateTSMStatsTimer(pMac, psessionEntry);
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
}
#endif
/* Since AddTS response was successful, check for the PSB flag
@@ -851,7 +856,11 @@
PELOG1(limLog(pMac, LOG1, FL("DeleteTS succeeded"));)
#ifdef FEATURE_WLAN_CCX
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ limSendSmeTsmIEInd(pMac, psessionEntry, 0, 0, 0);
+#else
limDeactivateAndChangeTimer(pMac,eLIM_TSM_TIMER);
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
#endif
}
diff --git a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
index c8e30a2..6ac2f34 100644
--- a/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessAssocRspFrame.c
@@ -67,7 +67,7 @@
#include "limStaHashApi.h"
#include "limSendMessages.h"
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "ccxApi.h"
#endif
@@ -672,7 +672,15 @@
psessionEntry->ccxContext.tsm.tid = pAssocRsp->TSPECInfo[cnt].user_priority;
vos_mem_copy(&psessionEntry->ccxContext.tsm.tsmInfo,
&pAssocRsp->tsmIE, sizeof(tSirMacCCXTSMIE));
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ limSendSmeTsmIEInd(pMac,
+ psessionEntry,
+ pAssocRsp->tsmIE.tsid,
+ pAssocRsp->tsmIE.state,
+ pAssocRsp->tsmIE.msmt_interval);
+#else
limActivateTSMStatsTimer(pMac, psessionEntry);
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
if(psessionEntry->ccxContext.tsm.tsmInfo.state) {
psessionEntry->ccxContext.tsm.tsmMetrics.RoamingCount++;
}
diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
index 85d38ee..eb3cc0b 100644
--- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
+++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
@@ -54,7 +54,7 @@
#if defined WLAN_FEATURE_VOWIFI
#include "rrmApi.h"
#endif
-#if defined FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "ccxApi.h"
#endif
@@ -805,7 +805,7 @@
}
}
#endif
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
/* We accept data frame (IAPP frame) only if Session is
* present and ccx connection is established on that
* session
@@ -1313,6 +1313,9 @@
#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
case eWNI_SME_GET_ROAM_RSSI_REQ:
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ case eWNI_SME_GET_TSM_STATS_REQ:
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
// These messages are from HDD
limProcessNormalHddMsg(pMac, limMsg, false); //no need to response to hdd
break;
@@ -1525,10 +1528,16 @@
break;
#ifdef FEATURE_WLAN_CCX
case SIR_LIM_CCX_TSM_TIMEOUT:
+#ifndef FEATURE_WLAN_CCX_UPLOAD
limProcessTsmTimeoutHandler(pMac,limMsg);
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
break;
case WDA_TSM_STATS_RSP:
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ limSendSmePECcxTsmRsp(pMac, (tAniGetTsmStatsRsp *)limMsg->bodyptr);
+#else
limProcessHalCcxTsmRsp(pMac, limMsg);
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
break;
#endif
case WDA_ADD_TS_RSP:
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 1ee9eb6..fd66b68 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -76,7 +76,7 @@
#if defined WLAN_FEATURE_VOWIFI
#include "rrmApi.h"
#endif
-#if defined FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "ccxApi.h"
#endif
@@ -3956,7 +3956,11 @@
status = eSIR_FAILURE;
}
#ifdef FEATURE_WLAN_CCX
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ limSendSmeTsmIEInd(pMac, psessionEntry, 0, 0, 0);
+#else
limDeactivateAndChangeTimer(pMac,eLIM_TSM_TIMER);
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
#endif
// send an sme response back
@@ -4125,6 +4129,36 @@
return;
}
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/**
+ *FUNCTION: __limProcessSmeGetTsmStatsRequest()
+ *
+ *NOTE:
+ *
+ * @param pMac Pointer to Global MAC structure
+ * @param *pMsgBuf A pointer to the SME message buffer
+ * @return None
+ */
+static void
+__limProcessSmeGetTsmStatsRequest(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf)
+{
+ tSirMsgQ msgQ;
+
+ msgQ.type = WDA_TSM_STATS_REQ;
+ msgQ.reserved = 0;
+ msgQ.bodyptr = pMsgBuf;
+ msgQ.bodyval = 0;
+ MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type));
+
+ if( eSIR_SUCCESS != (wdaPostCtrlMsg( pMac, &msgQ ))){
+ vos_mem_free( pMsgBuf );
+ limLog(pMac, LOGP, "Unable to forward request");
+ return;
+ }
+}
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
+
+
#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
/**
@@ -4419,7 +4453,7 @@
break;
case eWNI_SME_BEACON_REPORT_RESP_XMIT_IND:
{
-#if defined FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
tpSirBeaconReportXmitInd pBcnReport=NULL;
tpPESession psessionEntry=NULL;
tANI_U8 sessionId;
@@ -5454,6 +5488,12 @@
bufConsumed = FALSE;
break;
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ case eWNI_SME_GET_TSM_STATS_REQ:
+ __limProcessSmeGetTsmStatsRequest( pMac, pMsgBuf);
+ bufConsumed = FALSE;
+ break;
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
case eWNI_SME_DEL_BA_PEER_IND:
limProcessSmeDelBaPeerInd(pMac, pMsgBuf);
break;
@@ -5506,7 +5546,7 @@
break;
#endif
-#if defined FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
case eWNI_SME_CCX_ADJACENT_AP_REPORT:
limProcessAdjacentAPRepMsg ( pMac, pMsgBuf );
break;
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 405f29e..b12149e 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -67,9 +67,6 @@
#include "rrmApi.h"
#endif
-#ifdef FEATURE_WLAN_CCX
-#include <limCcxparserApi.h>
-#endif
#include "wlan_qct_wda.h"
#ifdef WLAN_FEATURE_11W
#include "dot11fdefs.h"
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
index 82ac7d8..2ef073a 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
@@ -2486,6 +2486,60 @@
#endif
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+/**
+ * limSendSmePECcxTsmRsp()
+ *
+ *FUNCTION:
+ * This function is called to send tsm stats response to HDD.
+ * This function posts the result back to HDD. This is a response to
+ * HDD's request to get tsm stats.
+ *
+ *PARAMS:
+ * @param pMac - Pointer to global pMac structure
+ * @param pStats - Pointer to TSM Stats
+ *
+ * @return none
+ */
+
+void
+limSendSmePECcxTsmRsp(tpAniSirGlobal pMac, tAniGetTsmStatsRsp *pStats)
+{
+ tSirMsgQ mmhMsg;
+ tANI_U8 sessionId;
+ tAniGetTsmStatsRsp *pPeStats = (tAniGetTsmStatsRsp *) pStats;
+ tpPESession pPeSessionEntry = NULL;
+
+ //Get the Session Id based on Sta Id
+ pPeSessionEntry = peFindSessionByStaId(pMac, pPeStats->staId, &sessionId);
+
+ //Fill the Session Id
+ if(NULL != pPeSessionEntry)
+ {
+ //Fill the Session Id
+ pPeStats->sessionId = pPeSessionEntry->smeSessionId;
+ }
+ else
+ {
+ PELOGE(limLog(pMac, LOGE, FL("Session not found for the Sta id(%d)"),
+ pPeStats->staId);)
+ return;
+ }
+
+ pPeStats->msgType = eWNI_SME_GET_TSM_STATS_RSP;
+
+ mmhMsg.type = eWNI_SME_GET_TSM_STATS_RSP;
+ mmhMsg.bodyptr = pStats;
+ mmhMsg.bodyval = 0;
+ MTRACE(macTraceMsgTx(pMac, sessionId, mmhMsg.type));
+ limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
+
+ return;
+} /*** end limSendSmePECcxTsmRsp() ***/
+
+#endif /* FEATURE_WLAN_CCX) && FEATURE_WLAN_CCX_UPLOAD */
+
+
void
limSendSmeIBSSPeerInd(
tpAniSirGlobal pMac,
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
index bb7ac66..2c4cfb1 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
@@ -83,6 +83,9 @@
#if defined WLAN_FEATURE_VOWIFI_11R || defined FEATURE_WLAN_CCX || defined(FEATURE_WLAN_LFR)
void limSendSmePEGetRoamRssiRsp(tpAniSirGlobal pMac, tANI_U16 msgtype, void * stats);
#endif
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+void limSendSmePECcxTsmRsp(tpAniSirGlobal pMac, tAniGetTsmStatsRsp *pStats);
+#endif
void limSendSmeRemoveKeyRsp(tpAniSirGlobal pMac, tSirMacAddr peerMacAddr, tSirResultCodes resultCode,tpPESession,tANI_U8,tANI_U16);
diff --git a/CORE/MAC/src/pe/lim/limSession.c b/CORE/MAC/src/pe/lim/limSession.c
index 1ca441f..97ecaab 100644
--- a/CORE/MAC/src/pe/lim/limSession.c
+++ b/CORE/MAC/src/pe/lim/limSession.c
@@ -61,7 +61,7 @@
#include "limDebug.h"
#include "limSession.h"
#include "limUtils.h"
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
#include "ccxApi.h"
#endif
@@ -470,7 +470,7 @@
psessionEntry->pLimMlmReassocReq = NULL;
}
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
limCleanupCcxCtxt(pMac, psessionEntry);
#endif
diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.c b/CORE/MAC/src/pe/lim/limTimerUtils.c
index 52db4d1..e3df2cb 100644
--- a/CORE/MAC/src/pe/lim/limTimerUtils.c
+++ b/CORE/MAC/src/pe/lim/limTimerUtils.c
@@ -675,7 +675,7 @@
}
#endif
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
cfgValue = 5000;
cfgValue = SYS_MS_TO_TICKS(cfgValue);
@@ -690,7 +690,7 @@
limLog(pMac, LOGP, FL("could not create Join failure timer"));
goto err_timer;
}
-#endif
+#endif /* FEATURE_WLAN_CCX && !FEATURE_WLAN_CCX_UPLOAD */
cfgValue = 1000;
cfgValue = SYS_MS_TO_TICKS(cfgValue);
@@ -761,9 +761,9 @@
tx_timer_delete(&pMac->lim.limTimers.gLimDeauthAckTimer);
tx_timer_delete(&pMac->lim.limTimers.gLimDisassocAckTimer);
tx_timer_delete(&pMac->lim.limTimers.gLimRemainOnChannelTimer);
- #ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
tx_timer_delete(&pMac->lim.limTimers.gLimCcxTsmTimer);
- #endif
+#endif /* FEATURE_WLAN_CCX && !FEATURE_WLAN_CCX_UPLOAD */
tx_timer_delete(&pMac->lim.limTimers.gLimFTPreAuthRspTimer);
tx_timer_delete(&pMac->lim.limTimers.gLimUpdateOlbcCacheTimer);
while(((tANI_S32)--i) >= 0)
@@ -1671,7 +1671,7 @@
}
break;
#endif
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
case eLIM_TSM_TIMER:
if (tx_timer_deactivate(&pMac->lim.limTimers.gLimCcxTsmTimer)
!= TX_SUCCESS)
@@ -1679,7 +1679,7 @@
limLog(pMac, LOGE, FL("Unable to deactivate TSM timer"));
}
break;
-#endif
+#endif /* FEATURE_WLAN_CCX && !FEATURE_WLAN_CCX_UPLOAD */
case eLIM_REMAIN_CHN_TIMER:
if (tx_timer_deactivate(&pMac->lim.limTimers.gLimRemainOnChannelTimer) != TX_SUCCESS)
{
diff --git a/CORE/MAC/src/pe/lim/limTypes.h b/CORE/MAC/src/pe/lim/limTypes.h
index 7ab0ef0..7ea5df6 100644
--- a/CORE/MAC/src/pe/lim/limTypes.h
+++ b/CORE/MAC/src/pe/lim/limTypes.h
@@ -717,7 +717,7 @@
tSirRetStatus limSendRadioMeasureReportActionFrame(tpAniSirGlobal, tANI_U8, tANI_U8, tpSirMacRadioMeasureReport, tSirMacAddr, tpPESession);
#endif
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
void limProcessIappFrame(tpAniSirGlobal, tANI_U8 *,tpPESession);
#endif
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index 49d0ff8..566d5e7 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -690,6 +690,12 @@
return "eWNI_PMC_EXIT_BMPS_IND";
case eWNI_SME_SET_BCN_FILTER_REQ:
return "eWNI_SME_SET_BCN_FILTER_REQ";
+#if defined(FEATURE_WLAN_CCX) && defined(FEATURE_WLAN_CCX_UPLOAD)
+ case eWNI_SME_GET_TSM_STATS_REQ:
+ return "eWNI_SME_GET_TSM_STATS_REQ";
+ case eWNI_SME_GET_TSM_STATS_RSP:
+ return "eWNI_SME_GET_TSM_STATS_RSP";
+#endif /* FEATURE_WLAN_CCX && FEATURE_WLAN_CCX_UPLOAD */
default:
return "INVALID SME message";
}
@@ -1086,11 +1092,11 @@
tx_timer_deactivate(&pMac->lim.limTimers.gLimRemainOnChannelTimer);
tx_timer_delete(&pMac->lim.limTimers.gLimRemainOnChannelTimer);
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
// Deactivate and delete TSM
tx_timer_deactivate(&pMac->lim.limTimers.gLimCcxTsmTimer);
tx_timer_delete(&pMac->lim.limTimers.gLimCcxTsmTimer);
-#endif
+#endif /* FEATURE_WLAN_CCX && !FEATURE_WLAN_CCX_UPLOAD */
tx_timer_deactivate(&pMac->lim.limTimers.gLimDisassocAckTimer);
tx_timer_delete(&pMac->lim.limTimers.gLimDisassocAckTimer);
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
diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c
index f1c82ec..19e7462 100644
--- a/CORE/SYS/legacy/src/utils/src/macTrace.c
+++ b/CORE/SYS/legacy/src/utils/src/macTrace.c
@@ -541,6 +541,9 @@
CASE_RETURN_STRING(eWNI_SME_MSG_TYPES_END);
CASE_RETURN_STRING(eWNI_SME_GET_ROAM_RSSI_REQ);
CASE_RETURN_STRING(eWNI_SME_GET_ROAM_RSSI_RSP);
+ CASE_RETURN_STRING(eWNI_SME_GET_TSM_STATS_REQ);
+ CASE_RETURN_STRING(eWNI_SME_GET_TSM_STATS_RSP);
+
default:
return( (tANI_U8*)"UNKNOWN" );
break;
diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c
index 593e11e..400b39d 100644
--- a/CORE/SYS/legacy/src/utils/src/parserApi.c
+++ b/CORE/SYS/legacy/src/utils/src/parserApi.c
@@ -3834,7 +3834,48 @@
} // End PopulateDot11fWMMTSPEC.
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX)
+
+// Fill the CCX version currently supported
+void PopulateDot11fCCXVersion(tDot11fIECCXVersion *pCCXVersion)
+{
+ pCCXVersion->present = 1;
+ pCCXVersion->version = CCX_VERSION_SUPPORTED;
+}
+
+// Fill the CCX ie for the station.
+// The State is Normal (1)
+// The MBSSID for station is set to 0.
+void PopulateDot11fCCXRadMgmtCap(tDot11fIECCXRadMgmtCap *pCCXRadMgmtCap)
+{
+ pCCXRadMgmtCap->present = 1;
+ pCCXRadMgmtCap->mgmt_state = RM_STATE_NORMAL;
+ pCCXRadMgmtCap->mbssid_mask = 0;
+ pCCXRadMgmtCap->reserved = 0;
+}
+
+tSirRetStatus PopulateDot11fCCXCckmOpaque( tpAniSirGlobal pMac,
+ tpSirCCKMie pCCKMie,
+ tDot11fIECCXCckmOpaque *pDot11f )
+{
+ int idx;
+
+ if ( pCCKMie->length )
+ {
+ if( 0 <= ( idx = FindIELocation( pMac, (tpSirRSNie)pCCKMie, DOT11F_EID_CCXCCKMOPAQUE ) ) )
+ {
+ pDot11f->present = 1;
+ pDot11f->num_data = pCCKMie->cckmIEdata[ idx + 1 ] - 4; // Dont include OUI
+ palCopyMemory( pMac->hHdd, pDot11f->data,
+ pCCKMie->cckmIEdata + idx + 2 + 4, // EID, len, OUI
+ pCCKMie->cckmIEdata[ idx + 1 ] - 4 ); // Skip OUI
+ }
+ }
+
+ return eSIR_SUCCESS;
+
+} // End PopulateDot11fCCXCckmOpaque.
+
void PopulateDot11TSRSIE(tpAniSirGlobal pMac,
tSirMacCCXTSRSIE *pOld,
tDot11fIECCXTrafStrmRateSet *pDot11f,
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index ecc63fa..6076c22 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -4209,7 +4209,7 @@
if ( NULL != pfnSTAFsm )
{
pClientSTA->ucNoMoreData = 0;
- vosStatus = pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuf);
+ vosStatus = pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuf, VOS_FALSE);
if (( VOS_STATUS_SUCCESS != vosStatus ) &&
( NULL != vosTempBuf ))
@@ -4345,7 +4345,7 @@
if ( NULL != pfnSTAFsm )
{
pClientSTA->ucNoMoreData = 0;
- vosStatus = pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuf);
+ vosStatus = pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuf, VOS_FALSE);
if (( VOS_STATUS_SUCCESS != vosStatus ) &&
( NULL != vosTempBuf ))
@@ -4925,7 +4925,7 @@
}/*WLANTL_ForwardSTAFrames*/
-#ifdef FEATURE_WLAN_CCX
+#if defined(FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_CCX_UPLOAD)
/*==========================================================================
FUNCTION WLANTL_IsIAPPFrame
@@ -5171,7 +5171,7 @@
/* software frame translation for BTAMP WDS.*/
WLANTL_Translate80211To8023Header( vosTempBuff, &vosStatus, usActualHLen,
- ucMPDUHLen, pTLCb,ucSTAId );
+ ucMPDUHLen, pTLCb,ucSTAId, VOS_FALSE);
}
if (pTLCb->tlBAPClient.pfnTlBAPRx)
@@ -5470,6 +5470,8 @@
v_U8_t ucMPDUHLen = 0 ;
v_U16_t usEtherType = 0;
#endif
+ v_BOOL_t bForwardIAPPwithLLC = VOS_FALSE;
+
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
@@ -5762,7 +5764,23 @@
continue;
}
-#ifdef FEATURE_WLAN_CCX
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ if ((pClientSTA->wSTADesc.ucIsCcxSta)|| broadcast)
+ {
+ /*--------------------------------------------------------------------
+ Filter the IAPP frames for CCX connection;
+ if data it will return false and it
+ will be routed through the regular data path
+ --------------------------------------------------------------------*/
+ if ( WLANTL_IsIAPPFrame(pvBDHeader,
+ vosTempBuff))
+ {
+ bForwardIAPPwithLLC = VOS_TRUE;
+ }
+ }
+#endif
+
+#if defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD)
if ((pClientSTA->wSTADesc.ucIsCcxSta)|| broadcast)
{
/*--------------------------------------------------------------------
@@ -5790,7 +5808,7 @@
continue;
}
}
-#endif
+#endif /* defined(FEATURE_WLAN_CCX) && !defined(FEATURE_WLAN_CCX_UPLOAD) */
if ( WLAN_STA_BT_AMP == pClientSTA->wSTADesc.wSTAType )
{
@@ -5857,7 +5875,7 @@
FL("Failed to Read SNR")));
}
- pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuff);
+ pfnSTAFsm( pvosGCtx, ucSTAId, &vosTempBuff, bForwardIAPPwithLLC);
}
else
{
@@ -6129,7 +6147,7 @@
*/
}
pfnSTAFsm( vos_get_global_context(VOS_MODULE_ID_TL,pTLCb), ucSTAId,
- &vosTempBuff);
+ &vosTempBuff, VOS_FALSE);
}
else
{
@@ -6613,7 +6631,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
v_U16_t usPktLen;
@@ -6986,7 +7005,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
v_U16_t usPktLen;
@@ -7436,7 +7456,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
WLANTL_CbType* pTLCb = NULL;
@@ -7514,7 +7535,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
WLANTL_CbType* pTLCb = NULL;
@@ -7637,7 +7659,7 @@
}
vosStatus = WLANTL_Translate80211To8023Header( vosDataBuff, &vosStatus, usActualHLen,
- ucMPDUHLen, pTLCb, ucSTAId);
+ ucMPDUHLen, pTLCb, ucSTAId, bForwardIAPPwithLLC);
if ( VOS_STATUS_SUCCESS != vosStatus )
{
@@ -7878,7 +7900,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
WLANTL_CbType* pTLCb = NULL;
@@ -8097,7 +8120,7 @@
usActualHLen = usMPDUDOffset - ucMPDUHOffset;
}
vosStatus = WLANTL_Translate80211To8023Header( vosDataBuff, &vosStatus, usActualHLen,
- ucMPDUHLen, pTLCb, ucSTAId);
+ ucMPDUHLen, pTLCb, ucSTAId, bForwardIAPPwithLLC);
if ( VOS_STATUS_SUCCESS != vosStatus )
{
@@ -8289,7 +8312,8 @@
(
v_PVOID_t pvosGCtx,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
@@ -9080,7 +9104,11 @@
WLANTL_STAClientType* pClientSTA = NULL;
v_U8_t ucQoSOffset = WLAN80211_MANDATORY_HEADER_SIZE;
v_U8_t ucStaId;
-
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ v_BOOL_t bIAPPTxwithLLC = VOS_FALSE;
+ v_SIZE_t wIAPPSnapSize = WLANTL_LLC_HEADER_LEN;
+ v_U8_t wIAPPSnap[WLANTL_LLC_HEADER_LEN] = {0};
+#endif
*ucWDSEnabled = 0; // default WDS off.
vosStatus = vos_pkt_pop_head( vosDataBuff, &w8023Header,
sizeof(w8023Header));
@@ -9139,8 +9167,28 @@
}
#endif
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+if ((0 == w8023Header.usLenType) && (pClientSTA->wSTADesc.ucIsCcxSta))
+{
+ vos_pkt_extract_data(vosDataBuff,0,&wIAPPSnap[0],&wIAPPSnapSize);
+ if (vos_mem_compare(wIAPPSnap,WLANTL_AIRONET_SNAP_HEADER,WLANTL_LLC_HEADER_LEN))
+ {
+ /*The SNAP and the protocol type are already in the data buffer.
+ They are filled by the application (wpa_supplicant). So, Skip Adding LLC below.*/
+ bIAPPTxwithLLC = VOS_TRUE;
+ }
+ else
+ {
+ bIAPPTxwithLLC = VOS_FALSE;
+ }
+}
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
- if ( 0 != pClientSTA->wSTADesc.ucAddRmvLLC )
+ if ((0 != pClientSTA->wSTADesc.ucAddRmvLLC)
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ && (!bIAPPTxwithLLC)
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
+ )
{
/* Push the length */
vosStatus = vos_pkt_push_head(vosDataBuff,
@@ -9185,6 +9233,9 @@
}/*If add LLC is enabled*/
else
{
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ bIAPPTxwithLLC = VOS_FALSE; /*Reset the Flag here to start afresh with the next TX pkt*/
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
"WLAN TL: STA Client registered to not remove LLC"
" WLANTL_Translate8023To80211Header"));
@@ -9452,7 +9503,8 @@
v_U16_t usActualHLen,
v_U8_t ucHeaderLen,
WLANTL_CbType* pTLCb,
- v_U8_t ucSTAId
+ v_U8_t ucSTAId,
+ v_BOOL_t bForwardIAPPwithLLC
)
{
WLANTL_8023HeaderType w8023Header;
@@ -9542,7 +9594,11 @@
return VOS_STATUS_E_FAILURE;
}
- if ( 0 != pTLCb->atlSTAClients[ucSTAId]->wSTADesc.ucAddRmvLLC )
+ if ( 0 != pTLCb->atlSTAClients[ucSTAId]->wSTADesc.ucAddRmvLLC
+#ifdef FEATURE_WLAN_CCX_UPLOAD
+ && (!bForwardIAPPwithLLC)
+#endif /* FEATURE_WLAN_CCX_UPLOAD */
+ )
{
// Extract the LLC header
vosStatus = vos_pkt_pop_head( vosDataBuff, aucLLCHeader,
diff --git a/CORE/TL/src/wlan_qct_tli.h b/CORE/TL/src/wlan_qct_tli.h
index 76860cc..0df3de6 100644
--- a/CORE/TL/src/wlan_qct_tli.h
+++ b/CORE/TL/src/wlan_qct_tli.h
@@ -318,7 +318,8 @@
---------------------------------------------------------------------------*/
typedef VOS_STATUS (*WLANTL_STAFuncType)( v_PVOID_t pAdapter,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff);
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC);
/*---------------------------------------------------------------------------
STA FSM Entry type
@@ -331,32 +332,38 @@
/* Receive in connected state - only EAPOL or WAI*/
VOS_STATUS WLANTL_STARxConn( v_PVOID_t pAdapter,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff );
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC);
/* Transmit in connected state - only EAPOL or WAI*/
VOS_STATUS WLANTL_STATxConn( v_PVOID_t pAdapter,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff );
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC);
/* Receive in authenticated state - all data allowed*/
VOS_STATUS WLANTL_STARxAuth( v_PVOID_t pAdapter,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff );
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC);
/* Transmit in authenticated state - all data allowed*/
VOS_STATUS WLANTL_STATxAuth( v_PVOID_t pAdapter,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff );
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC);
/* Receive in disconnected state - no data allowed*/
VOS_STATUS WLANTL_STARxDisc( v_PVOID_t pAdapter,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff );
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC);
/* Transmit in disconnected state - no data allowed*/
VOS_STATUS WLANTL_STATxDisc( v_PVOID_t pAdapter,
v_U8_t ucSTAId,
- vos_pkt_t** pvosDataBuff );
+ vos_pkt_t** pvosDataBuff,
+ v_BOOL_t bForwardIAPPwithLLC);
/* TL State Machine */
STATIC const WLANTL_STAFsmEntryType tlSTAFsm[WLANTL_STA_MAX_STATE] =
@@ -1343,7 +1350,8 @@
v_U16_t usActualHLen,
v_U8_t ucHeaderLen,
WLANTL_CbType* pTLCb,
- v_U8_t ucSTAId
+ v_U8_t ucSTAId,
+ v_BOOL_t bForwardIAPPwithLLC
);
/*==========================================================================
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index cabe5b0..ab1354b 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -5261,10 +5261,10 @@
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
"%s: VOS MEM Alloc Failure", __func__);
VOS_ASSERT(0);
- vos_mem_free(pGetRoamRssiParams);
- vos_mem_free(pWdaParams);
return VOS_STATUS_E_NOMEM;
}
+ vos_mem_free(pGetRoamRssiParams);
+ vos_mem_free(pWdaParams);
pGetRoamRssiRspParams->staId = pGetRoamRssiParams->staId;
pGetRoamRssiRspParams->rc = eSIR_FAILURE;
pGetRoamRssiRspParams->rssi = 0;
@@ -6085,7 +6085,8 @@
{
tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
tWDA_CbContext *pWDA = NULL;
- tTSMStats *pTsmRspParams = NULL;
+ tpAniGetTsmStatsRsp pTsmRspParams = NULL;
+ tpAniGetTsmStatsReq pGetTsmStatsReqParams = NULL;
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"<------ Entering: %s " ,__func__);
@@ -6097,7 +6098,20 @@
return ;
}
pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
- pTsmRspParams = (tTSMStats *)pWdaParams->wdaMsgParam ;
+ pGetTsmStatsReqParams = (tAniGetTsmStatsReq *)pWdaParams->wdaMsgParam;
+
+ if(NULL == pGetTsmStatsReqParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: pGetTsmStatsReqParams received NULL", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams);
+ return;
+ }
+
+ pTsmRspParams =
+ (tAniGetTsmStatsRsp *)vos_mem_malloc(sizeof(tAniGetTsmStatsRsp));
if( NULL == pTsmRspParams )
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -6105,9 +6119,10 @@
VOS_ASSERT( 0 );
return ;
}
- vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
- vos_mem_free(pWdaParams);
-
+ vos_mem_set(pTsmRspParams, sizeof(tAniGetTsmStatsRsp), 0);
+ pTsmRspParams->rc = pwdiTSMStatsRspParams->wdiStatus;
+ pTsmRspParams->staId = pGetTsmStatsReqParams->staId;
+
pTsmRspParams->tsmMetrics.UplinkPktQueueDly = pwdiTSMStatsRspParams->UplinkPktQueueDly;
vos_mem_copy(pTsmRspParams->tsmMetrics.UplinkPktQueueDlyHist,
pwdiTSMStatsRspParams->UplinkPktQueueDlyHist,
@@ -6118,6 +6133,14 @@
pTsmRspParams->tsmMetrics.UplinkPktCount = pwdiTSMStatsRspParams->UplinkPktCount;
pTsmRspParams->tsmMetrics.RoamingCount = pwdiTSMStatsRspParams->RoamingCount;
pTsmRspParams->tsmMetrics.RoamingDly = pwdiTSMStatsRspParams->RoamingDly;
+
+ /* Assign get tsm stats req req (backup) in to the response */
+ pTsmRspParams->tsmStatsReq = pGetTsmStatsReqParams;
+
+ /* free WDI command buffer */
+ vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams);
+
WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmRspParams , 0) ;
return ;
}
@@ -6128,11 +6151,13 @@
* Request to WDI to get the TSM Stats params.
*/
VOS_STATUS WDA_ProcessTsmStatsReq(tWDA_CbContext *pWDA,
- tTSMStats *pTsmStats)
+ tpAniGetTsmStatsReq pTsmStats)
{
- WDI_Status status = WDI_STATUS_SUCCESS ;
+ WDI_Status status = WDI_STATUS_SUCCESS ;
WDI_TSMStatsReqParamsType *wdiTSMReqParam = NULL;
- tWDA_ReqParams *pWdaParams = NULL;
+ tWDA_ReqParams *pWdaParams = NULL;
+ tAniGetTsmStatsRsp *pGetTsmStatsRspParams = NULL;
+
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"------> Entering: %s " ,__func__);
wdiTSMReqParam = (WDI_TSMStatsReqParamsType *)vos_mem_malloc(
@@ -6162,17 +6187,30 @@
pWdaParams->pWdaContext = pWDA;
/* Store TSM Stats pointer, as this will be used for response */
pWdaParams->wdaMsgParam = (void *)pTsmStats ;
- /* store Params pass it to WDI */
- pWdaParams->wdaWdiApiMsgParam = (void *)wdiTSMReqParam ;
+ pWdaParams->wdaWdiApiMsgParam = NULL ;
status = WDI_TSMStatsReq(wdiTSMReqParam,
(WDI_TsmRspCb)WDA_TSMStatsReqCallback, pWdaParams);
if(IS_WDI_STATUS_FAILURE(status))
{
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
"Failure in TSM STATS REQ Params WDI API, free all the memory " );
- vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
- vos_mem_free(pWdaParams) ;
- WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pTsmStats , 0) ;
+ vos_mem_free(pWdaParams);
+
+ pGetTsmStatsRspParams =
+ (tAniGetTsmStatsRsp *)vos_mem_malloc(sizeof(tAniGetTsmStatsRsp));
+ if(NULL == pGetTsmStatsRspParams)
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS MEM Alloc Failure", __func__);
+ VOS_ASSERT(0);
+ vos_mem_free(pTsmStats);
+ return VOS_STATUS_E_NOMEM;
+ }
+ pGetTsmStatsRspParams->staId = pTsmStats->staId;
+ pGetTsmStatsRspParams->rc = eSIR_FAILURE;
+ pGetTsmStatsRspParams->tsmStatsReq = pTsmStats;
+
+ WDA_SendMsg(pWDA, WDA_TSM_STATS_RSP, (void *)pGetTsmStatsRspParams , 0) ;
}
return CONVERT_WDI2VOS_STATUS(status) ;
}
@@ -11279,7 +11317,7 @@
#ifdef FEATURE_WLAN_CCX
case WDA_TSM_STATS_REQ:
{
- WDA_ProcessTsmStatsReq(pWDA, (tTSMStats *)pMsg->bodyptr);
+ WDA_ProcessTsmStatsReq(pWDA, (tpAniGetTsmStatsReq)pMsg->bodyptr);
break;
}
#endif
diff --git a/Kbuild b/Kbuild
index b50ab80..d3970e2 100644
--- a/Kbuild
+++ b/Kbuild
@@ -45,6 +45,10 @@
endif
+# To enable CCX upload, dependent config
+# CONFIG_QCOM_CCX must be enabled.
+CONFIG_QCOM_CCX_UPLOAD := n
+
# Feature flags which are not (currently) configurable via Kconfig
#Whether to build debug version
@@ -207,8 +211,10 @@
$(MAC_SRC_DIR)/pe/lim/limUtils.o
ifeq ($(CONFIG_QCOM_CCX),y)
+ifneq ($(CONFIG_QCOM_CCX_UPLOAD),y)
MAC_LIM_OBJS += $(MAC_SRC_DIR)/pe/lim/limProcessCcxFrame.o
endif
+endif
ifeq ($(CONFIG_QCOM_TDLS),y)
MAC_LIM_OBJS += $(MAC_SRC_DIR)/pe/lim/limProcessTdls.o
@@ -266,8 +272,10 @@
$(SME_SRC_DIR)/csr/csrUtil.o
ifeq ($(CONFIG_QCOM_CCX),y)
+ifneq ($(CONFIG_QCOM_CCX_UPLOAD),y)
SME_CSR_OBJS += $(SME_SRC_DIR)/csr/csrCcx.o
endif
+endif
ifeq ($(CONFIG_QCOM_TDLS),y)
SME_CSR_OBJS += $(SME_SRC_DIR)/csr/csrTdlsProcess.o
@@ -346,10 +354,6 @@
$(SYS_LEGACY_SRC_DIR)/utils/src/utilsApi.o \
$(SYS_LEGACY_SRC_DIR)/utils/src/utilsParser.o
-ifeq ($(CONFIG_QCOM_CCX),y)
-SYS_OBJS += $(SYS_LEGACY_SRC_DIR)/utils/src/limCcxparserApi.o
-endif
-
############ TL ############
TL_DIR := CORE/TL
TL_INC_DIR := $(TL_DIR)/inc
@@ -566,6 +570,9 @@
ifeq ($(CONFIG_QCOM_CCX),y)
CDEFINES += -DFEATURE_WLAN_CCX
+ifeq ($(CONFIG_QCOM_CCX_UPLOAD),y)
+CDEFINES += -DFEATURE_WLAN_CCX_UPLOAD
+endif
endif
#normally, TDLS negative behavior is not needed