Browse Source

qcacld-3.0: Save processed AUTH frames seq number in pe_session

In case STAUT is using auto-switch auth type for WEP, a retried AUTH frame
from AP can mess up our state machine and connection will fail. Save seq
number of processed auth so that retried frame can be dropped in host.

Change-Id: I00cedf594309e0bb9b4bb8f0ced2929e7d00f64d
CRs-Fixed: 2102402
Naveen Rawat 7 years ago
parent
commit
6fc3c50ad0

+ 2 - 0
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;
 
 /*-------------------------------------------------------------------------

+ 10 - 0
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 */

+ 2 - 0
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];
 }