qcacmn: Add logic to remove preauth and roam ser command

Add logic to remove preauth or roam command from serialization
depending on the state the roaming was in.

Change-Id: Ia381d040ce7e15a725eb2402896bf476d3236566
CRs-fixed: 2882994
Этот коммит содержится в:
Abhishek Singh
2021-02-22 14:36:14 +05:30
коммит произвёл snandini
родитель b29d1e9018
Коммит 9b797fd035
5 изменённых файлов: 53 добавлений и 16 удалений

Просмотреть файл

@@ -226,6 +226,18 @@ static QDF_STATUS cm_host_roam_start(struct cnx_mgr *cm_ctx,
return QDF_STATUS_SUCCESS;
}
static
QDF_STATUS cm_host_roam_start_fail(struct cnx_mgr *cm_ctx,
struct cm_req *cm_req,
enum wlan_cm_connect_fail_reason reason)
{
/*
* call API to send WLAN_CM_SM_EV_PREAUTH_FAIL to call preauth complete
* and move SM to CONNECTED state
*/
return QDF_STATUS_SUCCESS;
}
#else
static QDF_STATUS cm_host_roam_start(struct cnx_mgr *cm_ctx,
struct cm_req *cm_req)
@@ -234,6 +246,14 @@ static QDF_STATUS cm_host_roam_start(struct cnx_mgr *cm_ctx,
sizeof(cm_req->roam_req),
&cm_req->roam_req);
}
static
QDF_STATUS cm_host_roam_start_fail(struct cnx_mgr *cm_ctx,
struct cm_req *cm_req,
enum wlan_cm_connect_fail_reason reason)
{
return cm_send_reassoc_start_fail(cm_ctx, cm_req->cm_id, reason, true);
}
#endif
QDF_STATUS cm_host_roam_start_req(struct cnx_mgr *cm_ctx,
@@ -262,7 +282,7 @@ QDF_STATUS cm_host_roam_start_req(struct cnx_mgr *cm_ctx,
return status;
roam_err:
return cm_send_reassoc_start_fail(cm_ctx, cm_req->cm_id, reason, true);
return cm_host_roam_start_fail(cm_ctx, cm_req, reason);
}
bool cm_roam_resp_cmid_match_list_head(struct cnx_mgr *cm_ctx,
@@ -578,7 +598,7 @@ static QDF_STATUS cm_ser_reassoc_req(struct cnx_mgr *cm_ctx,
return status;
}
cmd.cmd_type = WLAN_SER_CMD_VDEV_REASSOC;
cmd.cmd_type = WLAN_SER_CMD_VDEV_ROAM;
cmd.cmd_id = cm_req->cm_id;
cmd.cmd_cb = cm_ser_reassoc_cb;
cmd.source = WLAN_UMAC_COMP_MLME;

Просмотреть файл

@@ -235,6 +235,9 @@ struct cm_req_history {
* @vdev: vdev back pointer
* @sm: state machine
* @active_cm_id: cm_id of the active command, if any active command present
* @preauth_in_progress: is roaming in preauth state, set during preauth state,
* this is used to get which command to flush from serialization during
* host roaming.
* @req_list: connect/disconnect req list
* @cm_req_lock: lock to manupulate/read the cm req list
* @disconnect_count: disconnect count
@@ -255,6 +258,7 @@ struct cnx_mgr {
struct wlan_objmgr_vdev *vdev;
struct cm_state_sm sm;
wlan_cm_id active_cm_id;
bool preauth_in_progress;
qdf_list_t req_list;
#ifdef WLAN_CM_USE_SPINLOCK
qdf_spinlock_t cm_req_lock;

Просмотреть файл

@@ -142,9 +142,13 @@ bool cm_subst_preauth_event(void *ctx, uint16_t event,
data_len, data);
break;
case WLAN_CM_SM_EV_ROAM_START:
/* set preauth to true when we enter preauth state */
cm_ctx->preauth_in_progress = true;
cm_host_roam_start_req(cm_ctx, data);
break;
case WLAN_CM_SM_EV_START_REASSOC:
/* set preauth to false as soon as we move to reassoc state */
cm_ctx->preauth_in_progress = false;
cm_sm_transition_to(cm_ctx, WLAN_CM_SS_REASSOC);
cm_sm_deliver_event_sync(cm_ctx, WLAN_CM_SM_EV_START_REASSOC,
data_len, data);

Просмотреть файл

@@ -492,25 +492,34 @@ static void cm_remove_cmd_from_serialization(struct cnx_mgr *cm_ctx,
cmd_info.cmd_id = cm_id;
cmd_info.req_type = WLAN_SER_CANCEL_NON_SCAN_CMD;
if (prefix == CONNECT_REQ_PREFIX)
if (prefix == CONNECT_REQ_PREFIX) {
cmd_info.cmd_type = WLAN_SER_CMD_VDEV_CONNECT;
else if (prefix == ROAM_REQ_PREFIX)
cmd_info.cmd_type = WLAN_SER_CMD_VDEV_REASSOC;
else
} else if (prefix == ROAM_REQ_PREFIX) {
/*
* Try removing PREAUTH command when in preauth state else
* try remove ROAM command
*/
if (cm_ctx->preauth_in_progress)
cmd_info.cmd_type = WLAN_SER_CMD_PERFORM_PRE_AUTH;
else
cmd_info.cmd_type = WLAN_SER_CMD_VDEV_ROAM;
cm_ctx->preauth_in_progress = false;
} else {
cmd_info.cmd_type = WLAN_SER_CMD_VDEV_DISCONNECT;
}
cmd_info.vdev = cm_ctx->vdev;
if (cm_id == cm_ctx->active_cm_id) {
mlme_debug(CM_PREFIX_FMT "Remove from active",
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev),
cm_id));
mlme_debug(CM_PREFIX_FMT "Remove cmd type %d from active",
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev), cm_id),
cmd_info.cmd_type);
cmd_info.queue_type = WLAN_SERIALIZATION_ACTIVE_QUEUE;
wlan_serialization_remove_cmd(&cmd_info);
} else {
mlme_debug(CM_PREFIX_FMT "Remove from pending",
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev),
cm_id));
mlme_debug(CM_PREFIX_FMT "Remove cmd type %d from pending",
CM_PREFIX_REF(wlan_vdev_get_id(cm_ctx->vdev), cm_id),
cmd_info.cmd_type);
cmd_info.queue_type = WLAN_SERIALIZATION_PENDING_QUEUE;
wlan_serialization_cancel_request(&cmd_info);
}