Parcourir la source

qcacld-3.0: Send driver built assoc IE's to FW for LFR3

Currently, host driver adds RRM IE, Power cap IE in reassociation request
initiated from driver. In LFR3, these IE's are missing in reassociation
request frames initiated by FW.

As part of MBO changes, assoc IE's are sent to FW via Roam Scan Offload
command as soon as connection successful. Add the above RRM IE and Power
Cap IE also while sending assoc IE's to FW via RSO command. For FTM[Fine
Time Measurement] cases, RRM IE's are changed dynamically. Hence, send
the updated RRM IE with other IE's via RSO/Update_cfg command to FW.

Change-Id: Iff5ff961df89d4564a31763257b13811c4f57df4
CRs-Fixed: 1061698
Selvaraj, Sridhar il y a 8 ans
Parent
commit
57bb4d03e0

+ 1 - 0
core/hdd/src/wlan_hdd_cfg80211.c

@@ -3916,6 +3916,7 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 		hdd_ctx->config->fine_time_meas_cap =
 			hdd_ctx->fine_time_meas_cap_target & ftm_capab;
 		sme_update_fine_time_measurement_capab(hdd_ctx->hHal,
+			adapter->sessionId,
 			hdd_ctx->config->fine_time_meas_cap);
 		hdd_info("FTM capability: user value: 0x%x, target value: 0x%x, final value: 0x%x",
 			 ftm_capab, hdd_ctx->fine_time_meas_cap_target,

+ 1 - 0
core/sme/inc/csr_neighbor_roam.h

@@ -321,6 +321,7 @@ void csr_roam_reset_roam_params(tpAniSirGlobal mac_ptr);
 #define REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED      31
 #define REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED      32
 #define REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED         33
+#define REASON_CONNECT_IES_CHANGED                  34
 
 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
 QDF_STATUS csr_roam_offload_scan(tpAniSirGlobal pMac, uint8_t sessionId,

+ 2 - 1
core/sme/inc/sme_api.h

@@ -1176,7 +1176,8 @@ static inline QDF_STATUS sme_send_egap_conf_params(uint32_t enable,
 }
 #endif
 
-void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val);
+void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id,
+								uint32_t val);
 QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hHal, uint32_t vdev_id);
 QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test);
 QDF_STATUS sme_set_tsfcb(tHalHandle hHal,

+ 8 - 2
core/sme/src/common/sme_api.c

@@ -1269,12 +1269,13 @@ QDF_STATUS sme_set_reg_info(tHalHandle hHal, uint8_t *apCntryCode)
  *
  * Return: None
  */
-void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val)
+void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id,
+						uint32_t val)
 {
 	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
 	mac_ctx->fine_time_meas_cap = val;
 
-	if (val == 0) {
+	if (!val) {
 		mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
 		((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
 			rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
@@ -1283,6 +1284,11 @@ void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val)
 		((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
 			rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
 	}
+
+	/* Inform this RRM IE change to FW */
+	csr_roam_offload_scan(mac_ctx, session_id,
+			ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+			REASON_CONNECT_IES_CHANGED);
 }
 
 /*--------------------------------------------------------------------------

+ 81 - 2
core/sme/src/csr/csr_api_roam.c

@@ -17263,6 +17263,82 @@ bool csr_is_RSO_cmd_allowed(tpAniSirGlobal mac_ctx, uint8_t command,
 	return ret_val;
 }
 
+/**
+ * csr_append_assoc_ies() - Append specific IE to assoc IE's buffer
+ * @mac_ctx: Pointer to global mac context
+ * @req_buf: Pointer to Roam offload scan request
+ * @ie_id: IE ID to be appended
+ * @ie_len: IE length to be appended
+ * @ie_data: IE data to be appended
+ *
+ * Return: None
+ */
+static void csr_append_assoc_ies(tpAniSirGlobal mac_ctx,
+				tSirRoamOffloadScanReq *req_buf, uint8_t ie_id,
+				uint8_t ie_len, uint8_t *ie_data)
+{
+	tSirAddie *assoc_ie = &req_buf->assoc_ie;
+	if ((SIR_MAC_MAX_ADD_IE_LENGTH - assoc_ie->length) < ie_len) {
+		sms_log(mac_ctx, LOGE, "Appending IE(id:%d) fails", ie_id);
+		return;
+	}
+
+	assoc_ie->addIEdata[assoc_ie->length] = ie_id;
+	assoc_ie->addIEdata[assoc_ie->length + 1] = ie_len;
+	qdf_mem_copy(&assoc_ie->addIEdata[assoc_ie->length + 2],
+						ie_data, ie_len);
+	assoc_ie->length += (ie_len + 2);
+}
+
+/**
+ * csr_update_driver_assoc_ies() - Append driver built IE's to assoc IE's
+ * @mac_ctx: Pointer to global mac structure
+ * @session: pointer to CSR session
+ * @req_buf: Pointer to Roam offload scan request
+ *
+ * Return: None
+ */
+static void csr_update_driver_assoc_ies(tpAniSirGlobal mac_ctx,
+					tCsrRoamSession *session,
+					tSirRoamOffloadScanReq *req_buf)
+{
+	bool power_caps_populated = false;
+	uint32_t csr_11henable = WNI_CFG_11H_ENABLED_STADEF;
+	uint8_t *rrm_cap_ie_data
+			= (uint8_t *) &mac_ctx->rrm.rrmPEContext.rrmEnabledCaps;
+	uint8_t power_cap_ie_data[DOT11F_IE_POWERCAPS_MAX_LEN]
+			= {MIN_TX_PWR_CAP, MAX_TX_PWR_CAP};
+	uint8_t max_tx_pwr_cap
+			= csr_get_cfg_max_tx_power(mac_ctx,
+				session->pConnectBssDesc->channelId);
+
+	if (max_tx_pwr_cap)
+		power_cap_ie_data[1] = max_tx_pwr_cap;
+
+	wlan_cfg_get_int(mac_ctx, WNI_CFG_11H_ENABLED, &csr_11henable);
+
+	if (csr_11henable && csr_is11h_supported(mac_ctx)) {
+		/* Append power cap IE */
+		csr_append_assoc_ies(mac_ctx, req_buf, IEEE80211_ELEMID_PWRCAP,
+					DOT11F_IE_POWERCAPS_MAX_LEN,
+					power_cap_ie_data);
+		power_caps_populated = true;
+	}
+
+	if (mac_ctx->rrm.rrmPEContext.rrmEnable) {
+		/* Append RRM IE */
+		csr_append_assoc_ies(mac_ctx, req_buf, IEEE80211_ELEMID_RRM,
+					DOT11F_IE_RRMENABLEDCAP_MAX_LEN,
+					rrm_cap_ie_data);
+		if (!power_caps_populated)
+			/* Append Power cap IE if not appended already */
+			csr_append_assoc_ies(mac_ctx, req_buf,
+					IEEE80211_ELEMID_PWRCAP,
+					DOT11F_IE_POWERCAPS_MAX_LEN,
+					power_cap_ie_data);
+	}
+}
+
 /**
  * csr_roam_offload_scan() - populates roam offload scan request and sends to
  * WMA
@@ -17457,12 +17533,15 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id,
 			req_buf->hi_rssi_scan_delay,
 			req_buf->hi_rssi_scan_rssi_ub);
 
-	if ((command == ROAM_SCAN_OFFLOAD_START) &&
-				(reason == REASON_CONNECT)) {
+	if (((command == ROAM_SCAN_OFFLOAD_START) &&
+		(reason == REASON_CONNECT)) ||
+		((command == ROAM_SCAN_OFFLOAD_UPDATE_CFG) &&
+		(reason == REASON_CONNECT_IES_CHANGED))) {
 		req_buf->assoc_ie.length = session->nAddIEAssocLength;
 		qdf_mem_copy(req_buf->assoc_ie.addIEdata,
 				session->pAddIEAssoc,
 				session->nAddIEAssocLength);
+		csr_update_driver_assoc_ies(mac_ctx, session, req_buf);
 	} else {
 		req_buf->assoc_ie.length = 0;
 	}