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
This commit is contained in:
Devender Kumar
2022-08-27 12:33:11 +05:30
committed by Madan Koyyalamudi
parent d276b0eda6
commit 07327b6ea8
2 changed files with 34 additions and 0 deletions

View File

@@ -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

View File

@@ -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);