1 /*
2 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-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_roam_ucfg_api.c
20 *
21 * Implementation for roaming ucfg public functionality.
22 */
23
24 #include "wlan_mlme_ucfg_api.h"
25 #include "wlan_cm_roam_ucfg_api.h"
26 #include "../../core/src/wlan_cm_roam_offload.h"
27 #include "wlan_reg_ucfg_api.h"
28 #include "wlan_mlo_mgr_sta.h"
29
ucfg_is_rso_enabled(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)30 bool ucfg_is_rso_enabled(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
31 {
32 return wlan_is_rso_enabled(pdev, vdev_id);
33 }
34
35 QDF_STATUS
ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,const bool is_fast_roam_enabled)36 ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev,
37 uint8_t vdev_id,
38 const bool is_fast_roam_enabled)
39 {
40 bool supplicant_disabled_roaming;
41 struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
42 QDF_STATUS status;
43 bool lfr_enabled;
44 enum roam_offload_state state;
45 uint32_t set_val = 0;
46 enum roam_offload_state cur_state;
47
48 /*
49 * If the ini "FastRoamEnabled" is disabled, don't allow the
50 * userspace to enable roam offload
51 */
52 ucfg_mlme_is_lfr_enabled(psoc, &lfr_enabled);
53 if (!lfr_enabled) {
54 mlme_debug("ROAM_CONFIG: Fast roam ini is disabled. is_fast_roam_enabled %d",
55 is_fast_roam_enabled);
56 if (!is_fast_roam_enabled)
57 return QDF_STATUS_SUCCESS;
58
59 return QDF_STATUS_E_FAILURE;
60 }
61
62 cur_state = mlme_get_roam_state(psoc, vdev_id);
63 if (cur_state == WLAN_ROAM_INIT) {
64 if (!is_fast_roam_enabled)
65 set_val =
66 WMI_VDEV_ROAM_11KV_CTRL_DISABLE_FW_TRIGGER_ROAMING;
67
68 status = cm_roam_send_disable_config(psoc, vdev_id, set_val);
69 if (!QDF_IS_STATUS_SUCCESS(status))
70 mlme_err("ROAM: update fast roaming failed, status: %d",
71 status);
72 }
73 wlan_mlme_set_usr_disabled_roaming(psoc, !is_fast_roam_enabled);
74
75 /*
76 * Supplicant_disabled_roaming flag is only effective for current
77 * connection, it will be cleared during new connection.
78 * is_fast_roam_enabled: true - enable RSO if not disabled by driver
79 * false - Disable RSO. Send RSO stop if false
80 * is set.
81 */
82 supplicant_disabled_roaming =
83 mlme_get_supplicant_disabled_roaming(psoc, vdev_id);
84 if (!is_fast_roam_enabled && supplicant_disabled_roaming) {
85 mlme_debug("ROAM_CONFIG: RSO already disabled by supplicant");
86 return QDF_STATUS_E_ALREADY;
87 }
88
89 mlme_set_supplicant_disabled_roaming(psoc, vdev_id,
90 !is_fast_roam_enabled);
91
92 /* For mlo connection, before all links are up
93 * supplicant can enable roaming, to handle this
94 * drop the enable rso as host will enable roaming
95 * once all links are up
96 */
97 if (mlo_is_ml_connection_in_progress(psoc, vdev_id)) {
98 mlme_debug("mlo connection in progress");
99 return QDF_STATUS_SUCCESS;
100 }
101
102 state = (is_fast_roam_enabled) ?
103 WLAN_ROAM_RSO_ENABLED : WLAN_ROAM_RSO_STOPPED;
104 status = cm_roam_state_change(pdev, vdev_id, state,
105 REASON_SUPPLICANT_DISABLED_ROAMING,
106 NULL, false);
107
108 return status;
109 }
110
111 void
ucfg_clear_user_disabled_roaming(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)112 ucfg_clear_user_disabled_roaming(struct wlan_objmgr_psoc *psoc,
113 uint8_t vdev_id)
114 {
115 wlan_mlme_set_usr_disabled_roaming(psoc, false);
116 mlme_set_supplicant_disabled_roaming(psoc, vdev_id, false);
117 }
118
ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)119 QDF_STATUS ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev *pdev,
120 uint8_t vdev_id)
121 {
122 QDF_STATUS status;
123 struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
124 bool roam_scan_offload_enabled;
125
126 ucfg_mlme_is_roam_scan_offload_enabled(psoc,
127 &roam_scan_offload_enabled);
128 if (!roam_scan_offload_enabled)
129 return QDF_STATUS_SUCCESS;
130
131 status = cm_roam_send_rso_cmd(psoc, vdev_id,
132 ROAM_SCAN_OFFLOAD_ABORT_SCAN,
133 REASON_ROAM_ABORT_ROAM_SCAN);
134
135 return status;
136 }
137
ucfg_cm_get_roam_band(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint32_t * roam_band)138 QDF_STATUS ucfg_cm_get_roam_band(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
139 uint32_t *roam_band)
140 {
141 struct cm_roam_values_copy temp;
142
143 wlan_cm_roam_cfg_get_value(psoc, vdev_id, ROAM_BAND, &temp);
144
145 *roam_band = temp.uint_value;
146
147 return QDF_STATUS_SUCCESS;
148 }
149
150 #ifdef FEATURE_WLAN_ESE
ucfg_cm_set_ese_roam_scan_channel_list(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,qdf_freq_t * chan_freq_list,uint8_t num_chan)151 QDF_STATUS ucfg_cm_set_ese_roam_scan_channel_list(struct wlan_objmgr_pdev *pdev,
152 uint8_t vdev_id,
153 qdf_freq_t *chan_freq_list,
154 uint8_t num_chan)
155 {
156 QDF_STATUS status = QDF_STATUS_SUCCESS;
157 enum band_info band = -1;
158 uint32_t band_bitmap;
159 struct wlan_objmgr_vdev *vdev;
160 struct rso_config *rso_cfg;
161 struct wlan_objmgr_psoc *psoc;
162 struct wlan_mlme_psoc_ext_obj *mlme_obj;
163
164 psoc = wlan_pdev_get_psoc(pdev);
165 if (!psoc)
166 return QDF_STATUS_E_INVAL;
167
168 mlme_obj = mlme_get_psoc_ext_obj(psoc);
169 if (!mlme_obj)
170 return QDF_STATUS_E_INVAL;
171
172 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
173 WLAN_MLME_CM_ID);
174 if (!vdev) {
175 mlme_err("vdev object is NULL");
176 return QDF_STATUS_E_INVAL;
177 }
178 status = cm_roam_acquire_lock(vdev);
179 if (QDF_IS_STATUS_ERROR(status))
180 goto release_ref;
181
182 rso_cfg = wlan_cm_get_rso_config(vdev);
183 if (!rso_cfg) {
184 status = QDF_STATUS_E_FAILURE;
185 goto error;
186 }
187
188 mlme_debug("Chan list Before");
189 cm_dump_freq_list(&rso_cfg->roam_scan_freq_lst);
190 ucfg_reg_get_band(pdev, &band_bitmap);
191 band = wlan_reg_band_bitmap_to_band_info(band_bitmap);
192 status = cm_create_roam_scan_channel_list(pdev, rso_cfg, num_chan,
193 chan_freq_list, num_chan,
194 band);
195 if (QDF_IS_STATUS_SUCCESS(status)) {
196 mlme_debug("Chan list After");
197 cm_dump_freq_list(&rso_cfg->roam_scan_freq_lst);
198 }
199
200 if (mlme_obj->cfg.lfr.roam_scan_offload_enabled)
201 wlan_roam_update_cfg(psoc, vdev_id,
202 REASON_CHANNEL_LIST_CHANGED);
203
204
205 error:
206 cm_roam_release_lock(vdev);
207 release_ref:
208 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
209
210 return status;
211 }
212
ucfg_cm_set_cckm_ie(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,const uint8_t * cck_ie,const uint8_t cck_ie_len)213 QDF_STATUS ucfg_cm_set_cckm_ie(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
214 const uint8_t *cck_ie, const uint8_t cck_ie_len)
215 {
216 struct wlan_objmgr_vdev *vdev;
217 struct mlme_legacy_priv *mlme_priv;
218
219 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
220 WLAN_MLME_CM_ID);
221
222 if (!vdev) {
223 mlme_err("vdev not found for id %d", vdev_id);
224 return QDF_STATUS_E_FAILURE;
225 }
226
227 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
228 if (!mlme_priv) {
229 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
230 return QDF_STATUS_E_FAILURE;
231 }
232 qdf_mem_copy(mlme_priv->connect_info.cckm_ie, cck_ie, cck_ie_len);
233 mlme_priv->connect_info.cckm_ie_len = cck_ie_len;
234 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
235
236 return QDF_STATUS_SUCCESS;
237 }
238
239 #endif
240
241 #ifdef WLAN_FEATURE_FILS_SK
242 QDF_STATUS
ucfg_cm_update_fils_config(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,struct wlan_fils_con_info * fils_info)243 ucfg_cm_update_fils_config(struct wlan_objmgr_psoc *psoc,
244 uint8_t vdev_id,
245 struct wlan_fils_con_info *fils_info)
246 {
247 QDF_STATUS status;
248 struct wlan_objmgr_vdev *vdev;
249
250 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
251 WLAN_MLME_NB_ID);
252 if (!vdev) {
253 mlme_err("vdev object is NULL");
254 return QDF_STATUS_E_INVAL;
255 }
256
257 status = wlan_cm_update_mlme_fils_info(vdev, fils_info);
258 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
259
260 return status;
261 }
262 #endif
263
264 QDF_STATUS
ucfg_wlan_cm_roam_invoke(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,struct qdf_mac_addr * bssid,qdf_freq_t ch_freq,enum wlan_cm_source source)265 ucfg_wlan_cm_roam_invoke(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
266 struct qdf_mac_addr *bssid, qdf_freq_t ch_freq,
267 enum wlan_cm_source source)
268 {
269 return wlan_cm_roam_invoke(pdev, vdev_id, bssid, ch_freq, source);
270 }
271
272 #ifdef WLAN_FEATURE_HOST_ROAM
ucfg_cm_set_ft_pre_auth_state(struct wlan_objmgr_vdev * vdev,bool state)273 void ucfg_cm_set_ft_pre_auth_state(struct wlan_objmgr_vdev *vdev, bool state)
274 {
275 struct mlme_legacy_priv *mlme_priv;
276
277 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
278 if (!mlme_priv)
279 return;
280
281 mlme_priv->connect_info.ft_info.set_ft_preauth_state = state;
282 }
283
ucfg_cm_get_ft_pre_auth_state(struct wlan_objmgr_vdev * vdev)284 static bool ucfg_cm_get_ft_pre_auth_state(struct wlan_objmgr_vdev *vdev)
285 {
286 struct mlme_legacy_priv *mlme_priv;
287
288 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
289 if (!mlme_priv)
290 return false;
291
292 return mlme_priv->connect_info.ft_info.set_ft_preauth_state;
293 }
294
ucfg_cm_set_ft_ies(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,const uint8_t * ft_ies,uint16_t ft_ies_length)295 void ucfg_cm_set_ft_ies(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
296 const uint8_t *ft_ies, uint16_t ft_ies_length)
297 {
298 QDF_STATUS status = QDF_STATUS_E_FAILURE;
299 struct wlan_objmgr_vdev *vdev;
300 struct mlme_legacy_priv *mlme_priv;
301
302 if (!ft_ies) {
303 mlme_err("ft ies is NULL");
304 return;
305 }
306
307 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
308 WLAN_MLME_CM_ID);
309 if (!vdev)
310 return;
311
312 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
313 if (!mlme_priv)
314 goto end;
315
316 status = cm_roam_acquire_lock(vdev);
317 if (QDF_IS_STATUS_ERROR(status))
318 goto end;
319
320 mlme_debug("FT IEs Req is received in state %d",
321 mlme_priv->connect_info.ft_info.ft_state);
322
323 /* Global Station FT State */
324 switch (mlme_priv->connect_info.ft_info.ft_state) {
325 case FT_START_READY:
326 case FT_AUTH_REQ_READY:
327 mlme_debug("ft_ies_length: %d", ft_ies_length);
328 ft_ies_length = QDF_MIN(ft_ies_length, MAX_FTIE_SIZE);
329 mlme_priv->connect_info.ft_info.auth_ie_len = ft_ies_length;
330 qdf_mem_copy(mlme_priv->connect_info.ft_info.auth_ft_ie,
331 ft_ies, ft_ies_length);
332 mlme_priv->connect_info.ft_info.ft_state = FT_AUTH_REQ_READY;
333 break;
334
335 case FT_REASSOC_REQ_WAIT:
336 /*
337 * We are done with pre-auth, hence now waiting for
338 * reassoc req. This is the new FT Roaming in place At
339 * this juncture we'r ready to start sending Reassoc req
340 */
341
342 ft_ies_length = QDF_MIN(ft_ies_length, MAX_FTIE_SIZE);
343
344 mlme_debug("New Reassoc Req: %pK in state %d",
345 ft_ies, mlme_priv->connect_info.ft_info.ft_state);
346 mlme_priv->connect_info.ft_info.reassoc_ie_len =
347 ft_ies_length;
348 qdf_mem_copy(mlme_priv->connect_info.ft_info.reassoc_ft_ie,
349 ft_ies, ft_ies_length);
350
351 mlme_priv->connect_info.ft_info.ft_state = FT_SET_KEY_WAIT;
352 mlme_debug("ft_ies_length: %d state: %d", ft_ies_length,
353 mlme_priv->connect_info.ft_info.ft_state);
354 break;
355
356 default:
357 mlme_warn("Unhandled state: %d",
358 mlme_priv->connect_info.ft_info.ft_state);
359 break;
360 }
361 cm_roam_release_lock(vdev);
362 end:
363 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
364 }
365
ucfg_cm_check_ft_status(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)366 QDF_STATUS ucfg_cm_check_ft_status(struct wlan_objmgr_pdev *pdev,
367 uint8_t vdev_id)
368 {
369 QDF_STATUS status = QDF_STATUS_E_FAILURE;
370 struct wlan_objmgr_vdev *vdev;
371 struct mlme_legacy_priv *mlme_priv;
372
373 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
374 WLAN_MLME_CM_ID);
375 if (!vdev)
376 return status;
377
378 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
379 if (!mlme_priv)
380 goto end;
381
382 status = cm_roam_acquire_lock(vdev);
383 if (QDF_IS_STATUS_ERROR(status))
384 goto end;
385
386 mlme_debug("FT update key is received in state %d",
387 mlme_priv->connect_info.ft_info.ft_state);
388
389 /* Global Station FT State */
390 switch (mlme_priv->connect_info.ft_info.ft_state) {
391 case FT_SET_KEY_WAIT:
392 if (ucfg_cm_get_ft_pre_auth_state(vdev)) {
393 mlme_priv->connect_info.ft_info.ft_state = FT_START_READY;
394 mlme_debug("state changed to %d",
395 mlme_priv->connect_info.ft_info.ft_state);
396 break;
397 }
398 fallthrough;
399 default:
400 mlme_debug("Unhandled state:%d",
401 mlme_priv->connect_info.ft_info.ft_state);
402 status = QDF_STATUS_E_FAILURE;
403 break;
404 }
405 cm_roam_release_lock(vdev);
406 end:
407 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
408
409 return status;
410 }
411
ucfg_cm_ft_key_ready_for_install(struct wlan_objmgr_vdev * vdev)412 bool ucfg_cm_ft_key_ready_for_install(struct wlan_objmgr_vdev *vdev)
413 {
414 bool ret = false;
415 struct mlme_legacy_priv *mlme_priv;
416
417 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
418 if (!mlme_priv)
419 return ret;
420
421 if (ucfg_cm_get_ft_pre_auth_state(vdev) &&
422 mlme_priv->connect_info.ft_info.ft_state == FT_START_READY) {
423 ret = true;
424 ucfg_cm_set_ft_pre_auth_state(vdev, false);
425 }
426
427 return ret;
428 }
429
ucfg_cm_ft_reset(struct wlan_objmgr_vdev * vdev)430 void ucfg_cm_ft_reset(struct wlan_objmgr_vdev *vdev)
431 {
432 struct mlme_legacy_priv *mlme_priv;
433
434 mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
435 if (!mlme_priv)
436 return;
437
438 qdf_mem_zero(&mlme_priv->connect_info.ft_info,
439 sizeof(struct ft_context));
440
441 mlme_priv->connect_info.ft_info.ft_state = FT_START_READY;
442 }
443 #endif /* WLAN_FEATURE_HOST_ROAM */
444
445 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
446 #ifdef FEATURE_WLAN_ESE
447 static void
ucfg_cm_reset_esecckm_info(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)448 ucfg_cm_reset_esecckm_info(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
449 {
450 struct wlan_objmgr_vdev *vdev;
451 struct rso_config *rso_cfg;
452
453 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
454 WLAN_MLME_CM_ID);
455 if (!vdev) {
456 mlme_err("vdev object is NULL for vdev %d", vdev_id);
457 return;
458 }
459 rso_cfg = wlan_cm_get_rso_config(vdev);
460 if (!rso_cfg) {
461 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
462 return;
463 }
464
465 qdf_mem_zero(rso_cfg->krk, WMI_KRK_KEY_LEN);
466 qdf_mem_zero(rso_cfg->btk, WMI_BTK_KEY_LEN);
467 rso_cfg->is_ese_assoc = false;
468 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
469
470 }
471 #else
472 static inline
ucfg_cm_reset_esecckm_info(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)473 void ucfg_cm_reset_esecckm_info(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
474 {
475 }
476 #endif
477
ucfg_cm_reset_key(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)478 void ucfg_cm_reset_key(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
479 {
480 wlan_cm_set_psk_pmk(pdev, vdev_id, NULL, 0);
481 ucfg_cm_reset_esecckm_info(pdev, vdev_id);
482 }
483
484 QDF_STATUS
ucfg_cm_roam_send_rt_stats_config(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,uint8_t param_value)485 ucfg_cm_roam_send_rt_stats_config(struct wlan_objmgr_pdev *pdev,
486 uint8_t vdev_id, uint8_t param_value)
487 {
488 struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
489
490 return cm_roam_send_rt_stats_config(psoc, vdev_id, param_value);
491 }
492
493 QDF_STATUS
ucfg_cm_roam_send_ho_delay_config(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,uint16_t param_value)494 ucfg_cm_roam_send_ho_delay_config(struct wlan_objmgr_pdev *pdev,
495 uint8_t vdev_id, uint16_t param_value)
496 {
497 struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
498
499 return cm_roam_send_ho_delay_config(psoc, vdev_id, param_value);
500 }
501
502 QDF_STATUS
ucfg_cm_exclude_rm_partial_scan_freq(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,uint8_t param_value)503 ucfg_cm_exclude_rm_partial_scan_freq(struct wlan_objmgr_pdev *pdev,
504 uint8_t vdev_id, uint8_t param_value)
505 {
506 struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
507
508 return cm_exclude_rm_partial_scan_freq(psoc, vdev_id, param_value);
509 }
510
ucfg_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,uint8_t param_value)511 QDF_STATUS ucfg_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_pdev *pdev,
512 uint8_t vdev_id,
513 uint8_t param_value)
514 {
515 struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
516
517 return cm_roam_full_scan_6ghz_on_disc(psoc, vdev_id, param_value);
518 }
519 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
520 QDF_STATUS
ucfg_cm_roam_send_vendor_handoff_param_req(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint32_t param_id,void * vendor_handoff_context)521 ucfg_cm_roam_send_vendor_handoff_param_req(struct wlan_objmgr_psoc *psoc,
522 uint8_t vdev_id,
523 uint32_t param_id,
524 void *vendor_handoff_context)
525 {
526 return cm_roam_send_vendor_handoff_param_req(psoc, vdev_id, param_id,
527 vendor_handoff_context);
528 }
529
530 bool
ucfg_cm_roam_is_vendor_handoff_control_enable(struct wlan_objmgr_psoc * psoc)531 ucfg_cm_roam_is_vendor_handoff_control_enable(struct wlan_objmgr_psoc *psoc)
532 {
533 return cm_roam_is_vendor_handoff_control_enable(psoc);
534 }
535
536 #endif
537 #endif /* WLAN_FEATURE_ROAM_OFFLOAD */
538
539 QDF_STATUS
ucfg_cm_get_roam_intra_band(struct wlan_objmgr_psoc * psoc,uint16_t * val)540 ucfg_cm_get_roam_intra_band(struct wlan_objmgr_psoc *psoc, uint16_t *val)
541 {
542 struct wlan_mlme_psoc_ext_obj *mlme_obj;
543
544 mlme_obj = mlme_get_psoc_ext_obj(psoc);
545 if (!mlme_obj)
546 return QDF_STATUS_E_INVAL;
547
548 *val = mlme_obj->cfg.lfr.roam_intra_band;
549
550 return QDF_STATUS_SUCCESS;
551 }
552
553 QDF_STATUS
ucfg_cm_get_roam_rescan_rssi_diff(struct wlan_objmgr_psoc * psoc,uint8_t * val)554 ucfg_cm_get_roam_rescan_rssi_diff(struct wlan_objmgr_psoc *psoc, uint8_t *val)
555 {
556 struct wlan_mlme_psoc_ext_obj *mlme_obj;
557
558 mlme_obj = mlme_get_psoc_ext_obj(psoc);
559 if (!mlme_obj)
560 return QDF_STATUS_E_INVAL;
561
562 *val = mlme_obj->cfg.lfr.roam_rescan_rssi_diff;
563
564 return QDF_STATUS_SUCCESS;
565 }
566
567 QDF_STATUS
ucfg_cm_get_neighbor_lookup_rssi_threshold(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint8_t * lookup_threshold)568 ucfg_cm_get_neighbor_lookup_rssi_threshold(struct wlan_objmgr_psoc *psoc,
569 uint8_t vdev_id,
570 uint8_t *lookup_threshold)
571 {
572 struct cm_roam_values_copy temp;
573
574 wlan_cm_roam_cfg_get_value(psoc, vdev_id, NEXT_RSSI_THRESHOLD, &temp);
575 *lookup_threshold = temp.uint_value;
576
577 return QDF_STATUS_SUCCESS;
578 }
579
580 QDF_STATUS
ucfg_cm_get_empty_scan_refresh_period(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint16_t * refresh_threshold)581 ucfg_cm_get_empty_scan_refresh_period(struct wlan_objmgr_psoc *psoc,
582 uint8_t vdev_id,
583 uint16_t *refresh_threshold)
584 {
585 struct cm_roam_values_copy temp;
586
587 wlan_cm_roam_cfg_get_value(psoc, vdev_id,
588 EMPTY_SCAN_REFRESH_PERIOD, &temp);
589 *refresh_threshold = temp.uint_value;
590
591 return QDF_STATUS_SUCCESS;
592 }
593
594 uint16_t
ucfg_cm_get_neighbor_scan_min_chan_time(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)595 ucfg_cm_get_neighbor_scan_min_chan_time(struct wlan_objmgr_psoc *psoc,
596 uint8_t vdev_id)
597 {
598 struct cm_roam_values_copy temp;
599
600 wlan_cm_roam_cfg_get_value(psoc, vdev_id,
601 SCAN_MIN_CHAN_TIME, &temp);
602
603 return temp.uint_value;
604 }
605
606 QDF_STATUS
ucfg_cm_get_roam_rssi_diff(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint8_t * rssi_diff)607 ucfg_cm_get_roam_rssi_diff(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
608 uint8_t *rssi_diff)
609 {
610 struct cm_roam_values_copy temp;
611
612 wlan_cm_roam_cfg_get_value(psoc, vdev_id,
613 ROAM_RSSI_DIFF, &temp);
614 *rssi_diff = temp.uint_value;
615
616 return QDF_STATUS_SUCCESS;
617 }
618
619 #ifdef FEATURE_WLAN_ESE
ucfg_cm_get_is_ese_feature_enabled(struct wlan_objmgr_psoc * psoc)620 bool ucfg_cm_get_is_ese_feature_enabled(struct wlan_objmgr_psoc *psoc)
621 {
622 struct wlan_mlme_psoc_ext_obj *mlme_obj;
623
624 mlme_obj = mlme_get_psoc_ext_obj(psoc);
625 if (!mlme_obj)
626 return false;
627
628 return mlme_obj->cfg.lfr.ese_enabled;
629 }
630 #endif
631
632 uint16_t
ucfg_cm_get_neighbor_scan_max_chan_time(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)633 ucfg_cm_get_neighbor_scan_max_chan_time(struct wlan_objmgr_psoc *psoc,
634 uint8_t vdev_id)
635 {
636 struct cm_roam_values_copy temp;
637
638 wlan_cm_roam_cfg_get_value(psoc, vdev_id,
639 SCAN_MAX_CHAN_TIME, &temp);
640
641 return temp.uint_value;
642 }
643
644 uint16_t
ucfg_cm_get_neighbor_scan_period(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)645 ucfg_cm_get_neighbor_scan_period(struct wlan_objmgr_psoc *psoc,
646 uint8_t vdev_id)
647 {
648 struct cm_roam_values_copy temp;
649
650 wlan_cm_roam_cfg_get_value(psoc, vdev_id,
651 NEIGHBOR_SCAN_PERIOD, &temp);
652 return temp.uint_value;
653 }
654
ucfg_cm_get_wes_mode(struct wlan_objmgr_psoc * psoc)655 bool ucfg_cm_get_wes_mode(struct wlan_objmgr_psoc *psoc)
656 {
657 struct wlan_mlme_psoc_ext_obj *mlme_obj;
658
659 mlme_obj = mlme_get_psoc_ext_obj(psoc);
660 if (!mlme_obj)
661 return false;
662
663 return mlme_obj->cfg.lfr.wes_mode_enabled;
664 }
665
ucfg_cm_get_is_lfr_feature_enabled(struct wlan_objmgr_psoc * psoc)666 bool ucfg_cm_get_is_lfr_feature_enabled(struct wlan_objmgr_psoc *psoc)
667 {
668 struct wlan_mlme_psoc_ext_obj *mlme_obj;
669
670 mlme_obj = mlme_get_psoc_ext_obj(psoc);
671 if (!mlme_obj)
672 return false;
673
674 return mlme_obj->cfg.lfr.lfr_enabled;
675 }
676
ucfg_cm_get_is_ft_feature_enabled(struct wlan_objmgr_psoc * psoc)677 bool ucfg_cm_get_is_ft_feature_enabled(struct wlan_objmgr_psoc *psoc)
678 {
679 struct wlan_mlme_psoc_ext_obj *mlme_obj;
680
681 mlme_obj = mlme_get_psoc_ext_obj(psoc);
682 if (!mlme_obj)
683 return false;
684
685 return mlme_obj->cfg.lfr.fast_transition_enabled;
686 }
687
688 QDF_STATUS
ucfg_cm_get_roam_scan_home_away_time(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id,uint16_t * roam_scan_home_away_time)689 ucfg_cm_get_roam_scan_home_away_time(struct wlan_objmgr_psoc *psoc,
690 uint8_t vdev_id,
691 uint16_t *roam_scan_home_away_time)
692 {
693 struct cm_roam_values_copy temp;
694
695 wlan_cm_roam_cfg_get_value(psoc, vdev_id, SCAN_HOME_AWAY, &temp);
696
697 *roam_scan_home_away_time = temp.uint_value;
698
699 return QDF_STATUS_SUCCESS;
700 }
701
702 QDF_STATUS
ucfg_cm_get_roam_opportunistic_scan_threshold_diff(struct wlan_objmgr_psoc * psoc,int8_t * val)703 ucfg_cm_get_roam_opportunistic_scan_threshold_diff(
704 struct wlan_objmgr_psoc *psoc,
705 int8_t *val)
706 {
707 struct wlan_mlme_psoc_ext_obj *mlme_obj;
708
709 mlme_obj = mlme_get_psoc_ext_obj(psoc);
710 if (!mlme_obj)
711 return QDF_STATUS_E_INVAL;
712
713 *val = mlme_obj->cfg.lfr.opportunistic_scan_threshold_diff;
714
715 return QDF_STATUS_SUCCESS;
716 }
717
718 QDF_STATUS
ucfg_cm_get_neighbor_scan_refresh_period(struct wlan_objmgr_psoc * psoc,uint16_t * value)719 ucfg_cm_get_neighbor_scan_refresh_period(struct wlan_objmgr_psoc *psoc,
720 uint16_t *value)
721 {
722 struct wlan_mlme_psoc_ext_obj *mlme_obj;
723
724 mlme_obj = mlme_get_psoc_ext_obj(psoc);
725 if (!mlme_obj)
726 return QDF_STATUS_E_INVAL;
727
728 *value = mlme_obj->cfg.lfr.neighbor_scan_results_refresh_period;
729
730 return QDF_STATUS_SUCCESS;
731 }
732
733 QDF_STATUS
ucfg_cm_get_empty_scan_refresh_period_global(struct wlan_objmgr_psoc * psoc,uint16_t * roam_scan_period_global)734 ucfg_cm_get_empty_scan_refresh_period_global(struct wlan_objmgr_psoc *psoc,
735 uint16_t *roam_scan_period_global)
736 {
737 struct wlan_mlme_psoc_ext_obj *mlme_obj;
738
739 mlme_obj = mlme_get_psoc_ext_obj(psoc);
740 if (!mlme_obj)
741 return QDF_STATUS_E_INVAL;
742
743 *roam_scan_period_global =
744 mlme_obj->cfg.lfr.empty_scan_refresh_period;
745
746 return QDF_STATUS_SUCCESS;
747 }
748