xref: /wlan-driver/qcacld-3.0/components/cmn_services/logging/src/wlan_connectivity_logging.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name /*
19*5113495bSYour Name  * DOC: wlan_cm_roam_logging.c
20*5113495bSYour Name  *
21*5113495bSYour Name  * Implementation for the connectivity and roam logging api.
22*5113495bSYour Name  */
23*5113495bSYour Name #include "wlan_connectivity_logging.h"
24*5113495bSYour Name #include "wlan_cm_api.h"
25*5113495bSYour Name #include "wlan_mlme_main.h"
26*5113495bSYour Name #include "wlan_mlo_mgr_sta.h"
27*5113495bSYour Name #include "wlan_mlme_api.h"
28*5113495bSYour Name #include "cdp_txrx_ctrl.h"
29*5113495bSYour Name #include "wlan_mlo_mgr_peer.h"
30*5113495bSYour Name #include "wlan_scan_api.h"
31*5113495bSYour Name 
32*5113495bSYour Name #ifdef WLAN_FEATURE_CONNECTIVITY_LOGGING
33*5113495bSYour Name static struct wlan_connectivity_log_buf_data global_cl;
34*5113495bSYour Name 
35*5113495bSYour Name static void
wlan_connectivity_logging_register_callbacks(struct wlan_cl_osif_cbks * osif_cbks,void * osif_cb_context)36*5113495bSYour Name wlan_connectivity_logging_register_callbacks(
37*5113495bSYour Name 				struct wlan_cl_osif_cbks *osif_cbks,
38*5113495bSYour Name 				void *osif_cb_context)
39*5113495bSYour Name {
40*5113495bSYour Name 	global_cl.osif_cbks.wlan_connectivity_log_send_to_usr =
41*5113495bSYour Name 			osif_cbks->wlan_connectivity_log_send_to_usr;
42*5113495bSYour Name 	global_cl.osif_cb_context = osif_cb_context;
43*5113495bSYour Name }
44*5113495bSYour Name 
wlan_connectivity_logging_start(struct wlan_objmgr_psoc * psoc,struct wlan_cl_osif_cbks * osif_cbks,void * osif_cb_context)45*5113495bSYour Name void wlan_connectivity_logging_start(struct wlan_objmgr_psoc *psoc,
46*5113495bSYour Name 				     struct wlan_cl_osif_cbks *osif_cbks,
47*5113495bSYour Name 				     void *osif_cb_context)
48*5113495bSYour Name {
49*5113495bSYour Name 	global_cl.head = qdf_mem_valloc(sizeof(*global_cl.head) *
50*5113495bSYour Name 					WLAN_MAX_LOG_RECORDS);
51*5113495bSYour Name 	if (!global_cl.head) {
52*5113495bSYour Name 		QDF_BUG(0);
53*5113495bSYour Name 		return;
54*5113495bSYour Name 	}
55*5113495bSYour Name 
56*5113495bSYour Name 	global_cl.psoc = psoc;
57*5113495bSYour Name 	global_cl.write_idx = 0;
58*5113495bSYour Name 	global_cl.read_idx = 0;
59*5113495bSYour Name 
60*5113495bSYour Name 	qdf_atomic_init(&global_cl.dropped_msgs);
61*5113495bSYour Name 	qdf_spinlock_create(&global_cl.write_ptr_lock);
62*5113495bSYour Name 
63*5113495bSYour Name 	global_cl.read_ptr = global_cl.head;
64*5113495bSYour Name 	global_cl.write_ptr = global_cl.head;
65*5113495bSYour Name 	global_cl.max_records = WLAN_MAX_LOG_RECORDS;
66*5113495bSYour Name 
67*5113495bSYour Name 	wlan_connectivity_logging_register_callbacks(osif_cbks,
68*5113495bSYour Name 						     osif_cb_context);
69*5113495bSYour Name 	qdf_atomic_set(&global_cl.is_active, 1);
70*5113495bSYour Name }
71*5113495bSYour Name 
wlan_connectivity_logging_stop(void)72*5113495bSYour Name void wlan_connectivity_logging_stop(void)
73*5113495bSYour Name {
74*5113495bSYour Name 	if (!qdf_atomic_read(&global_cl.is_active))
75*5113495bSYour Name 		return;
76*5113495bSYour Name 
77*5113495bSYour Name 	qdf_spin_lock_bh(&global_cl.write_ptr_lock);
78*5113495bSYour Name 
79*5113495bSYour Name 	global_cl.psoc = NULL;
80*5113495bSYour Name 	global_cl.osif_cb_context = NULL;
81*5113495bSYour Name 	global_cl.osif_cbks.wlan_connectivity_log_send_to_usr = NULL;
82*5113495bSYour Name 
83*5113495bSYour Name 	qdf_atomic_set(&global_cl.is_active, 0);
84*5113495bSYour Name 	global_cl.read_ptr = NULL;
85*5113495bSYour Name 	global_cl.write_ptr = NULL;
86*5113495bSYour Name 	global_cl.read_idx = 0;
87*5113495bSYour Name 	global_cl.write_idx = 0;
88*5113495bSYour Name 
89*5113495bSYour Name 	qdf_mem_vfree(global_cl.head);
90*5113495bSYour Name 	global_cl.head = NULL;
91*5113495bSYour Name 	qdf_spin_unlock_bh(&global_cl.write_ptr_lock);
92*5113495bSYour Name 	qdf_spinlock_destroy(&global_cl.write_ptr_lock);
93*5113495bSYour Name }
94*5113495bSYour Name #endif
95*5113495bSYour Name 
96*5113495bSYour Name #if defined(WLAN_FEATURE_ROAM_OFFLOAD) && \
97*5113495bSYour Name 	defined(WLAN_FEATURE_11BE_MLO)
98*5113495bSYour Name static void
wlan_clear_ml_vdev_sae_auth_logs(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)99*5113495bSYour Name wlan_clear_ml_vdev_sae_auth_logs(struct wlan_objmgr_psoc *psoc,
100*5113495bSYour Name 				 struct wlan_objmgr_vdev *vdev)
101*5113495bSYour Name {
102*5113495bSYour Name 	struct wlan_mlo_dev_context *mlo_dev_ctx;
103*5113495bSYour Name 	struct wlan_objmgr_vdev *link_vdev;
104*5113495bSYour Name 	struct mlme_legacy_priv *mlme_priv;
105*5113495bSYour Name 	uint8_t i, link_vdev_id;
106*5113495bSYour Name 
107*5113495bSYour Name 	mlo_dev_ctx = vdev->mlo_dev_ctx;
108*5113495bSYour Name 	if (!mlo_dev_ctx) {
109*5113495bSYour Name 		logging_err_rl("mlo_dev ctx is NULL for vdev:%d",
110*5113495bSYour Name 			       wlan_vdev_get_id(vdev));
111*5113495bSYour Name 		return;
112*5113495bSYour Name 	}
113*5113495bSYour Name 
114*5113495bSYour Name 	for (i =  0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
115*5113495bSYour Name 		if (!mlo_dev_ctx->wlan_vdev_list[i])
116*5113495bSYour Name 			continue;
117*5113495bSYour Name 
118*5113495bSYour Name 		link_vdev_id =
119*5113495bSYour Name 			wlan_vdev_get_id(mlo_dev_ctx->wlan_vdev_list[i]);
120*5113495bSYour Name 		link_vdev = mlo_dev_ctx->wlan_vdev_list[i];
121*5113495bSYour Name 
122*5113495bSYour Name 		mlme_priv = wlan_vdev_mlme_get_ext_hdl(link_vdev);
123*5113495bSYour Name 		if (!mlme_priv) {
124*5113495bSYour Name 			logging_err_rl("vdev:%d legacy private object is NULL",
125*5113495bSYour Name 				       link_vdev_id);
126*5113495bSYour Name 			return;
127*5113495bSYour Name 		}
128*5113495bSYour Name 
129*5113495bSYour Name 		logging_debug("vdev:%d clear sae auth logs cache",
130*5113495bSYour Name 			      link_vdev_id);
131*5113495bSYour Name 		qdf_mem_zero(mlme_priv->auth_log, sizeof(mlme_priv->auth_log));
132*5113495bSYour Name 	}
133*5113495bSYour Name }
134*5113495bSYour Name #else
135*5113495bSYour Name static inline void
wlan_clear_ml_vdev_sae_auth_logs(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)136*5113495bSYour Name wlan_clear_ml_vdev_sae_auth_logs(struct wlan_objmgr_psoc *psoc,
137*5113495bSYour Name 				 struct wlan_objmgr_vdev *vdev)
138*5113495bSYour Name {}
139*5113495bSYour Name #endif
140*5113495bSYour Name 
141*5113495bSYour Name #ifdef WLAN_FEATURE_ROAM_OFFLOAD
wlan_clear_sae_auth_logs_cache(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)142*5113495bSYour Name void wlan_clear_sae_auth_logs_cache(struct wlan_objmgr_psoc *psoc,
143*5113495bSYour Name 				    uint8_t vdev_id)
144*5113495bSYour Name {
145*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
146*5113495bSYour Name 	struct mlme_legacy_priv *mlme_priv;
147*5113495bSYour Name 
148*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
149*5113495bSYour Name 						    WLAN_MLME_OBJMGR_ID);
150*5113495bSYour Name 	if (!vdev) {
151*5113495bSYour Name 		logging_err_rl("Invalid vdev:%d", vdev_id);
152*5113495bSYour Name 		return;
153*5113495bSYour Name 	}
154*5113495bSYour Name 
155*5113495bSYour Name 	if (wlan_vdev_mlme_is_mlo_vdev(vdev)) {
156*5113495bSYour Name 		wlan_clear_ml_vdev_sae_auth_logs(psoc, vdev);
157*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
158*5113495bSYour Name 		return;
159*5113495bSYour Name 	}
160*5113495bSYour Name 
161*5113495bSYour Name 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
162*5113495bSYour Name 	if (!mlme_priv) {
163*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
164*5113495bSYour Name 		logging_err_rl("vdev legacy private object is NULL");
165*5113495bSYour Name 		return;
166*5113495bSYour Name 	}
167*5113495bSYour Name 
168*5113495bSYour Name 	logging_debug("vdev:%d clear sae auth logs cache", vdev_id);
169*5113495bSYour Name 	qdf_mem_zero(mlme_priv->auth_log, sizeof(mlme_priv->auth_log));
170*5113495bSYour Name 
171*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
172*5113495bSYour Name }
173*5113495bSYour Name #endif
174*5113495bSYour Name 
175*5113495bSYour Name #if defined(WLAN_FEATURE_ROAM_OFFLOAD) && defined(CONNECTIVITY_DIAG_EVENT)
wlan_print_cached_sae_auth_logs(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * bssid,uint8_t vdev_id)176*5113495bSYour Name QDF_STATUS wlan_print_cached_sae_auth_logs(struct wlan_objmgr_psoc *psoc,
177*5113495bSYour Name 					   struct qdf_mac_addr *bssid,
178*5113495bSYour Name 					   uint8_t vdev_id)
179*5113495bSYour Name {
180*5113495bSYour Name 	uint8_t i, j;
181*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
182*5113495bSYour Name 	struct mlme_legacy_priv *mlme_priv;
183*5113495bSYour Name 
184*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
185*5113495bSYour Name 						    WLAN_MLME_OBJMGR_ID);
186*5113495bSYour Name 	if (!vdev) {
187*5113495bSYour Name 		logging_err_rl("Invalid vdev:%d", vdev_id);
188*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
189*5113495bSYour Name 	}
190*5113495bSYour Name 
191*5113495bSYour Name 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE) {
192*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
193*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
194*5113495bSYour Name 	}
195*5113495bSYour Name 
196*5113495bSYour Name 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
197*5113495bSYour Name 	if (!mlme_priv) {
198*5113495bSYour Name 		logging_err_rl("vdev legacy private object is NULL");
199*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
200*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
201*5113495bSYour Name 	}
202*5113495bSYour Name 
203*5113495bSYour Name 	/*
204*5113495bSYour Name 	 * Get the index of matching bssid and queue all the records for
205*5113495bSYour Name 	 * that bssid
206*5113495bSYour Name 	 */
207*5113495bSYour Name 	for (i = 0; i < MAX_ROAM_CANDIDATE_AP; i++) {
208*5113495bSYour Name 		if (!mlme_priv->auth_log[i][0].diag_cmn.ktime_us)
209*5113495bSYour Name 			continue;
210*5113495bSYour Name 
211*5113495bSYour Name 		if (qdf_is_macaddr_equal(bssid,
212*5113495bSYour Name 					 (struct qdf_mac_addr *)mlme_priv->auth_log[i][0].diag_cmn.bssid))
213*5113495bSYour Name 			break;
214*5113495bSYour Name 	}
215*5113495bSYour Name 
216*5113495bSYour Name 	/*
217*5113495bSYour Name 	 * No matching bssid found in cached log records.
218*5113495bSYour Name 	 * So return from here.
219*5113495bSYour Name 	 */
220*5113495bSYour Name 	if (i >= MAX_ROAM_CANDIDATE_AP) {
221*5113495bSYour Name 		logging_debug("No cached SAE auth logs");
222*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
223*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
224*5113495bSYour Name 	}
225*5113495bSYour Name 
226*5113495bSYour Name 	for (j = 0; j < WLAN_ROAM_MAX_CACHED_AUTH_FRAMES; j++) {
227*5113495bSYour Name 		if (!mlme_priv->auth_log[i][j].diag_cmn.ktime_us)
228*5113495bSYour Name 			continue;
229*5113495bSYour Name 
230*5113495bSYour Name 		WLAN_HOST_DIAG_EVENT_REPORT(&mlme_priv->auth_log[i][j],
231*5113495bSYour Name 					    EVENT_WLAN_MGMT);
232*5113495bSYour Name 		qdf_mem_zero(&mlme_priv->auth_log[i][j],
233*5113495bSYour Name 			     sizeof(struct wlan_diag_packet_info));
234*5113495bSYour Name 	}
235*5113495bSYour Name 
236*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
237*5113495bSYour Name 
238*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
239*5113495bSYour Name }
240*5113495bSYour Name 
wlan_is_log_record_present_for_bssid(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * bssid,uint8_t vdev_id)241*5113495bSYour Name bool wlan_is_log_record_present_for_bssid(struct wlan_objmgr_psoc *psoc,
242*5113495bSYour Name 					  struct qdf_mac_addr *bssid,
243*5113495bSYour Name 					  uint8_t vdev_id)
244*5113495bSYour Name {
245*5113495bSYour Name 	struct wlan_diag_packet_info *pkt_info;
246*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
247*5113495bSYour Name 	struct mlme_legacy_priv *mlme_priv;
248*5113495bSYour Name 	int i;
249*5113495bSYour Name 
250*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
251*5113495bSYour Name 						    WLAN_MLME_OBJMGR_ID);
252*5113495bSYour Name 	if (!vdev) {
253*5113495bSYour Name 		logging_err_rl("Invalid vdev:%d", vdev_id);
254*5113495bSYour Name 		return false;
255*5113495bSYour Name 	}
256*5113495bSYour Name 
257*5113495bSYour Name 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
258*5113495bSYour Name 	if (!mlme_priv) {
259*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
260*5113495bSYour Name 		logging_err_rl("vdev legacy private object is NULL");
261*5113495bSYour Name 		return false;
262*5113495bSYour Name 	}
263*5113495bSYour Name 
264*5113495bSYour Name 	for (i = 0; i < MAX_ROAM_CANDIDATE_AP; i++) {
265*5113495bSYour Name 		pkt_info = &mlme_priv->auth_log[i][0];
266*5113495bSYour Name 		if (!pkt_info->diag_cmn.ktime_us)
267*5113495bSYour Name 			continue;
268*5113495bSYour Name 
269*5113495bSYour Name 		if (qdf_is_macaddr_equal(bssid,
270*5113495bSYour Name 					 (struct qdf_mac_addr *)pkt_info->diag_cmn.bssid)) {
271*5113495bSYour Name 			wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
272*5113495bSYour Name 			return true;
273*5113495bSYour Name 		}
274*5113495bSYour Name 	}
275*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
276*5113495bSYour Name 
277*5113495bSYour Name 	return false;
278*5113495bSYour Name }
279*5113495bSYour Name 
280*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
281*5113495bSYour Name bool
wlan_is_sae_auth_log_present_for_bssid(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * bssid,uint8_t * vdev_id)282*5113495bSYour Name wlan_is_sae_auth_log_present_for_bssid(struct wlan_objmgr_psoc *psoc,
283*5113495bSYour Name 				       struct qdf_mac_addr *bssid,
284*5113495bSYour Name 				       uint8_t *vdev_id)
285*5113495bSYour Name {
286*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
287*5113495bSYour Name 	struct wlan_mlo_dev_context *mlo_dev_ctx;
288*5113495bSYour Name 	uint8_t i, link_vdev_id;
289*5113495bSYour Name 
290*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, *vdev_id,
291*5113495bSYour Name 						    WLAN_MLME_OBJMGR_ID);
292*5113495bSYour Name 	if (!vdev) {
293*5113495bSYour Name 		logging_err_rl("Invalid vdev:%d", *vdev_id);
294*5113495bSYour Name 		return false;
295*5113495bSYour Name 	}
296*5113495bSYour Name 
297*5113495bSYour Name 	if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
298*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
299*5113495bSYour Name 		return wlan_is_log_record_present_for_bssid(psoc, bssid,
300*5113495bSYour Name 							    *vdev_id);
301*5113495bSYour Name 	}
302*5113495bSYour Name 
303*5113495bSYour Name 	mlo_dev_ctx = vdev->mlo_dev_ctx;
304*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
305*5113495bSYour Name 
306*5113495bSYour Name 	if (!mlo_dev_ctx) {
307*5113495bSYour Name 		logging_err_rl("mlo_dev ctx is NULL for vdev:%d", *vdev_id);
308*5113495bSYour Name 		return wlan_is_log_record_present_for_bssid(psoc, bssid,
309*5113495bSYour Name 							    *vdev_id);
310*5113495bSYour Name 	}
311*5113495bSYour Name 
312*5113495bSYour Name 	for (i =  0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
313*5113495bSYour Name 		if (!mlo_dev_ctx->wlan_vdev_list[i])
314*5113495bSYour Name 			continue;
315*5113495bSYour Name 
316*5113495bSYour Name 		link_vdev_id = wlan_vdev_get_id(mlo_dev_ctx->wlan_vdev_list[i]);
317*5113495bSYour Name 		if (wlan_is_log_record_present_for_bssid(psoc, bssid,
318*5113495bSYour Name 							 link_vdev_id)) {
319*5113495bSYour Name 			*vdev_id = link_vdev_id;
320*5113495bSYour Name 			return true;
321*5113495bSYour Name 		}
322*5113495bSYour Name 	}
323*5113495bSYour Name 
324*5113495bSYour Name 	return false;
325*5113495bSYour Name }
326*5113495bSYour Name #else
327*5113495bSYour Name bool
wlan_is_sae_auth_log_present_for_bssid(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * bssid,uint8_t * vdev_id)328*5113495bSYour Name wlan_is_sae_auth_log_present_for_bssid(struct wlan_objmgr_psoc *psoc,
329*5113495bSYour Name 				       struct qdf_mac_addr *bssid,
330*5113495bSYour Name 				       uint8_t *vdev_id)
331*5113495bSYour Name {
332*5113495bSYour Name 	return wlan_is_log_record_present_for_bssid(psoc, bssid, *vdev_id);
333*5113495bSYour Name }
334*5113495bSYour Name #endif
335*5113495bSYour Name 
336*5113495bSYour Name /**
337*5113495bSYour Name  * wlan_add_sae_log_record_to_available_slot() - Add a new log record into the
338*5113495bSYour Name  * cache for the queue.
339*5113495bSYour Name  * @psoc: objmgr psoc object
340*5113495bSYour Name  * @vdev: objmgr vdev object
341*5113495bSYour Name  * @pkt_info: Log packet record pointer
342*5113495bSYour Name  *
343*5113495bSYour Name  * Return: QDF_STATUS
344*5113495bSYour Name  */
345*5113495bSYour Name static QDF_STATUS
wlan_add_sae_log_record_to_available_slot(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev,struct wlan_diag_packet_info * pkt_info)346*5113495bSYour Name wlan_add_sae_log_record_to_available_slot(struct wlan_objmgr_psoc *psoc,
347*5113495bSYour Name 					  struct wlan_objmgr_vdev *vdev,
348*5113495bSYour Name 					  struct wlan_diag_packet_info *pkt_info)
349*5113495bSYour Name {
350*5113495bSYour Name 	struct mlme_legacy_priv *mlme_priv;
351*5113495bSYour Name 	uint8_t i, j;
352*5113495bSYour Name 	uint8_t vdev_id = wlan_vdev_get_id(vdev);
353*5113495bSYour Name 	bool is_entry_exist =
354*5113495bSYour Name 		wlan_is_log_record_present_for_bssid(psoc,
355*5113495bSYour Name 						     (struct qdf_mac_addr *)pkt_info->diag_cmn.bssid,
356*5113495bSYour Name 						     vdev_id);
357*5113495bSYour Name 
358*5113495bSYour Name 	mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
359*5113495bSYour Name 	if (!mlme_priv) {
360*5113495bSYour Name 		logging_err_rl("vdev:%d legacy private object is NULL",
361*5113495bSYour Name 			       vdev_id);
362*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
363*5113495bSYour Name 	}
364*5113495bSYour Name 
365*5113495bSYour Name 	for (i = 0; i < MAX_ROAM_CANDIDATE_AP; i++) {
366*5113495bSYour Name 		if (is_entry_exist &&
367*5113495bSYour Name 		    mlme_priv->auth_log[i][0].diag_cmn.ktime_us &&
368*5113495bSYour Name 		    qdf_is_macaddr_equal((struct qdf_mac_addr *)pkt_info->diag_cmn.bssid,
369*5113495bSYour Name 					 (struct qdf_mac_addr *)mlme_priv->auth_log[i][0].diag_cmn.bssid)) {
370*5113495bSYour Name 			/*
371*5113495bSYour Name 			 * Frames for given bssid already exists store the new
372*5113495bSYour Name 			 * frame in corresponding array in empty slot
373*5113495bSYour Name 			 */
374*5113495bSYour Name 			for (j = 0; j < WLAN_ROAM_MAX_CACHED_AUTH_FRAMES; j++) {
375*5113495bSYour Name 				if (mlme_priv->auth_log[i][j].diag_cmn.ktime_us)
376*5113495bSYour Name 					continue;
377*5113495bSYour Name 
378*5113495bSYour Name 				logging_debug("vdev:%d added at [i][j]:[%d][%d]",
379*5113495bSYour Name 					      vdev_id, i, j);
380*5113495bSYour Name 				mlme_priv->auth_log[i][j] = *pkt_info;
381*5113495bSYour Name 				break;
382*5113495bSYour Name 			}
383*5113495bSYour Name 
384*5113495bSYour Name 		} else if (!is_entry_exist &&
385*5113495bSYour Name 			   !mlme_priv->auth_log[i][0].diag_cmn.ktime_us) {
386*5113495bSYour Name 			/*
387*5113495bSYour Name 			 * For given record, there is no existing bssid
388*5113495bSYour Name 			 * so add the entry at first available slot
389*5113495bSYour Name 			 */
390*5113495bSYour Name 			logging_debug("vdev:%d added entry at [i][j]:[%d][%d]",
391*5113495bSYour Name 				      vdev_id, i, 0);
392*5113495bSYour Name 			mlme_priv->auth_log[i][0] = *pkt_info;
393*5113495bSYour Name 			break;
394*5113495bSYour Name 		}
395*5113495bSYour Name 	}
396*5113495bSYour Name 
397*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
398*5113495bSYour Name }
399*5113495bSYour Name 
400*5113495bSYour Name static void
wlan_cache_connectivity_log(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,struct wlan_diag_packet_info * pkt_info)401*5113495bSYour Name wlan_cache_connectivity_log(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
402*5113495bSYour Name 			    struct wlan_diag_packet_info *pkt_info)
403*5113495bSYour Name {
404*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
405*5113495bSYour Name 
406*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
407*5113495bSYour Name 						    WLAN_MLME_OBJMGR_ID);
408*5113495bSYour Name 	if (!vdev) {
409*5113495bSYour Name 		logging_err_rl("Invalid vdev:%d", vdev_id);
410*5113495bSYour Name 		return;
411*5113495bSYour Name 	}
412*5113495bSYour Name 
413*5113495bSYour Name 	wlan_add_sae_log_record_to_available_slot(psoc, vdev, pkt_info);
414*5113495bSYour Name 
415*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
416*5113495bSYour Name }
417*5113495bSYour Name #endif
418*5113495bSYour Name 
419*5113495bSYour Name #define WLAN_SAE_AUTH_ALGO_NUMBER 3
420*5113495bSYour Name #ifdef CONNECTIVITY_DIAG_EVENT
421*5113495bSYour Name 
422*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
423*5113495bSYour Name void
wlan_connectivity_t2lm_req_resp_event(struct wlan_objmgr_vdev * vdev,uint8_t token,enum wlan_t2lm_resp_frm_type t2lm_status,enum qdf_dp_tx_rx_status tx_status,qdf_freq_t freq,bool is_rx,uint8_t subtype)424*5113495bSYour Name wlan_connectivity_t2lm_req_resp_event(struct wlan_objmgr_vdev *vdev,
425*5113495bSYour Name 				      uint8_t token,
426*5113495bSYour Name 				      enum wlan_t2lm_resp_frm_type t2lm_status,
427*5113495bSYour Name 				      enum qdf_dp_tx_rx_status tx_status,
428*5113495bSYour Name 				      qdf_freq_t freq,
429*5113495bSYour Name 				      bool is_rx, uint8_t subtype)
430*5113495bSYour Name {
431*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event,
432*5113495bSYour Name 				 struct wlan_diag_mlo_t2lm_req_resp);
433*5113495bSYour Name 
434*5113495bSYour Name 	wlan_diag_event.diag_cmn.vdev_id = wlan_vdev_get_id(vdev);
435*5113495bSYour Name 	wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
436*5113495bSYour Name 	wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
437*5113495bSYour Name 
438*5113495bSYour Name 	wlan_diag_event.version = DIAG_MLO_T2LM_REQ_RESP_VERSION;
439*5113495bSYour Name 
440*5113495bSYour Name 	wlan_diag_event.token = token;
441*5113495bSYour Name 	wlan_diag_event.subtype = subtype;
442*5113495bSYour Name 
443*5113495bSYour Name 	wlan_diag_event.status = t2lm_status;
444*5113495bSYour Name 	wlan_diag_event.tx_status = wlan_get_diag_tx_status(tx_status);
445*5113495bSYour Name 	wlan_diag_event.is_rx = is_rx;
446*5113495bSYour Name 
447*5113495bSYour Name 	wlan_diag_event.band = wlan_convert_freq_to_diag_band(freq);
448*5113495bSYour Name 
449*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event,
450*5113495bSYour Name 				    EVENT_WLAN_MLO_T2LM_REQ_RESP);
451*5113495bSYour Name }
452*5113495bSYour Name 
453*5113495bSYour Name void
wlan_connectivity_mlo_reconfig_event(struct wlan_objmgr_vdev * vdev)454*5113495bSYour Name wlan_connectivity_mlo_reconfig_event(struct wlan_objmgr_vdev *vdev)
455*5113495bSYour Name {
456*5113495bSYour Name 	struct mlo_link_info *link_info = NULL;
457*5113495bSYour Name 	struct wlan_channel *chan_info = NULL;
458*5113495bSYour Name 	uint8_t link_id;
459*5113495bSYour Name 
460*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event,
461*5113495bSYour Name 				 struct wlan_diag_mlo_reconfig);
462*5113495bSYour Name 
463*5113495bSYour Name 	wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
464*5113495bSYour Name 	wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
465*5113495bSYour Name 	wlan_diag_event.version = DIAG_MLO_RECONFIG_VERSION;
466*5113495bSYour Name 
467*5113495bSYour Name 	link_id = wlan_vdev_get_link_id(vdev);
468*5113495bSYour Name 	wlan_diag_event.mlo_cmn_info.link_id = link_id;
469*5113495bSYour Name 
470*5113495bSYour Name 	if (!vdev->mlo_dev_ctx)
471*5113495bSYour Name 		return;
472*5113495bSYour Name 
473*5113495bSYour Name 	link_info = mlo_mgr_get_ap_link_by_link_id(vdev->mlo_dev_ctx, link_id);
474*5113495bSYour Name 	if (!link_info) {
475*5113495bSYour Name 		mlme_err("linl: %d Link info not found", link_id);
476*5113495bSYour Name 		return;
477*5113495bSYour Name 	}
478*5113495bSYour Name 	chan_info = link_info->link_chan_info;
479*5113495bSYour Name 	if (!chan_info) {
480*5113495bSYour Name 		mlme_err("link: %d Chan info not found", link_id);
481*5113495bSYour Name 		return;
482*5113495bSYour Name 	}
483*5113495bSYour Name 
484*5113495bSYour Name 	wlan_diag_event.mlo_cmn_info.band =
485*5113495bSYour Name 			wlan_convert_freq_to_diag_band(chan_info->ch_freq);
486*5113495bSYour Name 
487*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event, EVENT_WLAN_MLO_RECONFIG);
488*5113495bSYour Name }
489*5113495bSYour Name 
490*5113495bSYour Name static QDF_STATUS
wlan_populate_link_addr(struct wlan_objmgr_vdev * vdev,struct wlan_diag_sta_info * wlan_diag_event)491*5113495bSYour Name wlan_populate_link_addr(struct wlan_objmgr_vdev *vdev,
492*5113495bSYour Name 			struct wlan_diag_sta_info *wlan_diag_event)
493*5113495bSYour Name {
494*5113495bSYour Name 	uint i = 0;
495*5113495bSYour Name 	struct mlo_link_switch_context *link_ctx = vdev->mlo_dev_ctx->link_ctx;
496*5113495bSYour Name 	struct wlan_channel *link_chan_info;
497*5113495bSYour Name 
498*5113495bSYour Name 	if (!link_ctx)
499*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
500*5113495bSYour Name 
501*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_ML_BSS_LINKS; i++) {
502*5113495bSYour Name 		link_chan_info = link_ctx->links_info[i].link_chan_info;
503*5113495bSYour Name 
504*5113495bSYour Name 		if (wlan_reg_is_24ghz_ch_freq(
505*5113495bSYour Name 		    (qdf_freq_t)link_chan_info->ch_freq)) {
506*5113495bSYour Name 			qdf_mem_copy(wlan_diag_event->mac_2g,
507*5113495bSYour Name 				     link_ctx->links_info[i].link_addr.bytes,
508*5113495bSYour Name 				     QDF_MAC_ADDR_SIZE);
509*5113495bSYour Name 		} else if (wlan_reg_is_5ghz_ch_freq(
510*5113495bSYour Name 			   (qdf_freq_t)link_chan_info->ch_freq)) {
511*5113495bSYour Name 			qdf_mem_copy(wlan_diag_event->mac_5g,
512*5113495bSYour Name 				     link_ctx->links_info[i].link_addr.bytes,
513*5113495bSYour Name 				     QDF_MAC_ADDR_SIZE);
514*5113495bSYour Name 		} else if (wlan_reg_is_6ghz_chan_freq(
515*5113495bSYour Name 			   link_chan_info->ch_freq)) {
516*5113495bSYour Name 			qdf_mem_copy(wlan_diag_event->mac_6g,
517*5113495bSYour Name 				     link_ctx->links_info[i].link_addr.bytes,
518*5113495bSYour Name 				     QDF_MAC_ADDR_SIZE);
519*5113495bSYour Name 		}
520*5113495bSYour Name 	}
521*5113495bSYour Name 
522*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
523*5113495bSYour Name }
524*5113495bSYour Name 
525*5113495bSYour Name static uint8_t
wlan_populate_band_bitmap(struct mlo_link_switch_context * link_ctx)526*5113495bSYour Name wlan_populate_band_bitmap(struct mlo_link_switch_context *link_ctx)
527*5113495bSYour Name {
528*5113495bSYour Name 	uint8_t i, band_bitmap = 0, band;
529*5113495bSYour Name 	struct wlan_channel *link_chan_info;
530*5113495bSYour Name 
531*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_ML_BSS_LINKS; i++) {
532*5113495bSYour Name 		link_chan_info = link_ctx->links_info[i].link_chan_info;
533*5113495bSYour Name 
534*5113495bSYour Name 		band = wlan_reg_freq_to_band((qdf_freq_t)
535*5113495bSYour Name 					     link_chan_info->ch_freq);
536*5113495bSYour Name 
537*5113495bSYour Name 		band_bitmap |= BIT(band);
538*5113495bSYour Name 	}
539*5113495bSYour Name 
540*5113495bSYour Name 	return band_bitmap;
541*5113495bSYour Name }
542*5113495bSYour Name 
543*5113495bSYour Name QDF_STATUS
wlan_populate_mlo_mgmt_event_param(struct wlan_objmgr_vdev * vdev,struct wlan_diag_packet_info * data,enum wlan_main_tag tag)544*5113495bSYour Name wlan_populate_mlo_mgmt_event_param(struct wlan_objmgr_vdev *vdev,
545*5113495bSYour Name 				   struct wlan_diag_packet_info *data,
546*5113495bSYour Name 				   enum wlan_main_tag tag)
547*5113495bSYour Name {
548*5113495bSYour Name 	struct mlo_link_switch_context *link_ctx;
549*5113495bSYour Name 	struct qdf_mac_addr peer_mac, peer_mld_mac;
550*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
551*5113495bSYour Name 
552*5113495bSYour Name 	if (!mlo_is_mld_sta(vdev))
553*5113495bSYour Name 		return status;
554*5113495bSYour Name 
555*5113495bSYour Name 	if (wlan_vdev_mlme_is_mlo_link_vdev(vdev))
556*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
557*5113495bSYour Name 
558*5113495bSYour Name 	status = wlan_vdev_get_bss_peer_mac(vdev, &peer_mac);
559*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
560*5113495bSYour Name 		logging_err("vdev: %d bss peer not found",
561*5113495bSYour Name 			    wlan_vdev_get_id(vdev));
562*5113495bSYour Name 		return status;
563*5113495bSYour Name 	}
564*5113495bSYour Name 
565*5113495bSYour Name 	qdf_mem_copy(data->diag_cmn.bssid, peer_mac.bytes, QDF_MAC_ADDR_SIZE);
566*5113495bSYour Name 
567*5113495bSYour Name 	status = wlan_vdev_get_bss_peer_mld_mac(vdev, &peer_mld_mac);
568*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
569*5113495bSYour Name 		logging_err("vdev: %d failed to get mld mac address of peer",
570*5113495bSYour Name 			    wlan_vdev_get_id(vdev));
571*5113495bSYour Name 		return status;
572*5113495bSYour Name 	}
573*5113495bSYour Name 
574*5113495bSYour Name 	qdf_mem_copy(data->mld_addr, peer_mld_mac.bytes, QDF_MAC_ADDR_SIZE);
575*5113495bSYour Name 
576*5113495bSYour Name 	if (tag != WLAN_ASSOC_REQ && tag != WLAN_REASSOC_REQ)
577*5113495bSYour Name 		return status;
578*5113495bSYour Name 
579*5113495bSYour Name 	link_ctx = vdev->mlo_dev_ctx->link_ctx;
580*5113495bSYour Name 	if (!link_ctx) {
581*5113495bSYour Name 		logging_debug("vdev: %d link_ctx not found",
582*5113495bSYour Name 			      wlan_vdev_get_id(vdev));
583*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
584*5113495bSYour Name 	}
585*5113495bSYour Name 
586*5113495bSYour Name 	data->supported_links = wlan_populate_band_bitmap(link_ctx);
587*5113495bSYour Name 
588*5113495bSYour Name 	return status;
589*5113495bSYour Name }
590*5113495bSYour Name 
591*5113495bSYour Name QDF_STATUS
wlan_populate_roam_mld_log_param(struct wlan_objmgr_vdev * vdev,struct wlan_diag_packet_info * data,enum wlan_main_tag tag)592*5113495bSYour Name wlan_populate_roam_mld_log_param(struct wlan_objmgr_vdev *vdev,
593*5113495bSYour Name 				 struct wlan_diag_packet_info *data,
594*5113495bSYour Name 				 enum wlan_main_tag tag)
595*5113495bSYour Name {
596*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
597*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
598*5113495bSYour Name 
599*5113495bSYour Name 	if (!mlo_is_mld_sta(vdev))
600*5113495bSYour Name 		return status;
601*5113495bSYour Name 
602*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
603*5113495bSYour Name 	if (!pdev)
604*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
605*5113495bSYour Name 
606*5113495bSYour Name 	status = wlan_scan_get_mld_addr_by_link_addr(
607*5113495bSYour Name 			pdev, (struct qdf_mac_addr *)data->diag_cmn.bssid,
608*5113495bSYour Name 			(struct qdf_mac_addr *)data->mld_addr);
609*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
610*5113495bSYour Name 		logging_err_rl("vdev:%d Not able to fetch MLD addr for link addr: " QDF_MAC_ADDR_FMT,
611*5113495bSYour Name 			       wlan_vdev_get_id(vdev),
612*5113495bSYour Name 			       QDF_MAC_ADDR_REF(data->diag_cmn.bssid));
613*5113495bSYour Name 
614*5113495bSYour Name 	return status;
615*5113495bSYour Name }
616*5113495bSYour Name 
617*5113495bSYour Name enum wlan_diag_wifi_band
wlan_convert_freq_to_diag_band(uint16_t ch_freq)618*5113495bSYour Name wlan_convert_freq_to_diag_band(uint16_t ch_freq)
619*5113495bSYour Name {
620*5113495bSYour Name 	enum reg_wifi_band band;
621*5113495bSYour Name 
622*5113495bSYour Name 	band = wlan_reg_freq_to_band((qdf_freq_t)ch_freq);
623*5113495bSYour Name 
624*5113495bSYour Name 	switch (band) {
625*5113495bSYour Name 	case REG_BAND_2G:
626*5113495bSYour Name 		return WLAN_24GHZ_BAND;
627*5113495bSYour Name 	case REG_BAND_5G:
628*5113495bSYour Name 		return WLAN_5GHZ_BAND;
629*5113495bSYour Name 	case REG_BAND_6G:
630*5113495bSYour Name 		return WLAN_6GHZ_BAND;
631*5113495bSYour Name 	default:
632*5113495bSYour Name 		return WLAN_INVALID_BAND;
633*5113495bSYour Name 	}
634*5113495bSYour Name }
635*5113495bSYour Name 
636*5113495bSYour Name #define REJECTED_LINK_STATUS 1
637*5113495bSYour Name 
638*5113495bSYour Name void
wlan_connectivity_mlo_setup_event(struct wlan_objmgr_vdev * vdev)639*5113495bSYour Name wlan_connectivity_mlo_setup_event(struct wlan_objmgr_vdev *vdev)
640*5113495bSYour Name {
641*5113495bSYour Name 	uint i = 0;
642*5113495bSYour Name 	struct mlo_link_switch_context *link_ctx = NULL;
643*5113495bSYour Name 	struct wlan_channel *chan_info;
644*5113495bSYour Name 	uint8_t num_links = 0;
645*5113495bSYour Name 
646*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event,
647*5113495bSYour Name 				 struct wlan_diag_mlo_setup);
648*5113495bSYour Name 
649*5113495bSYour Name 	if (!mlo_is_mld_sta(vdev))
650*5113495bSYour Name 		return;
651*5113495bSYour Name 
652*5113495bSYour Name 	qdf_mem_zero(&wlan_diag_event, sizeof(struct wlan_diag_mlo_setup));
653*5113495bSYour Name 
654*5113495bSYour Name 	wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
655*5113495bSYour Name 	wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
656*5113495bSYour Name 	wlan_diag_event.version = DIAG_MLO_SETUP_VERSION_V2;
657*5113495bSYour Name 
658*5113495bSYour Name 	if (!vdev->mlo_dev_ctx) {
659*5113495bSYour Name 		logging_err("vdev: %d MLO dev ctx not found",
660*5113495bSYour Name 			    wlan_vdev_get_id(vdev));
661*5113495bSYour Name 		return;
662*5113495bSYour Name 	}
663*5113495bSYour Name 
664*5113495bSYour Name 	link_ctx = vdev->mlo_dev_ctx->link_ctx;
665*5113495bSYour Name 	if (!link_ctx) {
666*5113495bSYour Name 		logging_err("vdev: %d mlo link ctx not found",
667*5113495bSYour Name 			    wlan_vdev_get_id(vdev));
668*5113495bSYour Name 		return;
669*5113495bSYour Name 	}
670*5113495bSYour Name 
671*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_ML_BSS_LINKS; i++) {
672*5113495bSYour Name 		if (link_ctx->links_info[i].link_id == WLAN_INVALID_LINK_ID)
673*5113495bSYour Name 			continue;
674*5113495bSYour Name 
675*5113495bSYour Name 		chan_info = link_ctx->links_info[i].link_chan_info;
676*5113495bSYour Name 		if (!chan_info) {
677*5113495bSYour Name 			logging_debug("link %d: chan_info not found",
678*5113495bSYour Name 				      link_ctx->links_info[i].link_id);
679*5113495bSYour Name 			continue;
680*5113495bSYour Name 		}
681*5113495bSYour Name 
682*5113495bSYour Name 		wlan_diag_event.mlo_cmn_info[num_links].link_id =
683*5113495bSYour Name 				link_ctx->links_info[i].link_id;
684*5113495bSYour Name 		wlan_diag_event.mlo_cmn_info[num_links].vdev_id =
685*5113495bSYour Name 				link_ctx->links_info[i].vdev_id;
686*5113495bSYour Name 
687*5113495bSYour Name 		qdf_mem_copy(wlan_diag_event.mlo_cmn_info[num_links].link_addr,
688*5113495bSYour Name 			     link_ctx->links_info[i].ap_link_addr.bytes,
689*5113495bSYour Name 			     QDF_MAC_ADDR_SIZE);
690*5113495bSYour Name 
691*5113495bSYour Name 		wlan_diag_event.mlo_cmn_info[num_links].band =
692*5113495bSYour Name 			wlan_convert_freq_to_diag_band(chan_info->ch_freq);
693*5113495bSYour Name 
694*5113495bSYour Name 		if (wlan_diag_event.mlo_cmn_info[num_links].band ==
695*5113495bSYour Name 							 WLAN_INVALID_BAND)
696*5113495bSYour Name 			wlan_diag_event.mlo_cmn_info[i].status =
697*5113495bSYour Name 							REJECTED_LINK_STATUS;
698*5113495bSYour Name 
699*5113495bSYour Name 		num_links++;
700*5113495bSYour Name 	}
701*5113495bSYour Name 
702*5113495bSYour Name 	wlan_diag_event.num_links = num_links;
703*5113495bSYour Name 
704*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event, EVENT_WLAN_MLO_SETUP);
705*5113495bSYour Name }
706*5113495bSYour Name 
707*5113495bSYour Name #define IS_LINK_SET(link_bitmap, link_id) ((link_bitmap) & (BIT(link_id)))
708*5113495bSYour Name #define DEFAULT_TID_MAP 0xFF
709*5113495bSYour Name 
710*5113495bSYour Name static void
wlan_populate_tid_link_id_bitmap(struct wlan_t2lm_info * t2lm,struct mlo_link_info * link_info,struct wlan_diag_mlo_t2lm_status * buf,uint8_t bss_link)711*5113495bSYour Name wlan_populate_tid_link_id_bitmap(struct wlan_t2lm_info *t2lm,
712*5113495bSYour Name 				 struct mlo_link_info *link_info,
713*5113495bSYour Name 				 struct wlan_diag_mlo_t2lm_status *buf,
714*5113495bSYour Name 				 uint8_t bss_link)
715*5113495bSYour Name {
716*5113495bSYour Name 	uint8_t link_id;
717*5113495bSYour Name 	uint8_t dir, i;
718*5113495bSYour Name 	uint16_t freq;
719*5113495bSYour Name 
720*5113495bSYour Name 	link_id = link_info->link_id;
721*5113495bSYour Name 	freq = link_info->link_chan_info->ch_freq;
722*5113495bSYour Name 	buf->mlo_cmn_info[bss_link].band =
723*5113495bSYour Name 		wlan_convert_freq_to_diag_band(freq);
724*5113495bSYour Name 	buf->mlo_cmn_info[bss_link].vdev_id = link_info->vdev_id;
725*5113495bSYour Name 
726*5113495bSYour Name 	for (dir = 0; dir < WLAN_T2LM_MAX_DIRECTION; dir++) {
727*5113495bSYour Name 		if (t2lm[dir].default_link_mapping) {
728*5113495bSYour Name 			buf->mlo_cmn_info[bss_link].tid_ul = DEFAULT_TID_MAP;
729*5113495bSYour Name 			buf->mlo_cmn_info[bss_link].tid_dl = DEFAULT_TID_MAP;
730*5113495bSYour Name 			continue;
731*5113495bSYour Name 		}
732*5113495bSYour Name 
733*5113495bSYour Name 		for (i = 0; i < T2LM_MAX_NUM_TIDS; i++) {
734*5113495bSYour Name 			switch (t2lm[dir].direction) {
735*5113495bSYour Name 			case WLAN_T2LM_DL_DIRECTION:
736*5113495bSYour Name 				if (
737*5113495bSYour Name 				IS_LINK_SET(
738*5113495bSYour Name 				t2lm[dir].ieee_link_map_tid[i], link_id))
739*5113495bSYour Name 					buf->mlo_cmn_info[bss_link].tid_dl |=
740*5113495bSYour Name 									BIT(i);
741*5113495bSYour Name 				break;
742*5113495bSYour Name 			case WLAN_T2LM_UL_DIRECTION:
743*5113495bSYour Name 				if (
744*5113495bSYour Name 				IS_LINK_SET(
745*5113495bSYour Name 				t2lm[dir].ieee_link_map_tid[i], link_id))
746*5113495bSYour Name 					buf->mlo_cmn_info[bss_link].tid_ul |=
747*5113495bSYour Name 									BIT(i);
748*5113495bSYour Name 				break;
749*5113495bSYour Name 			case WLAN_T2LM_BIDI_DIRECTION:
750*5113495bSYour Name 				if (
751*5113495bSYour Name 				IS_LINK_SET(
752*5113495bSYour Name 				t2lm[dir].ieee_link_map_tid[i], link_id)) {
753*5113495bSYour Name 					buf->mlo_cmn_info[bss_link].tid_dl |=
754*5113495bSYour Name 									BIT(i);
755*5113495bSYour Name 					buf->mlo_cmn_info[bss_link].tid_ul |=
756*5113495bSYour Name 									BIT(i);
757*5113495bSYour Name 				}
758*5113495bSYour Name 				break;
759*5113495bSYour Name 			default:
760*5113495bSYour Name 				logging_debug("Invalid direction %d",
761*5113495bSYour Name 					      t2lm[dir].direction);
762*5113495bSYour Name 				break;
763*5113495bSYour Name 			}
764*5113495bSYour Name 		}
765*5113495bSYour Name 	}
766*5113495bSYour Name }
767*5113495bSYour Name 
768*5113495bSYour Name void
wlan_connectivity_t2lm_status_event(struct wlan_objmgr_vdev * vdev)769*5113495bSYour Name wlan_connectivity_t2lm_status_event(struct wlan_objmgr_vdev *vdev)
770*5113495bSYour Name {
771*5113495bSYour Name 	uint8_t i = 0, dir, num_links = 0;
772*5113495bSYour Name 	QDF_STATUS status;
773*5113495bSYour Name 	struct mlo_link_info *link_info;
774*5113495bSYour Name 	struct wlan_t2lm_info t2lm[WLAN_T2LM_MAX_DIRECTION] = {0};
775*5113495bSYour Name 
776*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event,
777*5113495bSYour Name 				 struct wlan_diag_mlo_t2lm_status);
778*5113495bSYour Name 
779*5113495bSYour Name 	if (!mlo_is_mld_sta(vdev))
780*5113495bSYour Name 		return;
781*5113495bSYour Name 
782*5113495bSYour Name 	if (!vdev->mlo_dev_ctx) {
783*5113495bSYour Name 		logging_err("MLO dev ctx not found");
784*5113495bSYour Name 		return;
785*5113495bSYour Name 	}
786*5113495bSYour Name 	link_info = mlo_mgr_get_ap_link(vdev);
787*5113495bSYour Name 	if (!link_info) {
788*5113495bSYour Name 		logging_err("link_info invalid");
789*5113495bSYour Name 		return;
790*5113495bSYour Name 	}
791*5113495bSYour Name 
792*5113495bSYour Name 	if (mlo_mgr_is_link_switch_in_progress(vdev))
793*5113495bSYour Name 		return;
794*5113495bSYour Name 
795*5113495bSYour Name 	wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
796*5113495bSYour Name 	wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
797*5113495bSYour Name 	wlan_diag_event.version = DIAG_MLO_T2LM_STATUS_VERSION_V2;
798*5113495bSYour Name 
799*5113495bSYour Name 	for (dir = 0; dir < WLAN_T2LM_MAX_DIRECTION; dir++)
800*5113495bSYour Name 		t2lm[dir].direction = WLAN_T2LM_INVALID_DIRECTION;
801*5113495bSYour Name 
802*5113495bSYour Name 	status = wlan_get_t2lm_mapping_status(vdev, t2lm);
803*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
804*5113495bSYour Name 		logging_err("Unable to get t2lm_mapping");
805*5113495bSYour Name 		return;
806*5113495bSYour Name 	}
807*5113495bSYour Name 
808*5113495bSYour Name 	for (i = 0;
809*5113495bSYour Name 	     i < WLAN_MAX_ML_BSS_LINKS && i < MAX_NUM_LINKS_PER_EVENT; i++) {
810*5113495bSYour Name 		if (qdf_is_macaddr_zero(&link_info->ap_link_addr) &&
811*5113495bSYour Name 		    link_info->link_id == WLAN_INVALID_LINK_ID)
812*5113495bSYour Name 			continue;
813*5113495bSYour Name 
814*5113495bSYour Name 		wlan_populate_tid_link_id_bitmap(t2lm, link_info,
815*5113495bSYour Name 						 &wlan_diag_event, num_links);
816*5113495bSYour Name 		link_info++;
817*5113495bSYour Name 		num_links++;
818*5113495bSYour Name 	}
819*5113495bSYour Name 
820*5113495bSYour Name 	wlan_diag_event.num_links = num_links;
821*5113495bSYour Name 
822*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event,
823*5113495bSYour Name 				    EVENT_WLAN_MLO_T2LM_STATUS);
824*5113495bSYour Name }
825*5113495bSYour Name 
826*5113495bSYour Name #else
827*5113495bSYour Name static QDF_STATUS
wlan_populate_link_addr(struct wlan_objmgr_vdev * vdev,struct wlan_diag_sta_info * wlan_diag_event)828*5113495bSYour Name wlan_populate_link_addr(struct wlan_objmgr_vdev *vdev,
829*5113495bSYour Name 			struct wlan_diag_sta_info *wlan_diag_event)
830*5113495bSYour Name {
831*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
832*5113495bSYour Name }
833*5113495bSYour Name #endif
834*5113495bSYour Name 
835*5113495bSYour Name void
wlan_cdp_set_peer_freq(struct wlan_objmgr_psoc * psoc,uint8_t * peer_mac,uint32_t freq,uint8_t vdev_id)836*5113495bSYour Name wlan_cdp_set_peer_freq(struct wlan_objmgr_psoc *psoc, uint8_t *peer_mac,
837*5113495bSYour Name 		       uint32_t freq, uint8_t vdev_id)
838*5113495bSYour Name {
839*5113495bSYour Name 	ol_txrx_soc_handle soc_txrx_handle;
840*5113495bSYour Name 	cdp_config_param_type val = {0};
841*5113495bSYour Name 
842*5113495bSYour Name 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
843*5113495bSYour Name 
844*5113495bSYour Name 	val.cdp_peer_param_freq = freq;
845*5113495bSYour Name 	cdp_txrx_set_peer_param(soc_txrx_handle, vdev_id, peer_mac,
846*5113495bSYour Name 				CDP_CONFIG_PEER_FREQ, val);
847*5113495bSYour Name }
848*5113495bSYour Name 
849*5113495bSYour Name void
wlan_connectivity_sta_info_event(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,bool is_roam)850*5113495bSYour Name wlan_connectivity_sta_info_event(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
851*5113495bSYour Name 				 bool is_roam)
852*5113495bSYour Name {
853*5113495bSYour Name 	QDF_STATUS status;
854*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev = NULL;
855*5113495bSYour Name 
856*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event, struct wlan_diag_sta_info);
857*5113495bSYour Name 
858*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
859*5113495bSYour Name 						    WLAN_MLME_OBJMGR_ID);
860*5113495bSYour Name 	if (!vdev) {
861*5113495bSYour Name 		logging_err_rl("Invalid vdev:%d", vdev_id);
862*5113495bSYour Name 		return;
863*5113495bSYour Name 	}
864*5113495bSYour Name 
865*5113495bSYour Name 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE ||
866*5113495bSYour Name 	    (wlan_vdev_mlme_is_mlo_vdev(vdev) &&
867*5113495bSYour Name 	     (wlan_vdev_mlme_is_mlo_link_switch_in_progress(vdev) ||
868*5113495bSYour Name 	      wlan_vdev_mlme_is_mlo_link_vdev(vdev))))
869*5113495bSYour Name 		goto out;
870*5113495bSYour Name 
871*5113495bSYour Name 	if (!is_roam && !wlan_cm_is_first_candidate_connect_attempt(vdev))
872*5113495bSYour Name 		goto out;
873*5113495bSYour Name 
874*5113495bSYour Name 	wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
875*5113495bSYour Name 	wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
876*5113495bSYour Name 	wlan_diag_event.diag_cmn.vdev_id = vdev_id;
877*5113495bSYour Name 	wlan_diag_event.is_mlo = wlan_vdev_mlme_is_mlo_vdev(vdev);
878*5113495bSYour Name 
879*5113495bSYour Name 	if (wlan_diag_event.is_mlo) {
880*5113495bSYour Name 		qdf_mem_copy(wlan_diag_event.diag_cmn.bssid,
881*5113495bSYour Name 			     wlan_vdev_mlme_get_mldaddr(vdev),
882*5113495bSYour Name 			     QDF_MAC_ADDR_SIZE);
883*5113495bSYour Name 		status = wlan_populate_link_addr(vdev, &wlan_diag_event);
884*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
885*5113495bSYour Name 			logging_err_rl("wlan_populate_link_addr failed");
886*5113495bSYour Name 			goto out;
887*5113495bSYour Name 		}
888*5113495bSYour Name 	} else {
889*5113495bSYour Name 		qdf_mem_copy(wlan_diag_event.diag_cmn.bssid,
890*5113495bSYour Name 			     wlan_vdev_mlme_get_macaddr(vdev),
891*5113495bSYour Name 			     QDF_MAC_ADDR_SIZE);
892*5113495bSYour Name 	}
893*5113495bSYour Name 
894*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event, EVENT_WLAN_STA_INFO);
895*5113495bSYour Name out:
896*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
897*5113495bSYour Name }
898*5113495bSYour Name 
899*5113495bSYour Name void
wlan_populate_vsie(struct wlan_objmgr_vdev * vdev,struct wlan_diag_packet_info * data,bool is_tx)900*5113495bSYour Name wlan_populate_vsie(struct wlan_objmgr_vdev *vdev,
901*5113495bSYour Name 		   struct wlan_diag_packet_info *data,
902*5113495bSYour Name 		   bool is_tx)
903*5113495bSYour Name {
904*5113495bSYour Name 	struct element_info *vsie_info = NULL;
905*5113495bSYour Name 
906*5113495bSYour Name 	if (is_tx)
907*5113495bSYour Name 		vsie_info = mlme_get_self_disconnect_ies(vdev);
908*5113495bSYour Name 	else
909*5113495bSYour Name 		vsie_info = mlme_get_peer_disconnect_ies(vdev);
910*5113495bSYour Name 
911*5113495bSYour Name 	if (!vsie_info)
912*5113495bSYour Name 		return;
913*5113495bSYour Name 
914*5113495bSYour Name 	data->vsie_len = vsie_info->len;
915*5113495bSYour Name 	if (data->vsie_len > MAX_VSIE_LEN)
916*5113495bSYour Name 		data->vsie_len = MAX_VSIE_LEN;
917*5113495bSYour Name 
918*5113495bSYour Name 	qdf_mem_copy(data->vsie, vsie_info->ptr, data->vsie_len);
919*5113495bSYour Name }
920*5113495bSYour Name 
921*5113495bSYour Name void
wlan_connectivity_mgmt_event(struct wlan_objmgr_psoc * psoc,struct wlan_frame_hdr * mac_hdr,uint8_t vdev_id,uint16_t status_code,enum qdf_dp_tx_rx_status tx_status,int8_t peer_rssi,uint8_t auth_algo,uint8_t auth_type,uint8_t auth_seq,uint16_t aid,enum wlan_main_tag tag)922*5113495bSYour Name wlan_connectivity_mgmt_event(struct wlan_objmgr_psoc *psoc,
923*5113495bSYour Name 			     struct wlan_frame_hdr *mac_hdr,
924*5113495bSYour Name 			     uint8_t vdev_id, uint16_t status_code,
925*5113495bSYour Name 			     enum qdf_dp_tx_rx_status tx_status,
926*5113495bSYour Name 			     int8_t peer_rssi,
927*5113495bSYour Name 			     uint8_t auth_algo, uint8_t auth_type,
928*5113495bSYour Name 			     uint8_t auth_seq, uint16_t aid,
929*5113495bSYour Name 			     enum wlan_main_tag tag)
930*5113495bSYour Name {
931*5113495bSYour Name 	enum QDF_OPMODE opmode;
932*5113495bSYour Name 	bool cache_sae_frame_cap, is_initial_connection;
933*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
934*5113495bSYour Name 	QDF_STATUS status;
935*5113495bSYour Name 
936*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event, struct wlan_diag_packet_info);
937*5113495bSYour Name 
938*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
939*5113495bSYour Name 						    WLAN_MLME_OBJMGR_ID);
940*5113495bSYour Name 	if (!vdev) {
941*5113495bSYour Name 		logging_debug("Unable to find vdev:%d", vdev_id);
942*5113495bSYour Name 		return;
943*5113495bSYour Name 	}
944*5113495bSYour Name 
945*5113495bSYour Name 	opmode = wlan_vdev_mlme_get_opmode(vdev);
946*5113495bSYour Name 	if (opmode != QDF_STA_MODE)
947*5113495bSYour Name 		goto out;
948*5113495bSYour Name 
949*5113495bSYour Name 	is_initial_connection = wlan_cm_is_vdev_connecting(vdev);
950*5113495bSYour Name 	if (wlan_vdev_mlme_is_mlo_vdev(vdev) &&
951*5113495bSYour Name 	    (wlan_vdev_mlme_is_mlo_link_switch_in_progress(vdev) ||
952*5113495bSYour Name 	     (is_initial_connection &&
953*5113495bSYour Name 	      wlan_vdev_mlme_is_mlo_link_vdev(vdev)))) {
954*5113495bSYour Name 		logging_debug("vdev:%d is_connection:%d | %s skip mgmt event",
955*5113495bSYour Name 			      vdev_id, is_initial_connection,
956*5113495bSYour Name 			      wlan_vdev_mlme_is_mlo_link_vdev(vdev) ?
957*5113495bSYour Name 			      "link_vdev" : wlan_vdev_mlme_is_mlo_link_switch_in_progress(vdev) ? "link switch in prog" : "");
958*5113495bSYour Name 		goto out;
959*5113495bSYour Name 	}
960*5113495bSYour Name 
961*5113495bSYour Name 	qdf_mem_zero(&wlan_diag_event, sizeof(struct wlan_diag_packet_info));
962*5113495bSYour Name 
963*5113495bSYour Name 	wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
964*5113495bSYour Name 	wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
965*5113495bSYour Name 	wlan_diag_event.diag_cmn.vdev_id = vdev_id;
966*5113495bSYour Name 	wlan_diag_event.subtype = (uint8_t)tag;
967*5113495bSYour Name 
968*5113495bSYour Name 	qdf_mem_copy(wlan_diag_event.diag_cmn.bssid, &mac_hdr->i_addr3[0],
969*5113495bSYour Name 		     QDF_MAC_ADDR_SIZE);
970*5113495bSYour Name 
971*5113495bSYour Name 	if (is_initial_connection) {
972*5113495bSYour Name 		status = wlan_populate_mlo_mgmt_event_param(vdev,
973*5113495bSYour Name 							    &wlan_diag_event,
974*5113495bSYour Name 							    tag);
975*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
976*5113495bSYour Name 			goto out;
977*5113495bSYour Name 	}
978*5113495bSYour Name 
979*5113495bSYour Name 	wlan_diag_event.version = DIAG_MGMT_VERSION_V2;
980*5113495bSYour Name 	wlan_diag_event.tx_fail_reason = tx_status;
981*5113495bSYour Name 	wlan_diag_event.tx_status = wlan_get_diag_tx_status(tx_status);
982*5113495bSYour Name 	wlan_diag_event.rssi = peer_rssi;
983*5113495bSYour Name 	wlan_diag_event.sn =
984*5113495bSYour Name 		(le16toh(*(uint16_t *)mac_hdr->i_seq) >> WLAN_SEQ_SEQ_SHIFT);
985*5113495bSYour Name 	wlan_diag_event.status = status_code;
986*5113495bSYour Name 	wlan_diag_event.auth_algo = auth_algo;
987*5113495bSYour Name 	wlan_diag_event.auth_frame_type = auth_type;
988*5113495bSYour Name 	wlan_diag_event.auth_seq_num = auth_seq;
989*5113495bSYour Name 	wlan_diag_event.assoc_id = aid;
990*5113495bSYour Name 
991*5113495bSYour Name 	if (tag == WLAN_DEAUTH_RX || tag == WLAN_DISASSOC_RX)
992*5113495bSYour Name 		wlan_populate_vsie(vdev, &wlan_diag_event, false);
993*5113495bSYour Name 
994*5113495bSYour Name 	if (wlan_diag_event.subtype > WLAN_CONN_DIAG_REASSOC_RESP_EVENT &&
995*5113495bSYour Name 	    wlan_diag_event.subtype < WLAN_CONN_DIAG_BMISS_EVENT)
996*5113495bSYour Name 		wlan_diag_event.reason = status_code;
997*5113495bSYour Name 
998*5113495bSYour Name 	wlan_diag_event.is_retry_frame =
999*5113495bSYour Name 			(mac_hdr->i_fc[1] & IEEE80211_FC1_RETRY);
1000*5113495bSYour Name 
1001*5113495bSYour Name 	/*
1002*5113495bSYour Name 	 * Cache the SAE auth frames info in vdev mlme private and return in
1003*5113495bSYour Name 	 * case of roam preauth
1004*5113495bSYour Name 	 */
1005*5113495bSYour Name 	cache_sae_frame_cap =
1006*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_get(psoc,
1007*5113495bSYour Name 					      WLAN_ROAM_STATS_FRAME_INFO_PER_CANDIDATE);
1008*5113495bSYour Name 	if (!is_initial_connection &&
1009*5113495bSYour Name 	    (tag == WLAN_AUTH_REQ || tag == WLAN_AUTH_RESP) &&
1010*5113495bSYour Name 	    auth_algo == WLAN_SAE_AUTH_ALGO_NUMBER && cache_sae_frame_cap) {
1011*5113495bSYour Name 		wlan_cache_connectivity_log(psoc, vdev_id, &wlan_diag_event);
1012*5113495bSYour Name 		goto out;
1013*5113495bSYour Name 	}
1014*5113495bSYour Name 
1015*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event, EVENT_WLAN_MGMT);
1016*5113495bSYour Name 
1017*5113495bSYour Name 	if (tag == WLAN_ASSOC_RSP || tag == WLAN_REASSOC_RSP)
1018*5113495bSYour Name 		wlan_connectivity_mlo_setup_event(vdev);
1019*5113495bSYour Name 
1020*5113495bSYour Name out:
1021*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
1022*5113495bSYour Name }
1023*5113495bSYour Name 
1024*5113495bSYour Name void
wlan_connectivity_connecting_event(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_req * con_req)1025*5113495bSYour Name wlan_connectivity_connecting_event(struct wlan_objmgr_vdev *vdev,
1026*5113495bSYour Name 				   struct wlan_cm_connect_req *con_req)
1027*5113495bSYour Name {
1028*5113495bSYour Name 	QDF_STATUS status;
1029*5113495bSYour Name 	struct wlan_cm_connect_req req;
1030*5113495bSYour Name 
1031*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event, struct wlan_diag_connect);
1032*5113495bSYour Name 
1033*5113495bSYour Name 	if (!wlan_cm_is_first_candidate_connect_attempt(vdev))
1034*5113495bSYour Name 		return;
1035*5113495bSYour Name 
1036*5113495bSYour Name 	/* for candidate not found case*/
1037*5113495bSYour Name 	if (con_req) {
1038*5113495bSYour Name 		req = *con_req;
1039*5113495bSYour Name 		qdf_mem_zero(&req.scan_ie, sizeof(struct element_info));
1040*5113495bSYour Name 		qdf_mem_zero(&req.assoc_ie, sizeof(struct element_info));
1041*5113495bSYour Name 	} else {
1042*5113495bSYour Name 		status = wlan_cm_get_active_connect_req_param(vdev, &req);
1043*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
1044*5113495bSYour Name 			logging_err("vdev: %d failed to get active cmd request",
1045*5113495bSYour Name 				    wlan_vdev_get_id(vdev));
1046*5113495bSYour Name 			return;
1047*5113495bSYour Name 		}
1048*5113495bSYour Name 	}
1049*5113495bSYour Name 
1050*5113495bSYour Name 	wlan_diag_event.version = DIAG_CONN_VERSION;
1051*5113495bSYour Name 	wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
1052*5113495bSYour Name 	wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
1053*5113495bSYour Name 	wlan_diag_event.diag_cmn.vdev_id = wlan_vdev_get_id(vdev);
1054*5113495bSYour Name 	wlan_diag_event.subtype = WLAN_CONN_DIAG_CONNECTING_EVENT;
1055*5113495bSYour Name 
1056*5113495bSYour Name 	wlan_diag_event.ssid_len = req.ssid.length;
1057*5113495bSYour Name 
1058*5113495bSYour Name 	if (req.ssid.length > WLAN_SSID_MAX_LEN)
1059*5113495bSYour Name 		wlan_diag_event.ssid_len = WLAN_SSID_MAX_LEN;
1060*5113495bSYour Name 
1061*5113495bSYour Name 	qdf_mem_copy(wlan_diag_event.ssid, req.ssid.ssid,
1062*5113495bSYour Name 		     wlan_diag_event.ssid_len);
1063*5113495bSYour Name 
1064*5113495bSYour Name 	if (!qdf_is_macaddr_zero(&req.bssid))
1065*5113495bSYour Name 		qdf_mem_copy(wlan_diag_event.diag_cmn.bssid, req.bssid.bytes,
1066*5113495bSYour Name 			     QDF_MAC_ADDR_SIZE);
1067*5113495bSYour Name 	else if (!qdf_is_macaddr_zero(&req.bssid_hint))
1068*5113495bSYour Name 		qdf_mem_copy(wlan_diag_event.bssid_hint, req.bssid_hint.bytes,
1069*5113495bSYour Name 			     QDF_MAC_ADDR_SIZE);
1070*5113495bSYour Name 
1071*5113495bSYour Name 	if (req.chan_freq)
1072*5113495bSYour Name 		wlan_diag_event.freq = req.chan_freq;
1073*5113495bSYour Name 	else if (req.chan_freq_hint)
1074*5113495bSYour Name 		wlan_diag_event.freq_hint = req.chan_freq_hint;
1075*5113495bSYour Name 
1076*5113495bSYour Name 	wlan_diag_event.pairwise_cipher	= req.crypto.user_cipher_pairwise;
1077*5113495bSYour Name 	wlan_diag_event.grp_cipher = req.crypto.user_grp_cipher;
1078*5113495bSYour Name 	wlan_diag_event.akm = req.crypto.user_akm_suite;
1079*5113495bSYour Name 	wlan_diag_event.auth_algo = req.crypto.user_auth_type;
1080*5113495bSYour Name 
1081*5113495bSYour Name 	if (req.scan_ie.len) {
1082*5113495bSYour Name 		qdf_mem_free(req.scan_ie.ptr);
1083*5113495bSYour Name 		qdf_mem_zero(&req.scan_ie, sizeof(struct element_info));
1084*5113495bSYour Name 	}
1085*5113495bSYour Name 
1086*5113495bSYour Name 	if (req.assoc_ie.len) {
1087*5113495bSYour Name 		qdf_mem_free(req.assoc_ie.ptr);
1088*5113495bSYour Name 		qdf_mem_zero(&req.assoc_ie, sizeof(struct element_info));
1089*5113495bSYour Name 	}
1090*5113495bSYour Name 
1091*5113495bSYour Name 	wlan_diag_event.bt_coex =
1092*5113495bSYour Name 		wlan_mlme_get_bt_profile_con(wlan_vdev_get_psoc(vdev));
1093*5113495bSYour Name 
1094*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event, EVENT_WLAN_CONN);
1095*5113495bSYour Name }
1096*5113495bSYour Name 
1097*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
1098*5113495bSYour Name 
1099*5113495bSYour Name #define BAND_TO_BITMAP(band) (band - 1)
1100*5113495bSYour Name 
1101*5113495bSYour Name static uint8_t
wlan_convert_link_id_to_diag_band(struct qdf_mac_addr * peer_mld,uint16_t link_bitmap)1102*5113495bSYour Name wlan_convert_link_id_to_diag_band(struct qdf_mac_addr *peer_mld,
1103*5113495bSYour Name 				  uint16_t link_bitmap)
1104*5113495bSYour Name {
1105*5113495bSYour Name 	uint8_t i, band_bitmap = 0, band;
1106*5113495bSYour Name 	struct wlan_mlo_dev_context *mldev = NULL;
1107*5113495bSYour Name 	struct wlan_mlo_peer_context *mlpeer = NULL;
1108*5113495bSYour Name 	struct mlo_link_info *link_info = NULL;
1109*5113495bSYour Name 	uint32_t freq;
1110*5113495bSYour Name 
1111*5113495bSYour Name 	mlpeer = wlan_mlo_get_mlpeer_by_peer_mladdr(peer_mld, &mldev);
1112*5113495bSYour Name 	if (!mlpeer) {
1113*5113495bSYour Name 		logging_err("ml peer not found");
1114*5113495bSYour Name 		return 0;
1115*5113495bSYour Name 	}
1116*5113495bSYour Name 
1117*5113495bSYour Name 	for (i = 0; i < MAX_MLO_LINK_ID; i++) {
1118*5113495bSYour Name 		if (IS_LINK_SET(link_bitmap, i)) {
1119*5113495bSYour Name 			link_info = mlo_mgr_get_ap_link_by_link_id(mldev, i);
1120*5113495bSYour Name 			if (!link_info) {
1121*5113495bSYour Name 				logging_err("link: %d info does not exist", i);
1122*5113495bSYour Name 				return 0;
1123*5113495bSYour Name 			}
1124*5113495bSYour Name 
1125*5113495bSYour Name 			freq = link_info->link_chan_info->ch_freq;
1126*5113495bSYour Name 			band = wlan_convert_freq_to_diag_band(freq);
1127*5113495bSYour Name 			if (band == WLAN_INVALID_BAND)
1128*5113495bSYour Name 				continue;
1129*5113495bSYour Name 
1130*5113495bSYour Name 			band_bitmap |= BIT(BAND_TO_BITMAP(band));
1131*5113495bSYour Name 		}
1132*5113495bSYour Name 	}
1133*5113495bSYour Name 
1134*5113495bSYour Name 	return band_bitmap;
1135*5113495bSYour Name }
1136*5113495bSYour Name 
1137*5113495bSYour Name static uint8_t
wlan_get_supported_link_band_bitmap(struct mlo_link_switch_context * link_ctx)1138*5113495bSYour Name wlan_get_supported_link_band_bitmap(struct mlo_link_switch_context *link_ctx)
1139*5113495bSYour Name {
1140*5113495bSYour Name 	uint8_t band_bitmap = 0, i = 0;
1141*5113495bSYour Name 	struct mlo_link_info link_info;
1142*5113495bSYour Name 	struct wlan_channel *chan_info;
1143*5113495bSYour Name 	enum wlan_diag_wifi_band band;
1144*5113495bSYour Name 
1145*5113495bSYour Name 	for (i = 0; i < WLAN_MAX_ML_BSS_LINKS; i++) {
1146*5113495bSYour Name 		link_info = link_ctx->links_info[i];
1147*5113495bSYour Name 
1148*5113495bSYour Name 		chan_info = link_info.link_chan_info;
1149*5113495bSYour Name 		if (!chan_info)
1150*5113495bSYour Name 			continue;
1151*5113495bSYour Name 
1152*5113495bSYour Name 		band = wlan_convert_freq_to_diag_band(chan_info->ch_freq);
1153*5113495bSYour Name 		if (band == WLAN_INVALID_BAND)
1154*5113495bSYour Name 			continue;
1155*5113495bSYour Name 
1156*5113495bSYour Name 		band_bitmap |= BIT(band - 1);
1157*5113495bSYour Name 	}
1158*5113495bSYour Name 
1159*5113495bSYour Name 	return band_bitmap;
1160*5113495bSYour Name }
1161*5113495bSYour Name 
wlan_connectivity_mld_link_status_event(struct wlan_objmgr_psoc * psoc,struct mlo_link_switch_params * src)1162*5113495bSYour Name void wlan_connectivity_mld_link_status_event(struct wlan_objmgr_psoc *psoc,
1163*5113495bSYour Name 					     struct mlo_link_switch_params *src)
1164*5113495bSYour Name {
1165*5113495bSYour Name 	struct wlan_mlo_peer_context *ml_peer = NULL;
1166*5113495bSYour Name 	struct wlan_mlo_dev_context *mld_ctx = NULL;
1167*5113495bSYour Name 
1168*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event,
1169*5113495bSYour Name 				 struct wlan_diag_mlo_link_status);
1170*5113495bSYour Name 
1171*5113495bSYour Name 	qdf_mem_zero(&wlan_diag_event,
1172*5113495bSYour Name 		     sizeof(struct wlan_diag_mlo_link_status));
1173*5113495bSYour Name 
1174*5113495bSYour Name 	ml_peer = wlan_mlo_get_mlpeer_by_peer_mladdr(&src->mld_addr, &mld_ctx);
1175*5113495bSYour Name 
1176*5113495bSYour Name 	if (!mld_ctx) {
1177*5113495bSYour Name 		logging_err("mlo dev ctx for mld_mac: "
1178*5113495bSYour Name 			    QDF_MAC_ADDR_FMT
1179*5113495bSYour Name 			    " not found",
1180*5113495bSYour Name 			    QDF_MAC_ADDR_REF(src->mld_addr.bytes));
1181*5113495bSYour Name 		return;
1182*5113495bSYour Name 	}
1183*5113495bSYour Name 
1184*5113495bSYour Name 	wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
1185*5113495bSYour Name 	wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
1186*5113495bSYour Name 	wlan_diag_event.version = DIAG_MLO_LINK_STATUS_VERSION_2;
1187*5113495bSYour Name 
1188*5113495bSYour Name 	wlan_diag_event.active_link =
1189*5113495bSYour Name 		wlan_convert_link_id_to_diag_band(&src->mld_addr,
1190*5113495bSYour Name 						  src->active_link_bitmap);
1191*5113495bSYour Name 	if (!wlan_diag_event.active_link)
1192*5113495bSYour Name 		return;
1193*5113495bSYour Name 	wlan_diag_event.prev_active_link =
1194*5113495bSYour Name 		wlan_convert_link_id_to_diag_band(&src->mld_addr,
1195*5113495bSYour Name 						  src->prev_link_bitmap);
1196*5113495bSYour Name 	if (!wlan_diag_event.prev_active_link)
1197*5113495bSYour Name 		return;
1198*5113495bSYour Name 
1199*5113495bSYour Name 	if (!mld_ctx->link_ctx) {
1200*5113495bSYour Name 		logging_err("link ctx for mld_mac: "
1201*5113495bSYour Name 			    QDF_MAC_ADDR_FMT
1202*5113495bSYour Name 			    " not found",
1203*5113495bSYour Name 			    QDF_MAC_ADDR_REF(src->mld_addr.bytes));
1204*5113495bSYour Name 		return;
1205*5113495bSYour Name 	}
1206*5113495bSYour Name 
1207*5113495bSYour Name 	wlan_diag_event.associated_links =
1208*5113495bSYour Name 			wlan_get_supported_link_band_bitmap(mld_ctx->link_ctx);
1209*5113495bSYour Name 
1210*5113495bSYour Name 	if (!wlan_diag_event.associated_links)
1211*5113495bSYour Name 		return;
1212*5113495bSYour Name 
1213*5113495bSYour Name 	wlan_diag_event.reason = src->reason_code;
1214*5113495bSYour Name 	/*
1215*5113495bSYour Name 	 * FW timestamp received from FW in milliseconds and to be sent to
1216*5113495bSYour Name 	 * userspace in microseconds
1217*5113495bSYour Name 	 */
1218*5113495bSYour Name 	wlan_diag_event.diag_cmn.fw_timestamp = src->fw_timestamp * 1000;
1219*5113495bSYour Name 
1220*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event,
1221*5113495bSYour Name 				    EVENT_WLAN_MLO_LINK_STATUS);
1222*5113495bSYour Name }
1223*5113495bSYour Name #endif
1224*5113495bSYour Name #endif
1225