wlan: 2nd set of run time roaming APIs
This is the implementation of next set to run time roaming APIs
GET/SET WES Mode (Wireless Extended Security)
GET/SET ROAMSCANCONTROL
Send Action frame
Receive Action frame
Change-Id: I8ec6b4a3110349e890cef1cd6e8b66f22177cfbe
CRs-Fixed: 453129
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index bd529af..594f5e3 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -796,6 +796,11 @@
#define CFG_IMMEDIATE_ROAM_RSSI_DIFF_MAX (125)
#define CFG_IMMEDIATE_ROAM_RSSI_DIFF_DEFAULT (3)
+/*This parameter is used to set Wireless Extended Security Mode.*/
+#define CFG_ENABLE_WES_MODE_NAME "gWESModeEnabled"
+#define CFG_ENABLE_WES_MODE_NAME_MIN (0)
+#define CFG_ENABLE_WES_MODE_NAME_MAX (1)
+#define CFG_ENABLE_WES_MODE_NAME_DEFAULT (0)
#endif /* (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR) */
#ifdef FEATURE_WLAN_OKC
@@ -1863,6 +1868,7 @@
v_BOOL_t isFastTransitionEnabled;
v_U8_t RoamRssiDiff;
v_U8_t nImmediateRoamRssiDiff;
+ v_BOOL_t isWESModeEnabled;
#endif
#ifdef FEATURE_WLAN_OKC
v_BOOL_t isOkcIniFeatureEnabled;
diff --git a/CORE/HDD/inc/wlan_hdd_wowl.h b/CORE/HDD/inc/wlan_hdd_wowl.h
index 1725c59..d2d672d 100644
--- a/CORE/HDD/inc/wlan_hdd_wowl.h
+++ b/CORE/HDD/inc/wlan_hdd_wowl.h
@@ -180,4 +180,11 @@
===========================================================================*/
v_BOOL_t hdd_init_wowl (hdd_adapter_t* pAdapter);
+/**============================================================================
+ @brief hdd_parse_hex() - function returns integer equivalent of hexa decimal
+
+ @return : integer equivalent of hexa decimal
+ ===========================================================================*/
+int hdd_parse_hex(unsigned char c);
+
#endif /* #ifndef _WLAN_HDD_WOWL_H */
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 0bb14e0..10a0554 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -101,6 +101,12 @@
{
sme_setRoamIntraBand((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->nRoamIntraBand);
}
+
+static void cbNotifySetWESMode(hdd_context_t *pHddCtx, unsigned long NotifyId)
+{
+ // at the point this routine is called, the value in the cfg_ini table has already been updated
+ sme_UpdateWESMode((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->isWESModeEnabled);
+}
#endif
#ifdef FEATURE_WLAN_OKC
@@ -1002,8 +1008,8 @@
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_LFR_FEATURE_ENABLED_DEFAULT,
CFG_LFR_FEATURE_ENABLED_MIN,
- CFG_LFR_FEATURE_ENABLED_MAX,
- NotifyIsFastRoamIniFeatureEnabled, 0 ),
+ CFG_LFR_FEATURE_ENABLED_MAX,
+ NotifyIsFastRoamIniFeatureEnabled, 0 ),
#endif // FEATURE_WLAN_LFR
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
@@ -1033,6 +1039,14 @@
CFG_IMMEDIATE_ROAM_RSSI_DIFF_MIN,
CFG_IMMEDIATE_ROAM_RSSI_DIFF_MAX,
cbNotifySetImmediateRoamRssiDiff, 0),
+
+ REG_DYNAMIC_VARIABLE( CFG_ENABLE_WES_MODE_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, isWESModeEnabled,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_WES_MODE_NAME_DEFAULT,
+ CFG_ENABLE_WES_MODE_NAME_MIN,
+ CFG_ENABLE_WES_MODE_NAME_MAX,
+ cbNotifySetWESMode, 0),
#endif
#ifdef FEATURE_WLAN_OKC
REG_DYNAMIC_VARIABLE( CFG_OKC_FEATURE_ENABLED_NAME, WLAN_PARAM_Integer,
@@ -2423,6 +2437,7 @@
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [RoamRssiDiff] Value = [%lu] ",pHddCtx->cfg_ini->RoamRssiDiff);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [ImmediateRoamRssiDiff] Value = [%lu] ",pHddCtx->cfg_ini->nImmediateRoamRssiDiff);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [isWESModeEnabled] Value = [%lu] ",pHddCtx->cfg_ini->isWESModeEnabled);
#endif
#ifdef FEATURE_WLAN_OKC
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [OkcEnabled] Value = [%lu] ",pHddCtx->cfg_ini->isOkcIniFeatureEnabled);
@@ -3747,6 +3762,7 @@
smeConfig.csrConfig.isFastTransitionEnabled = pConfig->isFastTransitionEnabled;
smeConfig.csrConfig.RoamRssiDiff = pConfig->RoamRssiDiff;
smeConfig.csrConfig.nImmediateRoamRssiDiff = pConfig->nImmediateRoamRssiDiff;
+ smeConfig.csrConfig.isWESModeEnabled = pConfig->isWESModeEnabled;
#endif
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 178a233..382e590 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -184,6 +184,9 @@
void hdd_getBand_helper(hdd_context_t *pHddCtx, int *pBand);
static VOS_STATUS hdd_parse_channellist(tANI_U8 *pValue, tANI_U8 *pChannelList, tANI_U8 *pNumChannels);
static VOS_STATUS hdd_parse_countryrev(tANI_U8 *pValue, tANI_U8 *pChannelList, tANI_U8 *pNumChannels);
+static VOS_STATUS hdd_parse_send_action_frame_data(tANI_U8 *pValue, tANI_U8 *pTargetApBssid,
+ tANI_U8 *pChannel, tANI_U8 *pDwellTime,
+ tANI_U8 **pBuf, tANI_U8 *pBufLen);
#endif
static int hdd_netdev_notifier_call(struct notifier_block * nb,
unsigned long state,
@@ -702,15 +705,15 @@
"%s: kstrtou16 failed ",
"Input value may be out of range[%d - %d]",
__func__,
- (CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MIN/1000),
- (CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MAX/1000));
+ (CFG_EMPTY_SCAN_REFRESH_PERIOD_MIN/1000),
+ (CFG_EMPTY_SCAN_REFRESH_PERIOD_MAX/1000));
ret = -EINVAL;
goto exit;
}
neighborScanRefreshPeriod = neighborScanRefreshPeriod * 1000;
- if ((neighborScanRefreshPeriod < CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MIN) ||
- (neighborScanRefreshPeriod > CFG_NEIGHBOR_SCAN_RESULTS_REFRESH_PERIOD_MAX))
+ if ((neighborScanRefreshPeriod < CFG_EMPTY_SCAN_REFRESH_PERIOD_MIN) ||
+ (neighborScanRefreshPeriod > CFG_EMPTY_SCAN_REFRESH_PERIOD_MAX))
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"Neighbor scan results refresh period value %d is out of range"
@@ -998,7 +1001,6 @@
ret = -EINVAL;
goto exit;
}
-
if ((minTime < CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MIN) ||
(minTime > CFG_NEIGHBOR_SCAN_MIN_CHAN_TIME_MAX))
{
@@ -1017,6 +1019,98 @@
pHddCtx->cfg_ini->nNeighborScanMinChanTime = minTime;
sme_setNeighborScanMinChanTime((tHalHandle)(pHddCtx->hHal), minTime);
}
+ else if (strncmp(command, "SENDACTIONFRAME", 15) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 channel = 0;
+ tANI_U8 dwellTime = 0;
+ tANI_U8 bufLen = 0;
+ tANI_U8 *buf = NULL;
+ tSirMacAddr targetApBssid;
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ struct ieee80211_channel chan;
+ tANI_U8 finalLen = 0;
+ tANI_U8 *finalBuf = NULL;
+ tANI_U8 temp = 0;
+ u64 cookie;
+ hdd_station_ctx_t *pHddStaCtx = NULL;
+ pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+
+ /* if not associated, no need to send action frame */
+ if (eConnectionState_Associated != pHddStaCtx->conn_info.connState)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s:Not associated!",__func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ status = hdd_parse_send_action_frame_data(value, targetApBssid, &channel,
+ &dwellTime, &buf, &bufLen);
+ if (eHAL_STATUS_SUCCESS != status)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: Failed to parse send action frame data", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ /* if the target bssid is different from currently associated AP,
+ then no need to send action frame */
+ if (VOS_TRUE != vos_mem_compare(targetApBssid,
+ pHddStaCtx->conn_info.bssId, sizeof(tSirMacAddr)))
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s:STA is not associated to this AP!",__func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ /* if the channel number is different from operating channel then
+ no need to send action frame */
+ if (channel != pHddStaCtx->conn_info.operationChannel)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: channel(%d) is different from operating channel(%d)",
+ __func__, channel, pHddStaCtx->conn_info.operationChannel);
+ ret = -EINVAL;
+ goto exit;
+ }
+ chan.center_freq = sme_ChnToFreq(channel);
+
+ finalLen = bufLen + 24;
+ finalBuf = vos_mem_malloc(finalLen);
+ if (NULL == finalBuf)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s:memory allocation failed",__func__);
+ ret = -ENOMEM;
+ goto exit;
+ }
+ vos_mem_zero(finalBuf, finalLen);
+
+ /* Fill subtype */
+ temp = SIR_MAC_MGMT_ACTION << 4;
+ vos_mem_copy(finalBuf + 0, &temp, sizeof(temp));
+
+ /* Fill type */
+ temp = SIR_MAC_MGMT_FRAME;
+ vos_mem_copy(finalBuf + 2, &temp, sizeof(temp));
+
+ /* Fill destination address (bssid of the AP) */
+ vos_mem_copy(finalBuf + 4, targetApBssid, sizeof(targetApBssid));
+
+ /* Fill BSSID (STA mac address) */
+ vos_mem_copy(finalBuf + 10, pAdapter->macAddressCurrent.bytes, sizeof(pAdapter->macAddressCurrent.bytes));
+
+ /* Fill source address (STA mac address) */
+ vos_mem_copy(finalBuf + 16, pAdapter->macAddressCurrent.bytes, sizeof(pAdapter->macAddressCurrent.bytes));
+
+ /* Fill received buffer from 24th address */
+ vos_mem_copy(finalBuf + 24, buf, bufLen);
+
+ wlan_hdd_action( NULL, dev, &chan, 0, NL80211_CHAN_HT20,
+ 1, dwellTime, finalBuf, finalLen, 1,
+ 1, &cookie );
+ vos_mem_free(finalBuf);
+ }
else if (strncmp(command, "GETROAMSCANCHANNELMINTIME", 25) == 0)
{
tANI_U16 val = sme_getNeighborScanMinChanTime((tHalHandle)(pHddCtx->hHal));
@@ -1175,13 +1269,50 @@
ret = -EINVAL;
goto exit;
}
-
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: Received Command to change intra band = %d", __func__, val);
pHddCtx->cfg_ini->nRoamIntraBand = val;
sme_setRoamIntraBand((tHalHandle)(pHddCtx->hHal), val);
}
+ else if (strncmp(command, "SETWESMODE", 10) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_BOOLEAN wesMode = CFG_ENABLE_WES_MODE_NAME_DEFAULT;
+
+ /* Move pointer to ahead of SETWESMODE<delimiter> */
+ value = value + 11;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &wesMode);
+ 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__,
+ CFG_ENABLE_WES_MODE_NAME_MIN,
+ CFG_ENABLE_WES_MODE_NAME_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((wesMode < CFG_ENABLE_WES_MODE_NAME_MIN) ||
+ (wesMode > CFG_ENABLE_WES_MODE_NAME_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "WES Mode value %d is out of range"
+ " (Min: %d Max: %d)", wesMode,
+ CFG_ENABLE_WES_MODE_NAME_MIN,
+ CFG_ENABLE_WES_MODE_NAME_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to Set WES Mode rssi diff = %d", __func__, wesMode);
+
+ pHddCtx->cfg_ini->isWESModeEnabled = wesMode;
+ sme_UpdateWESMode((tHalHandle)(pHddCtx->hHal), wesMode);
+ }
else if (strncmp(command, "GETROAMINTRABAND", 16) == 0)
{
tANI_U16 val = sme_getRoamIntraBand((tHalHandle)(pHddCtx->hHal));
@@ -1198,7 +1329,21 @@
goto exit;
}
}
+ else if (strncmp(priv_data.buf, "GETWESMODE", 10) == 0)
+ {
+ tANI_BOOLEAN wesMode = sme_GetWESMode((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+ len = snprintf(extra, sizeof(extra), "%s %d", command, wesMode);
+ 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;
+ }
+ }
#endif
#ifdef FEATURE_WLAN_LFR
else if (strncmp(command, "SETFASTROAM", 11) == 0)
@@ -1303,7 +1448,6 @@
ret = -EINVAL;
goto exit;
}
-
if ((ccxMode < CFG_CCX_FEATURE_ENABLED_MIN) ||
(ccxMode > CFG_CCX_FEATURE_ENABLED_MAX))
{
@@ -1315,7 +1459,6 @@
ret = -EINVAL;
goto exit;
}
-
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: Received Command to change ccx mode = %d", __func__, ccxMode);
@@ -1323,6 +1466,38 @@
sme_UpdateIsCcxFeatureEnabled((tHalHandle)(pHddCtx->hHal), ccxMode);
}
#endif
+ else if (strncmp(command, "SETROAMSCANCONTROL", 18) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_BOOLEAN roamScanControl = 0;
+
+ /* Move pointer to ahead of SETROAMSCANCONTROL<delimiter> */
+ value = value + 19;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &roamScanControl);
+ 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 ", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if (0 != roamScanControl)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "roam scan control invalid value = %d",
+ roamScanControl);
+ ret = -EINVAL;
+ goto exit;
+ }
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to Set roam scan control = %d", __func__, roamScanControl);
+
+ sme_SetRoamScanControl((tHalHandle)(pHddCtx->hHal), roamScanControl);
+ }
#ifdef FEATURE_WLAN_OKC
else if (strncmp(command, "SETOKCMODE", 10) == 0)
{
@@ -1362,6 +1537,21 @@
pHddCtx->cfg_ini->isOkcIniFeatureEnabled = okcMode;
}
+ else if (strncmp(priv_data.buf, "GETROAMSCANCONTROL", 18) == 0)
+ {
+ tANI_BOOLEAN roamScanControl = sme_GetRoamScanControl((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = snprintf(extra, sizeof(extra), "%s %d", command, roamScanControl);
+ 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;
+ }
+ }
#endif
else {
hddLog( VOS_TRACE_LEVEL_WARN, "%s: Unsupported GUI command %s",
@@ -1405,6 +1595,151 @@
/**---------------------------------------------------------------------------
+ \brief hdd_parse_send_action_frame_data() - HDD Parse send action frame data
+
+ This function parses the send action frame data passed in the format
+ SENDACTIONFRAME<space><bssid><space><channel><space><dwelltime><space><data>
+
+ \param - pValue Pointer to input country code revision
+ \param - pTargetApBssid Pointer to target Ap bssid
+ \param - pChannel Pointer to the Target AP channel
+ \param - pDwellTime Pointer to the time to stay off-channel after transmitting action frame
+ \param - pBuf Pointer to data
+ \param - pBufLen Pointer to data length
+
+ \return - 0 for success non-zero for failure
+
+ --------------------------------------------------------------------------*/
+VOS_STATUS hdd_parse_send_action_frame_data(tANI_U8 *pValue, tANI_U8 *pTargetApBssid, tANI_U8 *pChannel,
+ tANI_U8 *pDwellTime, tANI_U8 **pBuf, tANI_U8 *pBufLen)
+{
+ tANI_U8 *inPtr = pValue;
+ tANI_U8 *dataEnd;
+ int tempInt;
+ int j = 0;
+ int i = 0;
+ int v = 0;
+ tANI_U8 tempBuf[32];
+ 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;
+ }
+
+ /*getting the first argument ie the target AP bssid */
+ if (inPtr[2] != ':' || inPtr[5] != ':' || inPtr[8] != ':' || inPtr[11] != ':' || inPtr[14] != ':')
+ {
+ return -EINVAL;
+ }
+ j = sscanf(inPtr, "%2x:%2x:%2x:%2x:%2x:%2x", (unsigned int *)&pTargetApBssid[0], (unsigned int *)&pTargetApBssid[1],
+ (unsigned int *)&pTargetApBssid[2], (unsigned int *)&pTargetApBssid[3],
+ (unsigned int *)&pTargetApBssid[4], (unsigned int *)&pTargetApBssid[5]);
+
+ /* point to the next argument */
+ inPtr = strnchr(inPtr, strlen(inPtr), SPACE_ASCII_VALUE);
+ /*no argument after the command*/
+ if (NULL == inPtr) return -EINVAL;
+
+ /*removing empty spaces*/
+ while ((SPACE_ASCII_VALUE == *inPtr) && ('\0' != *inPtr) ) inPtr++;
+
+ /*no argument followed by spaces*/
+ if ('\0' == *inPtr)
+ {
+ return -EINVAL;
+ }
+
+ /*getting the next argument ie the channel number */
+ j = sscanf(inPtr, "%s ", tempBuf);
+ v = kstrtos32(tempBuf, 10, &tempInt);
+ if ( v < 0) return -EINVAL;
+
+ *pChannel = tempInt;
+
+ /* point to the next argument */
+ inPtr = strnchr(inPtr, strlen(inPtr), SPACE_ASCII_VALUE);
+ /*no argument after the command*/
+ if (NULL == inPtr) return -EINVAL;
+ /*removing empty spaces*/
+ while ((SPACE_ASCII_VALUE == *inPtr) && ('\0' != *inPtr) ) inPtr++;
+
+ /*no argument followed by spaces*/
+ if ('\0' == *inPtr)
+ {
+ return -EINVAL;
+ }
+
+ /*getting the next argument ie the dwell time */
+ j = sscanf(inPtr, "%s ", tempBuf);
+ v = kstrtos32(tempBuf, 10, &tempInt);
+ if ( v < 0) return -EINVAL;
+
+ *pDwellTime = tempInt;
+
+ /* point to the next argument */
+ inPtr = strnchr(inPtr, strlen(inPtr), SPACE_ASCII_VALUE);
+ /*no argument after the command*/
+ if (NULL == 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++;
+ ++(*pBufLen);
+ }
+ if ( *pBufLen <= 0) return -EINVAL;
+
+ *pBuf = vos_mem_malloc(sizeof(*pBufLen));
+ if (NULL == *pBuf)
+ {
+ hddLog(VOS_TRACE_LEVEL_FATAL,
+ "%s: vos_mem_alloc failed ", __func__);
+ return -EINVAL;
+ }
+
+ /* 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 < *pBufLen; j += 2)
+ {
+ tempByte = (hdd_parse_hex(inPtr[j]) << 4) | (hdd_parse_hex(inPtr[j + 1]));
+ (*pBuf)[i++] = tempByte;
+ }
+ *pBufLen = i;
+ return VOS_STATUS_SUCCESS;
+}
+
+#endif
+/**---------------------------------------------------------------------------
+
\brief hdd_parse_countryrev() - HDD Parse country code revision
This function parses the country code revision passed in the format
@@ -1600,7 +1935,6 @@
return VOS_STATUS_SUCCESS;
}
-#endif
/**---------------------------------------------------------------------------
\brief hdd_open() - HDD Open function
diff --git a/CORE/HDD/src/wlan_hdd_wowl.c b/CORE/HDD/src/wlan_hdd_wowl.c
index 101bd18..e783033 100644
--- a/CORE/HDD/src/wlan_hdd_wowl.c
+++ b/CORE/HDD/src/wlan_hdd_wowl.c
@@ -71,7 +71,7 @@
char *g_hdd_wowl_ptrns[WOWL_MAX_PTRNS_ALLOWED]; //Patterns 0-7
-static int parse_hex(unsigned char c)
+int hdd_parse_hex(unsigned char c)
{
if (c >= '0' && c <= '9')
return c-'0';
@@ -190,11 +190,11 @@
// Extract the pattern size
localPattern.ucPatternSize =
- ( parse_hex( ptrn[0] ) * 0x10 ) + parse_hex( ptrn[1] );
+ ( hdd_parse_hex( ptrn[0] ) * 0x10 ) + hdd_parse_hex( ptrn[1] );
// Extract the pattern mask size
localPattern.ucPatternMaskSize =
- ( parse_hex( ptrn[3] ) * 0x10 ) + parse_hex( ptrn[4] );
+ ( hdd_parse_hex( ptrn[3] ) * 0x10 ) + hdd_parse_hex( ptrn[4] );
if(localPattern.ucPatternSize > WOWL_PTRN_MAX_SIZE ||
localPattern.ucPatternMaskSize > WOWL_PTRN_MASK_MAX_SIZE)
@@ -234,7 +234,7 @@
for(i=0; i < localPattern.ucPatternSize; i++)
{
localPattern.ucPattern[i] =
- (parse_hex( ptrn[0] ) * 0x10 ) + parse_hex( ptrn[1] );
+ (hdd_parse_hex( ptrn[0] ) * 0x10 ) + hdd_parse_hex( ptrn[1] );
ptrn += 2; //skip to next byte
}
@@ -244,7 +244,7 @@
for(i=0; i < localPattern.ucPatternMaskSize; i++)
{
localPattern.ucPatternMask[i] =
- (parse_hex( ptrn[0] ) * 0x10 ) + parse_hex( ptrn[1] );
+ (hdd_parse_hex( ptrn[0] ) * 0x10 ) + hdd_parse_hex( ptrn[1] );
ptrn += 2; //skip to next byte
}
diff --git a/CORE/MAC/inc/sirMacProtDef.h b/CORE/MAC/inc/sirMacProtDef.h
index 68121e5..7463076 100644
--- a/CORE/MAC/inc/sirMacProtDef.h
+++ b/CORE/MAC/inc/sirMacProtDef.h
@@ -629,6 +629,9 @@
#define SIR_MAC_CLEAR_CAPABILITY(u16value, bitname) \
((u16value) &= (~(SIR_MAC_SET_##bitname(0))))
+#define IS_WES_MODE_ENABLED(x) \
+ ((x)->roam.configParam.isWESModeEnabled)
+
/// Status Code (present in Management response frames) enum
typedef enum eSirMacStatusCodes
@@ -2328,6 +2331,14 @@
tANI_U8 actionID;
} __ani_attr_packed tSirMacActionFrameHdr, *tpSirMacActionFrameHdr;
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+typedef __ani_attr_pre_packed struct sSirMacVendorSpecificFrameHdr
+{
+ tANI_U8 category;
+ tANI_U8 Oui[4];
+} __ani_attr_packed tSirMacVendorSpecificFrameHdr, *tpSirMacVendorSpecificFrameHdr;
+#endif
+
typedef __ani_attr_pre_packed struct sSirMacVendorSpecificPublicActionFrameHdr
{
tANI_U8 category;
diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
index da02800..959d30f 100644
--- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
@@ -2071,6 +2071,44 @@
}
break;
#endif
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+ case SIR_MAC_ACTION_VENDOR_SPECIFIC_CATEGORY:
+ {
+ tpSirMacVendorSpecificFrameHdr pVendorSpecific = (tpSirMacVendorSpecificFrameHdr) pActionHdr;
+ tpSirMacMgmtHdr pHdr;
+ tANI_U32 frameLen;
+ tANI_U8 Oui[] = { 0x00, 0x00, 0xf0 };
+
+ pHdr = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
+ frameLen = WDA_GET_RX_PAYLOAD_LEN(pRxPacketInfo);
+
+ //Check if it is a vendor specific action frame.
+ if ((eLIM_STA_ROLE == psessionEntry->limSystemRole) &&
+ (VOS_TRUE == palEqualMemory(pMac->hHdd, psessionEntry->selfMacAddr,
+ &pHdr->da[0], sizeof(tSirMacAddr))) &&
+ IS_WES_MODE_ENABLED(pMac) && palEqualMemory( pMac->hHdd, pVendorSpecific->Oui, Oui, 3))
+ {
+ PELOGE( limLog( pMac, LOGW, FL("Received Vendor specific action frame, OUI %x %x %x"),
+ pVendorSpecific->Oui[0], pVendorSpecific->Oui[1], pVendorSpecific->Oui[2]);)
+ /* Forward to the SME to HDD to wpa_supplicant */
+ // type is ACTION
+ limSendSmeMgmtFrameInd(pMac, pHdr->fc.subType,
+ (tANI_U8*)pHdr, frameLen + sizeof(tSirMacMgmtHdr), 0,
+ WDA_GET_RX_CH( pRxPacketInfo ), psessionEntry, 0);
+ }
+ else
+ {
+ limLog( pMac, LOGE, FL("Dropping the vendor specific action frame because of( "
+ "WES Mode not enabled (WESMODE = %d) or OUI mismatch (%02x %02x %02x) or "
+ "not received with SelfSta Mac address) system role = %d"),
+ IS_WES_MODE_ENABLED(pMac),
+ pVendorSpecific->Oui[0], pVendorSpecific->Oui[1],
+ pVendorSpecific->Oui[2],
+ psessionEntry->limSystemRole );
+ }
+ }
+ break;
+#endif
case SIR_MAC_ACTION_PUBLIC_USAGE:
switch(pActionHdr->actionID) {
case SIR_MAC_ACTION_VENDOR_SPECIFIC:
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index ae3e622..33a1de5 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1040,9 +1040,10 @@
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
- tANI_U8 isFastTransitionEnabled;
- tANI_U8 RoamRssiDiff;
- tANI_U8 nImmediateRoamRssiDiff;
+ tANI_U8 isFastTransitionEnabled;
+ tANI_U8 RoamRssiDiff;
+ tANI_U8 nImmediateRoamRssiDiff;
+ tANI_BOOLEAN isWESModeEnabled;
#endif
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index 92e0308..bc4631d 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -599,11 +599,13 @@
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
- tANI_U8 isFastTransitionEnabled;
- tANI_U8 RoamRssiDiff;
- tANI_U8 nImmediateRoamRssiDiff;
- tANI_BOOLEAN nRoamPrefer5GHz;
- tANI_BOOLEAN nRoamIntraBand;
+ tANI_U8 isFastTransitionEnabled;
+ tANI_U8 RoamRssiDiff;
+ tANI_U8 nImmediateRoamRssiDiff;
+ tANI_BOOLEAN nRoamPrefer5GHz;
+ tANI_BOOLEAN nRoamIntraBand;
+ tANI_BOOLEAN isWESModeEnabled;
+ tANI_BOOLEAN nRoamScanControl;
#endif
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
@@ -959,7 +961,8 @@
tANI_U8 isCcxIniFeatureEnabled;
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
- tANI_U8 RoamRssiDiff;
+ tANI_U8 RoamRssiDiff;
+ tANI_BOOLEAN isWESModeEnabled;
#endif
}tCsrRoamStruct;
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index dab7fa7..1f5cb5f 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -246,8 +246,6 @@
int* pMergedOutputNumOfChannels
);
-
-
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
#endif /* CSR_NEIGHBOR_ROAM_H */
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index 86b5f81..f242851 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -308,9 +308,10 @@
#endif /* FEATURE_WLAN_TDLS */
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
-eHalStatus csrFlushAndCreateBgScanRoamChannelList(tpAniSirGlobal pMac,
- const tANI_U8 *pChannelList,
- const tANI_U8 numChannels);
+eHalStatus csrFlushBgScanRoamChannelList(tpAniSirGlobal pMac);
+eHalStatus csrCreateBgScanRoamChannelList(tpAniSirGlobal pMac,
+ const tANI_U8 *pChannelList,
+ const tANI_U8 numChannels);
eHalStatus csrUpdateBgScanConfigIniChannelList(tpAniSirGlobal pMac, eCsrBand eBand);
eHalStatus csrInitCountryValidChannelList(tpAniSirGlobal pMac, tANI_U8 revision);
void csr_SetRevision(tpAniSirGlobal pMac, tANI_U8 revision);
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 3233c8d..ffc7d38 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -111,8 +111,9 @@
tP2PConfigParam p2pConfig;
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
- tANI_U8 isFastTransitionEnabled;
- tANI_U8 RoamRssiDiff;
+ tANI_U8 isFastTransitionEnabled;
+ tANI_U8 RoamRssiDiff;
+ tANI_BOOLEAN isWESModeEnabled;
#endif
} tSmeConfigParams, *tpSmeConfigParams;
@@ -2309,6 +2310,29 @@
eHalStatus sme_UpdateFastTransitionEnabled(tHalHandle hHal,
v_BOOL_t isFastTransitionEnabled);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateWESMode
+ \brief Update WESMode
+ This function is called through dynamic setConfig callback function
+ to configure isWESModeEnabled
+ \param hHal - HAL handle for device
+ \param isWESModeEnabled - Enable/Disable WES Mode
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+eHalStatus sme_UpdateWESMode(tHalHandle hHal, v_BOOL_t isWESModeEnabled);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamScanControl
+ \brief Set roam scan control
+ This function is called to set roam scan control
+ if roam scan control is set to 0, roaming scan cache is cleared
+ any value other than 0 is treated as invalid value
+ \param hHal - HAL handle for device
+ \return eHAL_STATUS_SUCCESS - SME update config successfully.
+ Other status means SME failure to update
+ -------------------------------------------------------------------------*/
+eHalStatus sme_SetRoamScanControl(tHalHandle hHal, v_BOOL_t roamScanControl);
#endif /* (WLAN_FEATURE_VOWIFI_11R) || (FEATURE_WLAN_CCX) || (FEATURE_WLAN_LFR) */
#ifdef FEATURE_WLAN_LFR
@@ -2574,6 +2598,35 @@
tANI_BOOLEAN sme_getIsCcxFeatureEnabled(tHalHandle hHal);
/*--------------------------------------------------------------------------
+ \brief sme_getWESMode() - getWES Mode
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return v_U8_t - WES Mode Enabled(1)/Disabled(0)
+ \sa
+ --------------------------------------------------------------------------*/
+v_BOOL_t sme_GetWESMode(tHalHandle hHal);
+
+/*--------------------------------------------------------------------------
+ \brief sme_GetRoamScanControl() - get scan control
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return v_BOOL_t - Enabled(1)/Disabled(0)
+ \sa
+ --------------------------------------------------------------------------*/
+v_BOOL_t sme_GetRoamScanControl(tHalHandle hHal);
+
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateEmptyScanRefreshPeriod
+ \brief Update nnEmptyScanRefreshPeriod
+ This function is called through dynamic setConfig callback function
+ to configure nnEmptyScanRefreshPeriod
+ Usage: adb shell iwpriv wlan0 setConfig nEmptyScanRefreshPeriod=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nEmptyScanRefreshPeriod - scan period following empty scan results.
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------------
\brief sme_getIsLfrFeatureEnabled() - get LFR feature enabled or not
This is a synchronuous call
\param hHal - The handle returned by macOpen.
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 4fbcfc4..9538e8a 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -1030,12 +1030,9 @@
}
/*
- This function flushes the roam scan cache and creates fresh cache
- based on the input channel list
+ This function flushes the roam scan cache
*/
-eHalStatus csrFlushAndCreateBgScanRoamChannelList(tpAniSirGlobal pMac,
- const tANI_U8 *pChannelList,
- const tANI_U8 numChannels)
+eHalStatus csrFlushBgScanRoamChannelList(tpAniSirGlobal pMac)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
@@ -1045,7 +1042,24 @@
{
vos_mem_free(pNeighborRoamInfo->cfgParams.channelInfo.ChannelList);
pNeighborRoamInfo->cfgParams.channelInfo.ChannelList = NULL;
+ pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels = 0;
}
+ return status;
+}
+
+
+
+/*
+ This function flushes the roam scan cache and creates fresh cache
+ based on the input channel list
+*/
+eHalStatus csrCreateBgScanRoamChannelList(tpAniSirGlobal pMac,
+ const tANI_U8 *pChannelList,
+ const tANI_U8 numChannels)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+
pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels = numChannels;
pNeighborRoamInfo->cfgParams.channelInfo.ChannelList =
@@ -1103,7 +1117,8 @@
ChannelList[outNumChannels++] = inPtr[i];
}
}
- csrFlushAndCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
+ csrFlushBgScanRoamChannelList(pMac);
+ csrCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
}
else if (eCSR_BAND_5G == eBand)
{
@@ -1117,7 +1132,8 @@
ChannelList[outNumChannels++] = inPtr[i];
}
}
- csrFlushAndCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
+ csrFlushBgScanRoamChannelList(pMac);
+ csrCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
}
else if (eCSR_BAND_ALL == eBand)
{
@@ -1129,7 +1145,8 @@
ChannelList[outNumChannels++] = inPtr[i];
}
}
- csrFlushAndCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
+ csrFlushBgScanRoamChannelList(pMac);
+ csrCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
}
else
{
@@ -1523,6 +1540,7 @@
pMac->roam.configParam.nImmediateRoamRssiDiff );
pMac->roam.configParam.nRoamPrefer5GHz = pParam->nRoamPrefer5GHz;
pMac->roam.configParam.nRoamIntraBand = pParam->nRoamIntraBand;
+ pMac->roam.configParam.isWESModeEnabled = pParam->isWESModeEnabled;
#endif
#ifdef FEATURE_WLAN_LFR
pMac->roam.configParam.isFastRoamIniFeatureEnabled = pParam->isFastRoamIniFeatureEnabled;
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 43656a7..a5d883d 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -7046,6 +7046,77 @@
return status ;
}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateWESMode
+ \brief Update WES Mode
+ This function is called through dynamic setConfig callback function
+ to configure isWESModeEnabled
+ \param hHal - HAL handle for device
+ \return eHAL_STATUS_SUCCESS - SME update isWESModeEnabled config successfully.
+ Other status means SME is failed to update isWESModeEnabled.
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_UpdateWESMode(tHalHandle hHal, v_BOOL_t isWESModeEnabled)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set WES Mode to %d - old value is %d - roam state is %d",
+ isWESModeEnabled,
+ pMac->roam.configParam.isWESModeEnabled,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.isWESModeEnabled = isWESModeEnabled;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamScanControl
+ \brief Set roam scan control
+ This function is called to set roam scan control
+ if roam scan control is set to 0, roaming scan cache is cleared
+ any value other than 0 is treated as invalid value
+ \param hHal - HAL handle for device
+ \return eHAL_STATUS_SUCCESS - SME update config successfully.
+ Other status means SME failure to update
+ -------------------------------------------------------------------------*/
+eHalStatus sme_SetRoamScanControl(tHalHandle hHal, v_BOOL_t roamScanControl)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set roam scan control to %d - old value is %d - roam state is %d",
+ roamScanControl,
+ pMac->roam.configParam.nRoamScanControl,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.nRoamScanControl = roamScanControl;
+ if ( 0 == roamScanControl)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully cleared roam scan cache");
+ csrFlushBgScanRoamChannelList(pMac);
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ if (pMac->roam.configParam.isRoamOffloadScanEnabled)
+ {
+ csrRoamOffloadScan(pMac, ROAM_SCAN_OFFLOAD_UPDATE_CFG, REASON_FLUSH_CHANNEL_LIST);
+ }
+#endif
+ }
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+ return status ;
+}
#endif /* (WLAN_FEATURE_VOWIFI_11R) || (FEATURE_WLAN_CCX) || (FEATURE_WLAN_LFR) */
#ifdef FEATURE_WLAN_LFR
@@ -7519,7 +7590,7 @@
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
eHalStatus status = eHAL_STATUS_SUCCESS;
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
- tANI_U8 oldChannelList[128] = {0};
+ tANI_U8 oldChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN*2] = {0};
tANI_U8 newChannelList[128] = {0};
tANI_U8 i = 0, j = 0;
@@ -7534,23 +7605,28 @@
pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i]);
}
}
- csrFlushAndCreateBgScanRoamChannelList(pMac, pChannelList, numChannels);
+ csrFlushBgScanRoamChannelList(pMac);
+ csrCreateBgScanRoamChannelList(pMac, pChannelList, numChannels);
status = csrUpdateBgScanConfigIniChannelList(pMac, csrGetCurrentBand(hHal));
- if (NULL != pNeighborRoamInfo->cfgParams.channelInfo.ChannelList)
+ if ( HAL_STATUS_SUCCESS( status ))
{
- j = 0;
- for (i = 0; i < pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels; i++)
+ sme_SetRoamScanControl(hHal, 1);
+ if (NULL != pNeighborRoamInfo->cfgParams.channelInfo.ChannelList)
{
- j += snprintf(newChannelList + j, sizeof(newChannelList) - j," %d",
- pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i]);
+ j = 0;
+ for (i = 0; i < pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels; i++)
+ {
+ j += snprintf(newChannelList + j, sizeof(newChannelList) - j," %d",
+ pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i]);
+ }
}
- }
- VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
- "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
- newChannelList, oldChannelList,
- pMac->roam.neighborRoamInfo.neighborRoamState);
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
+ newChannelList, oldChannelList,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ }
sme_ReleaseGlobalLock( &pMac->sme );
}
@@ -7628,8 +7704,9 @@
{
VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_WARN,
"Roam Scan channel list is NOT yet initialized");
+ *pNumChannels = 0;
sme_ReleaseGlobalLock( &pMac->sme );
- return eHAL_STATUS_NOT_INITIALIZED;
+ return status;
}
*pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
@@ -7640,7 +7717,6 @@
pOutPtr[i] = '\0';
sme_ReleaseGlobalLock( &pMac->sme );
}
-
return status ;
}
@@ -7683,6 +7759,33 @@
}
/*--------------------------------------------------------------------------
+ \brief sme_GetWESMode() - get WES Mode
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return v_U8_t - WES Mode Enabled(1)/Disabled(0)
+ \sa
+ --------------------------------------------------------------------------*/
+v_BOOL_t sme_GetWESMode(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.isWESModeEnabled;
+}
+
+/*--------------------------------------------------------------------------
+ \brief sme_GetRoamScanControl() - get scan control
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return v_BOOL_t - Enabled(1)/Disabled(0)
+ \sa
+ --------------------------------------------------------------------------*/
+v_BOOL_t sme_GetRoamScanControl(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.nRoamScanControl;
+}
+#endif
+
+/*--------------------------------------------------------------------------
\brief sme_getIsLfrFeatureEnabled() - get LFR feature enabled or not
This is a synchronuous call
\param hHal - The handle returned by macOpen.
@@ -7718,7 +7821,6 @@
#endif
}
-#endif
/* ---------------------------------------------------------------------------
\fn sme_IsFeatureSupportedByFW