diff --git a/core/sme/src/rrm/sme_rrm.c b/core/sme/src/rrm/sme_rrm.c index 34b3110e599f..841b867d35d9 100644 --- a/core/sme/src/rrm/sme_rrm.c +++ b/core/sme/src/rrm/sme_rrm.c @@ -419,6 +419,8 @@ static QDF_STATUS sme_rrm_send_scan_result(tpAniSirGlobal mac_ctx, tpRrmSMEContext rrm_ctx = &mac_ctx->rrm.rrmSmeContext; uint32_t session_id; struct csr_roam_info *roam_info; + tSirScanType scan_type; + struct csr_roam_session *session; qdf_mem_zero(&filter, sizeof(filter)); qdf_mem_zero(scanresults_arr, @@ -515,12 +517,45 @@ static QDF_STATUS sme_rrm_send_scan_result(tpAniSirGlobal mac_ctx, goto rrm_send_scan_results_done; } + session = CSR_GET_SESSION(mac_ctx, session_id); + if ((!session) || (!csr_is_conn_state_connected_infra( + mac_ctx, session_id)) || + (NULL == session->pConnectBssDesc)) { + sme_err("Invaild session"); + status = QDF_STATUS_E_FAILURE; + goto rrm_send_scan_results_done; + } + + if (eRRM_MSG_SOURCE_ESE_UPLOAD == rrm_ctx->msgSource || + eRRM_MSG_SOURCE_LEGACY_ESE == rrm_ctx->msgSource) + scan_type = rrm_ctx->measMode[rrm_ctx->currentIndex]; + else + scan_type = rrm_ctx->measMode[0]; + while (scan_results) { + /* + * In passive scan, sta listens beacon. Connected AP beacon + * is offloaded to firmware. Firmware will discard + * connected AP beacon except that special IE exists. + * Connected AP beacon will not be sent to host. Hence, timer + * of connected AP in scan results is not updated and can + * not meet "pScanResult->timer >= RRM_scan_timer". + */ + uint8_t is_conn_bss_found = false; + + if ((scan_type == eSIR_PASSIVE_SCAN) && + (!qdf_mem_cmp(scan_results->BssDescriptor.bssId, + session->pConnectBssDesc->bssId, + sizeof(struct qdf_mac_addr)))) { + is_conn_bss_found = true; + sme_debug("Connected BSS in scan results"); + } next_result = sme_scan_result_get_next(mac_handle, result_handle); sme_debug("Scan res timer:%lu, rrm scan timer:%llu", scan_results->timer, rrm_scan_timer); - if (scan_results->timer >= rrm_scan_timer) { + if ((scan_results->timer >= rrm_scan_timer) || + (is_conn_bss_found == true)) { roam_info->pBssDesc = &scan_results->BssDescriptor; csr_roam_call_callback(mac_ctx, session_id, roam_info, 0, eCSR_ROAM_UPDATE_SCAN_RESULT, @@ -681,6 +716,7 @@ static QDF_STATUS sme_rrm_issue_scan_req(tpAniSirGlobal mac_ctx) if ((sme_rrm_ctx->currentIndex) >= sme_rrm_ctx->channelList.numOfChannels) { + sme_rrm_send_beacon_report_xmit_ind(mac_ctx, NULL, true, 0); sme_debug("done with the complete ch lt. finish and fee now"); goto free_ch_lst; } @@ -715,6 +751,8 @@ static QDF_STATUS sme_rrm_issue_scan_req(tpAniSirGlobal mac_ctx) ucfg_scan_init_default_params(vdev, req); req->scan_req.dwell_time_active = 0; req->scan_req.scan_id = ucfg_scan_get_scan_id(mac_ctx->psoc); + req->scan_req.scan_f_passive = + (scan_type == eSIR_ACTIVE_SCAN) ? false : true; req->scan_req.vdev_id = wlan_vdev_get_id(vdev); req->scan_req.scan_req_id = sme_rrm_ctx->req_id; qdf_mem_copy(&req->scan_req.bssid_list[0], sme_rrm_ctx->bssId, @@ -722,7 +760,7 @@ static QDF_STATUS sme_rrm_issue_scan_req(tpAniSirGlobal mac_ctx) req->scan_req.num_bssid = 1; if (sme_rrm_ctx->ssId.length) { req->scan_req.num_ssids = 1; - qdf_mem_copy(&req->scan_req.ssid[0], + qdf_mem_copy(&req->scan_req.ssid[0].ssid, sme_rrm_ctx->ssId.ssId, sme_rrm_ctx->ssId.length); req->scan_req.ssid[0].length = sme_rrm_ctx->ssId.length;