|
@@ -1429,6 +1429,58 @@ static void cm_ho_fail_diag_event(void)
|
|
|
static inline void cm_ho_fail_diag_event(void) {}
|
|
|
#endif
|
|
|
|
|
|
+#ifdef WLAN_FEATURE_11BE_MLO
|
|
|
+static bool
|
|
|
+cm_ho_fail_is_avoid_list_candidate(struct wlan_objmgr_vdev *vdev,
|
|
|
+ struct cm_ho_fail_ind *ho_fail_ind)
|
|
|
+{
|
|
|
+ uint8_t link_info_iter = 0;
|
|
|
+ struct qdf_mac_addr peer_macaddr = {0};
|
|
|
+ struct mlo_link_info *mlo_link_info;
|
|
|
+ uint32_t akm;
|
|
|
+
|
|
|
+ if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
|
|
+ wlan_vdev_get_bss_peer_mac(vdev, &peer_macaddr);
|
|
|
+ akm = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
|
|
|
+ if (WLAN_CRYPTO_IS_WPA_WPA2(akm))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ if (qdf_is_macaddr_equal(&peer_macaddr, &ho_fail_ind->bssid))
|
|
|
+ return false;
|
|
|
+ else
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ mlo_link_info = &vdev->mlo_dev_ctx->link_ctx->links_info[0];
|
|
|
+ for (link_info_iter = 0; link_info_iter < WLAN_MAX_ML_BSS_LINKS;
|
|
|
+ link_info_iter++, mlo_link_info++) {
|
|
|
+ if (qdf_is_macaddr_equal(&mlo_link_info->ap_link_addr,
|
|
|
+ &ho_fail_ind->bssid))
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+#else
|
|
|
+static bool
|
|
|
+cm_ho_fail_is_avoid_list_candidate(struct wlan_objmgr_vdev *vdev,
|
|
|
+ struct cm_ho_fail_ind *ho_fail_ind)
|
|
|
+{
|
|
|
+ struct qdf_mac_addr peer_macaddr = {0};
|
|
|
+ uint32_t akm;
|
|
|
+
|
|
|
+ akm = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
|
|
|
+ if (WLAN_CRYPTO_IS_WPA_WPA2(akm))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ wlan_vdev_get_bss_peer_mac(vdev, &peer_macaddr);
|
|
|
+ if (qdf_is_macaddr_equal(&peer_macaddr, &ho_fail_ind->bssid))
|
|
|
+ return false;
|
|
|
+ else
|
|
|
+ return true;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static QDF_STATUS cm_handle_ho_fail(struct scheduler_msg *msg)
|
|
|
{
|
|
|
QDF_STATUS status;
|
|
@@ -1495,11 +1547,13 @@ static QDF_STATUS cm_handle_ho_fail(struct scheduler_msg *msg)
|
|
|
sizeof(wlan_cm_id), &cm_id);
|
|
|
|
|
|
qdf_mem_zero(&ap_info, sizeof(struct reject_ap_info));
|
|
|
- ap_info.bssid = ind->bssid;
|
|
|
- ap_info.reject_ap_type = DRIVER_AVOID_TYPE;
|
|
|
- ap_info.reject_reason = REASON_ROAM_HO_FAILURE;
|
|
|
- ap_info.source = ADDED_BY_DRIVER;
|
|
|
- wlan_dlm_add_bssid_to_reject_list(pdev, &ap_info);
|
|
|
+ if (cm_ho_fail_is_avoid_list_candidate(vdev, ind)) {
|
|
|
+ ap_info.bssid = ind->bssid;
|
|
|
+ ap_info.reject_ap_type = DRIVER_AVOID_TYPE;
|
|
|
+ ap_info.reject_reason = REASON_ROAM_HO_FAILURE;
|
|
|
+ ap_info.source = ADDED_BY_DRIVER;
|
|
|
+ wlan_dlm_add_bssid_to_reject_list(pdev, &ap_info);
|
|
|
+ }
|
|
|
|
|
|
cm_ho_fail_diag_event();
|
|
|
wlan_roam_debug_log(ind->vdev_id,
|