Prechádzať zdrojové kódy

qcacmn: Remove WDS AST entry when STA roams from RPTR to ROOT AP

We need to remove the ast entry of STA which initally
got added as WDS entry as soon as the STA roams from
RPTR AP to ROOT AP and vice-versa

Change-Id: I71cac321844cd569a755790f951a7a3c4db283f8
CRs-Fixed: 2264787
Tallapragada Kalyan 6 rokov pred
rodič
commit
46f90ce4ac
1 zmenil súbory, kde vykonal 38 pridanie a 29 odobranie
  1. 38 29
      dp/wifi3.0/dp_main.c

+ 38 - 29
dp/wifi3.0/dp_main.c

@@ -3508,6 +3508,33 @@ static void dp_vdev_detach_wifi3(struct cdp_vdev *vdev_handle,
 		callback(cb_context);
 }
 
+/*
+ * 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
+ */
+#ifdef FEATURE_AST
+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;
+
+	qdf_spin_lock_bh(&soc->ast_lock);
+	DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, temp_ast_entry)
+		dp_peer_del_ast(soc, ast_entry);
+
+	TAILQ_INIT(&peer->ast_entry_list);
+	qdf_spin_unlock_bh(&soc->ast_lock);
+}
+#else
+static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
+					      struct dp_peer *peer)
+{
+}
+#endif
+
 /*
  * dp_peer_create_wifi3() - attach txrx peer
  * @txrx_vdev: Datapath VDEV handle
@@ -3523,6 +3550,7 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle,
 	struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
 	struct dp_pdev *pdev;
 	struct dp_soc *soc;
+	struct dp_ast_entry *ast_entry;
 
 	/* preconditions */
 	qdf_assert(vdev);
@@ -3537,9 +3565,7 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle,
 	if (peer) {
 		peer->delete_in_progress = false;
 
-		qdf_spin_lock_bh(&soc->ast_lock);
-		TAILQ_INIT(&peer->ast_entry_list);
-		qdf_spin_unlock_bh(&soc->ast_lock);
+		dp_peer_delete_ast_entries(soc, peer);
 
 		/*
 		* on peer create, peer ref count decrements, sice new peer is not
@@ -3556,6 +3582,15 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle,
 #endif
 		DP_STATS_INIT(peer);
 		return (void *)peer;
+	} else {
+		/*
+		 * When a STA roams from RPTR AP to ROOT AP and vice versa, we
+		 * need to remove the AST entry which was earlier added as a WDS
+		 * entry.
+		 */
+		ast_entry = dp_peer_ast_hash_find(soc, peer_mac_addr);
+		if (ast_entry)
+			dp_peer_del_ast(soc, ast_entry);
 	}
 
 #ifdef notyet
@@ -6826,32 +6861,6 @@ static struct cdp_wds_ops dp_ops_wds = {
 #endif
 };
 
-/*
- * 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
- */
-#ifdef FEATURE_AST
-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;
-
-	qdf_spin_lock_bh(&soc->ast_lock);
-	DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, temp_ast_entry)
-		dp_peer_del_ast(soc, ast_entry);
-
-	qdf_spin_unlock_bh(&soc->ast_lock);
-}
-#else
-static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
-		struct dp_peer *peer)
-{
-}
-#endif
-
 /*
  * dp_txrx_data_tx_cb_set(): set the callback for non standard tx
  * @vdev_handle - datapath vdev handle