Bladeren bron

qcacmn: Add API to invoke MLO peer delete

This API invokes peer delete on all link peers

Change-Id: If20274ca67c93a3e6c0706c04007215d5330bea0
CRs-Fixed: 3389049
Srinivas Pitla 2 jaren geleden
bovenliggende
commit
6f49a4b14b
2 gewijzigde bestanden met toevoegingen van 57 en 3 verwijderingen
  1. 10 1
      umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h
  2. 47 2
      umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

+ 10 - 1
umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -109,6 +109,15 @@ void wlan_peer_delete_complete(struct wlan_objmgr_peer *peer);
  */
 void mlo_peer_delete(struct wlan_objmgr_peer *peer);
 
+/**
+ * wlan_mlo_peer_delete - Initiate deletion of MLO peer
+ *
+ * @ml_peer: pointer to ML peer context
+ *
+ * Return: none
+ */
+void wlan_mlo_peer_delete(struct wlan_mlo_peer_context *ml_peer);
+
 /**
  * is_mlo_all_peer_links_deleted - Check if all the peer links are deleted
  *

+ 47 - 2
umac/mlo_mgr/src/wlan_mlo_mgr_peer.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -371,8 +371,53 @@ wlan_mlo_peer_deauth_init(struct wlan_mlo_peer_context *ml_peer,
 			deauth_sent = 1;
 		}
 	}
+}
+
+void wlan_mlo_peer_delete(struct wlan_mlo_peer_context *ml_peer)
+{
+	struct wlan_mlo_dev_context *ml_dev;
+	struct wlan_objmgr_peer *link_peer;
+	struct wlan_objmgr_peer *link_peers[MAX_MLO_LINK_PEERS];
+	struct wlan_mlo_link_peer_entry *peer_entry;
+	uint16_t i;
+
+	if (!ml_peer)
+		return;
 
-	return;
+	mlo_peer_lock_acquire(ml_peer);
+
+	if (ml_peer->mlpeer_state == ML_PEER_DISCONN_INITIATED) {
+		mlo_peer_lock_release(ml_peer);
+		return;
+	}
+
+	ml_dev = ml_peer->ml_dev;
+
+	for (i = 0; i < MAX_MLO_LINK_PEERS; i++) {
+		link_peers[i] = NULL;
+		peer_entry = &ml_peer->peer_list[i];
+		if (!peer_entry->link_peer)
+			continue;
+
+		link_peer = peer_entry->link_peer;
+
+		if (wlan_objmgr_peer_try_get_ref(link_peer, WLAN_MLO_MGR_ID) !=
+						QDF_STATUS_SUCCESS)
+			continue;
+
+		link_peers[i] = link_peer;
+	}
+
+	ml_peer->mlpeer_state = ML_PEER_DISCONN_INITIATED;
+
+	mlo_peer_lock_release(ml_peer);
+
+	for (i = 0; i < MAX_MLO_LINK_PEERS; i++) {
+		if (!link_peers[i])
+			continue;
+
+		mlo_link_peer_disconnect_notify(ml_dev, link_peers[i]);
+	}
 }
 
 void