summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2015-03-31 02:40:39 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2015-03-31 02:40:39 -0700
commit803f6de6572051b0d19f147f42d4e2fdd07442c5 (patch)
tree56e132933069b17f7a55a7548106808e0cc21117
parenta8f09e2e4610e077b2adab699a88c11e1d0160bb (diff)
parent9f5b31619dc5cce5da2c05be5176c0653ea54c83 (diff)
Merge "Release 4.0.10.62 QCACLD WLAN Driver"
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c50
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c447
-rw-r--r--CORE/HDD/src/wlan_hdd_p2p.c5
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/inc/sirApi.h43
-rw-r--r--CORE/MAC/src/pe/lim/limSendSmeRspMessages.c28
-rw-r--r--CORE/SERVICES/HTC/htc.c10
-rw-r--r--CORE/SERVICES/WMA/wma.c223
-rw-r--r--CORE/SERVICES/WMA/wma.h1
-rw-r--r--CORE/SME/inc/csrApi.h6
-rw-r--r--CORE/SME/inc/csrInternal.h5
-rw-r--r--CORE/SME/inc/csrNeighborRoam.h5
-rw-r--r--CORE/SME/inc/sme_Api.h3
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c41
-rw-r--r--CORE/SME/src/csr/csrApiScan.c119
-rw-r--r--CORE/SME/src/csr/csrNeighborRoam.c61
-rw-r--r--CORE/SME/src/csr/csrUtil.c25
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c75
18 files changed, 998 insertions, 153 deletions
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 57568958c4df..c85838323b20 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -1286,6 +1286,12 @@ static void hdd_SendReAssocEvent(struct net_device *dev,
tANI_U32 rspRsnLength = 0;
struct ieee80211_channel *chan;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ uint8_t buf_ssid_ie[2 + SIR_MAC_SSID_EID_MAX]; /* 2 bytes for EID and len */
+ uint8_t *buf_ptr, ssid_ie_len;
+ struct cfg80211_bss *bss = NULL;
+ uint8_t *final_req_ie = NULL;
+ tCsrRoamConnectedProfile roam_profile;
+ tHalHandle hal_handle = WLAN_HDD_GET_HAL_CTX(pAdapter);
if (!rspRsnIe) {
hddLog(LOGE, FL("Unable to allocate RSN IE"));
@@ -1329,14 +1335,50 @@ static void hdd_SendReAssocEvent(struct net_device *dev,
chan = ieee80211_get_channel(pAdapter->wdev.wiphy,
(int)pCsrRoamInfo->pBssDesc->channelId);
- cfg80211_roamed(dev, chan, pCsrRoamInfo->bssid,
- reqRsnIe, reqRsnLength,
- rspRsnIe, rspRsnLength,GFP_KERNEL);
+ memset(&roam_profile, 0, sizeof(tCsrRoamConnectedProfile));
+ sme_RoamGetConnectProfile(hal_handle, pAdapter->sessionId, &roam_profile);
+ bss = cfg80211_get_bss(pAdapter->wdev.wiphy, chan, pCsrRoamInfo->bssid,
+ &roam_profile.SSID.ssId[0], roam_profile.SSID.length,
+ WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS);
+
+ if (bss == NULL)
+ hddLog(LOGE, FL("Get BSS returned NULL"));
+ buf_ptr = buf_ssid_ie;
+ *buf_ptr = SIR_MAC_SSID_EID;
+ buf_ptr++;
+ *buf_ptr = roam_profile.SSID.length; /*len of ssid*/
+ buf_ptr++;
+ vos_mem_copy(buf_ptr, &roam_profile.SSID.ssId[0],
+ roam_profile.SSID.length);
+ ssid_ie_len = 2 + roam_profile.SSID.length;
+ hddLog(LOG2, FL("SSIDIE:"));
+ VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_DEBUG,
+ buf_ssid_ie, ssid_ie_len);
+ final_req_ie = kmalloc(IW_GENERIC_IE_MAX, GFP_KERNEL);
+ if (final_req_ie == NULL)
+ goto done;
+ buf_ptr = final_req_ie;
+ vos_mem_copy(buf_ptr, buf_ssid_ie, ssid_ie_len);
+ buf_ptr += ssid_ie_len;
+ vos_mem_copy(buf_ptr, reqRsnIe, reqRsnLength);
+ memcpy(rspRsnIe, pFTAssocRsp, len);
+ memset(final_req_ie + (ssid_ie_len + reqRsnLength), 0,
+ IW_GENERIC_IE_MAX - (ssid_ie_len + reqRsnLength));
+ hddLog(LOG2, FL("Req RSN IE:"));
+ VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_DEBUG,
+ final_req_ie, (ssid_ie_len +reqRsnLength));
+ cfg80211_roamed_bss(dev, bss,
+ final_req_ie, (ssid_ie_len + reqRsnLength),
+ rspRsnIe, rspRsnLength, GFP_KERNEL);
+
wlan_hdd_send_roam_auth_event(pHddCtx, pCsrRoamInfo->bssid,
reqRsnIe, reqRsnLength, rspRsnIe,
rspRsnLength, pCsrRoamInfo);
done:
- kfree(rspRsnIe);
+ sme_RoamFreeConnectProfile(hal_handle, &roam_profile);
+ if (final_req_ie)
+ kfree(final_req_ie);
+ kfree(rspRsnIe);
}
void hdd_PerformRoamSetKeyComplete(hdd_adapter_t *pAdapter)
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 078aa5d94ca2..91babae7499f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -1476,6 +1476,283 @@ max_buffer_err:
return -EINVAL;
}
+static int
+wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data,
+ int data_len)
+{
+ struct net_device *dev = wdev->netdev;
+ hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
+ hdd_context_t *pHddCtx = wiphy_priv(wiphy);
+ uint8_t session_id;
+ struct roam_ext_params roam_params;
+ uint32_t cmd_type, req_id;
+ struct nlattr *curr_attr;
+ struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX + 1];
+ struct nlattr *tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX + 1];
+ int rem,i, buf_len;
+ uint8_t *buf;
+ if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX,
+ data, data_len,
+ NULL)) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Invalid ATTR"));
+ return -EINVAL;
+ }
+ /* Parse and fetch Command Type*/
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_SUBCMD]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("roam cmd type failed"));
+ goto fail;
+ }
+ session_id = pAdapter->sessionId;
+ vos_mem_set(&roam_params, sizeof(roam_params),0);
+ cmd_type = nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_ROAMING_SUBCMD]);
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_REQ_ID]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("attr request id failed"));
+ goto fail;
+ }
+ req_id = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_REQ_ID]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG, FL("Req Id (%d)"), req_id);
+ hddLog(VOS_TRACE_LEVEL_DEBUG, FL("Cmd Type (%d)"), cmd_type);
+ switch(cmd_type) {
+ case QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_SSID_WHITE_LIST:
+ /* Parse and fetch number of allowed ssid */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID_NUM_NETWORKS]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("attr num of allowed ssid failed"));
+ goto fail;
+ }
+ roam_params.num_ssid_allowed_list = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID_NUM_NETWORKS]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("Num of Allowed SSID (%d)"),
+ roam_params.num_ssid_allowed_list);
+ i = 0;
+ nla_for_each_nested(curr_attr,
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID_LIST],
+ rem) {
+ if (nla_parse(tb2,
+ QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_MAX,
+ nla_data(curr_attr), nla_len(curr_attr),
+ NULL)) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("nla_parse failed"));
+ goto fail;
+ }
+ /* Parse and Fetch allowed SSID list*/
+ if (!tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("attr allowed ssid failed"));
+ goto fail;
+ }
+ buf = nla_data(tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID]);
+ buf_len = nla_len(tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID]);
+ nla_strlcpy(roam_params.ssid_allowed_list[i].ssId,
+ tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID],
+ buf_len);
+ roam_params.ssid_allowed_list[i].length =
+ buf_len - 1;
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("SSID[%d]: %s,length = %d"), i,
+ roam_params.ssid_allowed_list[i].ssId,
+ roam_params.ssid_allowed_list[i].length);
+ i++;
+ }
+ sme_update_roam_params(pHddCtx->hHal, session_id,
+ roam_params, REASON_ROAM_SET_SSID_ALLOWED);
+ break;
+ case QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_SET_EXTSCAN_ROAM_PARAMS:
+ /* Parse and fetch 5G Boost Threshold */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_BOOST_THRESHOLD]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("5G boost threshold failed"));
+ goto fail;
+ }
+ roam_params.raise_rssi_thresh_5g = nla_get_s32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_BOOST_THRESHOLD]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("5G Boost Threshold (%d)"),
+ roam_params.raise_rssi_thresh_5g);
+ /* Parse and fetch 5G Penalty Threshold */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_PENALTY_THRESHOLD]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("5G penalty threshold failed"));
+ goto fail;
+ }
+ roam_params.drop_rssi_thresh_5g = nla_get_s32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_PENALTY_THRESHOLD]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("5G Penalty Threshold (%d)"),
+ roam_params.drop_rssi_thresh_5g);
+ /* Parse and fetch 5G Boost Factor */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_BOOST_FACTOR]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("5G boost Factor failed"));
+ goto fail;
+ }
+ roam_params.raise_factor_5g = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_BOOST_FACTOR]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG, FL("5G Boost Factor (%d)"),
+ roam_params.raise_factor_5g);
+ /* Parse and fetch 5G Penalty factor */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_PENALTY_FACTOR]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("5G Penalty Factor failed"));
+ goto fail;
+ }
+ roam_params.drop_factor_5g = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_PENALTY_FACTOR]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("5G Penalty factor (%d)"),
+ roam_params.drop_factor_5g);
+ /* Parse and fetch 5G Max Boost */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_MAX_BOOST]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("5G Max Boost failed"));
+ goto fail;
+ }
+ roam_params.max_raise_rssi_5g = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_A_BAND_MAX_BOOST]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG, FL("5G Max Boost (%d)"),
+ roam_params.max_raise_rssi_5g);
+ /* Parse and fetch Rssi Diff */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_LAZY_ROAM_HISTERESYS]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("Rssi Diff failed"));
+ goto fail;
+ }
+ roam_params.rssi_diff = nla_get_s32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_LAZY_ROAM_HISTERESYS]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG, FL("RSSI Diff (%d)"),
+ roam_params.rssi_diff);
+ /* Parse and fetch Good Rssi Threshold */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_ALERT_ROAM_RSSI_TRIGGER]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("Good Rssi Threshold failed"));
+ goto fail;
+ }
+ roam_params.good_rssi_threshold = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_ALERT_ROAM_RSSI_TRIGGER]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("Good RSSI Threshold (%d)"),
+ roam_params.good_rssi_threshold);
+ sme_update_roam_params(pHddCtx->hHal, session_id,
+ roam_params,
+ REASON_ROAM_EXT_SCAN_PARAMS_CHANGED);
+ break;
+ case QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_SET_LAZY_ROAM:
+ /* Parse and fetch Activate Good Rssi Roam */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_LAZY_ROAM_ENABLE]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("Activate Good Rssi Roam failed"));
+ goto fail;
+ }
+ roam_params.good_rssi_roam = nla_get_s32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_LAZY_ROAM_ENABLE]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("Activate Good Rssi Roam (%d)"),
+ roam_params.good_rssi_roam);
+ sme_update_roam_params(pHddCtx->hHal, session_id,
+ roam_params, REASON_ROAM_GOOD_RSSI_CHANGED);
+ break;
+ case QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_SET_BSSID_PREFS:
+ /* Parse and fetch number of preferred BSSID */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_LAZY_ROAM_NUM_BSSID]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("attr num of preferred bssid failed"));
+ goto fail;
+ }
+ roam_params.num_bssid_favored = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_LAZY_ROAM_NUM_BSSID]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("Num of Preferred BSSID (%d)"),
+ roam_params.num_bssid_favored);
+ i = 0;
+ nla_for_each_nested(curr_attr,
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PREFS],
+ rem) {
+ if (nla_parse(tb2,
+ QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX,
+ nla_data(curr_attr), nla_len(curr_attr),
+ NULL)) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("nla_parse failed"));
+ goto fail;
+ }
+ /* Parse and fetch MAC address */
+ if (!tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_LAZY_ROAM_BSSID]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("attr mac address failed"));
+ goto fail;
+ }
+ nla_memcpy(roam_params.bssid_favored[i],
+ tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_LAZY_ROAM_BSSID],
+ sizeof(tSirMacAddr));
+ hddLog(VOS_TRACE_LEVEL_DEBUG, MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(roam_params.bssid_favored[i]));
+ /* Parse and fetch preference factor*/
+ if (!tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_LAZY_ROAM_RSSI_MODIFIER]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("BSSID Preference score failed"));
+ goto fail;
+ }
+ roam_params.bssid_favored_factor[i] = nla_get_u32(
+ tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_LAZY_ROAM_RSSI_MODIFIER]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("BSSID Preference score (%d)"),
+ roam_params.bssid_favored_factor[i]);
+ i++;
+ }
+ sme_update_roam_params(pHddCtx->hHal, session_id,
+ roam_params, REASON_ROAM_SET_FAVORED_BSSID);
+ break;
+ case QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_SET_BLACKLIST_BSSID:
+ /* Parse and fetch number of blacklist BSSID */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS_NUM_BSSID]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("attr num of blacklist bssid failed"));
+ goto fail;
+ }
+ roam_params.num_bssid_avoid_list = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS_NUM_BSSID]);
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("Num of blacklist BSSID (%d)"),
+ roam_params.num_bssid_avoid_list);
+ i = 0;
+ nla_for_each_nested(curr_attr,
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS],
+ rem) {
+ if (nla_parse(tb2,
+ QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX,
+ nla_data(curr_attr), nla_len(curr_attr),
+ NULL)) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("nla_parse failed"));
+ goto fail;
+ }
+ /* Parse and fetch MAC address */
+ if (!tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS_BSSID]) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("attr blacklist addr failed"));
+ goto fail;
+ }
+ nla_memcpy(roam_params.bssid_avoid_list[i],
+ tb2[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_SET_BSSID_PARAMS_BSSID],
+ sizeof(tSirMacAddr));
+ hddLog(VOS_TRACE_LEVEL_DEBUG, MAC_ADDRESS_STR,
+ MAC_ADDR_ARRAY(
+ roam_params.bssid_avoid_list[i]));
+ i++;
+ }
+ sme_update_roam_params(pHddCtx->hHal, session_id,
+ roam_params, REASON_ROAM_SET_BLACKLIST_BSSID);
+ break;
+ }
+ return 0;
+fail:
+ return -EINVAL;
+}
#ifdef WLAN_FEATURE_STATS_EXT
static int wlan_hdd_cfg80211_stats_ext_request(struct wiphy *wiphy,
@@ -5923,6 +6200,13 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] =
WIPHY_VENDOR_CMD_NEED_RUNNING,
.doit = (void *)wlan_hdd_cfg80211_wifi_configuration_set
},
+ {
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
+ .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAM,
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
+ WIPHY_VENDOR_CMD_NEED_NETDEV,
+ .doit = (void *)wlan_hdd_cfg80211_set_ext_roam_params
+ },
};
@@ -16490,85 +16774,112 @@ int wlan_hdd_cfg80211_set_ap_channel_width(struct wiphy *wiphy,
#endif
#ifdef FEATURE_WLAN_EXTSCAN
-
+/**
+ * wlan_hdd_cfg80211_extscan_get_capabilities_ind() - get capabilities ind
+ * @ctx: hdd global context
+ * @data: capabilities data
+ *
+ * Return: none
+ */
static void
wlan_hdd_cfg80211_extscan_get_capabilities_ind(void *ctx,
- tpSirExtScanCapabilitiesEvent pData)
+ tpSirExtScanCapabilitiesEvent data)
{
- hdd_context_t *pHddCtx = (hdd_context_t *)ctx;
- struct sk_buff *skb = NULL;
-
- ENTER();
+ hdd_context_t *pHddCtx = (hdd_context_t *)ctx;
+ struct sk_buff *skb = NULL;
- if (wlan_hdd_validate_context(pHddCtx) || !pData) {
- hddLog(VOS_TRACE_LEVEL_ERROR, FL("HDD context is not valid "
- "or pData(%p) is null"), pData);
- return;
- }
+ ENTER();
- skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
- NULL,
- EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
- QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CAPABILITIES_INDEX,
- GFP_KERNEL);
+ if (wlan_hdd_validate_context(pHddCtx) || !data) {
+ hddLog(LOGE, FL("HDD context is invalid or data(%p) is null"),
+ data);
+ return;
+ }
- if (!skb) {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("cfg80211_vendor_event_alloc failed"));
- return;
- }
+ skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy,
+ NULL,
+ EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
+ QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_GET_CAPABILITIES_INDEX,
+ GFP_KERNEL);
- hddLog(LOG1, "Req Id (%u)", pData->requestId);
- hddLog(LOG1, "Scan cache size (%u)", pData->max_scan_cache_size);
- hddLog(LOG1, "Scan buckets (%u)", pData->max_scan_buckets);
- hddLog(LOG1, "Max AP per scan (%u)", pData->max_ap_cache_per_scan);
- hddLog(LOG1, "max_rssi_sample_size (%u)",
- pData->max_rssi_sample_size);
- hddLog(LOG1, "max_scan_reporting_threshold (%u)",
- pData->max_scan_reporting_threshold);
- hddLog(LOG1, "max_hotlist_aps (%u)", pData->max_hotlist_aps);
- hddLog(LOG1, "max_significant_wifi_change_aps (%u)",
- pData->max_significant_wifi_change_aps);
- hddLog(LOG1, "max_bssid_history_entries (%u)",
- pData->max_bssid_history_entries);
+ if (!skb) {
+ hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
+ return;
+ }
- if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_REQUEST_ID,
- pData->requestId) ||
- nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_STATUS, pData->status) ||
- nla_put_u32(skb,
- QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_SCAN_CACHE_SIZE,
- pData->max_scan_cache_size) ||
- nla_put_u32(skb,
- QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_SCAN_BUCKETS,
- pData->max_scan_buckets) ||
- nla_put_u32(skb,
- QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_AP_CACHE_PER_SCAN,
- pData->max_ap_cache_per_scan) ||
- nla_put_u32(skb,
- QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_RSSI_SAMPLE_SIZE,
- pData->max_rssi_sample_size) ||
- nla_put_u32(skb,
- QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_SCAN_REPORTING_THRESHOLD,
- pData->max_scan_reporting_threshold) ||
- nla_put_u32(skb,
- QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_HOTLIST_BSSIDS,
- pData->max_hotlist_aps) ||
- nla_put_u32(skb,
- QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_SIGNIFICANT_WIFI_CHANGE_APS,
- pData->max_significant_wifi_change_aps) ||
- nla_put_u32(skb,
- QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_BSSID_HISTORY_ENTRIES,
- pData->max_bssid_history_entries)) {
- hddLog(VOS_TRACE_LEVEL_ERROR, FL("nla put fail"));
- goto nla_put_failure;
- }
+ hddLog(LOG1, "Req Id (%u)", data->requestId);
+ hddLog(LOG1, "Scan cache size (%u)", data->max_scan_cache_size);
+ hddLog(LOG1, "Scan buckets (%u)", data->max_scan_buckets);
+ hddLog(LOG1, "Max AP per scan (%u)", data->max_ap_cache_per_scan);
+ hddLog(LOG1, "max_rssi_sample_size (%u)",
+ data->max_rssi_sample_size);
+ hddLog(LOG1, "max_scan_reporting_threshold (%u)",
+ data->max_scan_reporting_threshold);
+ hddLog(LOG1, "max_hotlist_bssids (%u)", data->max_hotlist_bssids);
+ hddLog(LOG1, "max_significant_wifi_change_aps (%u)",
+ data->max_significant_wifi_change_aps);
+ hddLog(LOG1, "max_bssid_history_entries (%u)",
+ data->max_bssid_history_entries);
+ hddLog(LOG1, "max_hotlist_ssids (%u)", data->max_hotlist_ssids);
+ hddLog(LOG1, "max_number_epno_networks (%u)",
+ data->max_number_epno_networks);
+ hddLog(LOG1, "max_number_epno_networks_by_ssid (%u)",
+ data->max_number_epno_networks_by_ssid);
+ hddLog(LOG1, "max_number_of_white_listed_ssid (%u)",
+ data->max_number_of_white_listed_ssid);
+
+ if (nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_REQUEST_ID,
+ data->requestId) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_STATUS,
+ data->status) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_SCAN_CACHE_SIZE,
+ data->max_scan_cache_size) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_SCAN_BUCKETS,
+ data->max_scan_buckets) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_AP_CACHE_PER_SCAN,
+ data->max_ap_cache_per_scan) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_RSSI_SAMPLE_SIZE,
+ data->max_rssi_sample_size) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_SCAN_REPORTING_THRESHOLD,
+ data->max_scan_reporting_threshold) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_HOTLIST_BSSIDS,
+ data->max_hotlist_bssids) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_SIGNIFICANT_WIFI_CHANGE_APS,
+ data->max_significant_wifi_change_aps) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_BSSID_HISTORY_ENTRIES,
+ data->max_bssid_history_entries) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_HOTLIST_SSIDS,
+ data->max_hotlist_ssids) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_NUM_EPNO_NETS,
+ data->max_number_epno_networks) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_NUM_EPNO_NETS_BY_SSID,
+ data->max_number_epno_networks_by_ssid) ||
+ nla_put_u32(skb,
+ QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_CAPABILITIES_MAX_NUM_WHITELISTED_SSID,
+ data->max_number_of_white_listed_ssid)) {
+ hddLog(LOGE, FL("nla put fail"));
+ goto nla_put_failure;
+ }
- cfg80211_vendor_event(skb, GFP_KERNEL);
- return;
+ cfg80211_vendor_event(skb, GFP_KERNEL);
+ return;
nla_put_failure:
- kfree_skb(skb);
- return;
+ kfree_skb(skb);
+ return;
}
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index dce1b00c4bd5..ded3f8c2fc5b 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -473,12 +473,13 @@ void wlan_hdd_cleanup_remain_on_channel_ctx(hdd_adapter_t *pAdapter)
pAdapter->is_roc_inprogress = FALSE;
}
mutex_unlock(&cfgState->remain_on_chan_ctx_lock);
-
}
+ /* hold the lock before break from the loop */
+ mutex_lock(&cfgState->remain_on_chan_ctx_lock);
break;
}
mutex_lock(&cfgState->remain_on_chan_ctx_lock);
- }
+ } /* end of while */
mutex_unlock(&cfgState->remain_on_chan_ctx_lock);
}
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index 1d60a6cb29be..91aa353cb4df 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -42,9 +42,9 @@ BRIEF DESCRIPTION:
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 10
#define QWLAN_VERSION_EXTRA ""
-#define QWLAN_VERSION_BUILD 61
+#define QWLAN_VERSION_BUILD 62
-#define QWLAN_VERSIONSTR "4.0.10.61"
+#define QWLAN_VERSIONSTR "4.0.10.62"
#define AR6320_REV1_VERSION 0x5000000
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 4d8cd7c9ceb2..16b32c6995da 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -3700,6 +3700,30 @@ typedef enum {
SIR_ROAMING_DFS_CHANNEL_ENABLED_NORMAL = 1,
SIR_ROAMING_DFS_CHANNEL_ENABLED_ACTIVE = 2
} eSirDFSRoamScanMode;
+#define MAX_SSID_ALLOWED_LIST 4
+#define MAX_BSSID_AVOID_LIST 16
+#define MAX_BSSID_FAVORED 16
+struct roam_ext_params {
+ uint8_t num_bssid_avoid_list;
+ uint8_t num_ssid_allowed_list;
+ uint8_t num_bssid_favored;
+ tSirMacSSid ssid_allowed_list[MAX_SSID_ALLOWED_LIST];
+ tSirMacAddr bssid_avoid_list[MAX_BSSID_AVOID_LIST];
+ tSirMacAddr bssid_favored[MAX_BSSID_FAVORED];
+ uint8_t bssid_favored_factor[MAX_BSSID_FAVORED];
+ int raise_rssi_thresh_5g;
+ int drop_rssi_thresh_5g;
+ uint8_t raise_rssi_type_5g;
+ uint8_t raise_factor_5g;
+ uint8_t drop_rssi_type_5g;
+ uint8_t drop_factor_5g;
+ int max_raise_rssi_5g;
+ int max_drop_rssi_5g;
+ int good_rssi_threshold;
+ int rssi_diff;
+ int good_rssi_roam;
+ bool is_5g_pref_enabled;
+};
typedef struct sSirRoamOffloadScanReq
{
@@ -3712,7 +3736,7 @@ typedef struct sSirRoamOffloadScanReq
tANI_U8 RoamRssiDiff;
tANI_U8 ChannelCacheType;
tANI_U8 Command;
- tANI_U8 StartScanReason;
+ tANI_U8 reason;
tANI_U16 NeighborScanTimerPeriod;
tANI_U16 NeighborRoamScanRefreshPeriod;
tANI_U16 NeighborScanChannelMinTime;
@@ -3759,6 +3783,8 @@ typedef struct sSirRoamOffloadScanReq
tANI_U32 R0KH_ID_Length;
tANI_U8 RoamKeyMgmtOffloadEnabled;
#endif
+ struct roam_ext_params roam_params;
+
} tSirRoamOffloadScanReq, *tpSirRoamOffloadScanReq;
typedef struct sSirRoamOffloadScanRsp
@@ -4848,10 +4874,17 @@ typedef struct
* @max_ap_cache_per_scan: maximum number of APs that can be stored per scan
* @max_rssi_sample_size: number of RSSI samples used for averaging RSSI
* @ax_scan_reporting_threshold: max possible report_threshold
- * @max_hotlist_aps: maximum number of entries for hotlist APs
+ * @max_hotlist_bssids: maximum number of entries for hotlist APs
* @max_significant_wifi_change_aps: maximum number of entries for
* significant wifi change APs
* @max_bssid_history_entries: number of BSSID/RSSI entries that device can hold
+ * @max_hotlist_ssids: maximum number of entries for hotlist SSIDs
+ * @max_number_epno_networks: max number of epno entries
+ * @max_number_epno_networks_by_ssid: max number of epno entries
+ * if ssid is specified, that is, epno entries for
+ * which an exact match is required,
+ * or entries corresponding to hidden ssids
+ * @max_number_of_white_listed_ssid: max number of white listed SSIDs
*/
typedef struct
{
@@ -4864,10 +4897,14 @@ typedef struct
uint32_t max_rssi_sample_size;
uint32_t max_scan_reporting_threshold;
- uint32_t max_hotlist_aps;
+ uint32_t max_hotlist_bssids;
uint32_t max_significant_wifi_change_aps;
uint32_t max_bssid_history_entries;
+ uint32_t max_hotlist_ssids;
+ uint32_t max_number_epno_networks;
+ uint32_t max_number_epno_networks_by_ssid;
+ uint32_t max_number_of_white_listed_ssid;
} tSirExtScanCapabilitiesEvent, *tpSirExtScanCapabilitiesEvent;
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
index 86fdb9086082..5ab432737b48 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
@@ -966,12 +966,16 @@ limSendSmeLfrScanRsp(tpAniSirGlobal pMac, tANI_U16 length,
tpSirSmeScanRsp pSirSmeScanRsp=NULL;
tLimScanResultNode *ptemp = NULL;
tANI_U16 msgLen, allocLength, curMsgLen = 0;
- tANI_U16 i, bssCount;
+ tANI_U16 i, bssCount, j;
tANI_U8 *pbBuf;
tSirBssDescription *pDesc;
tANI_S16 scanEntriesLeft = 0;
tANI_U8 *currentBssid =
pMac->roam.roamSession[smesessionId].connectedProfile.bssid;
+ struct roam_ext_params *roam_params;
+ bool ssid_list_match = false;
+
+ roam_params = &pMac->roam.configParam.roam_params;
limLog(pMac, LOG1,
FL("Sending message SME_SCAN_RSP with length=%d reasonCode %s\n"),
@@ -1080,9 +1084,22 @@ limSendSmeLfrScanRsp(tpAniSirGlobal pMac, tANI_U16 length,
ptemp = pMac->lim.gLimCachedScanHashTable[i];
while(ptemp)
{
- if(vos_mem_compare((tANI_U8* ) ptemp->bssDescription.ieFields+1,
- (tANI_U8 *) &pSsid->length,
- (tANI_U8) (pSsid->length + 1)))
+ ssid_list_match = false;
+ for (j = 0; j < roam_params->num_ssid_allowed_list; j++) {
+ if(vos_mem_compare((tANI_U8* ) ptemp->bssDescription.ieFields+1,
+ (tANI_U8 *) &roam_params->ssid_allowed_list[j].length,
+ (tANI_U8) (roam_params->ssid_allowed_list[j].length + 1))) {
+ VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_DEBUG,
+ FL("SSID Match with allowedlist"));
+ ssid_list_match = true;
+ break;
+ }
+ }
+
+ if(ssid_list_match ||
+ vos_mem_compare((tANI_U8* ) ptemp->bssDescription.ieFields+1,
+ (tANI_U8 *) &pSsid->length,
+ (tANI_U8) (pSsid->length + 1)))
{
if (vos_mem_compare(ptemp->bssDescription.bssId,
currentBssid,
@@ -1148,6 +1165,9 @@ limSendSmeLfrScanRsp(tpAniSirGlobal pMac, tANI_U16 length,
pSirSmeScanRsp->sessionId = smesessionId;
pSirSmeScanRsp->transcationId = smetranscationId;
+ } else {
+ PELOG2(limLog(pMac, LOG2, FL("SSID Mismatch with BSSID"));
+ limPrintMacAddr(pMac, ptemp->bssDescription.bssId, LOG2);)
}
ptemp = ptemp->next;
} //while(ptemp)
diff --git a/CORE/SERVICES/HTC/htc.c b/CORE/SERVICES/HTC/htc.c
index 2ff489aa1af6..2fb5d910c627 100644
--- a/CORE/SERVICES/HTC/htc.c
+++ b/CORE/SERVICES/HTC/htc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013, 2014, 2015 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -143,7 +143,7 @@ void HTCDump(HTC_HANDLE HTCHandle, u_int8_t CmdId, bool start)
static void HTCCleanup(HTC_TARGET *target)
{
HTC_PACKET *pPacket;
- //adf_nbuf_t netbuf;
+ adf_nbuf_t netbuf;
if (target->hif_dev != NULL) {
HIFDetachHTC(target->hif_dev);
@@ -164,6 +164,12 @@ static void HTCCleanup(HTC_TARGET *target)
pPacket = target->pBundleFreeTxList;
while (pPacket) {
HTC_PACKET *pPacketTmp = (HTC_PACKET *)pPacket->ListLink.pNext;
+ if(pPacket->pContext != NULL) {
+ A_FREE(pPacket->pContext);
+ }
+ netbuf = GET_HTC_PACKET_NET_BUF_CONTEXT(pPacket);
+ if(netbuf != NULL)
+ adf_nbuf_free(netbuf);
A_FREE(pPacket);
pPacket = pPacketTmp;
}
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index a1bafd877439..00f2df090b6a 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -2832,20 +2832,35 @@ static int wma_extscan_capabilities_event_handler (void *handle,
dest_capab->max_scan_reporting_threshold =
src_cache->max_table_usage_threshold;
- dest_capab->max_hotlist_aps = src_hotlist->max_hotlist_entries;
+ dest_capab->max_hotlist_bssids = src_hotlist->max_hotlist_entries;
dest_capab->max_rssi_sample_size =
src_change->max_rssi_averaging_samples;
dest_capab->max_bssid_history_entries =
src_change->max_rssi_history_entries;
dest_capab->max_significant_wifi_change_aps =
src_change->max_wlan_change_entries;
+ dest_capab->max_hotlist_ssids =
+ event->num_extscan_hotlist_ssid;
+ dest_capab->max_number_epno_networks =
+ event->num_epno_networks;
+ dest_capab->max_number_epno_networks_by_ssid =
+ event->num_epno_networks;
+ dest_capab->max_number_of_white_listed_ssid =
+ event->num_roam_ssid_whitelist;
dest_capab->status = 0;
WMA_LOGD("%s: Capabilities: max_scan_buckets: %d,"
- "max_hotlist_aps: %d,max_scan_cache_size: %d",
+ "max_hotlist_bssids: %d, max_scan_cache_size: %d",
__func__, dest_capab->max_scan_buckets,
- dest_capab->max_hotlist_aps,
+ dest_capab->max_hotlist_bssids,
dest_capab->max_scan_cache_size);
+ WMA_LOGD("%s: Capabilities: max_hotlist_ssids: %d,"
+ "max_number_epno_networks: %d, max_number_epno_networks_by_ssid: %d,"
+ "max_number_of_white_listed_ssid: %d",
+ __func__, dest_capab->max_hotlist_ssids,
+ dest_capab->max_number_epno_networks,
+ dest_capab->max_number_epno_networks_by_ssid,
+ dest_capab->max_number_of_white_listed_ssid);
pMac->sme.pExtScanIndCb(pMac->hHdd,
eSIR_EXTSCAN_GET_CAPABILITIES_IND,
@@ -3074,7 +3089,7 @@ static int wma_extscan_cached_results_event_handler(void *handle,
dest_ap = &dest_result->ap[0];
}
dest_ap->channel = src_hotlist->channel;
- dest_ap->ts = src_rssi->tstamp * WMA_SEC_TO_USEC;
+ dest_ap->ts = WMA_MSEC_TO_USEC(src_rssi->tstamp);
dest_ap->rtt = src_hotlist->rtt;
dest_ap->rtt_sd = src_hotlist->rtt_sd;
dest_ap->beaconPeriod = src_hotlist->beacon_interval;
@@ -8214,19 +8229,24 @@ error:
* Returns :
*/
VOS_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
- A_INT32 rssi_thresh,
- A_INT32 rssi_thresh_diff,
- u_int32_t vdev_id)
+ tSirRoamOffloadScanReq *roam_req)
{
VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
wmi_buf_t buf = NULL;
int status = 0;
- int len;
+ int len, rssi_thresh, rssi_thresh_diff;
u_int8_t *buf_ptr;
wmi_roam_scan_rssi_threshold_fixed_param *rssi_threshold_fp;
+ wmi_roam_scan_extended_threshold_param *ext_thresholds = NULL;
+ struct roam_ext_params *roam_params;
/* Send rssi threshold */
+ roam_params = &roam_req->roam_params;
+ rssi_thresh = roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT;
+ rssi_thresh_diff = roam_req->OpportunisticScanThresholdDiff;
len = sizeof(wmi_roam_scan_rssi_threshold_fixed_param);
+ len += WMI_TLV_HDR_SIZE; /* TLV for ext_thresholds*/
+ len += sizeof(wmi_roam_scan_extended_threshold_param);
buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
if (!buf) {
WMA_LOGE("%s : wmi_buf_alloc failed", __func__);
@@ -8240,10 +8260,39 @@ VOS_STATUS wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
WMITLV_GET_STRUCT_TLVLEN(
wmi_roam_scan_rssi_threshold_fixed_param));
/* fill in threshold values */
- rssi_threshold_fp->vdev_id = vdev_id;
+ rssi_threshold_fp->vdev_id = roam_req->sessionId;
rssi_threshold_fp->roam_scan_rssi_thresh = rssi_thresh & 0x000000ff;
rssi_threshold_fp->roam_rssi_thresh_diff = rssi_thresh_diff & 0x000000ff;
-
+ buf_ptr += sizeof(wmi_roam_scan_rssi_threshold_fixed_param);
+ WMITLV_SET_HDR(buf_ptr,
+ WMITLV_TAG_ARRAY_STRUC,
+ sizeof(wmi_roam_scan_extended_threshold_param));
+ buf_ptr += WMI_TLV_HDR_SIZE;
+ ext_thresholds = (wmi_roam_scan_extended_threshold_param *) buf_ptr;
+ ext_thresholds->boost_threshold_5g =
+ (roam_params->raise_rssi_thresh_5g - WMA_NOISE_FLOOR_DBM_DEFAULT) &
+ 0x000000ff;
+ ext_thresholds->penalty_threshold_5g =
+ (roam_params->drop_rssi_thresh_5g - WMA_NOISE_FLOOR_DBM_DEFAULT) &
+ 0x000000ff;
+ ext_thresholds->boost_algorithm_5g = WMI_ROAM_5G_BOOST_PENALIZE_ALGO_LINEAR;
+ ext_thresholds->boost_factor_5g = roam_params->raise_factor_5g;
+ ext_thresholds->penalty_algorithm_5g =
+ WMI_ROAM_5G_BOOST_PENALIZE_ALGO_LINEAR;
+ ext_thresholds->penalty_factor_5g = roam_params->drop_factor_5g;
+ ext_thresholds->max_boost_5g =
+ (roam_params->max_raise_rssi_5g - WMA_NOISE_FLOOR_DBM_DEFAULT) &
+ 0x000000ff;
+ ext_thresholds->max_penalty_5g =
+ (roam_params->max_drop_rssi_5g - WMA_NOISE_FLOOR_DBM_DEFAULT) &
+ 0x000000ff;
+ ext_thresholds->good_rssi_threshold =
+ (roam_params->good_rssi_threshold - WMA_NOISE_FLOOR_DBM_DEFAULT) &
+ 0x000000ff;
+ WMITLV_SET_HDR(&ext_thresholds->tlv_header,
+ WMITLV_TAG_STRUC_wmi_roam_scan_extended_threshold_param,
+ WMITLV_GET_STRUCT_TLVLEN
+ (wmi_roam_scan_extended_threshold_param));
status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf,
len, WMI_ROAM_SCAN_RSSI_THRESHOLD);
if (status != EOK) {
@@ -8789,6 +8838,131 @@ error:
return vos_status;
}
+VOS_STATUS wma_roam_scan_filter(tp_wma_handle wma_handle,
+ tSirRoamOffloadScanReq *roam_req)
+{
+ wmi_buf_t buf = NULL;
+ int status = 0, i;
+ uint32_t len, num_bssid_black_list = 0, num_ssid_white_list = 0,
+ num_bssid_preferred_list = 0;
+ uint32_t op_bitmap = 0;
+ uint8_t *buf_ptr;
+ wmi_roam_filter_fixed_param *roam_filter;
+ uint8_t *bssid_src_ptr = NULL;
+ wmi_mac_addr *bssid_dst_ptr = NULL;
+ wmi_ssid *ssid_ptr = NULL;
+ uint32_t *bssid_preferred_factor_ptr = NULL;
+ struct roam_ext_params *roam_params;
+
+ roam_params = &roam_req->roam_params;
+ len = sizeof(wmi_roam_filter_fixed_param);
+ len += WMI_TLV_HDR_SIZE;
+ switch (roam_req->reason) {
+ case REASON_ROAM_SET_BLACKLIST_BSSID:
+ op_bitmap |= 0x1;
+ num_bssid_black_list = roam_params->num_bssid_avoid_list;
+ len += num_bssid_black_list * sizeof(wmi_mac_addr);
+ len += WMI_TLV_HDR_SIZE;
+ break;
+ case REASON_ROAM_SET_SSID_ALLOWED:
+ op_bitmap |= 0x2;
+ num_ssid_white_list = roam_params->num_ssid_allowed_list;
+ len += num_ssid_white_list * sizeof(wmi_ssid);
+ len += WMI_TLV_HDR_SIZE;
+ break;
+ case REASON_ROAM_SET_FAVORED_BSSID:
+ op_bitmap |= 0x4;
+ num_bssid_preferred_list = roam_params->num_bssid_favored;
+ len += num_bssid_preferred_list * sizeof(wmi_mac_addr);
+ len += WMI_TLV_HDR_SIZE;
+ len += num_bssid_preferred_list * sizeof(A_UINT32);
+ break;
+ default:
+ WMA_LOGD("%s : Roam Filter need not be sent", __func__);
+ return VOS_STATUS_SUCCESS;
+ break;
+ }
+
+ buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
+ if (!buf) {
+ WMA_LOGE("%s : wmi_buf_alloc failed", __func__);
+ return VOS_STATUS_E_NOMEM;
+ }
+
+ buf_ptr = (u_int8_t *) wmi_buf_data(buf);
+ roam_filter = (wmi_roam_filter_fixed_param *) buf_ptr;
+ WMITLV_SET_HDR(&roam_filter->tlv_header,
+ WMITLV_TAG_STRUC_wmi_roam_filter_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(wmi_roam_filter_fixed_param));
+ /* fill in fixed values */
+ roam_filter->vdev_id = roam_req->sessionId;
+ roam_filter->flags = 0;
+ roam_filter->op_bitmap = op_bitmap;
+ roam_filter->num_bssid_black_list = num_bssid_black_list;
+ roam_filter->num_ssid_white_list = num_ssid_white_list;
+ roam_filter->num_bssid_preferred_list = num_bssid_preferred_list;
+ buf_ptr += sizeof(wmi_roam_filter_fixed_param);
+
+ WMITLV_SET_HDR((buf_ptr),
+ WMITLV_TAG_ARRAY_FIXED_STRUC,
+ (num_bssid_black_list * sizeof(wmi_mac_addr)));
+ bssid_src_ptr = (uint8_t *)&roam_params->bssid_avoid_list;
+ bssid_dst_ptr = (wmi_mac_addr *)(buf_ptr + WMI_TLV_HDR_SIZE);
+ for(i=0; i<num_bssid_black_list; i++) {
+ WMI_CHAR_ARRAY_TO_MAC_ADDR(bssid_src_ptr, bssid_dst_ptr);
+ bssid_src_ptr += sizeof(ATH_MAC_LEN);
+ bssid_dst_ptr++;
+ }
+ buf_ptr += WMI_TLV_HDR_SIZE + (num_bssid_black_list * sizeof(wmi_mac_addr));
+ WMITLV_SET_HDR((buf_ptr),
+ WMITLV_TAG_ARRAY_FIXED_STRUC,
+ (num_ssid_white_list * sizeof(wmi_ssid)));
+ ssid_ptr = (wmi_ssid *)(buf_ptr + WMI_TLV_HDR_SIZE);
+ for(i=0; i<num_ssid_white_list; i++) {
+ memcpy(&ssid_ptr->ssid, &roam_params->ssid_allowed_list[i].ssId,
+ roam_params->ssid_allowed_list[i].length);
+ ssid_ptr->ssid_len = roam_params->ssid_allowed_list[i].length;
+ WMA_LOGD("%s: Passing SSID of length=%d", __func__,ssid_ptr->ssid_len);
+ VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG,
+ (uint8_t *)ssid_ptr->ssid,
+ ssid_ptr->ssid_len);
+ ssid_ptr++;
+ }
+ buf_ptr += WMI_TLV_HDR_SIZE + (num_ssid_white_list * sizeof(wmi_ssid));
+ WMITLV_SET_HDR((buf_ptr),
+ WMITLV_TAG_ARRAY_FIXED_STRUC,
+ (num_bssid_preferred_list * sizeof(wmi_mac_addr)));
+ bssid_src_ptr = (uint8_t *)&roam_params->bssid_favored;
+ bssid_dst_ptr = (wmi_mac_addr *)(buf_ptr + WMI_TLV_HDR_SIZE);
+ for(i=0; i<num_bssid_preferred_list; i++) {
+ WMI_CHAR_ARRAY_TO_MAC_ADDR(bssid_src_ptr,
+ (wmi_mac_addr *)bssid_dst_ptr);
+ bssid_src_ptr += sizeof(ATH_MAC_LEN);
+ bssid_dst_ptr++;
+ }
+ buf_ptr += WMI_TLV_HDR_SIZE +
+ (num_bssid_preferred_list * sizeof(wmi_mac_addr));
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32,
+ (num_bssid_preferred_list * sizeof(uint32_t)));
+ bssid_preferred_factor_ptr = (uint32_t *)(buf_ptr + WMI_TLV_HDR_SIZE);
+ for (i=0; i<num_bssid_preferred_list; i++) {
+ *bssid_preferred_factor_ptr = roam_params->bssid_favored_factor[i];
+ bssid_preferred_factor_ptr++;
+ }
+ buf_ptr += WMI_TLV_HDR_SIZE + (num_bssid_preferred_list * sizeof(uint32_t));
+ status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf,
+ len, WMI_ROAM_FILTER_CMDID);
+ if (status != EOK) {
+ WMA_LOGE("wmi_unified_cmd_send WMI_ROAM_FILTER_CMDID returned Error %d",
+ status);
+ goto error;
+ }
+ return VOS_STATUS_SUCCESS;
+error:
+ wmi_buf_free(buf);
+ return VOS_STATUS_E_FAILURE;
+}
+
VOS_STATUS wma_roam_scan_bmiss_cnt(tp_wma_handle wma_handle,
A_INT32 first_bcnt,
A_UINT32 final_bcnt,
@@ -8883,7 +9057,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
struct wma_txrx_node *intr = NULL;
WMA_LOGI("%s: command 0x%x, reason %d", __func__, roam_req->Command,
- roam_req->StartScanReason);
+ roam_req->reason);
if (NULL == pMac)
{
@@ -8914,9 +9088,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
wma_handle->suitable_ap_hb_failure = FALSE;
vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
- (roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT),
- roam_req->OpportunisticScanThresholdDiff,
- roam_req->sessionId);
+ roam_req);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
}
@@ -8984,6 +9156,14 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
roam_req,
mode,
roam_req->sessionId);
+ if (vos_status != VOS_STATUS_SUCCESS) {
+ break;
+ }
+ vos_status = wma_roam_scan_filter(wma_handle, roam_req);
+ if (vos_status != VOS_STATUS_SUCCESS) {
+ WMA_LOGE("Sending start for roam scan filter failed");
+ break;
+ }
break;
case ROAM_SCAN_OFFLOAD_STOP:
@@ -8999,7 +9179,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
roam_req->sessionId);
}
- if (roam_req->StartScanReason == REASON_OS_REQUESTED_ROAMING_NOW) {
+ if (roam_req->reason == REASON_OS_REQUESTED_ROAMING_NOW) {
vos_msg_t vosMsg;
tSirRoamOffloadScanRsp *scan_offload_rsp;
scan_offload_rsp = vos_mem_malloc(sizeof(*scan_offload_rsp));
@@ -9010,7 +9190,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
}
vosMsg.type = eWNI_SME_ROAM_SCAN_OFFLOAD_RSP;
scan_offload_rsp->sessionId = roam_req->sessionId;
- scan_offload_rsp->reason = roam_req->StartScanReason;
+ scan_offload_rsp->reason = roam_req->reason;
vosMsg.bodyptr = scan_offload_rsp;
/*
* Since REASSOC request is processed in Roam_Scan_Offload_Rsp
@@ -9042,7 +9222,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
* and WMI_ROAM_REASON_SUITABLE_AP event was received earlier,
* now it is time to call it heartbeat failure.
*/
- if ((roam_req->StartScanReason == REASON_PREAUTH_FAILED_FOR_ALL)
+ if ((roam_req->reason == REASON_PREAUTH_FAILED_FOR_ALL)
&& wma_handle->suitable_ap_hb_failure) {
WMA_LOGE("%s: Sending heartbeat failure after preauth failures",
__func__);
@@ -9073,6 +9253,11 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
if (vos_status != VOS_STATUS_SUCCESS) {
break;
}
+ vos_status = wma_roam_scan_filter(wma_handle, roam_req);
+ if (vos_status != VOS_STATUS_SUCCESS) {
+ WMA_LOGE("Sending update for roam scan filter failed");
+ break;
+ }
/*
* Runtime (after association) changes to rssi thresholds and other parameters.
@@ -9087,9 +9272,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
}
vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
- (roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT),
- roam_req->OpportunisticScanThresholdDiff,
- roam_req->sessionId);
+ roam_req);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
}
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index dfa249e08cdb..a419219322c3 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -1269,6 +1269,7 @@ VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq,
#define WMA_NLO_FREQ_THRESH 1000 /* in MHz */
#define WMA_SEC_TO_MSEC(sec) (sec * 1000) /* sec to msec */
+#define WMA_MSEC_TO_USEC(msec) (msec * 1000) /* msec to usec */
/* Default rssi threshold defined in CFG80211 */
#define WMA_RSSI_THOLD_DEFAULT -300
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index e8f8de697fb1..c505aaebfff3 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -411,6 +411,12 @@ typedef struct tagCsrScanResultFilter
tANI_U8 MFPRequired;
tANI_U8 MFPCapable;
#endif
+ /* The following flag is used to distinguish the
+ * roaming case while building the scan filter and
+ * applying it on to the scan results. This is mainly
+ * used to support whitelist ssid feature.
+ */
+ uint8_t scan_filter_for_roam;
}tCsrScanResultFilter;
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index a9f1619410b3..432f3cbdff95 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -80,6 +80,10 @@
( \
(((pMac)->roam.configParam.nSelect5GHzMargin)?eANI_BOOLEAN_TRUE:eANI_BOOLEAN_FALSE) \
)
+#define CSR_IS_SELECT_5G_PREFERRED(pMac) \
+( \
+ (((pMac)->roam.configParam.roam_params.is_5g_pref_enabled)?eANI_BOOLEAN_TRUE:eANI_BOOLEAN_FALSE) \
+)
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
#define CSR_IS_ROAM_PREFER_5GHZ( pMac ) \
@@ -675,6 +679,7 @@ typedef struct tagCsrConfig
v_U8_t conc_custom_rule1;
v_U8_t conc_custom_rule2;
v_U8_t is_sta_connection_in_5gz_enabled;
+ struct roam_ext_params roam_params;
}tCsrConfig;
typedef struct tagCsrChannelPowerInfo
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index ed999d820a49..c28b86ca7337 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -323,6 +323,11 @@ VOS_STATUS csrNeighborRoamMergeChannelLists(tpAniSirGlobal pMac,
#define REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED 22
#define REASON_ROAM_DFS_SCAN_MODE_CHANGED 23
#define REASON_ROAM_ABORT_ROAM_SCAN 24
+#define REASON_ROAM_EXT_SCAN_PARAMS_CHANGED 25
+#define REASON_ROAM_SET_SSID_ALLOWED 26
+#define REASON_ROAM_SET_FAVORED_BSSID 27
+#define REASON_ROAM_GOOD_RSSI_CHANGED 28
+#define REASON_ROAM_SET_BLACKLIST_BSSID 29
eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 sessionId,
tANI_U8 command, tANI_U8 reason);
eHalStatus csrNeighborRoamCandidateFoundIndHdlr(tpAniSirGlobal pMac,
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 6dba4a5c1120..ca5fb7080066 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -378,7 +378,8 @@ void sme_SetCurrDeviceMode (tHalHandle hHal, tVOS_CON_MODE currDeviceMode);
eHalStatus sme_CloseSession(tHalHandle hHal, tANI_U8 sessionId,
csrRoamSessionCloseCallback callback, void *pContext);
-
+eHalStatus sme_update_roam_params(tHalHandle hHal, uint8_t session_id,
+ struct roam_ext_params roam_params_src, int update_param);
/*--------------------------------------------------------------------------
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 80b46879179f..dd323b309478 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -8452,6 +8452,7 @@ void csrRoamRoamingStateDisassocRspProcessor( tpAniSirGlobal pMac, tSirSmeDisass
if(HAL_STATUS_SUCCESS(status))
{
vos_mem_set(pScanFilter, sizeof(tCsrScanResultFilter), 0);
+ pScanFilter->scan_filter_for_roam = 1;
status = csrRoamPrepareFilterFromProfile(pMac,
&pNeighborRoamInfo->csrNeighborRoamProfile,
pScanFilter);
@@ -9347,8 +9348,12 @@ eHalStatus csrRoamPrepareFilterFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile
tCsrScanResultFilter *pScanFilter)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
- tANI_U32 size = 0;
+ uint32_t size = 0;
tANI_U8 index = 0;
+ struct roam_ext_params *roam_params;
+ uint8_t i;
+
+ roam_params = &pMac->roam.configParam.roam_params;
do
{
@@ -9379,6 +9384,35 @@ eHalStatus csrRoamPrepareFilterFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile
//We always use index 1 for self SSID. Index 0 for peer's SSID that we want to join
pScanFilter->SSIDs.numOfSSIDs = 1;
}
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ FL("No of Allowed List:%d"), roam_params->num_ssid_allowed_list);
+ if (pScanFilter->scan_filter_for_roam
+ && roam_params->num_ssid_allowed_list) {
+ pScanFilter->SSIDs.numOfSSIDs =
+ (1 + roam_params->num_ssid_allowed_list);
+ size = sizeof(tCsrSSIDInfo) * pScanFilter->SSIDs.numOfSSIDs;
+ pScanFilter->SSIDs.SSIDList = vos_mem_malloc(size);
+ if ( NULL == pScanFilter->SSIDs.SSIDList)
+ status = eHAL_STATUS_FAILURE;
+ else
+ status = eHAL_STATUS_SUCCESS;
+ if(!HAL_STATUS_SUCCESS(status))
+ break;
+ for (i=0; i<roam_params->num_ssid_allowed_list; i++) {
+ vos_mem_copy((void *)pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
+ roam_params->ssid_allowed_list[i].ssId,
+ roam_params->ssid_allowed_list[i].length);
+ pScanFilter->SSIDs.SSIDList[i].SSID.length =
+ roam_params->ssid_allowed_list[i].length;
+ pScanFilter->SSIDs.SSIDList[i].handoffPermitted = 1;
+ pScanFilter->SSIDs.SSIDList[i].ssidHidden = 0;
+ }
+ vos_mem_copy(pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
+ pProfile->SSIDs.SSIDList->SSID.ssId,
+ pProfile->SSIDs.SSIDList->SSID.length);
+ pScanFilter->SSIDs.SSIDList[i].handoffPermitted = 1;
+ pScanFilter->SSIDs.SSIDList[i].ssidHidden = 0;
+ } else {
size = sizeof(tCsrSSIDInfo) * pProfile->SSIDs.numOfSSIDs;
pScanFilter->SSIDs.SSIDList = vos_mem_malloc(size);
if ( NULL == pScanFilter->SSIDs.SSIDList )
@@ -9391,6 +9425,7 @@ eHalStatus csrRoamPrepareFilterFromProfile(tpAniSirGlobal pMac, tCsrRoamProfile
}
vos_mem_copy(pScanFilter->SSIDs.SSIDList, pProfile->SSIDs.SSIDList,
size);
+ }
}
if(!pProfile->ChannelInfo.ChannelList || (pProfile->ChannelInfo.ChannelList[0] == 0) )
{
@@ -16681,7 +16716,7 @@ eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 sessionId,
pRequestBuf->RoamRssiDiff =
pMac->roam.configParam.RoamRssiDiff;
pRequestBuf->Command = command;
- pRequestBuf->StartScanReason = reason;
+ pRequestBuf->reason = reason;
pRequestBuf->NeighborScanTimerPeriod =
pNeighborRoamInfo->cfgParams.neighborScanPeriod;
pRequestBuf->NeighborRoamScanRefreshPeriod =
@@ -16900,6 +16935,8 @@ eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 sessionId,
csrRoamOffload(pMac, pRequestBuf, pSession);
}
#endif
+ vos_mem_copy(&pRequestBuf->roam_params, &pMac->roam.configParam.roam_params,
+ sizeof(pRequestBuf->roam_params));
msg.type = WDA_ROAM_SCAN_OFFLOAD_REQ;
msg.reserved = 0;
msg.bodyptr = pRequestBuf;
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index 8590d6bff524..71e7289cb063 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -1921,22 +1921,69 @@ eHalStatus csrScanResultPurge(tpAniSirGlobal pMac, tScanResultHandle hScanList)
}
-static tANI_U32 csrGetBssPreferValue(tpAniSirGlobal pMac, int rssi)
-{
- tANI_U32 ret = 0;
- int i = CSR_NUM_RSSI_CAT - 1;
-
- while(i >= 0)
- {
- if(rssi >= pMac->roam.configParam.RSSICat[i])
- {
- ret = pMac->roam.configParam.BssPreferValue[i];
- break;
- }
- i--;
- };
-
- return (ret);
+static tANI_U32 csrGetBssPreferValue(tpAniSirGlobal pMac, int rssi,
+ int roaming_scan, tCsrBssid *bssid, int channel_id)
+{
+ tANI_U32 ret = 0;
+ int i, modified_thresh;
+ struct roam_ext_params *roam_params;
+
+ if (roaming_scan) {
+ roam_params = &pMac->roam.configParam.roam_params;
+ /* If the 5G pref feature is enabled, apply the roaming
+ * parameters to boost or penalize the rssi.*/
+ if (CSR_IS_SELECT_5G_PREFERRED(pMac) &&
+ CSR_IS_CHANNEL_5GHZ(channel_id)) {
+ /*
+ * Boost Factor =
+ * boost_factor * (Actual RSSI - boost Threshold)
+ * Penalty Factor =
+ * penalty factor * (penalty threshold - Actual RSSI)
+ */
+ /* Check and boost the threshold*/
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ FL("Actual RSSI: %d"), rssi);
+ if (rssi > roam_params->raise_rssi_thresh_5g) {
+ modified_thresh = roam_params->raise_factor_5g *
+ (rssi - roam_params->raise_rssi_thresh_5g);
+ rssi += CSR_MAX(roam_params->max_raise_rssi_5g,
+ modified_thresh);
+ }
+ /* Check and penalize the threshold */
+ else if(rssi < roam_params->drop_rssi_thresh_5g) {
+ modified_thresh = roam_params->drop_factor_5g *
+ (roam_params->drop_rssi_thresh_5g - rssi);
+ rssi -= CSR_MAX(roam_params->max_drop_rssi_5g,
+ modified_thresh);
+ }
+ }
+ /* Check if there are preferred bssid and then apply the
+ * preferred score*/
+ if (roam_params->num_bssid_favored) {
+ for (i=0; i<roam_params->num_bssid_favored; i++) {
+ if (csrIsMacAddressEqual(pMac,
+ &roam_params->bssid_favored[i],
+ bssid)) {
+ rssi += roam_params->bssid_favored_factor[i];
+ }
+ }
+ }
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ FL("Modified RSSI: %d"), rssi);
+ }
+
+ i = CSR_NUM_RSSI_CAT - 1;
+ while(i >= 0)
+ {
+ if(rssi >= pMac->roam.configParam.RSSICat[i])
+ {
+ ret = pMac->roam.configParam.BssPreferValue[i];
+ break;
+ }
+ i--;
+ };
+
+ return (ret);
}
@@ -1945,7 +1992,7 @@ static tANI_U32 csrGetBssCapValue(tpAniSirGlobal pMac, tSirBssDescription *pBssD
{
tANI_U32 ret = CSR_BSS_CAP_VALUE_NONE;
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
- if(CSR_IS_ROAM_PREFER_5GHZ(pMac))
+ if(CSR_IS_ROAM_PREFER_5GHZ(pMac) || CSR_IS_SELECT_5G_PREFERRED(pMac))
{
if((pBssDesc) && CSR_IS_CHANNEL_5GHZ(pBssDesc->channelId))
{
@@ -2046,9 +2093,8 @@ static void csrScanAddResult(tpAniSirGlobal pMac, tCsrScanResult *pResult,
tpCsrNeighborRoamControlInfo pNeighborRoamInfo =
&pMac->roam.neighborRoamInfo[sessionId];
#endif
-
- pResult->preferValue =
- csrGetBssPreferValue(pMac, (int)pResult->Result.BssDescriptor.rssi);
+ pResult->preferValue = csrGetBssPreferValue(pMac,
+ (int)pResult->Result.BssDescriptor.rssi, 0, NULL, 0);
pResult->capValue =
csrGetBssCapValue(pMac, &pResult->Result.BssDescriptor, pIes);
csrLLInsertTail( &pMac->scan.scanResultList, &pResult->Link, LL_ACCESS_LOCK );
@@ -2078,21 +2124,31 @@ eHalStatus csrScanGetResult(tpAniSirGlobal pMac, tCsrScanResultFilter *pFilter,
tDot11fBeaconIEs *pIes, *pNewIes;
tANI_BOOLEAN fMatch;
tANI_U16 i = 0;
+ struct roam_ext_params *roam_params = NULL;
if(phResult)
{
*phResult = CSR_INVALID_SCANRESULT_HANDLE;
}
- if (pMac->roam.configParam.nSelect5GHzMargin)
+ if (pMac->roam.configParam.nSelect5GHzMargin ||
+ (CSR_IS_SELECT_5G_PREFERRED(pMac) && pFilter->scan_filter_for_roam))
{
pMac->scan.inScanResultBestAPRssi = -128;
+ roam_params = &pMac->roam.configParam.roam_params;
#ifdef WLAN_DEBUG_ROAM_OFFLOAD
- VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
FL("nSelect5GHzMargin"));
#endif
csrLLLock(&pMac->scan.scanResultList);
-
+ /* For roaming scans and 5G preferred roaming, there is no
+ * need to check the filter match and also re-program the
+ * RSSI bucket categories, since we use the RSSI values
+ * while setting the preference value for the BSS.
+ * There is no need to check the match for roaming since
+ * it is already done.*/
+ if(!(CSR_IS_SELECT_5G_PREFERRED(pMac)
+ && pFilter->scan_filter_for_roam)) {
/* Find out the best AP Rssi going thru the scan results */
pEntry = csrLLPeekHead(&pMac->scan.scanResultList, LL_ACCESS_NOLOCK);
while ( NULL != pEntry)
@@ -2100,6 +2156,7 @@ eHalStatus csrScanGetResult(tpAniSirGlobal pMac, tCsrScanResultFilter *pFilter,
pBssDesc = GET_BASE_ADDR( pEntry, tCsrScanResult, Link );
fMatch = FALSE;
+
if (pFilter)
for(i = 0; i < pFilter->SSIDs.numOfSSIDs; i++)
{
@@ -2160,19 +2217,29 @@ eHalStatus csrScanGetResult(tpAniSirGlobal pMac, tCsrScanResultFilter *pFilter,
}
pEntry = csrLLNext(&pMac->scan.scanResultList, pEntry, LL_ACCESS_NOLOCK);
}
+ }
- if ( -128 != pMac->scan.inScanResultBestAPRssi)
+ if ((-128 != pMac->scan.inScanResultBestAPRssi) ||
+ (CSR_IS_SELECT_5G_PREFERRED(pMac) &&
+ pFilter->scan_filter_for_roam))
{
smsLog(pMac, LOG1, FL("Best AP Rssi is %d"), pMac->scan.inScanResultBestAPRssi);
/* Modify Rssi category based on best AP Rssi */
+ if (-128 != pMac->scan.inScanResultBestAPRssi)
csrAssignRssiForCategory(pMac, pMac->scan.inScanResultBestAPRssi, pMac->roam.configParam.bCatRssiOffset);
+
pEntry = csrLLPeekHead(&pMac->scan.scanResultList, LL_ACCESS_NOLOCK);
while ( NULL != pEntry)
{
pBssDesc = GET_BASE_ADDR( pEntry, tCsrScanResult, Link );
- /* re-assign preference value based on modified rssi bucket */
- pBssDesc->preferValue = csrGetBssPreferValue(pMac, (int)pBssDesc->Result.BssDescriptor.rssi);
+ /* re-assign preference value based on (modified rssi bucket (or)
+ * prefer 5G feature.*/
+ pBssDesc->preferValue = csrGetBssPreferValue(pMac,
+ (int)pBssDesc->Result.BssDescriptor.rssi,
+ pFilter->scan_filter_for_roam,
+ &pBssDesc->Result.BssDescriptor.bssId,
+ pBssDesc->Result.BssDescriptor.channelId);
smsLog(pMac, LOG2, FL("BSSID("MAC_ADDRESS_STR
") Rssi(%d) Chnl(%d) PrefVal(%u) SSID=%.*s"),
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index 59d8bc506a2b..73d0609e29a0 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -1782,6 +1782,7 @@ csrNeighborRoamPrepareScanProfileFilter(tpAniSirGlobal pMac,
&pMac->roam.neighborRoamInfo[sessionId];
tCsrRoamConnectedProfile *pCurProfile = &pMac->roam.roamSession[sessionId].connectedProfile;
tANI_U8 i = 0;
+ struct roam_ext_params *roam_params;
VOS_ASSERT(pScanFilter != NULL);
if (pScanFilter == NULL)
@@ -1789,9 +1790,10 @@ csrNeighborRoamPrepareScanProfileFilter(tpAniSirGlobal pMac,
vos_mem_zero(pScanFilter, sizeof(tCsrScanResultFilter));
+ roam_params = &pMac->roam.configParam.roam_params;
/* We dont want to set BSSID based Filter */
pScanFilter->BSSIDs.numOfBSSIDs = 0;
-
+ pScanFilter->scan_filter_for_roam = 1;
//only for HDD requested handoff fill in the BSSID in the filter
#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
if (pNeighborRoamInfo->uOsRequestedHandoff)
@@ -1814,24 +1816,51 @@ csrNeighborRoamPrepareScanProfileFilter(tpAniSirGlobal pMac,
}
}
#endif
- /* Populate all the information from the connected profile */
- pScanFilter->SSIDs.numOfSSIDs = 1;
- pScanFilter->SSIDs.SSIDList = vos_mem_malloc(sizeof(tCsrSSIDInfo));
- if (NULL == pScanFilter->SSIDs.SSIDList)
- {
- smsLog(pMac, LOGE, FL("Scan Filter SSID mem alloc failed"));
- return eHAL_STATUS_FAILED_ALLOC;
- }
- pScanFilter->SSIDs.SSIDList->handoffPermitted = 1;
- pScanFilter->SSIDs.SSIDList->ssidHidden = 0;
- pScanFilter->SSIDs.SSIDList->SSID.length = pCurProfile->SSID.length;
- vos_mem_copy((void *)pScanFilter->SSIDs.SSIDList->SSID.ssId, (void *)pCurProfile->SSID.ssId, pCurProfile->SSID.length);
+ VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ FL("No of Allowed SSID List:%d"), roam_params->num_ssid_allowed_list);
+ if (roam_params->num_ssid_allowed_list) {
+ pScanFilter->SSIDs.numOfSSIDs = (1 + roam_params->num_ssid_allowed_list);
+ pScanFilter->SSIDs.SSIDList = vos_mem_malloc(sizeof(tCsrSSIDInfo) * pScanFilter->SSIDs.numOfSSIDs);
+ if (NULL == pScanFilter->SSIDs.SSIDList) {
+ smsLog(pMac, LOGE, FL("Scan Filter SSID mem alloc failed"));
+ return eHAL_STATUS_FAILED_ALLOC;
+ }
+ for(i = 0; i < roam_params->num_ssid_allowed_list; i++) {
+ pScanFilter->SSIDs.SSIDList[i].handoffPermitted = 1;
+ pScanFilter->SSIDs.SSIDList[i].ssidHidden = 0;
+ vos_mem_copy((void *)pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
+ roam_params->ssid_allowed_list[i].ssId,
+ roam_params->ssid_allowed_list[i].length);
+ pScanFilter->SSIDs.SSIDList[i].SSID.length =
+ roam_params->ssid_allowed_list[i].length;
+ }
+ vos_mem_copy((void *)pScanFilter->SSIDs.SSIDList[i].SSID.ssId,
+ (void *)pCurProfile->SSID.ssId,
+ pCurProfile->SSID.length);
+ pScanFilter->SSIDs.SSIDList[i].SSID.length =
+ pCurProfile->SSID.length;
+ pScanFilter->SSIDs.SSIDList[i].handoffPermitted = 1;
+ pScanFilter->SSIDs.SSIDList[i].ssidHidden = 0;
+ } else {
+ /* Populate all the information from the connected profile */
+ pScanFilter->SSIDs.numOfSSIDs = 1;
+ pScanFilter->SSIDs.SSIDList = vos_mem_malloc(sizeof(tCsrSSIDInfo));
+ if (NULL == pScanFilter->SSIDs.SSIDList) {
+ smsLog(pMac, LOGE, FL("Scan Filter SSID mem alloc failed"));
+ return eHAL_STATUS_FAILED_ALLOC;
+ }
+ pScanFilter->SSIDs.SSIDList->handoffPermitted = 1;
+ pScanFilter->SSIDs.SSIDList->ssidHidden = 0;
+ 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, LOG1, FL("Filtering for SSID %.*s from scan results,"
"length of SSID = %u"),
pScanFilter->SSIDs.SSIDList->SSID.length,
pScanFilter->SSIDs.SSIDList->SSID.ssId,
pScanFilter->SSIDs.SSIDList->SSID.length);
+ }
pScanFilter->authType.numEntries = 1;
pScanFilter->authType.authType[0] = pCurProfile->AuthType;
@@ -2044,7 +2073,7 @@ csrNeighborRoamProcessScanResults(tpAniSirGlobal pMac,
if (abs(CurrAPRssi) < abs(pScanResult->BssDescriptor.rssi)) {
/* Do not roam to an AP with worse RSSI than the current */
- VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
"%s: [INFOLOG]Current AP rssi=%d new ap rssi "
"worse=%d", __func__,
CurrAPRssi,
@@ -2058,7 +2087,7 @@ csrNeighborRoamProcessScanResults(tpAniSirGlobal pMac,
*/
if (abs(abs(CurrAPRssi) -
abs(pScanResult->BssDescriptor.rssi)) < RoamRssiDiff) {
- VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ VOS_TRACE (VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
"%s: [INFOLOG]Current AP rssi=%d new ap "
"rssi=%d not good enough, roamRssiDiff=%d",
__func__,
@@ -2067,7 +2096,7 @@ csrNeighborRoamProcessScanResults(tpAniSirGlobal pMac,
RoamRssiDiff);
continue;
} else {
- VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
"%s: [INFOLOG]Current AP rssi=%d new ap "
"rssi better=%d",
__func__,
diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c
index 739837b36b02..bf2ed06df7ec 100644
--- a/CORE/SME/src/csr/csrUtil.c
+++ b/CORE/SME/src/csr/csrUtil.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -4857,7 +4857,10 @@ tANI_BOOLEAN csrMatchBSS( tHalHandle hHal, tSirBssDescription *pBssDesc, tCsrSca
tANI_U32 i;
tDot11fBeaconIEs *pIes = NULL;
tANI_U8 *pb;
+ tCsrBssid *blacklist_bssid = NULL;
+ struct roam_ext_params *roam_params;
+ roam_params = &pMac->roam.configParam.roam_params;
do {
if( ( NULL == ppIes ) || ( *ppIes ) == NULL )
{
@@ -4877,7 +4880,24 @@ tANI_BOOLEAN csrMatchBSS( tHalHandle hHal, tSirBssDescription *pBssDesc, tCsrSca
fCheck = (!pFilter->p2pResult || pIes->P2PBeaconProbeRes.present);
if(!fCheck) break;
- if(pIes->SSID.present)
+ /* Check for Blacklist BSSID's and avoid connections */
+ fCheck = false;
+ blacklist_bssid = (tCsrBssid *)&roam_params->bssid_avoid_list;
+ for (i = 0; i < roam_params->num_bssid_avoid_list; i++) {
+ if (csrIsMacAddressEqual(pMac, blacklist_bssid,
+ (tCsrBssid *)pBssDesc->bssId)) {
+ fCheck = true;
+ break;
+ }
+ blacklist_bssid++;
+ }
+ if(fCheck) {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ "Do not Attempt connection to blacklist bssid");
+ break;
+ }
+
+ if(pIes->SSID.present)
{
for(i = 0; i < pFilter->SSIDs.numOfSSIDs; i++)
{
@@ -4903,7 +4923,6 @@ tANI_BOOLEAN csrMatchBSS( tHalHandle hHal, tSirBssDescription *pBssDesc, tCsrSca
}
}
if(!fCheck) break;
-
fCheck = eANI_BOOLEAN_TRUE;
for(i = 0; i < pFilter->ChannelInfo.numOfChannels; i++)
{
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 895434f9a1dd..c01dfe364836 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -1676,6 +1676,81 @@ eHalStatus sme_UpdateConfig(tHalHandle hHal, tpSmeConfigParams pSmeConfigParams)
return status;
}
+/**
+ * sme_update_roam_params - Store/Update the roaming params
+ * @hHal Handle for Hal layer
+ * @session_id SME Session ID
+ * @roam_params_src The source buffer to copy
+ * @update_param Type of parameter to be updated
+ *
+ * Return: Return the status of the updation.
+ */
+eHalStatus sme_update_roam_params(tHalHandle hHal,
+ uint8_t session_id, struct roam_ext_params roam_params_src,
+ int update_param)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+ struct roam_ext_params *roam_params_dst;
+ uint8_t i;
+
+ roam_params_dst = &pMac->roam.configParam.roam_params;
+ switch(update_param) {
+ case REASON_ROAM_EXT_SCAN_PARAMS_CHANGED:
+ roam_params_dst->raise_rssi_thresh_5g =
+ roam_params_src.raise_rssi_thresh_5g;
+ roam_params_dst->drop_rssi_thresh_5g =
+ roam_params_src.drop_rssi_thresh_5g;
+ roam_params_dst->raise_factor_5g=
+ roam_params_src.raise_factor_5g;
+ roam_params_dst->drop_factor_5g =
+ roam_params_src.drop_factor_5g;
+ roam_params_dst->max_drop_rssi_5g=
+ roam_params_src.max_drop_rssi_5g;
+ roam_params_dst->is_5g_pref_enabled = true;
+ break;
+ case REASON_ROAM_SET_SSID_ALLOWED:
+ vos_mem_set(&roam_params_dst->ssid_allowed_list, 0,
+ sizeof(tSirMacSSid) * MAX_SSID_ALLOWED_LIST);
+ roam_params_dst->num_ssid_allowed_list=
+ roam_params_src.num_ssid_allowed_list;
+ for (i=0; i<roam_params_dst->num_ssid_allowed_list; i++) {
+ roam_params_dst->ssid_allowed_list[i].length =
+ roam_params_src.ssid_allowed_list[i].length;
+ vos_mem_copy(roam_params_dst->ssid_allowed_list[i].ssId,
+ roam_params_src.ssid_allowed_list[i].ssId,
+ roam_params_dst->ssid_allowed_list[i].length);
+ }
+ break;
+ case REASON_ROAM_SET_FAVORED_BSSID:
+ vos_mem_set(&roam_params_dst->bssid_favored, 0,
+ sizeof(tSirMacAddr) * MAX_BSSID_FAVORED);
+ roam_params_dst->num_bssid_favored=
+ roam_params_src.num_bssid_favored;
+ for (i=0; i<roam_params_dst->num_bssid_favored; i++) {
+ vos_mem_copy(&roam_params_dst->bssid_favored[i],
+ &roam_params_src.bssid_favored[i],
+ sizeof(tSirMacAddr));
+ roam_params_dst->bssid_favored_factor[i] =
+ roam_params_src.bssid_favored_factor[i];
+ }
+ break;
+ case REASON_ROAM_SET_BLACKLIST_BSSID:
+ vos_mem_set(&roam_params_dst->bssid_avoid_list, 0,
+ sizeof(tSirMacAddr) * MAX_BSSID_AVOID_LIST);
+ roam_params_dst->num_bssid_avoid_list =
+ roam_params_src.num_bssid_avoid_list;
+ for (i=0; i<roam_params_dst->num_bssid_avoid_list; i++) {
+ vos_mem_copy(&roam_params_dst->bssid_avoid_list[i],
+ &roam_params_src.bssid_avoid_list[i],
+ sizeof(tSirMacAddr));
+ }
+ default:
+ break;
+ }
+ csrRoamOffloadScan(pMac, session_id, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+ update_param);
+ return 0;
+}
#ifdef WLAN_FEATURE_GTK_OFFLOAD
void sme_ProcessGetGtkInfoRsp( tHalHandle hHal,
tpSirGtkOffloadGetInfoRspParams pGtkOffloadGetInfoRsp)