diff options
author | Om Prakash Tripathi <otripath@codeaurora.org> | 2018-02-23 16:56:09 +0530 |
---|---|---|
committer | snandini <snandini@codeaurora.org> | 2018-02-26 13:42:14 -0800 |
commit | 5e47d43331c6221512d4455ee17e32fa4492e7be (patch) | |
tree | 0b37985088d204ba7131d49b405b9bc093383992 /umac | |
parent | 8b221806acd81ed2f465493c2089cd9e6b0dfc7e (diff) | |
download | qca-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.c | 14 | ||||
-rw-r--r-- | umac/scan/core/src/wlan_scan_main.h | 2 | ||||
-rw-r--r-- | umac/scan/dispatcher/inc/wlan_scan_public_structs.h | 11 | ||||
-rw-r--r-- | umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h | 23 | ||||
-rw-r--r-- | umac/scan/dispatcher/src/wlan_scan_ucfg_api.c | 87 |
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; +} |