Browse Source

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
Sandeep Puligilla 7 years ago
parent
commit
c6764593d5

+ 43 - 22
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);
-
-	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");
-		goto free_nbuf;
+
+	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;
+		}
+
+		scan_node = qdf_container_of(next_node,
+			struct scan_cache_node, node);
+
+		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)

+ 2 - 2
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);
 

+ 27 - 3
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