diff options
| -rw-r--r-- | core/mac/inc/ani_global.h | 17 | ||||
| -rw-r--r-- | core/mac/src/include/sir_params.h | 1 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_ft.c | 2 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_process_auth_frame.c | 64 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_process_message_queue.c | 1 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_process_mlm_req_messages.c | 86 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_security_utils.c | 9 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_send_management_frames.c | 72 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_timer_utils.c | 48 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_timer_utils.h | 3 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_trace.c | 1 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_types.h | 2 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_utils.c | 5 | ||||
| -rw-r--r-- | core/mac/src/sys/legacy/src/utils/src/mac_trace.c | 1 |
14 files changed, 271 insertions, 41 deletions
diff --git a/core/mac/inc/ani_global.h b/core/mac/inc/ani_global.h index db0618a5ea28..8f68465306b0 100644 --- a/core/mac/inc/ani_global.h +++ b/core/mac/inc/ani_global.h @@ -324,6 +324,7 @@ typedef struct sLimTimers { * for a period of time on a particular DFS channel */ TX_TIMER gLimActiveToPassiveChannelTimer; + TX_TIMER g_lim_periodic_auth_retry_timer; /* ********************TIMER SECTION ENDS************************************************** */ /* ALL THE FIELDS BELOW THIS CAN BE ZEROED OUT in lim_initialize */ @@ -962,6 +963,21 @@ typedef struct sHalMacStartParameters { } tHalMacStartParameters; +/** + * enum auth_tx_ack_status - Indicate TX status of AUTH + * @LIM_AUTH_ACK_NOT_RCD : Default status while waiting for ack status. + * @LIM_AUTH_ACK_RCD_SUCCESS : Ack is received. + * @LIM_AUTH_ACK_RCD_FAILURE : No Ack received. + * + * Indicate if driver is waiting for ACK status of auth or ACK received for AUTH + * OR NO ACK is received for the auth sent. + */ +enum auth_tx_ack_status { + LIM_AUTH_ACK_NOT_RCD, + LIM_AUTH_ACK_RCD_SUCCESS, + LIM_AUTH_ACK_RCD_FAILURE, +}; + /* ------------------------------------------------------------------- */ /* / MAC Sirius parameter structure */ typedef struct sAniSirGlobal { @@ -1030,6 +1046,7 @@ typedef struct sAniSirGlobal { sir_mgmt_frame_ind_callback mgmt_frame_ind_cb; bool first_scan_done; int8_t first_scan_bucket_threshold; + enum auth_tx_ack_status auth_ack_status; } tAniSirGlobal; typedef enum { diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h index 89a0505f9785..d8b64181c008 100644 --- a/core/mac/src/include/sir_params.h +++ b/core/mac/src/include/sir_params.h @@ -693,6 +693,7 @@ typedef struct sSirMbMsgP2p { #define SIR_LIM_CONVERT_ACTIVE_CHANNEL_TO_PASSIVE \ (SIR_LIM_TIMEOUT_MSG_START + 0x2C) +#define SIR_LIM_AUTH_RETRY_TIMEOUT (SIR_LIM_TIMEOUT_MSG_START + 0x2D) #define SIR_LIM_MSG_TYPES_END (SIR_LIM_MSG_TYPES_BEGIN+0xFF) diff --git a/core/mac/src/pe/lim/lim_ft.c b/core/mac/src/pe/lim/lim_ft.c index fd8cd22a4788..82f2498359e4 100644 --- a/core/mac/src/pe/lim/lim_ft.c +++ b/core/mac/src/pe/lim/lim_ft.c @@ -359,7 +359,7 @@ void lim_perform_ft_pre_auth(tpAniSirGlobal pMac, QDF_STATUS status, lim_send_auth_mgmt_frame(pMac, &authFrame, psessionEntry->ftPEContext.pFTPreAuthReq->preAuthbssId, - LIM_NO_WEP_IN_FC, psessionEntry); + LIM_NO_WEP_IN_FC, psessionEntry, false); return; diff --git a/core/mac/src/pe/lim/lim_process_auth_frame.c b/core/mac/src/pe/lim/lim_process_auth_frame.c index ce612bf9d716..5eb8084520d2 100644 --- a/core/mac/src/pe/lim/lim_process_auth_frame.c +++ b/core/mac/src/pe/lim/lim_process_auth_frame.c @@ -141,7 +141,8 @@ static void lim_process_auth_shared_system_algo(tpAniSirGlobal mac_ctx, eSIR_MAC_AUTH_ALGO_NOT_SUPPORTED_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } else { /* Create entry for this STA in pre-auth list */ @@ -188,7 +189,8 @@ static void lim_process_auth_shared_system_algo(tpAniSirGlobal mac_ctx, eSIR_MAC_UNSPEC_FAILURE_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); lim_delete_pre_auth_node(mac_ctx, mac_hdr->sa); return; } @@ -219,7 +221,8 @@ static void lim_process_auth_shared_system_algo(tpAniSirGlobal mac_ctx, auth_node->challengeText, SIR_MAC_AUTH_CHALLENGE_LENGTH); lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); } } @@ -262,7 +265,8 @@ static void lim_process_auth_open_system_algo(tpAniSirGlobal mac_ctx, rx_auth_frm_body->authTransactionSeqNumber + 1; auth_frame->authStatusCode = eSIR_MAC_SUCCESS_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, mac_hdr->sa, - LIM_NO_WEP_IN_FC, pe_session); + LIM_NO_WEP_IN_FC, + pe_session, false); } static void lim_process_auth_frame_type1(tpAniSirGlobal mac_ctx, @@ -427,7 +431,8 @@ static void lim_process_auth_frame_type1(tpAniSirGlobal mac_ctx, eSIR_MAC_UNSPEC_FAILURE_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } /* No Pre-auth context exists for the STA. */ @@ -466,7 +471,8 @@ static void lim_process_auth_frame_type1(tpAniSirGlobal mac_ctx, auth_frame->authStatusCode = eSIR_MAC_AUTH_ALGO_NOT_SUPPORTED_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } } else { @@ -489,7 +495,8 @@ static void lim_process_auth_frame_type1(tpAniSirGlobal mac_ctx, lim_send_auth_mgmt_frame(mac_ctx, auth_frame, mac_hdr->sa, - LIM_NO_WEP_IN_FC, pe_session); + LIM_NO_WEP_IN_FC, + pe_session, false); return; } } @@ -671,7 +678,7 @@ static void lim_process_auth_frame_type2(tpAniSirGlobal mac_ctx, eSIR_MAC_AUTH_ALGO_NOT_SUPPORTED_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, mac_hdr->sa, LIM_NO_WEP_IN_FC, - pe_session); + pe_session, false); return; } if (rx_auth_frm_body->type != SIR_MAC_CHALLENGE_TEXT_EID) { @@ -704,7 +711,8 @@ static void lim_process_auth_frame_type2(tpAniSirGlobal mac_ctx, eSIR_MAC_CHALLENGE_FAILURE_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, mac_hdr->sa, - LIM_NO_WEP_IN_FC, pe_session); + LIM_NO_WEP_IN_FC, + pe_session, false); lim_restore_from_auth_state(mac_ctx, eSIR_SME_INVALID_WEP_DEFAULT_KEY, eSIR_MAC_UNSPEC_FAILURE_REASON, @@ -737,7 +745,8 @@ static void lim_process_auth_frame_type2(tpAniSirGlobal mac_ctx, pe_session->limMlmState)); lim_send_auth_mgmt_frame(mac_ctx, (tpSirMacAuthFrameBody)encr_auth_frame, - mac_hdr->sa, LIM_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_WEP_IN_FC, + pe_session, false); return; } @@ -768,7 +777,8 @@ static void lim_process_auth_frame_type3(tpAniSirGlobal mac_ctx, auth_frame->authStatusCode = eSIR_MAC_AUTH_FRAME_OUT_OF_SEQ_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } @@ -794,7 +804,7 @@ static void lim_process_auth_frame_type3(tpAniSirGlobal mac_ctx, lim_send_auth_mgmt_frame(mac_ctx, auth_frame, mac_hdr->sa, LIM_NO_WEP_IN_FC, - pe_session); + pe_session, false); return; } @@ -815,7 +825,8 @@ static void lim_process_auth_frame_type3(tpAniSirGlobal mac_ctx, auth_frame->authStatusCode = eSIR_MAC_AUTH_FRAME_OUT_OF_SEQ_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } @@ -836,7 +847,8 @@ static void lim_process_auth_frame_type3(tpAniSirGlobal mac_ctx, eSIR_MAC_AUTH_RSP_TIMEOUT_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); /* Delete pre-auth context of STA */ lim_delete_pre_auth_node(mac_ctx, mac_hdr->sa); return; @@ -881,7 +893,8 @@ static void lim_process_auth_frame_type3(tpAniSirGlobal mac_ctx, auth_frame->authStatusCode = eSIR_MAC_SUCCESS_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } else { lim_log(mac_ctx, LOGW, @@ -901,7 +914,8 @@ static void lim_process_auth_frame_type3(tpAniSirGlobal mac_ctx, auth_frame->authStatusCode = eSIR_MAC_CHALLENGE_FAILURE_STATUS; lim_send_auth_mgmt_frame(mac_ctx, auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } } @@ -1147,7 +1161,8 @@ lim_process_auth_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, FL("rx Auth frm with wep bit set role=%d %pM"), GET_LIM_SYSTEM_ROLE(pe_session), mac_hdr->sa); lim_send_auth_mgmt_frame(mac_ctx, &auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } @@ -1192,7 +1207,8 @@ lim_process_auth_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, auth_frame.authStatusCode = eSIR_MAC_CHALLENGE_FAILURE_STATUS; lim_send_auth_mgmt_frame(mac_ctx, &auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } @@ -1219,7 +1235,8 @@ lim_process_auth_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, auth_frame.authStatusCode = eSIR_MAC_AUTH_FRAME_OUT_OF_SEQ_STATUS; lim_send_auth_mgmt_frame(mac_ctx, &auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } /* Change the auth-response timeout */ @@ -1248,7 +1265,8 @@ lim_process_auth_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, eSIR_MAC_AUTH_FRAME_OUT_OF_SEQ_STATUS; lim_send_auth_mgmt_frame(mac_ctx, &auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } @@ -1276,7 +1294,8 @@ lim_process_auth_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, auth_frame.authStatusCode = eSIR_MAC_CHALLENGE_FAILURE_STATUS; lim_send_auth_mgmt_frame(mac_ctx, &auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } @@ -1299,7 +1318,8 @@ lim_process_auth_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, eSIR_MAC_CHALLENGE_FAILURE_STATUS; lim_send_auth_mgmt_frame(mac_ctx, &auth_frame, - mac_hdr->sa, LIM_NO_WEP_IN_FC, pe_session); + mac_hdr->sa, LIM_NO_WEP_IN_FC, + pe_session, false); return; } if ((sir_convert_auth_frame2_struct(mac_ctx, plainbody, diff --git a/core/mac/src/pe/lim/lim_process_message_queue.c b/core/mac/src/pe/lim/lim_process_message_queue.c index 17073ce5b8e9..e4b1649e7bfb 100644 --- a/core/mac/src/pe/lim/lim_process_message_queue.c +++ b/core/mac/src/pe/lim/lim_process_message_queue.c @@ -1766,6 +1766,7 @@ void lim_process_messages(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) case SIR_LIM_DISASSOC_ACK_TIMEOUT: case SIR_LIM_DEAUTH_ACK_TIMEOUT: case SIR_LIM_CONVERT_ACTIVE_CHANNEL_TO_PASSIVE: + case SIR_LIM_AUTH_RETRY_TIMEOUT: /* These timeout messages are handled by MLM sub module */ lim_process_mlm_req_messages(mac_ctx, msg); break; diff --git a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c index a7be64004e85..6d5b78ae70da 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c @@ -66,6 +66,7 @@ static void lim_process_auth_failure_timeout(tpAniSirGlobal); static void lim_process_auth_rsp_timeout(tpAniSirGlobal, uint32_t); static void lim_process_assoc_failure_timeout(tpAniSirGlobal, uint32_t); static void lim_process_periodic_join_probe_req_timer(tpAniSirGlobal); +static void lim_process_auth_retry_timer(tpAniSirGlobal); /** * lim_process_mlm_req_messages() - process mlm request messages @@ -154,6 +155,9 @@ void lim_process_mlm_req_messages(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) case SIR_LIM_DEAUTH_ACK_TIMEOUT: lim_process_deauth_ack_timeout(mac_ctx); break; + case SIR_LIM_AUTH_RETRY_TIMEOUT: + lim_process_auth_retry_timer(mac_ctx); + break; case LIM_MLM_TSPEC_REQ: default: break; @@ -1284,25 +1288,39 @@ static void lim_process_mlm_auth_req(tpAniSirGlobal mac_ctx, uint32_t *msg) lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_AUTH_START_EVENT, session, eSIR_SUCCESS, auth_frame_body.authStatusCode); #endif - + mac_ctx->auth_ack_status = LIM_AUTH_ACK_NOT_RCD; lim_send_auth_mgmt_frame(mac_ctx, &auth_frame_body, mac_ctx->lim.gpLimMlmAuthReq->peerMacAddr, - LIM_NO_WEP_IN_FC, session); + LIM_NO_WEP_IN_FC, session, true); /* assign appropriate session_id to the timer object */ mac_ctx->lim.limTimers.gLimAuthFailureTimer.sessionId = session_id; + /* assign appropriate sessionId to the timer object */ + mac_ctx->lim.limTimers.g_lim_periodic_auth_retry_timer.sessionId = + session_id; + lim_deactivate_and_change_timer(mac_ctx, eLIM_AUTH_RETRY_TIMER); /* Activate Auth failure timer */ MTRACE(mac_trace(mac_ctx, TRACE_CODE_TIMER_ACTIVATE, session->peSessionId, eLIM_AUTH_FAIL_TIMER)); if (tx_timer_activate(&mac_ctx->lim.limTimers.gLimAuthFailureTimer) != TX_SUCCESS) { /* Could not start Auth failure timer. */ - lim_log(mac_ctx, LOGP, + lim_log(mac_ctx, LOGE, FL("could not start Auth failure timer")); /* Cleanup as if auth timer expired */ lim_process_auth_failure_timeout(mac_ctx); + } else { + MTRACE(mac_trace(mac_ctx, TRACE_CODE_TIMER_ACTIVATE, + session->peSessionId, eLIM_AUTH_RETRY_TIMER)); + /* Activate Auth Retry timer */ + if (tx_timer_activate + (&mac_ctx->lim.limTimers.g_lim_periodic_auth_retry_timer) + != TX_SUCCESS) + lim_log(mac_ctx, LOGE, + FL("could not activate Auth Retry timer")); } + return; end: qdf_mem_copy((uint8_t *) &mlm_auth_cnf.peerMacAddr, @@ -2603,6 +2621,68 @@ static void lim_process_periodic_join_probe_req_timer(tpAniSirGlobal mac_ctx) } /** + * lim_process_auth_retry_timer()- function to Retry Auth + * @mac_ctx:pointer to global mac + * + * Return: void + */ + +static void lim_process_auth_retry_timer(tpAniSirGlobal mac_ctx) +{ + tpPESession session_entry; + + lim_log(mac_ctx, LOG1, FL("ENTER")); + + session_entry = + pe_find_session_by_session_id(mac_ctx, + mac_ctx->lim.limTimers.g_lim_periodic_auth_retry_timer.sessionId); + if (NULL == session_entry) { + lim_log(mac_ctx, LOGE, + FL("session does not exist for given SessionId : %d"), + mac_ctx->lim.limTimers. + g_lim_periodic_auth_retry_timer.sessionId); + return; + } + + if (tx_timer_running(&mac_ctx->lim.limTimers.gLimAuthFailureTimer) && + (session_entry->limMlmState == eLIM_MLM_WT_AUTH_FRAME2_STATE) && + (LIM_AUTH_ACK_RCD_SUCCESS != mac_ctx->auth_ack_status)) { + tSirMacAuthFrameBody auth_frame; + + /* + * Send the auth retry only in case we have received ack failure + * else just restart the retry timer. + */ + if (LIM_AUTH_ACK_RCD_FAILURE == mac_ctx->auth_ack_status) { + /* Prepare & send Authentication frame */ + auth_frame.authAlgoNumber = + (uint8_t) mac_ctx->lim.gpLimMlmAuthReq->authType; + auth_frame.authTransactionSeqNumber = + SIR_MAC_AUTH_FRAME_1; + auth_frame.authStatusCode = 0; + lim_log(mac_ctx, LOGW, FL("Retry Auth ")); + mac_ctx->auth_ack_status = LIM_AUTH_ACK_NOT_RCD; + lim_send_auth_mgmt_frame(mac_ctx, + &auth_frame, + mac_ctx->lim.gpLimMlmAuthReq->peerMacAddr, + LIM_NO_WEP_IN_FC, session_entry, true); + } + + lim_deactivate_and_change_timer(mac_ctx, eLIM_AUTH_RETRY_TIMER); + + /* Activate Auth Retry timer */ + if (tx_timer_activate + (&mac_ctx->lim.limTimers.g_lim_periodic_auth_retry_timer) + != TX_SUCCESS) { + lim_log(mac_ctx, LOGE, + FL("could not activate Auth Retry failure timer")); + return; + } + } + return; +} /*** lim_process_auth_retry_timer() ***/ + +/** * lim_process_auth_failure_timeout() - This function is called to process Min * Channel Timeout during channel scan. * diff --git a/core/mac/src/pe/lim/lim_security_utils.c b/core/mac/src/pe/lim/lim_security_utils.c index 77edf9ff2842..a76eea60c45c 100644 --- a/core/mac/src/pe/lim/lim_security_utils.c +++ b/core/mac/src/pe/lim/lim_security_utils.c @@ -500,6 +500,15 @@ lim_restore_from_auth_state(tpAniSirGlobal pMac, tSirResultCodes resultCode, (pMac, TRACE_CODE_MLM_STATE, sessionEntry->peSessionId, sessionEntry->limMlmState)); + /* + * Set the auth_ack_status status flag as success as + * host have received the auth rsp and no longer auth + * retry is needed also cancel the auth rety timer + */ + pMac->auth_ack_status = LIM_AUTH_ACK_RCD_SUCCESS; + /* 'Change' timer for future activations */ + lim_deactivate_and_change_timer(pMac, eLIM_AUTH_RETRY_TIMER); + /* 'Change' timer for future activations */ lim_deactivate_and_change_timer(pMac, eLIM_AUTH_FAIL_TIMER); diff --git a/core/mac/src/pe/lim/lim_send_management_frames.c b/core/mac/src/pe/lim/lim_send_management_frames.c index e36f2a629d63..0b6d8bace2bb 100644 --- a/core/mac/src/pe/lim/lim_send_management_frames.c +++ b/core/mac/src/pe/lim/lim_send_management_frames.c @@ -2690,6 +2690,30 @@ end: } /* lim_send_reassoc_req_mgmt_frame */ /** + * lim_auth_tx_complete_cnf()- Confirmation for auth sent over the air + * + * @mac_ctx: pointer to global mac + * @tx_complete : Sent status + * + * Return: This returns QDF_STATUS + */ + +QDF_STATUS lim_auth_tx_complete_cnf(tpAniSirGlobal mac_ctx, + uint32_t tx_complete) +{ + lim_log(mac_ctx, LOG1, + FL("tx_complete= %d"), tx_complete); + if (tx_complete) { + mac_ctx->auth_ack_status = LIM_AUTH_ACK_RCD_SUCCESS; + /* 'Change' timer for future activations */ + lim_deactivate_and_change_timer(mac_ctx, eLIM_AUTH_RETRY_TIMER); + } else { + mac_ctx->auth_ack_status = LIM_AUTH_ACK_RCD_FAILURE; + } + return QDF_STATUS_SUCCESS; +} + +/** * lim_send_auth_mgmt_frame() - Send an Authentication frame * * @mac_ctx: Pointer to Global MAC structure @@ -2708,7 +2732,8 @@ void lim_send_auth_mgmt_frame(tpAniSirGlobal mac_ctx, tpSirMacAuthFrameBody auth_frame, tSirMacAddr peer_addr, - uint8_t wep_bit, tpPESession session) + uint8_t wep_bit, + tpPESession session, bool wait_for_ack) { uint8_t *frame, *body; uint32_t frame_len = 0, body_len = 0; @@ -2727,10 +2752,12 @@ lim_send_auth_mgmt_frame(tpAniSirGlobal mac_ctx, sme_sessionid = session->smeSessionId; lim_log(mac_ctx, LOG1, - FL("Sending Auth seq# %d status %d (%d) to " MAC_ADDRESS_STR), + FL("Sending Auth seq# %d status %d (%d) wait_for_ack %d to " + MAC_ADDRESS_STR), auth_frame->authTransactionSeqNumber, auth_frame->authStatusCode, (auth_frame->authStatusCode == eSIR_MAC_SUCCESS_STATUS), + wait_for_ack, MAC_ADDR_ARRAY(peer_addr)); switch (auth_frame->authTransactionSeqNumber) { @@ -2959,18 +2986,37 @@ lim_send_auth_mgmt_frame(tpAniSirGlobal mac_ctx, MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_MGMT, session->peSessionId, mac_hdr->fc.subType)); - /* Queue Authentication frame in high priority WQ */ - qdf_status = wma_tx_frame(mac_ctx, packet, (uint16_t) frame_len, - TXRX_FRM_802_11_MGMT, - ANI_TXDIR_TODS, 7, lim_tx_complete, - frame, tx_flag, sme_sessionid, 0); - MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, - session->peSessionId, qdf_status)); - if (!QDF_IS_STATUS_SUCCESS(qdf_status)) - lim_log(mac_ctx, LOGE, - FL("*** Could not send Auth frame, retCode=%X ***"), - qdf_status); + if (wait_for_ack) { + mac_ctx->auth_ack_status = LIM_AUTH_ACK_NOT_RCD; + qdf_status = wma_tx_frameWithTxComplete(mac_ctx, packet, + (uint16_t)frame_len, + TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, + 7, lim_tx_complete, frame, + lim_auth_tx_complete_cnf, + tx_flag, sme_sessionid, false, 0); + MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, + session->peSessionId, qdf_status)); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { + lim_log(mac_ctx, LOGE, + FL("*** Could not send Auth frame, retCode=%X ***"), + qdf_status); + mac_ctx->auth_ack_status = LIM_AUTH_ACK_RCD_FAILURE; + /* Pkt will be freed up by the callback */ + } + } else { + /* Queue Authentication frame in high priority WQ */ + qdf_status = wma_tx_frame(mac_ctx, packet, (uint16_t) frame_len, + TXRX_FRM_802_11_MGMT, + ANI_TXDIR_TODS, 7, lim_tx_complete, + frame, tx_flag, sme_sessionid, 0); + MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE, + session->peSessionId, qdf_status)); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) + lim_log(mac_ctx, LOGE, + FL("*** Could not send Auth frame, retCode=%X ***"), + qdf_status); + } return; } diff --git a/core/mac/src/pe/lim/lim_timer_utils.c b/core/mac/src/pe/lim/lim_timer_utils.c index 14222a61f14e..bcf3c68442c4 100644 --- a/core/mac/src/pe/lim/lim_timer_utils.c +++ b/core/mac/src/pe/lim/lim_timer_utils.c @@ -50,6 +50,9 @@ #define LIM_KEEPALIVE_TIMER_MS 3000 /* Lim JoinProbeRequest Retry timer default (200)ms */ #define LIM_JOIN_PROBE_REQ_TIMER_MS 200 +/* Lim Periodic Auth Retry timer default 60 ms */ +#define LIM_AUTH_RETRY_TIMER_MS 60 + /* This timer is a periodic timer which expires at every 1 sec to convert ACTIVE DFS channel to DFS channels */ @@ -122,6 +125,18 @@ lim_create_non_ap_timers(tpAniSirGlobal pMac) return false; } + /* Send Auth frame every 60 ms */ + if ((tx_timer_create(pMac, + &pMac->lim.limTimers.g_lim_periodic_auth_retry_timer, + "Periodic AUTH Timer", + lim_timer_handler, SIR_LIM_AUTH_RETRY_TIMEOUT, + SYS_MS_TO_TICKS(LIM_AUTH_RETRY_TIMER_MS), 0, + TX_NO_ACTIVATE)) != TX_SUCCESS) { + lim_log(pMac, LOGP, + FL("could not create Periodic AUTH Timer")); + return false; + } + if (wlan_cfg_get_int(pMac, WNI_CFG_ASSOCIATION_FAILURE_TIMEOUT, &cfgValue) != eSIR_SUCCESS) lim_log(pMac, LOGP, @@ -429,6 +444,7 @@ err_timer: tx_timer_delete(&pMac->lim.limTimers.gLimAssocFailureTimer); tx_timer_delete(&pMac->lim.limTimers.gLimJoinFailureTimer); tx_timer_delete(&pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer); + tx_timer_delete(&pMac->lim.limTimers.g_lim_periodic_auth_retry_timer); tx_timer_delete(&pMac->lim.limTimers.gLimQuietBssTimer); tx_timer_delete(&pMac->lim.limTimers.gLimQuietTimer); tx_timer_delete(&pMac->lim.limTimers.gLimChannelSwitchTimer); @@ -668,6 +684,7 @@ void lim_update_olbc_cache_timer_handler(void *pMacGlobal, uint32_t param) void lim_deactivate_and_change_timer(tpAniSirGlobal pMac, uint32_t timerId) { uint32_t val = 0; + tpPESession session_entry; MTRACE(mac_trace (pMac, TRACE_CODE_TIMER_DEACTIVATE, NO_SESSION, timerId)); @@ -799,6 +816,37 @@ void lim_deactivate_and_change_timer(tpAniSirGlobal pMac, uint32_t timerId) break; + case eLIM_AUTH_RETRY_TIMER: + + if (tx_timer_deactivate + (&pMac->lim.limTimers.g_lim_periodic_auth_retry_timer) + != TX_SUCCESS) { + /* Could not deactivate Auth Retry Timer. */ + lim_log(pMac, LOGE, + FL("Unable to deactivate Auth Retry timer")); + } + session_entry = pe_find_session_by_session_id(pMac, + pMac->lim.limTimers. + g_lim_periodic_auth_retry_timer.sessionId); + if (NULL == session_entry) { + lim_log(pMac, LOGE, + FL("session does not exist for given SessionId : %d"), + pMac->lim.limTimers. + g_lim_periodic_auth_retry_timer.sessionId); + break; + } + /* 3/5 of the beacon interval */ + val = (session_entry->beaconParams.beaconInterval * 3) / 5; + val = SYS_MS_TO_TICKS(val); + if (tx_timer_change + (&pMac->lim.limTimers.g_lim_periodic_auth_retry_timer, + val, 0) != TX_SUCCESS) { + /* Could not change Auth Retry timer. */ + lim_log(pMac, LOGE, + FL("Unable to change Auth Retry timer")); + } + break; + case eLIM_ASSOC_FAIL_TIMER: if (tx_timer_deactivate (&pMac->lim.limTimers.gLimAssocFailureTimer) != diff --git a/core/mac/src/pe/lim/lim_timer_utils.h b/core/mac/src/pe/lim/lim_timer_utils.h index 1f1af1daafb5..50f3ef4d0899 100644 --- a/core/mac/src/pe/lim/lim_timer_utils.h +++ b/core/mac/src/pe/lim/lim_timer_utils.h @@ -67,7 +67,8 @@ enum { eLIM_DEAUTH_ACK_TIMER, eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER, eLIM_INSERT_SINGLESHOT_NOA_TIMER, - eLIM_CONVERT_ACTIVE_CHANNEL_TO_PASSIVE + eLIM_CONVERT_ACTIVE_CHANNEL_TO_PASSIVE, + eLIM_AUTH_RETRY_TIMER }; #define LIM_DISASSOC_DEAUTH_ACK_TIMEOUT 500 diff --git a/core/mac/src/pe/lim/lim_trace.c b/core/mac/src/pe/lim/lim_trace.c index d287ca38ea60..89d9d02b9e15 100644 --- a/core/mac/src/pe/lim/lim_trace.c +++ b/core/mac/src/pe/lim/lim_trace.c @@ -79,6 +79,7 @@ static uint8_t *__lim_trace_get_timer_string(uint16_t timerId) CASE_RETURN_STRING(eLIM_PERIODIC_JOIN_PROBE_REQ_TIMER); CASE_RETURN_STRING(eLIM_INSERT_SINGLESHOT_NOA_TIMER); CASE_RETURN_STRING(eLIM_CONVERT_ACTIVE_CHANNEL_TO_PASSIVE); + CASE_RETURN_STRING(eLIM_AUTH_RETRY_TIMER); default: return "UNKNOWN"; break; diff --git a/core/mac/src/pe/lim/lim_types.h b/core/mac/src/pe/lim/lim_types.h index c6067ac77ea4..616147cd8cdc 100644 --- a/core/mac/src/pe/lim/lim_types.h +++ b/core/mac/src/pe/lim/lim_types.h @@ -456,7 +456,7 @@ tSirRetStatus lim_send_probe_req_mgmt_frame(tpAniSirGlobal, tSirMacSSid *, void lim_send_probe_rsp_mgmt_frame(tpAniSirGlobal, tSirMacAddr, tpAniSSID, short, uint8_t, tpPESession, uint8_t); void lim_send_auth_mgmt_frame(tpAniSirGlobal, tSirMacAuthFrameBody *, tSirMacAddr, - uint8_t, tpPESession); + uint8_t, tpPESession, bool wait_for_ack); void lim_send_assoc_req_mgmt_frame(tpAniSirGlobal, tLimMlmAssocReq *, tpPESession); void lim_send_reassoc_req_mgmt_frame(tpAniSirGlobal, tLimMlmReassocReq *, tpPESession); diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index 16eabf4c7ea1..23af25a3be6e 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -625,6 +625,11 @@ void lim_cleanup_mlm(tpAniSirGlobal mac_ctx) tx_timer_deactivate(&lim_timer->gLimPeriodicJoinProbeReqTimer); tx_timer_delete(&lim_timer->gLimPeriodicJoinProbeReqTimer); + /* Deactivate and delete Auth Retry timer. */ + tx_timer_deactivate + (&lim_timer->g_lim_periodic_auth_retry_timer); + tx_timer_delete(&lim_timer->g_lim_periodic_auth_retry_timer); + /* Deactivate and delete Association failure timer. */ tx_timer_deactivate(&lim_timer->gLimAssocFailureTimer); tx_timer_delete(&lim_timer->gLimAssocFailureTimer); diff --git a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c index b249ed6d8d2a..e9adfc85fafc 100644 --- a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c +++ b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c @@ -654,6 +654,7 @@ uint8_t *mac_trace_get_lim_msg_string(uint16_t lim_msg) CASE_RETURN_STRING(SIR_LIM_DISASSOC_ACK_TIMEOUT); CASE_RETURN_STRING(SIR_LIM_DEAUTH_ACK_TIMEOUT); CASE_RETURN_STRING(SIR_LIM_PERIODIC_JOIN_PROBE_REQ_TIMEOUT); + CASE_RETURN_STRING(SIR_LIM_AUTH_RETRY_TIMEOUT); CASE_RETURN_STRING(SIR_LIM_MSG_TYPES_END); default: |
