summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMukul Sharma <mukul@qti.qualcomm.com>2015-12-23 17:58:42 +0530
committerSrinivas Girigowda <sgirigow@codeaurora.org>2016-01-14 22:06:26 -0800
commit0eb883c663b78d5bffef162756e3e1836dd910b9 (patch)
treec9d426a718c70f9414d7d9a3963ddce0124d6c19
parent655389ffc3f35a39aeb7b5112c82a8d7c1765209 (diff)
qcacld-2.0: Enhance EPNO feature
Make the following enhancements to the EPNO feature: 1) Implement the reset EPNO command handler 2) Add new parameters for candidate score calculation. Change-Id: Iad1ff9c2b003c9e3ddbc3373366686040ccb55ca CRs-Fixed: 956649
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg80211.h40
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c106
-rw-r--r--CORE/MAC/inc/sirApi.h24
-rw-r--r--CORE/SERVICES/WMA/wma.c133
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c36
5 files changed, 263 insertions, 76 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index 4b78b372f643..981c48de2bea 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -1217,6 +1217,7 @@ enum qca_wlan_vendor_attr_pno_config_params {
QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_SSID = 9,
/* Signed 8-bit value; threshold for considering this SSID as found,
* required granularity for this threshold is 4dBm to 8dBm
+ * This attribute is obsolete.
*/
QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_RSSI_THRESHOLD = 10,
/* Unsigned 8-bit value; WIFI_PNO_FLAG_XXX */
@@ -1229,6 +1230,43 @@ enum qca_wlan_vendor_attr_pno_config_params {
*/
QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_TYPE = 13,
+ /* Nested attribute to send the channel list */
+ QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_CHANNEL_LIST = 14,
+
+ /* Unsigned 32-bit value; indicates the Interval between PNO scan
+ * cycles in msec
+ */
+ QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_SCAN_INTERVAL = 15,
+ /* Signed 32-bit value; minimum 5GHz RSSI for a BSSID to be
+ * considered
+ */
+ QCA_WLAN_VENDOR_ATTR_EPNO_MIN5GHZ_RSSI = 16,
+ /* Signed 32-bit value; minimum 2.4GHz RSSI for a BSSID to
+ * be considered
+ */
+ QCA_WLAN_VENDOR_ATTR_EPNO_MIN24GHZ_RSSI = 17,
+ /* Signed 32-bit value; the maximum score that a network
+ * can have before bonuses
+ */
+ QCA_WLAN_VENDOR_ATTR_EPNO_INITIAL_SCORE_MAX = 18,
+ /* Signed 32-bit value; only report when there is a network's
+ * score this much higher han the current connection
+ */
+ QCA_WLAN_VENDOR_ATTR_EPNO_CURRENT_CONNECTION_BONUS = 19,
+ /* Signed 32-bit value; score bonus for all networks with
+ * the same network flag
+ */
+ QCA_WLAN_VENDOR_ATTR_EPNO_SAME_NETWORK_BONUS = 20,
+ /* Signed 32-bit value; score bonus for networks that are
+ * not open
+ */
+ QCA_WLAN_VENDOR_ATTR_EPNO_SECURE_BONUS = 21,
+ /* Signed 32-bit value; 5GHz RSSI score bonus
+ * applied to all 5GHz networks
+ */
+ QCA_WLAN_VENDOR_ATTR_EPNO_BAND5GHZ_BONUS = 22,
+
+
/* keep last */
QCA_WLAN_VENDOR_ATTR_PNO_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_PNO_MAX =
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index a502602157f5..b2d3b39dd8e2 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -848,7 +848,6 @@ wlan_hdd_extscan_config_policy[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_
[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_NUM_NETWORKS] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_SSID] = { .type = NLA_BINARY,
.len = IEEE80211_MAX_SSID_LEN },
- [QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_RSSI_THRESHOLD] = { .type = NLA_S8 },
[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_FLAGS] = { .type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_AUTH_BIT] = { .type = NLA_U8 },
[QCA_WLAN_VENDOR_ATTR_EXTSCAN_SSID_THRESHOLD_PARAM_SSID] = { .type = NLA_BINARY,
@@ -4717,16 +4716,6 @@ static int hdd_extscan_epno_fill_network_list(
req_msg->networks[index].ssid.length,
req_msg->networks[index].ssid.ssId);
- /* Parse and fetch rssi threshold */
- if (!network[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_RSSI_THRESHOLD]) {
- hddLog(LOGE, FL("attr rssi threshold failed"));
- return -EINVAL;
- }
- req_msg->networks[index].rssi_threshold = nla_get_s8(
- network[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_RSSI_THRESHOLD]);
- hddLog(LOG1, FL("rssi threshold %d"),
- req_msg->networks[index].rssi_threshold);
-
/* Parse and fetch epno flags */
if (!network[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_FLAGS]) {
hddLog(LOGE, FL("attr epno flags failed"));
@@ -4801,12 +4790,24 @@ static int __wlan_hdd_cfg80211_set_epno_list(struct wiphy *wiphy,
hddLog(LOGE, FL("attr num networks failed"));
return -EINVAL;
}
+ /*
+ * num_networks is also used as EPNO SET/RESET request.
+ * if num_networks is zero then it is treated as RESET.
+ */
num_networks = nla_get_u32(
- tb[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_NUM_NETWORKS]);
- hddLog(LOG1, FL("num networks %u"), num_networks);
+ tb[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_NUM_NETWORKS]);
+ if (num_networks > MAX_EPNO_NETWORKS) {
+ hddLog(LOG1,
+ FL("input num_networks: %d exceeded max: %d, hence reset to: %d"),
+ num_networks, MAX_EPNO_NETWORKS, MAX_EPNO_NETWORKS);
+ num_networks = MAX_EPNO_NETWORKS;
+ }
+
+ hddLog(LOG1, FL("num networks %u"), num_networks);
len = sizeof(*req_msg) +
- (num_networks * sizeof(struct wifi_epno_network));
+ (num_networks * sizeof(struct wifi_epno_network));
+
req_msg = vos_mem_malloc(len);
if (!req_msg) {
hddLog(LOGE, FL("vos_mem_malloc failed"));
@@ -4827,8 +4828,81 @@ static int __wlan_hdd_cfg80211_set_epno_list(struct wiphy *wiphy,
hddLog(LOG1, FL("Req Id %u Session Id %d"),
req_msg->request_id, req_msg->session_id);
- if (hdd_extscan_epno_fill_network_list(hdd_ctx, req_msg, tb))
- goto fail;
+ if (num_networks) {
+
+ /* Parse and fetch min_5ghz_rssi */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_EPNO_MIN5GHZ_RSSI]) {
+ hddLog(LOGE, FL("min_5ghz_rssi id failed"));
+ goto fail;
+ }
+ req_msg->min_5ghz_rssi = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_EPNO_MIN5GHZ_RSSI]);
+
+ /* Parse and fetch min_24ghz_rssi */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_EPNO_MIN24GHZ_RSSI]) {
+ hddLog(LOGE, FL("min_24ghz_rssi id failed"));
+ goto fail;
+ }
+ req_msg->min_24ghz_rssi = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_EPNO_MIN24GHZ_RSSI]);
+
+ /* Parse and fetch initial_score_max */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_EPNO_INITIAL_SCORE_MAX]) {
+ hddLog(LOGE, FL("initial_score_max id failed"));
+ goto fail;
+ }
+ req_msg->initial_score_max = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_EPNO_INITIAL_SCORE_MAX]);
+
+ /* Parse and fetch current_connection_bonus */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_EPNO_CURRENT_CONNECTION_BONUS]) {
+ hddLog(LOGE, FL("current_connection_bonus id failed"));
+ goto fail;
+ }
+ req_msg->current_connection_bonus = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_EPNO_CURRENT_CONNECTION_BONUS]
+ );
+
+ /* Parse and fetch same_network_bonus */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_EPNO_SAME_NETWORK_BONUS]) {
+ hddLog(LOGE, FL("same_network_bonus id failed"));
+ goto fail;
+ }
+ req_msg->same_network_bonus = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_EPNO_SAME_NETWORK_BONUS]);
+
+ /* Parse and fetch secure_bonus */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_EPNO_SECURE_BONUS]) {
+ hddLog(LOGE, FL("secure_bonus id failed"));
+ goto fail;
+ }
+ req_msg->secure_bonus = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_EPNO_SECURE_BONUS]);
+
+ /* Parse and fetch band_5ghz_bonus */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_EPNO_BAND5GHZ_BONUS]) {
+ hddLog(LOGE, FL("band_5ghz_bonus id failed"));
+ goto fail;
+ }
+ req_msg->band_5ghz_bonus = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_EPNO_BAND5GHZ_BONUS]);
+
+ hddLog(LOG1,
+ FL("min_5ghz_rssi: %d min_24ghz_rssi: %d initial_score_max: %d current_connection_bonus: %d"),
+ req_msg->min_5ghz_rssi,
+ req_msg->min_24ghz_rssi,
+ req_msg->initial_score_max,
+ req_msg->current_connection_bonus);
+ hddLog(LOG1,
+ FL("same_network_bonus: %d secure_bonus: %d band_5ghz_bonus: %d"),
+ req_msg->same_network_bonus,
+ req_msg->secure_bonus,
+ req_msg->band_5ghz_bonus);
+
+ if (hdd_extscan_epno_fill_network_list(hdd_ctx, req_msg, tb))
+ goto fail;
+
+ }
status = sme_set_epno_list(hdd_ctx->hHal, req_msg);
if (!HAL_STATUS_SUCCESS(status)) {
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 71798c71cea2..799b11fa49ea 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -5412,31 +5412,47 @@ typedef struct
} tSirExtScanOnScanEventIndParams,
*tpSirExtScanOnScanEventIndParams;
+#define MAX_EPNO_NETWORKS 64
+
/**
* struct wifi_epno_network - enhanced pno network block
* @ssid: ssid
- * @rssi_threshold: threshold for considering this SSID as found, required
- * granularity for this threshold is 4dBm to 8dBm
* @flags: WIFI_PNO_FLAG_XXX
* @auth_bit_field: auth bit field for matching WPA IE
*/
struct wifi_epno_network
{
tSirMacSSid ssid;
- int8_t rssi_threshold;
uint8_t flags;
uint8_t auth_bit_field;
};
/**
* struct wifi_epno_params - enhanced pno network params
+ * @request_id: request id number
+ * @session_id: session_id number
+ * @min_5ghz_rssi: minimum 5GHz RSSI for a BSSID to be considered
+ * @min_24ghz_rssi: minimum 2.4GHz RSSI for a BSSID to be considered
+ * @initial_score_max: maximum score that a network can have before bonuses
+ * @current_connection_bonus: only report when there is a network's score this
+ * much higher than the current connection
+ * @same_network_bonus: score bonus for all n/w with the same network flag
+ * @secure_bonus: score bonus for networks that are not open
+ * @band_5ghz_bonus: 5GHz RSSI score bonus (applied to all 5GHz networks)
* @num_networks: number of ssids
- * @networks: PNO networks
+ * @networks: EPNO networks
*/
struct wifi_epno_params
{
uint32_t request_id;
uint32_t session_id;
+ uint32_t min_5ghz_rssi;
+ uint32_t min_24ghz_rssi;
+ uint32_t initial_score_max;
+ uint32_t current_connection_bonus;
+ uint32_t same_network_bonus;
+ uint32_t secure_bonus;
+ uint32_t band_5ghz_bonus;
uint32_t num_networks;
struct wifi_epno_network networks[];
};
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index e23c3414767d..aac2ea94626f 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -25691,6 +25691,7 @@ static int wma_set_epno_network_list(tp_wma_handle wma,
{
wmi_nlo_config_cmd_fixed_param *cmd;
nlo_configured_parameters *nlo_list;
+ enlo_candidate_score_params *cand_score_params;
u_int8_t i, *buf_ptr;
wmi_buf_t buf;
uint32_t len;
@@ -25708,11 +25709,22 @@ static int wma_set_epno_network_list(tp_wma_handle wma,
return -EINVAL;
}
- /* TLV place holder for array of structures
- * nlo_configured_parameters(nlo_list) */
- len = sizeof(*cmd) + WMI_TLV_HDR_SIZE;
- len += sizeof(nlo_configured_parameters) *
- MIN(req->num_networks, WMI_NLO_MAX_SSIDS);
+ /* Fixed Params */
+ len = sizeof(*cmd);
+ if (req->num_networks) {
+ /* TLV place holder for array of structures
+ * then each nlo_configured_parameters(nlo_list) TLV.
+ */
+ len += WMI_TLV_HDR_SIZE;
+ len += (sizeof(nlo_configured_parameters)
+ * VOS_MIN(req->num_networks, WMI_NLO_MAX_SSIDS));
+ /* TLV for array of uint32 channel_list */
+ len += WMI_TLV_HDR_SIZE;
+ /* TLV for nlo_channel_prediction_cfg */
+ len += WMI_TLV_HDR_SIZE;
+ /* TLV for candidate score params */
+ len += sizeof(enlo_candidate_score_params);
+ }
buf = wmi_buf_alloc(wma->wmi_handle, len);
if (!buf) {
@@ -25728,53 +25740,88 @@ static int wma_set_epno_network_list(tp_wma_handle wma,
WMITLV_GET_STRUCT_TLVLEN(
wmi_nlo_config_cmd_fixed_param));
cmd->vdev_id = req->session_id;
- cmd->flags = WMI_NLO_CONFIG_ENLO;
+
+ /* set flag to reset if num of networks are 0 */
+ cmd->flags = (req->num_networks == 0 ?
+ WMI_NLO_CONFIG_ENLO_RESET : WMI_NLO_CONFIG_ENLO);
buf_ptr += sizeof(wmi_nlo_config_cmd_fixed_param);
cmd->no_of_ssids = MIN(req->num_networks, WMI_NLO_MAX_SSIDS);
- WMA_LOGD("SSID count: %d", cmd->no_of_ssids);
- WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
- cmd->no_of_ssids * sizeof(nlo_configured_parameters));
- buf_ptr += WMI_TLV_HDR_SIZE;
-
- nlo_list = (nlo_configured_parameters *) buf_ptr;
- for (i = 0; i < cmd->no_of_ssids; i++) {
- WMITLV_SET_HDR(&nlo_list[i].tlv_header,
- WMITLV_TAG_ARRAY_BYTE,
- WMITLV_GET_STRUCT_TLVLEN(nlo_configured_parameters));
- /* Copy ssid and it's length */
- nlo_list[i].ssid.valid = TRUE;
- nlo_list[i].ssid.ssid.ssid_len = req->networks[i].ssid.length;
- vos_mem_copy(nlo_list[i].ssid.ssid.ssid,
- req->networks[i].ssid.ssId,
- nlo_list[i].ssid.ssid.ssid_len);
- WMA_LOGD("index: %d ssid: %.*s len: %d", i,
- nlo_list[i].ssid.ssid.ssid_len,
- (char *) nlo_list[i].ssid.ssid.ssid,
- nlo_list[i].ssid.ssid.ssid_len);
+ WMA_LOGD(FL("SSID count: %d flags: %d"),
+ cmd->no_of_ssids, cmd->flags);
- /* Copy rssi threshold */
- nlo_list[i].rssi_cond.valid = TRUE;
- nlo_list[i].rssi_cond.rssi =
- req->networks[i].rssi_threshold;
- WMA_LOGD("RSSI threshold : %d dBm",
- nlo_list[i].rssi_cond.rssi);
+ /* Fill nlo_config only when num_networks are non zero */
+ if (cmd->no_of_ssids) {
+ /* Fill networks */
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+ cmd->no_of_ssids * sizeof(nlo_configured_parameters));
+ buf_ptr += WMI_TLV_HDR_SIZE;
- /* Copy pno flags */
- nlo_list[i].bcast_nw_type.valid = TRUE;
- nlo_list[i].bcast_nw_type.bcast_nw_type =
- req->networks[i].flags;
- WMA_LOGD("PNO flags (%u)",
+ nlo_list = (nlo_configured_parameters *) buf_ptr;
+ for (i = 0; i < cmd->no_of_ssids; i++) {
+ WMITLV_SET_HDR(&nlo_list[i].tlv_header,
+ WMITLV_TAG_ARRAY_BYTE,
+ WMITLV_GET_STRUCT_TLVLEN
+ (nlo_configured_parameters));
+ /* Copy ssid and it's length */
+ nlo_list[i].ssid.valid = TRUE;
+ nlo_list[i].ssid.ssid.ssid_len =
+ req->networks[i].ssid.length;
+ vos_mem_copy(nlo_list[i].ssid.ssid.ssid,
+ req->networks[i].ssid.ssId,
+ nlo_list[i].ssid.ssid.ssid_len);
+ WMA_LOGD("index: %d ssid: %.*s len: %d", i,
+ nlo_list[i].ssid.ssid.ssid_len,
+ (char *) nlo_list[i].ssid.ssid.ssid,
+ nlo_list[i].ssid.ssid.ssid_len);
+
+ /* Copy pno flags */
+ nlo_list[i].bcast_nw_type.valid = TRUE;
+ nlo_list[i].bcast_nw_type.bcast_nw_type =
+ req->networks[i].flags;
+ WMA_LOGD("PNO flags (%u)",
nlo_list[i].bcast_nw_type.bcast_nw_type);
- /* Copy auth bit field */
- nlo_list[i].auth_type.valid = TRUE;
- nlo_list[i].auth_type.auth_type =
- req->networks[i].auth_bit_field;
- WMA_LOGD("Auth bit field (%u)",
- nlo_list[i].auth_type.auth_type);
+ /* Copy auth bit field */
+ nlo_list[i].auth_type.valid = TRUE;
+ nlo_list[i].auth_type.auth_type =
+ req->networks[i].auth_bit_field;
+ WMA_LOGD("Auth bit field (%u)",
+ nlo_list[i].auth_type.auth_type);
+ }
+
+ buf_ptr += cmd->no_of_ssids * sizeof(nlo_configured_parameters);
+
+ /* Fill the channel list */
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32, 0);
+ buf_ptr += WMI_TLV_HDR_SIZE;
+
+ /* Fill prediction_param */
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, 0);
+ buf_ptr += WMI_TLV_HDR_SIZE;
+
+ /* Fill epno candidate score params */
+ cand_score_params = (enlo_candidate_score_params *) buf_ptr;
+ WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_STRUC_enlo_candidate_score_param,
+ WMITLV_GET_STRUCT_TLVLEN(enlo_candidate_score_params));
+ cand_score_params->min5GHz_rssi =
+ req->min_5ghz_rssi;
+ cand_score_params->min24GHz_rssi =
+ req->min_24ghz_rssi;
+ cand_score_params->initial_score_max =
+ req->initial_score_max;
+ cand_score_params->current_connection_bonus =
+ req->current_connection_bonus;
+ cand_score_params->same_network_bonus =
+ req->same_network_bonus;
+ cand_score_params->secure_bonus =
+ req->secure_bonus;
+ cand_score_params->band5GHz_bonus =
+ req->band_5ghz_bonus;
+ buf_ptr += sizeof(enlo_candidate_score_params);
}
+
ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID);
if (ret) {
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index ca0331bbf825..e61ffd110474 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -15345,7 +15345,8 @@ eHalStatus sme_set_epno_list(tHalHandle hal,
smsLog(mac, LOG1, FL("enter"));
len = sizeof(*req_msg) +
- (input->num_networks * sizeof(struct wifi_epno_network));
+ (input->num_networks * sizeof(struct wifi_epno_network));
+
req_msg = vos_mem_malloc(len);
if (!req_msg) {
smsLog(mac, LOGE, FL("vos_mem_malloc failed"));
@@ -15356,17 +15357,28 @@ eHalStatus sme_set_epno_list(tHalHandle hal,
req_msg->num_networks = input->num_networks;
req_msg->request_id = input->request_id;
req_msg->session_id = input->session_id;
- for (i = 0; i < req_msg->num_networks; i++) {
- req_msg->networks[i].rssi_threshold =
- input->networks[i].rssi_threshold;
- req_msg->networks[i].flags = input->networks[i].flags;
- req_msg->networks[i].auth_bit_field =
- input->networks[i].auth_bit_field;
- req_msg->networks[i].ssid.length =
- input->networks[i].ssid.length;
- vos_mem_copy(req_msg->networks[i].ssid.ssId,
- input->networks[i].ssid.ssId,
- req_msg->networks[i].ssid.length);
+
+ /* Fill only when num_networks are non zero */
+ if (req_msg->num_networks) {
+ req_msg->min_5ghz_rssi = input->min_5ghz_rssi;
+ req_msg->min_24ghz_rssi = input->min_24ghz_rssi;
+ req_msg->initial_score_max = input->initial_score_max;
+ req_msg->same_network_bonus = input->same_network_bonus;
+ req_msg->secure_bonus = input->secure_bonus;
+ req_msg->band_5ghz_bonus = input->band_5ghz_bonus;
+ req_msg->current_connection_bonus =
+ input->current_connection_bonus;
+
+ for (i = 0; i < req_msg->num_networks; i++) {
+ req_msg->networks[i].flags = input->networks[i].flags;
+ req_msg->networks[i].auth_bit_field =
+ input->networks[i].auth_bit_field;
+ req_msg->networks[i].ssid.length =
+ input->networks[i].ssid.length;
+ vos_mem_copy(req_msg->networks[i].ssid.ssId,
+ input->networks[i].ssid.ssId,
+ req_msg->networks[i].ssid.length);
+ }
}
status = sme_AcquireGlobalLock(&mac->sme);