Эх сурвалжийг харах

qcacmn: Delete peer AST entries as part of peer unmap

In roam HO failure, peer unmap indication is processed
even before Host initiates the peer cleanup. In the cleanup,
as part of cdp_peer_teardown, AST entries are freed up without
removing it from the peer AST list since get_peer_by_ref_id
returns NULL peer pointer as peer is moved to inactive state.

Fix is to delete peer AST entries as part of peer unmap
indication so that the entries are removed from the AST list.

Change-Id: I1b04517e8cc392b33bb439501e61e3d5534d8307
CRs-Fixed: 2763825
Yeshwanth Sriram Guntuka 4 жил өмнө
parent
commit
4c12885407

+ 0 - 24
dp/wifi3.0/dp_main.c

@@ -5450,30 +5450,6 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
 	return QDF_STATUS_SUCCESS;
 }
 
-#ifdef FEATURE_AST
-/*
- * dp_peer_delete_ast_entries(): Delete all AST entries for a peer
- * @soc - datapath soc handle
- * @peer - datapath peer handle
- *
- * Delete the AST entries belonging to a peer
- */
-static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
-					      struct dp_peer *peer)
-{
-	struct dp_ast_entry *ast_entry, *temp_ast_entry;
-
-	DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, temp_ast_entry)
-		dp_peer_del_ast(soc, ast_entry);
-
-	peer->self_ast_entry = NULL;
-}
-#else
-static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
-					      struct dp_peer *peer)
-{
-}
-#endif
 #if ATH_SUPPORT_WRAP
 static inline struct dp_peer *dp_peer_can_reuse(struct dp_vdev *vdev,
 						uint8_t *peer_mac_addr)

+ 3 - 0
dp/wifi3.0/dp_peer.c

@@ -1591,6 +1591,9 @@ static void
 dp_peer_clean_wds_entries(struct dp_soc *soc, struct dp_peer *peer,
 			  uint32_t free_wds_count)
 {
+	qdf_spin_lock_bh(&soc->ast_lock);
+	dp_peer_delete_ast_entries(soc, peer);
+	qdf_spin_unlock_bh(&soc->ast_lock);
 }
 #endif
 

+ 25 - 0
dp/wifi3.0/dp_peer.h

@@ -753,4 +753,29 @@ struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc,
 struct dp_peer *dp_sta_vdev_self_peer_ref_n_get(struct dp_soc *soc,
 						struct dp_vdev *vdev,
 						enum dp_mod_id mod_id);
+
+#ifdef FEATURE_AST
+/*
+ * dp_peer_delete_ast_entries(): Delete all AST entries for a peer
+ * @soc - datapath soc handle
+ * @peer - datapath peer handle
+ *
+ * Delete the AST entries belonging to a peer
+ */
+static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
+					      struct dp_peer *peer)
+{
+	struct dp_ast_entry *ast_entry, *temp_ast_entry;
+
+	DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, temp_ast_entry)
+		dp_peer_del_ast(soc, ast_entry);
+
+	peer->self_ast_entry = NULL;
+}
+#else
+static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
+					      struct dp_peer *peer)
+{
+}
+#endif
 #endif /* _DP_PEER_H_ */