From 3ced6a46de64815574ced9e44400cc88cd8d6045 Mon Sep 17 00:00:00 2001 From: Srinivas Pitla Date: Thu, 9 Dec 2021 15:43:03 -0800 Subject: [PATCH] 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 --- umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h | 13 +++++++ umac/mlo_mgr/src/wlan_mlo_mgr_msgq.c | 5 ++- umac/mlo_mgr/src/wlan_mlo_mgr_peer.c | 52 ++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h b/umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h index c70040ec0d..6d0036ab17 100644 --- a/umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h +++ b/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 */ diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_msgq.c b/umac/mlo_mgr/src/wlan_mlo_mgr_msgq.c index 88765834b2..ceb12ebc10 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_msgq.c +++ b/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); diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_peer.c b/umac/mlo_mgr/src/wlan_mlo_mgr_peer.c index 18ea45cef5..0bfc40c6a3 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_peer.c +++ b/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) {