summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMukul Sharma <mukul@codeaurora.org>2016-10-02 20:35:15 +0530
committerqcabuildsw <qcabuildsw@localhost>2016-10-17 21:57:33 -0700
commite8c919fcc56ef3db6e878b2eafcbcbfe81a37803 (patch)
treedd0eec32ddb5c9d2fce2d77f72d09adc196d94a0
parentfbd2c99c3667f4fe8aca600c3a20cb7fd48d128d (diff)
qcacld-3.0: Enhance EPNO feature
qcacld-2.0 to qcacld-3.0 propagation 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/src/wlan_hdd_cfg80211.h33
-rw-r--r--core/hdd/src/wlan_hdd_ext_scan.c104
-rw-r--r--core/mac/inc/sir_api.h24
-rw-r--r--core/sme/src/common/sme_api.c34
-rw-r--r--core/wma/src/wma_scan_roam.c32
5 files changed, 186 insertions, 41 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h
index c8d2f6b5c13f..2c9a81cfed79 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.h
+++ b/core/hdd/src/wlan_hdd_cfg80211.h
@@ -1901,6 +1901,30 @@ enum qca_wlan_epno_type {
* Unsigned 8-bit value; auth bit field for matching WPA IE
* @QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_TYPE
* Unsigned 8-bit to indicate ePNO type; values from qca_wlan_epno_type
+ *@QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_CHANNEL_LIST
+ * Nested attribute to send the channel list
+ *@QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_SCAN_INTERVAL
+ * Unsigned 32-bit value; indicates the Interval between PNO scan
+ * cycles in msec
+ *@QCA_WLAN_VENDOR_ATTR_EPNO_MIN5GHZ_RSSI
+ * Signed 32-bit value; minimum 5GHz RSSI for a BSSID to be considered
+ *@QCA_WLAN_VENDOR_ATTR_EPNO_MIN24GHZ_RSSI
+ * Signed 32-bit value; minimum 2.4GHz RSSI for a BSSID to be considered
+ * This attribute is obsolete now.
+ *@QCA_WLAN_VENDOR_ATTR_EPNO_INITIAL_SCORE_MAX
+ * Signed 32-bit value; the maximum score that a network
+ * can have before bonuses
+ *@QCA_WLAN_VENDOR_ATTR_EPNO_CURRENT_CONNECTION_BONUS
+ * 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_SAME_NETWORK_BONUS
+ * Signed 32-bit value; score bonus for all networks with
+ * the same network flag
+ *@QCA_WLAN_VENDOR_ATTR_EPNO_SECURE_BONUS
+ * Signed 32-bit value; score bonus for networks that are not open
+ *@QCA_WLAN_VENDOR_ATTR_EPNO_BAND5GHZ_BONUS
+ * Signed 32-bit value; 5GHz RSSI score bonus applied to all
+ * 5GHz networks
* @QCA_WLAN_VENDOR_ATTR_PNO_AFTER_LAST: After last
* @QCA_WLAN_VENDOR_ATTR_PNO_MAX: max
*/
@@ -1921,6 +1945,15 @@ enum qca_wlan_vendor_attr_pno_config_params {
QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_FLAGS = 11,
QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_AUTH_BIT = 12,
QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_TYPE = 13,
+ QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_CHANNEL_LIST = 14,
+ QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_SCAN_INTERVAL = 15,
+ QCA_WLAN_VENDOR_ATTR_EPNO_MIN5GHZ_RSSI = 16,
+ QCA_WLAN_VENDOR_ATTR_EPNO_MIN24GHZ_RSSI = 17,
+ QCA_WLAN_VENDOR_ATTR_EPNO_INITIAL_SCORE_MAX = 18,
+ QCA_WLAN_VENDOR_ATTR_EPNO_CURRENT_CONNECTION_BONUS = 19,
+ QCA_WLAN_VENDOR_ATTR_EPNO_SAME_NETWORK_BONUS = 20,
+ QCA_WLAN_VENDOR_ATTR_EPNO_SECURE_BONUS = 21,
+ QCA_WLAN_VENDOR_ATTR_EPNO_BAND5GHZ_BONUS = 22,
/* keep last */
QCA_WLAN_VENDOR_ATTR_PNO_AFTER_LAST,
diff --git a/core/hdd/src/wlan_hdd_ext_scan.c b/core/hdd/src/wlan_hdd_ext_scan.c
index 7dd23a0dee59..b81bab3665de 100644
--- a/core/hdd/src/wlan_hdd_ext_scan.c
+++ b/core/hdd/src/wlan_hdd_ext_scan.c
@@ -116,8 +116,6 @@ static const struct nla_policy wlan_hdd_extscan_config_policy
[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] = {
@@ -3795,16 +3793,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]) {
- hdd_err("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]);
- hdd_notice("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]) {
hdd_err("attr epno flags failed");
@@ -3883,12 +3871,24 @@ static int __wlan_hdd_cfg80211_set_epno_list(struct wiphy *wiphy,
hdd_err("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]);
- hdd_notice("num networks %u", num_networks);
+ if (num_networks > MAX_EPNO_NETWORKS) {
+ hdd_notice("num of nw: %d exceeded max: %d, resetting to: %d",
+ num_networks, MAX_EPNO_NETWORKS, MAX_EPNO_NETWORKS);
+ num_networks = MAX_EPNO_NETWORKS;
+ }
+
+ hdd_notice("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 = qdf_mem_malloc(len);
if (!req_msg) {
hdd_err("qdf_mem_malloc failed");
@@ -3909,8 +3909,80 @@ static int __wlan_hdd_cfg80211_set_epno_list(struct wiphy *wiphy,
req_msg->session_id = adapter->sessionId;
hdd_notice("Session Id %d", 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]) {
+ hdd_err("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]) {
+ hdd_err("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]) {
+ hdd_err("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]) {
+ hdd_err("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]) {
+ hdd_err("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]) {
+ hdd_err("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]) {
+ hdd_err("band_5ghz_bonus id failed");
+ goto fail;
+ }
+ req_msg->band_5ghz_bonus = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_EPNO_BAND5GHZ_BONUS]);
+
+ hdd_notice("min_5ghz_rssi: %d min_24ghz_rssi: %d",
+ req_msg->min_5ghz_rssi,
+ req_msg->min_24ghz_rssi);
+ hdd_notice("initial_score_max: %d current_connection_bonus:%d",
+ req_msg->initial_score_max,
+ req_msg->current_connection_bonus);
+ hdd_notice("Bonuses same_network: %d secure: %d band_5ghz: %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 (!QDF_IS_STATUS_SUCCESS(status)) {
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index 9d01e419afe6..e2e3db5a829d 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -4701,29 +4701,45 @@ typedef struct {
uint32_t buckets_scanned;
} 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/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index fe98f63d4264..e722c29895d1 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -13728,6 +13728,7 @@ QDF_STATUS sme_set_epno_list(tHalHandle hal,
sms_log(mac, LOG1, FL("enter"));
len = sizeof(*req_msg) +
(input->num_networks * sizeof(struct wifi_epno_network));
+
req_msg = qdf_mem_malloc(len);
if (!req_msg) {
sms_log(mac, LOGE, FL("qdf_mem_malloc failed"));
@@ -13738,17 +13739,28 @@ QDF_STATUS 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;
- qdf_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;
+ qdf_mem_copy(req_msg->networks[i].ssid.ssId,
+ input->networks[i].ssid.ssId,
+ req_msg->networks[i].ssid.length);
+ }
}
status = sme_acquire_global_lock(&mac->sme);
diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c
index 6394cae08551..cd9a03fca5fe 100644
--- a/core/wma/src/wma_scan_roam.c
+++ b/core/wma/src/wma_scan_roam.c
@@ -5412,16 +5412,28 @@ QDF_STATUS wma_set_epno_network_list(tp_wma_handle wma,
params->request_id = req->request_id;
params->session_id = req->session_id;
params->num_networks = req->num_networks;
- for (i = 0; i < req->num_networks; i++) {
- params->networks[i].rssi_threshold =
- req->networks[i].rssi_threshold;
- params->networks[i].auth_bit_field =
- req->networks[i].auth_bit_field;
- params->networks[i].flags = req->networks[i].flags;
- params->networks[i].ssid.length = req->networks[i].ssid.length;
- qdf_mem_copy(params->networks[i].ssid.mac_ssid,
- req->networks[i].ssid.ssId,
- WMI_MAC_MAX_SSID_LENGTH);
+
+ /* Fill only when num_networks are non zero */
+ if (req->num_networks) {
+ params->min_5ghz_rssi = req->min_5ghz_rssi;
+ params->min_24ghz_rssi = req->min_24ghz_rssi;
+ params->initial_score_max = req->initial_score_max;
+ params->same_network_bonus = req->same_network_bonus;
+ params->secure_bonus = req->secure_bonus;
+ params->band_5ghz_bonus = req->band_5ghz_bonus;
+ params->current_connection_bonus =
+ req->current_connection_bonus;
+
+ for (i = 0; i < req->num_networks; i++) {
+ params->networks[i].flags = req->networks[i].flags;
+ params->networks[i].auth_bit_field =
+ req->networks[i].auth_bit_field;
+ params->networks[i].ssid.length =
+ req->networks[i].ssid.length;
+ qdf_mem_copy(params->networks[i].ssid.mac_ssid,
+ req->networks[i].ssid.ssId,
+ WMI_MAC_MAX_SSID_LENGTH);
+ }
}
status = wmi_unified_set_epno_network_list_cmd(wma->wmi_handle, params);