qcacmn: Add support to update mlme info in scan db
Add missing support to update mlme related info in scan db
Change-Id: Ib69a07012536b9b423992f5f4199925febabcb91
CRs-Fixed: 2086351
diff --git a/umac/scan/core/src/wlan_scan_cache_db.c b/umac/scan/core/src/wlan_scan_cache_db.c
index b0c11b8..8940993 100644
--- a/umac/scan/core/src/wlan_scan_cache_db.c
+++ b/umac/scan/core/src/wlan_scan_cache_db.c
@@ -356,6 +356,21 @@
}
/**
+ * scm_update_mlme_info() - update mlme info
+ * @src: source scan entry
+ * @dest: destination scan entry
+ *
+ * Return: void
+ */
+static inline void
+scm_update_mlme_info(struct scan_cache_entry *src,
+ struct scan_cache_entry *dest)
+{
+ qdf_mem_copy(&dest->mlme_info, &src->mlme_info,
+ sizeof(struct mlme_info));
+}
+
+/**
* scm_delete_duplicate_entry() - remove duplicate node entry
* @scan_db: scan database
* @scan_params: new entry to be added
@@ -433,6 +448,9 @@
/* copy wsn ie from scan_entry to scan_params*/
scm_update_alt_wcn_ie(scan_entry, scan_params);
+ /* copy mlme info from scan_entry to scan_params*/
+ scm_update_mlme_info(scan_entry, scan_params);
+
/* Mark delete the duplicate node */
scm_scan_entry_put_ref(scan_db, scan_node, true);
}
@@ -1132,3 +1150,47 @@
return QDF_STATUS_SUCCESS;
}
+
+QDF_STATUS scm_update_scan_mlme_info(struct wlan_objmgr_pdev *pdev,
+ struct scan_cache_entry *entry)
+{
+ uint8_t hash_idx;
+ struct scan_dbs *scan_db;
+ struct scan_cache_node *cur_node;
+ struct scan_cache_node *next_node = NULL;
+ struct wlan_objmgr_psoc *psoc;
+
+ psoc = wlan_pdev_get_psoc(pdev);
+ if (!psoc) {
+ scm_err("psoc is NULL");
+ return QDF_STATUS_E_INVAL;
+ }
+ scan_db = wlan_pdev_get_scan_db(psoc, pdev);
+ if (!scan_db) {
+ scm_err("scan_db is NULL");
+ return QDF_STATUS_E_INVAL;
+ }
+
+ hash_idx = SCAN_GET_HASH(entry->bssid.bytes);
+
+ cur_node = scm_get_next_node(scan_db,
+ &scan_db->scan_hash_tbl[hash_idx], NULL);
+
+ while (cur_node) {
+ if (util_is_scan_entry_match(entry,
+ cur_node->entry)) {
+ /* Acquire db lock to prevent simultaneous update */
+ qdf_spin_lock_bh(&scan_db->scan_db_lock);
+ scm_update_mlme_info(entry, cur_node->entry);
+ qdf_spin_unlock_bh(&scan_db->scan_db_lock);
+ scm_scan_entry_put_ref(scan_db,
+ cur_node, true);
+ return QDF_STATUS_SUCCESS;
+ }
+ next_node = scm_get_next_node(scan_db,
+ &scan_db->scan_hash_tbl[hash_idx], cur_node);
+ cur_node = next_node;
+ }
+
+ return QDF_STATUS_E_INVAL;
+}
diff --git a/umac/scan/core/src/wlan_scan_cache_db.h b/umac/scan/core/src/wlan_scan_cache_db.h
index 30ae138..812e23e 100644
--- a/umac/scan/core/src/wlan_scan_cache_db.h
+++ b/umac/scan/core/src/wlan_scan_cache_db.h
@@ -105,13 +105,15 @@
/**
* scm_update_scan_mlme_info() - updates scan entry with mlme data
- * @mlme_info: mlme info to be updated in scan db
+ * @pdev: pdev object
+ * @scan_entry: source scan entry to read mlme info
*
- * This function updates scan db with mlme data
+ * This function updates scan db with scan_entry->mlme_info
*
* Return: QDF_STATUS
*/
-QDF_STATUS scm_update_scan_mlme_info(struct mlme_update_info *mlme_info);
+QDF_STATUS scm_update_scan_mlme_info(struct wlan_objmgr_pdev *pdev,
+ struct scan_cache_entry *scan_entry);
/**
* scm_flush_results() - flush scan entries matching the filter
diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h
index 9bcc689..10d942a 100644
--- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h
+++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h
@@ -670,19 +670,6 @@
};
/**
- * struct mlme_update_info - meta information required to
- * update mlme info in scan entry
- * @vdev: vdev object
- * @bss: bss identifier
- * @mlme_info: mlme info to update
- */
-struct mlme_update_info {
- struct wlan_objmgr_vdev *vdev;
- struct bss_info bss;
- struct mlme_info mlme_info;
-};
-
-/**
* enum scan_event_type - scan event types
* @SCAN_EVENT_TYPE_STARTED: scan started
* @SCAN_EVENT_TYPE_COMPLETED: scan completed
diff --git a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h
index 774c307..1bb88dc 100644
--- a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h
+++ b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h
@@ -1316,5 +1316,15 @@
qdf_time_t
util_get_last_scan_time(struct wlan_objmgr_vdev *vdev);
+/**
+ * util_scan_entry_update_mlme_info() - function to update mlme info
+ * @scan_entry: scan entry object
+ *
+ * API, function to update mlme info in scan DB
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+util_scan_entry_update_mlme_info(struct wlan_objmgr_pdev *pdev,
+ struct scan_cache_entry *scan_entry);
#endif
-
diff --git a/umac/scan/dispatcher/src/wlan_scan_utils_api.c b/umac/scan/dispatcher/src/wlan_scan_utils_api.c
index 48ed62d..8383769 100644
--- a/umac/scan/dispatcher/src/wlan_scan_utils_api.c
+++ b/umac/scan/dispatcher/src/wlan_scan_utils_api.c
@@ -119,7 +119,7 @@
if (entry1->cap_info.wlan_caps.ess &&
!qdf_mem_cmp(entry1->bssid.bytes,
- entry1->bssid.bytes, QDF_MAC_ADDR_SIZE) &&
+ entry2->bssid.bytes, QDF_MAC_ADDR_SIZE) &&
scm_chan_to_band(
entry1->channel.chan_idx) ==
scm_chan_to_band(entry2->channel.chan_idx)) {
@@ -140,7 +140,7 @@
} else if (!entry1->cap_info.wlan_caps.ibss &&
!entry1->cap_info.wlan_caps.ess &&
!qdf_mem_cmp(entry1->bssid.bytes,
- entry1->bssid.bytes, QDF_MAC_ADDR_SIZE)) {
+ entry2->bssid.bytes, QDF_MAC_ADDR_SIZE)) {
/* In case of P2P devices, ess and ibss will be set to zero */
return true;
}
@@ -674,3 +674,16 @@
/* TODO calculate channel struct */
return scan_entry;
}
+
+QDF_STATUS
+util_scan_entry_update_mlme_info(struct wlan_objmgr_pdev *pdev,
+ struct scan_cache_entry *scan_entry)
+{
+
+ if (!pdev || !scan_entry) {
+ scm_err("pdev 0x%p, scan_entry: 0x%p", pdev, scan_entry);
+ return QDF_STATUS_E_INVAL;
+ }
+
+ return scm_update_scan_mlme_info(pdev, scan_entry);
+}