Forráskód Böngészése

qcacld-3.0: Fix mismatch between assoc ie length and ext cap

Assoc IE length sent in ROAM START cmd to firmware is cumulative len
of all the IEs passed to firmware. Update in Ext Cap was causing this
length value to be wrong. Update the Ext Cap IE length correctly when
updating Assoc IE length.

Change-Id: I3c4acf507d533896993a51c443407ecac290628a
CRs-Fixed: 2026407
Naveen Rawat 8 éve
szülő
commit
b677c242af
1 módosított fájl, 8 hozzáadás és 5 törlés
  1. 8 5
      core/mac/src/pe/lim/lim_api.c

+ 8 - 5
core/mac/src/pe/lim/lim_api.c

@@ -2397,7 +2397,6 @@ QDF_STATUS lim_update_ext_cap_ie(tpAniSirGlobal mac_ctx,
 	uint32_t dot11mode;
 	bool vht_enabled = false;
 	tDot11fIEExtCap default_scan_ext_cap = {0}, driver_ext_cap = {0};
-	uint8_t ext_cap_ie_hdr[EXT_CAP_IE_HDR_LEN] = {0x7f, 0x9};
 	tSirRetStatus status;
 
 	status = lim_strip_extcap_update_struct(mac_ctx, ie_data,
@@ -2407,10 +2406,11 @@ QDF_STATUS lim_update_ext_cap_ie(tpAniSirGlobal mac_ctx,
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	/* copy ie prior to ext cap to local buffer */
 	qdf_mem_copy(local_ie_buf, ie_data, (*local_ie_len));
-	qdf_mem_copy(local_ie_buf + (*local_ie_len),
-			ext_cap_ie_hdr, EXT_CAP_IE_HDR_LEN);
-	(*local_ie_len) += EXT_CAP_IE_HDR_LEN;
+
+	/* from here ext cap ie starts, set EID */
+	local_ie_buf[*local_ie_len] = DOT11F_EID_EXTCAP;
 
 	wlan_cfg_get_int(mac_ctx, WNI_CFG_DOT11_MODE, &dot11mode);
 	if (IS_DOT11_MODE_VHT(dot11mode))
@@ -2421,6 +2421,8 @@ QDF_STATUS lim_update_ext_cap_ie(tpAniSirGlobal mac_ctx,
 	if (eSIR_SUCCESS != status) {
 		pe_err("Failed %d to create ext cap IE. Use default value instead",
 				status);
+		local_ie_buf[*local_ie_len + 1] = DOT11F_IE_EXTCAP_MAX_LEN;
+		(*local_ie_len) += EXT_CAP_IE_HDR_LEN;
 		qdf_mem_copy(local_ie_buf + (*local_ie_len),
 				default_scan_ext_cap.bytes,
 				DOT11F_IE_EXTCAP_MAX_LEN);
@@ -2428,7 +2430,8 @@ QDF_STATUS lim_update_ext_cap_ie(tpAniSirGlobal mac_ctx,
 		return QDF_STATUS_SUCCESS;
 	}
 	lim_merge_extcap_struct(&driver_ext_cap, &default_scan_ext_cap, true);
-
+	local_ie_buf[*local_ie_len + 1] = driver_ext_cap.num_bytes;
+	(*local_ie_len) += EXT_CAP_IE_HDR_LEN;
 	qdf_mem_copy(local_ie_buf + (*local_ie_len),
 			driver_ext_cap.bytes, driver_ext_cap.num_bytes);
 	(*local_ie_len) += driver_ext_cap.num_bytes;