qcacld-3.0: Notify the failure to firmware if SAE auth retries exhausted

Currently during SAE roaming, if the DUT exhaust SAE retries
(i.e. DUT doesn't receive SAE auth confirm/commit response even
after max retries), host driver stops retrying and cleans up the
internal counters/frame. But, the failure is not notified to firmware.
So, firmware may go out of sync. Therefore, Notify the failure to
firmware through WMA_ROAM_PRE_AUTH_STATUS in such cases. So that,
firmware can abort roaming.

Change-Id: Ic769dcabc15c1052f5d7d43f3ef754dd7b7c1f40
CRs-Fixed: 2981666
This commit is contained in:
Surya Prakash Sivaraj 2021-08-30 22:09:30 +05:30 • committed by Madan Koyyalamudi
commit ece9151f58

View file

@ -1650,10 +1650,41 @@ static void lim_process_periodic_join_probe_req_timer(struct mac_context *mac_ct
}
}
static void lim_send_pre_auth_failure(uint8_t vdev_id, tSirMacAddr bssid)
{
struct scheduler_msg sch_msg = {0};
struct wmi_roam_auth_status_params *params;
QDF_STATUS status = QDF_STATUS_SUCCESS;
params = qdf_mem_malloc(sizeof(*params));
if (!params)
return;
params->vdev_id = vdev_id;
params->preauth_status = STATUS_UNSPECIFIED_FAILURE;
qdf_mem_copy(params->bssid.bytes, bssid, QDF_MAC_ADDR_SIZE);
qdf_mem_zero(params->pmkid, PMKID_LEN);
sch_msg.type = WMA_ROAM_PRE_AUTH_STATUS;
sch_msg.bodyptr = params;
pe_debug("Sending pre auth failure for mac_addr " QDF_MAC_ADDR_FMT,
QDF_MAC_ADDR_REF(params->bssid.bytes));
status = scheduler_post_message(QDF_MODULE_ID_PE,
QDF_MODULE_ID_WMA,
QDF_MODULE_ID_WMA,
&sch_msg);
if (QDF_IS_STATUS_ERROR(status)) {
pe_err("Sending preauth status failed");
qdf_mem_free(params);
}
}
static void lim_handle_sae_auth_timeout(struct mac_context *mac_ctx,
struct pe_session *session_entry)
{
struct sae_auth_retry *sae_retry;
tpSirMacMgmtHdr mac_hdr;
sae_retry = mlme_get_sae_auth_retry(session_entry->vdev);
if (!(sae_retry && sae_retry->sae_auth.data)) {
@ -1662,6 +1693,16 @@ static void lim_handle_sae_auth_timeout(struct mac_context *mac_ctx,
return;
}
if (!sae_retry->sae_auth_max_retry) {
if (MLME_IS_ROAMING_IN_PROG(mac_ctx->psoc,
session_entry->vdev_id)) {
mac_hdr = (tpSirMacMgmtHdr)sae_retry->sae_auth.data;
lim_send_pre_auth_failure(session_entry->vdev_id,
mac_hdr->bssId);
}
goto free_and_deactivate_timer;
}
pe_debug("retry sae auth for seq num %d vdev id %d",
mac_ctx->mgmtSeqNum, session_entry->vdev_id);
lim_send_frame(mac_ctx, session_entry->vdev_id,
@ -1669,7 +1710,7 @@ static void lim_handle_sae_auth_timeout(struct mac_context *mac_ctx,
sae_retry->sae_auth_max_retry--;
/* Activate Auth Retry timer if max_retries are not done */
if (!sae_retry->sae_auth_max_retry || (tx_timer_activate(
if ((tx_timer_activate(
&mac_ctx->lim.lim_timers.g_lim_periodic_auth_retry_timer) !=
TX_SUCCESS))
goto free_and_deactivate_timer;