From 7cf307e148d2ed065b73a6aec4f0a6139c8cb499 Mon Sep 17 00:00:00 2001 From: Yeshwanth Sriram Guntuka Date: Tue, 26 Dec 2017 12:59:14 +0530 Subject: [PATCH] qcacld-3.0: Save previous auth algo in pe session DUT retries auth with open system if shared key authentication is not supported by AP. If auth response from AP for open system auth has same sequence number as that of shared key response, host drops the frame. Fix is to drop the auth frame only if previous sequence number and auth algo match with current sequence number and auth algo. Change-Id: Ia02408d72371dfb91a7cae190ae9399cdf2e2e8b CRs-Fixed: 2163231 --- core/mac/src/pe/include/lim_session.h | 2 ++ core/mac/src/pe/lim/lim_process_auth_frame.c | 21 +++++++++++--------- core/mac/src/pe/lim/lim_session.c | 1 + 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h index f673c350143f..3e3192427ff6 100644 --- a/core/mac/src/pe/include/lim_session.h +++ b/core/mac/src/pe/include/lim_session.h @@ -528,6 +528,8 @@ typedef struct sPESession /* Added to Support BT-AMP */ #endif /* previous auth frame's sequence number */ uint16_t prev_auth_seq_num; + /* previous auth algo */ + uint16_t prev_auth_algo; } tPESession, *tpPESession; /*------------------------------------------------------------------------- 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 0087c6ca7861..e2d576e40a3e 100644 --- a/core/mac/src/pe/lim/lim_process_auth_frame.c +++ b/core/mac/src/pe/lim/lim_process_auth_frame.c @@ -1096,15 +1096,6 @@ lim_process_auth_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, pe_session->limMlmState, MAC_ADDR_ARRAY(mac_hdr->bssId), (uint) abs((int8_t) WMA_GET_RX_RSSI_NORMALIZED(rx_pkt_info))); - if (pe_session->prev_auth_seq_num == curr_seq_num) { - pe_err("auth frame, seq num: %d is already processed, drop it", - curr_seq_num); - return; - } - - /* save seq number in pe_session */ - pe_session->prev_auth_seq_num = curr_seq_num; - body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info); /* Restore default failure timeout */ @@ -1344,6 +1335,18 @@ lim_process_auth_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, goto free; } + if (pe_session->prev_auth_seq_num == curr_seq_num && + pe_session->prev_auth_algo == rx_auth_frame->authAlgoNumber) { + pe_err("auth frame, seq num: %d is already processed, drop it", + curr_seq_num); + goto free; + } + + /* save seq number in pe_session */ + pe_session->prev_auth_seq_num = curr_seq_num; + + pe_session->prev_auth_algo = rx_auth_frame->authAlgoNumber; + rx_auth_frm_body = rx_auth_frame; pe_debug("Received Auth frame with type: %d seqnum: %d status: %d %d", diff --git a/core/mac/src/pe/lim/lim_session.c b/core/mac/src/pe/lim/lim_session.c index 79fe6723efa7..b9d23949aa74 100644 --- a/core/mac/src/pe/lim/lim_session.c +++ b/core/mac/src/pe/lim/lim_session.c @@ -541,6 +541,7 @@ pe_create_session(tpAniSirGlobal pMac, uint8_t *bssid, uint8_t *sessionId, session_ptr->ht_client_cnt = 0; /* following is invalid value since seq number is 12 bit */ session_ptr->prev_auth_seq_num = 0xFFFF; + session_ptr->prev_auth_algo = 0xFFFF; return &pMac->lim.gpSession[i]; }