diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h index 29aa56faa3e0..da68e93d4b40 100644 --- a/core/mac/src/pe/include/lim_session.h +++ b/core/mac/src/pe/include/lim_session.h @@ -522,6 +522,8 @@ typedef struct sPESession /* Added to Support BT-AMP */ #ifdef WLAN_FEATURE_FILS_SK struct pe_fils_session *fils_info; #endif + /* previous auth frame's sequence number */ + uint16_t prev_auth_seq_num; } 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 0fdc1c119ea1..d2682c6d3982 100644 --- a/core/mac/src/pe/lim/lim_process_auth_frame.c +++ b/core/mac/src/pe/lim/lim_process_auth_frame.c @@ -1093,6 +1093,16 @@ 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->pePersona == QDF_STA_MODE && + 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 */ diff --git a/core/mac/src/pe/lim/lim_session.c b/core/mac/src/pe/lim/lim_session.c index ffc1ad735410..07f411afc5fd 100644 --- a/core/mac/src/pe/lim/lim_session.c +++ b/core/mac/src/pe/lim/lim_session.c @@ -539,6 +539,8 @@ pe_create_session(tpAniSirGlobal pMac, uint8_t *bssid, uint8_t *sessionId, pe_init_fils_info(session_ptr); pe_init_pmf_comeback_timer(pMac, session_ptr, *sessionId); session_ptr->ht_client_cnt = 0; + /* following is invalid value since seq number is 12 bit */ + session_ptr->prev_auth_seq_num = 0xFFFF; return &pMac->lim.gpSession[i]; }