From fcc22e0b94073b33d2dfdff3de55961774fd1bcd Mon Sep 17 00:00:00 2001 From: Abhinav Kumar Date: Fri, 23 Mar 2018 16:46:06 +0530 Subject: [PATCH] qcacld-3.0: Drop duplicate Beacon Report request Currently, driver does not check for duplication of rrm request. If driver receives any duplicate rrm request, then driver sends pilot frame for second rrm request which is not acceptable. Add changes to drop all duplicate rrm requests to fix this. Change-Id: I44a67a4119ae55ac94f5c9ecdb01032f6fd39c7c CRs-Fixed: 2195990 --- core/mac/src/pe/include/rrm_global.h | 3 ++- core/mac/src/pe/lim/lim_process_action_frame.c | 12 ++++++++++++ core/mac/src/pe/rrm/rrm_api.c | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/mac/src/pe/include/rrm_global.h b/core/mac/src/pe/include/rrm_global.h index d8afcfa50e7f..e963ca276ed8 100644 --- a/core/mac/src/pe/include/rrm_global.h +++ b/core/mac/src/pe/include/rrm_global.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2012, 2014-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2012, 2014-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -217,6 +217,7 @@ typedef struct sRrmPEContext { int8_t txMgmtPower; /* Dialog token for the request initiated from station. */ uint8_t DialogToken; + uint16_t prev_rrm_report_seq_num; tpRRMReq pCurrentReq; } tRrmPEContext, *tpRrmPEContext; diff --git a/core/mac/src/pe/lim/lim_process_action_frame.c b/core/mac/src/pe/lim/lim_process_action_frame.c index 347b72c87ed2..3a1a691a6974 100644 --- a/core/mac/src/pe/lim/lim_process_action_frame.c +++ b/core/mac/src/pe/lim/lim_process_action_frame.c @@ -1298,6 +1298,7 @@ __lim_process_radio_measure_request(tpAniSirGlobal pMac, uint8_t *pRxPacketInfo, tDot11fRadioMeasurementRequest *frm; uint32_t frameLen, nStatus; uint8_t *pBody; + uint16_t curr_seq_num; pHdr = WMA_GET_RX_MAC_HEADER(pRxPacketInfo); pBody = WMA_GET_RX_MPDU_DATA(pRxPacketInfo); @@ -1307,6 +1308,17 @@ __lim_process_radio_measure_request(tpAniSirGlobal pMac, uint8_t *pRxPacketInfo, return; } + curr_seq_num = ((pHdr->seqControl.seqNumHi << + HIGH_SEQ_NUM_OFFSET) | + pHdr->seqControl.seqNumLo); + if (curr_seq_num == pMac->rrm.rrmPEContext.prev_rrm_report_seq_num && + pMac->rrm.rrmPEContext.pCurrentReq) { + pe_err("rrm report req frame, seq num: %d is already in progress, drop it", + curr_seq_num); + return; + } + /* Save seq no of currently processing rrm report req frame */ + pMac->rrm.rrmPEContext.prev_rrm_report_seq_num = curr_seq_num; lim_send_sme_mgmt_frame_ind(pMac, pHdr->fc.subType, (uint8_t *)pHdr, frameLen + sizeof(tSirMacMgmtHdr), 0, WMA_GET_RX_CH(pRxPacketInfo), psessionEntry, diff --git a/core/mac/src/pe/rrm/rrm_api.c b/core/mac/src/pe/rrm/rrm_api.c index 2dc7996e0c2d..6d61481e8b14 100644 --- a/core/mac/src/pe/rrm/rrm_api.c +++ b/core/mac/src/pe/rrm/rrm_api.c @@ -1254,6 +1254,7 @@ tSirRetStatus rrm_initialize(tpAniSirGlobal pMac) pMac->rrm.rrmPEContext.DialogToken = 0; pMac->rrm.rrmPEContext.rrmEnable = 0; + pMac->rrm.rrmPEContext.prev_rrm_report_seq_num = 0xFFFF; qdf_mem_set(pRRMCaps, sizeof(tRRMCaps), 0); pRRMCaps->LinkMeasurement = 1;