From c6764593d5839f85e30e317e5ef2e506af13d951 Mon Sep 17 00:00:00 2001 From: Sandeep Puligilla Date: Tue, 5 Dec 2017 21:01:52 -0800 Subject: [PATCH] qcacmn: Extend beacon parse util functionality Beacon parse util API currently returns only one scan cache entry to the caller. Extended the beacon parse api to return list of scan cache entries in scenarios like mbssid Change-Id: Ia362cda4fdbc9955966696484869fee6ac2d0a22 CRs-Fixed: 2154753 --- umac/scan/core/src/wlan_scan_cache_db.c | 59 +++++++++++++------ .../scan/dispatcher/inc/wlan_scan_utils_api.h | 4 +- .../scan/dispatcher/src/wlan_scan_utils_api.c | 30 +++++++++- 3 files changed, 69 insertions(+), 24 deletions(-) diff --git a/umac/scan/core/src/wlan_scan_cache_db.c b/umac/scan/core/src/wlan_scan_cache_db.c index 64c3de968860..04996bcdb425 100644 --- a/umac/scan/core/src/wlan_scan_cache_db.c +++ b/umac/scan/core/src/wlan_scan_cache_db.c @@ -587,10 +587,13 @@ QDF_STATUS scm_handle_bcn_probe(struct scheduler_msg *msg) struct scan_cache_entry *scan_entry; struct wlan_scan_obj *scan_obj; struct scan_dbs *scan_db; - QDF_STATUS status; + qdf_list_t *scan_list = NULL; + QDF_STATUS status = QDF_STATUS_SUCCESS; + uint32_t list_count, i; + qdf_list_node_t *next_node = NULL; + struct scan_cache_node *scan_node; bcn = msg->bodyptr; - if (!bcn) { scm_err("bcn is NULL"); return QDF_STATUS_E_INVAL; @@ -635,36 +638,54 @@ QDF_STATUS scm_handle_bcn_probe(struct scheduler_msg *msg) goto free_nbuf; } - scan_entry = + scan_list = util_scan_unpack_beacon_frame(qdf_nbuf_data(bcn->buf), qdf_nbuf_len(bcn->buf), bcn->frm_type, bcn->rx_data); - if (!scan_entry) { + if (!scan_list || qdf_list_empty(scan_list)) { scm_err("failed to unpack frame"); status = QDF_STATUS_E_INVAL; goto free_nbuf; } - scm_info("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); - if (scan_obj->cb.update_beacon) - scan_obj->cb.update_beacon(pdev, scan_entry); + list_count = qdf_list_size(scan_list); + for (i = 0; i < list_count; i++) { + status = qdf_list_remove_front(scan_list, &next_node); + if (QDF_IS_STATUS_ERROR(status) || next_node == NULL) { + scm_err("failed to unpack frame"); + status = QDF_STATUS_E_INVAL; + goto free_nbuf; + } - if (scan_obj->cb.inform_beacon) - scan_obj->cb.inform_beacon(pdev, scan_entry); + scan_node = qdf_container_of(next_node, + struct scan_cache_node, node); - status = scm_add_update_entry(scan_db, scan_entry); - if (QDF_IS_STATUS_ERROR(status)) { - util_scan_free_cache_entry(scan_entry); - scm_err("failed to add entry"); - goto free_nbuf; + scan_entry = scan_node->entry; + scm_info("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); + + if (scan_obj->cb.update_beacon) + scan_obj->cb.update_beacon(pdev, scan_entry); + + if (scan_obj->cb.inform_beacon) + scan_obj->cb.inform_beacon(pdev, scan_entry); + + status = scm_add_update_entry(scan_db, scan_entry); + if (QDF_IS_STATUS_ERROR(status)) { + util_scan_free_cache_entry(scan_entry); + scm_err("failed to add entry"); + } + qdf_mem_free(scan_node); } free_nbuf: + if (scan_list) + qdf_mem_free(scan_list); if (bcn->psoc) wlan_objmgr_psoc_release_ref(bcn->psoc, WLAN_SCAN_ID); if (pdev) diff --git a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h index c093cbd7b9c9..15f600189868 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h +++ b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h @@ -54,9 +54,9 @@ bool util_is_scan_entry_match( * * get the defaults scan params * - * Return: unpacked scan entry. + * Return: unpacked list of scan entries. */ -struct scan_cache_entry *util_scan_unpack_beacon_frame( +qdf_list_t *util_scan_unpack_beacon_frame( uint8_t *frame, qdf_size_t frame_len, uint32_t frm_subtype, struct mgmt_rx_event_params *rx_param); diff --git a/umac/scan/dispatcher/src/wlan_scan_utils_api.c b/umac/scan/dispatcher/src/wlan_scan_utils_api.c index 2943b903826c..a380bb6b50af 100644 --- a/umac/scan/dispatcher/src/wlan_scan_utils_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_utils_api.c @@ -719,7 +719,7 @@ static int util_scan_scm_calc_nss_supported_by_ap( return 1; } -struct scan_cache_entry * +qdf_list_t * util_scan_unpack_beacon_frame(uint8_t *frame, qdf_size_t frame_len, uint32_t frm_subtype, struct mgmt_rx_event_params *rx_param) @@ -728,12 +728,22 @@ util_scan_unpack_beacon_frame(uint8_t *frame, struct wlan_bcn_frame *bcn; QDF_STATUS status; struct ie_ssid *ssid; - struct scan_cache_entry *scan_entry = NULL; + struct scan_cache_entry *scan_entry; struct qbss_load_ie *qbss_load; + qdf_list_t *scan_list; + struct scan_cache_node *scan_node; + + scan_list = qdf_mem_malloc(sizeof(*scan_list)); + if (!scan_list) { + scm_err("failed to allocate scan_list"); + return NULL; + } + qdf_list_create(scan_list, MAX_SCAN_CACHE_SIZE); scan_entry = qdf_mem_malloc(sizeof(*scan_entry)); if (!scan_entry) { scm_err("failed to allocate memory for scan_entry"); + qdf_mem_free(scan_list); return NULL; } scan_entry->raw_frame.ptr = @@ -741,6 +751,7 @@ util_scan_unpack_beacon_frame(uint8_t *frame, if (!scan_entry->raw_frame.ptr) { scm_err("failed to allocate memory for frame"); qdf_mem_free(scan_entry); + qdf_mem_free(scan_list); return NULL; } @@ -788,12 +799,14 @@ util_scan_unpack_beacon_frame(uint8_t *frame, scm_err("failed to parse beacon IE"); qdf_mem_free(scan_entry->raw_frame.ptr); qdf_mem_free(scan_entry); + qdf_mem_free(scan_list); return NULL; } if (!scan_entry->ie_list.rates) { qdf_mem_free(scan_entry->raw_frame.ptr); qdf_mem_free(scan_entry); + qdf_mem_free(scan_list); return NULL; } @@ -803,6 +816,7 @@ util_scan_unpack_beacon_frame(uint8_t *frame, if (ssid && (ssid->ssid_len > WLAN_SSID_MAX_LEN)) { qdf_mem_free(scan_entry->raw_frame.ptr); qdf_mem_free(scan_entry); + qdf_mem_free(scan_list); return NULL; } @@ -840,8 +854,18 @@ util_scan_unpack_beacon_frame(uint8_t *frame, if (qbss_load) scan_entry->qbss_chan_load = qbss_load->qbss_chan_load; + scan_node = qdf_mem_malloc(sizeof(*scan_node)); + if (!scan_node) { + qdf_mem_free(scan_entry); + qdf_mem_free(scan_list); + return NULL; + } + + scan_node->entry = scan_entry; + qdf_list_insert_front(scan_list, &scan_node->node); + /* TODO calculate channel struct */ - return scan_entry; + return scan_list; } QDF_STATUS