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