summaryrefslogtreecommitdiff
path: root/umac
diff options
context:
space:
mode:
authorOm Prakash Tripathi <otripath@codeaurora.org>2018-02-23 16:56:09 +0530
committersnandini <snandini@codeaurora.org>2018-02-26 13:42:14 -0800
commit5e47d43331c6221512d4455ee17e32fa4492e7be (patch)
tree0b37985088d204ba7131d49b405b9bc093383992 /umac
parent8b221806acd81ed2f465493c2089cd9e6b0dfc7e (diff)
downloadqca-wfi-host-cmn-5e47d43331c6221512d4455ee17e32fa4492e7be.tar.gz
qcacmn: Add support to drop beacon if channel mismatch
Add support to drop beacon, probe response frames if frame receipt channel and channel mentioned in IEs dont match. Change-Id: Ib545f125dc53ccfb21abf6bdcb94a327ecde5a0a CRs-Fixed: 2149224
Diffstat (limited to 'umac')
-rw-r--r--umac/scan/core/src/wlan_scan_cache_db.c14
-rw-r--r--umac/scan/core/src/wlan_scan_main.h2
-rw-r--r--umac/scan/dispatcher/inc/wlan_scan_public_structs.h11
-rw-r--r--umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h23
-rw-r--r--umac/scan/dispatcher/src/wlan_scan_ucfg_api.c87
5 files changed, 100 insertions, 37 deletions
diff --git a/umac/scan/core/src/wlan_scan_cache_db.c b/umac/scan/core/src/wlan_scan_cache_db.c
index 9589737d4..fdcbec4a4 100644
--- a/umac/scan/core/src/wlan_scan_cache_db.c
+++ b/umac/scan/core/src/wlan_scan_cache_db.c
@@ -694,6 +694,20 @@ QDF_STATUS scm_handle_bcn_probe(struct scheduler_msg *msg)
scan_entry = scan_node->entry;
+ if (scan_obj->drop_bcn_on_chan_mismatch &&
+ scan_entry->channel_mismatch) {
+ scm_debug("Channel mismatch: Received %s from BSSID: %pM "
+ "tsf_delta = %u Seq Num: %x ssid:%.*s, rssi: %d",
+ (bcn->frm_type == MGMT_SUBTYPE_PROBE_RESP) ?
+ "Probe Rsp" : "Beacon", scan_entry->bssid.bytes,
+ scan_entry->tsf_delta, scan_entry->seq_num,
+ scan_entry->ssid.length, scan_entry->ssid.ssid,
+ scan_entry->rssi_raw);
+ util_scan_free_cache_entry(scan_entry);
+ qdf_mem_free(scan_node);
+ continue;
+ }
+
if (scan_obj->cb.update_beacon)
scan_obj->cb.update_beacon(pdev, scan_entry);
diff --git a/umac/scan/core/src/wlan_scan_main.h b/umac/scan/core/src/wlan_scan_main.h
index aa1ac5f1b..9b421b7a1 100644
--- a/umac/scan/core/src/wlan_scan_main.h
+++ b/umac/scan/core/src/wlan_scan_main.h
@@ -436,6 +436,7 @@ struct scan_cb {
* @bt_a2dp_enabled: if bt a2dp is enabled
* @miracast_enabled: miracast enabled
* @disable_timeout: command timeout disabled
+ * @drop_bcn_on_chan_mismatch: drop bcn if channel mismatch
* @scan_start_request_buff: buffer used to pass
* scan config to event handlers
*/
@@ -455,6 +456,7 @@ struct wlan_scan_obj {
bool bt_a2dp_enabled;
bool miracast_enabled;
bool disable_timeout;
+ bool drop_bcn_on_chan_mismatch;
struct scan_start_request scan_start_request_buff;
};
diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h
index 2c0422c0c..6a7dd4a6c 100644
--- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h
+++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h
@@ -1329,4 +1329,15 @@ typedef void (*update_beacon_cb) (struct wlan_objmgr_pdev *pdev,
*/
typedef QDF_STATUS (*scan_iterator_func) (void *arg,
struct scan_cache_entry *scan_entry);
+
+/**
+ * enum scan_priority - scan priority definitions
+ * @SCAN_CFG_DISABLE_SCAN_COMMAND_TIMEOUT: disable scan command timeout
+ * @SCAN_CFG_DROP_BCN_ON_CHANNEL_MISMATCH: config to drop beacon/probe
+ * response frames if received channel and IE channels do not match
+ */
+enum scan_config {
+ SCAN_CFG_DISABLE_SCAN_COMMAND_TIMEOUT,
+ SCAN_CFG_DROP_BCN_ON_CHANNEL_MISMATCH,
+};
#endif
diff --git a/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h b/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h
index ed0c86b21..7944fc624 100644
--- a/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h
+++ b/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h
@@ -200,23 +200,28 @@ QDF_STATUS ucfg_scan_set_miracast(
struct wlan_objmgr_psoc *psoc, bool enable);
/**
- * ucfg_scan_set_disable_timeout() - Public API to disable/enable scan timeout
- * @psoc: psoc on which scan timeout need to be disabled
- * @disable: disable scan timeout if true else enable scan timeout
+ * ucfg_scan_set_global_config() - Public API to set global scan config
+ * @psoc: psoc context
+ * @config: config to set
+ * @val: new config value
*
* Return: QDF_STATUS.
*/
QDF_STATUS
-ucfg_scan_set_disable_timeout(struct wlan_objmgr_psoc *psoc, bool disable);
+ucfg_scan_set_global_config(struct wlan_objmgr_psoc *psoc,
+ enum scan_config config, uint32_t val);
/**
- * ucfg_scan_get_disable_timeout() - Public API to get if scan timeout
- * is enabled or disabled
- * @psoc: psoc on which scan timeout status need to be checked
+ * ucfg_scan_get_global_config() - Public API to get global scan config
+ * @psoc: psoc context
+ * @config: config to set
+ * @val: uint32* to hold returned config value
*
- * Return: true if timeout is diaabled else false.
+ * Return: QDF_STATUS.
*/
-bool ucfg_scan_get_disable_timeout(struct wlan_objmgr_psoc *psoc);
+QDF_STATUS
+ucfg_scan_get_global_config(struct wlan_objmgr_psoc *psoc,
+ enum scan_config config, uint32_t *val);
/**
* ucfg_scan_set_wide_band_scan() - Public API to disable/enable wide band scan
diff --git a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c
index 6ae96cf93..1949accc5 100644
--- a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c
+++ b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c
@@ -950,34 +950,6 @@ QDF_STATUS ucfg_scan_set_miracast(
}
QDF_STATUS
-ucfg_scan_set_disable_timeout(struct wlan_objmgr_psoc *psoc, bool disable)
-{
- struct wlan_scan_obj *scan_obj;
-
- scan_obj = wlan_psoc_get_scan_obj(psoc);
- if (!scan_obj) {
- scm_err("Failed to get scan object");
- return QDF_STATUS_E_NULL_VALUE;
- }
- scan_obj->disable_timeout = disable;
- scm_debug("set disable_timeout to %d", scan_obj->disable_timeout);
-
- return QDF_STATUS_SUCCESS;
-}
-
-bool ucfg_scan_get_disable_timeout(struct wlan_objmgr_psoc *psoc)
-{
- struct wlan_scan_obj *scan_obj;
-
- scan_obj = wlan_psoc_get_scan_obj(psoc);
- if (!scan_obj) {
- scm_err("Failed to get scan object");
- return false;
- }
- return scan_obj->disable_timeout;
-}
-
-QDF_STATUS
ucfg_scan_set_wide_band_scan(struct wlan_objmgr_pdev *pdev, bool enable)
{
uint8_t pdev_id;
@@ -1309,6 +1281,7 @@ static QDF_STATUS
wlan_scan_global_init(struct wlan_scan_obj *scan_obj)
{
scan_obj->enable_scan = true;
+ scan_obj->drop_bcn_on_chan_mismatch = true;
scan_obj->disable_timeout = false;
scan_obj->scan_def.active_dwell = SCAN_ACTIVE_DWELL_TIME;
scan_obj->scan_def.passive_dwell = SCAN_PASSIVE_DWELL_TIME;
@@ -2147,3 +2120,61 @@ bool ucfg_scan_get_bt_activity(struct wlan_objmgr_psoc *psoc)
return scan_obj->bt_a2dp_enabled;
}
+
+QDF_STATUS
+ucfg_scan_set_global_config(struct wlan_objmgr_psoc *psoc,
+ enum scan_config config, uint32_t val)
+{
+ struct wlan_scan_obj *scan_obj;
+ QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+ scan_obj = wlan_psoc_get_scan_obj(psoc);
+ if (!scan_obj) {
+ scm_err("Failed to get scan object config:%d, val:%d",
+ config, val);
+ return QDF_STATUS_E_INVAL;
+ }
+ switch (config) {
+ case SCAN_CFG_DISABLE_SCAN_COMMAND_TIMEOUT:
+ scan_obj->disable_timeout = !!val;
+ break;
+ case SCAN_CFG_DROP_BCN_ON_CHANNEL_MISMATCH:
+ scan_obj->drop_bcn_on_chan_mismatch = !!val;
+ break;
+
+ default:
+ status = QDF_STATUS_E_INVAL;
+ break;
+ }
+
+ return status;
+}
+
+QDF_STATUS
+ucfg_scan_get_global_config(struct wlan_objmgr_psoc *psoc,
+ enum scan_config config, uint32_t *val)
+{
+ struct wlan_scan_obj *scan_obj;
+ QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+ scan_obj = wlan_psoc_get_scan_obj(psoc);
+ if (!scan_obj || !val) {
+ scm_err("scan object:%pK config:%d, val:0x%pK",
+ scan_obj, config, val);
+ return QDF_STATUS_E_INVAL;
+ }
+ switch (config) {
+ case SCAN_CFG_DISABLE_SCAN_COMMAND_TIMEOUT:
+ *val = scan_obj->disable_timeout;
+ break;
+ case SCAN_CFG_DROP_BCN_ON_CHANNEL_MISMATCH:
+ *val = scan_obj->drop_bcn_on_chan_mismatch;
+ break;
+
+ default:
+ status = QDF_STATUS_E_INVAL;
+ break;
+ }
+
+ return status;
+}