diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index ab979b7d3ac1..0bc87ae0ae5d 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1522,7 +1522,7 @@ struct wlan_mlme_lfr_cfg { uint32_t max_num_pre_auth; uint32_t roam_preauth_retry_count; uint32_t roam_preauth_no_ack_timeout; - uint32_t roam_rssi_diff; + uint8_t roam_rssi_diff; bool roam_scan_offload_enabled; uint32_t neighbor_scan_timer_period; uint32_t neighbor_scan_min_timer_period; diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index 223aef2b1672..dde16c4b55a9 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -3903,15 +3903,21 @@ static int drv_cmd_get_roam_delta(struct hdd_adapter *adapter, struct hdd_priv_data *priv_data) { int ret = 0; - uint8_t rssi_diff = - sme_get_roam_rssi_diff(hdd_ctx->mac_handle); + uint8_t rssi_diff; char extra[32]; uint8_t len; + QDF_STATUS status; + + status = sme_get_roam_rssi_diff(hdd_ctx->mac_handle, adapter->vdev_id, + &rssi_diff); + if (QDF_IS_STATUS_ERROR(status)) + return qdf_status_to_os_return(status); + + hdd_debug("vdev_id: %u, rssi_diff: %u", adapter->vdev_id, rssi_diff); qdf_mtrace(QDF_MODULE_ID_HDD, QDF_MODULE_ID_HDD, TRACE_CODE_HDD_GETROAMDELTA_IOCTL, adapter->vdev_id, rssi_diff); - len = scnprintf(extra, sizeof(extra), "%s %d", command, rssi_diff); len = QDF_MIN(priv_data->total_len, len + 1); diff --git a/core/sme/inc/csr_neighbor_roam.h b/core/sme/inc/csr_neighbor_roam.h index 4f7a5cedc87e..9432f1743643 100644 --- a/core/sme/inc/csr_neighbor_roam.h +++ b/core/sme/inc/csr_neighbor_roam.h @@ -66,6 +66,7 @@ typedef struct sCsrNeighborRoamCfgParams { tCsrChannelInfo pref_chan_info; uint32_t full_roam_scan_period; bool enable_scoring_for_roam; + uint8_t roam_rssi_diff; } tCsrNeighborRoamCfgParams, *tpCsrNeighborRoamCfgParams; #define CSR_NEIGHBOR_ROAM_INVALID_CHANNEL_INDEX 255 diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 31943dd09d41..a743dcaec2d5 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -773,8 +773,18 @@ QDF_STATUS sme_update_roam_scan_home_away_time(mac_handle_t mac_handle, bool sme_get_roam_intra_band(mac_handle_t mac_handle); uint8_t sme_get_roam_scan_n_probes(mac_handle_t mac_handle); uint16_t sme_get_roam_scan_home_away_time(mac_handle_t mac_handle); -QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t sessionId, - uint8_t RoamRssiDiff); + +/** + * sme_update_roam_rssi_diff() - Update RoamRssiDiff + * @mac_handle: Opaque handle to the global MAC context + * @vdev_id: vdev identifier + * @roam_rssi_diff: Minimum rssi difference between potential candidate and + * current AP. + * + * Return: QDF_STATUS + */ +QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t vdev_id, + uint8_t roam_rssi_diff); QDF_STATUS sme_update_wes_mode(mac_handle_t mac_handle, bool isWESModeEnabled, uint8_t sessionId); QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId, @@ -919,7 +929,17 @@ QDF_STATUS sme_set_roam_bmiss_first_bcnt(mac_handle_t mac_handle, QDF_STATUS sme_set_roam_bmiss_final_bcnt(mac_handle_t mac_handle, uint8_t sessionId, const uint8_t nRoamBmissFinalBcnt); -uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle); +/** + * sme_get_roam_rssi_diff() - get Roam rssi diff + * @mac_handle: The handle returned by mac_open + * @vdev_id: vdev identifier + * @rssi_diff: Buffer to fill the roam RSSI diff. + * Valid only if the return status is success. + * + * Return: QDF_STATUS + */ +QDF_STATUS sme_get_roam_rssi_diff(mac_handle_t mac_handle, uint8_t vdev_id, + uint8_t *rssi_diff); QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle, uint8_t sessionId, uint8_t *pChannelList, diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 7af153226a49..6cec80d5d2b4 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -5884,51 +5884,35 @@ uint16_t sme_get_roam_scan_home_away_time(mac_handle_t mac_handle) return mac->mlme_cfg->lfr.roam_scan_home_away_time; } -/* - * sme_update_roam_rssi_diff() - - * Update RoamRssiDiff - * This function is called through dynamic setConfig callback function - * to configure RoamRssiDiff - * Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125] - * - * mac_handle: Opaque handle to the global MAC context - * sessionId - Session Identifier - * RoamRssiDiff - minimum rssi difference between potential - * candidate and current AP. - * Return Success or failure - */ - -QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t sessionId, - uint8_t RoamRssiDiff) +QDF_STATUS sme_update_roam_rssi_diff(mac_handle_t mac_handle, uint8_t vdev_id, + uint8_t roam_rssi_diff) { struct mac_context *mac = MAC_CONTEXT(mac_handle); - QDF_STATUS status = QDF_STATUS_SUCCESS; + QDF_STATUS status; + tCsrNeighborRoamControlInfo *neighbor_roam_info; - if (sessionId >= WLAN_MAX_VDEVS) { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, - FL("Invalid sme session id: %d"), sessionId); + if (vdev_id >= WLAN_MAX_VDEVS) { + sme_err("Invalid sme vdev id: %d", vdev_id); return QDF_STATUS_E_INVAL; } status = sme_acquire_global_lock(&mac->sme); - if (QDF_IS_STATUS_SUCCESS(status)) { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, - "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s", - RoamRssiDiff, - mac->mlme_cfg->lfr.roam_rssi_diff, - mac_trace_get_neighbour_roam_state(mac->roam. - neighborRoamInfo - [sessionId]. - neighborRoamState)); - mac->mlme_cfg->lfr.roam_rssi_diff = RoamRssiDiff; + if (QDF_IS_STATUS_ERROR(status)) + return status; + neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id]; + sme_debug("LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %s", + roam_rssi_diff, + neighbor_roam_info->cfgParams.roam_rssi_diff, + mac_trace_get_neighbour_roam_state( + neighbor_roam_info->neighborRoamState)); - if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) - csr_roam_offload_scan(mac, sessionId, - ROAM_SCAN_OFFLOAD_UPDATE_CFG, - REASON_RSSI_DIFF_CHANGED); + neighbor_roam_info->cfgParams.roam_rssi_diff = roam_rssi_diff; + if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) + csr_roam_offload_scan(mac, vdev_id, + ROAM_SCAN_OFFLOAD_UPDATE_CFG, + REASON_RSSI_DIFF_CHANGED); - sme_release_global_lock(&mac->sme); - } + sme_release_global_lock(&mac->sme); return status; } @@ -7300,18 +7284,25 @@ uint16_t sme_get_neighbor_scan_period(mac_handle_t mac_handle, neighborScanPeriod; } -/* - * sme_get_roam_rssi_diff() - get Roam rssi diff - * This is a synchronous call - * - * mac_handle - The handle returned by mac_open. - * Return uint16_t - Rssi diff value - */ -uint8_t sme_get_roam_rssi_diff(mac_handle_t mac_handle) +QDF_STATUS sme_get_roam_rssi_diff(mac_handle_t mac_handle, uint8_t vdev_id, + uint8_t *rssi_diff) { struct mac_context *mac = MAC_CONTEXT(mac_handle); + tCsrNeighborRoamControlInfo *neighbor_roam_info; + QDF_STATUS status; - return mac->mlme_cfg->lfr.roam_rssi_diff; + if (vdev_id >= WLAN_MAX_VDEVS) { + sme_err("Invalid vdev_id: %d", vdev_id); + return QDF_STATUS_E_INVAL; + } + status = sme_acquire_global_lock(&mac->sme); + if (QDF_IS_STATUS_ERROR(status)) + return status; + neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id]; + *rssi_diff = neighbor_roam_info->cfgParams.roam_rssi_diff; + sme_release_global_lock(&mac->sme); + + return QDF_STATUS_SUCCESS; } void sme_dump_freq_list(tCsrChannelInfo *chan_info) diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 29dad643d7a8..36199af98736 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -18165,7 +18165,7 @@ csr_create_roam_scan_offload_request(struct mac_context *mac_ctx, roam_info->cfgParams.nOpportunisticThresholdDiff; req_buf->RoamRescanRssiDiff = roam_info->cfgParams.nRoamRescanRssiDiff; - req_buf->RoamRssiDiff = mac_ctx->mlme_cfg->lfr.roam_rssi_diff; + req_buf->RoamRssiDiff = roam_info->cfgParams.roam_rssi_diff; req_buf->rssi_abs_thresh = mac_ctx->mlme_cfg->lfr.roam_rssi_abs_threshold; req_buf->reason = reason; diff --git a/core/sme/src/csr/csr_neighbor_roam.c b/core/sme/src/csr/csr_neighbor_roam.c index 58f137219f83..ab9becb24bc2 100644 --- a/core/sme/src/csr/csr_neighbor_roam.c +++ b/core/sme/src/csr/csr_neighbor_roam.c @@ -1279,6 +1279,8 @@ QDF_STATUS csr_neighbor_roam_init(struct mac_context *mac, uint8_t sessionId) mac->mlme_cfg->lfr.roam_scan_hi_rssi_delay; pNeighborRoamInfo->cfgParams.hi_rssi_scan_rssi_ub = mac->mlme_cfg->lfr.roam_scan_hi_rssi_ub; + pNeighborRoamInfo->cfgParams.roam_rssi_diff = + mac->mlme_cfg->lfr.roam_rssi_diff; qdf_zero_macaddr(&pNeighborRoamInfo->currAPbssid); pNeighborRoamInfo->currentNeighborLookupThreshold =