qcacld-3.0: Move rso related process to connection manager [PART 6]

Add new code to implement below functions for connection manager
roam part:
And below two RSO command related process:
ROAM_SCAN_OFFLOAD_STOP
ROAM_SCAN_OFFLOAD_UPDATE_CFG

Change-Id: I378b969ddae77fff49ad1d4d8ce21764b292e5ac
CRs-Fixed: 2753011
This commit is contained in:
hqu
2020-08-07 17:21:33 +08:00
committed by snandini
parent f7d6bc2675
commit 75feb60ade
8 changed files with 403 additions and 29 deletions

View File

@@ -25,6 +25,7 @@
#include "wlan_mlme_dbg.h"
#include "wlan_mlme_api.h"
#include "wlan_crypto_global_api.h"
#include "wlan_mlme_main.h"
#if defined(WLAN_FEATURE_ROAM_OFFLOAD) || defined(ROAM_OFFLOAD_V1)
static struct wmi_unified
@@ -757,7 +758,7 @@ target_if_cm_roam_send_roam_init(struct wlan_objmgr_vdev *vdev,
* @vdev: vdev object
* @req: roam start config parameters
*
* This function is used to Send roam start related commands to wmi
* This function is used to send roam start related commands to wmi
*
* Return: QDF_STATUS
*/
@@ -851,7 +852,7 @@ end:
* @vdev: vdev object
* @req: roam stop config parameters
*
* This function is used to Send roam start related commands to wmi
* This function is used to send roam stop related commands to wmi
*
* Return: QDF_STATUS
*/
@@ -859,13 +860,95 @@ static QDF_STATUS
target_if_cm_roam_send_stop(struct wlan_objmgr_vdev *vdev,
struct wlan_roam_stop_config *req)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
wmi_unified_t wmi_handle;
uint32_t mode = 0;
bool is_roam_offload_enabled = false;
struct wlan_objmgr_psoc *psoc;
uint8_t vdev_id;
wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
if (!wmi_handle)
return QDF_STATUS_E_FAILURE;
return QDF_STATUS_SUCCESS;
/* Send 11k offload disable command to FW as part of RSO Stop */
status = target_if_cm_roam_offload_11k_params(wmi_handle,
&req->roam_11k_params);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("11k offload disable not sent, status %d",
status);
goto end;
}
/* Send BTM config as disabled during RSO Stop */
status = target_if_cm_roam_scan_btm_offload(wmi_handle,
&req->btm_config);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("Sending BTM config to fw failed");
goto end;
}
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
target_if_err("psoc handle is NULL");
return QDF_STATUS_E_INVAL;
}
wlan_mlme_get_roaming_offload(psoc, &is_roam_offload_enabled);
if (req->reason == REASON_ROAM_STOP_ALL ||
req->reason == REASON_DISCONNECTED ||
req->reason == REASON_ROAM_SYNCH_FAILED ||
req->reason == REASON_SUPPLICANT_DISABLED_ROAMING) {
mode = WMI_ROAM_SCAN_MODE_NONE;
} else {
if (is_roam_offload_enabled)
mode = WMI_ROAM_SCAN_MODE_NONE |
WMI_ROAM_SCAN_MODE_ROAMOFFLOAD;
else
mode = WMI_ROAM_SCAN_MODE_NONE;
}
/*
* After sending the roam scan mode because of a disconnect,
* clear the scan bitmap client as well by sending
* the following command
*/
target_if_cm_roam_scan_offload_rssi_thresh(wmi_handle,
&req->rssi_params);
/*
* If the STOP command is due to a disconnect, then
* send the filter command to clear all the filter
* entries. If it is roaming scenario, then do not
* send the cleared entries.
*/
if (!req->middle_of_roaming) {
status = target_if_cm_roam_scan_filter(
wmi_handle, ROAM_SCAN_OFFLOAD_STOP,
&req->scan_filter_params);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("clear for roam scan filter failed");
goto end;
}
}
target_if_cm_roam_disconnect_params(wmi_handle, ROAM_SCAN_OFFLOAD_STOP,
&req->disconnect_params);
target_if_cm_roam_idle_params(wmi_handle, ROAM_SCAN_OFFLOAD_STOP,
&req->idle_params);
/*
* Disable all roaming triggers if RSO stop is as part of
* disconnect
*/
vdev_id = wlan_vdev_get_id(vdev);
if (mode == WMI_ROAM_SCAN_MODE_NONE) {
req->roam_triggers.vdev_id = vdev_id;
req->roam_triggers.trigger_bitmap = 0;
target_if_cm_roam_triggers(wmi_handle, &req->roam_triggers);
}
end:
return status;
}
/**
@@ -880,13 +963,69 @@ static QDF_STATUS
target_if_cm_roam_send_update_config(struct wlan_objmgr_vdev *vdev,
struct wlan_roam_update_config *req)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
wmi_unified_t wmi_handle;
struct wlan_objmgr_psoc *psoc;
uint8_t vdev_id;
wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
if (!wmi_handle)
return QDF_STATUS_E_FAILURE;
return QDF_STATUS_SUCCESS;
status = target_if_cm_roam_scan_bmiss_cnt(wmi_handle,
&req->beacon_miss_cnt);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("vdev set bmiss bcnt param failed");
goto end;
}
status = target_if_cm_roam_scan_filter(wmi_handle,
ROAM_SCAN_OFFLOAD_UPDATE_CFG,
&req->scan_filter_params);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("Sending update for roam scan filter failed");
goto end;
}
status = target_if_cm_roam_scan_offload_rssi_thresh(
wmi_handle,
&req->rssi_params);
if (QDF_IS_STATUS_ERROR(status)) {
target_if_err("Sending roam scan offload rssi thresh failed");
goto end;
}
if (req->scan_period_params.empty_scan_refresh_period > 0) {
status = target_if_cm_roam_scan_offload_scan_period(
wmi_handle,
&req->scan_period_params);
if (QDF_IS_STATUS_ERROR(status))
goto end;
}
status = target_if_cm_roam_scan_offload_ap_profile(
vdev, wmi_handle,
&req->profile_params);
if (QDF_IS_STATUS_ERROR(status))
goto end;
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
target_if_err("psoc handle is NULL");
return QDF_STATUS_E_INVAL;
}
vdev_id = wlan_vdev_get_id(vdev);
if (!MLME_IS_ROAM_STATE_RSO_ENABLED(psoc, vdev_id)) {
target_if_cm_roam_disconnect_params(
wmi_handle, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
&req->disconnect_params);
target_if_cm_roam_idle_params(
wmi_handle, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
&req->idle_params);
target_if_cm_roam_triggers(wmi_handle, &req->roam_triggers);
}
end:
return status;
}
/**
@@ -915,7 +1054,7 @@ target_if_cm_roam_abort(struct wlan_objmgr_vdev *vdev, uint8_t vdev_id)
}
/**
* target_if_cm_roam_send_update_config() - Send roam update config related
* target_if_cm_roam_per_config() - Send roam per config related
* commands to wmi
* @vdev: vdev object
* @req: roam per config parameters

View File

@@ -249,6 +249,19 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
update_req = qdf_mem_malloc(sizeof(*update_req));
if (!update_req)
return QDF_STATUS_E_NOMEM;
/* fill from mlme directly */
cm_roam_scan_bmiss_cnt(psoc, vdev_id, &update_req->beacon_miss_cnt);
if (!MLME_IS_ROAM_STATE_RSO_ENABLED(psoc, vdev_id)) {
cm_roam_disconnect_params(psoc, vdev_id,
&update_req->disconnect_params);
cm_roam_idle_params(psoc, vdev_id,
&update_req->idle_params);
cm_roam_triggers(psoc, vdev_id,
&update_req->roam_triggers);
}
/* fill from legacy through this API */
wlan_cm_roam_fill_update_config_req(psoc, vdev_id, update_req, reason);
status = wlan_cm_tgt_send_roam_update_req(psoc, vdev_id, update_req);
if (QDF_IS_STATUS_ERROR(status))
@@ -317,31 +330,61 @@ cm_roam_abort_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
return status;
}
/**
* cm_roam_stop_req() - roam stop request handling
* @psoc: psoc pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
*
* Return: QDF_STATUS
*/
static QDF_STATUS
QDF_STATUS
cm_roam_stop_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t reason)
{
struct wlan_roam_stop_config *stop_req;
QDF_STATUS status;
/*
* If roam synch propagation is in progress and an user space
* disconnect is requested, then there is no need to send the
* RSO STOP to firmware, since the roaming is already complete.
* If the RSO STOP is sent to firmware, then an HO_FAIL will be
* generated and the expectation from firmware would be to
* clean up the peer context on the host and not send down any
* WMI PEER DELETE commands to firmware. But, if the user space
* disconnect gets processed first, then there is a chance to
* send down the PEER DELETE commands. Hence, if we do not
* receive the HO_FAIL, and we complete the roam sync
* propagation, then the host and firmware will be in sync with
* respect to the peer and then the user space disconnect can
* be handled gracefully in a normal way.
*
* Ensure to check the reason code since the RSO Stop might
* come when roam sync failed as well and at that point it
* should go through to the firmware and receive HO_FAIL
* and clean up.
*/
if (MLME_IS_ROAM_SYNCH_IN_PROGRESS(psoc, vdev_id) &&
reason == REASON_ROAM_STOP_ALL) {
mlme_info("vdev_id:%d : Drop RSO stop during roam sync",
vdev_id);
return QDF_STATUS_E_FAILURE;
}
cm_roam_set_roam_reason_better_ap(psoc, vdev_id, false);
stop_req = qdf_mem_malloc(sizeof(*stop_req));
if (!stop_req)
return QDF_STATUS_E_NOMEM;
/* do the filling as csr_post_rso_stop */
status = wlan_cm_roam_fill_stop_req(psoc, vdev_id, stop_req, reason);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_debug("fail to fill stop config req");
return status;
}
status = wlan_cm_tgt_send_roam_stop_req(psoc, vdev_id, stop_req);
if (QDF_IS_STATUS_ERROR(status))
if (QDF_IS_STATUS_ERROR(status)) {
mlme_debug("fail to send roam stop");
} else {
status = wlan_cm_roam_scan_offload_rsp(vdev_id, reason);
if (QDF_IS_STATUS_ERROR(status))
mlme_debug("fail to send rso rsp msg");
}
qdf_mem_free(stop_req);

View File

@@ -63,5 +63,17 @@ QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint8_t rso_command,
uint8_t reason);
/**
* cm_roam_stop_req() - roam stop request handling
* @psoc: psoc pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
*
* Return: QDF_STATUS
*/
QDF_STATUS
cm_roam_stop_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t reason);
#endif
#endif

View File

@@ -57,10 +57,8 @@ wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint8_t rso_command,
uint8_t reason);
wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t rso_command, uint8_t reason);
/**
* wlan_cm_roam_fill_start_req() - fill start request structure content
@@ -74,10 +72,53 @@ wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_start_config *req,
uint8_t reason);
wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_start_config *req, uint8_t reason);
/**
* wlan_cm_roam_fill_stop_req() - fill stop request structure content
* @psoc: pointer to psoc object
* @vdev_id: vdev id
* @req: roam stop config pointer
* @reason: reason to roam
*
* This function gets called to fill stop request structure content
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_cm_roam_fill_stop_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_stop_config *req, uint8_t reason);
/**
* wlan_cm_roam_fill_update_config_req() - fill update config request
* structure content
* @psoc: pointer to psoc object
* @vdev_id: vdev id
* @req: roam update config pointer
* @reason: reason to roam
*
* This function gets called to fill update config request structure content
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_cm_roam_fill_update_config_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_update_config *req,
uint8_t reason);
/**
* wlan_cm_roam_scan_offload_rsp() - send roam scan offload response message
* @vdev_id: vdev id
* @reason: reason to roam
*
* This function gets called to send roam scan offload response message
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_cm_roam_scan_offload_rsp(uint8_t vdev_id, uint8_t reason);
/**
* wlan_cm_send_beacon_miss() - initiate beacon miss
@@ -190,6 +231,17 @@ QDF_STATUS wlan_cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
QDF_STATUS wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint8_t rso_command,
uint8_t reason);
/**
* wlan_cm_roam_stop_req() - roam stop request handling
* @psoc: psoc pointer
* @vdev_id: vdev id
* @reason: reason for changing roam state for the requested vdev id
*
* Return: QDF_STATUS
*/
QDF_STATUS wlan_cm_roam_stop_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t reason);
#endif
#ifdef WLAN_FEATURE_ROAM_OFFLOAD

View File

@@ -722,6 +722,8 @@ struct wlan_roam_start_config {
/**
* struct wlan_roam_stop_config - structure containing parameters for
* roam stop
* @reason: roaming reason
* @middle_of_roaming: in the middle of roaming
* @roam_11k_params: 11k params
* @btm_config: btm configuration
* @scan_filter_params: roam scan filter parameters
@@ -731,6 +733,8 @@ struct wlan_roam_start_config {
* @rssi_params: roam scan rssi threshold parameters
*/
struct wlan_roam_stop_config {
uint8_t reason;
uint8_t middle_of_roaming;
struct wlan_roam_11k_offload_params roam_11k_params;
struct wlan_roam_btm_config btm_config;
struct wlan_roam_scan_filter_params scan_filter_params;
@@ -746,17 +750,21 @@ struct wlan_roam_stop_config {
* @beacon_miss_cnt: roam beacon miss count parameters
* @scan_filter_params: roam scan filter parameters
* @scan_period_params: roam scan period parameters
* @profile_params: ap profile parameters
* @rssi_params: roam scan rssi threshold parameters
* @disconnect_params: disconnect params
* @idle_params: idle params
* @roam_triggers: roam triggers parameters
*/
struct wlan_roam_update_config {
struct wlan_roam_beacon_miss_cnt beacon_miss_cnt;
struct wlan_roam_scan_filter_params scan_filter_params;
struct wlan_roam_scan_period_params scan_period_params;
struct ap_profile_params profile_params;
struct wlan_roam_offload_scan_rssi_params rssi_params;
struct wlan_roam_disconnect_params disconnect_params;
struct wlan_roam_idle_params idle_params;
struct wlan_roam_triggers roam_triggers;
};
#endif

View File

@@ -183,6 +183,12 @@ QDF_STATUS wlan_cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
{
return cm_roam_send_rso_cmd(psoc, vdev_id, rso_command, reason);
}
QDF_STATUS wlan_cm_roam_stop_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint8_t reason)
{
return cm_roam_stop_req(psoc, vdev_id, reason);
}
#endif
#ifdef WLAN_FEATURE_ROAM_OFFLOAD

View File

@@ -19848,12 +19848,9 @@ csr_cm_roam_offload_11k_params(struct mac_context *mac_ctx,
}
QDF_STATUS
wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_start_config *req,
uint8_t reason)
wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_start_config *req, uint8_t reason)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct csr_roam_session *session;
struct mac_context *mac_ctx;
@@ -19873,7 +19870,7 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
csr_cm_roam_scan_offload_rssi_thresh(mac_ctx, session,
&req->rssi_params);
csr_cm_roam_scan_offload_scan_period(mac_ctx, session->vdev_id,
csr_cm_roam_scan_offload_scan_period(mac_ctx, vdev_id,
&req->scan_period_params);
csr_cm_roam_scan_offload_ap_profile(mac_ctx, session,
@@ -19889,6 +19886,114 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
&req->roam_11k_params, TRUE);
/* fill other struct similar to wlan_roam_offload_scan_rssi_params */
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_cm_roam_fill_stop_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
struct wlan_roam_stop_config *req, uint8_t reason)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct mac_context *mac_ctx;
mac_ctx = sme_get_mac_context();
if (!mac_ctx) {
sme_err("mac_ctx is NULL");
return QDF_STATUS_E_FAILURE;
}
if (reason == REASON_ROAM_SYNCH_FAILED)
return status;
else if (reason == REASON_DRIVER_DISABLED)
req->reason = REASON_ROAM_STOP_ALL;
else if (reason == REASON_SUPPLICANT_DISABLED_ROAMING)
req->reason = REASON_SUPPLICANT_DISABLED_ROAMING;
else if (reason == REASON_DISCONNECTED)
req->reason = REASON_DISCONNECTED;
else if (reason == REASON_OS_REQUESTED_ROAMING_NOW)
req->reason = REASON_OS_REQUESTED_ROAMING_NOW;
else
req->reason = REASON_SME_ISSUED;
if (csr_neighbor_middle_of_roaming(mac_ctx, vdev_id))
req->middle_of_roaming = 1;
else
csr_roam_reset_roam_params(mac_ctx);
/*
* Disable offload_11k_params for current vdev
*/
req->roam_11k_params.vdev_id = vdev_id;
return status;
}
QDF_STATUS
wlan_cm_roam_fill_update_config_req(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
struct wlan_roam_update_config *req,
uint8_t reason)
{
struct csr_roam_session *session;
struct mac_context *mac_ctx;
mac_ctx = sme_get_mac_context();
if (!mac_ctx) {
sme_err("mac_ctx is NULL");
return QDF_STATUS_E_FAILURE;
}
session = CSR_GET_SESSION(mac_ctx, vdev_id);
if (!session) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"session is null");
return QDF_STATUS_E_FAILURE;
}
csr_cm_roam_scan_filter(mac_ctx, vdev_id, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
reason, &req->scan_filter_params);
csr_cm_roam_scan_offload_rssi_thresh(mac_ctx, session,
&req->rssi_params);
csr_cm_roam_scan_offload_scan_period(mac_ctx, vdev_id,
&req->scan_period_params);
csr_cm_roam_scan_offload_ap_profile(mac_ctx, session,
&req->profile_params);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_cm_roam_scan_offload_rsp(uint8_t vdev_id, uint8_t reason)
{
QDF_STATUS status;
struct scheduler_msg cds_msg = {0};
struct roam_offload_scan_rsp *scan_offload_rsp;
if (reason == REASON_OS_REQUESTED_ROAMING_NOW) {
scan_offload_rsp = qdf_mem_malloc(sizeof(*scan_offload_rsp));
if (!scan_offload_rsp) {
return QDF_STATUS_E_NOMEM;
}
cds_msg.type = eWNI_SME_ROAM_SCAN_OFFLOAD_RSP;
scan_offload_rsp->sessionId = vdev_id;
scan_offload_rsp->reason = reason;
cds_msg.bodyptr = scan_offload_rsp;
/*
* Since REASSOC request is processed in
* Roam_Scan_Offload_Rsp post a dummy rsp msg back to
* SME with proper reason code.
*/
status = scheduler_post_message(QDF_MODULE_ID_MLME,
QDF_MODULE_ID_SME,
QDF_MODULE_ID_SME,
&cds_msg);
if (QDF_IS_STATUS_ERROR(status))
qdf_mem_free(scan_offload_rsp);
}
return status;
}
#endif

View File

@@ -2888,6 +2888,7 @@ static void wma_update_phymode_on_roam(tp_wma_handle wma, uint8_t *bssid,
wma_debug("LFR3: new phymode %d", bss_phymode);
}
#ifndef ROAM_OFFLOAD_V1
/**
* wma_post_roam_sync_failure: Send roam sync failure ind to fw
* @wma: wma handle
@@ -2910,6 +2911,14 @@ static void wma_post_roam_sync_failure(tp_wma_handle wma, uint8_t vdev_id)
wma_process_roaming_config(wma, roam_req);
}
}
#else
static void wma_post_roam_sync_failure(tp_wma_handle wma, uint8_t vdev_id)
{
wlan_cm_roam_stop_req(wma->psoc, vdev_id, REASON_ROAM_SYNCH_FAILED);
wma_debug("In cleanup: RSO Command:%d, reason %d vdev %d",
ROAM_SCAN_OFFLOAD_STOP, REASON_ROAM_SYNCH_FAILED, vdev_id);
}
#endif
int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event,
uint32_t len)