From 07327b6ea87db56c4da6f0f0a23198e3ad7024d8 Mon Sep 17 00:00:00 2001 From: Devender Kumar Date: Sat, 27 Aug 2022 12:33:11 +0530 Subject: [PATCH] qcacmn: Send client disconnect event to IPA When AP vap disconnect aburputly or by doing channel switch then for WDS node, client disconnect event is not sent to IPA driver, hence IPA is not aware of any new wds client coming behind that peer as the previous delete event is not handled properly Fix is to send wds client disconnect event when ast entry are flushed. CRs-Fixed: 3271481 Change-Id: Id507f543c8f4cb8f69e26ba6ca3a23787af21ed7 --- dp/inc/cdp_txrx_ops.h | 4 ++++ dp/wifi3.0/dp_main.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 0688b43746..8ba05ace1d 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -1468,6 +1468,10 @@ struct ol_if_ops { uint8_t vdev_id, struct ol_txrx_hardtart_ctxt *ctxt); #endif +#if defined(IPA_WDS_EASYMESH_FEATURE) && defined(FEATURE_AST) +void (*peer_send_wds_disconnect)(struct cdp_ctrl_objmgr_psoc *psoc, + uint8_t *mac_addr, uint8_t vdev_id); +#endif }; #ifdef DP_PEER_EXTENDED_API diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 8a4c53f0a7..f77b0e17f5 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -935,6 +935,35 @@ static void dp_wds_flush_ast_table_wifi3(struct cdp_soc_t *soc_hdl) dp_peer_mec_flush_entries(soc); } +#if defined(IPA_WDS_EASYMESH_FEATURE) && defined(FEATURE_AST) +/* + * dp_peer_send_wds_disconnect() - Send Disconnect event to IPA for each peer + * @soc: Datapath SOC + * @peer: Datapath peer + * + * Return: None + */ +static void +dp_peer_send_wds_disconnect(struct dp_soc *soc, struct dp_peer *peer) +{ + struct dp_ast_entry *ase = NULL; + struct dp_ast_entry *temp_ase; + + DP_PEER_ITERATE_ASE_LIST(peer, ase, temp_ase) { + if (ase->type == CDP_TXRX_AST_TYPE_WDS) { + soc->cdp_soc.ol_ops->peer_send_wds_disconnect(soc->ctrl_psoc, + ase->mac_addr.raw, + ase->vdev_id); + } + } +} +#elif defined(FEATURE_AST) +static void +dp_peer_send_wds_disconnect(struct dp_soc *soc, struct dp_peer *peer) +{ +} +#endif + /** * dp_peer_get_ast_info_by_soc_wifi3() - search the soc AST hash table * and return ast entry information @@ -12485,6 +12514,7 @@ dp_peer_teardown_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, dp_peer_update_state(soc, peer, DP_PEER_STATE_LOGICAL_DELETE); qdf_spin_lock_bh(&soc->ast_lock); + dp_peer_send_wds_disconnect(soc, peer); dp_peer_delete_ast_entries(soc, peer); qdf_spin_unlock_bh(&soc->ast_lock);