Browse Source

qcacmn: Add API to get partner link info

This API retrievs link address and link id of all partner links
in structure to the caller.

This change also includes few compile fixes for msgq mode

Change-Id: I2a30904a3b41876783de611ac14697338c617689
CRs-Fixed: 3091850
Srinivas Pitla 3 years ago
parent
commit
3ced6a46de

+ 13 - 0
umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h

@@ -342,6 +342,19 @@ void wlan_mlo_peer_free_all_link_assoc_resp_buf(struct wlan_objmgr_peer *peer);
 void wlan_mlo_peer_get_links_info(struct wlan_objmgr_peer *peer,
 				  struct mlo_tgt_partner_info *ml_links);
 
+/**
+ * wlan_mlo_peer_get_partner_links_info() - get MLO peer partner links info
+ * @peer: Link peer
+ * @ml_links: structure to be filled with partner link info
+ *
+ * This function retrieves partner link info of link peer such as link id,
+ * mac address
+ *
+ * Return: void
+ */
+void wlan_mlo_peer_get_partner_links_info(struct wlan_objmgr_peer *peer,
+					  struct mlo_partner_info *ml_links);
+
 /**
  ** APIs to operations on ML peer object
  */

+ 4 - 1
umac/mlo_mgr/src/wlan_mlo_mgr_msgq.c

@@ -136,6 +136,7 @@ QDF_STATUS mlo_msgq_post(enum mlo_msg_type type,
 	struct peer_assoc_notify_s *peer_assoc, *peer_assoc_l;
 	struct peer_assoc_fail_notify_s *peer_assoc_fail, *peer_assoc_fail_l;
 	struct peer_discon_notify_s *peer_disconn, *peer_disconn_l;
+	struct peer_deauth_notify_s *peer_deauth, *peer_deauth_l;
 	struct ctxt_switch_mgr *msgq_ctx;
 	struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx();
 
@@ -207,6 +208,7 @@ static void mlo_msgq_msg_process_hdlr(struct mlo_ctxt_switch_msg_s *msg)
 	struct peer_assoc_notify_s *peer_assoc;
 	struct peer_assoc_fail_notify_s *peer_assoc_fail;
 	struct peer_discon_notify_s *peer_disconn;
+	struct peer_deauth_notify_s *peer_deauth;
 
 	type = msg->type;
 	switch (type) {
@@ -262,6 +264,7 @@ static void mlo_msgq_msg_flush_hdlr(struct mlo_ctxt_switch_msg_s *msg)
 	struct peer_assoc_notify_s *peer_assoc;
 	struct peer_assoc_fail_notify_s *peer_assoc_fail;
 	struct peer_discon_notify_s *peer_disconn;
+	struct peer_deauth_notify_s *peer_deauth;
 
 	type = msg->type;
 	switch (type) {
@@ -356,7 +359,7 @@ static void mlo_msgq_msg_handler(void *arg)
 					     &msgbuf_node);
 		if (status != QDF_STATUS_E_EMPTY) {
 			qdf_list_remove_node(&msgq_ctx->msgq_list,
-					     &msgbuf_node);
+					     msgbuf_node);
 			msg = qdf_container_of(msgbuf_node,
 					       struct mlo_ctxt_switch_msg_s,
 					       node);

+ 52 - 0
umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

@@ -973,6 +973,58 @@ void wlan_mlo_peer_get_links_info(struct wlan_objmgr_peer *peer,
 
 qdf_export_symbol(wlan_mlo_peer_get_links_info);
 
+void wlan_mlo_peer_get_partner_links_info(struct wlan_objmgr_peer *peer,
+					  struct mlo_partner_info *ml_links)
+{
+	struct wlan_mlo_peer_context *ml_peer;
+	struct wlan_mlo_link_peer_entry *peer_entry;
+	struct wlan_objmgr_peer *link_peer;
+	struct wlan_objmgr_vdev *link_vdev;
+	uint8_t i, ix;
+
+	ml_peer = peer->mlo_peer_ctx;
+	ml_links->num_partner_links = 0;
+
+	if (!ml_peer)
+		return;
+
+	mlo_peer_lock_acquire(ml_peer);
+
+	if ((ml_peer->mlpeer_state != ML_PEER_CREATED) &&
+	    (ml_peer->mlpeer_state != ML_PEER_ASSOC_DONE)) {
+		mlo_peer_lock_release(ml_peer);
+		return;
+	}
+
+	for (i = 0; i < MAX_MLO_LINK_PEERS; i++) {
+		peer_entry = &ml_peer->peer_list[i];
+		link_peer = peer_entry->link_peer;
+
+		if (!link_peer)
+			continue;
+
+		if (link_peer == peer)
+			continue;
+
+		link_vdev = wlan_peer_get_vdev(link_peer);
+		if (!link_vdev)
+			continue;
+
+		if (ml_links->num_partner_links >= WLAN_UMAC_MLO_MAX_VDEVS)
+			break;
+
+		ix = ml_links->num_partner_links;
+		ml_links->partner_link_info[ix].link_id = peer_entry->link_ix;
+
+		qdf_copy_macaddr(&ml_links->partner_link_info[ix].link_addr,
+				 &peer_entry->link_addr);
+		ml_links->num_partner_links++;
+	}
+	mlo_peer_lock_release(ml_peer);
+}
+
+qdf_export_symbol(wlan_mlo_peer_get_partner_links_info);
+
 #ifdef UMAC_SUPPORT_MLNAWDS
 bool wlan_mlo_peer_is_nawds(struct wlan_mlo_peer_context *ml_peer)
 {