qcacld-3.0: Move the code related to sending roam frames to a separate file

Move the routines which help in building and sending the roaming
related management frames into a separate file for easy
maintenance across different projects

CRs-Fixed: 978905
Change-Id: If8e5cbdabef7747e58359961c3b13c577eb3b777
diff --git a/Kbuild b/Kbuild
index a9c5967..14375b1 100755
--- a/Kbuild
+++ b/Kbuild
@@ -427,6 +427,7 @@
 		$(MAC_SRC_DIR)/pe/lim/lim_scan_result_utils.o \
 		$(MAC_SRC_DIR)/pe/lim/lim_security_utils.o \
 		$(MAC_SRC_DIR)/pe/lim/lim_send_management_frames.o \
+		$(MAC_SRC_DIR)/pe/lim/lim_send_frames_host_roam.o \
 		$(MAC_SRC_DIR)/pe/lim/lim_send_messages.o \
 		$(MAC_SRC_DIR)/pe/lim/lim_send_sme_rsp_messages.o \
 		$(MAC_SRC_DIR)/pe/lim/lim_ser_des_utils.o \
diff --git a/core/mac/src/pe/lim/lim_send_frames_host_roam.c b/core/mac/src/pe/lim/lim_send_frames_host_roam.c
new file mode 100644
index 0000000..b4cff73
--- /dev/null
+++ b/core/mac/src/pe/lim/lim_send_frames_host_roam.c
@@ -0,0 +1,801 @@
+/*
+ * Copyright (c) 2016 The Linux Foundation. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: lim_send_frames_host_roam.c
+ *
+ * Send management frames for host based roaming
+ */
+#include "sir_api.h"
+#include "ani_global.h"
+#include "sir_mac_prot_def.h"
+#include "cfg_api.h"
+#include "utils_api.h"
+#include "lim_types.h"
+#include "lim_utils.h"
+#include "lim_security_utils.h"
+#include "lim_prop_exts_utils.h"
+#include "dot11f.h"
+#include "lim_sta_hash_api.h"
+#include "sch_api.h"
+#include "lim_send_messages.h"
+#include "lim_assoc_utils.h"
+#include "lim_ft.h"
+#ifdef WLAN_FEATURE_11W
+#include "wni_cfg.h"
+#endif
+
+#include "lim_ft_defs.h"
+#include "lim_session.h"
+#include "qdf_types.h"
+#include "qdf_trace.h"
+#include "cds_utils.h"
+#include "sme_trace.h"
+#include "rrm_api.h"
+
+#include "wma_types.h"
+
+/**
+ * lim_send_reassoc_req_with_ft_ies_mgmt_frame() - Send Reassoc Req with FTIEs.
+ *
+ * @mac_ctx: Handle to mac context
+ * @mlm_reassoc_req: Original reassoc request
+ * @pe_session: PE session information
+ *
+ * It builds a reassoc request with FT IEs and sends it to AP through WMA.
+ * Then it creates assoc request and stores it for sending after join
+ * confirmation.
+ *
+ * Return: None
+ */
+void lim_send_reassoc_req_with_ft_ies_mgmt_frame(tpAniSirGlobal mac_ctx,
+	tLimMlmReassocReq *mlm_reassoc_req,
+	tpPESession pe_session)
+{
+	static tDot11fReAssocRequest frm;
+	uint16_t caps;
+	uint8_t *frame;
+	uint32_t bytes, payload, status;
+	uint8_t qos_enabled, wme_enabled, wsm_enabled;
+	void *packet;
+	QDF_STATUS qdf_status;
+	uint8_t power_caps_populated = false;
+	uint16_t ft_ies_length = 0;
+	uint8_t *body;
+	uint16_t add_ie_len;
+	uint8_t *add_ie;
+	uint8_t *wps_ie = NULL;
+	uint8_t tx_flag = 0;
+	uint8_t sme_sessionid = 0;
+	bool vht_enabled = false;
+	tpSirMacMgmtHdr mac_hdr;
+	tftSMEContext *ft_sme_context;
+
+	if (NULL == pe_session)
+		return;
+
+	sme_sessionid = pe_session->smeSessionId;
+
+	/* check this early to avoid unncessary operation */
+	if (NULL == pe_session->pLimReAssocReq)
+		return;
+
+	add_ie_len = pe_session->pLimReAssocReq->addIEAssoc.length;
+	add_ie = pe_session->pLimReAssocReq->addIEAssoc.addIEdata;
+	lim_log(mac_ctx, LOG1,
+		FL("called in state (%d)."), pe_session->limMlmState);
+
+	qdf_mem_set((uint8_t *) &frm, sizeof(frm), 0);
+
+	caps = mlm_reassoc_req->capabilityInfo;
+#if defined(FEATURE_WLAN_WAPI)
+	/*
+	 * According to WAPI standard:
+	 * 7.3.1.4 Capability Information field
+	 * In WAPI, non-AP STAs within an ESS set the Privacy subfield
+	 * to 0 in transmitted Association or Reassociation management
+	 * frames. APs ignore the Privacy subfield within received
+	 * Association and Reassociation management frames.
+	 */
+	if (pe_session->encryptType == eSIR_ED_WPI)
+		((tSirMacCapabilityInfo *) &caps)->privacy = 0;
+#endif
+	swap_bit_field16(caps, (uint16_t *) &frm.Capabilities);
+
+	frm.ListenInterval.interval = mlm_reassoc_req->listenInterval;
+
+	/*
+	 * Get the old bssid of the older AP.
+	 * The previous ap bssid is stored in the FT Session
+	 * while creating the PE FT Session for reassociation.
+	 */
+	qdf_mem_copy((uint8_t *)frm.CurrentAPAddress.mac,
+			pe_session->prev_ap_bssid, sizeof(tSirMacAddr));
+
+	populate_dot11f_ssid2(mac_ctx, &frm.SSID);
+	populate_dot11f_supp_rates(mac_ctx, POPULATE_DOT11F_RATES_OPERATIONAL,
+		&frm.SuppRates, pe_session);
+
+	qos_enabled = (pe_session->limQosEnabled) &&
+		      SIR_MAC_GET_QOS(pe_session->limReassocBssCaps);
+
+	wme_enabled = (pe_session->limWmeEnabled) &&
+		      LIM_BSS_CAPS_GET(WME, pe_session->limReassocBssQosCaps);
+
+	wsm_enabled = (pe_session->limWsmEnabled) && wme_enabled &&
+		      LIM_BSS_CAPS_GET(WSM, pe_session->limReassocBssQosCaps);
+
+	if (pe_session->lim11hEnable &&
+	    pe_session->pLimReAssocReq->spectrumMgtIndicator == eSIR_TRUE) {
+		power_caps_populated = true;
+
+		populate_dot11f_power_caps(mac_ctx, &frm.PowerCaps,
+					   LIM_REASSOC, pe_session);
+		populate_dot11f_supp_channels(mac_ctx, &frm.SuppChannels,
+			LIM_REASSOC, pe_session);
+	}
+	if (mac_ctx->rrm.rrmPEContext.rrmEnable &&
+	    SIR_MAC_GET_RRM(pe_session->limCurrentBssCaps)) {
+		if (power_caps_populated == false) {
+			power_caps_populated = true;
+			populate_dot11f_power_caps(mac_ctx, &frm.PowerCaps,
+				LIM_REASSOC, pe_session);
+		}
+	}
+
+	if (qos_enabled)
+		populate_dot11f_qos_caps_station(mac_ctx, &frm.QOSCapsStation);
+
+	populate_dot11f_ext_supp_rates(mac_ctx,
+		POPULATE_DOT11F_RATES_OPERATIONAL, &frm.ExtSuppRates,
+		pe_session);
+
+	if (mac_ctx->rrm.rrmPEContext.rrmEnable &&
+	    SIR_MAC_GET_RRM(pe_session->limCurrentBssCaps))
+		populate_dot11f_rrm_ie(mac_ctx, &frm.RRMEnabledCap, pe_session);
+
+	/*
+	 * Ideally this should be enabled for 11r also. But 11r does
+	 * not follow the usual norm of using the Opaque object
+	 * for rsnie and fties. Instead we just add the rsnie and fties
+	 * at the end of the pack routine for 11r.
+	 * This should ideally! be fixed.
+	 */
+	/*
+	 * The join request *should* contain zero or one of the WPA and RSN
+	 * IEs.  The payload send along with the request is a
+	 * 'tSirSmeJoinReq'; the IE portion is held inside a 'tSirRSNie':
+	 *
+	 *     typedef struct sSirRSNie
+	 *     {
+	 *         uint16_t       length;
+	 *         uint8_t        rsnIEdata[SIR_MAC_MAX_IE_LENGTH+2];
+	 *     } tSirRSNie, *tpSirRSNie;
+	 *
+	 * So, we should be able to make the following two calls harmlessly,
+	 * since they do nothing if they don't find the given IE in the
+	 * bytestream with which they're provided.
+	 *
+	 * The net effect of this will be to faithfully transmit whatever
+	 * security IE is in the join request.
+
+	 * However, if we're associating for the purpose of WPS
+	 * enrollment, and we've been configured to indicate that by
+	 * eliding the WPA or RSN IE, we just skip this:
+	 */
+	if (!pe_session->is11Rconnection) {
+		if (add_ie_len && add_ie)
+			wps_ie = limGetWscIEPtr(mac_ctx, add_ie, add_ie_len);
+		if (NULL == wps_ie) {
+			populate_dot11f_rsn_opaque(mac_ctx,
+				&(pe_session->pLimReAssocReq->rsnIE),
+				&frm.RSNOpaque);
+			populate_dot11f_wpa_opaque(mac_ctx,
+				&(pe_session->pLimReAssocReq->rsnIE),
+				&frm.WPAOpaque);
+		}
+#ifdef FEATURE_WLAN_ESE
+		if (pe_session->pLimReAssocReq->cckmIE.length) {
+			populate_dot11f_ese_cckm_opaque(mac_ctx,
+				&(pe_session->pLimReAssocReq->cckmIE),
+				&frm.ESECckmOpaque);
+		}
+#endif
+	}
+#ifdef FEATURE_WLAN_ESE
+	/*
+	 * ESE Version IE will be included in re-association request
+	 * when ESE is enabled on DUT through ini and it is also
+	 * advertised by the peer AP to which we are trying to
+	 * associate to.
+	 */
+	if (pe_session->is_ese_version_ie_present &&
+		mac_ctx->roam.configParam.isEseIniFeatureEnabled)
+		populate_dot11f_ese_version(&frm.ESEVersion);
+	/* For ESE Associations fill the ESE IEs */
+	if (pe_session->isESEconnection &&
+	    pe_session->pLimReAssocReq->isESEFeatureIniEnabled) {
+#ifndef FEATURE_DISABLE_RM
+		populate_dot11f_ese_rad_mgmt_cap(&frm.ESERadMgmtCap);
+#endif
+	}
+#endif /* FEATURE_WLAN_ESE */
+
+	/* include WME EDCA IE as well */
+	if (wme_enabled) {
+		populate_dot11f_wmm_info_station_per_session(mac_ctx,
+			pe_session, &frm.WMMInfoStation);
+		if (wsm_enabled)
+			populate_dot11f_wmm_caps(&frm.WMMCaps);
+#ifdef FEATURE_WLAN_ESE
+		if (pe_session->isESEconnection) {
+			uint32_t phymode;
+			uint8_t rate;
+
+			populate_dot11f_re_assoc_tspec(mac_ctx, &frm,
+				pe_session);
+
+			/*
+			 * Populate the TSRS IE if TSPEC is included in
+			 * the reassoc request
+			 */
+			lim_get_phy_mode(mac_ctx, &phymode, pe_session);
+			if (phymode == WNI_CFG_PHY_MODE_11G ||
+			    phymode == WNI_CFG_PHY_MODE_11A)
+				rate = TSRS_11AG_RATE_6MBPS;
+			else
+				rate = TSRS_11B_RATE_5_5MBPS;
+
+			if (pe_session->pLimReAssocReq->eseTspecInfo.
+			    numTspecs) {
+				tSirMacESETSRSIE tsrs_ie;
+
+				tsrs_ie.tsid = 0;
+				tsrs_ie.rates[0] = rate;
+				populate_dot11_tsrsie(mac_ctx, &tsrs_ie,
+					&frm.ESETrafStrmRateSet,
+					sizeof(uint8_t));
+			}
+		}
+#endif
+	}
+
+	ft_sme_context = &mac_ctx->roam.roamSession[sme_sessionid].ftSmeContext;
+	if (pe_session->htCapability &&
+	    mac_ctx->lim.htCapabilityPresentInBeacon) {
+		populate_dot11f_ht_caps(mac_ctx, pe_session, &frm.HTCaps);
+	}
+	if (pe_session->pLimReAssocReq->bssDescription.mdiePresent &&
+	    (ft_sme_context->addMDIE == true)
+#if defined FEATURE_WLAN_ESE
+	    && !pe_session->isESEconnection
+#endif
+	    ) {
+		populate_mdie(mac_ctx, &frm.MobilityDomain,
+			pe_session->pLimReAssocReq->bssDescription.mdie);
+	}
+	if (pe_session->vhtCapability &&
+	    pe_session->vhtCapabilityPresentInBeacon) {
+		lim_log(mac_ctx, LOG1,
+			FL("Populate VHT IEs in Re-Assoc Request"));
+		populate_dot11f_vht_caps(mac_ctx, pe_session, &frm.VHTCaps);
+		vht_enabled = true;
+		populate_dot11f_ext_cap(mac_ctx, vht_enabled, &frm.ExtCap,
+			pe_session);
+	}
+	if (!vht_enabled &&
+			pe_session->is_vendor_specific_vhtcaps) {
+		lim_log(mac_ctx, LOG1,
+			FL("Populate Vendor VHT IEs in Re-Assoc Request"));
+		frm.vendor2_ie.present = 1;
+		frm.vendor2_ie.type =
+			pe_session->vendor_specific_vht_ie_type;
+		frm.vendor2_ie.sub_type =
+			pe_session->vendor_specific_vht_ie_sub_type;
+		frm.vendor2_ie.VHTCaps.present = 1;
+		populate_dot11f_vht_caps(mac_ctx, pe_session,
+				&frm.vendor2_ie.VHTCaps);
+		vht_enabled = true;
+	}
+	status = dot11f_get_packed_re_assoc_request_size(mac_ctx, &frm,
+			&payload);
+	if (DOT11F_FAILED(status)) {
+		lim_log(mac_ctx, LOGP,
+			FL("Failure in size calculation (0x%08x)."), status);
+		/* We'll fall back on the worst case scenario: */
+		payload = sizeof(tDot11fReAssocRequest);
+	} else if (DOT11F_WARNED(status)) {
+		lim_log(mac_ctx, LOGW,
+			FL("Warnings in size calculation(0x%08x)."), status);
+	}
+
+	bytes = payload + sizeof(tSirMacMgmtHdr) + add_ie_len;
+
+	lim_log(mac_ctx, LOG1, FL("FT IE Reassoc Req (%d)."),
+		ft_sme_context->reassoc_ft_ies_length);
+
+	if (pe_session->is11Rconnection)
+		ft_ies_length = ft_sme_context->reassoc_ft_ies_length;
+
+	qdf_status = cds_packet_alloc((uint16_t) bytes + ft_ies_length,
+				 (void **)&frame, (void **)&packet);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+		pe_session->limMlmState = pe_session->limPrevMlmState;
+		MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_MLM_STATE,
+				 pe_session->peSessionId,
+				 pe_session->limMlmState));
+		lim_log(mac_ctx, LOGP, FL("Failed to alloc memory %d"), bytes);
+		goto end;
+	}
+	/* Paranoia: */
+	qdf_mem_set(frame, bytes + ft_ies_length, 0);
+
+	lim_print_mac_addr(mac_ctx, pe_session->limReAssocbssId, LOG1);
+	/* Next, we fill out the buffer descriptor: */
+	lim_populate_mac_header(mac_ctx, frame, SIR_MAC_MGMT_FRAME,
+		SIR_MAC_MGMT_REASSOC_REQ, pe_session->limReAssocbssId,
+		pe_session->selfMacAddr);
+	mac_hdr = (tpSirMacMgmtHdr) frame;
+	/* That done, pack the ReAssoc Request: */
+	status = dot11f_pack_re_assoc_request(mac_ctx, &frm, frame +
+					       sizeof(tSirMacMgmtHdr),
+					       payload, &payload);
+	if (DOT11F_FAILED(status)) {
+		lim_log(mac_ctx, LOGE, FL("Failure in pack (0x%08x)."), status);
+		cds_packet_free((void *)packet);
+		goto end;
+	} else if (DOT11F_WARNED(status)) {
+		lim_log(mac_ctx, LOGW, FL("Warnings in pack (0x%08x)."),
+			status);
+	}
+
+	lim_log(mac_ctx, LOG3,
+		       FL("*** Sending Re-Assoc Request length %d %d to "),
+		       bytes, payload);
+
+	if (pe_session->assocReq != NULL) {
+		qdf_mem_free(pe_session->assocReq);
+		pe_session->assocReq = NULL;
+		pe_session->assocReqLen = 0;
+	}
+
+	if (add_ie_len) {
+		qdf_mem_copy(frame + sizeof(tSirMacMgmtHdr) + payload,
+			     add_ie, add_ie_len);
+		payload += add_ie_len;
+	}
+
+	pe_session->assocReq = qdf_mem_malloc(payload);
+	if (NULL == pe_session->assocReq) {
+		lim_log(mac_ctx, LOGE, FL("Failed to alloc memory"));
+	} else {
+		/*
+		 * Store the Assoc request. This is sent to csr/hdd in
+		 * join cnf response.
+		 */
+		qdf_mem_copy(pe_session->assocReq,
+			     frame + sizeof(tSirMacMgmtHdr), payload);
+		pe_session->assocReqLen = payload;
+	}
+
+	if (pe_session->is11Rconnection && ft_sme_context->reassoc_ft_ies) {
+		int i = 0;
+
+		body = frame + bytes;
+		for (i = 0; i < ft_ies_length; i++) {
+			*body = ft_sme_context->reassoc_ft_ies[i];
+			body++;
+		}
+	}
+	lim_log(mac_ctx, LOG1, FL("Re-assoc Req Frame is: "));
+	       sir_dump_buf(mac_ctx, SIR_LIM_MODULE_ID, LOG1,
+			    (uint8_t *) frame, (bytes + ft_ies_length));
+	if ((SIR_BAND_5_GHZ ==
+	     lim_get_rf_band(pe_session->currentOperChannel)) ||
+	    (pe_session->pePersona == QDF_P2P_CLIENT_MODE) ||
+	    (pe_session->pePersona == QDF_P2P_GO_MODE)) {
+		tx_flag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
+	}
+
+	if (NULL != pe_session->assocReq) {
+		qdf_mem_free(pe_session->assocReq);
+		pe_session->assocReq = NULL;
+		pe_session->assocReqLen = 0;
+	}
+	if (ft_ies_length) {
+		pe_session->assocReq = qdf_mem_malloc(ft_ies_length);
+		if (NULL == pe_session->assocReq) {
+			lim_log(mac_ctx,
+				LOGE, FL("Failed to alloc memory for FT IEs"));
+			pe_session->assocReqLen = 0;
+		} else {
+			/*
+			 * Store the FT IEs. This is sent to csr/hdd in
+			 * join cnf response.
+			 */
+			qdf_mem_copy(pe_session->assocReq,
+				ft_sme_context->reassoc_ft_ies, ft_ies_length);
+			pe_session->assocReqLen = ft_ies_length;
+		}
+	} else {
+		lim_log(mac_ctx, LOG1, FL("FT IEs not present"));
+		pe_session->assocReqLen = 0;
+	}
+
+#ifdef FEATURE_WLAN_DIAG_SUPPORT
+	lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_REASSOC_START_EVENT,
+			      pe_session, eSIR_SUCCESS, eSIR_SUCCESS);
+#endif
+	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_MGMT,
+			 pe_session->peSessionId, mac_hdr->fc.subType));
+	qdf_status = wma_tx_frame(mac_ctx, packet,
+				(uint16_t) (bytes + ft_ies_length),
+				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,
+		       pe_session->peSessionId, qdf_status));
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+		lim_log(mac_ctx, LOGE,
+			FL("Failed to send Re-Assoc Request (%X)!"),
+			qdf_status);
+	}
+
+end:
+	/* Free up buffer allocated for mlmAssocReq */
+	qdf_mem_free(mlm_reassoc_req);
+	pe_session->pLimMlmReassocReq = NULL;
+
+}
+
+/**
+ * lim_send_retry_reassoc_req_frame() - Retry for reassociation
+ * @pMac: Global MAC Context
+ * @pMlmReassocReq: Request buffer to be sent
+ * @psessionEntry: PE Session
+ *
+ * Return: None
+ */
+void lim_send_retry_reassoc_req_frame(tpAniSirGlobal pMac,
+				      tLimMlmReassocReq *pMlmReassocReq,
+				      tpPESession psessionEntry)
+{
+	tLimMlmReassocCnf mlmReassocCnf;        /* keep sme */
+	tLimMlmReassocReq *pTmpMlmReassocReq = NULL;
+	if (NULL == pTmpMlmReassocReq) {
+		pTmpMlmReassocReq = qdf_mem_malloc(sizeof(tLimMlmReassocReq));
+		if (NULL == pTmpMlmReassocReq)
+			goto end;
+		qdf_mem_set(pTmpMlmReassocReq, sizeof(tLimMlmReassocReq), 0);
+		qdf_mem_copy(pTmpMlmReassocReq, pMlmReassocReq,
+			     sizeof(tLimMlmReassocReq));
+	}
+	/* Prepare and send Reassociation request frame */
+	/* start reassoc timer. */
+	pMac->lim.limTimers.gLimReassocFailureTimer.sessionId =
+		psessionEntry->peSessionId;
+	/* Start reassociation failure timer */
+	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TIMER_ACTIVATE,
+			 psessionEntry->peSessionId, eLIM_REASSOC_FAIL_TIMER));
+	if (tx_timer_activate(&pMac->lim.limTimers.gLimReassocFailureTimer)
+	    != TX_SUCCESS) {
+		/* Could not start reassoc failure timer. */
+		/* Log error */
+		lim_log(pMac, LOGP,
+			FL("could not start Reassociation failure timer"));
+		/* Return Reassoc confirm with */
+		/* Resources Unavailable */
+		mlmReassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
+		mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
+		goto end;
+	}
+
+	lim_send_reassoc_req_with_ft_ies_mgmt_frame(pMac, pTmpMlmReassocReq,
+						    psessionEntry);
+	return;
+
+end:
+	/* Free up buffer allocated for reassocReq */
+	if (pMlmReassocReq != NULL) {
+		qdf_mem_free(pMlmReassocReq);
+		pMlmReassocReq = NULL;
+	}
+	if (pTmpMlmReassocReq != NULL) {
+		qdf_mem_free(pTmpMlmReassocReq);
+		pTmpMlmReassocReq = NULL;
+	}
+	mlmReassocCnf.resultCode = eSIR_SME_FT_REASSOC_FAILURE;
+	mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
+	/* Update PE sessio Id */
+	mlmReassocCnf.sessionId = psessionEntry->peSessionId;
+
+	lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
+			     (uint32_t *) &mlmReassocCnf);
+}
+
+/**
+ * lim_send_reassoc_req_mgmt_frame() - Send the reassociation frame
+ * @pMac: Global MAC Context
+ * @pMlmReassocReq: Reassociation request buffer to be sent
+ * @psessionEntry: PE Session
+ *
+ * Return: None
+ */
+void lim_send_reassoc_req_mgmt_frame(tpAniSirGlobal pMac,
+				tLimMlmReassocReq *pMlmReassocReq,
+				tpPESession psessionEntry)
+{
+	static tDot11fReAssocRequest frm;
+	uint16_t caps;
+	uint8_t *pFrame;
+	uint32_t nBytes, nPayload, nStatus;
+	uint8_t fQosEnabled, fWmeEnabled, fWsmEnabled;
+	void *pPacket;
+	QDF_STATUS qdf_status;
+	uint16_t nAddIELen;
+	uint8_t *pAddIE;
+	uint8_t *wpsIe = NULL;
+	uint8_t txFlag = 0;
+	uint8_t PowerCapsPopulated = false;
+	uint8_t smeSessionId = 0;
+	bool isVHTEnabled = false;
+	tpSirMacMgmtHdr pMacHdr;
+
+	if (NULL == psessionEntry)
+		return;
+
+	smeSessionId = psessionEntry->smeSessionId;
+	if (NULL == psessionEntry->pLimReAssocReq)
+		return;
+	nAddIELen = psessionEntry->pLimReAssocReq->addIEAssoc.length;
+	pAddIE = psessionEntry->pLimReAssocReq->addIEAssoc.addIEdata;
+
+	qdf_mem_set((uint8_t *) &frm, sizeof(frm), 0);
+
+	caps = pMlmReassocReq->capabilityInfo;
+#if defined(FEATURE_WLAN_WAPI)
+	/*
+	 * CR: 262463 :
+	 * According to WAPI standard:
+	 * 7.3.1.4 Capability Information field
+	 * In WAPI, non-AP STAs within an ESS set the Privacy subfield to 0 in
+	 * transmitted. Association or Reassociation management frames. APs
+	 * ignore the Privacy subfield within received Association and
+	 * Reassociation management frames.
+	 */
+	if (psessionEntry->encryptType == eSIR_ED_WPI)
+		((tSirMacCapabilityInfo *) &caps)->privacy = 0;
+#endif
+	swap_bit_field16(caps, (uint16_t *) &frm.Capabilities);
+
+	frm.ListenInterval.interval = pMlmReassocReq->listenInterval;
+
+	qdf_mem_copy((uint8_t *) frm.CurrentAPAddress.mac,
+		     (uint8_t *) psessionEntry->bssId, 6);
+
+	populate_dot11f_ssid2(pMac, &frm.SSID);
+	populate_dot11f_supp_rates(pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
+				   &frm.SuppRates, psessionEntry);
+
+	fQosEnabled = (psessionEntry->limQosEnabled) &&
+		      SIR_MAC_GET_QOS(psessionEntry->limReassocBssCaps);
+
+	fWmeEnabled = (psessionEntry->limWmeEnabled) &&
+		     LIM_BSS_CAPS_GET(WME, psessionEntry->limReassocBssQosCaps);
+
+	fWsmEnabled = (psessionEntry->limWsmEnabled) && fWmeEnabled &&
+		     LIM_BSS_CAPS_GET(WSM, psessionEntry->limReassocBssQosCaps);
+
+	if (psessionEntry->lim11hEnable &&
+	    psessionEntry->pLimReAssocReq->spectrumMgtIndicator == eSIR_TRUE) {
+		PowerCapsPopulated = true;
+		populate_dot11f_power_caps(pMac, &frm.PowerCaps, LIM_REASSOC,
+					   psessionEntry);
+		populate_dot11f_supp_channels(pMac, &frm.SuppChannels,
+				LIM_REASSOC, psessionEntry);
+	}
+	if (pMac->rrm.rrmPEContext.rrmEnable &&
+	    SIR_MAC_GET_RRM(psessionEntry->limCurrentBssCaps)) {
+		if (PowerCapsPopulated == false) {
+			PowerCapsPopulated = true;
+			populate_dot11f_power_caps(pMac, &frm.PowerCaps,
+						   LIM_REASSOC, psessionEntry);
+		}
+	}
+
+	if (fQosEnabled)
+		populate_dot11f_qos_caps_station(pMac, &frm.QOSCapsStation);
+
+	populate_dot11f_ext_supp_rates(pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
+				       &frm.ExtSuppRates, psessionEntry);
+
+	if (pMac->rrm.rrmPEContext.rrmEnable &&
+	    SIR_MAC_GET_RRM(psessionEntry->limCurrentBssCaps))
+		populate_dot11f_rrm_ie(pMac, &frm.RRMEnabledCap, psessionEntry);
+	/* The join request *should* contain zero or one of the WPA and RSN */
+	/* IEs.  The payload send along with the request is a */
+	/* 'tSirSmeJoinReq'; the IE portion is held inside a 'tSirRSNie': */
+
+	/*     typedef struct sSirRSNie */
+	/*     { */
+	/*         uint16_t       length; */
+	/*         uint8_t        rsnIEdata[SIR_MAC_MAX_IE_LENGTH+2]; */
+	/*     } tSirRSNie, *tpSirRSNie; */
+
+	/* So, we should be able to make the following two calls harmlessly, */
+	/* since they do nothing if they don't find the given IE in the */
+	/* bytestream with which they're provided. */
+
+	/* The net effect of this will be to faithfully transmit whatever */
+	/* security IE is in the join request. */
+
+	/**However*, if we're associating for the purpose of WPS */
+	/* enrollment, and we've been configured to indicate that by */
+	/* eliding the WPA or RSN IE, we just skip this: */
+	if (nAddIELen && pAddIE)
+		wpsIe = limGetWscIEPtr(pMac, pAddIE, nAddIELen);
+	if (NULL == wpsIe) {
+		populate_dot11f_rsn_opaque(pMac,
+				&(psessionEntry->pLimReAssocReq->rsnIE),
+				&frm.RSNOpaque);
+		populate_dot11f_wpa_opaque(pMac,
+				&(psessionEntry->pLimReAssocReq->rsnIE),
+				&frm.WPAOpaque);
+#if defined(FEATURE_WLAN_WAPI)
+		populate_dot11f_wapi_opaque(pMac,
+					    &(psessionEntry->pLimReAssocReq->
+					      rsnIE), &frm.WAPIOpaque);
+#endif /* defined(FEATURE_WLAN_WAPI) */
+	}
+	/* include WME EDCA IE as well */
+	if (fWmeEnabled) {
+		populate_dot11f_wmm_info_station_per_session(pMac,
+				psessionEntry, &frm.WMMInfoStation);
+
+		if (fWsmEnabled)
+			populate_dot11f_wmm_caps(&frm.WMMCaps);
+	}
+
+	if (psessionEntry->htCapability &&
+	    pMac->lim.htCapabilityPresentInBeacon) {
+		populate_dot11f_ht_caps(pMac, psessionEntry, &frm.HTCaps);
+	}
+	if (psessionEntry->vhtCapability &&
+	    psessionEntry->vhtCapabilityPresentInBeacon) {
+		lim_log(pMac, LOGW, FL("Populate VHT IEs in Re-Assoc Request"));
+		populate_dot11f_vht_caps(pMac, psessionEntry, &frm.VHTCaps);
+		isVHTEnabled = true;
+	}
+	populate_dot11f_ext_cap(pMac, isVHTEnabled, &frm.ExtCap, psessionEntry);
+	nStatus =
+		dot11f_get_packed_re_assoc_request_size(pMac, &frm, &nPayload);
+	if (DOT11F_FAILED(nStatus)) {
+		lim_log(pMac, LOGP, FL("Fail to get size:ReassocReq(0x%08x)"),
+			nStatus);
+		/* We'll fall back on the worst case scenario: */
+		nPayload = sizeof(tDot11fReAssocRequest);
+	} else if (DOT11F_WARNED(nStatus)) {
+		lim_log(pMac, LOGW, FL("warning for size:ReAssoc Req(0x%08x)."),
+				nStatus);
+	}
+
+	nBytes = nPayload + sizeof(tSirMacMgmtHdr) + nAddIELen;
+
+	qdf_status = cds_packet_alloc((uint16_t) nBytes, (void **)&pFrame,
+				      (void **)&pPacket);
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+		psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
+		MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_MLM_STATE,
+				 psessionEntry->peSessionId,
+				 psessionEntry->limMlmState));
+		lim_log(pMac, LOGP,
+			FL("Failed to alloc %d bytes for a ReAssociation Req."),
+			nBytes);
+		goto end;
+	}
+	/* Paranoia: */
+	qdf_mem_set(pFrame, nBytes, 0);
+
+	/* Next, we fill out the buffer descriptor: */
+	lim_populate_mac_header(pMac, pFrame, SIR_MAC_MGMT_FRAME,
+		SIR_MAC_MGMT_REASSOC_REQ, psessionEntry->limReAssocbssId,
+		psessionEntry->selfMacAddr);
+	pMacHdr = (tpSirMacMgmtHdr) pFrame;
+
+	/* That done, pack the Probe Request: */
+	nStatus = dot11f_pack_re_assoc_request(pMac, &frm, pFrame +
+					       sizeof(tSirMacMgmtHdr),
+					       nPayload, &nPayload);
+	if (DOT11F_FAILED(nStatus)) {
+		lim_log(pMac, LOGE, FL("Fail to pack a Re-Assoc Req(0x%08x)."),
+				nStatus);
+		cds_packet_free((void *)pPacket);
+		goto end;
+	} else if (DOT11F_WARNED(nStatus)) {
+		lim_log(pMac, LOGW, FL("warning packing a Re-AssocReq(0x%08x)"),
+			nStatus);
+	}
+
+	PELOG1(lim_log
+		       (pMac, LOG1,
+		       FL("*** Sending Re-Association Request length %d" "to "),
+		       nBytes);
+	       )
+
+	if (psessionEntry->assocReq != NULL) {
+		qdf_mem_free(psessionEntry->assocReq);
+		psessionEntry->assocReq = NULL;
+		psessionEntry->assocReqLen = 0;
+	}
+
+	if (nAddIELen) {
+		qdf_mem_copy(pFrame + sizeof(tSirMacMgmtHdr) + nPayload,
+			     pAddIE, nAddIELen);
+		nPayload += nAddIELen;
+	}
+
+	psessionEntry->assocReq = qdf_mem_malloc(nPayload);
+	if (NULL == psessionEntry->assocReq) {
+		lim_log(pMac, LOGE, FL("Unable to allocate mem for assoc req"));
+	} else {
+		/* Store the Assocrequest. It is sent to csr in joincnfrsp */
+		qdf_mem_copy(psessionEntry->assocReq,
+			     pFrame + sizeof(tSirMacMgmtHdr), nPayload);
+		psessionEntry->assocReqLen = nPayload;
+	}
+
+	if ((SIR_BAND_5_GHZ ==
+		lim_get_rf_band(psessionEntry->currentOperChannel))
+			|| (psessionEntry->pePersona == QDF_P2P_CLIENT_MODE) ||
+			(psessionEntry->pePersona == QDF_P2P_GO_MODE))
+		txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
+
+	if (psessionEntry->pePersona == QDF_P2P_CLIENT_MODE ||
+		psessionEntry->pePersona == QDF_STA_MODE)
+		txFlag |= HAL_USE_PEER_STA_REQUESTED_MASK;
+
+#ifdef FEATURE_WLAN_DIAG_SUPPORT
+	lim_diag_event_report(pMac, WLAN_PE_DIAG_REASSOC_START_EVENT,
+			      psessionEntry, eSIR_SUCCESS, eSIR_SUCCESS);
+#endif
+	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_MGMT,
+			 psessionEntry->peSessionId, pMacHdr->fc.subType));
+	qdf_status =
+		wma_tx_frame(pMac, pPacket,
+			   (uint16_t) (sizeof(tSirMacMgmtHdr) + nPayload),
+			   TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7,
+			   lim_tx_complete, pFrame, txFlag, smeSessionId, 0);
+	MTRACE(qdf_trace
+		       (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE,
+		       psessionEntry->peSessionId, qdf_status));
+	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
+		lim_log(pMac, LOGE,
+			FL("Failed to send Re-Association Request (%X)!"),
+			qdf_status);
+		/* Pkt will be freed up by the callback */
+	}
+
+end:
+	/* Free up buffer allocated for mlmAssocReq */
+	qdf_mem_free(pMlmReassocReq);
+	psessionEntry->pLimMlmReassocReq = NULL;
+
+}
+
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 0b6d8ba..46987e9 100644
--- a/core/mac/src/pe/lim/lim_send_management_frames.c
+++ b/core/mac/src/pe/lim/lim_send_management_frames.c
@@ -1949,747 +1949,6 @@
 }
 
 /**
- * lim_send_reassoc_req_with_ft_ies_mgmt_frame() - Send Reassoc Req with FTIEs.
- *
- * @mac_ctx: Handle to mac context
- * @mlm_reassoc_req: Original reassoc request
- * @pe_session: PE session information
- *
- * It builds a reassoc request with FT IEs and sends it to AP through WMA.
- * Then it creates assoc request and stores it for sending after join
- * confirmation.
- *
- * Return: void
- */
-
-void
-lim_send_reassoc_req_with_ft_ies_mgmt_frame(tpAniSirGlobal mac_ctx,
-	tLimMlmReassocReq *mlm_reassoc_req,
-	tpPESession pe_session)
-{
-	static tDot11fReAssocRequest frm;
-	uint16_t caps;
-	uint8_t *frame;
-	uint32_t bytes, payload, status;
-	uint8_t qos_enabled, wme_enabled, wsm_enabled;
-	void *packet;
-	QDF_STATUS qdf_status;
-	uint8_t power_caps_populated = false;
-	uint16_t ft_ies_length = 0;
-	uint8_t *body;
-	uint16_t add_ie_len;
-	uint8_t *add_ie;
-	uint8_t *wps_ie = NULL;
-	uint8_t tx_flag = 0;
-	uint8_t sme_sessionid = 0;
-	bool vht_enabled = false;
-	tpSirMacMgmtHdr mac_hdr;
-	tftSMEContext *ft_sme_context;
-
-	if (NULL == pe_session)
-		return;
-
-	sme_sessionid = pe_session->smeSessionId;
-
-	/* check this early to avoid unncessary operation */
-	if (NULL == pe_session->pLimReAssocReq)
-		return;
-
-	add_ie_len = pe_session->pLimReAssocReq->addIEAssoc.length;
-	add_ie = pe_session->pLimReAssocReq->addIEAssoc.addIEdata;
-	lim_log(mac_ctx, LOG1,
-		FL("called in state (%d)."), pe_session->limMlmState);
-
-	qdf_mem_set((uint8_t *) &frm, sizeof(frm), 0);
-
-	caps = mlm_reassoc_req->capabilityInfo;
-#if defined(FEATURE_WLAN_WAPI)
-	/*
-	 * According to WAPI standard:
-	 * 7.3.1.4 Capability Information field
-	 * In WAPI, non-AP STAs within an ESS set the Privacy subfield
-	 * to 0 in transmitted Association or Reassociation management
-	 * frames. APs ignore the Privacy subfield within received
-	 * Association and Reassociation management frames.
-	 */
-	if (pe_session->encryptType == eSIR_ED_WPI)
-		((tSirMacCapabilityInfo *) &caps)->privacy = 0;
-#endif
-	swap_bit_field16(caps, (uint16_t *) &frm.Capabilities);
-
-	frm.ListenInterval.interval = mlm_reassoc_req->listenInterval;
-
-	/*
-	 * Get the old bssid of the older AP.
-	 * The previous ap bssid is stored in the FT Session
-	 * while creating the PE FT Session for reassociation.
-	 */
-	qdf_mem_copy((uint8_t *)frm.CurrentAPAddress.mac,
-			pe_session->prev_ap_bssid, sizeof(tSirMacAddr));
-
-	populate_dot11f_ssid2(mac_ctx, &frm.SSID);
-	populate_dot11f_supp_rates(mac_ctx, POPULATE_DOT11F_RATES_OPERATIONAL,
-		&frm.SuppRates, pe_session);
-
-	qos_enabled = (pe_session->limQosEnabled) &&
-		      SIR_MAC_GET_QOS(pe_session->limReassocBssCaps);
-
-	wme_enabled = (pe_session->limWmeEnabled) &&
-		      LIM_BSS_CAPS_GET(WME, pe_session->limReassocBssQosCaps);
-
-	wsm_enabled = (pe_session->limWsmEnabled) && wme_enabled &&
-		      LIM_BSS_CAPS_GET(WSM, pe_session->limReassocBssQosCaps);
-
-	if (pe_session->lim11hEnable &&
-	    pe_session->pLimReAssocReq->spectrumMgtIndicator == eSIR_TRUE) {
-		power_caps_populated = true;
-
-		populate_dot11f_power_caps(mac_ctx, &frm.PowerCaps,
-					   LIM_REASSOC, pe_session);
-		populate_dot11f_supp_channels(mac_ctx, &frm.SuppChannels,
-			LIM_REASSOC, pe_session);
-	}
-	if (mac_ctx->rrm.rrmPEContext.rrmEnable &&
-	    SIR_MAC_GET_RRM(pe_session->limCurrentBssCaps)) {
-		if (power_caps_populated == false) {
-			power_caps_populated = true;
-			populate_dot11f_power_caps(mac_ctx, &frm.PowerCaps,
-				LIM_REASSOC, pe_session);
-		}
-	}
-
-	if (qos_enabled)
-		populate_dot11f_qos_caps_station(mac_ctx, &frm.QOSCapsStation);
-
-	populate_dot11f_ext_supp_rates(mac_ctx,
-		POPULATE_DOT11F_RATES_OPERATIONAL, &frm.ExtSuppRates,
-		pe_session);
-
-	if (mac_ctx->rrm.rrmPEContext.rrmEnable &&
-	    SIR_MAC_GET_RRM(pe_session->limCurrentBssCaps))
-		populate_dot11f_rrm_ie(mac_ctx, &frm.RRMEnabledCap, pe_session);
-
-	/*
-	 * Ideally this should be enabled for 11r also. But 11r does
-	 * not follow the usual norm of using the Opaque object
-	 * for rsnie and fties. Instead we just add the rsnie and fties
-	 * at the end of the pack routine for 11r.
-	 * This should ideally! be fixed.
-	 */
-	/*
-	 * The join request *should* contain zero or one of the WPA and RSN
-	 * IEs.  The payload send along with the request is a
-	 * 'tSirSmeJoinReq'; the IE portion is held inside a 'tSirRSNie':
-	 *
-	 *     typedef struct sSirRSNie
-	 *     {
-	 *         uint16_t       length;
-	 *         uint8_t        rsnIEdata[SIR_MAC_MAX_IE_LENGTH+2];
-	 *     } tSirRSNie, *tpSirRSNie;
-	 *
-	 * So, we should be able to make the following two calls harmlessly,
-	 * since they do nothing if they don't find the given IE in the
-	 * bytestream with which they're provided.
-	 *
-	 * The net effect of this will be to faithfully transmit whatever
-	 * security IE is in the join request.
-
-	 * However, if we're associating for the purpose of WPS
-	 * enrollment, and we've been configured to indicate that by
-	 * eliding the WPA or RSN IE, we just skip this:
-	 */
-	if (!pe_session->is11Rconnection) {
-		if (add_ie_len && add_ie)
-			wps_ie = limGetWscIEPtr(mac_ctx, add_ie, add_ie_len);
-		if (NULL == wps_ie) {
-			populate_dot11f_rsn_opaque(mac_ctx,
-				&(pe_session->pLimReAssocReq->rsnIE),
-				&frm.RSNOpaque);
-			populate_dot11f_wpa_opaque(mac_ctx,
-				&(pe_session->pLimReAssocReq->rsnIE),
-				&frm.WPAOpaque);
-		}
-#ifdef FEATURE_WLAN_ESE
-		if (pe_session->pLimReAssocReq->cckmIE.length) {
-			populate_dot11f_ese_cckm_opaque(mac_ctx,
-				&(pe_session->pLimReAssocReq->cckmIE),
-				&frm.ESECckmOpaque);
-		}
-#endif
-	}
-#ifdef FEATURE_WLAN_ESE
-	/*
-	 * ESE Version IE will be included in re-association request
-	 * when ESE is enabled on DUT through ini and it is also
-	 * advertised by the peer AP to which we are trying to
-	 * associate to.
-	 */
-	if (pe_session->is_ese_version_ie_present &&
-		mac_ctx->roam.configParam.isEseIniFeatureEnabled)
-		populate_dot11f_ese_version(&frm.ESEVersion);
-	/* For ESE Associations fill the ESE IEs */
-	if (pe_session->isESEconnection &&
-	    pe_session->pLimReAssocReq->isESEFeatureIniEnabled) {
-#ifndef FEATURE_DISABLE_RM
-		populate_dot11f_ese_rad_mgmt_cap(&frm.ESERadMgmtCap);
-#endif
-	}
-#endif /* FEATURE_WLAN_ESE */
-
-	/* include WME EDCA IE as well */
-	if (wme_enabled) {
-		populate_dot11f_wmm_info_station_per_session(mac_ctx,
-			pe_session, &frm.WMMInfoStation);
-		if (wsm_enabled)
-			populate_dot11f_wmm_caps(&frm.WMMCaps);
-#ifdef FEATURE_WLAN_ESE
-		if (pe_session->isESEconnection) {
-			uint32_t phymode;
-			uint8_t rate;
-
-			populate_dot11f_re_assoc_tspec(mac_ctx, &frm,
-				pe_session);
-
-			/*
-			 * Populate the TSRS IE if TSPEC is included in
-			 * the reassoc request
-			 */
-			lim_get_phy_mode(mac_ctx, &phymode, pe_session);
-			if (phymode == WNI_CFG_PHY_MODE_11G ||
-			    phymode == WNI_CFG_PHY_MODE_11A)
-				rate = TSRS_11AG_RATE_6MBPS;
-			else
-				rate = TSRS_11B_RATE_5_5MBPS;
-
-			if (pe_session->pLimReAssocReq->eseTspecInfo.
-			    numTspecs) {
-				tSirMacESETSRSIE tsrs_ie;
-
-				tsrs_ie.tsid = 0;
-				tsrs_ie.rates[0] = rate;
-				populate_dot11_tsrsie(mac_ctx, &tsrs_ie,
-					&frm.ESETrafStrmRateSet,
-					sizeof(uint8_t));
-			}
-		}
-#endif
-	}
-
-	ft_sme_context = &mac_ctx->roam.roamSession[sme_sessionid].ftSmeContext;
-	if (pe_session->htCapability &&
-	    mac_ctx->lim.htCapabilityPresentInBeacon) {
-		populate_dot11f_ht_caps(mac_ctx, pe_session, &frm.HTCaps);
-	}
-	if (pe_session->pLimReAssocReq->bssDescription.mdiePresent &&
-	    (ft_sme_context->addMDIE == true)
-#if defined FEATURE_WLAN_ESE
-	    && !pe_session->isESEconnection
-#endif
-	    ) {
-		populate_mdie(mac_ctx, &frm.MobilityDomain,
-			pe_session->pLimReAssocReq->bssDescription.mdie);
-	}
-	if (pe_session->vhtCapability &&
-	    pe_session->vhtCapabilityPresentInBeacon) {
-		lim_log(mac_ctx, LOG1,
-			FL("Populate VHT IEs in Re-Assoc Request"));
-		populate_dot11f_vht_caps(mac_ctx, pe_session, &frm.VHTCaps);
-		vht_enabled = true;
-		populate_dot11f_ext_cap(mac_ctx, vht_enabled, &frm.ExtCap,
-			pe_session);
-	}
-	if (!vht_enabled &&
-			pe_session->is_vendor_specific_vhtcaps) {
-		lim_log(mac_ctx, LOG1,
-			FL("Populate Vendor VHT IEs in Re-Assoc Request"));
-		frm.vendor2_ie.present = 1;
-		frm.vendor2_ie.type =
-			pe_session->vendor_specific_vht_ie_type;
-		frm.vendor2_ie.sub_type =
-			pe_session->vendor_specific_vht_ie_sub_type;
-		frm.vendor2_ie.VHTCaps.present = 1;
-		populate_dot11f_vht_caps(mac_ctx, pe_session,
-				&frm.vendor2_ie.VHTCaps);
-		vht_enabled = true;
-	}
-	status = dot11f_get_packed_re_assoc_request_size(mac_ctx, &frm,
-			&payload);
-	if (DOT11F_FAILED(status)) {
-		lim_log(mac_ctx, LOGP,
-			FL("Failure in size calculation (0x%08x)."), status);
-		/* We'll fall back on the worst case scenario: */
-		payload = sizeof(tDot11fReAssocRequest);
-	} else if (DOT11F_WARNED(status)) {
-		lim_log(mac_ctx, LOGW,
-			FL("Warnings in size calculation(0x%08x)."), status);
-	}
-
-	bytes = payload + sizeof(tSirMacMgmtHdr) + add_ie_len;
-
-	lim_log(mac_ctx, LOG1, FL("FT IE Reassoc Req (%d)."),
-		ft_sme_context->reassoc_ft_ies_length);
-
-	if (pe_session->is11Rconnection)
-		ft_ies_length = ft_sme_context->reassoc_ft_ies_length;
-
-	qdf_status = cds_packet_alloc((uint16_t) bytes + ft_ies_length,
-				 (void **)&frame, (void **)&packet);
-	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
-		pe_session->limMlmState = pe_session->limPrevMlmState;
-		MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_MLM_STATE,
-				 pe_session->peSessionId,
-				 pe_session->limMlmState));
-		lim_log(mac_ctx, LOGP, FL("Failed to alloc memory %d"), bytes);
-		goto end;
-	}
-	/* Paranoia: */
-	qdf_mem_set(frame, bytes + ft_ies_length, 0);
-
-	lim_print_mac_addr(mac_ctx, pe_session->limReAssocbssId, LOG1);
-	/* Next, we fill out the buffer descriptor: */
-	lim_populate_mac_header(mac_ctx, frame, SIR_MAC_MGMT_FRAME,
-		SIR_MAC_MGMT_REASSOC_REQ, pe_session->limReAssocbssId,
-		pe_session->selfMacAddr);
-	mac_hdr = (tpSirMacMgmtHdr) frame;
-	/* That done, pack the ReAssoc Request: */
-	status = dot11f_pack_re_assoc_request(mac_ctx, &frm, frame +
-					       sizeof(tSirMacMgmtHdr),
-					       payload, &payload);
-	if (DOT11F_FAILED(status)) {
-		lim_log(mac_ctx, LOGE, FL("Failure in pack (0x%08x)."), status);
-		cds_packet_free((void *)packet);
-		goto end;
-	} else if (DOT11F_WARNED(status)) {
-		lim_log(mac_ctx, LOGW, FL("Warnings in pack (0x%08x)."),
-			status);
-	}
-
-	lim_log(mac_ctx, LOG3,
-		       FL("*** Sending Re-Assoc Request length %d %d to "),
-		       bytes, payload);
-
-	if (pe_session->assocReq != NULL) {
-		qdf_mem_free(pe_session->assocReq);
-		pe_session->assocReq = NULL;
-		pe_session->assocReqLen = 0;
-	}
-
-	if (add_ie_len) {
-		qdf_mem_copy(frame + sizeof(tSirMacMgmtHdr) + payload,
-			     add_ie, add_ie_len);
-		payload += add_ie_len;
-	}
-
-	pe_session->assocReq = qdf_mem_malloc(payload);
-	if (NULL == pe_session->assocReq) {
-		lim_log(mac_ctx, LOGE, FL("Failed to alloc memory"));
-	} else {
-		/*
-		 * Store the Assoc request. This is sent to csr/hdd in
-		 * join cnf response.
-		 */
-		qdf_mem_copy(pe_session->assocReq,
-			     frame + sizeof(tSirMacMgmtHdr), payload);
-		pe_session->assocReqLen = payload;
-	}
-
-	if (pe_session->is11Rconnection && ft_sme_context->reassoc_ft_ies) {
-		int i = 0;
-
-		body = frame + bytes;
-		for (i = 0; i < ft_ies_length; i++) {
-			*body = ft_sme_context->reassoc_ft_ies[i];
-			body++;
-		}
-	}
-	lim_log(mac_ctx, LOG1, FL("Re-assoc Req Frame is: "));
-	       sir_dump_buf(mac_ctx, SIR_LIM_MODULE_ID, LOG1,
-			    (uint8_t *) frame, (bytes + ft_ies_length));
-	if ((SIR_BAND_5_GHZ ==
-	     lim_get_rf_band(pe_session->currentOperChannel)) ||
-	    (pe_session->pePersona == QDF_P2P_CLIENT_MODE) ||
-	    (pe_session->pePersona == QDF_P2P_GO_MODE)) {
-		tx_flag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
-	}
-
-	if (NULL != pe_session->assocReq) {
-		qdf_mem_free(pe_session->assocReq);
-		pe_session->assocReq = NULL;
-		pe_session->assocReqLen = 0;
-	}
-	if (ft_ies_length) {
-		pe_session->assocReq = qdf_mem_malloc(ft_ies_length);
-		if (NULL == pe_session->assocReq) {
-			lim_log(mac_ctx,
-				LOGE, FL("Failed to alloc memory for FT IEs"));
-			pe_session->assocReqLen = 0;
-		} else {
-			/*
-			 * Store the FT IEs. This is sent to csr/hdd in
-			 * join cnf response.
-			 */
-			qdf_mem_copy(pe_session->assocReq,
-				ft_sme_context->reassoc_ft_ies, ft_ies_length);
-			pe_session->assocReqLen = ft_ies_length;
-		}
-	} else {
-		lim_log(mac_ctx, LOG1, FL("FT IEs not present"));
-		pe_session->assocReqLen = 0;
-	}
-
-#ifdef FEATURE_WLAN_DIAG_SUPPORT
-	lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_REASSOC_START_EVENT,
-			      pe_session, eSIR_SUCCESS, eSIR_SUCCESS);
-#endif
-	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_MGMT,
-			 pe_session->peSessionId, mac_hdr->fc.subType));
-	qdf_status = wma_tx_frame(mac_ctx, packet,
-				(uint16_t) (bytes + ft_ies_length),
-				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,
-		       pe_session->peSessionId, qdf_status));
-	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
-		lim_log(mac_ctx, LOGE,
-			FL("Failed to send Re-Assoc Request (%X)!"),
-			qdf_status);
-	}
-
-end:
-	/* Free up buffer allocated for mlmAssocReq */
-	qdf_mem_free(mlm_reassoc_req);
-	pe_session->pLimMlmReassocReq = NULL;
-
-}
-
-void lim_send_retry_reassoc_req_frame(tpAniSirGlobal pMac,
-				      tLimMlmReassocReq *pMlmReassocReq,
-				      tpPESession psessionEntry)
-{
-	tLimMlmReassocCnf mlmReassocCnf;        /* keep sme */
-	tLimMlmReassocReq *pTmpMlmReassocReq = NULL;
-	if (NULL == pTmpMlmReassocReq) {
-		pTmpMlmReassocReq = qdf_mem_malloc(sizeof(tLimMlmReassocReq));
-		if (NULL == pTmpMlmReassocReq)
-			goto end;
-		qdf_mem_set(pTmpMlmReassocReq, sizeof(tLimMlmReassocReq), 0);
-		qdf_mem_copy(pTmpMlmReassocReq, pMlmReassocReq,
-			     sizeof(tLimMlmReassocReq));
-	}
-	/* Prepare and send Reassociation request frame */
-	/* start reassoc timer. */
-	pMac->lim.limTimers.gLimReassocFailureTimer.sessionId =
-		psessionEntry->peSessionId;
-	/* Start reassociation failure timer */
-	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TIMER_ACTIVATE,
-			 psessionEntry->peSessionId, eLIM_REASSOC_FAIL_TIMER));
-	if (tx_timer_activate(&pMac->lim.limTimers.gLimReassocFailureTimer)
-	    != TX_SUCCESS) {
-		/* Could not start reassoc failure timer. */
-		/* Log error */
-		lim_log(pMac, LOGP,
-			FL("could not start Reassociation failure timer"));
-		/* Return Reassoc confirm with */
-		/* Resources Unavailable */
-		mlmReassocCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE;
-		mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
-		goto end;
-	}
-
-	lim_send_reassoc_req_with_ft_ies_mgmt_frame(pMac, pTmpMlmReassocReq,
-						    psessionEntry);
-	return;
-
-end:
-	/* Free up buffer allocated for reassocReq */
-	if (pMlmReassocReq != NULL) {
-		qdf_mem_free(pMlmReassocReq);
-		pMlmReassocReq = NULL;
-	}
-	if (pTmpMlmReassocReq != NULL) {
-		qdf_mem_free(pTmpMlmReassocReq);
-		pTmpMlmReassocReq = NULL;
-	}
-	mlmReassocCnf.resultCode = eSIR_SME_FT_REASSOC_FAILURE;
-	mlmReassocCnf.protStatusCode = eSIR_MAC_UNSPEC_FAILURE_STATUS;
-	/* Update PE sessio Id */
-	mlmReassocCnf.sessionId = psessionEntry->peSessionId;
-
-	lim_post_sme_message(pMac, LIM_MLM_REASSOC_CNF,
-			     (uint32_t *) &mlmReassocCnf);
-}
-
-
-void
-lim_send_reassoc_req_mgmt_frame(tpAniSirGlobal pMac,
-				tLimMlmReassocReq *pMlmReassocReq,
-				tpPESession psessionEntry)
-{
-	static tDot11fReAssocRequest frm;
-	uint16_t caps;
-	uint8_t *pFrame;
-	uint32_t nBytes, nPayload, nStatus;
-	uint8_t fQosEnabled, fWmeEnabled, fWsmEnabled;
-	void *pPacket;
-	QDF_STATUS qdf_status;
-	uint16_t nAddIELen;
-	uint8_t *pAddIE;
-	uint8_t *wpsIe = NULL;
-	uint8_t txFlag = 0;
-	uint8_t PowerCapsPopulated = false;
-	uint8_t smeSessionId = 0;
-	bool isVHTEnabled = false;
-	tpSirMacMgmtHdr pMacHdr;
-
-	if (NULL == psessionEntry) {
-		return;
-	}
-
-	smeSessionId = psessionEntry->smeSessionId;
-
-	/* check this early to avoid unncessary operation */
-	if (NULL == psessionEntry->pLimReAssocReq) {
-		return;
-	}
-	nAddIELen = psessionEntry->pLimReAssocReq->addIEAssoc.length;
-	pAddIE = psessionEntry->pLimReAssocReq->addIEAssoc.addIEdata;
-
-	qdf_mem_set((uint8_t *) &frm, sizeof(frm), 0);
-
-	caps = pMlmReassocReq->capabilityInfo;
-#if defined(FEATURE_WLAN_WAPI)
-	/* CR: 262463 :
-	   According to WAPI standard:
-	   7.3.1.4 Capability Information field
-	   In WAPI, non-AP STAs within an ESS set the Privacy subfield to 0 in transmitted
-	   Association or Reassociation management frames. APs ignore the Privacy subfield within received Association and
-	   Reassociation management frames. */
-	if (psessionEntry->encryptType == eSIR_ED_WPI)
-		((tSirMacCapabilityInfo *) &caps)->privacy = 0;
-#endif
-	swap_bit_field16(caps, (uint16_t *) &frm.Capabilities);
-
-	frm.ListenInterval.interval = pMlmReassocReq->listenInterval;
-
-	qdf_mem_copy((uint8_t *) frm.CurrentAPAddress.mac,
-		     (uint8_t *) psessionEntry->bssId, 6);
-
-	populate_dot11f_ssid2(pMac, &frm.SSID);
-	populate_dot11f_supp_rates(pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
-				   &frm.SuppRates, psessionEntry);
-
-	fQosEnabled = (psessionEntry->limQosEnabled) &&
-		      SIR_MAC_GET_QOS(psessionEntry->limReassocBssCaps);
-
-	fWmeEnabled = (psessionEntry->limWmeEnabled) &&
-		      LIM_BSS_CAPS_GET(WME, psessionEntry->limReassocBssQosCaps);
-
-	fWsmEnabled = (psessionEntry->limWsmEnabled) && fWmeEnabled &&
-		      LIM_BSS_CAPS_GET(WSM, psessionEntry->limReassocBssQosCaps);
-
-	if (psessionEntry->lim11hEnable &&
-	    psessionEntry->pLimReAssocReq->spectrumMgtIndicator == eSIR_TRUE) {
-		PowerCapsPopulated = true;
-		populate_dot11f_power_caps(pMac, &frm.PowerCaps, LIM_REASSOC,
-					   psessionEntry);
-		populate_dot11f_supp_channels(pMac, &frm.SuppChannels, LIM_REASSOC,
-					      psessionEntry);
-	}
-	if (pMac->rrm.rrmPEContext.rrmEnable &&
-	    SIR_MAC_GET_RRM(psessionEntry->limCurrentBssCaps)) {
-		if (PowerCapsPopulated == false) {
-			PowerCapsPopulated = true;
-			populate_dot11f_power_caps(pMac, &frm.PowerCaps,
-						   LIM_REASSOC, psessionEntry);
-		}
-	}
-
-	if (fQosEnabled)
-		populate_dot11f_qos_caps_station(pMac, &frm.QOSCapsStation);
-
-	populate_dot11f_ext_supp_rates(pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
-				       &frm.ExtSuppRates, psessionEntry);
-
-	if (pMac->rrm.rrmPEContext.rrmEnable &&
-	    SIR_MAC_GET_RRM(psessionEntry->limCurrentBssCaps))
-		populate_dot11f_rrm_ie(pMac, &frm.RRMEnabledCap, psessionEntry);
-	/* The join request *should* contain zero or one of the WPA and RSN */
-	/* IEs.  The payload send along with the request is a */
-	/* 'tSirSmeJoinReq'; the IE portion is held inside a 'tSirRSNie': */
-
-	/*     typedef struct sSirRSNie */
-	/*     { */
-	/*         uint16_t       length; */
-	/*         uint8_t        rsnIEdata[SIR_MAC_MAX_IE_LENGTH+2]; */
-	/*     } tSirRSNie, *tpSirRSNie; */
-
-	/* So, we should be able to make the following two calls harmlessly, */
-	/* since they do nothing if they don't find the given IE in the */
-	/* bytestream with which they're provided. */
-
-	/* The net effect of this will be to faithfully transmit whatever */
-	/* security IE is in the join request. */
-
-	/**However*, if we're associating for the purpose of WPS */
-	/* enrollment, and we've been configured to indicate that by */
-	/* eliding the WPA or RSN IE, we just skip this: */
-	if (nAddIELen && pAddIE) {
-		wpsIe = limGetWscIEPtr(pMac, pAddIE, nAddIELen);
-	}
-	if (NULL == wpsIe) {
-		populate_dot11f_rsn_opaque(pMac,
-					   &(psessionEntry->pLimReAssocReq->rsnIE),
-					   &frm.RSNOpaque);
-		populate_dot11f_wpa_opaque(pMac,
-					   &(psessionEntry->pLimReAssocReq->rsnIE),
-					   &frm.WPAOpaque);
-#if defined(FEATURE_WLAN_WAPI)
-		populate_dot11f_wapi_opaque(pMac,
-					    &(psessionEntry->pLimReAssocReq->
-					      rsnIE), &frm.WAPIOpaque);
-#endif /* defined(FEATURE_WLAN_WAPI) */
-	}
-	/* include WME EDCA IE as well */
-	if (fWmeEnabled) {
-		populate_dot11f_wmm_info_station_per_session(pMac,
-							     psessionEntry,
-							     &frm.WMMInfoStation);
-
-		if (fWsmEnabled)
-			populate_dot11f_wmm_caps(&frm.WMMCaps);
-	}
-
-	if (psessionEntry->htCapability &&
-	    pMac->lim.htCapabilityPresentInBeacon) {
-		populate_dot11f_ht_caps(pMac, psessionEntry, &frm.HTCaps);
-	}
-	if (psessionEntry->vhtCapability &&
-	    psessionEntry->vhtCapabilityPresentInBeacon) {
-		lim_log(pMac, LOGW, FL("Populate VHT IEs in Re-Assoc Request"));
-		populate_dot11f_vht_caps(pMac, psessionEntry, &frm.VHTCaps);
-		isVHTEnabled = true;
-	}
-	populate_dot11f_ext_cap(pMac, isVHTEnabled, &frm.ExtCap, psessionEntry);
-	nStatus = dot11f_get_packed_re_assoc_request_size(pMac, &frm, &nPayload);
-	if (DOT11F_FAILED(nStatus)) {
-		lim_log(pMac, LOGP, FL("Failed to calculate the packed size f"
-				       "or a Re-Association Request (0x%08x)."),
-			nStatus);
-		/* We'll fall back on the worst case scenario: */
-		nPayload = sizeof(tDot11fReAssocRequest);
-	} else if (DOT11F_WARNED(nStatus)) {
-		lim_log(pMac, LOGW, FL("There were warnings while calculating "
-				       "the packed size for a Re-Association Re "
-				       "quest(0x%08x)."), nStatus);
-	}
-
-	nBytes = nPayload + sizeof(tSirMacMgmtHdr) + nAddIELen;
-
-	qdf_status = cds_packet_alloc((uint16_t) nBytes, (void **)&pFrame,
-				      (void **)&pPacket);
-	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
-		psessionEntry->limMlmState = psessionEntry->limPrevMlmState;
-		MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_MLM_STATE,
-				 psessionEntry->peSessionId,
-				 psessionEntry->limMlmState));
-		lim_log(pMac, LOGP,
-			FL("Failed to allocate %d bytes for a Re-As"
-			   "sociation Request."), nBytes);
-		goto end;
-	}
-	/* Paranoia: */
-	qdf_mem_set(pFrame, nBytes, 0);
-
-	/* Next, we fill out the buffer descriptor: */
-	lim_populate_mac_header(pMac, pFrame, SIR_MAC_MGMT_FRAME,
-		SIR_MAC_MGMT_REASSOC_REQ, psessionEntry->limReAssocbssId,
-		psessionEntry->selfMacAddr);
-	pMacHdr = (tpSirMacMgmtHdr) pFrame;
-
-	/* That done, pack the Probe Request: */
-	nStatus = dot11f_pack_re_assoc_request(pMac, &frm, pFrame +
-					       sizeof(tSirMacMgmtHdr),
-					       nPayload, &nPayload);
-	if (DOT11F_FAILED(nStatus)) {
-		lim_log(pMac, LOGE, FL("Failed to pack a Re-Association Reque"
-				       "st (0x%08x)."), nStatus);
-		cds_packet_free((void *)pPacket);
-		goto end;
-	} else if (DOT11F_WARNED(nStatus)) {
-		lim_log(pMac, LOGW, FL("There were warnings while packing a R"
-				       "e-Association Request (0x%08x)."),
-			nStatus);
-	}
-
-	PELOG1(lim_log
-		       (pMac, LOG1,
-		       FL("*** Sending Re-Association Request length %d" "to "),
-		       nBytes);
-	       )
-
-	if (psessionEntry->assocReq != NULL) {
-		qdf_mem_free(psessionEntry->assocReq);
-		psessionEntry->assocReq = NULL;
-		psessionEntry->assocReqLen = 0;
-	}
-
-	if (nAddIELen) {
-		qdf_mem_copy(pFrame + sizeof(tSirMacMgmtHdr) + nPayload,
-			     pAddIE, nAddIELen);
-		nPayload += nAddIELen;
-	}
-
-	psessionEntry->assocReq = qdf_mem_malloc(nPayload);
-	if (NULL == psessionEntry->assocReq) {
-		lim_log(pMac, LOGE, FL("Unable to allocate mem for assoc req"));
-	} else {
-		/* Store the Assoc request. This is sent to csr/hdd in join cnf response. */
-		qdf_mem_copy(psessionEntry->assocReq,
-			     pFrame + sizeof(tSirMacMgmtHdr), nPayload);
-		psessionEntry->assocReqLen = nPayload;
-	}
-
-	if ((SIR_BAND_5_GHZ == lim_get_rf_band(psessionEntry->currentOperChannel))
-	    || (psessionEntry->pePersona == QDF_P2P_CLIENT_MODE) ||
-	    (psessionEntry->pePersona == QDF_P2P_GO_MODE)
-	    ) {
-		txFlag |= HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME;
-	}
-
-	if (psessionEntry->pePersona == QDF_P2P_CLIENT_MODE ||
-		psessionEntry->pePersona == QDF_STA_MODE)
-		txFlag |= HAL_USE_PEER_STA_REQUESTED_MASK;
-
-#ifdef FEATURE_WLAN_DIAG_SUPPORT
-	lim_diag_event_report(pMac, WLAN_PE_DIAG_REASSOC_START_EVENT,
-			      psessionEntry, eSIR_SUCCESS, eSIR_SUCCESS);
-#endif
-	MTRACE(qdf_trace(QDF_MODULE_ID_PE, TRACE_CODE_TX_MGMT,
-			 psessionEntry->peSessionId, pMacHdr->fc.subType));
-	qdf_status =
-		wma_tx_frame(pMac, pPacket,
-			   (uint16_t) (sizeof(tSirMacMgmtHdr) + nPayload),
-			   TXRX_FRM_802_11_MGMT, ANI_TXDIR_TODS, 7,
-			   lim_tx_complete, pFrame, txFlag, smeSessionId, 0);
-	MTRACE(qdf_trace
-		       (QDF_MODULE_ID_PE, TRACE_CODE_TX_COMPLETE,
-		       psessionEntry->peSessionId, qdf_status));
-	if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
-		lim_log(pMac, LOGE,
-			FL("Failed to send Re-Association Request (%X)!"),
-			qdf_status);
-		/* Pkt will be freed up by the callback */
-	}
-
-end:
-	/* Free up buffer allocated for mlmAssocReq */
-	qdf_mem_free(pMlmReassocReq);
-	psessionEntry->pLimMlmReassocReq = NULL;
-
-} /* lim_send_reassoc_req_mgmt_frame */
-
-/**
  * lim_auth_tx_complete_cnf()- Confirmation for auth sent over the air
  *
  * @mac_ctx: pointer to global mac