xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_api.c (revision 70a19e16789e308182f63b15c75decec7bf0b342)
1 /*
2  * Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 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 
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 
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 
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 
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 
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 
92 QDF_STATUS wlan_cm_connect_rsp(struct wlan_objmgr_vdev *vdev,
93 			       struct wlan_cm_connect_resp *resp)
94 {
95 	return cm_connect_rsp(vdev, resp);
96 }
97 
98 QDF_STATUS wlan_cm_bss_peer_delete_ind(struct wlan_objmgr_vdev *vdev,
99 				       struct qdf_mac_addr *peer_mac)
100 {
101 	return cm_bss_peer_delete_req(vdev, peer_mac);
102 }
103 
104 QDF_STATUS wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev *vdev,
105 				       uint32_t status)
106 {
107 	return cm_vdev_down_req(vdev, status);
108 }
109 
110 QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev,
111 				  struct wlan_cm_discon_rsp *resp)
112 {
113 	uint32_t prefix;
114 	struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev);
115 
116 	if (!cm_ctx)
117 		return QDF_STATUS_E_INVAL;
118 
119 	prefix = CM_ID_GET_PREFIX(cm_ctx->active_cm_id);
120 	if (prefix == ROAM_REQ_PREFIX)
121 		return cm_roam_disconnect_rsp(vdev, resp);
122 	else
123 		return cm_disconnect_rsp(vdev, resp);
124 }
125 
126 #ifdef WLAN_FEATURE_HOST_ROAM
127 QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev,
128 			       struct wlan_cm_connect_resp *resp)
129 {
130 	return cm_reassoc_rsp(vdev, resp);
131 }
132 #endif
133 
134 void wlan_cm_set_max_connect_attempts(struct wlan_objmgr_vdev *vdev,
135 				      uint8_t max_connect_attempts)
136 {
137 	cm_set_max_connect_attempts(vdev, max_connect_attempts);
138 }
139 
140 void wlan_cm_set_max_connect_timeout(struct wlan_objmgr_vdev *vdev,
141 				     uint32_t max_connect_timeout)
142 {
143 	cm_set_max_connect_timeout(vdev, max_connect_timeout);
144 }
145 
146 bool wlan_cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev)
147 {
148 	return cm_is_vdev_connecting(vdev);
149 }
150 
151 bool wlan_cm_is_vdev_connected(struct wlan_objmgr_vdev *vdev)
152 {
153 	return cm_is_vdev_connected(vdev);
154 }
155 
156 bool wlan_cm_is_vdev_active(struct wlan_objmgr_vdev *vdev)
157 {
158 	return cm_is_vdev_active(vdev);
159 }
160 
161 bool wlan_cm_is_vdev_disconnecting(struct wlan_objmgr_vdev *vdev)
162 {
163 	return cm_is_vdev_disconnecting(vdev);
164 }
165 
166 bool wlan_cm_is_vdev_disconnected(struct wlan_objmgr_vdev *vdev)
167 {
168 	return cm_is_vdev_disconnected(vdev);
169 }
170 
171 bool wlan_cm_is_vdev_roaming(struct wlan_objmgr_vdev *vdev)
172 {
173 	return cm_is_vdev_roaming(vdev);
174 }
175 
176 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
177 bool wlan_cm_is_vdev_roam_started(struct wlan_objmgr_vdev *vdev)
178 {
179 	return cm_is_vdev_roam_started(vdev);
180 }
181 
182 bool wlan_cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev *vdev)
183 {
184 	return cm_is_vdev_roam_sync_inprogress(vdev);
185 }
186 #endif
187 
188 #ifdef WLAN_FEATURE_HOST_ROAM
189 bool wlan_cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev *vdev)
190 {
191 	return cm_is_vdev_roam_preauth_state(vdev);
192 }
193 
194 bool wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev *vdev)
195 {
196 	return cm_is_vdev_roam_reassoc_state(vdev);
197 }
198 #endif
199 
200 enum wlan_cm_active_request_type
201 wlan_cm_get_active_req_type(struct wlan_objmgr_vdev *vdev)
202 {
203 	return cm_get_active_req_type(vdev);
204 }
205 
206 bool wlan_cm_get_active_connect_req(struct wlan_objmgr_vdev *vdev,
207 				    struct wlan_cm_vdev_connect_req *req)
208 {
209 	return cm_get_active_connect_req(vdev, req);
210 }
211 
212 cm_ext_t *wlan_cm_get_ext_hdl(struct wlan_objmgr_vdev *vdev)
213 {
214 	return cm_get_ext_hdl(vdev);
215 }
216 
217 #ifdef WLAN_FEATURE_HOST_ROAM
218 bool wlan_cm_get_active_reassoc_req(struct wlan_objmgr_vdev *vdev,
219 				    struct wlan_cm_vdev_reassoc_req *req)
220 {
221 	return cm_get_active_reassoc_req(vdev, req);
222 }
223 #endif
224 
225 bool wlan_cm_get_active_disconnect_req(struct wlan_objmgr_vdev *vdev,
226 				       struct wlan_cm_vdev_discon_req *req)
227 {
228 	return cm_get_active_disconnect_req(vdev, req);
229 }
230 
231 const char *wlan_cm_reason_code_to_str(enum wlan_reason_code reason)
232 {
233 	if (reason > REASON_PROP_START)
234 		return "";
235 
236 	switch (reason) {
237 	CASE_RETURN_STRING(REASON_UNSPEC_FAILURE);
238 	CASE_RETURN_STRING(REASON_PREV_AUTH_NOT_VALID);
239 	CASE_RETURN_STRING(REASON_DEAUTH_NETWORK_LEAVING);
240 	CASE_RETURN_STRING(REASON_DISASSOC_DUE_TO_INACTIVITY);
241 	CASE_RETURN_STRING(REASON_DISASSOC_AP_BUSY);
242 	CASE_RETURN_STRING(REASON_CLASS2_FRAME_FROM_NON_AUTH_STA);
243 	CASE_RETURN_STRING(REASON_CLASS3_FRAME_FROM_NON_ASSOC_STA);
244 	CASE_RETURN_STRING(REASON_DISASSOC_NETWORK_LEAVING);
245 	CASE_RETURN_STRING(REASON_STA_NOT_AUTHENTICATED);
246 	CASE_RETURN_STRING(REASON_BAD_PWR_CAPABILITY);
247 	CASE_RETURN_STRING(REASON_BAD_SUPPORTED_CHANNELS);
248 	CASE_RETURN_STRING(REASON_DISASSOC_BSS_TRANSITION);
249 	CASE_RETURN_STRING(REASON_INVALID_IE);
250 	CASE_RETURN_STRING(REASON_MIC_FAILURE);
251 	CASE_RETURN_STRING(REASON_4WAY_HANDSHAKE_TIMEOUT);
252 	CASE_RETURN_STRING(REASON_GROUP_KEY_UPDATE_TIMEOUT);
253 	CASE_RETURN_STRING(REASON_IN_4WAY_DIFFERS);
254 	CASE_RETURN_STRING(REASON_INVALID_GROUP_CIPHER);
255 	CASE_RETURN_STRING(REASON_INVALID_PAIRWISE_CIPHER);
256 	CASE_RETURN_STRING(REASON_INVALID_AKMP);
257 	CASE_RETURN_STRING(REASON_UNSUPPORTED_RSNE_VER);
258 	CASE_RETURN_STRING(REASON_INVALID_RSNE_CAPABILITIES);
259 	CASE_RETURN_STRING(REASON_1X_AUTH_FAILURE);
260 	CASE_RETURN_STRING(REASON_CIPHER_SUITE_REJECTED);
261 	CASE_RETURN_STRING(REASON_TDLS_PEER_UNREACHABLE);
262 	CASE_RETURN_STRING(REASON_TDLS_UNSPEC);
263 	CASE_RETURN_STRING(REASON_DISASSOC_SSP_REQUESTED);
264 	CASE_RETURN_STRING(REASON_NO_SSP_ROAMING_AGREEMENT);
265 	CASE_RETURN_STRING(REASON_BAD_CIPHER_OR_AKM);
266 	CASE_RETURN_STRING(REASON_LOCATION_NOT_AUTHORIZED);
267 	CASE_RETURN_STRING(REASON_SERVICE_CHANGE_PRECLUDES_TS);
268 	CASE_RETURN_STRING(REASON_QOS_UNSPECIFIED);
269 	CASE_RETURN_STRING(REASON_NO_BANDWIDTH);
270 	CASE_RETURN_STRING(REASON_XS_UNACKED_FRAMES);
271 	CASE_RETURN_STRING(REASON_EXCEEDED_TXOP);
272 	CASE_RETURN_STRING(REASON_STA_LEAVING);
273 	CASE_RETURN_STRING(REASON_END_TS_BA_DLS);
274 	CASE_RETURN_STRING(REASON_UNKNOWN_TS_BA);
275 	CASE_RETURN_STRING(REASON_TIMEDOUT);
276 	CASE_RETURN_STRING(REASON_PEERKEY_MISMATCH);
277 	CASE_RETURN_STRING(REASON_AUTHORIZED_ACCESS_LIMIT_REACHED);
278 	CASE_RETURN_STRING(REASON_EXTERNAL_SERVICE_REQUIREMENTS);
279 	CASE_RETURN_STRING(REASON_INVALID_FT_ACTION_FRAME_COUNT);
280 	CASE_RETURN_STRING(REASON_INVALID_PMKID);
281 	CASE_RETURN_STRING(REASON_INVALID_MDE);
282 	CASE_RETURN_STRING(REASON_INVALID_FTE);
283 	CASE_RETURN_STRING(REASON_MESH_PEERING_CANCELLED);
284 	CASE_RETURN_STRING(REASON_MESH_MAX_PEERS);
285 	CASE_RETURN_STRING(REASON_MESH_CONFIG_POLICY_VIOLATION);
286 	CASE_RETURN_STRING(REASON_MESH_CLOSE_RCVD);
287 	CASE_RETURN_STRING(REASON_MESH_MAX_RETRIES);
288 	CASE_RETURN_STRING(REASON_MESH_CONFIRM_TIMEOUT);
289 	CASE_RETURN_STRING(REASON_MESH_INVALID_GTK);
290 	CASE_RETURN_STRING(REASON_MESH_INCONSISTENT_PARAMS);
291 	CASE_RETURN_STRING(REASON_MESH_INVALID_SECURITY_CAP);
292 	CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_PROXY_INFO);
293 	CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO);
294 	CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_DEST_UNREACHABLE);
295 	CASE_RETURN_STRING(REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS);
296 	CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ);
297 	CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED);
298 	CASE_RETURN_STRING(REASON_POOR_RSSI_CONDITIONS);
299 	default:
300 		return "Unknown";
301 	}
302 }
303 
304 #ifdef WLAN_POLICY_MGR_ENABLE
305 void wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
306 				 wlan_cm_id cm_id, QDF_STATUS status)
307 {
308 	uint32_t prefix;
309 
310 	prefix = CM_ID_GET_PREFIX(cm_id);
311 	if (prefix == ROAM_REQ_PREFIX)
312 		cm_reassoc_hw_mode_change_resp(pdev, vdev_id, cm_id, status);
313 	else
314 		cm_hw_mode_change_resp(pdev, vdev_id, cm_id, status);
315 }
316 #endif /* ifdef POLICY_MGR_ENABLE */
317 
318 #ifdef SM_ENG_HIST_ENABLE
319 void wlan_cm_sm_history_print(struct wlan_objmgr_vdev *vdev)
320 {
321 	return cm_sm_history_print(vdev);
322 }
323 
324 void wlan_cm_req_history_print(struct wlan_objmgr_vdev *vdev)
325 {
326 	struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev);
327 
328 	if (!cm_ctx)
329 		return;
330 
331 	cm_req_history_print(cm_ctx);
332 }
333 #endif /* SM_ENG_HIST_ENABLE */
334 
335 #ifndef CONN_MGR_ADV_FEATURE
336 void wlan_cm_set_candidate_advance_filter_cb(
337 		struct wlan_objmgr_vdev *vdev,
338 		void (*filter_fun)(struct wlan_objmgr_vdev *vdev,
339 				   struct scan_filter *filter))
340 {
341 	cm_set_candidate_advance_filter_cb(vdev, filter_fun);
342 }
343 
344 void wlan_cm_set_candidate_custom_sort_cb(
345 		struct wlan_objmgr_vdev *vdev,
346 		void (*sort_fun)(struct wlan_objmgr_vdev *vdev,
347 				 qdf_list_t *list))
348 {
349 	cm_set_candidate_custom_sort_cb(vdev, sort_fun);
350 }
351 
352 #endif
353 
354 struct reduced_neighbor_report *wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev,
355 						wlan_cm_id cm_id)
356 {
357 	enum QDF_OPMODE op_mode = wlan_vdev_mlme_get_opmode(vdev);
358 	struct cm_req *cm_req;
359 	struct cnx_mgr *cm_ctx;
360 
361 	if (op_mode != QDF_STA_MODE && op_mode != QDF_P2P_CLIENT_MODE) {
362 		mlme_err("vdev %d Invalid mode %d",
363 			 wlan_vdev_get_id(vdev), op_mode);
364 		return NULL;
365 	}
366 
367 	cm_ctx = cm_get_cm_ctx(vdev);
368 	if (!cm_ctx)
369 		return NULL;
370 	cm_req = cm_get_req_by_cm_id(cm_ctx, cm_id);
371 	if (!cm_req)
372 		return NULL;
373 
374 	if (cm_req->connect_req.cur_candidate &&
375 	    cm_req->connect_req.cur_candidate->entry)
376 		return &cm_req->connect_req.cur_candidate->entry->rnr;
377 
378 	return NULL;
379 }
380 
381 QDF_STATUS
382 wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev *vdev,
383 				 struct wlan_cm_vdev_discon_req *req)
384 {
385 	return cm_handle_rso_stop_rsp(vdev, req);
386 }
387 
388 #ifdef WLAN_FEATURE_11BE
389 QDF_STATUS wlan_cm_sta_set_chan_param(struct wlan_objmgr_vdev *vdev,
390 				      qdf_freq_t ch_freq,
391 				      enum phy_ch_width ori_bw,
392 				      uint16_t ori_punc,
393 				      uint8_t ccfs0, uint8_t ccfs1,
394 				      struct ch_params *chan_param)
395 {
396 	uint16_t primary_puncture_bitmap = 0;
397 	struct wlan_objmgr_pdev *pdev;
398 	struct reg_channel_list chan_list;
399 	qdf_freq_t sec_ch_2g_freq = 0;
400 	qdf_freq_t center_freq_320 = 0;
401 	qdf_freq_t center_freq_40 = 0;
402 	uint8_t band_mask;
403 	uint16_t new_punc;
404 
405 	if (!vdev || !chan_param) {
406 		mlme_err("invalid input parameters");
407 		return QDF_STATUS_E_INVAL;
408 	}
409 	pdev = wlan_vdev_get_pdev(vdev);
410 	if (!pdev) {
411 		mlme_err("invalid pdev");
412 		return QDF_STATUS_E_INVAL;
413 	}
414 	if (ori_bw == CH_WIDTH_320MHZ) {
415 		if (WLAN_REG_IS_6GHZ_CHAN_FREQ(ch_freq))
416 			band_mask = BIT(REG_BAND_6G);
417 		else
418 			band_mask = BIT(REG_BAND_5G);
419 		center_freq_320 = wlan_reg_chan_band_to_freq(pdev, ccfs1,
420 							     band_mask);
421 	} else if (ori_bw == CH_WIDTH_40MHZ) {
422 		if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq)) {
423 			band_mask = BIT(REG_BAND_2G);
424 			center_freq_40 = wlan_reg_chan_band_to_freq(pdev,
425 								    ccfs0,
426 								    band_mask);
427 			if (center_freq_40 == ch_freq + BW_10_MHZ)
428 				sec_ch_2g_freq = ch_freq + BW_20_MHZ;
429 			if (center_freq_40 == ch_freq - BW_10_MHZ)
430 				sec_ch_2g_freq = ch_freq - BW_20_MHZ;
431 		}
432 	}
433 	wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc,
434 					ch_freq,
435 					center_freq_320,
436 					CH_WIDTH_20MHZ,
437 					&primary_puncture_bitmap);
438 	if (primary_puncture_bitmap) {
439 		mlme_err("sta vdev %d freq %d RX bw %d puncture 0x%x primary chan is punctured",
440 			 wlan_vdev_get_id(vdev), ch_freq,
441 			 ori_bw, ori_punc);
442 		return QDF_STATUS_E_FAULT;
443 	}
444 	if (chan_param->ch_width != CH_WIDTH_320MHZ)
445 		center_freq_320 = 0;
446 	qdf_mem_zero(&chan_list, sizeof(chan_list));
447 	wlan_reg_fill_channel_list_for_pwrmode(pdev, ch_freq,
448 					       sec_ch_2g_freq,
449 					       chan_param->ch_width,
450 					       center_freq_320, &chan_list,
451 					       REG_CURRENT_PWR_MODE, true);
452 	*chan_param = chan_list.chan_param[0];
453 	if (chan_param->ch_width == ori_bw)
454 		new_punc = ori_punc;
455 	else
456 		wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc,
457 						ch_freq,
458 						chan_param->mhz_freq_seg1,
459 						chan_param->ch_width,
460 						&new_punc);
461 
462 	chan_param->reg_punc_bitmap = new_punc;
463 
464 	return QDF_STATUS_SUCCESS;
465 }
466 
467 QDF_STATUS wlan_cm_sta_update_bw_puncture(struct wlan_objmgr_vdev *vdev,
468 					  uint8_t *peer_mac,
469 					  uint16_t ori_punc,
470 					  enum phy_ch_width ori_bw,
471 					  uint8_t ccfs0, uint8_t ccfs1,
472 					  enum phy_ch_width new_bw)
473 {
474 	struct wlan_channel *des_chan;
475 	struct ch_params ch_param;
476 	uint32_t bw_puncture = 0;
477 	QDF_STATUS status = QDF_STATUS_E_INVAL;
478 
479 	if (!vdev || !peer_mac) {
480 		mlme_err("invalid input parameters");
481 		return status;
482 	}
483 	des_chan = wlan_vdev_mlme_get_des_chan(vdev);
484 	if (!des_chan) {
485 		mlme_err("invalid des chan");
486 		return status;
487 	}
488 	qdf_mem_zero(&ch_param, sizeof(ch_param));
489 	ch_param.ch_width = new_bw;
490 	status = wlan_cm_sta_set_chan_param(vdev, des_chan->ch_freq,
491 					    ori_bw, ori_punc, ccfs0,
492 					    ccfs1, &ch_param);
493 	if (QDF_IS_STATUS_ERROR(status))
494 		return status;
495 
496 	if (des_chan->puncture_bitmap == ch_param.reg_punc_bitmap &&
497 	    des_chan->ch_width == ch_param.ch_width)
498 		return status;
499 
500 	des_chan->ch_freq_seg1 = ch_param.center_freq_seg0;
501 	des_chan->ch_freq_seg2 = ch_param.center_freq_seg1;
502 	des_chan->ch_cfreq1 = ch_param.mhz_freq_seg0;
503 	des_chan->ch_cfreq2 = ch_param.mhz_freq_seg1;
504 	des_chan->puncture_bitmap = ch_param.reg_punc_bitmap;
505 	des_chan->ch_width = ch_param.ch_width;
506 	mlme_debug("sta vdev %d freq %d bw %d puncture 0x%x ch_cfreq1 %d ch_cfreq2 %d",
507 		   wlan_vdev_get_id(vdev), des_chan->ch_freq,
508 		   des_chan->ch_width, des_chan->puncture_bitmap,
509 		   des_chan->ch_cfreq1, des_chan->ch_cfreq2);
510 	QDF_SET_BITS(bw_puncture, 0, 8, des_chan->ch_width);
511 	QDF_SET_BITS(bw_puncture, 8, 16, des_chan->puncture_bitmap);
512 	return wlan_util_vdev_peer_set_param_send(vdev, peer_mac,
513 						  WLAN_MLME_PEER_BW_PUNCTURE,
514 						  bw_puncture);
515 }
516 #endif /* WLAN_FEATURE_11BE */
517 
518 #ifdef WLAN_FEATURE_11BE_MLO
519 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
520 bool
521 wlan_cm_check_mlo_roam_auth_status(struct wlan_objmgr_vdev *vdev)
522 {
523 	return mlo_roam_is_auth_status_connected(wlan_vdev_get_psoc(vdev),
524 					  wlan_vdev_get_id(vdev));
525 }
526 #endif
527 #endif
528