xref: /wlan-driver/qca-wifi-host-cmn/umac/wifi_pos/src/wifi_pos_pasn_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
3*5113495bSYour Name  *
4*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
5*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
6*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
7*5113495bSYour Name  *
8*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15*5113495bSYour Name  */
16*5113495bSYour Name /**
17*5113495bSYour Name  * DOC: wifi_pos_pasn_api.c
18*5113495bSYour Name  * This file defines the 11az PASN authentication related APIs for wifi_pos
19*5113495bSYour Name  * component.
20*5113495bSYour Name  */
21*5113495bSYour Name 
22*5113495bSYour Name #include <wlan_lmac_if_def.h>
23*5113495bSYour Name #include "wifi_pos_api.h"
24*5113495bSYour Name #include "wifi_pos_pasn_api.h"
25*5113495bSYour Name #include "wifi_pos_utils_i.h"
26*5113495bSYour Name #include "wifi_pos_main_i.h"
27*5113495bSYour Name #include "os_if_wifi_pos.h"
28*5113495bSYour Name #include "os_if_wifi_pos_utils.h"
29*5113495bSYour Name #include "target_if_wifi_pos.h"
30*5113495bSYour Name #include "target_if_wifi_pos_rx_ops.h"
31*5113495bSYour Name #include "wlan_objmgr_cmn.h"
32*5113495bSYour Name #include "wlan_objmgr_global_obj.h"
33*5113495bSYour Name #include "wlan_objmgr_psoc_obj.h"
34*5113495bSYour Name #include "wlan_objmgr_peer_obj.h"
35*5113495bSYour Name #include "wlan_lmac_if_def.h"
36*5113495bSYour Name #include "wlan_vdev_mgr_tgt_if_tx_api.h"
37*5113495bSYour Name 
38*5113495bSYour Name #if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
wifi_pos_get_pasn_peer_count(struct wlan_objmgr_vdev * vdev)39*5113495bSYour Name uint8_t wifi_pos_get_pasn_peer_count(struct wlan_objmgr_vdev *vdev)
40*5113495bSYour Name {
41*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
42*5113495bSYour Name 
43*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
44*5113495bSYour Name 	if (!vdev_pos_obj) {
45*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
46*5113495bSYour Name 		return 0;
47*5113495bSYour Name 	}
48*5113495bSYour Name 
49*5113495bSYour Name 	return vdev_pos_obj->num_pasn_peers;
50*5113495bSYour Name }
51*5113495bSYour Name 
wifi_pos_update_pasn_peer_count(struct wlan_objmgr_vdev * vdev,bool is_increment)52*5113495bSYour Name void wifi_pos_update_pasn_peer_count(struct wlan_objmgr_vdev *vdev,
53*5113495bSYour Name 				     bool is_increment)
54*5113495bSYour Name {
55*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
56*5113495bSYour Name 
57*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
58*5113495bSYour Name 	if (!vdev_pos_obj) {
59*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
60*5113495bSYour Name 		return;
61*5113495bSYour Name 	}
62*5113495bSYour Name 
63*5113495bSYour Name 	if (is_increment)
64*5113495bSYour Name 		vdev_pos_obj->num_pasn_peers++;
65*5113495bSYour Name 	else if (vdev_pos_obj->num_pasn_peers)
66*5113495bSYour Name 		vdev_pos_obj->num_pasn_peers--;
67*5113495bSYour Name 
68*5113495bSYour Name 	wifi_pos_debug("Pasn peer count:%d", vdev_pos_obj->num_pasn_peers);
69*5113495bSYour Name }
70*5113495bSYour Name #endif
71*5113495bSYour Name 
wifi_pos_set_11az_failed_peers(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * mac_addr)72*5113495bSYour Name void wifi_pos_set_11az_failed_peers(struct wlan_objmgr_vdev *vdev,
73*5113495bSYour Name 				    struct qdf_mac_addr *mac_addr)
74*5113495bSYour Name {
75*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
76*5113495bSYour Name 	struct wifi_pos_11az_context *pasn_context;
77*5113495bSYour Name 	uint8_t i;
78*5113495bSYour Name 
79*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
80*5113495bSYour Name 	if (!vdev_pos_obj) {
81*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
82*5113495bSYour Name 		return;
83*5113495bSYour Name 	}
84*5113495bSYour Name 
85*5113495bSYour Name 	pasn_context = &vdev_pos_obj->pasn_context;
86*5113495bSYour Name 	if (!pasn_context->num_failed_peers)
87*5113495bSYour Name 		goto add_failed_peer;
88*5113495bSYour Name 
89*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_11AZ_PEERS; i++) {
90*5113495bSYour Name 		if (qdf_is_macaddr_equal(mac_addr,
91*5113495bSYour Name 					 &pasn_context->failed_peer_list[i])) {
92*5113495bSYour Name 			wifi_pos_debug("Peer: " QDF_MAC_ADDR_FMT " already exists in failed list",
93*5113495bSYour Name 				       QDF_MAC_ADDR_REF(mac_addr->bytes));
94*5113495bSYour Name 			return;
95*5113495bSYour Name 		}
96*5113495bSYour Name 	}
97*5113495bSYour Name 
98*5113495bSYour Name add_failed_peer:
99*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_11AZ_PEERS; i++) {
100*5113495bSYour Name 		if (qdf_is_macaddr_broadcast(
101*5113495bSYour Name 					&pasn_context->failed_peer_list[i])) {
102*5113495bSYour Name 			qdf_copy_macaddr(&pasn_context->failed_peer_list[i],
103*5113495bSYour Name 					 mac_addr);
104*5113495bSYour Name 			pasn_context->num_failed_peers++;
105*5113495bSYour Name 			wifi_pos_debug("Added failed peer: " QDF_MAC_ADDR_FMT " at idx[%d]",
106*5113495bSYour Name 				       QDF_MAC_ADDR_REF(mac_addr->bytes), i);
107*5113495bSYour Name 
108*5113495bSYour Name 			return;
109*5113495bSYour Name 		}
110*5113495bSYour Name 	}
111*5113495bSYour Name 
112*5113495bSYour Name 	wifi_pos_debug("Not able to set failed peer");
113*5113495bSYour Name }
114*5113495bSYour Name 
wifi_pos_add_peer_to_list(struct wlan_objmgr_vdev * vdev,struct wlan_pasn_request * req,bool is_peer_create_required)115*5113495bSYour Name void wifi_pos_add_peer_to_list(struct wlan_objmgr_vdev *vdev,
116*5113495bSYour Name 			       struct wlan_pasn_request *req,
117*5113495bSYour Name 			       bool is_peer_create_required)
118*5113495bSYour Name {
119*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
120*5113495bSYour Name 	struct wifi_pos_11az_context *pasn_context;
121*5113495bSYour Name 	struct wlan_pasn_request *secure_list, *unsecure_list, *dst_entry;
122*5113495bSYour Name 	uint8_t i;
123*5113495bSYour Name 
124*5113495bSYour Name 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE)
125*5113495bSYour Name 		return;
126*5113495bSYour Name 
127*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
128*5113495bSYour Name 	if (!vdev_pos_obj) {
129*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
130*5113495bSYour Name 		return;
131*5113495bSYour Name 	}
132*5113495bSYour Name 
133*5113495bSYour Name 	pasn_context = &vdev_pos_obj->pasn_context;
134*5113495bSYour Name 	secure_list = pasn_context->secure_peer_list;
135*5113495bSYour Name 	unsecure_list = pasn_context->unsecure_peer_list;
136*5113495bSYour Name 
137*5113495bSYour Name 	/* Find the 1st empty slot and copy the entry to peer list */
138*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_11AZ_PEERS; i++) {
139*5113495bSYour Name 		if (req->peer_type == WLAN_WIFI_POS_PASN_SECURE_PEER)
140*5113495bSYour Name 			dst_entry = &secure_list[i];
141*5113495bSYour Name 		else
142*5113495bSYour Name 			dst_entry = &unsecure_list[i];
143*5113495bSYour Name 
144*5113495bSYour Name 		/* Current slot is not empty */
145*5113495bSYour Name 		if (!qdf_is_macaddr_broadcast(&dst_entry->peer_mac))
146*5113495bSYour Name 			continue;
147*5113495bSYour Name 
148*5113495bSYour Name 		*dst_entry = *req;
149*5113495bSYour Name 		if (is_peer_create_required)
150*5113495bSYour Name 			pasn_context->num_pending_peer_creation++;
151*5113495bSYour Name 
152*5113495bSYour Name 		if (req->peer_type == WLAN_WIFI_POS_PASN_SECURE_PEER)
153*5113495bSYour Name 			pasn_context->num_secure_peers++;
154*5113495bSYour Name 		else
155*5113495bSYour Name 			pasn_context->num_unsecure_peers++;
156*5113495bSYour Name 
157*5113495bSYour Name 		wifi_pos_debug("Added %s peer: " QDF_MAC_ADDR_FMT " at idx[%d]",
158*5113495bSYour Name 			       (req->peer_type == WLAN_WIFI_POS_PASN_SECURE_PEER) ? "secure" : "insecure",
159*5113495bSYour Name 			       QDF_MAC_ADDR_REF(dst_entry->peer_mac.bytes), i);
160*5113495bSYour Name 
161*5113495bSYour Name 		break;
162*5113495bSYour Name 	}
163*5113495bSYour Name }
164*5113495bSYour Name 
165*5113495bSYour Name /**
166*5113495bSYour Name  * wifi_pos_move_peers_to_fail_list  - Move the peers in secure/insecure list
167*5113495bSYour Name  * to failed peer list
168*5113495bSYour Name  * @vdev: Vdev pointer
169*5113495bSYour Name  * @peer_mac: Peer mac address
170*5113495bSYour Name  * @peer_type: Secure or insecure PASN peer
171*5113495bSYour Name  *
172*5113495bSYour Name  * Return: None
173*5113495bSYour Name  */
174*5113495bSYour Name static
wifi_pos_move_peers_to_fail_list(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * peer_mac,enum wifi_pos_pasn_peer_type peer_type)175*5113495bSYour Name void wifi_pos_move_peers_to_fail_list(struct wlan_objmgr_vdev *vdev,
176*5113495bSYour Name 				      struct qdf_mac_addr *peer_mac,
177*5113495bSYour Name 				      enum wifi_pos_pasn_peer_type peer_type)
178*5113495bSYour Name {
179*5113495bSYour Name 	uint8_t i;
180*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
181*5113495bSYour Name 	struct wifi_pos_11az_context *pasn_context;
182*5113495bSYour Name 	struct wlan_pasn_request *secure_list, *unsecure_list, *list = NULL;
183*5113495bSYour Name 	struct qdf_mac_addr entry_to_copy;
184*5113495bSYour Name 
185*5113495bSYour Name 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE)
186*5113495bSYour Name 		return;
187*5113495bSYour Name 
188*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
189*5113495bSYour Name 	if (!vdev_pos_obj) {
190*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
191*5113495bSYour Name 		return;
192*5113495bSYour Name 	}
193*5113495bSYour Name 
194*5113495bSYour Name 	pasn_context = &vdev_pos_obj->pasn_context;
195*5113495bSYour Name 
196*5113495bSYour Name 	/*
197*5113495bSYour Name 	 * Broadcast mac address will be sent by caller when initiate
198*5113495bSYour Name 	 * external auth fails and to move the entire list to failed
199*5113495bSYour Name 	 * peers list
200*5113495bSYour Name 	 */
201*5113495bSYour Name 	if (qdf_is_macaddr_broadcast(peer_mac)) {
202*5113495bSYour Name 		/* Clear the entire list and move it to failed peers list */
203*5113495bSYour Name 		if (peer_type == WLAN_WIFI_POS_PASN_SECURE_PEER)
204*5113495bSYour Name 			list = pasn_context->secure_peer_list;
205*5113495bSYour Name 		else if (peer_type == WLAN_WIFI_POS_PASN_UNSECURE_PEER)
206*5113495bSYour Name 			list = pasn_context->unsecure_peer_list;
207*5113495bSYour Name 
208*5113495bSYour Name 		if (!list) {
209*5113495bSYour Name 			wifi_pos_err("No Valid list exists");
210*5113495bSYour Name 			return;
211*5113495bSYour Name 		}
212*5113495bSYour Name 
213*5113495bSYour Name 		for (i = 0; i < WLAN_MAX_11AZ_PEERS; i++) {
214*5113495bSYour Name 			/*
215*5113495bSYour Name 			 * if valid entry exist in the list, set that mac
216*5113495bSYour Name 			 * address to failed list and clear that mac from the
217*5113495bSYour Name 			 * secure/insecure list
218*5113495bSYour Name 			 */
219*5113495bSYour Name 			if (!qdf_is_macaddr_broadcast(&list[i].peer_mac)) {
220*5113495bSYour Name 				wifi_pos_set_11az_failed_peers(
221*5113495bSYour Name 						vdev, &list[i].peer_mac);
222*5113495bSYour Name 				qdf_set_macaddr_broadcast(&list[i].peer_mac);
223*5113495bSYour Name 			}
224*5113495bSYour Name 		}
225*5113495bSYour Name 
226*5113495bSYour Name 		return;
227*5113495bSYour Name 	}
228*5113495bSYour Name 
229*5113495bSYour Name 	secure_list = pasn_context->secure_peer_list;
230*5113495bSYour Name 	unsecure_list = pasn_context->unsecure_peer_list;
231*5113495bSYour Name 	/*
232*5113495bSYour Name 	 * This condition is hit when peer create confirm for a pasn
233*5113495bSYour Name 	 * peer is received with failure status
234*5113495bSYour Name 	 */
235*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_11AZ_PEERS; i++) {
236*5113495bSYour Name 		/*
237*5113495bSYour Name 		 * Clear the individual entry that exist for the given
238*5113495bSYour Name 		 * mac address in secure/insecure list
239*5113495bSYour Name 		 */
240*5113495bSYour Name 		if (qdf_is_macaddr_equal(peer_mac, &secure_list[i].peer_mac)) {
241*5113495bSYour Name 			entry_to_copy = secure_list[i].peer_mac;
242*5113495bSYour Name 			qdf_set_macaddr_broadcast(&secure_list[i].peer_mac);
243*5113495bSYour Name 			pasn_context->num_secure_peers--;
244*5113495bSYour Name 		} else if (qdf_is_macaddr_equal(peer_mac,
245*5113495bSYour Name 			   &unsecure_list[i].peer_mac)) {
246*5113495bSYour Name 			entry_to_copy = unsecure_list[i].peer_mac;
247*5113495bSYour Name 			qdf_set_macaddr_broadcast(&unsecure_list[i].peer_mac);
248*5113495bSYour Name 			pasn_context->num_unsecure_peers--;
249*5113495bSYour Name 		} else {
250*5113495bSYour Name 			continue;
251*5113495bSYour Name 		}
252*5113495bSYour Name 
253*5113495bSYour Name 		wifi_pos_set_11az_failed_peers(vdev, &entry_to_copy);
254*5113495bSYour Name 		break;
255*5113495bSYour Name 	}
256*5113495bSYour Name }
257*5113495bSYour Name 
258*5113495bSYour Name static QDF_STATUS
wifi_pos_request_external_pasn_auth(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,struct wlan_pasn_request * peer_list,uint8_t num_peers)259*5113495bSYour Name wifi_pos_request_external_pasn_auth(struct wlan_objmgr_psoc *psoc,
260*5113495bSYour Name 				    struct wlan_objmgr_vdev *vdev,
261*5113495bSYour Name 				    struct wlan_pasn_request *peer_list,
262*5113495bSYour Name 				    uint8_t num_peers)
263*5113495bSYour Name {
264*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
265*5113495bSYour Name 	struct wifi_pos_osif_ops *osif_cb;
266*5113495bSYour Name 	QDF_STATUS status;
267*5113495bSYour Name 
268*5113495bSYour Name 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE)
269*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
270*5113495bSYour Name 
271*5113495bSYour Name 	osif_cb = wifi_pos_get_osif_callbacks();
272*5113495bSYour Name 	if (!osif_cb || !osif_cb->osif_initiate_pasn_cb) {
273*5113495bSYour Name 		wifi_pos_err("OSIF %s cb is NULL",
274*5113495bSYour Name 			     !osif_cb ? "" : "PASN");
275*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
276*5113495bSYour Name 	}
277*5113495bSYour Name 
278*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
279*5113495bSYour Name 	if (!vdev_pos_obj) {
280*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
281*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
282*5113495bSYour Name 	}
283*5113495bSYour Name 
284*5113495bSYour Name 	status = osif_cb->osif_initiate_pasn_cb(vdev, peer_list,
285*5113495bSYour Name 						num_peers, true);
286*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
287*5113495bSYour Name 		wifi_pos_err("Initiate PASN auth failed");
288*5113495bSYour Name 
289*5113495bSYour Name 	return status;
290*5113495bSYour Name }
291*5113495bSYour Name 
292*5113495bSYour Name static QDF_STATUS
wifi_pos_request_flush_pasn_keys(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,struct wlan_pasn_request * peer_list,uint8_t num_peers)293*5113495bSYour Name wifi_pos_request_flush_pasn_keys(struct wlan_objmgr_psoc *psoc,
294*5113495bSYour Name 				 struct wlan_objmgr_vdev *vdev,
295*5113495bSYour Name 				 struct wlan_pasn_request *peer_list,
296*5113495bSYour Name 				 uint8_t num_peers)
297*5113495bSYour Name {
298*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
299*5113495bSYour Name 	struct wifi_pos_osif_ops *osif_cb;
300*5113495bSYour Name 	QDF_STATUS status;
301*5113495bSYour Name 
302*5113495bSYour Name 	osif_cb = wifi_pos_get_osif_callbacks();
303*5113495bSYour Name 	if (!osif_cb || !osif_cb->osif_initiate_pasn_cb) {
304*5113495bSYour Name 		wifi_pos_err("OSIF %s cb is NULL",
305*5113495bSYour Name 			     !osif_cb ? "" : "PASN");
306*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
307*5113495bSYour Name 	}
308*5113495bSYour Name 
309*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
310*5113495bSYour Name 	if (!vdev_pos_obj) {
311*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
312*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
313*5113495bSYour Name 	}
314*5113495bSYour Name 
315*5113495bSYour Name 	status = osif_cb->osif_initiate_pasn_cb(vdev, peer_list, num_peers,
316*5113495bSYour Name 						false);
317*5113495bSYour Name 
318*5113495bSYour Name 	return status;
319*5113495bSYour Name }
320*5113495bSYour Name 
321*5113495bSYour Name static QDF_STATUS
wifi_pos_check_and_initiate_pasn_authentication(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,struct wifi_pos_11az_context * pasn_ctx)322*5113495bSYour Name wifi_pos_check_and_initiate_pasn_authentication(struct wlan_objmgr_psoc *psoc,
323*5113495bSYour Name 						struct wlan_objmgr_vdev *vdev,
324*5113495bSYour Name 						struct wifi_pos_11az_context *pasn_ctx)
325*5113495bSYour Name {
326*5113495bSYour Name 	struct qdf_mac_addr bcast_mac = QDF_MAC_ADDR_BCAST_INIT;
327*5113495bSYour Name 	QDF_STATUS status;
328*5113495bSYour Name 
329*5113495bSYour Name 	if (pasn_ctx->num_pending_peer_creation ||
330*5113495bSYour Name 	    !pasn_ctx->num_secure_peers)
331*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
332*5113495bSYour Name 
333*5113495bSYour Name 	status = wifi_pos_request_external_pasn_auth(psoc, vdev,
334*5113495bSYour Name 						     pasn_ctx->secure_peer_list,
335*5113495bSYour Name 						     pasn_ctx->num_secure_peers);
336*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
337*5113495bSYour Name 		wifi_pos_err("Initiate Pasn Authentication failed");
338*5113495bSYour Name 		wifi_pos_move_peers_to_fail_list(vdev, &bcast_mac,
339*5113495bSYour Name 						 WLAN_WIFI_POS_PASN_SECURE_PEER);
340*5113495bSYour Name 		/* TODO send PASN_STATUS cmd from here */
341*5113495bSYour Name 	}
342*5113495bSYour Name 
343*5113495bSYour Name 	return status;
344*5113495bSYour Name }
345*5113495bSYour Name 
wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc * psoc,struct wlan_pasn_request * req,uint8_t vdev_id,uint8_t total_entries)346*5113495bSYour Name QDF_STATUS wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc *psoc,
347*5113495bSYour Name 					       struct wlan_pasn_request *req,
348*5113495bSYour Name 					       uint8_t vdev_id,
349*5113495bSYour Name 					       uint8_t total_entries)
350*5113495bSYour Name {
351*5113495bSYour Name 	struct wifi_pos_legacy_ops *legacy_cb;
352*5113495bSYour Name 	struct wlan_objmgr_peer *peer;
353*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
354*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
355*5113495bSYour Name 	struct wifi_pos_11az_context *pasn_context;
356*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
357*5113495bSYour Name 	uint8_t i;
358*5113495bSYour Name 
359*5113495bSYour Name 	legacy_cb = wifi_pos_get_legacy_ops();
360*5113495bSYour Name 	if (!legacy_cb || !legacy_cb->pasn_peer_create_cb) {
361*5113495bSYour Name 		wifi_pos_err("legacy callbacks is not registered");
362*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
363*5113495bSYour Name 	}
364*5113495bSYour Name 
365*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
366*5113495bSYour Name 						    WLAN_WIFI_POS_CORE_ID);
367*5113495bSYour Name 	if (!vdev) {
368*5113495bSYour Name 		wifi_pos_err("Vdev object is null");
369*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
370*5113495bSYour Name 	}
371*5113495bSYour Name 
372*5113495bSYour Name 	wifi_pos_debug("vdev:%d PASN peer create request received. Num peers:%d",
373*5113495bSYour Name 		       vdev_id, total_entries);
374*5113495bSYour Name 	for (i = 0; i < total_entries; i++) {
375*5113495bSYour Name 		peer = wlan_objmgr_get_peer_by_mac(psoc, req[i].peer_mac.bytes,
376*5113495bSYour Name 						   WLAN_WIFI_POS_CORE_ID);
377*5113495bSYour Name 		/*
378*5113495bSYour Name 		 * If already PASN peer is found, then this is a request to
379*5113495bSYour Name 		 * initiate PASN authentication alone and not to send
380*5113495bSYour Name 		 * peer create to fw
381*5113495bSYour Name 		 */
382*5113495bSYour Name 		if (peer &&
383*5113495bSYour Name 		    (wlan_peer_get_peer_type(peer) == WLAN_PEER_RTT_PASN)) {
384*5113495bSYour Name 			wifi_pos_debug("PASN Peer: " QDF_MAC_ADDR_FMT "already exists",
385*5113495bSYour Name 				       QDF_MAC_ADDR_REF(req[i].peer_mac.bytes));
386*5113495bSYour Name 			wifi_pos_add_peer_to_list(vdev, &req[i], false);
387*5113495bSYour Name 
388*5113495bSYour Name 			if (req[i].is_ltf_keyseed_required)
389*5113495bSYour Name 				wifi_pos_set_peer_ltf_keyseed_required(peer,
390*5113495bSYour Name 								       true);
391*5113495bSYour Name 			else
392*5113495bSYour Name 				wifi_pos_set_peer_ltf_keyseed_required(peer,
393*5113495bSYour Name 								       false);
394*5113495bSYour Name 			wlan_objmgr_peer_release_ref(peer,
395*5113495bSYour Name 						     WLAN_WIFI_POS_CORE_ID);
396*5113495bSYour Name 			continue;
397*5113495bSYour Name 		} else if (peer) {
398*5113495bSYour Name 			/*
399*5113495bSYour Name 			 * If a peer with given mac address already exists which
400*5113495bSYour Name 			 * is not a PASN peer, then move this peer to failed
401*5113495bSYour Name 			 * list
402*5113495bSYour Name 			 */
403*5113495bSYour Name 			wifi_pos_debug("Peer: " QDF_MAC_ADDR_FMT "of type:%d already exist",
404*5113495bSYour Name 				       QDF_MAC_ADDR_REF(req[i].peer_mac.bytes),
405*5113495bSYour Name 				       wlan_peer_get_peer_type(peer));
406*5113495bSYour Name 			wifi_pos_set_11az_failed_peers(vdev, &req[i].peer_mac);
407*5113495bSYour Name 			wlan_objmgr_peer_release_ref(peer,
408*5113495bSYour Name 						     WLAN_WIFI_POS_CORE_ID);
409*5113495bSYour Name 			continue;
410*5113495bSYour Name 		}
411*5113495bSYour Name 
412*5113495bSYour Name 		status = legacy_cb->pasn_peer_create_cb(psoc, &req[i].peer_mac,
413*5113495bSYour Name 							vdev_id);
414*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
415*5113495bSYour Name 			wifi_pos_set_11az_failed_peers(vdev, &req[i].peer_mac);
416*5113495bSYour Name 			continue;
417*5113495bSYour Name 		}
418*5113495bSYour Name 
419*5113495bSYour Name 		wifi_pos_update_pasn_peer_count(vdev, true);
420*5113495bSYour Name 		if (req[i].is_ltf_keyseed_required) {
421*5113495bSYour Name 			peer = wlan_objmgr_get_peer_by_mac(psoc,
422*5113495bSYour Name 							   req[i].peer_mac.bytes,
423*5113495bSYour Name 							   WLAN_WIFI_POS_CORE_ID);
424*5113495bSYour Name 			if (peer) {
425*5113495bSYour Name 				wifi_pos_set_peer_ltf_keyseed_required(peer,
426*5113495bSYour Name 								       true);
427*5113495bSYour Name 				wlan_objmgr_peer_release_ref(peer,
428*5113495bSYour Name 							     WLAN_WIFI_POS_CORE_ID);
429*5113495bSYour Name 			}
430*5113495bSYour Name 		}
431*5113495bSYour Name 
432*5113495bSYour Name 		/* Track the peers only for I-STA mode */
433*5113495bSYour Name 		if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE)
434*5113495bSYour Name 			wifi_pos_add_peer_to_list(vdev, &req[i], true);
435*5113495bSYour Name 	}
436*5113495bSYour Name 
437*5113495bSYour Name 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE)
438*5113495bSYour Name 		goto end;
439*5113495bSYour Name 
440*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
441*5113495bSYour Name 	if (!vdev_pos_obj) {
442*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
443*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
444*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
445*5113495bSYour Name 	}
446*5113495bSYour Name 
447*5113495bSYour Name 	/*
448*5113495bSYour Name 	 * If peer already exists for all the entries provided in the request,
449*5113495bSYour Name 	 * then fw peer create will not be sent again. Just the secure list
450*5113495bSYour Name 	 * will be updated and num_pending_peer_creation will be 0.
451*5113495bSYour Name 	 * In this case initiate the PASN auth directly without waiting for
452*5113495bSYour Name 	 * peer create response.
453*5113495bSYour Name 	 */
454*5113495bSYour Name 	pasn_context = &vdev_pos_obj->pasn_context;
455*5113495bSYour Name 	status = wifi_pos_check_and_initiate_pasn_authentication(psoc, vdev,
456*5113495bSYour Name 								 pasn_context);
457*5113495bSYour Name end:
458*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
459*5113495bSYour Name 
460*5113495bSYour Name 	return status;
461*5113495bSYour Name }
462*5113495bSYour Name 
463*5113495bSYour Name QDF_STATUS
wifi_pos_handle_ranging_peer_create_rsp(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,struct qdf_mac_addr * peer_mac,uint8_t peer_create_status)464*5113495bSYour Name wifi_pos_handle_ranging_peer_create_rsp(struct wlan_objmgr_psoc *psoc,
465*5113495bSYour Name 					uint8_t vdev_id,
466*5113495bSYour Name 					struct qdf_mac_addr *peer_mac,
467*5113495bSYour Name 					uint8_t peer_create_status)
468*5113495bSYour Name {
469*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
470*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
471*5113495bSYour Name 	struct wifi_pos_11az_context *pasn_context;
472*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
473*5113495bSYour Name 
474*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
475*5113495bSYour Name 						    WLAN_WIFI_POS_CORE_ID);
476*5113495bSYour Name 	if (!vdev) {
477*5113495bSYour Name 		wifi_pos_err("Vdev object is null");
478*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
479*5113495bSYour Name 	}
480*5113495bSYour Name 
481*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
482*5113495bSYour Name 	if (!vdev_pos_obj) {
483*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
484*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
485*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
486*5113495bSYour Name 	}
487*5113495bSYour Name 
488*5113495bSYour Name 	pasn_context = &vdev_pos_obj->pasn_context;
489*5113495bSYour Name 	if (pasn_context->num_pending_peer_creation)
490*5113495bSYour Name 		pasn_context->num_pending_peer_creation--;
491*5113495bSYour Name 
492*5113495bSYour Name 	wifi_pos_debug("Received peer create response for " QDF_MAC_ADDR_FMT " status:%d pending_count:%d",
493*5113495bSYour Name 		       QDF_MAC_ADDR_REF(peer_mac->bytes), peer_create_status,
494*5113495bSYour Name 		       pasn_context->num_pending_peer_creation);
495*5113495bSYour Name 
496*5113495bSYour Name 	if (peer_create_status) {
497*5113495bSYour Name 		wifi_pos_move_peers_to_fail_list(vdev, peer_mac,
498*5113495bSYour Name 						 WLAN_WIFI_POS_PASN_PEER_TYPE_MAX);
499*5113495bSYour Name 		wifi_pos_update_pasn_peer_count(vdev, false);
500*5113495bSYour Name 	}
501*5113495bSYour Name 
502*5113495bSYour Name 	status = wifi_pos_check_and_initiate_pasn_authentication(psoc, vdev,
503*5113495bSYour Name 								 pasn_context);
504*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
505*5113495bSYour Name 
506*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
507*5113495bSYour Name }
508*5113495bSYour Name 
wifi_pos_handle_ranging_peer_delete(struct wlan_objmgr_psoc * psoc,struct wlan_pasn_request * req,uint8_t vdev_id,uint8_t total_entries)509*5113495bSYour Name QDF_STATUS wifi_pos_handle_ranging_peer_delete(struct wlan_objmgr_psoc *psoc,
510*5113495bSYour Name 					       struct wlan_pasn_request *req,
511*5113495bSYour Name 					       uint8_t vdev_id,
512*5113495bSYour Name 					       uint8_t total_entries)
513*5113495bSYour Name {
514*5113495bSYour Name 	struct wifi_pos_legacy_ops *legacy_cb;
515*5113495bSYour Name 	struct wlan_objmgr_peer *peer;
516*5113495bSYour Name 	struct wlan_pasn_request *del_peer_list;
517*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
518*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
519*5113495bSYour Name 	bool no_fw_peer_delete;
520*5113495bSYour Name 	uint8_t peer_count = 0, i;
521*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
522*5113495bSYour Name 
523*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
524*5113495bSYour Name 						    WLAN_WIFI_POS_CORE_ID);
525*5113495bSYour Name 	if (!vdev) {
526*5113495bSYour Name 		wifi_pos_err("Vdev object is null");
527*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
528*5113495bSYour Name 	}
529*5113495bSYour Name 
530*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
531*5113495bSYour Name 	if (!vdev_pos_obj) {
532*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
533*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
534*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
535*5113495bSYour Name 	}
536*5113495bSYour Name 
537*5113495bSYour Name 	if (vdev_pos_obj->is_delete_all_pasn_peer_in_progress) {
538*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
539*5113495bSYour Name 		wifi_pos_err("Vdev delete all peer in progress. Ignore individual peer delete");
540*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
541*5113495bSYour Name 	}
542*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
543*5113495bSYour Name 
544*5113495bSYour Name 	legacy_cb = wifi_pos_get_legacy_ops();
545*5113495bSYour Name 	if (!legacy_cb || !legacy_cb->pasn_peer_delete_cb) {
546*5113495bSYour Name 		wifi_pos_err("legacy callback is not registered");
547*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
548*5113495bSYour Name 	}
549*5113495bSYour Name 
550*5113495bSYour Name 	del_peer_list = qdf_mem_malloc(sizeof(*del_peer_list) * total_entries);
551*5113495bSYour Name 	if (!del_peer_list)
552*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
553*5113495bSYour Name 
554*5113495bSYour Name 	for (i = 0; i < total_entries; i++) {
555*5113495bSYour Name 		peer = wlan_objmgr_get_peer_by_mac(psoc, req[i].peer_mac.bytes,
556*5113495bSYour Name 						   WLAN_WIFI_POS_CORE_ID);
557*5113495bSYour Name 		if (peer &&
558*5113495bSYour Name 		    (wlan_peer_get_peer_type(peer) == WLAN_PEER_RTT_PASN)) {
559*5113495bSYour Name 			no_fw_peer_delete = WIFI_POS_IS_PEER_ALREADY_DELETED(
560*5113495bSYour Name 							req[i].control_flags);
561*5113495bSYour Name 			wifi_pos_debug("Delete PASN Peer: " QDF_MAC_ADDR_FMT,
562*5113495bSYour Name 				       QDF_MAC_ADDR_REF(req[i].peer_mac.bytes));
563*5113495bSYour Name 
564*5113495bSYour Name 			del_peer_list[peer_count] = req[i];
565*5113495bSYour Name 			peer_count++;
566*5113495bSYour Name 
567*5113495bSYour Name 			status = legacy_cb->pasn_peer_delete_cb(
568*5113495bSYour Name 					psoc, &req[i].peer_mac,
569*5113495bSYour Name 					vdev_id, no_fw_peer_delete);
570*5113495bSYour Name 
571*5113495bSYour Name 			wlan_objmgr_peer_release_ref(peer,
572*5113495bSYour Name 						     WLAN_WIFI_POS_CORE_ID);
573*5113495bSYour Name 			continue;
574*5113495bSYour Name 		} else {
575*5113495bSYour Name 			wifi_pos_debug("PASN Peer: " QDF_MAC_ADDR_FMT "doesn't exist",
576*5113495bSYour Name 				       QDF_MAC_ADDR_REF(req[i].peer_mac.bytes));
577*5113495bSYour Name 			if (peer)
578*5113495bSYour Name 				wlan_objmgr_peer_release_ref(
579*5113495bSYour Name 						peer, WLAN_WIFI_POS_CORE_ID);
580*5113495bSYour Name 
581*5113495bSYour Name 			continue;
582*5113495bSYour Name 		}
583*5113495bSYour Name 	}
584*5113495bSYour Name 
585*5113495bSYour Name 	if (!peer_count) {
586*5113495bSYour Name 		wifi_pos_debug("No Peers to delete ");
587*5113495bSYour Name 		goto no_peer;
588*5113495bSYour Name 	}
589*5113495bSYour Name 
590*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
591*5113495bSYour Name 						    WLAN_WIFI_POS_CORE_ID);
592*5113495bSYour Name 	if (!vdev) {
593*5113495bSYour Name 		wifi_pos_err("Vdev object is null");
594*5113495bSYour Name 		qdf_mem_free(del_peer_list);
595*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
596*5113495bSYour Name 	}
597*5113495bSYour Name 
598*5113495bSYour Name 	status = wifi_pos_request_flush_pasn_keys(psoc, vdev,
599*5113495bSYour Name 						  del_peer_list,
600*5113495bSYour Name 						  peer_count);
601*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
602*5113495bSYour Name 		wifi_pos_err("Failed to indicate peer deauth to userspace");
603*5113495bSYour Name 
604*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
605*5113495bSYour Name 
606*5113495bSYour Name no_peer:
607*5113495bSYour Name 	qdf_mem_free(del_peer_list);
608*5113495bSYour Name 
609*5113495bSYour Name 	return status;
610*5113495bSYour Name }
611*5113495bSYour Name 
612*5113495bSYour Name QDF_STATUS
wifi_pos_send_pasn_auth_status(struct wlan_objmgr_psoc * psoc,struct wlan_pasn_auth_status * data)613*5113495bSYour Name wifi_pos_send_pasn_auth_status(struct wlan_objmgr_psoc *psoc,
614*5113495bSYour Name 			       struct wlan_pasn_auth_status *data)
615*5113495bSYour Name {
616*5113495bSYour Name 	struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops;
617*5113495bSYour Name 	QDF_STATUS status;
618*5113495bSYour Name 	uint8_t vdev_id = data->vdev_id;
619*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
620*5113495bSYour Name 	struct wifi_pos_11az_context *pasn_context;
621*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
622*5113495bSYour Name 	uint8_t i, failed_peers_counter = 0, total_peers_to_fill = 0;
623*5113495bSYour Name 
624*5113495bSYour Name 	tx_ops = wifi_pos_get_tx_ops(psoc);
625*5113495bSYour Name 	if (!tx_ops || !tx_ops->send_rtt_pasn_auth_status) {
626*5113495bSYour Name 		wifi_pos_err("%s is null",
627*5113495bSYour Name 			     tx_ops ? "Tx_ops" : "send_auth_status cb");
628*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
629*5113495bSYour Name 	}
630*5113495bSYour Name 
631*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
632*5113495bSYour Name 						    WLAN_WIFI_POS_CORE_ID);
633*5113495bSYour Name 	if (!vdev) {
634*5113495bSYour Name 		wifi_pos_err("vdev obj is null");
635*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
636*5113495bSYour Name 	}
637*5113495bSYour Name 
638*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
639*5113495bSYour Name 	if (!vdev_pos_obj) {
640*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
641*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
642*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
643*5113495bSYour Name 	}
644*5113495bSYour Name 
645*5113495bSYour Name 	pasn_context = &vdev_pos_obj->pasn_context;
646*5113495bSYour Name 	total_peers_to_fill = data->num_peers + pasn_context->num_failed_peers;
647*5113495bSYour Name 	for (i = data->num_peers; i < total_peers_to_fill; i++) {
648*5113495bSYour Name 		data->auth_status[i].peer_mac =
649*5113495bSYour Name 			pasn_context->failed_peer_list[failed_peers_counter];
650*5113495bSYour Name 		data->auth_status[i].status =
651*5113495bSYour Name 			WLAN_PASN_AUTH_STATUS_PEER_CREATE_FAILED;
652*5113495bSYour Name 
653*5113495bSYour Name 		failed_peers_counter++;
654*5113495bSYour Name 		if (failed_peers_counter >= pasn_context->num_failed_peers)
655*5113495bSYour Name 			break;
656*5113495bSYour Name 	}
657*5113495bSYour Name 
658*5113495bSYour Name 	status = tx_ops->send_rtt_pasn_auth_status(psoc, data);
659*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
660*5113495bSYour Name 		wifi_pos_err("Failed to send PASN authentication status");
661*5113495bSYour Name 
662*5113495bSYour Name 	wifi_pos_init_11az_context(vdev_pos_obj);
663*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
664*5113495bSYour Name 
665*5113495bSYour Name 	return status;
666*5113495bSYour Name }
667*5113495bSYour Name 
668*5113495bSYour Name QDF_STATUS
wifi_pos_send_pasn_peer_deauth(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * peer_mac)669*5113495bSYour Name wifi_pos_send_pasn_peer_deauth(struct wlan_objmgr_psoc *psoc,
670*5113495bSYour Name 			       struct qdf_mac_addr *peer_mac)
671*5113495bSYour Name {
672*5113495bSYour Name 	struct wlan_lmac_if_wifi_pos_tx_ops *tx_ops;
673*5113495bSYour Name 	QDF_STATUS status;
674*5113495bSYour Name 
675*5113495bSYour Name 	tx_ops = wifi_pos_get_tx_ops(psoc);
676*5113495bSYour Name 	if (!tx_ops || !tx_ops->send_rtt_pasn_deauth) {
677*5113495bSYour Name 		wifi_pos_err("%s is null",
678*5113495bSYour Name 			     tx_ops ? "Tx_ops" : "send_pasn deauth cb");
679*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
680*5113495bSYour Name 	}
681*5113495bSYour Name 
682*5113495bSYour Name 	status = tx_ops->send_rtt_pasn_deauth(psoc, peer_mac);
683*5113495bSYour Name 
684*5113495bSYour Name 	return status;
685*5113495bSYour Name }
686*5113495bSYour Name 
687*5113495bSYour Name QDF_STATUS
wifi_pos_set_peer_ltf_keyseed_required(struct wlan_objmgr_peer * peer,bool value)688*5113495bSYour Name wifi_pos_set_peer_ltf_keyseed_required(struct wlan_objmgr_peer *peer,
689*5113495bSYour Name 				       bool value)
690*5113495bSYour Name {
691*5113495bSYour Name 	struct wlan_wifi_pos_peer_priv_obj *peer_priv;
692*5113495bSYour Name 
693*5113495bSYour Name 	peer_priv = wifi_pos_get_peer_private_object(peer);
694*5113495bSYour Name 	if (!peer_priv) {
695*5113495bSYour Name 		wifi_pos_err("peer private object is null");
696*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
697*5113495bSYour Name 	}
698*5113495bSYour Name 
699*5113495bSYour Name 	peer_priv->is_ltf_keyseed_required = value;
700*5113495bSYour Name 	wifi_pos_debug("peer_mac:" QDF_MAC_ADDR_FMT " value:%d",
701*5113495bSYour Name 		       QDF_MAC_ADDR_REF(wlan_peer_get_macaddr(peer)), value);
702*5113495bSYour Name 
703*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
704*5113495bSYour Name }
705*5113495bSYour Name 
wifi_pos_is_ltf_keyseed_required_for_peer(struct wlan_objmgr_peer * peer)706*5113495bSYour Name bool wifi_pos_is_ltf_keyseed_required_for_peer(struct wlan_objmgr_peer *peer)
707*5113495bSYour Name {
708*5113495bSYour Name 	struct wlan_wifi_pos_peer_priv_obj *peer_priv;
709*5113495bSYour Name 
710*5113495bSYour Name 	peer_priv = wifi_pos_get_peer_private_object(peer);
711*5113495bSYour Name 	if (!peer_priv) {
712*5113495bSYour Name 		wifi_pos_err("peer private object is null");
713*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
714*5113495bSYour Name 	}
715*5113495bSYour Name 
716*5113495bSYour Name 	return peer_priv->is_ltf_keyseed_required;
717*5113495bSYour Name }
718*5113495bSYour Name 
719*5113495bSYour Name static
wifi_pos_delete_objmgr_ranging_peer(struct wlan_objmgr_psoc * psoc,void * object,void * arg)720*5113495bSYour Name void wifi_pos_delete_objmgr_ranging_peer(struct wlan_objmgr_psoc *psoc,
721*5113495bSYour Name 					 void *object, void *arg)
722*5113495bSYour Name {
723*5113495bSYour Name 	struct wlan_objmgr_peer *peer = object;
724*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev = arg;
725*5113495bSYour Name 	uint8_t vdev_id, peer_vdev_id;
726*5113495bSYour Name 	enum wlan_peer_type peer_type;
727*5113495bSYour Name 	QDF_STATUS status;
728*5113495bSYour Name 
729*5113495bSYour Name 	if (!peer) {
730*5113495bSYour Name 		wifi_pos_err("Peer is NULL");
731*5113495bSYour Name 		return;
732*5113495bSYour Name 	}
733*5113495bSYour Name 
734*5113495bSYour Name 	peer_type = wlan_peer_get_peer_type(peer);
735*5113495bSYour Name 	if (peer_type != WLAN_PEER_RTT_PASN)
736*5113495bSYour Name 		return;
737*5113495bSYour Name 
738*5113495bSYour Name 	if (!vdev) {
739*5113495bSYour Name 		wifi_pos_err("VDEV is NULL");
740*5113495bSYour Name 		return;
741*5113495bSYour Name 	}
742*5113495bSYour Name 
743*5113495bSYour Name 	vdev_id = wlan_vdev_get_id(vdev);
744*5113495bSYour Name 	peer_vdev_id = wlan_vdev_get_id(wlan_peer_get_vdev(peer));
745*5113495bSYour Name 	if (vdev_id != peer_vdev_id)
746*5113495bSYour Name 		return;
747*5113495bSYour Name 
748*5113495bSYour Name 	status = wlan_objmgr_peer_obj_delete(peer);
749*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
750*5113495bSYour Name 		wifi_pos_err("Failed to delete peer");
751*5113495bSYour Name 
752*5113495bSYour Name 	wifi_pos_update_pasn_peer_count(vdev, false);
753*5113495bSYour Name }
754*5113495bSYour Name 
755*5113495bSYour Name QDF_STATUS
wifi_pos_cleanup_pasn_peers(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)756*5113495bSYour Name wifi_pos_cleanup_pasn_peers(struct wlan_objmgr_psoc *psoc,
757*5113495bSYour Name 			    struct wlan_objmgr_vdev *vdev)
758*5113495bSYour Name {
759*5113495bSYour Name 	QDF_STATUS status;
760*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
761*5113495bSYour Name 
762*5113495bSYour Name 	wifi_pos_debug("Iterate and delete PASN peers");
763*5113495bSYour Name 	status = wlan_objmgr_iterate_obj_list(psoc, WLAN_PEER_OP,
764*5113495bSYour Name 					      wifi_pos_delete_objmgr_ranging_peer,
765*5113495bSYour Name 					      vdev, 0, WLAN_WIFI_POS_CORE_ID);
766*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
767*5113495bSYour Name 		wifi_pos_err("Delete objmgr peers failed");
768*5113495bSYour Name 
769*5113495bSYour Name 	/*
770*5113495bSYour Name 	 * PASN Peer count should be zero here
771*5113495bSYour Name 	 */
772*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
773*5113495bSYour Name 	if (vdev_pos_obj)
774*5113495bSYour Name 		vdev_pos_obj->num_pasn_peers = 0;
775*5113495bSYour Name 
776*5113495bSYour Name 	return status;
777*5113495bSYour Name }
778*5113495bSYour Name 
779*5113495bSYour Name QDF_STATUS
wifi_pos_vdev_delete_all_ranging_peers(struct wlan_objmgr_vdev * vdev)780*5113495bSYour Name wifi_pos_vdev_delete_all_ranging_peers(struct wlan_objmgr_vdev *vdev)
781*5113495bSYour Name {
782*5113495bSYour Name 	QDF_STATUS status;
783*5113495bSYour Name 	struct vdev_mlme_obj *vdev_mlme;
784*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
785*5113495bSYour Name 	struct peer_delete_all_params param;
786*5113495bSYour Name 
787*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
788*5113495bSYour Name 	if (!vdev_pos_obj) {
789*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
790*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
791*5113495bSYour Name 	}
792*5113495bSYour Name 
793*5113495bSYour Name 	if (!vdev_pos_obj->num_pasn_peers)
794*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
795*5113495bSYour Name 
796*5113495bSYour Name 	vdev_pos_obj->is_delete_all_pasn_peer_in_progress = true;
797*5113495bSYour Name 
798*5113495bSYour Name 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
799*5113495bSYour Name 	if (!vdev_mlme) {
800*5113495bSYour Name 		wifi_pos_err(" VDEV MLME component object is NULL");
801*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
802*5113495bSYour Name 	}
803*5113495bSYour Name 
804*5113495bSYour Name 	param.vdev_id = wlan_vdev_get_id(vdev);
805*5113495bSYour Name 	param.peer_type_bitmap = BIT(WLAN_PEER_RTT_PASN);
806*5113495bSYour Name 
807*5113495bSYour Name 	status = tgt_vdev_mgr_peer_delete_all_send(vdev_mlme, &param);
808*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
809*5113495bSYour Name 		wifi_pos_err("Send vdev delete all peers failed");
810*5113495bSYour Name 
811*5113495bSYour Name 	return status;
812*5113495bSYour Name }
813*5113495bSYour Name 
814*5113495bSYour Name QDF_STATUS
wifi_pos_vdev_delete_all_ranging_peers_rsp(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)815*5113495bSYour Name wifi_pos_vdev_delete_all_ranging_peers_rsp(struct wlan_objmgr_psoc *psoc,
816*5113495bSYour Name 					   uint8_t vdev_id)
817*5113495bSYour Name {
818*5113495bSYour Name 	struct wifi_pos_legacy_ops *legacy_cb;
819*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
820*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
821*5113495bSYour Name 	QDF_STATUS status;
822*5113495bSYour Name 
823*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
824*5113495bSYour Name 						    WLAN_WIFI_POS_CORE_ID);
825*5113495bSYour Name 	if (!vdev) {
826*5113495bSYour Name 		wifi_pos_err(" VDEV is NULL");
827*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
828*5113495bSYour Name 	}
829*5113495bSYour Name 
830*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
831*5113495bSYour Name 	if (!vdev_pos_obj) {
832*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
833*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
834*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
835*5113495bSYour Name 	}
836*5113495bSYour Name 
837*5113495bSYour Name 	status = wifi_pos_cleanup_pasn_peers(psoc, vdev);
838*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
839*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
840*5113495bSYour Name 		return status;
841*5113495bSYour Name 	}
842*5113495bSYour Name 
843*5113495bSYour Name 	/*
844*5113495bSYour Name 	 * Should have deleted all the pasn peers when we reach here
845*5113495bSYour Name 	 */
846*5113495bSYour Name 	vdev_pos_obj->is_delete_all_pasn_peer_in_progress = false;
847*5113495bSYour Name 	vdev_pos_obj->num_pasn_peers = 0;
848*5113495bSYour Name 
849*5113495bSYour Name 	legacy_cb = wifi_pos_get_legacy_ops();
850*5113495bSYour Name 	if (!legacy_cb || !legacy_cb->pasn_vdev_delete_resume_cb) {
851*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
852*5113495bSYour Name 		wifi_pos_err("legacy callbacks is not registered");
853*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
854*5113495bSYour Name 	}
855*5113495bSYour Name 
856*5113495bSYour Name 	status = legacy_cb->pasn_vdev_delete_resume_cb(vdev);
857*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
858*5113495bSYour Name 		wifi_pos_err("Delete all PASN peer failed");
859*5113495bSYour Name 
860*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
861*5113495bSYour Name 
862*5113495bSYour Name 	return status;
863*5113495bSYour Name }
864*5113495bSYour Name 
wifi_pos_is_delete_all_peer_in_progress(struct wlan_objmgr_vdev * vdev)865*5113495bSYour Name bool wifi_pos_is_delete_all_peer_in_progress(struct wlan_objmgr_vdev *vdev)
866*5113495bSYour Name {
867*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
868*5113495bSYour Name 
869*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
870*5113495bSYour Name 	if (!vdev_pos_obj) {
871*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
872*5113495bSYour Name 		return false;
873*5113495bSYour Name 	}
874*5113495bSYour Name 
875*5113495bSYour Name 	return vdev_pos_obj->is_delete_all_pasn_peer_in_progress;
876*5113495bSYour Name }
877*5113495bSYour Name 
wifi_pos_set_delete_all_peer_in_progress(struct wlan_objmgr_vdev * vdev,bool flag)878*5113495bSYour Name void wifi_pos_set_delete_all_peer_in_progress(struct wlan_objmgr_vdev *vdev,
879*5113495bSYour Name 					      bool flag)
880*5113495bSYour Name {
881*5113495bSYour Name 	struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
882*5113495bSYour Name 
883*5113495bSYour Name 	vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
884*5113495bSYour Name 	if (!vdev_pos_obj) {
885*5113495bSYour Name 		wifi_pos_err("Wifi pos vdev priv obj is null");
886*5113495bSYour Name 		return;
887*5113495bSYour Name 	}
888*5113495bSYour Name 
889*5113495bSYour Name 	vdev_pos_obj->is_delete_all_pasn_peer_in_progress = flag;
890*5113495bSYour Name }
891