qcacld-3.0: Retry sending join_req after timer expiry
If join fail reason is timeout, retry sending join req after timer expiry, timer value can be configured via join_failure_retry_interval. Change-Id: If90071b3f6d7f48936db6f7088c3c1547e48b294 CRs-Fixed: 2760236
This commit is contained in:

committed by
snandini

parent
92a39e9b0f
commit
a9a90ab587
@@ -354,6 +354,8 @@ static void mlme_init_generic_cfg(struct wlan_objmgr_psoc *psoc,
|
||||
cfg_get(psoc, CFG_DFS_CHAN_AGEOUT_TIME);
|
||||
gen->sae_connect_retries =
|
||||
cfg_get(psoc, CFG_SAE_CONNECION_RETRIES);
|
||||
gen->join_failure_retry_interval =
|
||||
cfg_get(psoc, CFG_JOIN_FAILURE_RETRY_INTERVAL);
|
||||
}
|
||||
|
||||
static void mlme_init_edca_ani_cfg(struct wlan_mlme_edca_params *edca_params)
|
||||
|
@@ -781,6 +781,28 @@
|
||||
0, \
|
||||
"WiFi Location Service(WLS) is 6Ghz capable or not")
|
||||
|
||||
/*
|
||||
* <ini>
|
||||
* join_failure_retry_interval - Set join failure retry interval (in ms)
|
||||
*
|
||||
* @Min: 0
|
||||
* @Max: 3000
|
||||
* @Default: 50
|
||||
*
|
||||
* This ini to set the join failure retry interval in ms
|
||||
*
|
||||
* Related: None.
|
||||
|
||||
* Supported Feature: General
|
||||
*
|
||||
* Usage: Internal
|
||||
*
|
||||
* </ini>
|
||||
*/
|
||||
#define CFG_JOIN_FAILURE_RETRY_INTERVAL CFG_INI_UINT("join_failure_retry_interval", \
|
||||
0, 3000, 50, CFG_VALUE_OR_DEFAULT, \
|
||||
"Set join failure retry time in ms")
|
||||
|
||||
#define CFG_GENERIC_ALL \
|
||||
CFG(CFG_ENABLE_DEBUG_PACKET_LOG) \
|
||||
CFG(CFG_PMF_SA_QUERY_MAX_RETRIES) \
|
||||
@@ -813,5 +835,6 @@
|
||||
CFG(CFG_ENABLE_RING_BUFFER) \
|
||||
CFG(CFG_DFS_CHAN_AGEOUT_TIME) \
|
||||
CFG(CFG_SAE_CONNECION_RETRIES) \
|
||||
CFG(CFG_JOIN_FAILURE_RETRY_INTERVAL) \
|
||||
CFG(CFG_WLS_6GHZ_CAPABLE)
|
||||
#endif /* __CFG_MLME_GENERIC_H */
|
||||
|
@@ -1153,6 +1153,7 @@ struct wlan_mlme_chainmask {
|
||||
* @dual_sta_roam_fw_support: Firmware support for dual sta roaming feature
|
||||
* @sae_connect_retries: sae connect retry bitmask
|
||||
* @wls_6ghz_capable: wifi location service(WLS) is 6ghz capable
|
||||
* @join_failure_retry_interval: Join failure retry interval
|
||||
*/
|
||||
struct wlan_mlme_generic {
|
||||
uint32_t band_capability;
|
||||
@@ -1195,6 +1196,7 @@ struct wlan_mlme_generic {
|
||||
bool dual_sta_roam_fw_support;
|
||||
uint32_t sae_connect_retries;
|
||||
bool wls_6ghz_capable;
|
||||
uint16_t join_failure_retry_interval;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@@ -626,6 +626,7 @@ struct csr_roam_session {
|
||||
bool discon_in_progress;
|
||||
bool is_adaptive_11r_connection;
|
||||
struct csr_disconnect_stats disconnect_stats;
|
||||
qdf_mc_timer_t join_retry_timer;
|
||||
};
|
||||
|
||||
struct csr_roamstruct {
|
||||
|
@@ -407,6 +407,7 @@ static QDF_STATUS csr_roam_start_roaming_timer(struct mac_context *mac,
|
||||
static QDF_STATUS csr_roam_stop_roaming_timer(struct mac_context *mac,
|
||||
uint32_t sessionId);
|
||||
static void csr_roam_roaming_timer_handler(void *pv);
|
||||
static void csr_roam_join_failure_retry_connect_handler(void *pv);
|
||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||
static void csr_roam_roaming_offload_timer_action(struct mac_context *mac_ctx,
|
||||
uint32_t interval, uint8_t session_id, uint8_t action);
|
||||
@@ -9156,6 +9157,8 @@ static void csr_roam_join_rsp_processor(struct mac_context *mac,
|
||||
bool retry_same_bss = false;
|
||||
bool attempt_next_bss = true;
|
||||
enum csr_akm_type auth_type = eCSR_AUTH_TYPE_NONE;
|
||||
struct wlan_mlme_psoc_ext_obj *mlme_obj;
|
||||
uint16_t retry_interval;
|
||||
|
||||
if (!pSmeJoinRsp) {
|
||||
sme_err("Sme Join Response is NULL");
|
||||
@@ -9168,6 +9171,11 @@ static void csr_roam_join_rsp_processor(struct mac_context *mac,
|
||||
return;
|
||||
}
|
||||
|
||||
mlme_obj = mlme_get_psoc_ext_obj(mac->psoc);
|
||||
|
||||
if (!mlme_obj)
|
||||
retry_interval = 0;
|
||||
|
||||
prev_connect_info = &session_ptr->prev_assoc_ap_info;
|
||||
/* The head of the active list is the request we sent */
|
||||
pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
|
||||
@@ -9297,6 +9305,18 @@ static void csr_roam_join_rsp_processor(struct mac_context *mac,
|
||||
&max_retry_count);
|
||||
}
|
||||
|
||||
if (pSmeJoinRsp->messageType == eWNI_SME_JOIN_RSP &&
|
||||
pSmeJoinRsp->status_code == eSIR_SME_JOIN_TIMEOUT_RESULT_CODE &&
|
||||
pCommand && pCommand->u.roamCmd.hBSSList) {
|
||||
struct scan_result_list *bss_list =
|
||||
(struct scan_result_list *)pCommand->u.roamCmd.hBSSList;
|
||||
|
||||
if (csr_ll_count(&bss_list->List) == 1) {
|
||||
retry_same_bss = true;
|
||||
sme_err("retry_same_bss is set");
|
||||
}
|
||||
}
|
||||
|
||||
if (attempt_next_bss && retry_same_bss &&
|
||||
pCommand && pCommand->u.roamCmd.pRoamBssEntry) {
|
||||
struct tag_csrscan_result *scan_result;
|
||||
@@ -9338,10 +9358,20 @@ static void csr_roam_join_rsp_processor(struct mac_context *mac,
|
||||
QDF_STATUS_E_FAILURE);
|
||||
}
|
||||
|
||||
retry_interval = mlme_obj->cfg.gen.join_failure_retry_interval;
|
||||
|
||||
if (pCommand && attempt_next_bss) {
|
||||
if (retry_interval && use_same_bss) {
|
||||
qdf_mc_timer_stop(&session_ptr->join_retry_timer);
|
||||
session_ptr->roamingTimerInfo.vdev_id = pSmeJoinRsp->vdev_id;
|
||||
qdf_mc_timer_start(&session_ptr->join_retry_timer, retry_interval);
|
||||
sme_err("Retry sending join req,after timer expiry : %d ms", retry_interval);
|
||||
return;
|
||||
} else {
|
||||
csr_roam(mac, pCommand, use_same_bss);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* When the upper layers issue a connect command, there is a roam
|
||||
@@ -12510,6 +12540,31 @@ rel:
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
|
||||
}
|
||||
|
||||
void csr_roam_join_failure_retry_connect_handler(void *pv)
|
||||
{
|
||||
struct csr_timer_info *info = pv;
|
||||
struct mac_context *mac = info->mac;
|
||||
uint32_t vdev_id = info->vdev_id;
|
||||
struct csr_roam_session *pSession = CSR_GET_SESSION(mac, vdev_id);
|
||||
tListElem *pEntry = NULL;
|
||||
tSmeCmd *pCommand = NULL;
|
||||
|
||||
if (!pSession) {
|
||||
sme_err(" session %d not found ", vdev_id);
|
||||
return;
|
||||
}
|
||||
|
||||
pEntry = csr_nonscan_active_ll_peek_head(mac, LL_ACCESS_LOCK);
|
||||
|
||||
if (pEntry)
|
||||
pCommand = GET_BASE_ADDR(pEntry, tSmeCmd, Link);
|
||||
|
||||
if (pCommand) {
|
||||
sme_err("Join failure timer expired,send join req");
|
||||
csr_roam(mac, pCommand, true);
|
||||
}
|
||||
}
|
||||
|
||||
QDF_STATUS csr_roam_start_roaming_timer(struct mac_context *mac,
|
||||
uint32_t vdev_id,
|
||||
uint32_t interval)
|
||||
@@ -16447,6 +16502,15 @@ QDF_STATUS csr_setup_vdev_session(struct vdev_mlme_obj *vdev_mlme)
|
||||
return status;
|
||||
}
|
||||
|
||||
status = qdf_mc_timer_init(&session->join_retry_timer,
|
||||
QDF_TIMER_TYPE_SW,
|
||||
csr_roam_join_failure_retry_connect_handler,
|
||||
&session->roamingTimerInfo);
|
||||
if (QDF_IS_STATUS_ERROR(status)) {
|
||||
sme_err("timer init failed for join failure timer");
|
||||
return status;
|
||||
}
|
||||
|
||||
ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
|
||||
session->ht_config.ht_rx_ldpc = ht_cap_info->adv_coding_cap;
|
||||
session->ht_config.ht_tx_stbc = ht_cap_info->tx_stbc;
|
||||
@@ -16519,6 +16583,7 @@ void csr_cleanup_vdev_session(struct mac_context *mac, uint8_t vdev_id)
|
||||
&pSession->prev_assoc_ap_info);
|
||||
qdf_mc_timer_destroy(&pSession->hTimerRoaming);
|
||||
qdf_mc_timer_destroy(&pSession->roaming_offload_timer);
|
||||
qdf_mc_timer_destroy(&pSession->join_retry_timer);
|
||||
csr_init_session(mac, vdev_id);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user