1  /*
2   * Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for any
6   * purpose with or without fee is hereby granted, provided that the above
7   * copyright notice and this permission notice appear in all copies.
8   *
9   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16   */
17  
18  /**
19   * DOC: wlan_cm_api.c
20   *
21   * This file maintains definitaions public apis.
22   */
23  
24  #include <wlan_cm_api.h>
25  #include "connection_mgr/core/src/wlan_cm_main_api.h"
26  #include "connection_mgr/core/src/wlan_cm_roam.h"
27  #include <wlan_vdev_mgr_utils_api.h>
28  #ifdef WLAN_FEATURE_11BE_MLO
29  #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
30  #include "wlan_mlo_mgr_roam.h"
31  #endif
32  #endif
33  
wlan_cm_start_connect(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_req * req)34  QDF_STATUS wlan_cm_start_connect(struct wlan_objmgr_vdev *vdev,
35  				 struct wlan_cm_connect_req *req)
36  {
37  	return cm_connect_start_req(vdev, req);
38  }
39  
wlan_cm_disconnect(struct wlan_objmgr_vdev * vdev,enum wlan_cm_source source,enum wlan_reason_code reason_code,struct qdf_mac_addr * bssid)40  QDF_STATUS wlan_cm_disconnect(struct wlan_objmgr_vdev *vdev,
41  			      enum wlan_cm_source source,
42  			      enum wlan_reason_code reason_code,
43  			      struct qdf_mac_addr *bssid)
44  {
45  	struct wlan_cm_disconnect_req req = {0};
46  
47  	req.vdev_id = wlan_vdev_get_id(vdev);
48  	req.source = source;
49  	req.reason_code = reason_code;
50  	if (bssid)
51  		qdf_copy_macaddr(&req.bssid, bssid);
52  
53  	return cm_disconnect_start_req(vdev, &req);
54  }
55  
wlan_cm_disconnect_sync(struct wlan_objmgr_vdev * vdev,enum wlan_cm_source source,enum wlan_reason_code reason_code)56  QDF_STATUS wlan_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev,
57  				   enum wlan_cm_source source,
58  				   enum wlan_reason_code reason_code)
59  {
60  	struct wlan_cm_disconnect_req req = {0};
61  
62  	req.vdev_id = wlan_vdev_get_id(vdev);
63  	req.source = source;
64  	req.reason_code = reason_code;
65  
66  	return cm_disconnect_start_req_sync(vdev, &req);
67  }
68  
wlan_cm_bss_select_ind_rsp(struct wlan_objmgr_vdev * vdev,QDF_STATUS status)69  QDF_STATUS wlan_cm_bss_select_ind_rsp(struct wlan_objmgr_vdev *vdev,
70  				      QDF_STATUS status)
71  {
72  	return cm_bss_select_ind_rsp(vdev, status);
73  }
74  
wlan_cm_bss_peer_create_rsp(struct wlan_objmgr_vdev * vdev,QDF_STATUS status,struct qdf_mac_addr * peer_mac)75  QDF_STATUS wlan_cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev,
76  				       QDF_STATUS status,
77  				       struct qdf_mac_addr *peer_mac)
78  {
79  	uint32_t prefix;
80  	struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev);
81  
82  	if (!cm_ctx)
83  		return QDF_STATUS_E_INVAL;
84  
85  	prefix = CM_ID_GET_PREFIX(cm_ctx->active_cm_id);
86  	if (prefix == ROAM_REQ_PREFIX)
87  		return cm_roam_bss_peer_create_rsp(vdev, status, peer_mac);
88  	else
89  		return cm_bss_peer_create_rsp(vdev, status, peer_mac);
90  }
91  
wlan_cm_update_scan_mlme_info(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * resp)92  void wlan_cm_update_scan_mlme_info(struct wlan_objmgr_vdev *vdev,
93  				   struct wlan_cm_connect_resp *resp)
94  {
95  	struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev);
96  
97  	if (!cm_ctx)
98  		return;
99  
100  	return cm_update_scan_mlme_info(cm_ctx, resp);
101  }
102  
wlan_cm_connect_rsp(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * resp)103  QDF_STATUS wlan_cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
104  			       struct wlan_cm_connect_resp *resp)
105  {
106  	return cm_connect_rsp(vdev, resp);
107  }
108  
wlan_cm_bss_peer_delete_ind(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * peer_mac)109  QDF_STATUS wlan_cm_bss_peer_delete_ind(struct wlan_objmgr_vdev *vdev,
110  				       struct qdf_mac_addr *peer_mac)
111  {
112  	return cm_bss_peer_delete_req(vdev, peer_mac);
113  }
114  
wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev * vdev,uint32_t status)115  QDF_STATUS wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev *vdev,
116  				       uint32_t status)
117  {
118  	return cm_vdev_down_req(vdev, status);
119  }
120  
wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev * vdev,struct wlan_cm_discon_rsp * resp)121  QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev,
122  				  struct wlan_cm_discon_rsp *resp)
123  {
124  	uint32_t prefix;
125  	struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev);
126  
127  	if (!cm_ctx)
128  		return QDF_STATUS_E_INVAL;
129  
130  	prefix = CM_ID_GET_PREFIX(cm_ctx->active_cm_id);
131  	if (prefix == ROAM_REQ_PREFIX)
132  		return cm_roam_disconnect_rsp(vdev, resp);
133  	else
134  		return cm_disconnect_rsp(vdev, resp);
135  }
136  
137  #ifdef WLAN_FEATURE_HOST_ROAM
wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * resp)138  QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
139  			       struct wlan_cm_connect_resp *resp)
140  {
141  	return cm_reassoc_rsp(vdev, resp);
142  }
143  #endif
144  
wlan_cm_free_connect_req(struct wlan_cm_connect_req * connect_req)145  void wlan_cm_free_connect_req(struct wlan_cm_connect_req *connect_req)
146  {
147  	if (!connect_req)
148  		return;
149  
150  	cm_free_connect_req(connect_req);
151  }
152  
wlan_cm_free_connect_resp(struct wlan_cm_connect_resp * connect_rsp)153  void wlan_cm_free_connect_resp(struct wlan_cm_connect_resp *connect_rsp)
154  {
155  	if (!connect_rsp)
156  		return;
157  
158  	cm_free_connect_rsp(connect_rsp);
159  }
160  
wlan_cm_free_connect_req_param(struct wlan_cm_connect_req * req)161  void wlan_cm_free_connect_req_param(struct wlan_cm_connect_req *req)
162  {
163  	if (!req)
164  		return;
165  
166  	cm_free_connect_req_param(req);
167  }
168  
wlan_cm_set_max_connect_attempts(struct wlan_objmgr_vdev * vdev,uint8_t max_connect_attempts)169  void wlan_cm_set_max_connect_attempts(struct wlan_objmgr_vdev *vdev,
170  				      uint8_t max_connect_attempts)
171  {
172  	cm_set_max_connect_attempts(vdev, max_connect_attempts);
173  }
174  
wlan_cm_set_max_connect_timeout(struct wlan_objmgr_vdev * vdev,uint32_t max_connect_timeout)175  void wlan_cm_set_max_connect_timeout(struct wlan_objmgr_vdev *vdev,
176  				     uint32_t max_connect_timeout)
177  {
178  	cm_set_max_connect_timeout(vdev, max_connect_timeout);
179  }
180  
wlan_cm_is_vdev_connecting(struct wlan_objmgr_vdev * vdev)181  bool wlan_cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev)
182  {
183  	return cm_is_vdev_connecting(vdev);
184  }
185  
wlan_cm_is_vdev_connected(struct wlan_objmgr_vdev * vdev)186  bool wlan_cm_is_vdev_connected(struct wlan_objmgr_vdev *vdev)
187  {
188  	return cm_is_vdev_connected(vdev);
189  }
190  
wlan_cm_is_vdev_active(struct wlan_objmgr_vdev * vdev)191  bool wlan_cm_is_vdev_active(struct wlan_objmgr_vdev *vdev)
192  {
193  	return cm_is_vdev_active(vdev);
194  }
195  
wlan_cm_is_vdev_disconnecting(struct wlan_objmgr_vdev * vdev)196  bool wlan_cm_is_vdev_disconnecting(struct wlan_objmgr_vdev *vdev)
197  {
198  	return cm_is_vdev_disconnecting(vdev);
199  }
200  
wlan_cm_is_vdev_disconnected(struct wlan_objmgr_vdev * vdev)201  bool wlan_cm_is_vdev_disconnected(struct wlan_objmgr_vdev *vdev)
202  {
203  	return cm_is_vdev_disconnected(vdev);
204  }
205  
wlan_cm_is_vdev_idle_due_to_link_switch(struct wlan_objmgr_vdev * vdev)206  bool wlan_cm_is_vdev_idle_due_to_link_switch(struct wlan_objmgr_vdev *vdev)
207  {
208  	return cm_is_vdev_idle_due_to_link_switch(vdev);
209  }
210  
wlan_cm_is_vdev_roaming(struct wlan_objmgr_vdev * vdev)211  bool wlan_cm_is_vdev_roaming(struct wlan_objmgr_vdev *vdev)
212  {
213  	return cm_is_vdev_roaming(vdev);
214  }
215  
216  #ifdef WLAN_FEATURE_ROAM_OFFLOAD
wlan_cm_is_vdev_roam_started(struct wlan_objmgr_vdev * vdev)217  bool wlan_cm_is_vdev_roam_started(struct wlan_objmgr_vdev *vdev)
218  {
219  	return cm_is_vdev_roam_started(vdev);
220  }
221  
wlan_cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev * vdev)222  bool wlan_cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev *vdev)
223  {
224  	return cm_is_vdev_roam_sync_inprogress(vdev);
225  }
226  #endif
227  
228  #ifdef WLAN_FEATURE_HOST_ROAM
wlan_cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev * vdev)229  bool wlan_cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev *vdev)
230  {
231  	return cm_is_vdev_roam_preauth_state(vdev);
232  }
233  
wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev * vdev)234  bool wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev *vdev)
235  {
236  	return cm_is_vdev_roam_reassoc_state(vdev);
237  }
238  #endif
239  
240  enum wlan_cm_active_request_type
wlan_cm_get_active_req_type(struct wlan_objmgr_vdev * vdev)241  wlan_cm_get_active_req_type(struct wlan_objmgr_vdev *vdev)
242  {
243  	return cm_get_active_req_type(vdev);
244  }
245  
wlan_cm_get_active_connect_req(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_connect_req * req)246  bool wlan_cm_get_active_connect_req(struct wlan_objmgr_vdev *vdev,
247  				    struct wlan_cm_vdev_connect_req *req)
248  {
249  	return cm_get_active_connect_req(vdev, req);
250  }
251  
252  QDF_STATUS
wlan_cm_get_active_connect_req_param(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_req * req)253  wlan_cm_get_active_connect_req_param(struct wlan_objmgr_vdev *vdev,
254  				     struct wlan_cm_connect_req *req)
255  {
256  	return cm_get_active_connect_req_param(vdev, req);
257  }
258  
wlan_cm_get_ext_hdl(struct wlan_objmgr_vdev * vdev)259  cm_ext_t *wlan_cm_get_ext_hdl(struct wlan_objmgr_vdev *vdev)
260  {
261  	return cm_get_ext_hdl(vdev);
262  }
263  
wlan_cm_is_first_candidate_connect_attempt(struct wlan_objmgr_vdev * vdev)264  bool wlan_cm_is_first_candidate_connect_attempt(struct wlan_objmgr_vdev *vdev)
265  {
266  	return cm_is_first_candidate_connect_attempt(vdev);
267  }
268  
wlan_cm_is_link_switch_disconnect_resp(struct wlan_cm_discon_rsp * resp)269  bool wlan_cm_is_link_switch_disconnect_resp(struct wlan_cm_discon_rsp *resp)
270  {
271  	return cm_is_link_switch_disconnect_resp(resp);
272  }
273  
wlan_cm_is_link_switch_connect_resp(struct wlan_cm_connect_resp * resp)274  bool wlan_cm_is_link_switch_connect_resp(struct wlan_cm_connect_resp *resp)
275  {
276  	return cm_is_link_switch_connect_resp(resp);
277  }
278  
wlan_cm_trigger_panic_on_cmd_timeout(struct wlan_objmgr_vdev * vdev,enum qdf_hang_reason reason)279  void wlan_cm_trigger_panic_on_cmd_timeout(struct wlan_objmgr_vdev *vdev,
280  					  enum qdf_hang_reason reason)
281  {
282  	cm_trigger_panic_on_cmd_timeout(vdev, reason);
283  }
284  
285  #ifdef WLAN_FEATURE_HOST_ROAM
wlan_cm_get_active_reassoc_req(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_reassoc_req * req)286  bool wlan_cm_get_active_reassoc_req(struct wlan_objmgr_vdev *vdev,
287  				    struct wlan_cm_vdev_reassoc_req *req)
288  {
289  	return cm_get_active_reassoc_req(vdev, req);
290  }
291  #endif
292  
wlan_cm_get_active_disconnect_req(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_discon_req * req)293  bool wlan_cm_get_active_disconnect_req(struct wlan_objmgr_vdev *vdev,
294  				       struct wlan_cm_vdev_discon_req *req)
295  {
296  	return cm_get_active_disconnect_req(vdev, req);
297  }
298  
wlan_cm_reason_code_to_str(enum wlan_reason_code reason)299  const char *wlan_cm_reason_code_to_str(enum wlan_reason_code reason)
300  {
301  	if (reason > REASON_PROP_START)
302  		return "";
303  
304  	switch (reason) {
305  	CASE_RETURN_STRING(REASON_UNSPEC_FAILURE);
306  	CASE_RETURN_STRING(REASON_PREV_AUTH_NOT_VALID);
307  	CASE_RETURN_STRING(REASON_DEAUTH_NETWORK_LEAVING);
308  	CASE_RETURN_STRING(REASON_DISASSOC_DUE_TO_INACTIVITY);
309  	CASE_RETURN_STRING(REASON_DISASSOC_AP_BUSY);
310  	CASE_RETURN_STRING(REASON_CLASS2_FRAME_FROM_NON_AUTH_STA);
311  	CASE_RETURN_STRING(REASON_CLASS3_FRAME_FROM_NON_ASSOC_STA);
312  	CASE_RETURN_STRING(REASON_DISASSOC_NETWORK_LEAVING);
313  	CASE_RETURN_STRING(REASON_STA_NOT_AUTHENTICATED);
314  	CASE_RETURN_STRING(REASON_BAD_PWR_CAPABILITY);
315  	CASE_RETURN_STRING(REASON_BAD_SUPPORTED_CHANNELS);
316  	CASE_RETURN_STRING(REASON_DISASSOC_BSS_TRANSITION);
317  	CASE_RETURN_STRING(REASON_INVALID_IE);
318  	CASE_RETURN_STRING(REASON_MIC_FAILURE);
319  	CASE_RETURN_STRING(REASON_4WAY_HANDSHAKE_TIMEOUT);
320  	CASE_RETURN_STRING(REASON_GROUP_KEY_UPDATE_TIMEOUT);
321  	CASE_RETURN_STRING(REASON_IN_4WAY_DIFFERS);
322  	CASE_RETURN_STRING(REASON_INVALID_GROUP_CIPHER);
323  	CASE_RETURN_STRING(REASON_INVALID_PAIRWISE_CIPHER);
324  	CASE_RETURN_STRING(REASON_INVALID_AKMP);
325  	CASE_RETURN_STRING(REASON_UNSUPPORTED_RSNE_VER);
326  	CASE_RETURN_STRING(REASON_INVALID_RSNE_CAPABILITIES);
327  	CASE_RETURN_STRING(REASON_1X_AUTH_FAILURE);
328  	CASE_RETURN_STRING(REASON_CIPHER_SUITE_REJECTED);
329  	CASE_RETURN_STRING(REASON_TDLS_PEER_UNREACHABLE);
330  	CASE_RETURN_STRING(REASON_TDLS_UNSPEC);
331  	CASE_RETURN_STRING(REASON_DISASSOC_SSP_REQUESTED);
332  	CASE_RETURN_STRING(REASON_NO_SSP_ROAMING_AGREEMENT);
333  	CASE_RETURN_STRING(REASON_BAD_CIPHER_OR_AKM);
334  	CASE_RETURN_STRING(REASON_LOCATION_NOT_AUTHORIZED);
335  	CASE_RETURN_STRING(REASON_SERVICE_CHANGE_PRECLUDES_TS);
336  	CASE_RETURN_STRING(REASON_QOS_UNSPECIFIED);
337  	CASE_RETURN_STRING(REASON_NO_BANDWIDTH);
338  	CASE_RETURN_STRING(REASON_XS_UNACKED_FRAMES);
339  	CASE_RETURN_STRING(REASON_EXCEEDED_TXOP);
340  	CASE_RETURN_STRING(REASON_STA_LEAVING);
341  	CASE_RETURN_STRING(REASON_END_TS_BA_DLS);
342  	CASE_RETURN_STRING(REASON_UNKNOWN_TS_BA);
343  	CASE_RETURN_STRING(REASON_TIMEDOUT);
344  	CASE_RETURN_STRING(REASON_PEERKEY_MISMATCH);
345  	CASE_RETURN_STRING(REASON_AUTHORIZED_ACCESS_LIMIT_REACHED);
346  	CASE_RETURN_STRING(REASON_EXTERNAL_SERVICE_REQUIREMENTS);
347  	CASE_RETURN_STRING(REASON_INVALID_FT_ACTION_FRAME_COUNT);
348  	CASE_RETURN_STRING(REASON_INVALID_PMKID);
349  	CASE_RETURN_STRING(REASON_INVALID_MDE);
350  	CASE_RETURN_STRING(REASON_INVALID_FTE);
351  	CASE_RETURN_STRING(REASON_MESH_PEERING_CANCELLED);
352  	CASE_RETURN_STRING(REASON_MESH_MAX_PEERS);
353  	CASE_RETURN_STRING(REASON_MESH_CONFIG_POLICY_VIOLATION);
354  	CASE_RETURN_STRING(REASON_MESH_CLOSE_RCVD);
355  	CASE_RETURN_STRING(REASON_MESH_MAX_RETRIES);
356  	CASE_RETURN_STRING(REASON_MESH_CONFIRM_TIMEOUT);
357  	CASE_RETURN_STRING(REASON_MESH_INVALID_GTK);
358  	CASE_RETURN_STRING(REASON_MESH_INCONSISTENT_PARAMS);
359  	CASE_RETURN_STRING(REASON_MESH_INVALID_SECURITY_CAP);
360  	CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_PROXY_INFO);
361  	CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO);
362  	CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_DEST_UNREACHABLE);
363  	CASE_RETURN_STRING(REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS);
364  	CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ);
365  	CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED);
366  	CASE_RETURN_STRING(REASON_POOR_RSSI_CONDITIONS);
367  	default:
368  		return "Unknown";
369  	}
370  }
371  
372  #ifdef WLAN_POLICY_MGR_ENABLE
wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,wlan_cm_id cm_id,QDF_STATUS status)373  void wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
374  				 wlan_cm_id cm_id, QDF_STATUS status)
375  {
376  	uint32_t prefix;
377  
378  	prefix = CM_ID_GET_PREFIX(cm_id);
379  	if (prefix == ROAM_REQ_PREFIX)
380  		cm_reassoc_hw_mode_change_resp(pdev, vdev_id, cm_id, status);
381  	else
382  		cm_hw_mode_change_resp(pdev, vdev_id, cm_id, status);
383  }
384  #endif /* ifdef POLICY_MGR_ENABLE */
385  
386  #ifdef WLAN_FEATURE_LL_LT_SAP
wlan_cm_bearer_switch_resp(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,wlan_cm_id cm_id,QDF_STATUS status)387  void wlan_cm_bearer_switch_resp(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
388  				wlan_cm_id cm_id, QDF_STATUS status)
389  {
390  	cm_bearer_switch_resp(psoc, vdev_id, cm_id, status);
391  }
392  #endif
393  
394  #ifdef SM_ENG_HIST_ENABLE
wlan_cm_sm_history_print(struct wlan_objmgr_vdev * vdev)395  void wlan_cm_sm_history_print(struct wlan_objmgr_vdev *vdev)
396  {
397  	return cm_sm_history_print(vdev);
398  }
399  
wlan_cm_req_history_print(struct wlan_objmgr_vdev * vdev)400  void wlan_cm_req_history_print(struct wlan_objmgr_vdev *vdev)
401  {
402  	struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev);
403  
404  	if (!cm_ctx)
405  		return;
406  
407  	cm_req_history_print(cm_ctx);
408  }
409  #endif /* SM_ENG_HIST_ENABLE */
410  
411  #ifndef CONN_MGR_ADV_FEATURE
wlan_cm_set_candidate_advance_filter_cb(struct wlan_objmgr_vdev * vdev,void (* filter_fun)(struct wlan_objmgr_vdev * vdev,struct scan_filter * filter))412  void wlan_cm_set_candidate_advance_filter_cb(
413  		struct wlan_objmgr_vdev *vdev,
414  		void (*filter_fun)(struct wlan_objmgr_vdev *vdev,
415  				   struct scan_filter *filter))
416  {
417  	cm_set_candidate_advance_filter_cb(vdev, filter_fun);
418  }
419  
wlan_cm_set_candidate_custom_sort_cb(struct wlan_objmgr_vdev * vdev,void (* sort_fun)(struct wlan_objmgr_vdev * vdev,qdf_list_t * list))420  void wlan_cm_set_candidate_custom_sort_cb(
421  		struct wlan_objmgr_vdev *vdev,
422  		void (*sort_fun)(struct wlan_objmgr_vdev *vdev,
423  				 qdf_list_t *list))
424  {
425  	cm_set_candidate_custom_sort_cb(vdev, sort_fun);
426  }
427  
428  #endif
429  
wlan_cm_get_rnr(struct wlan_objmgr_vdev * vdev,wlan_cm_id cm_id,struct reduced_neighbor_report * rnr)430  QDF_STATUS wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev, wlan_cm_id cm_id,
431  			   struct reduced_neighbor_report *rnr)
432  {
433  	enum QDF_OPMODE op_mode = wlan_vdev_mlme_get_opmode(vdev);
434  
435  	if (op_mode != QDF_STA_MODE && op_mode != QDF_P2P_CLIENT_MODE) {
436  		mlme_err("vdev %d Invalid mode %d",
437  			 wlan_vdev_get_id(vdev), op_mode);
438  		return QDF_STATUS_E_NOSUPPORT;
439  	}
440  
441  	return cm_get_rnr(vdev, cm_id, rnr);
442  }
443  
444  struct scan_cache_entry *
wlan_cm_get_curr_candidate_entry(struct wlan_objmgr_vdev * vdev,wlan_cm_id cm_id)445  wlan_cm_get_curr_candidate_entry(struct wlan_objmgr_vdev *vdev,
446  				 wlan_cm_id cm_id)
447  {
448  	return cm_get_curr_candidate_entry(vdev, cm_id);
449  }
450  
451  void
wlan_cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev * vdev,wlan_cm_id cm_id,struct wlan_cm_connect_resp * rsp)452  wlan_cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev,
453  					     wlan_cm_id cm_id,
454  					     struct wlan_cm_connect_resp *rsp)
455  {
456  	return cm_connect_resp_fill_mld_addr_from_cm_id(vdev, cm_id, rsp);
457  }
458  
459  #ifdef WLAN_FEATURE_11BE_MLO
460  void
wlan_cm_connect_resp_fill_mld_addr_from_vdev_id(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,struct scan_cache_entry * entry,struct wlan_cm_connect_resp * rsp)461  wlan_cm_connect_resp_fill_mld_addr_from_vdev_id(struct wlan_objmgr_psoc *psoc,
462  						uint8_t vdev_id,
463  						struct scan_cache_entry *entry,
464  						struct wlan_cm_connect_resp *rsp)
465  {
466  	struct wlan_objmgr_vdev *vdev;
467  
468  	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
469  						    WLAN_MLME_CM_ID);
470  	if (!vdev)
471  		return;
472  
473  	cm_connect_resp_fill_mld_addr_from_candidate(vdev, entry, rsp);
474  	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
475  }
476  #endif
477  
478  QDF_STATUS
wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev * vdev,struct wlan_cm_vdev_discon_req * req)479  wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev *vdev,
480  				 struct wlan_cm_vdev_discon_req *req)
481  {
482  	return cm_handle_rso_stop_rsp(vdev, req);
483  }
484  
485  #ifdef WLAN_FEATURE_11BE
wlan_cm_sta_set_chan_param(struct wlan_objmgr_vdev * vdev,qdf_freq_t ch_freq,enum phy_ch_width ori_bw,uint16_t ori_punc,uint8_t ccfs0,uint8_t ccfs1,struct ch_params * chan_param)486  QDF_STATUS wlan_cm_sta_set_chan_param(struct wlan_objmgr_vdev *vdev,
487  				      qdf_freq_t ch_freq,
488  				      enum phy_ch_width ori_bw,
489  				      uint16_t ori_punc,
490  				      uint8_t ccfs0, uint8_t ccfs1,
491  				      struct ch_params *chan_param)
492  {
493  	uint16_t primary_puncture_bitmap = 0;
494  	struct wlan_objmgr_pdev *pdev;
495  	struct reg_channel_list chan_list;
496  	qdf_freq_t sec_ch_2g_freq = 0;
497  	qdf_freq_t center_freq_320 = 0;
498  	qdf_freq_t center_freq_40 = 0;
499  	uint8_t band_mask;
500  	uint16_t new_punc = 0;
501  
502  	if (!vdev || !chan_param) {
503  		mlme_err("invalid input parameters");
504  		return QDF_STATUS_E_INVAL;
505  	}
506  	pdev = wlan_vdev_get_pdev(vdev);
507  	if (!pdev) {
508  		mlme_err("invalid pdev");
509  		return QDF_STATUS_E_INVAL;
510  	}
511  	if (ori_bw == CH_WIDTH_320MHZ) {
512  		if (WLAN_REG_IS_6GHZ_CHAN_FREQ(ch_freq))
513  			band_mask = BIT(REG_BAND_6G);
514  		else
515  			band_mask = BIT(REG_BAND_5G);
516  		center_freq_320 = wlan_reg_chan_band_to_freq(pdev, ccfs1,
517  							     band_mask);
518  	} else if (ori_bw == CH_WIDTH_40MHZ) {
519  		if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq)) {
520  			band_mask = BIT(REG_BAND_2G);
521  			center_freq_40 = wlan_reg_chan_band_to_freq(pdev,
522  								    ccfs0,
523  								    band_mask);
524  			if (center_freq_40 == ch_freq + BW_10_MHZ)
525  				sec_ch_2g_freq = ch_freq + BW_20_MHZ;
526  			if (center_freq_40 == ch_freq - BW_10_MHZ)
527  				sec_ch_2g_freq = ch_freq - BW_20_MHZ;
528  		}
529  	}
530  	wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc,
531  					ch_freq,
532  					center_freq_320,
533  					CH_WIDTH_20MHZ,
534  					&primary_puncture_bitmap);
535  	if (primary_puncture_bitmap) {
536  		mlme_err("sta vdev %d freq %d RX bw %d puncture 0x%x primary chan is punctured",
537  			 wlan_vdev_get_id(vdev), ch_freq,
538  			 ori_bw, ori_punc);
539  		return QDF_STATUS_E_FAULT;
540  	}
541  	if (chan_param->ch_width != CH_WIDTH_320MHZ)
542  		center_freq_320 = 0;
543  	qdf_mem_zero(&chan_list, sizeof(chan_list));
544  	wlan_reg_fill_channel_list_for_pwrmode(pdev, ch_freq,
545  					       sec_ch_2g_freq,
546  					       chan_param->ch_width,
547  					       center_freq_320, &chan_list,
548  					       REG_CURRENT_PWR_MODE, true);
549  	*chan_param = chan_list.chan_param[0];
550  	if (chan_param->ch_width == ori_bw)
551  		new_punc = ori_punc;
552  	else
553  		wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc,
554  						ch_freq,
555  						chan_param->mhz_freq_seg1,
556  						chan_param->ch_width,
557  						&new_punc);
558  
559  	chan_param->reg_punc_bitmap = new_punc;
560  
561  	return QDF_STATUS_SUCCESS;
562  }
563  
wlan_cm_sta_update_bw_puncture(struct wlan_objmgr_vdev * vdev,uint8_t * peer_mac,uint16_t ori_punc,enum phy_ch_width ori_bw,uint8_t ccfs0,uint8_t ccfs1,enum phy_ch_width new_bw)564  QDF_STATUS wlan_cm_sta_update_bw_puncture(struct wlan_objmgr_vdev *vdev,
565  					  uint8_t *peer_mac,
566  					  uint16_t ori_punc,
567  					  enum phy_ch_width ori_bw,
568  					  uint8_t ccfs0, uint8_t ccfs1,
569  					  enum phy_ch_width new_bw)
570  {
571  	struct wlan_channel *des_chan;
572  	struct ch_params ch_param;
573  	uint32_t bw_puncture = 0;
574  	QDF_STATUS status = QDF_STATUS_E_INVAL;
575  
576  	if (!vdev || !peer_mac) {
577  		mlme_err("invalid input parameters");
578  		return status;
579  	}
580  	des_chan = wlan_vdev_mlme_get_des_chan(vdev);
581  	if (!des_chan) {
582  		mlme_err("invalid des chan");
583  		return status;
584  	}
585  	qdf_mem_zero(&ch_param, sizeof(ch_param));
586  	ch_param.ch_width = new_bw;
587  	status = wlan_cm_sta_set_chan_param(vdev, des_chan->ch_freq,
588  					    ori_bw, ori_punc, ccfs0,
589  					    ccfs1, &ch_param);
590  	if (QDF_IS_STATUS_ERROR(status))
591  		return status;
592  
593  	if (des_chan->puncture_bitmap == ch_param.reg_punc_bitmap &&
594  	    des_chan->ch_width == ch_param.ch_width)
595  		return status;
596  
597  	des_chan->ch_freq_seg1 = ch_param.center_freq_seg0;
598  	des_chan->ch_freq_seg2 = ch_param.center_freq_seg1;
599  	des_chan->ch_cfreq1 = ch_param.mhz_freq_seg0;
600  	des_chan->ch_cfreq2 = ch_param.mhz_freq_seg1;
601  	des_chan->puncture_bitmap = ch_param.reg_punc_bitmap;
602  	des_chan->ch_width = ch_param.ch_width;
603  	mlme_debug("sta vdev %d freq %d bw %d puncture 0x%x ch_cfreq1 %d ch_cfreq2 %d",
604  		   wlan_vdev_get_id(vdev), des_chan->ch_freq,
605  		   des_chan->ch_width, des_chan->puncture_bitmap,
606  		   des_chan->ch_cfreq1, des_chan->ch_cfreq2);
607  	QDF_SET_BITS(bw_puncture, 0, 8, des_chan->ch_width);
608  	QDF_SET_BITS(bw_puncture, 8, 16, des_chan->puncture_bitmap);
609  	return wlan_util_vdev_peer_set_param_send(vdev, peer_mac,
610  						  WLAN_MLME_PEER_BW_PUNCTURE,
611  						  bw_puncture);
612  }
613  #endif /* WLAN_FEATURE_11BE */
614  
615  #ifdef WLAN_FEATURE_11BE_MLO
616  #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
617  bool
wlan_cm_check_mlo_roam_auth_status(struct wlan_objmgr_vdev * vdev)618  wlan_cm_check_mlo_roam_auth_status(struct wlan_objmgr_vdev *vdev)
619  {
620  	return mlo_roam_is_auth_status_connected(wlan_vdev_get_psoc(vdev),
621  					  wlan_vdev_get_id(vdev));
622  }
623  #endif
624  #endif
625  enum MLO_TYPE
wlan_cm_bss_mlo_type(struct wlan_objmgr_psoc * psoc,struct scan_cache_entry * entry,qdf_list_t * scan_list)626  wlan_cm_bss_mlo_type(struct wlan_objmgr_psoc *psoc,
627  		     struct scan_cache_entry *entry,
628  		     qdf_list_t *scan_list)
629  {
630  	return cm_bss_mlo_type(psoc, entry, scan_list);
631  }
632