Browse Source

qcacmn: Add debug MLO changes

-Add debug logs to MLO manager code.
-Add ml_dev validation checks for ML peer operations.
-Add pointer checks to avoid NULL pointer dereference

Change-Id: I8e9ddf177a999a43e8612f8c6acedd08ffce63d5
CRs-fixed: 2998964
Lincoln Tran 4 years ago
parent
commit
ce48d77998

+ 1 - 1
umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h

@@ -487,7 +487,7 @@ enum extn_element_ie {
 	WLAN_EXTN_ELEMID_HE_6G_CAP   = 59,
 	WLAN_EXTN_ELEMID_ESP         = 11,
 #ifdef WLAN_FEATURE_11BE_MLO
-	WLAN_EXTN_ELEMID_MULTI_LINK  = 252,
+	WLAN_EXTN_ELEMID_MULTI_LINK  = 94,
 #endif
 #ifdef WLAN_FEATURE_11BE
 	WLAN_EXTN_ELEMID_EHTCAP      = 253,

+ 5 - 0
umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c

@@ -229,6 +229,11 @@ QDF_STATUS wlan_vdev_is_peer_create_allowed(struct wlan_objmgr_vdev *vdev)
 	enum wlan_vdev_state state;
 	enum wlan_vdev_state substate;
 
+	if (!vdev) {
+		mlme_err("vdev is null");
+		return QDF_STATUS_E_FAILURE;
+	}
+
 	state = wlan_vdev_mlme_get_state(vdev);
 	substate = wlan_vdev_mlme_get_substate(vdev);
 	if (!((state == WLAN_VDEV_S_INIT) ||

+ 4 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_main.c

@@ -360,6 +360,8 @@ QDF_STATUS wlan_mlo_mgr_vdev_created_notification(struct wlan_objmgr_vdev *vdev,
 		/* It's not a ML interface*/
 		return QDF_STATUS_SUCCESS;
 	}
+	mlo_debug("MLD addr" QDF_MAC_ADDR_FMT,
+		  QDF_MAC_ADDR_REF(mld_addr->bytes));
 	status = mlo_dev_ctx_init(vdev);
 
 	return status;
@@ -376,6 +378,8 @@ QDF_STATUS wlan_mlo_mgr_vdev_destroyed_notification(struct wlan_objmgr_vdev *vde
 		/* It's not a ML interface*/
 		return QDF_STATUS_SUCCESS;
 	}
+	mlo_debug("MLD addr" QDF_MAC_ADDR_FMT,
+		  QDF_MAC_ADDR_REF(mld_addr->bytes));
 
 	status = mlo_dev_ctx_deinit(vdev);
 

+ 22 - 4
umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

@@ -18,6 +18,7 @@
 #include "qdf_types.h"
 #include "wlan_cmn.h"
 #include "wlan_mlo_mgr_msgq.h"
+#include "wlan_objmgr_peer_obj.h"
 #include "wlan_mlo_mgr_peer.h"
 #include "wlan_mlo_mgr_ap.h"
 
@@ -188,7 +189,7 @@ void wlan_mlo_partner_peer_assoc_post(struct wlan_objmgr_peer *assoc_peer)
 		link_peer = peer_entry->link_peer;
 
 		if (wlan_objmgr_peer_try_get_ref(link_peer, WLAN_MLO_MGR_ID) !=
-						QDF_STATUS_SUCCESS)
+						 QDF_STATUS_SUCCESS)
 			continue;
 
 		link_peers[i] = link_peer;
@@ -273,8 +274,10 @@ void wlan_mlo_partner_peer_disconnect_notify(struct wlan_objmgr_peer *src_peer)
 	for (i = 0; i < MAX_MLO_LINK_PEERS; i++) {
 		link_peers[i] = NULL;
 		peer_entry = &ml_peer->peer_list[i];
-		if (!peer_entry->link_peer)
+		if (!peer_entry->link_peer) {
+			mlo_debug("link peer is null");
 			continue;
+		}
 
 		if (peer_entry->link_peer == src_peer)
 			continue;
@@ -364,7 +367,7 @@ static QDF_STATUS mlo_peer_attach_link_peer(
 
 		peer_entry->link_ix = i + 1;
 		peer_entry->hw_link_id = 1;
-			/*wlan_peer_get_hw_link_id(link_peer)TODO*/
+		/*wlan_peer_get_hw_link_id(link_peer)TODO*/
 		mlo_peer_assign_primary_umac(ml_peer, peer_entry);
 
 		status = QDF_STATUS_SUCCESS;
@@ -422,6 +425,18 @@ static QDF_STATUS mlo_dev_get_link_vdevs(
 	struct wlan_objmgr_vdev *vdev_link;
 	uint8_t link_id;
 
+	if (!ml_dev) {
+		mlo_err("ml_dev is null");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (!ml_info) {
+		mlo_err("ml_info is null");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	mlo_debug("num_partner_links %d", ml_info->num_partner_links);
+	mlo_dev_lock_acquire(ml_dev);
 	for (i = 0; i < ml_info->num_partner_links; i++) {
 		link_id = ml_info->partner_link_info[i].link_id;
 		vdev_link = mlo_get_vdev_by_link_id(vdev, link_id);
@@ -441,6 +456,7 @@ static QDF_STATUS mlo_dev_get_link_vdevs(
 			return QDF_STATUS_E_INVAL;
 		}
 	}
+	mlo_dev_lock_release(ml_dev);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -483,8 +499,10 @@ QDF_STATUS wlan_mlo_peer_create(struct wlan_objmgr_vdev *vdev,
 
 	for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
 		vdev_link = link_vdevs[i];
-		if (!vdev_link)
+		if (!vdev_link) {
+			mlo_debug("vdev_link is null");
 			continue;
+		}
 
 		if (wlan_vdev_is_peer_create_allowed(vdev_link)
 			!= QDF_STATUS_SUCCESS) {

+ 5 - 1
umac/scan/dispatcher/src/wlan_scan_utils_api.c

@@ -1828,13 +1828,16 @@ static void util_scan_update_ml_info(struct scan_cache_entry *scan_entry)
 	uint16_t multi_link_ctrl;
 	uint8_t offset;
 
-	if (!scan_entry->ie_list.multi_link)
+	if (!scan_entry->ie_list.multi_link) {
+		scm_err("scan_entry->ie_list.multi_link is null");
 		return;
+	}
 
 	multi_link_ctrl = *(uint16_t *)(ml_ie + ML_CONTROL_OFFSET);
 
 	/* TODO: update ml_info based on ML IE */
 
+	multi_link_ctrl = *(uint16_t *)(ml_ie + ML_CONTROL_OFFSET);
 	offset = ML_CMN_INFO_OFFSET;
 	/* TODO: Add proper parsing based on presense bitmap */
 	if (multi_link_ctrl & CMN_INFO_MLD_ADDR_PRESENT_BIT) {
@@ -1886,6 +1889,7 @@ util_scan_gen_scan_entry(struct wlan_objmgr_pdev *pdev,
 		scm_err("failed to allocate memory for scan_entry");
 		return QDF_STATUS_E_NOMEM;
 	}
+
 	scan_entry->raw_frame.ptr =
 			qdf_mem_malloc_atomic(frame_len);
 	if (!scan_entry->raw_frame.ptr) {