diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index f6a266ee68ac..ef581e6511fd 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -398,8 +398,10 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc, uint32_t ret = 0; uint8_t wds_src_mac[IEEE80211_ADDR_LEN]; struct dp_peer *sa_peer; + struct dp_peer *wds_peer; struct dp_ast_entry *ast; uint16_t sa_idx; + bool del_in_progress; if (qdf_unlikely(!ta_peer)) return; @@ -459,12 +461,31 @@ dp_rx_wds_srcport_learn(struct dp_soc *soc, * invalidate this GSE cache entry and new AST entry gets * cached. */ - if (!soc->ast_override_support) + if (!soc->ast_override_support) { + wds_peer = dp_peer_find_hash_find(soc, wds_src_mac, + 0, DP_VDEV_ALL); + if (wds_peer) { + del_in_progress = wds_peer->delete_in_progress; + dp_peer_unref_delete(wds_peer); + if (!del_in_progress) { + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_FATAL, + "wds peer %pM found", + wds_src_mac); + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_FATAL, + "No AST no Del in progress"); + QDF_BUG(0); + } else { + return; + } + } ret = dp_peer_add_ast(soc, ta_peer, wds_src_mac, CDP_TXRX_AST_TYPE_WDS, flags); + } return; }